More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 307 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Add Liquidity | 10082390 | 94 days ago | IN | 0 ETH | 0.00000119 | ||||
Remove Liquidity | 10082381 | 94 days ago | IN | 0 ETH | 0.0000007 | ||||
Add Liquidity | 10082307 | 94 days ago | IN | 0 ETH | 0.00000104 | ||||
Remove Liquidity | 10042570 | 95 days ago | IN | 0 ETH | 0.00000121 | ||||
Add Liquidity | 10042559 | 95 days ago | IN | 0 ETH | 0.00000171 | ||||
Remove Liquidity | 10041757 | 95 days ago | IN | 0 ETH | 0.00000101 | ||||
Add Liquidity | 10041736 | 95 days ago | IN | 0 ETH | 0.0000014 | ||||
Remove Liquidity | 10020962 | 96 days ago | IN | 0 ETH | 0.00000063 | ||||
Add Liquidity | 10013312 | 96 days ago | IN | 0 ETH | 0.00000111 | ||||
Add Liquidity | 10009112 | 96 days ago | IN | 0 ETH | 0.00000061 | ||||
Remove Liquidity | 9953116 | 97 days ago | IN | 0 ETH | 0.00000048 | ||||
Remove Liquidity | 9953063 | 97 days ago | IN | 0 ETH | 0.00000052 | ||||
Add Liquidity | 9952981 | 97 days ago | IN | 0 ETH | 0.00000051 | ||||
Add Liquidity | 9952955 | 97 days ago | IN | 0 ETH | 0.00000066 | ||||
Remove Liquidity | 9946710 | 98 days ago | IN | 0 ETH | 0.0000014 | ||||
Add Liquidity | 9946677 | 98 days ago | IN | 0 ETH | 0.00000181 | ||||
Add Liquidity | 9873642 | 99 days ago | IN | 0 ETH | 0.00000075 | ||||
Add Liquidity | 9873614 | 99 days ago | IN | 0 ETH | 0.00000061 | ||||
Add Liquidity | 9817154 | 101 days ago | IN | 0 ETH | 0.00000019 | ||||
Remove Liquidity | 9817065 | 101 days ago | IN | 0 ETH | 0.00000024 | ||||
Add Liquidity | 9761329 | 102 days ago | IN | 0 ETH | 0.00000131 | ||||
Add Liquidity | 9747591 | 102 days ago | IN | 0 ETH | 0.00000048 | ||||
Remove Liquidity | 9725854 | 103 days ago | IN | 0 ETH | 0.00000037 | ||||
Add Liquidity | 9723255 | 103 days ago | IN | 0 ETH | 0.00000015 | ||||
Remove Liquidity | 9677125 | 104 days ago | IN | 0 ETH | 0.00000041 |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
UniswapV2PartialRouter
Compiler Version
v0.8.19+commit.7dd6d404
Optimization Enabled:
Yes with 2000 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity =0.8.19; import "./RouterV2.sol"; import {IUniswapV2PartialRouter} from "./interfaces/IUniswapV2PartialRouter.sol"; contract UniswapV2PartialRouter is RouterV2, IUniswapV2PartialRouter { constructor(address _blastGovernor, address _factory, address _wETH) RouterV2(_blastGovernor, _factory, _wETH) {} function WETH() public view returns (address) { return address(wETH); } function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external override returns (uint amountA, uint amountB, uint liquidity) { return addLiquidity(tokenA, tokenB, false, amountADesired, amountBDesired, amountAMin, amountBMin, to, deadline); } function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable override returns (uint amountToken, uint amountETH, uint liquidity) { return addLiquidityETH(token, false, amountTokenDesired, amountTokenMin, amountETHMin, to, deadline); } function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external override returns (uint amountA, uint amountB) { return removeLiquidity(tokenA, tokenB, false, liquidity, amountAMin, amountBMin, to, deadline); } function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external override returns (uint amountToken, uint amountETH) { return removeLiquidityETH(token, false, liquidity, amountTokenMin, amountETHMin, to, deadline); } function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external override returns (uint amountA, uint amountB) { return removeLiquidityWithPermit(tokenA, tokenB, false, liquidity, amountAMin, amountBMin, to, deadline, approveMax, v, r, s); } function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external override returns (uint amountToken, uint amountETH) { return removeLiquidityETHWithPermit(token, false, liquidity, amountTokenMin, amountETHMin, to, deadline, approveMax, v, r, s); } function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external override returns (uint[] memory amounts) { return swapExactTokensForTokens(amountIn, amountOutMin, pathsToVolatilityRoutes(path), to, deadline); } function swapExactETHForTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable override returns (uint[] memory amounts) { return swapExactETHForTokens(amountOutMin, pathsToVolatilityRoutes(path), to, deadline); } function swapExactTokensForETH( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external override returns (uint[] memory amounts) { return swapExactTokensForETH(amountIn, amountOutMin, pathsToVolatilityRoutes(path), to, deadline); } function getReserves(address tokenA, address tokenB) external view override returns (uint reserveA, uint reserveB) { return getReserves(tokenA, tokenB, false); } function getAmountsOut(uint amountIn, address[] calldata path) external view override returns (uint[] memory amounts) { return getAmountsOut(amountIn, pathsToVolatilityRoutes(path)); } function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external override returns (uint amountETH) { (, amountETH) = removeLiquidityETHSupportingFeeOnTransferTokens( token, false, liquidity, amountTokenMin, amountETHMin, to, deadline ); } function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external override returns (uint amountETH) { (, amountETH) = removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( token, false, liquidity, amountTokenMin, amountETHMin, to, deadline, approveMax, v, r, s ); } function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external override { return swapExactTokensForTokensSupportingFeeOnTransferTokens(amountIn, amountOutMin, pathsToVolatilityRoutes(path), to, deadline); } function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable override { swapExactETHForTokensSupportingFeeOnTransferTokens(amountOutMin, pathsToVolatilityRoutes(path), to, deadline); } function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external override { swapExactTokensForETHSupportingFeeOnTransferTokens(amountIn, amountOutMin, pathsToVolatilityRoutes(path), to, deadline); } function pathsToVolatilityRoutes(address[] memory path) public pure returns (route[] memory) { route[] memory routes = new route[](path.length - 1); for (uint i; i < path.length - 1; ) { routes[i] = route({from: path[i], to: path[i + 1], stable: false}); unchecked { i++; } } return routes; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (proxy/Clones.sol) pragma solidity ^0.8.0; /** * @dev https://eips.ethereum.org/EIPS/eip-1167[EIP 1167] is a standard for * deploying minimal proxy contracts, also known as "clones". * * > To simply and cheaply clone contract functionality in an immutable way, this standard specifies * > a minimal bytecode implementation that delegates all calls to a known, fixed address. * * The library includes functions to deploy a proxy using either `create` (traditional deployment) or `create2` * (salted deterministic deployment). It also includes functions to predict the addresses of clones deployed using the * deterministic method. * * _Available since v3.4._ */ library Clones { /** * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`. * * This function uses the create opcode, which should never revert. */ function clone(address implementation) internal returns (address instance) { /// @solidity memory-safe-assembly assembly { // Cleans the upper 96 bits of the `implementation` word, then packs the first 3 bytes // of the `implementation` address with the bytecode before the address. mstore(0x00, or(shr(0xe8, shl(0x60, implementation)), 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000)) // Packs the remaining 17 bytes of `implementation` with the bytecode after the address. mstore(0x20, or(shl(0x78, implementation), 0x5af43d82803e903d91602b57fd5bf3)) instance := create(0, 0x09, 0x37) } require(instance != address(0), "ERC1167: create failed"); } /** * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`. * * This function uses the create2 opcode and a `salt` to deterministically deploy * the clone. Using the same `implementation` and `salt` multiple time will revert, since * the clones cannot be deployed twice at the same address. */ function cloneDeterministic(address implementation, bytes32 salt) internal returns (address instance) { /// @solidity memory-safe-assembly assembly { // Cleans the upper 96 bits of the `implementation` word, then packs the first 3 bytes // of the `implementation` address with the bytecode before the address. mstore(0x00, or(shr(0xe8, shl(0x60, implementation)), 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000)) // Packs the remaining 17 bytes of `implementation` with the bytecode after the address. mstore(0x20, or(shl(0x78, implementation), 0x5af43d82803e903d91602b57fd5bf3)) instance := create2(0, 0x09, 0x37, salt) } require(instance != address(0), "ERC1167: create2 failed"); } /** * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}. */ function predictDeterministicAddress( address implementation, bytes32 salt, address deployer ) internal pure returns (address predicted) { /// @solidity memory-safe-assembly assembly { let ptr := mload(0x40) mstore(add(ptr, 0x38), deployer) mstore(add(ptr, 0x24), 0x5af43d82803e903d91602b57fd5bf3ff) mstore(add(ptr, 0x14), implementation) mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73) mstore(add(ptr, 0x58), salt) mstore(add(ptr, 0x78), keccak256(add(ptr, 0x0c), 0x37)) predicted := keccak256(add(ptr, 0x43), 0x55) } } /** * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}. */ function predictDeterministicAddress( address implementation, bytes32 salt ) internal view returns (address predicted) { return predictDeterministicAddress(implementation, salt, address(this)); } }
// SPDX-License-Identifier: MIT pragma solidity >=0.8.0; interface IPairFactory { event PairCreated(address indexed token0, address indexed token1, bool stable, address pair, uint); event SetPaused(bool state); event SetCommunityVaultFactory(address indexed communityVaultFactory); event SetIsPublicPoolCreationMode(bool mode); event SetProtocolFee(uint256 fee); event SetCustomProtocolFee(address indexed pair, uint256 fee); event SetCustomFee(address indexed pair, uint256 fee); event SetFee(bool stable, uint256 fee); error IncorrcectFee(); error IncorrectPair(); error IdenticalAddress(); error PairExist(); function implementation() external view returns (address); function PAIRS_ADMINISTRATOR_ROLE() external view returns (bytes32); function FEES_MANAGER_ROLE() external view returns (bytes32); function PAIRS_CREATOR_ROLE() external view returns (bytes32); function hasRole(bytes32 role, address user) external view returns (bool); function allPairsLength() external view returns (uint); function isPair(address pair) external view returns (bool); function allPairs(uint index) external view returns (address); function getPair(address tokenA, address token, bool stable) external view returns (address); function createPair(address tokenA, address tokenB, bool stable) external returns (address pair); function pairs() external view returns (address[] memory); function getFee(address pair_, bool stable_) external view returns (uint256); function getHookTarget(address pair_) external view returns (address); function getProtocolFee(address pair_) external view returns (uint256); function isPaused() external view returns (bool); function isPublicPoolCreationMode() external view returns (bool); }
pragma solidity >=0.6.2; interface IUniswapV2PartialRouter { function WETH() external view returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable returns (uint[] memory amounts); function swapExactTokensForETH( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getReserves(address tokenA, address tokenB) external view returns (uint reserveA, uint reserveB); }
import {Clones} from "@openzeppelin/contracts/proxy/Clones.sol"; import {IPairFactory} from "./interfaces/IPairFactory.sol"; /** *Submitted for verification at FtmScan.com on 2022-02-20 */ // SPDX-License-Identifier: MIT // ftm.guru's extension of Solidly's periphery (Router) // https://github.com/andrecronje/solidly/blob/master/contracts/BaseV1-periphery.sol // BaseV1Router02.sol : Supporting Fee-on-transfer Tokens // https://github.com/ftm1337/solidly-with-FoT/blob/master/contracts/BaseV1-periphery.sol pragma solidity =0.8.19; interface IBaseV1Pair { function transferFrom(address src, address dst, uint amount) external returns (bool); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function burn(address to) external returns (uint amount0, uint amount1); function mint(address to) external returns (uint liquidity); function getReserves() external view returns (uint112 _reserve0, uint112 _reserve1, uint32 _blockTimestampLast); function getAmountOut(uint, address) external view returns (uint); } interface erc20 { function totalSupply() external view returns (uint256); function transfer(address recipient, uint amount) external returns (bool); function decimals() external view returns (uint8); function symbol() external view returns (string memory); function balanceOf(address) external view returns (uint); function allowance(address, address) external view returns (uint); function transferFrom(address sender, address recipient, uint amount) external returns (bool); function approve(address spender, uint value) external returns (bool); } library Math { function min(uint a, uint b) internal pure returns (uint) { return a < b ? a : b; } function sqrt(uint y) internal pure returns (uint z) { if (y > 3) { z = y; uint x = y / 2 + 1; while (x < z) { z = x; x = (y / x + x) / 2; } } else if (y != 0) { z = 1; } } function sub(uint x, uint y) internal pure returns (uint z) { require((z = x - y) <= x, "Math: Sub-underflow"); } } interface IWETH { function deposit() external payable; function transfer(address to, uint value) external returns (bool); function withdraw(uint) external; } interface IBlast { function configureGovernor(address _governor) external; } // Experimental Extension [ftm.guru/solidly/BaseV1Router02] // contract BaseV1Router02 is BaseV1Router01 // with Support for Fee-on-Transfer Tokens contract RouterV2 { using Math for uint; struct route { address from; address to; bool stable; } address public immutable factory; IWETH public immutable wETH; uint internal constant MINIMUM_LIQUIDITY = 10 ** 3; // swap event for the referral system event Swap(address indexed sender, uint amount0In, address _tokenIn, address indexed to, bool stable); modifier ensure(uint deadline) { require(deadline >= block.timestamp, "BaseV1Router: EXPIRED"); _; } constructor(address _blastGovernor, address _factory, address _wETH) { IBlast(0x4300000000000000000000000000000000000002).configureGovernor(_blastGovernor); factory = _factory; wETH = IWETH(_wETH); } receive() external payable { assert(msg.sender == address(wETH)); // only accept ETH via fallback from the WETH contract } function sortTokens(address tokenA, address tokenB) public pure returns (address token0, address token1) { require(tokenA != tokenB, "BaseV1Router: IDENTICAL_ADDRESSES"); (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); require(token0 != address(0), "BaseV1Router: ZERO_ADDRESS"); } // calculates the CREATE2 address for a pair without making any external calls function pairFor(address tokenA, address tokenB, bool stable) public view returns (address pair) { (address token0, address token1) = sortTokens(tokenA, tokenB); bytes32 salt = keccak256(abi.encodePacked(token0, token1, stable)); pair = Clones.predictDeterministicAddress(IPairFactory(factory).implementation(), salt, factory); } // given some amount of an asset and pair reserves, returns an equivalent amount of the other asset function quoteLiquidity(uint amountA, uint reserveA, uint reserveB) internal pure returns (uint amountB) { require(amountA > 0, "BaseV1Router: INSUFFICIENT_AMOUNT"); require(reserveA > 0 && reserveB > 0, "BaseV1Router: INSUFFICIENT_LIQUIDITY"); amountB = (amountA * reserveB) / reserveA; } // fetches and sorts the reserves for a pair function getReserves(address tokenA, address tokenB, bool stable) public view returns (uint reserveA, uint reserveB) { (address token0, ) = sortTokens(tokenA, tokenB); (uint reserve0, uint reserve1, ) = IBaseV1Pair(pairFor(tokenA, tokenB, stable)).getReserves(); (reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0); } // performs chained getAmountOut calculations on any number of pairs function getAmountOut(uint amountIn, address tokenIn, address tokenOut) public view returns (uint amount, bool stable) { address pair = pairFor(tokenIn, tokenOut, true); uint amountStable; uint amountVolatile; if (IPairFactory(factory).isPair(pair)) { amountStable = IBaseV1Pair(pair).getAmountOut(amountIn, tokenIn); } pair = pairFor(tokenIn, tokenOut, false); if (IPairFactory(factory).isPair(pair)) { amountVolatile = IBaseV1Pair(pair).getAmountOut(amountIn, tokenIn); } return amountStable > amountVolatile ? (amountStable, true) : (amountVolatile, false); } // performs chained getAmountOut calculations on any number of pairs function getAmountsOut(uint amountIn, route[] memory routes) public view returns (uint[] memory amounts) { require(routes.length >= 1, "BaseV1Router: INVALID_PATH"); amounts = new uint[](routes.length + 1); amounts[0] = amountIn; for (uint i = 0; i < routes.length; i++) { address pair = pairFor(routes[i].from, routes[i].to, routes[i].stable); if (IPairFactory(factory).isPair(pair)) { amounts[i + 1] = IBaseV1Pair(pair).getAmountOut(amounts[i], routes[i].from); } } } function isPair(address pair) public view returns (bool) { return IPairFactory(factory).isPair(pair); } function quoteAddLiquidity( address tokenA, address tokenB, bool stable, uint amountADesired, uint amountBDesired ) public view returns (uint amountA, uint amountB, uint liquidity) { // create the pair if it doesn't exist yet address _pair = IPairFactory(factory).getPair(tokenA, tokenB, stable); (uint reserveA, uint reserveB) = (0, 0); uint _totalSupply = 0; if (_pair != address(0)) { _totalSupply = erc20(_pair).totalSupply(); (reserveA, reserveB) = getReserves(tokenA, tokenB, stable); } if (reserveA == 0 && reserveB == 0) { (amountA, amountB) = (amountADesired, amountBDesired); liquidity = Math.sqrt(amountA * amountB) - MINIMUM_LIQUIDITY; } else { uint amountBOptimal = quoteLiquidity(amountADesired, reserveA, reserveB); if (amountBOptimal <= amountBDesired) { (amountA, amountB) = (amountADesired, amountBOptimal); liquidity = Math.min((amountA * _totalSupply) / reserveA, (amountB * _totalSupply) / reserveB); } else { uint amountAOptimal = quoteLiquidity(amountBDesired, reserveB, reserveA); (amountA, amountB) = (amountAOptimal, amountBDesired); liquidity = Math.min((amountA * _totalSupply) / reserveA, (amountB * _totalSupply) / reserveB); } } } function quoteRemoveLiquidity( address tokenA, address tokenB, bool stable, uint liquidity ) public view returns (uint amountA, uint amountB) { // create the pair if it doesn't exist yet address _pair = IPairFactory(factory).getPair(tokenA, tokenB, stable); if (_pair == address(0)) { return (0, 0); } (uint reserveA, uint reserveB) = getReserves(tokenA, tokenB, stable); uint _totalSupply = erc20(_pair).totalSupply(); amountA = (liquidity * reserveA) / _totalSupply; // using balances ensures pro-rata distribution amountB = (liquidity * reserveB) / _totalSupply; // using balances ensures pro-rata distribution } function _addLiquidity( address tokenA, address tokenB, bool stable, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin ) internal returns (uint amountA, uint amountB) { require(amountADesired >= amountAMin); require(amountBDesired >= amountBMin); // create the pair if it doesn't exist yet address _pair = IPairFactory(factory).getPair(tokenA, tokenB, stable); if (_pair == address(0)) { _pair = IPairFactory(factory).createPair(tokenA, tokenB, stable); } (uint reserveA, uint reserveB) = getReserves(tokenA, tokenB, stable); if (reserveA == 0 && reserveB == 0) { (amountA, amountB) = (amountADesired, amountBDesired); } else { uint amountBOptimal = quoteLiquidity(amountADesired, reserveA, reserveB); if (amountBOptimal <= amountBDesired) { require(amountBOptimal >= amountBMin, "BaseV1Router: INSUFFICIENT_B_AMOUNT"); (amountA, amountB) = (amountADesired, amountBOptimal); } else { uint amountAOptimal = quoteLiquidity(amountBDesired, reserveB, reserveA); assert(amountAOptimal <= amountADesired); require(amountAOptimal >= amountAMin, "BaseV1Router: INSUFFICIENT_A_AMOUNT"); (amountA, amountB) = (amountAOptimal, amountBDesired); } } } function addLiquidity( address tokenA, address tokenB, bool stable, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) public ensure(deadline) returns (uint amountA, uint amountB, uint liquidity) { (amountA, amountB) = _addLiquidity(tokenA, tokenB, stable, amountADesired, amountBDesired, amountAMin, amountBMin); address pair = pairFor(tokenA, tokenB, stable); _safeTransferFrom(tokenA, msg.sender, pair, amountA); _safeTransferFrom(tokenB, msg.sender, pair, amountB); liquidity = IBaseV1Pair(pair).mint(to); } function addLiquidityETH( address token, bool stable, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) public payable ensure(deadline) returns (uint amountToken, uint amountETH, uint liquidity) { (amountToken, amountETH) = _addLiquidity(token, address(wETH), stable, amountTokenDesired, msg.value, amountTokenMin, amountETHMin); address pair = pairFor(token, address(wETH), stable); _safeTransferFrom(token, msg.sender, pair, amountToken); wETH.deposit{value: amountETH}(); assert(wETH.transfer(pair, amountETH)); liquidity = IBaseV1Pair(pair).mint(to); // refund dust ETH, if any if (msg.value > amountETH) _safeTransferETH(msg.sender, msg.value - amountETH); } // **** REMOVE LIQUIDITY **** function removeLiquidity( address tokenA, address tokenB, bool stable, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) public ensure(deadline) returns (uint amountA, uint amountB) { address pair = pairFor(tokenA, tokenB, stable); require(IBaseV1Pair(pair).transferFrom(msg.sender, pair, liquidity)); // send liquidity to pair (uint amount0, uint amount1) = IBaseV1Pair(pair).burn(to); (address token0, ) = sortTokens(tokenA, tokenB); (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0); require(amountA >= amountAMin, "BaseV1Router: INSUFFICIENT_A_AMOUNT"); require(amountB >= amountBMin, "BaseV1Router: INSUFFICIENT_B_AMOUNT"); } function removeLiquidityETH( address token, bool stable, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) public ensure(deadline) returns (uint amountToken, uint amountETH) { (amountToken, amountETH) = removeLiquidity( token, address(wETH), stable, liquidity, amountTokenMin, amountETHMin, address(this), deadline ); _safeTransfer(token, to, amountToken); wETH.withdraw(amountETH); _safeTransferETH(to, amountETH); } function removeLiquidityWithPermit( address tokenA, address tokenB, bool stable, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) public returns (uint amountA, uint amountB) { address pair = pairFor(tokenA, tokenB, stable); { uint value = approveMax ? type(uint).max : liquidity; _trustlessPermit(pair, msg.sender, address(this), value, deadline, v, r, s); } (amountA, amountB) = removeLiquidity(tokenA, tokenB, stable, liquidity, amountAMin, amountBMin, to, deadline); } function removeLiquidityETHWithPermit( address token, bool stable, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) public returns (uint amountToken, uint amountETH) { address pair = pairFor(token, address(wETH), stable); uint value = approveMax ? type(uint).max : liquidity; _trustlessPermit(pair, msg.sender, address(this), value, deadline, v, r, s); (amountToken, amountETH) = removeLiquidityETH(token, stable, liquidity, amountTokenMin, amountETHMin, to, deadline); } // **** SWAP **** // requires the initial amount to have already been sent to the first pair function _swap(uint[] memory amounts, route[] memory routes, address _to) internal virtual { for (uint i = 0; i < routes.length; i++) { (address token0, ) = sortTokens(routes[i].from, routes[i].to); uint amountOut = amounts[i + 1]; (uint amount0Out, uint amount1Out) = routes[i].from == token0 ? (uint(0), amountOut) : (amountOut, uint(0)); address to = i < routes.length - 1 ? pairFor(routes[i + 1].from, routes[i + 1].to, routes[i + 1].stable) : _to; IBaseV1Pair(pairFor(routes[i].from, routes[i].to, routes[i].stable)).swap(amount0Out, amount1Out, to, new bytes(0)); emit Swap(msg.sender, amounts[i], routes[i].from, _to, routes[i].stable); } } function swapExactTokensForTokensSimple( uint amountIn, uint amountOutMin, address tokenFrom, address tokenTo, bool stable, address to, uint deadline ) public ensure(deadline) returns (uint[] memory amounts) { route[] memory routes = new route[](1); routes[0].from = tokenFrom; routes[0].to = tokenTo; routes[0].stable = stable; amounts = getAmountsOut(amountIn, routes); require(amounts[amounts.length - 1] >= amountOutMin, "BaseV1Router: INSUFFICIENT_OUTPUT_AMOUNT"); _safeTransferFrom(routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0]); _swap(amounts, routes, to); } function swapExactTokensForTokens( uint amountIn, uint amountOutMin, route[] memory routes, address to, uint deadline ) public ensure(deadline) returns (uint[] memory amounts) { amounts = getAmountsOut(amountIn, routes); require(amounts[amounts.length - 1] >= amountOutMin, "BaseV1Router: INSUFFICIENT_OUTPUT_AMOUNT"); _safeTransferFrom(routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0]); _swap(amounts, routes, to); } function swapExactETHForTokens( uint amountOutMin, route[] memory routes, address to, uint deadline ) public payable ensure(deadline) returns (uint[] memory amounts) { require(routes[0].from == address(wETH), "BaseV1Router: INVALID_PATH"); amounts = getAmountsOut(msg.value, routes); require(amounts[amounts.length - 1] >= amountOutMin, "BaseV1Router: INSUFFICIENT_OUTPUT_AMOUNT"); wETH.deposit{value: amounts[0]}(); assert(wETH.transfer(pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0])); _swap(amounts, routes, to); } function swapExactTokensForETH( uint amountIn, uint amountOutMin, route[] memory routes, address to, uint deadline ) public ensure(deadline) returns (uint[] memory amounts) { require(routes[routes.length - 1].to == address(wETH), "BaseV1Router: INVALID_PATH"); amounts = getAmountsOut(amountIn, routes); require(amounts[amounts.length - 1] >= amountOutMin, "BaseV1Router: INSUFFICIENT_OUTPUT_AMOUNT"); _safeTransferFrom(routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0]); _swap(amounts, routes, address(this)); wETH.withdraw(amounts[amounts.length - 1]); _safeTransferETH(to, amounts[amounts.length - 1]); } function UNSAFE_swapExactTokensForTokens( uint[] memory amounts, route[] memory routes, address to, uint deadline ) public ensure(deadline) returns (uint[] memory) { _safeTransferFrom(routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0]); _swap(amounts, routes, to); return amounts; } function _safeTransferETH(address to, uint value) internal { (bool success, ) = to.call{value: value}(new bytes(0)); require(success, "TransferHelper: ETH_TRANSFER_FAILED"); } function _safeTransfer(address token, address to, uint256 value) internal { require(token.code.length > 0); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(erc20.transfer.selector, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool)))); } function _safeTransferFrom(address token, address from, address to, uint256 value) internal { require(token.code.length > 0); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(erc20.transferFrom.selector, from, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool)))); } // Experimental Extension [ETH.guru/solidly/BaseV1Router02] // **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens)**** function removeLiquidityETHSupportingFeeOnTransferTokens( address token, bool stable, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) public ensure(deadline) returns (uint amountToken, uint amountETH) { (amountToken, amountETH) = removeLiquidity( token, address(wETH), stable, liquidity, amountTokenMin, amountETHMin, address(this), deadline ); _safeTransfer(token, to, erc20(token).balanceOf(address(this))); wETH.withdraw(amountETH); _safeTransferETH(to, amountETH); } function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, bool stable, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) public returns (uint amountToken, uint amountETH) { address pair = pairFor(token, address(wETH), stable); uint value = approveMax ? type(uint).max : liquidity; _trustlessPermit(pair, msg.sender, address(this), value, deadline, v, r, s); (amountToken, amountETH) = removeLiquidityETHSupportingFeeOnTransferTokens( token, stable, liquidity, amountTokenMin, amountETHMin, to, deadline ); } // **** SWAP (supporting fee-on-transfer tokens) **** // requires the initial amount to have already been sent to the first pair function _swapSupportingFeeOnTransferTokens(route[] memory routes, address _to) internal virtual { for (uint i; i < routes.length; i++) { (address input, address output) = (routes[i].from, routes[i].to); (address token0, ) = sortTokens(input, output); IBaseV1Pair pair = IBaseV1Pair(pairFor(routes[i].from, routes[i].to, routes[i].stable)); uint amountInput; uint amountOutput; { // scope to avoid stack too deep errors (uint reserve0, uint reserve1, ) = pair.getReserves(); (uint reserveInput, ) = input == token0 ? (reserve0, reserve1) : (reserve1, reserve0); amountInput = erc20(input).balanceOf(address(pair)).sub(reserveInput); (amountOutput, ) = getAmountOut(amountInput, input, output); } (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOutput) : (amountOutput, uint(0)); address to = i < routes.length - 1 ? pairFor(routes[i + 1].from, routes[i + 1].to, routes[i + 1].stable) : _to; pair.swap(amount0Out, amount1Out, to, new bytes(0)); bool _stable = routes[i].stable; emit Swap(msg.sender, amountInput, input, _to, _stable); } } function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, route[] memory routes, address to, uint deadline ) public ensure(deadline) { _safeTransferFrom(routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amountIn); uint balanceBefore = erc20(routes[routes.length - 1].to).balanceOf(to); _swapSupportingFeeOnTransferTokens(routes, to); require( erc20(routes[routes.length - 1].to).balanceOf(to).sub(balanceBefore) >= amountOutMin, "BaseV1Router: INSUFFICIENT_OUTPUT_AMOUNT" ); } function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, route[] memory routes, address to, uint deadline ) public payable ensure(deadline) { require(routes[0].from == address(wETH), "BaseV1Router: INVALID_PATH"); uint amountIn = msg.value; wETH.deposit{value: amountIn}(); assert(wETH.transfer(pairFor(routes[0].from, routes[0].to, routes[0].stable), amountIn)); uint balanceBefore = erc20(routes[routes.length - 1].to).balanceOf(to); _swapSupportingFeeOnTransferTokens(routes, to); require( erc20(routes[routes.length - 1].to).balanceOf(to).sub(balanceBefore) >= amountOutMin, "BaseV1Router: INSUFFICIENT_OUTPUT_AMOUNT" ); } function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, route[] memory routes, address to, uint deadline ) public ensure(deadline) { require(routes[routes.length - 1].to == address(wETH), "BaseV1Router: INVALID_PATH"); _safeTransferFrom(routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amountIn); _swapSupportingFeeOnTransferTokens(routes, address(this)); uint amountOut = erc20(address(wETH)).balanceOf(address(this)); require(amountOut >= amountOutMin, "BaseV1Router: INSUFFICIENT_OUTPUT_AMOUNT"); wETH.withdraw(amountOut); _safeTransferETH(to, amountOut); } function _trustlessPermit( address token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { // Try permit() before allowance check to advance nonce if possible try IBaseV1Pair(token).permit(owner, spender, value, deadline, v, r, s) { return; } catch { // Permit potentially got frontran. Continue anyways if allowance is sufficient. if (erc20(token).allowance(owner, spender) >= value) { return; } } revert("Permit failure"); } }
{ "evmVersion": "paris", "viaIR": true, "optimizer": { "enabled": true, "runs": 2000 }, "metadata": { "bytecodeHash": "none" }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_blastGovernor","type":"address"},{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_wETH","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0In","type":"uint256"},{"indexed":false,"internalType":"address","name":"_tokenIn","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"bool","name":"stable","type":"bool"}],"name":"Swap","type":"event"},{"inputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct RouterV2.route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"UNSAFE_swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"nonpayable","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":"bool","name":"stable","type":"bool"},{"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":"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":"bool","name":"stable","type":"bool"},{"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":[{"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":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"stable","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct RouterV2.route[]","name":"routes","type":"tuple[]"}],"name":"getAmountsOut","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":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"name":"getReserves","outputs":[{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"getReserves","outputs":[{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"}],"name":"isPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"name":"pairFor","outputs":[{"internalType":"address","name":"pair","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"path","type":"address[]"}],"name":"pathsToVolatilityRoutes","outputs":[{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct RouterV2.route[]","name":"","type":"tuple[]"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"}],"name":"quoteAddLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"name":"quoteRemoveLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"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":"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":"bool","name":"stable","type":"bool"},{"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"}],"name":"removeLiquidityETHSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"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":"removeLiquidityETHSupportingFeeOnTransferTokens","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":"bool","name":"stable","type":"bool"},{"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":[{"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":[{"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":"removeLiquidityETHWithPermitSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"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":"removeLiquidityETHWithPermitSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","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":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"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":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"sortTokens","outputs":[{"internalType":"address","name":"token0","type":"address"},{"internalType":"address","name":"token1","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct RouterV2.route[]","name":"routes","type":"tuple[]"},{"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":"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":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct RouterV2.route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokensSupportingFeeOnTransferTokens","outputs":[],"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":"swapExactETHForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct RouterV2.route[]","name":"routes","type":"tuple[]"},{"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":"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":"swapExactTokensForETHSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct RouterV2.route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETHSupportingFeeOnTransferTokens","outputs":[],"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":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct RouterV2.route[]","name":"routes","type":"tuple[]"},{"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":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address","name":"tokenFrom","type":"address"},{"internalType":"address","name":"tokenTo","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSimple","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":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct RouterV2.route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wETH","outputs":[{"internalType":"contract IWETH","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60c034620001c757601f620055cf38819003918201601f1916830192916001600160401b039182851184861017620001a6578160609285926040978852833981010312620001c7576200005282620001cc565b916200006e846200006660208401620001cc565b9201620001cc565b9173430000000000000000000000000000000000000290813b15620001c7578551631d70c8d360e31b81526001600160a01b039586166004820152916000908390602490829084905af18015620001bc5762000195575b50506080521660a052516153ed9081620001e282396080518181816109230152818161119001528181611b030152818161366b015281816138e701528181613cb801528181613fe80152818161423401526144a4015260a051818181602a0152818161027a015281816105380152818161070d015281816109b401528181610c5301528181610e9001528181611360015281816113de0152818161168101528181611e5e0152818161201c0152818161244e0152818161286b01528181612eb60152818161495c0152614b190152f35b8111620001a65784523880620000c5565b634e487b7160e01b600052604160045260246000fd5b86513d6000823e3d90fd5b600080fd5b51906001600160a01b0382168203620001c75756fe604060808152600480361015610053575b5050361561001d57600080fd5b6100516001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633146134e0565b005b6000803560e01c806302751cec14612e805780630dede6c414612d3257806313dcfc5914612bc557806318a1308614612ba557806318cbafe514612b825780632195995c14612ab357806338ed173914612a845780634386e63c14612a4b578063448725b41461284a5780634c1ee03e14612803578063544caa56146127b45780635a47ddc3146126925780635b0d5984146124215780635c11d795146123ee5780635e1e6325146123b25780635e60dab51461237d57806367ffb66a146123645780636cc1ae13146121f75780637301e3c8146120d157806376c7275114611fe2578063791ac94714611fb05780637af728c814611dff5780637ff36ab514611dd75780639881fcb414611d9c57806398a0fb3c14611a7d578063a32b1fcd146118c3578063ad5c4648146106ed578063af2979eb14611645578063b6f9de9514611395578063b7e0d4c01461132a578063baa2abde146111b4578063c45a015514611170578063d06ca61f14611121578063d52bb6f414611050578063d7b0e0a514610e50578063ded9382a14610c27578063e2d9d4dc14610987578063e5e31b13146108e2578063e8e33700146107d6578063e91e469c14610731578063f2428621146106ed578063f305d7191461050c578063f41766d8146104d95763fe411f14146102435750610010565b346103f3576102513661343c565b9792979591939594909442111593610268856140e6565b6102a76001600160a01b03926102a0847f000000000000000000000000000000000000000000000000000000000000000016976140e6565b868561372d565b8a516323b872dd60e01b8152338682019081526001600160a01b038316602082810191909152604082019a909a529184169189908290819060600103818d865af19081156104cf578a916104a2575b501561049e57908a89969594939260248251809c819363226bf2d160e21b8352308a8401525af1988915610494578690879a61045b575b5061033886856134fd565b50848416931683036104465791610363899261035b602496959d8e5b1015614131565b8b10156141a2565b8b51938480926370a0823160e01b825230888301525afa90811561043c5786908692610404575b6103949350614d28565b813b15610400578560248492838b519586948593632e1a7d4d60e01b85528401525af180156103f657908592916103db575b50506103d191614c97565b8351928352820152f35b8192506103e7906130b8565b6103f3578084916103c6565b80fd5b87513d84823e3d90fd5b8280fd5b9150508682813d8311610435575b61041c818361311a565b81010312610430578561039492519161038a565b600080fd5b503d610412565b8a513d87823e3d90fd5b9891610363899261035b602496959d8e610354565b809a508c8092503d831161048d575b610474818361311a565b8101031261048957878951990151983861032d565b8580fd5b503d61046a565b8b513d88823e3d90fd5b8880fd5b6104c29150893d8b116104c8575b6104ba818361311a565b81019061385f565b386102f6565b503d6104b0565b8c513d8c823e3d90fd5b50823461050857610504906104f96104f0366131fc565b939290926148a1565b90519182918261307d565b0390f35b5080fd5b61056261052c84848761051e3661302e565b9992939890994211156140e6565b6001600160a01b0392837f0000000000000000000000000000000000000000000000000000000000000000169834908a87614213565b97909661057c8861057383876135f9565b80963390614dc3565b803b15610489578451630d0e30db60e41b8152868189818d865af180156106c857859288928a926106d2575b506105e2908c895194858094819363a9059cbb60e01b835260209c8d988401602090939291936001600160a01b0360408201951681520152565b03925af19081156106c85784602493610607889796948b9485916106ab575b506134e0565b88519a8b9687956335313c2160e11b87521690850152165af19283156106a0579261066e575b506105049250843411610656575b51938493846040919493926060820195825260208201520152565b6106696106638634613e9e565b33614c97565b61063b565b90915082813d8311610699575b610685818361311a565b81010312610430576105049151908561062d565b503d61067b565b8251903d90823e3d90fd5b6106c29150893d8b116104c8576104ba818361311a565b8f610601565b86513d89823e3d90fd5b9093506106df91506130b8565b61048957858785928c6105a8565b508234610508578160031936011261050857602090516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346103f3576020918260031936011261050857803567ffffffffffffffff811161040057366023820112156104005761077c918160246107779336930135910161348a565b6152f0565b90835192808401908085528351809252808686019401925b8281106107a15785850386f35b835180516001600160a01b03908116875281840151168684015287015115158786015260609094019392810192600101610794565b50919034610400576101006003193601126104005761085791926107f8612fac565b936020610803612fc2565b602461080d612fd8565b9561081c4260e43510156140e6565b61083260a435608435606435604435878e614213565b8a85610850610845859d9598859f6135f9565b978880943390614dc3565b3390614dc3565b85855197889485936335313c2160e11b85526001600160a01b0380931690850152165af19182156108d757916108a2575b519283526020830193909352506040810191909152606090f35b90506020823d82116108cf575b816108bc6020938361311a565b8101031261043057610504915190610888565b3d91506108af565b9051903d90823e3d90fd5b5091346104005760206003193601126104005760206108ff612fac565b92602483518095819363e5e31b1360e01b83526001600160a01b03809216908301527f0000000000000000000000000000000000000000000000000000000000000000165afa91821561097d576020939261095e575b50519015158152f35b610976919250833d81116104c8576104ba818361311a565b9038610955565b81513d85823e3d90fd5b50346103f35750610997366132ca565b93888a999a93958295936001600160a01b039e999e9d989a9d97887f0000000000000000000000000000000000000000000000000000000000000000169c6109e0908e8c61372d565b9560001497610a1596610a0495610a1c9a610c215750600019905b30903390615171565b421115610a10816140e6565b6140e6565b868461372d565b97818916988a51906323b872dd60e01b8252818b81600081610a6460209e8f978d339085016040919493929460608201956001600160a01b0380921683521660208201520152565b03925af1908115610c1657600091610bf9575b5015610430578960009960248251809c819363226bf2d160e21b8352308a8401525af1988915610bee57600090819a610bba575b50610ab687856134fd565b5084841693168303610ba65791610ae18892610ad96024959c9b5b8d1015614131565b8a10156141a2565b8a51928380926370a0823160e01b825230888301525afa908115610b9b578490600092610b69575b50610b1392614d28565b823b1561043057846024600092838a519687948593632e1a7d4d60e01b85528401525af1908115610b5e576103d1928592610b4f575b50614c97565b610b58906130b8565b38610b49565b86513d6000823e3d90fd5b9190508682813d8311610b94575b610b81818361311a565b810103126103f357505183610b13610b09565b503d610b77565b89513d6000823e3d90fd5b9891610ae18892610ad96024959c9b610ad1565b99508a8a813d8311610be7575b610bd1818361311a565b810103126103f357508689519901519838610aab565b503d610bc7565b8a513d6000823e3d90fd5b610c109150883d8a116104c8576104ba818361311a565b38610a77565b8b513d6000823e3d90fd5b906109fb565b508290346103f35750610c393661333f565b92849298936001600160a01b039c9795929c9a96989a9c8d7f0000000000000000000000000000000000000000000000000000000000000000169a610c7e8c8a6135f9565b9360001495610a0494610c9c97610e49576000199030903390615171565b610ce76020610cab88866135f9565b8a516323b872dd60e01b8152338882019081526001600160a01b03831660208201526040810195909552908c1693909283918291606090910190565b03816000865af1908115610b9b57600091610e2b575b50156104305787600091602482518094819363226bf2d160e21b8352308a8401525af1988915610e2057600091829a610de6575b5092610d69989992869285610d7696610d4a8b866134fd565b501690841614600014610dd75790610d71919a8b959a5b861015614131565b8910156141a2565b614d28565b823b15610430578360246000928389519687948593632e1a7d4d60e01b85528401525af1908115610dcc57610db1928492610dbd5750614c97565b82519182526020820152f35b610dc6906130b8565b86610b49565b85513d6000823e3d90fd5b9390610d71919a8b959a610d61565b919099508882813d8311610e19575b610dff818361311a565b810103126103f35750805160209091015198610d76610d31565b503d610df5565b88513d6000823e3d90fd5b610e43915060203d81116104c8576104ba818361311a565b8a610cfd565b88906109fb565b50919034610400576020610eb693610ebd610ef993610e6e3661343c565b9a929a99919497909942111597610e84896140e6565b6001600160a01b039d8e7f000000000000000000000000000000000000000000000000000000000000000016996140e6565b888761372d565b8b516323b872dd60e01b8152338882019081526001600160a01b03831660208201526040810195909552908d1693909283918291606090910190565b03818a865af1908115611046578791611028575b501561048957888691602482518094819363226bf2d160e21b8352308a8401525af1998a1561101e578691879b610fe4575b5092610ad9999a92889285610f7696610f588a866134fd565b501690841614600014610fd55790610d71919b8c959b861015614131565b813b15610400578460248492838a519586948593632e1a7d4d60e01b85528401525af18015610fcb5790849291610fb3575b5050610db191614c97565b819250610fbf906130b8565b6103f357808391610fa8565b86513d84823e3d90fd5b9390610d71919b8c959b610d61565b8a80929c508193503d8311611017575b610ffe818361311a565b8101031261048957805160209091015199610f76610f3f565b503d610ff4565b89513d88823e3d90fd5b611040915060203d81116104c8576104ba818361311a565b38610f0d565b8a513d89823e3d90fd5b50346103f357826003193601126103f3575061106a612fac565b90611073612fc2565b91611096606061108385846134fd565b50946001600160a01b03928391856135f9565b16865194858092630240bc6b60e21b82525afa928315610dcc5760009081946110ef575b5081906dffffffffffffffffffffffffffff809116941694169116146000146110ea579082519182526020820152f35b610db1565b829450611113915060603d811161111a575b61110b818361311a565b810190613792565b50936110ba565b503d611101565b508290346103f357816003193601126103f3576024359067ffffffffffffffff82116103f35750610504926111696107776111626104f9943690850161324a565b369161348a565b9035613c54565b508234610508578160031936011261050857602090516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b5090346105085760e0600319360112610508576111cf612fac565b6111d7612fc2565b926111e0613004565b906111ef4260c43510156140e6565b6111f985846135f9565b86516323b872dd60e01b8152338682019081526001600160a01b0392831660208281018290526044356040840152939593909291829081906060015b038187865af1908115611320578491611302575b501561040057602488928486938551998a95869463226bf2d160e21b865216908401525af19485156112f657819482966112bc575b509061128b8392856134fd565b509050169116146000146112b757905b6112a9606435831015614131565b610db16084358210156141a2565b61129b565b87809297508196503d83116112ef575b6112d6818361311a565b810103126103f35783516020909401519461128b61127e565b503d6112cc565b508551903d90823e3d90fd5b61131a915060203d81116104c8576104ba818361311a565b38611249565b89513d86823e3d90fd5b61057361057c84848761138b6113546113423661343c565b9b93949b9792969095974211156140e6565b6001600160a01b0395867f0000000000000000000000000000000000000000000000000000000000000000169434908d878b61445f565b9a819a848861372d565b506113c16113b884846107776113aa366133f0565b98939792909491369161348a565b954211156140e6565b6001600160a01b0391826113d487613bf8565b51511691611406847f000000000000000000000000000000000000000000000000000000000000000016809414613bad565b823b1561164157878551630d0e30db60e41b81528181858134895af180156103f65761162d575b5061146d9361149f8661143f8b613bf8565b5151169160209687938c8b6114628c8861145885613bf8565b5101511692613bf8565b51015115159161372d565b895194858094819363a9059cbb60e01b835234908b8401602090939291936001600160a01b0360408201951681520152565b03925af190811561162357906114bb918a9161160657506134e0565b865193600019948581019081116115f357846114d883928b613c1b565b51015116948651986370a0823160e01b93848b52868b6024818785169b8c8b8301525afa9a8b156115e9578c9b6115b8575b506115159082614e6e565b80519182019182116115a557918561153281969593602495613c1b565b510151168751968794859384528301525afa92831561159c5750859261156c575b50506115699261156291614e15565b10156145b0565b80f35b90809250813d8311611595575b611583818361311a565b81010312610430575182611562611553565b503d611579565b513d87823e3d90fd5b60248b601187634e487b7160e01b835252fd5b909a508681813d83116115e2575b6115d0818361311a565b8101031261043057519961151561150a565b503d6115c6565b89513d8e823e3d90fd5b60248a601186634e487b7160e01b835252fd5b61161d9150853d87116104c8576104ba818361311a565b8a610601565b86513d8b823e3d90fd5b61163782916130b8565b6103f3578961142d565b8780fd5b50919034610400579180916116e89361165d3661302e565b959391909594929442111594611672866140e6565b6001600160a01b03926116a7847f000000000000000000000000000000000000000000000000000000000000000016976140e6565b6116b187866135f9565b89516323b872dd60e01b8152338882019081526001600160a01b038316602082015260408101939093529c8d928691849160600190565b0391169c8d918160209e8f945af19081156118b9578a9161189c575b501561049e5787899a9b6024829b999a51809d819363226bf2d160e21b8352308b8401525af1998a1561189257908b9392918890899c611852575b5061174a88876134fd565b508685169416840361183e579161035b61176b926024979695941015614131565b8851938480926370a0823160e01b825230888301525afa9081156118345786908692611801575b61179c9350614d28565b813b156104005785602484928388519586948593632e1a7d4d60e01b85528401525af180156117f757908592916117df575b50506117d991614c97565b51908152f35b8192506117eb906130b8565b6103f3578084916117ce565b84513d84823e3d90fd5b9150508882813d831161182d575b611819818361311a565b81010312610430578561179c925191611792565b503d61180f565b87513d87823e3d90fd5b9a9161035b61176b92602497969594610354565b9b505090919250888a813d831161188b575b61186e818361311a565b8101031261188757908a9291838b519b01519a3861173f565b8680fd5b503d611864565b89513d89823e3d90fd5b6118b391508b3d8d116104c8576104ba818361311a565b38611704565b89513d8c823e3d90fd5b50346103f3576101806003193601126103f357506118df612fac565b906118e8612fc2565b916118f161306e565b606435906118fd612fd8565b90610104359060e435821515830361043057610124359060ff82168203610430576119536102a09261195b95611934868d8c61372d565b9015611a7657600019915b846101643593610144359330903390615171565b4211156140e6565b86516323b872dd60e01b8152338682019081526001600160a01b03928316602082810182905260408301969096529294929392908290819060600103816000875af1908115610e2057600091611a58575b50156104305760248391600089948551988995869463226bf2d160e21b865216908401525af1938415610dcc576000938495611a1e575b506119ef8291846134fd565b5016911614600014611a1957905b611a0b608435831015614131565b610db160a4358210156141a2565b6119fd565b939094508584813d8311611a51575b611a37818361311a565b810103126103f357508251602090930151936119ef6119e3565b503d611a2d565b611a70915060203d81116104c8576104ba818361311a565b386119ac565b889161193f565b508290346103f35760a06003193601126103f357611a99612fac565b91611aa2612fc2565b9184611aac61306e565b60643594608435968551926306801cc360e41b845283611af2828585602099850191939260409160608401956001600160a01b0380921685521660208401521515910152565b039285856001600160a01b039581877f0000000000000000000000000000000000000000000000000000000000000000165afa948515611d9257908b92918896611d63575b508796889589971680611ccb575b505050505050821580611cc3575b15611c4157505050611b658484613e6b565b90806003831115611c32575081600181811c818101809111611c1f5791905b848310611be8575050505b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc188201918211611bd5575090519182526020820192909252604081019190915260609150f35b80601187634e487b7160e01b6024945252fd5b9193509083611bf78184613e7e565b908101809111611c0a57811c9190611b84565b601189634e487b7160e01b6000525260246000fd5b60248460118b634e487b7160e01b835252fd5b9115611b8f5760019150611b8f565b909592919650611c52818887613eab565b92808411611c9a5750611c8190611c766105049697611c7b869a611c76838c613e6b565b613e7e565b95613e6b565b905080821015611c9357505b9061063b565b9050611c8d565b9250610504945080611c76611cb389611c819487613eab565b97611c7b869a611c76838c613e6b565b508015611b53565b91949750929550829194508851958680927f18160ddd0000000000000000000000000000000000000000000000000000000082525afa908115611d59578691611d29575b50611d1b9350936137c8565b919091888881808080611b45565b905083813d8311611d52575b611d3f818361311a565b8101031261043057611d1b92518a611d0f565b503d611d35565b87513d88823e3d90fd5b611d84919650873d8911611d8b575b611d7c818361311a565b8101906135da565b948c611b37565b503d611d72565b88513d89823e3d90fd5b508290346103f357816003193601126103f3576024359067ffffffffffffffff82116103f35750610504926111696104f99236908301613155565b610504846104f9611df9610777611ded366133f0565b9592909491369161348a565b9061492d565b50823461050857611e1f611e12366131fc565b95939490954211156140e6565b8051936000198501948511611f9d57611e539492611ecc889593611ec58b946001600160a01b03809860209b8c9186613c1b565b5101511697611e86817f000000000000000000000000000000000000000000000000000000000000000016809a14613bad565b611ebd81611e9386613bf8565b5151169180611ea187613bf8565b515116908d611eaf88613bf8565b510151168a61146288613bf8565b903390614dc3565b3090614e6e565b82516370a0823160e01b815230838201528681602481885afa968715611f93578697611f5d575b5050611f01908610156145b0565b823b15611f595784602485928385519687948593632e1a7d4d60e01b85528401525af1908115611f505750611f3c575b505061156991614c97565b611f45906130b8565b610400578284611f31565b513d84823e3d90fd5b8380fd5b809297508196503d8311611f8c575b611f76818361311a565b8101031261043057611f01879451959089611ef3565b503d611f6c565b84513d88823e3d90fd5b60248760118a634e487b7160e01b835252fd5b50823461050857611e1f61077791611fd9611fca3661327b565b9497939592909891369161348a565b914211156140e6565b509161200090611ff1366133a5565b959195949092944211156140e6565b6001600160a01b03918261201387613bf8565b515116612044847f000000000000000000000000000000000000000000000000000000000000000016809214613bad565b803b15611641578451630d0e30db60e41b81528881858134865af18015611623576120b8575b50908761146d939261207f8661143f8b613bf8565b03925af190811561162357906114bb918a9161209b57506134e0565b6120b29150853d87116104c8576104ba818361311a565b38610601565b976120c861146d949392996130b8565b9790919261206a565b5091346104005760806003193601126104005781359167ffffffffffffffff8084116121f357366023850112156121f35783820135946121108661313d565b9461211d8551968761311a565b86865260209660248888019160051b83010191368311611f5957906024899201905b8382106121e457505050506024359182116103f35750936121696121da9261050496369101613155565b6121d4612174612fee565b926121834260643510156140e6565b6121c26001600160a01b03918261219986613bf8565b51511692806121a787613bf8565b515116916121b487613bf8565b510151168861146287613bf8565b6121cb88613bf8565b51913390614dc3565b84614686565b519182918261307d565b8135815290820190820161213f565b8480fd5b5091346104005761221b9061220b366131fc565b96919695909392954211156140e6565b6001600160a01b03926122598461223189613bf8565b515116938561223f8a613bf8565b51511694611ebd6020968b8a6114628b8b61145885613bf8565b865193600019948581019081116115f3578461227683928b613c1b565b51015116948651986370a0823160e01b93848b52868b6024818785169b8c8b8301525afa9a8b156115e9578c9b61232f575b506122b39082614e6e565b80519182019182116115a55791856122d081969593602495613c1b565b510151168751968794859384528301525afa92831561159c575085926122ff5750506115699261156291614e15565b90809250813d8311612328575b612316818361311a565b81010312611f59575182611562611553565b503d61230c565b909a508681813d831161235d575b612347818361311a565b810103126123595751996122b36122a8565b8b80fd5b503d61233d565b610504846104f9612374366133a5565b9291909161492d565b8382346103f35760606003193601126103f35750610db161239c612fac565b6123a4612fc2565b6123ac61306e565b916137c8565b50346103f35760606003193601126103f357506123e0906123d1612fc2565b6123d9612fee565b9135613877565b825191825215156020820152f35b509134610400576124189061077761221b6124083661327b565b999495939892909691369161348a565b964211156140e6565b509182913461268e576124333661333f565b9c849296959a9893999794919d6001600160a01b039e8f98897f0000000000000000000000000000000000000000000000000000000000000000169c6124798e8d6135f9565b61249597610a0496509115610e49576000199030903390615171565b6124df8a6124a389886135f9565b928b519d8e809481936323b872dd60e01b8352878d339085016040919493929460608201956001600160a01b0380921683521660208201520152565b0394169360209e8f93865af1908115612684578b91612667575b50156126635790888a969594939260248251809d819363226bf2d160e21b8352308b8401525af1998a1561101e57908b9392918790889c612627575b5061254089876134fd565b5086851694168403612614579161035b6125609260249695941015614131565b8851928380926370a0823160e01b825230888301525afa90811561260a57869085926125d8575b5061259192614d28565b823b156105085785602483928388519687948593632e1a7d4d60e01b85528401525af19081156125cd57509184916117d993610b4f5750614c97565b8451903d90823e3d90fd5b8092508a8092503d8311612603575b6125f1818361311a565b81010312611f59575185612591612587565b503d6125e7565b87513d86823e3d90fd5b9a9161035b612560926024969594610354565b9b505090919250888a813d831161265c575b612643818361311a565b8101031261048957908a9291838b519b01519a38612535565b503d612639565b8980fd5b61267e91508c8d3d106104c8576104ba818361311a565b386124f9565b8a513d8d823e3d90fd5b5050fd5b50913461040057610120600319360112610400576126ae612fac565b926126b7612fc2565b926126c061306e565b9060e435956001600160a01b03908188168098036121f35760209285610850999361272d6127226024956126f9426101043510156140e6565b6127148d60c435908c60a4359160843591606435918761445f565b9e8f93829f929c838561372d565b9b8c80943390614dc3565b885196879586946335313c2160e11b8652850152165af19182156127a9578092612773575b50506105049151938493846040919493926060820195825260208201520152565b9091506020823d82116127a1575b8161278e6020938361311a565b810103126103f357505161050438612752565b3d9150612781565b8351903d90823e3d90fd5b508234610508578060031936011261050857610504906127e36127d5612fac565b6127dd612fc2565b906134fd565b91516001600160a01b039182168152911660208201529081906040820190565b508234610508576060600319360112610508576020906001600160a01b0361284261282c612fac565b612834612fc2565b61283c61306e565b9161372d565b915191168152f35b50809291346105085761285c366132ca565b93808a9b989d9a92949c99969c7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169c61289f908e8c61372d565b90600014966020966128cf966128c895610a04946129099b612a44576000199030903390615171565b898761372d565b8b516323b872dd60e01b8152338882019081526001600160a01b039092166020830181905260408301959095529283918291606090910190565b038189865af1908115612a3a578691612a1c575b50156121f357889060248251809c819363226bf2d160e21b835230898401525af1988915612a12578490859a6129d9575b5082610ad9999a9288926001600160a01b0361296d8a612992986134fd565b50166001600160a01b03841614600014610fd55790610d71919b8c959b861015614131565b823b15610508578460248392838a519687948593632e1a7d4d60e01b85528401525af19081156129ce5750918391610db193610b4f5750614c97565b8651903d90823e3d90fd5b809a50898092503d8311612a0b575b6129f2818361311a565b81010312611f595788516020909901519861299261294e565b503d6129e8565b88513d86823e3d90fd5b612a34915060203d81116104c8576104ba818361311a565b3861291d565b8a513d88823e3d90fd5b8c906109fb565b8382346103f35760806003193601126103f35750610db1612a6a612fac565b612a72612fc2565b612a7a61306e565b9060643592613fab565b50823461050857610504906104f9612aad610777612aa13661327b565b9692909591369161348a565b916148a1565b5090346105085761016060031936011261050857612acf612fac565b612ad7612fc2565b9260443590612ae4613004565b60c43560e4358015158103611f5957610104359060ff821682036121f357612b34929161195391612b158b8a6135f9565b9015612b7b57600019915b846101443593610124359330903390615171565b612b3e86856135f9565b87516323b872dd60e01b8152338782019081526001600160a01b039283166020828101829052604083019790975292959082908190606001611235565b8791612b20565b50823461050857610504906104f9612b9f610777612aa13661327b565b91614ad1565b50823461050857610504906104f9612bbc366131fc565b93929092614ad1565b5091346104005760e060031936011261040057612be0612fee565b606435926001600160a01b0390818516809503610489576084359182151580930361188757612c0d613004565b90612c1c4260c43510156140e6565b85519386850185811067ffffffffffffffff821117612d1f57875260018552885b602080821015612c6e57885160209291612c56826130e2565b8c82528c818301528c8b830152828901015201612c3d565b50509194979690929783612c8186613bf8565b51911690526020612c9185613bf8565b51015284612c9e84613bf8565b510152612cac828735613c54565b948551906000198201918211612d0c5761050487876121da88886121d489612ce2602435612cda8c8a613c1b565b5110156145b0565b6121c281612cef85613bf8565b5151169180612cfd86613bf8565b5151169060206121b487613bf8565b80601189634e487b7160e01b6024945252fd5b60248a604187634e487b7160e01b835252fd5b5090346105085761010060031936011261050857612d4e612fac565b612d56612fc2565b92612d5f61306e565b90612d7a612d6b612fd8565b926102a04260e43510156140e6565b86516323b872dd60e01b8152338682019081526001600160a01b039283166020828101829052606435604084015293959390929182908190606001038187865af1908115611320578491612e62575b501561040057602488928486938551998a95869463226bf2d160e21b865216908401525af19485156112f65781948296612e28575b5090612e0b8392856134fd565b50905016911614600014611a195790611a0b608435831015614131565b87809297508196503d8311612e5b575b612e42818361311a565b810103126103f357835160209094015194612e0b612dfe565b503d612e38565b612e7a915060203d81116104c8576104ba818361311a565b38612dc9565b5091903461040057612e913661302e565b97929591939794909442111593612ea7856140e6565b6001600160a01b0398612edc8a7f000000000000000000000000000000000000000000000000000000000000000016966140e6565b612eeb6020610ebd88866135f9565b038189865af1908115612a3a578691612f8e575b50156121f357888591602482518094819363226bf2d160e21b8352308a8401525af1998a15612f84578591869b612f4a575b5092610ad9999a9288928561299296610f588b866134fd565b8a80929c508193503d8311612f7d575b612f64818361311a565b810103126121f357805160209091015199612992612f31565b503d612f5a565b89513d87823e3d90fd5b612fa6915060203d81116104c8576104ba818361311a565b38612eff565b600435906001600160a01b038216820361043057565b602435906001600160a01b038216820361043057565b60c435906001600160a01b038216820361043057565b604435906001600160a01b038216820361043057565b60a435906001600160a01b038216820361043057565b35906001600160a01b038216820361043057565b60031960c0910112610430576001600160a01b03600435818116810361043057916024359160443591606435916084359081168103610430579060a43590565b60443590811515820361043057565b6020908160408183019282815285518094520193019160005b8281106130a4575050505090565b835185529381019392810192600101613096565b67ffffffffffffffff81116130cc57604052565b634e487b7160e01b600052604160045260246000fd5b6060810190811067ffffffffffffffff8211176130cc57604052565b6020810190811067ffffffffffffffff8211176130cc57604052565b90601f601f19910116810190811067ffffffffffffffff8211176130cc57604052565b67ffffffffffffffff81116130cc5760051b60200190565b81601f820112156104305780359061316c8261313d565b9260409061317c8251958661311a565b8385526020918286019183606080970286010194818611610430578401925b8584106131ac575050505050505090565b8684830312610430578251906131c1826130e2565b6131ca8561301a565b82526131d786860161301a565b868301528385013590811515820361043057828792868b95015281520193019261319b565b60a06003198201126104305760043591602435916044359067ffffffffffffffff82116104305761322f91600401613155565b906064356001600160a01b0381168103610430579060843590565b9181601f840112156104305782359167ffffffffffffffff8311610430576020808501948460051b01011161043057565b60a06003198201126104305760043591602435916044359067ffffffffffffffff8211610430576132ae9160040161324a565b90916064356001600160a01b0381168103610430579060843590565b600319610160910112610430576001600160a01b0390600435828116810361043057916024358015158103610430579160443591606435916084359160a4359081168103610430579060c4359060e435801515810361043057906101043560ff81168103610430579061012435906101443590565b600319610140910112610430576001600160a01b03600435818116810361043057916024359160443591606435916084359081168103610430579060a4359060c4358015158103610430579060e43560ff81168103610430579061010435906101243590565b90608060031983011261043057600435916024359067ffffffffffffffff8211610430576133d591600401613155565b906044356001600160a01b0381168103610430579060643590565b90608060031983011261043057600435916024359067ffffffffffffffff8211610430576134209160040161324a565b90916044356001600160a01b0381168103610430579060643590565b60031960e0910112610430576001600160a01b0390600435828116810361043057916024358015158103610430579160443591606435916084359160a4359081168103610430579060c43590565b92916134958261313d565b916134a3604051938461311a565b829481845260208094019160051b810192831161043057905b8282106134c95750505050565b8380916134d58461301a565b8152019101906134bc565b156134e757565b634e487b7160e01b600052600160045260246000fd5b90916001600160a01b039182841683821681811461357057101561356b57925b9183161561352757565b606460405162461bcd60e51b815260206004820152601a60248201527f426173655631526f757465723a205a45524f5f414444524553530000000000006044820152fd5b61351d565b608460405162461bcd60e51b815260206004820152602160248201527f426173655631526f757465723a204944454e544943414c5f414444524553534560448201527f53000000000000000000000000000000000000000000000000000000000000006064820152fd5b9081602091031261043057516001600160a01b03811681036104305790565b90613603916134fd565b906040519060208201926bffffffffffffffffffffffff19809260601b16845260601b1660348201526000604882015260298152613640816130e2565b5190206040517f5c60da1b0000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000006020826004816001600160a01b0385165afa92831561372157605593604393600091613703575b506040519260388401526f5af43d82803e903d91602b57fd5bf3ff60248401526014830152733d602d80600a3d3981f3363d3d373d3d3d363d73825260588201526037600c8201206078820152012090565b61371b915060203d8111611d8b57611d7c818361311a565b386136b1565b6040513d6000823e3d90fd5b90613737916134fd565b916040519160208301936bffffffffffffffffffffffff19809260601b16855260601b166034830152151560f81b604882015260298152613640816130e2565b51906dffffffffffffffffffffffffffff8216820361043057565b90816060910312610430576137a681613777565b9160406137b560208401613777565b92015163ffffffff811681036104305790565b6004919260606137d885846134fd565b50946137ee6001600160a01b039384928661372d565b1660405194858092630240bc6b60e21b82525afa92831561372157600090819461383d575b5081906dffffffffffffffffffffffffffff809116941694169116146000146138395791565b9091565b829450613858915060603d811161111a5761110b818361311a565b5093613813565b90816020910312610430575180151581036104305790565b919061388382826134fd565b916040928351602093848201926bffffffffffffffffffffffff19809260601b16845260601b1660348201527f01000000000000000000000000000000000000000000000000000000000000006048820152602981526138e2816130e2565b5190207f0000000000000000000000000000000000000000000000000000000000000000956001600160a01b03968781169286517f5c60da1b0000000000000000000000000000000000000000000000000000000081528681600481885afa908115610e20579160559391604393600091613b90575b5089519260388401526f5af43d82803e903d91602b57fd5bf3ff60248401526014830152733d602d80600a3d3981f3363d3d373d3d3d363d73825260588201526037600c8201206078820152012096600097889787518363e5e31b1360e01b93848352169081600482015288816024818a5afa908115613b86578c91613b69575b50613ad7575b509060246139ee8893886135f9565b9189519485938492835216968760048301525afa908115610b5e57600091613aba575b50613a34575b5050505050808211600014613a2d575090600190565b9160009150565b84516378a051ad60e11b815260048101919091526001600160a01b039290921660248301529093508190849060449082905afa918215613ab05750600091613a84575b5090503880808080613a17565b82813d8311613aa9575b613a98818361311a565b810103126103f35750518038613a77565b503d613a8e565b513d6000823e3d90fd5b613ad19150853d87116104c8576104ba818361311a565b38613a11565b88516378a051ad60e11b8152600481018690526001600160a01b0388166024820152919a91908890829060449082905afa918215613b5e579081899493613b28575b50909a919250602490506139df565b9150919282813d8311613b57575b613b40818361311a565b810103126103f35750518691906139ee6024613b19565b503d613b36565b8951903d90823e3d90fd5b613b809150893d8b116104c8576104ba818361311a565b386139d9565b8a513d8e823e3d90fd5b613ba79150893d8b11611d8b57611d7c818361311a565b38613958565b15613bb457565b606460405162461bcd60e51b815260206004820152601a60248201527f426173655631526f757465723a20494e56414c49445f504154480000000000006044820152fd5b805115613c055760200190565b634e487b7160e01b600052603260045260246000fd5b8051821015613c055760209160051b010190565b6000198114613c3e5760010190565b634e487b7160e01b600052601160045260246000fd5b91906001613c658183511015613bad565b8151818101809111613c3e57613c7a8161313d565b601f19613c97604093613c8f8551948561311a565b80845261313d565b019360209436868401378196613cac83613bf8565b526001600160a01b03907f000000000000000000000000000000000000000000000000000000000000000082166000865b613cec575b5050505050505050565b8251811015613e6657613d2184613d038386613c1b565b515116858a613d128588613c1b565b51015116886114628588613c1b565b8487519163e5e31b1360e01b8352169060049180838301526024918b818481895afa908115610bee57918c918c989796959493600091613e49575b50613d77575b50505050613d6f90613c2f565b909192613cdd565b8495969750613d89613dca958b613c1b565b519089613d96888b613c1b565b515116918c518097819482936378a051ad60e11b84528984019092916001600160a01b036020916040840195845216910152565b03915afa928315610b9b57600093613e1a575b5089840191828511613e0757505091613d6f91613dfd8a96959489613c1b565b5290388a81613d62565b601190634e487b7160e01b600052526000fd5b90928b82813d8311613e42575b613e31818361311a565b810103126103f35750519138613ddd565b503d613e27565b613e609150833d85116104c8576104ba818361311a565b38613d5c565b613ce2565b81810292918115918404141715613c3e57565b8115613e88570490565b634e487b7160e01b600052601260045260246000fd5b91908203918211613c3e57565b8015613f415781151580613f38575b15613ecf57613ecc92611c7691613e6b565b90565b608460405162461bcd60e51b8152602060048201526024808201527f426173655631526f757465723a20494e53554646494349454e545f4c4951554960448201527f44495459000000000000000000000000000000000000000000000000000000006064820152fd5b50821515613eba565b608460405162461bcd60e51b815260206004820152602160248201527f426173655631526f757465723a20494e53554646494349454e545f414d4f554e60448201527f54000000000000000000000000000000000000000000000000000000000000006064820152fd5b6040516306801cc360e41b81526001600160a01b0382811660048301528381166024830152841515604483015294959460209492939185816064817f000000000000000000000000000000000000000000000000000000000000000086165afa908115613721576000916140c9575b50169283156140ba57849392600492614032926137c8565b949092604051928380927f18160ddd0000000000000000000000000000000000000000000000000000000082525afa92831561372157600093614087575b5050613ecc92611c7b83611c76611c769489613e6b565b8181949293943d83116140b3575b61409f818361311a565b810103126103f35750519082611c7b614070565b503d614095565b50505050509050600090600090565b6140e09150863d8811611d8b57611d7c818361311a565b3861401a565b156140ed57565b606460405162461bcd60e51b815260206004820152601560248201527f426173655631526f757465723a204558504952454400000000000000000000006044820152fd5b1561413857565b608460405162461bcd60e51b815260206004820152602360248201527f426173655631526f757465723a20494e53554646494349454e545f415f414d4f60448201527f554e5400000000000000000000000000000000000000000000000000000000006064820152fd5b156141a957565b608460405162461bcd60e51b815260206004820152602360248201527f426173655631526f757465723a20494e53554646494349454e545f425f414d4f60448201527f554e5400000000000000000000000000000000000000000000000000000000006064820152fd5b9491949390929381861061043057828510610430576001600160a01b0393847f000000000000000000000000000000000000000000000000000000000000000016946040928351926306801cc360e41b845282821693846004820152838216988960248301526000998a60448401526020928381606481865afa9081156115e9579187809594928e948591614442575b5016156143ae575b505050506060906142c9836142c2600495876134fd565b50956135f9565b16865192838092630240bc6b60e21b82525afa9485156143a5575087908895614381575b506dffffffffffffffffffffffffffff80911694169650161460001461437b575b801580614373575b15614324575050505090915b565b61433384828897959697613eab565b9483861161434b5750505050613839908210156141a2565b8395506138399450906143629161436b9394613eab565b948511156134e0565b831015614131565b508315614316565b9261430e565b905061439c91945060603d811161111a5761110b818361311a565b509390386142ed565b513d89823e3d90fd5b8394506064908a9493945194859384927f82dfdce40000000000000000000000000000000000000000000000000000000084528c600485015260248401528160448401525af180156144385760049360609387936142c99361441a575b508195508394508c92506142ab565b8161443092903d10611d8b57611d7c818361311a565b50388061440b565b87513d8c823e3d90fd5b6144599150863d8811611d8b57611d7c818361311a565b386142a3565b919095929594939484871061043057838610610430576040516306801cc360e41b81526001600160a01b038481166004830152828116602483015283151560448301527f0000000000000000000000000000000000000000000000000000000000000000811694916020919082816064818a5afa90811561372157600091614593575b50161561450b575b506144f593506137c8565b9290801580614373571561432457505050509091565b6040517f82dfdce40000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152841660248201528415156044820152948190869060649082906000905af1948515613721576144f595614575575b506144ea565b8161458b92903d10611d8b57611d7c818361311a565b50388061456f565b6145aa9150833d8511611d8b57611d7c818361311a565b386144e2565b156145b757565b608460405162461bcd60e51b815260206004820152602860248201527f426173655631526f757465723a20494e53554646494349454e545f4f5554505560448201527f545f414d4f554e540000000000000000000000000000000000000000000000006064820152fd5b926001600160a01b03919594958452602092838501521660408301526080606083015283519384608084015260005b85811061467257505050601f19601f84600060a0809697860101520116010190565b81810183015184820160a001528201614650565b929160005b825181101561489a576001600160a01b03806146a78386613c1b565b5151166146c660209183836146bc878a613c1b565b51015116906134fd565b50906001840191828511613c3e576146de838a613c1b565b519084806146ec888b613c1b565b51511691161460001461489257600090915b87516000198101908111613c3e5786948987928710600014614885578261474d838261472d6147799686613c1b565b515116906040611462858a614742858a613c1b565b510151169287613c1b565b945b614767898361475e8287613c1b565b51511694613c1b565b510151168b6114626040998a92613c1b565b16845193614786856130fe565b60008552813b1561043057600080946147cd8851978896879586947f022c0d9f00000000000000000000000000000000000000000000000000000000865260048601614621565b03925af1801561487a57906148669493929161486b575b507f423c093a1f80c354c75d4f9e86fde37d7c9014453df9643f585a1b199d094e50614810848a613c1b565b51918361481d868a613c1b565b5151169361485e8261482f888c613c1b565b51015192519485526001600160a01b039095166020850152901515604084015286169233929081906060820190565b0390a3613c2f565b61468b565b614874906130b8565b386147e4565b82513d6000823e3d90fd5b6147799150828a9461474f565b6000916146fe565b5050509050565b916148ba9193926148b582964211156140e6565b613c54565b9283516000198101908111613c3e57613ecc93612cda6148da9287613c1b565b6149276001600160a01b0361491e816148f285613bf8565b515116918061490086613bf8565b51511690602061490f87613bf8565b51015116604061146287613bf8565b6121cb87613bf8565b83614686565b9190939261493d904211156140e6565b6000936001600160a01b038061495283613bf8565b51511690614984817f000000000000000000000000000000000000000000000000000000000000000016809314613bad565b61498e8334613c54565b9485516000198101908111614abd5790612cda6149ab9288613c1b565b6149b485613bf8565b5187833b156103f35760049160405192838092630d0e30db60e41b8252875af18015614ab257614a94575b50614a5091614a11826020936149f487613bf8565b5151169084614a0288613bf8565b51015116604061146288613bf8565b90614a1b87613bf8565b51918960405180968195829463a9059cbb60e01b845260048401602090939291936001600160a01b0360408201951681520152565b03925af1908115614a89579061492791613ecc95969791614a7157506134e0565b6120b2915060203d81116104c8576104ba818361311a565b6040513d88823e3d90fd5b91614a1160209298614aa8614a50956130b8565b98925050916149df565b6040513d8a823e3d90fd5b602489634e487b7160e01b81526011600452fd5b9093614adf904211156140e6565b60009082519260001993848101908111614c4357614b4182614b0e9260206001600160a01b0394859284613c1b565b51015116946148b5847f000000000000000000000000000000000000000000000000000000000000000016809714613bad565b968751868101908111614c2f5791614b64614b7a92612cda614b8296958c613c1b565b614b71816148f285613bf8565b6121cb8a613bf8565b309087614686565b8451838101908111614c1b57614b989086613c1b565b51813b15610400578291602483926040519485938492632e1a7d4d60e01b845260048401525af18015614c1057614c01575b508351918201918211614bed575090614be6613ecc9284613c1b565b5190614c97565b80634e487b7160e01b602492526011600452fd5b614c0a906130b8565b38614bca565b6040513d84823e3d90fd5b602483634e487b7160e01b81526011600452fd5b602486634e487b7160e01b81526011600452fd5b602484634e487b7160e01b81526011600452fd5b3d15614c92573d9067ffffffffffffffff82116130cc5760405191614c866020601f19601f840116018461311a565b82523d6000602084013e565b606090565b6000808093819382604051614cab816130fe565b525af1614cb6614c57565b5015614cbe57565b608460405162461bcd60e51b815260206004820152602360248201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960448201527f4c454400000000000000000000000000000000000000000000000000000000006064820152fd5b919091803b156104305760405163a9059cbb60e01b602082019081526001600160a01b039094166024820152604481019290925260009283928390614d7a81606481015b03601f19810183528261311a565b51925af1614d86614c57565b81614d94575b501561043057565b8051801592508215614da9575b505038614d8c565b614dbc925060208091830101910161385f565b3880614da1565b90929192813b15610430576040516323b872dd60e01b602082019081526001600160a01b039283166024830152949091166044820152606481019290925260009283928390614d7a8160848101614d6c565b9190614e219083613e9e565b918211614e2a57565b606460405162461bcd60e51b815260206004820152601360248201527f4d6174683a205375622d756e646572666c6f77000000000000000000000000006044820152fd5b916000925b805184101561516b576001600160a01b039384614e908284613c1b565b5151166020958087614ea28587613c1b565b5101511690614eb182846134fd565b5081614ebd8688613c1b565b5151169882614ee48183614ed18a8c613c1b565b510151169b60409c8d6114628b8d613c1b565b16908a5191630240bc6b60e21b8352606060049381818681865afa958615615160578791600093849861512e575b5050168814946dffffffffffffffffffffffffffff91908615615125575016915b8c51926370a0823160e01b84528285850152602493828186818d5afa90811561511a576000916150eb575b50614f7491614f6c91614e15565b978989613877565b5094156150e357600094925b8a5160001981019081116150cf578a10156150c65760018a0190818b116150b35750908a8e611462848a80614fb8614fd09887613c1b565b51511695614fc68387613c1b565b5101511693613c1b565b935b8c51614fdd816130fe565b60008152823b15610430576000946150248f92879351988997889687957f022c0d9f0000000000000000000000000000000000000000000000000000000087528601614621565b03925af18015610b9b579161509c96979899917f423c093a1f80c354c75d4f9e86fde37d7c9014453df9643f585a1b199d094e50936150a4575b5061485e8261506d888b613c1b565b51015192519485526001600160a01b039095166020850152901515604084015288169233929081906060820190565b929190614e73565b6150ad906130b8565b3861505e565b601186634e487b7160e01b600052526000fd5b50508a93614fd2565b50601185634e487b7160e01b600052526000fd5b600092614f80565b908382813d8311615113575b615101818361311a565b810103126103f3575051614f74614f5e565b503d6150f7565b8f513d6000823e3d90fd5b90501691614f33565b6151569298506dffffffffffffffffffffffffffff9450803d1061111a5761110b818361311a565b5096909238614f12565b8e513d6000823e3d90fd5b50915050565b959690939192966001600160a01b0380971695863b156104305760ff90604051947fd505accf0000000000000000000000000000000000000000000000000000000086526000998089166004880152871660248701528a6044870152606486015216608484015260a483015260c4820152848160e48183885af190816152dd575b506152d6576040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081526001600160a01b0392831660048201529116602482015290602090829060449082905afa9182156152ca5791615299575b50101561432257606460405162461bcd60e51b815260206004820152600e60248201527f5065726d6974206661696c7572650000000000000000000000000000000000006044820152fd5b90506020813d82116152c2575b816152b36020938361311a565b8101031261043057513861524e565b3d91506152a6565b604051903d90823e3d90fd5b5050505050565b6152e9909591956130b8565b93386151f2565b80519160001990818401938411613c3e5761530a8461313d565b90601f196153286040966153208851958661311a565b80855261313d565b0160005b8181106153b657505060005b8451848101908111613c3e578110156153ad576001600160a01b038061535e8388613c1b565b5116916001810192838211613c3e576153a79261537b858a613c1b565b5116895191615389836130e2565b825260208201526000898201526153a08287613c1b565b5284613c1b565b50615338565b50935091505090565b60209087516153c4816130e2565b600081528260008183015260008a83015282870101520161532c56fea164736f6c6343000813000a0000000000000000000000004867664baafe5926b3ca338e96c88fb5a5feab30000000000000000000000000a19c51d91891d3df7c13ed22a2f89d328a82950f0000000000000000000000004300000000000000000000000000000000000004
Deployed Bytecode
0x604060808152600480361015610053575b5050361561001d57600080fd5b6100516001600160a01b037f00000000000000000000000043000000000000000000000000000000000000041633146134e0565b005b6000803560e01c806302751cec14612e805780630dede6c414612d3257806313dcfc5914612bc557806318a1308614612ba557806318cbafe514612b825780632195995c14612ab357806338ed173914612a845780634386e63c14612a4b578063448725b41461284a5780634c1ee03e14612803578063544caa56146127b45780635a47ddc3146126925780635b0d5984146124215780635c11d795146123ee5780635e1e6325146123b25780635e60dab51461237d57806367ffb66a146123645780636cc1ae13146121f75780637301e3c8146120d157806376c7275114611fe2578063791ac94714611fb05780637af728c814611dff5780637ff36ab514611dd75780639881fcb414611d9c57806398a0fb3c14611a7d578063a32b1fcd146118c3578063ad5c4648146106ed578063af2979eb14611645578063b6f9de9514611395578063b7e0d4c01461132a578063baa2abde146111b4578063c45a015514611170578063d06ca61f14611121578063d52bb6f414611050578063d7b0e0a514610e50578063ded9382a14610c27578063e2d9d4dc14610987578063e5e31b13146108e2578063e8e33700146107d6578063e91e469c14610731578063f2428621146106ed578063f305d7191461050c578063f41766d8146104d95763fe411f14146102435750610010565b346103f3576102513661343c565b9792979591939594909442111593610268856140e6565b6102a76001600160a01b03926102a0847f000000000000000000000000430000000000000000000000000000000000000416976140e6565b868561372d565b8a516323b872dd60e01b8152338682019081526001600160a01b038316602082810191909152604082019a909a529184169189908290819060600103818d865af19081156104cf578a916104a2575b501561049e57908a89969594939260248251809c819363226bf2d160e21b8352308a8401525af1988915610494578690879a61045b575b5061033886856134fd565b50848416931683036104465791610363899261035b602496959d8e5b1015614131565b8b10156141a2565b8b51938480926370a0823160e01b825230888301525afa90811561043c5786908692610404575b6103949350614d28565b813b15610400578560248492838b519586948593632e1a7d4d60e01b85528401525af180156103f657908592916103db575b50506103d191614c97565b8351928352820152f35b8192506103e7906130b8565b6103f3578084916103c6565b80fd5b87513d84823e3d90fd5b8280fd5b9150508682813d8311610435575b61041c818361311a565b81010312610430578561039492519161038a565b600080fd5b503d610412565b8a513d87823e3d90fd5b9891610363899261035b602496959d8e610354565b809a508c8092503d831161048d575b610474818361311a565b8101031261048957878951990151983861032d565b8580fd5b503d61046a565b8b513d88823e3d90fd5b8880fd5b6104c29150893d8b116104c8575b6104ba818361311a565b81019061385f565b386102f6565b503d6104b0565b8c513d8c823e3d90fd5b50823461050857610504906104f96104f0366131fc565b939290926148a1565b90519182918261307d565b0390f35b5080fd5b61056261052c84848761051e3661302e565b9992939890994211156140e6565b6001600160a01b0392837f0000000000000000000000004300000000000000000000000000000000000004169834908a87614213565b97909661057c8861057383876135f9565b80963390614dc3565b803b15610489578451630d0e30db60e41b8152868189818d865af180156106c857859288928a926106d2575b506105e2908c895194858094819363a9059cbb60e01b835260209c8d988401602090939291936001600160a01b0360408201951681520152565b03925af19081156106c85784602493610607889796948b9485916106ab575b506134e0565b88519a8b9687956335313c2160e11b87521690850152165af19283156106a0579261066e575b506105049250843411610656575b51938493846040919493926060820195825260208201520152565b6106696106638634613e9e565b33614c97565b61063b565b90915082813d8311610699575b610685818361311a565b81010312610430576105049151908561062d565b503d61067b565b8251903d90823e3d90fd5b6106c29150893d8b116104c8576104ba818361311a565b8f610601565b86513d89823e3d90fd5b9093506106df91506130b8565b61048957858785928c6105a8565b508234610508578160031936011261050857602090516001600160a01b037f0000000000000000000000004300000000000000000000000000000000000004168152f35b50346103f3576020918260031936011261050857803567ffffffffffffffff811161040057366023820112156104005761077c918160246107779336930135910161348a565b6152f0565b90835192808401908085528351809252808686019401925b8281106107a15785850386f35b835180516001600160a01b03908116875281840151168684015287015115158786015260609094019392810192600101610794565b50919034610400576101006003193601126104005761085791926107f8612fac565b936020610803612fc2565b602461080d612fd8565b9561081c4260e43510156140e6565b61083260a435608435606435604435878e614213565b8a85610850610845859d9598859f6135f9565b978880943390614dc3565b3390614dc3565b85855197889485936335313c2160e11b85526001600160a01b0380931690850152165af19182156108d757916108a2575b519283526020830193909352506040810191909152606090f35b90506020823d82116108cf575b816108bc6020938361311a565b8101031261043057610504915190610888565b3d91506108af565b9051903d90823e3d90fd5b5091346104005760206003193601126104005760206108ff612fac565b92602483518095819363e5e31b1360e01b83526001600160a01b03809216908301527f000000000000000000000000a19c51d91891d3df7c13ed22a2f89d328a82950f165afa91821561097d576020939261095e575b50519015158152f35b610976919250833d81116104c8576104ba818361311a565b9038610955565b81513d85823e3d90fd5b50346103f35750610997366132ca565b93888a999a93958295936001600160a01b039e999e9d989a9d97887f0000000000000000000000004300000000000000000000000000000000000004169c6109e0908e8c61372d565b9560001497610a1596610a0495610a1c9a610c215750600019905b30903390615171565b421115610a10816140e6565b6140e6565b868461372d565b97818916988a51906323b872dd60e01b8252818b81600081610a6460209e8f978d339085016040919493929460608201956001600160a01b0380921683521660208201520152565b03925af1908115610c1657600091610bf9575b5015610430578960009960248251809c819363226bf2d160e21b8352308a8401525af1988915610bee57600090819a610bba575b50610ab687856134fd565b5084841693168303610ba65791610ae18892610ad96024959c9b5b8d1015614131565b8a10156141a2565b8a51928380926370a0823160e01b825230888301525afa908115610b9b578490600092610b69575b50610b1392614d28565b823b1561043057846024600092838a519687948593632e1a7d4d60e01b85528401525af1908115610b5e576103d1928592610b4f575b50614c97565b610b58906130b8565b38610b49565b86513d6000823e3d90fd5b9190508682813d8311610b94575b610b81818361311a565b810103126103f357505183610b13610b09565b503d610b77565b89513d6000823e3d90fd5b9891610ae18892610ad96024959c9b610ad1565b99508a8a813d8311610be7575b610bd1818361311a565b810103126103f357508689519901519838610aab565b503d610bc7565b8a513d6000823e3d90fd5b610c109150883d8a116104c8576104ba818361311a565b38610a77565b8b513d6000823e3d90fd5b906109fb565b508290346103f35750610c393661333f565b92849298936001600160a01b039c9795929c9a96989a9c8d7f0000000000000000000000004300000000000000000000000000000000000004169a610c7e8c8a6135f9565b9360001495610a0494610c9c97610e49576000199030903390615171565b610ce76020610cab88866135f9565b8a516323b872dd60e01b8152338882019081526001600160a01b03831660208201526040810195909552908c1693909283918291606090910190565b03816000865af1908115610b9b57600091610e2b575b50156104305787600091602482518094819363226bf2d160e21b8352308a8401525af1988915610e2057600091829a610de6575b5092610d69989992869285610d7696610d4a8b866134fd565b501690841614600014610dd75790610d71919a8b959a5b861015614131565b8910156141a2565b614d28565b823b15610430578360246000928389519687948593632e1a7d4d60e01b85528401525af1908115610dcc57610db1928492610dbd5750614c97565b82519182526020820152f35b610dc6906130b8565b86610b49565b85513d6000823e3d90fd5b9390610d71919a8b959a610d61565b919099508882813d8311610e19575b610dff818361311a565b810103126103f35750805160209091015198610d76610d31565b503d610df5565b88513d6000823e3d90fd5b610e43915060203d81116104c8576104ba818361311a565b8a610cfd565b88906109fb565b50919034610400576020610eb693610ebd610ef993610e6e3661343c565b9a929a99919497909942111597610e84896140e6565b6001600160a01b039d8e7f000000000000000000000000430000000000000000000000000000000000000416996140e6565b888761372d565b8b516323b872dd60e01b8152338882019081526001600160a01b03831660208201526040810195909552908d1693909283918291606090910190565b03818a865af1908115611046578791611028575b501561048957888691602482518094819363226bf2d160e21b8352308a8401525af1998a1561101e578691879b610fe4575b5092610ad9999a92889285610f7696610f588a866134fd565b501690841614600014610fd55790610d71919b8c959b861015614131565b813b15610400578460248492838a519586948593632e1a7d4d60e01b85528401525af18015610fcb5790849291610fb3575b5050610db191614c97565b819250610fbf906130b8565b6103f357808391610fa8565b86513d84823e3d90fd5b9390610d71919b8c959b610d61565b8a80929c508193503d8311611017575b610ffe818361311a565b8101031261048957805160209091015199610f76610f3f565b503d610ff4565b89513d88823e3d90fd5b611040915060203d81116104c8576104ba818361311a565b38610f0d565b8a513d89823e3d90fd5b50346103f357826003193601126103f3575061106a612fac565b90611073612fc2565b91611096606061108385846134fd565b50946001600160a01b03928391856135f9565b16865194858092630240bc6b60e21b82525afa928315610dcc5760009081946110ef575b5081906dffffffffffffffffffffffffffff809116941694169116146000146110ea579082519182526020820152f35b610db1565b829450611113915060603d811161111a575b61110b818361311a565b810190613792565b50936110ba565b503d611101565b508290346103f357816003193601126103f3576024359067ffffffffffffffff82116103f35750610504926111696107776111626104f9943690850161324a565b369161348a565b9035613c54565b508234610508578160031936011261050857602090516001600160a01b037f000000000000000000000000a19c51d91891d3df7c13ed22a2f89d328a82950f168152f35b5090346105085760e0600319360112610508576111cf612fac565b6111d7612fc2565b926111e0613004565b906111ef4260c43510156140e6565b6111f985846135f9565b86516323b872dd60e01b8152338682019081526001600160a01b0392831660208281018290526044356040840152939593909291829081906060015b038187865af1908115611320578491611302575b501561040057602488928486938551998a95869463226bf2d160e21b865216908401525af19485156112f657819482966112bc575b509061128b8392856134fd565b509050169116146000146112b757905b6112a9606435831015614131565b610db16084358210156141a2565b61129b565b87809297508196503d83116112ef575b6112d6818361311a565b810103126103f35783516020909401519461128b61127e565b503d6112cc565b508551903d90823e3d90fd5b61131a915060203d81116104c8576104ba818361311a565b38611249565b89513d86823e3d90fd5b61057361057c84848761138b6113546113423661343c565b9b93949b9792969095974211156140e6565b6001600160a01b0395867f0000000000000000000000004300000000000000000000000000000000000004169434908d878b61445f565b9a819a848861372d565b506113c16113b884846107776113aa366133f0565b98939792909491369161348a565b954211156140e6565b6001600160a01b0391826113d487613bf8565b51511691611406847f000000000000000000000000430000000000000000000000000000000000000416809414613bad565b823b1561164157878551630d0e30db60e41b81528181858134895af180156103f65761162d575b5061146d9361149f8661143f8b613bf8565b5151169160209687938c8b6114628c8861145885613bf8565b5101511692613bf8565b51015115159161372d565b895194858094819363a9059cbb60e01b835234908b8401602090939291936001600160a01b0360408201951681520152565b03925af190811561162357906114bb918a9161160657506134e0565b865193600019948581019081116115f357846114d883928b613c1b565b51015116948651986370a0823160e01b93848b52868b6024818785169b8c8b8301525afa9a8b156115e9578c9b6115b8575b506115159082614e6e565b80519182019182116115a557918561153281969593602495613c1b565b510151168751968794859384528301525afa92831561159c5750859261156c575b50506115699261156291614e15565b10156145b0565b80f35b90809250813d8311611595575b611583818361311a565b81010312610430575182611562611553565b503d611579565b513d87823e3d90fd5b60248b601187634e487b7160e01b835252fd5b909a508681813d83116115e2575b6115d0818361311a565b8101031261043057519961151561150a565b503d6115c6565b89513d8e823e3d90fd5b60248a601186634e487b7160e01b835252fd5b61161d9150853d87116104c8576104ba818361311a565b8a610601565b86513d8b823e3d90fd5b61163782916130b8565b6103f3578961142d565b8780fd5b50919034610400579180916116e89361165d3661302e565b959391909594929442111594611672866140e6565b6001600160a01b03926116a7847f000000000000000000000000430000000000000000000000000000000000000416976140e6565b6116b187866135f9565b89516323b872dd60e01b8152338882019081526001600160a01b038316602082015260408101939093529c8d928691849160600190565b0391169c8d918160209e8f945af19081156118b9578a9161189c575b501561049e5787899a9b6024829b999a51809d819363226bf2d160e21b8352308b8401525af1998a1561189257908b9392918890899c611852575b5061174a88876134fd565b508685169416840361183e579161035b61176b926024979695941015614131565b8851938480926370a0823160e01b825230888301525afa9081156118345786908692611801575b61179c9350614d28565b813b156104005785602484928388519586948593632e1a7d4d60e01b85528401525af180156117f757908592916117df575b50506117d991614c97565b51908152f35b8192506117eb906130b8565b6103f3578084916117ce565b84513d84823e3d90fd5b9150508882813d831161182d575b611819818361311a565b81010312610430578561179c925191611792565b503d61180f565b87513d87823e3d90fd5b9a9161035b61176b92602497969594610354565b9b505090919250888a813d831161188b575b61186e818361311a565b8101031261188757908a9291838b519b01519a3861173f565b8680fd5b503d611864565b89513d89823e3d90fd5b6118b391508b3d8d116104c8576104ba818361311a565b38611704565b89513d8c823e3d90fd5b50346103f3576101806003193601126103f357506118df612fac565b906118e8612fc2565b916118f161306e565b606435906118fd612fd8565b90610104359060e435821515830361043057610124359060ff82168203610430576119536102a09261195b95611934868d8c61372d565b9015611a7657600019915b846101643593610144359330903390615171565b4211156140e6565b86516323b872dd60e01b8152338682019081526001600160a01b03928316602082810182905260408301969096529294929392908290819060600103816000875af1908115610e2057600091611a58575b50156104305760248391600089948551988995869463226bf2d160e21b865216908401525af1938415610dcc576000938495611a1e575b506119ef8291846134fd565b5016911614600014611a1957905b611a0b608435831015614131565b610db160a4358210156141a2565b6119fd565b939094508584813d8311611a51575b611a37818361311a565b810103126103f357508251602090930151936119ef6119e3565b503d611a2d565b611a70915060203d81116104c8576104ba818361311a565b386119ac565b889161193f565b508290346103f35760a06003193601126103f357611a99612fac565b91611aa2612fc2565b9184611aac61306e565b60643594608435968551926306801cc360e41b845283611af2828585602099850191939260409160608401956001600160a01b0380921685521660208401521515910152565b039285856001600160a01b039581877f000000000000000000000000a19c51d91891d3df7c13ed22a2f89d328a82950f165afa948515611d9257908b92918896611d63575b508796889589971680611ccb575b505050505050821580611cc3575b15611c4157505050611b658484613e6b565b90806003831115611c32575081600181811c818101809111611c1f5791905b848310611be8575050505b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc188201918211611bd5575090519182526020820192909252604081019190915260609150f35b80601187634e487b7160e01b6024945252fd5b9193509083611bf78184613e7e565b908101809111611c0a57811c9190611b84565b601189634e487b7160e01b6000525260246000fd5b60248460118b634e487b7160e01b835252fd5b9115611b8f5760019150611b8f565b909592919650611c52818887613eab565b92808411611c9a5750611c8190611c766105049697611c7b869a611c76838c613e6b565b613e7e565b95613e6b565b905080821015611c9357505b9061063b565b9050611c8d565b9250610504945080611c76611cb389611c819487613eab565b97611c7b869a611c76838c613e6b565b508015611b53565b91949750929550829194508851958680927f18160ddd0000000000000000000000000000000000000000000000000000000082525afa908115611d59578691611d29575b50611d1b9350936137c8565b919091888881808080611b45565b905083813d8311611d52575b611d3f818361311a565b8101031261043057611d1b92518a611d0f565b503d611d35565b87513d88823e3d90fd5b611d84919650873d8911611d8b575b611d7c818361311a565b8101906135da565b948c611b37565b503d611d72565b88513d89823e3d90fd5b508290346103f357816003193601126103f3576024359067ffffffffffffffff82116103f35750610504926111696104f99236908301613155565b610504846104f9611df9610777611ded366133f0565b9592909491369161348a565b9061492d565b50823461050857611e1f611e12366131fc565b95939490954211156140e6565b8051936000198501948511611f9d57611e539492611ecc889593611ec58b946001600160a01b03809860209b8c9186613c1b565b5101511697611e86817f000000000000000000000000430000000000000000000000000000000000000416809a14613bad565b611ebd81611e9386613bf8565b5151169180611ea187613bf8565b515116908d611eaf88613bf8565b510151168a61146288613bf8565b903390614dc3565b3090614e6e565b82516370a0823160e01b815230838201528681602481885afa968715611f93578697611f5d575b5050611f01908610156145b0565b823b15611f595784602485928385519687948593632e1a7d4d60e01b85528401525af1908115611f505750611f3c575b505061156991614c97565b611f45906130b8565b610400578284611f31565b513d84823e3d90fd5b8380fd5b809297508196503d8311611f8c575b611f76818361311a565b8101031261043057611f01879451959089611ef3565b503d611f6c565b84513d88823e3d90fd5b60248760118a634e487b7160e01b835252fd5b50823461050857611e1f61077791611fd9611fca3661327b565b9497939592909891369161348a565b914211156140e6565b509161200090611ff1366133a5565b959195949092944211156140e6565b6001600160a01b03918261201387613bf8565b515116612044847f000000000000000000000000430000000000000000000000000000000000000416809214613bad565b803b15611641578451630d0e30db60e41b81528881858134865af18015611623576120b8575b50908761146d939261207f8661143f8b613bf8565b03925af190811561162357906114bb918a9161209b57506134e0565b6120b29150853d87116104c8576104ba818361311a565b38610601565b976120c861146d949392996130b8565b9790919261206a565b5091346104005760806003193601126104005781359167ffffffffffffffff8084116121f357366023850112156121f35783820135946121108661313d565b9461211d8551968761311a565b86865260209660248888019160051b83010191368311611f5957906024899201905b8382106121e457505050506024359182116103f35750936121696121da9261050496369101613155565b6121d4612174612fee565b926121834260643510156140e6565b6121c26001600160a01b03918261219986613bf8565b51511692806121a787613bf8565b515116916121b487613bf8565b510151168861146287613bf8565b6121cb88613bf8565b51913390614dc3565b84614686565b519182918261307d565b8135815290820190820161213f565b8480fd5b5091346104005761221b9061220b366131fc565b96919695909392954211156140e6565b6001600160a01b03926122598461223189613bf8565b515116938561223f8a613bf8565b51511694611ebd6020968b8a6114628b8b61145885613bf8565b865193600019948581019081116115f3578461227683928b613c1b565b51015116948651986370a0823160e01b93848b52868b6024818785169b8c8b8301525afa9a8b156115e9578c9b61232f575b506122b39082614e6e565b80519182019182116115a55791856122d081969593602495613c1b565b510151168751968794859384528301525afa92831561159c575085926122ff5750506115699261156291614e15565b90809250813d8311612328575b612316818361311a565b81010312611f59575182611562611553565b503d61230c565b909a508681813d831161235d575b612347818361311a565b810103126123595751996122b36122a8565b8b80fd5b503d61233d565b610504846104f9612374366133a5565b9291909161492d565b8382346103f35760606003193601126103f35750610db161239c612fac565b6123a4612fc2565b6123ac61306e565b916137c8565b50346103f35760606003193601126103f357506123e0906123d1612fc2565b6123d9612fee565b9135613877565b825191825215156020820152f35b509134610400576124189061077761221b6124083661327b565b999495939892909691369161348a565b964211156140e6565b509182913461268e576124333661333f565b9c849296959a9893999794919d6001600160a01b039e8f98897f0000000000000000000000004300000000000000000000000000000000000004169c6124798e8d6135f9565b61249597610a0496509115610e49576000199030903390615171565b6124df8a6124a389886135f9565b928b519d8e809481936323b872dd60e01b8352878d339085016040919493929460608201956001600160a01b0380921683521660208201520152565b0394169360209e8f93865af1908115612684578b91612667575b50156126635790888a969594939260248251809d819363226bf2d160e21b8352308b8401525af1998a1561101e57908b9392918790889c612627575b5061254089876134fd565b5086851694168403612614579161035b6125609260249695941015614131565b8851928380926370a0823160e01b825230888301525afa90811561260a57869085926125d8575b5061259192614d28565b823b156105085785602483928388519687948593632e1a7d4d60e01b85528401525af19081156125cd57509184916117d993610b4f5750614c97565b8451903d90823e3d90fd5b8092508a8092503d8311612603575b6125f1818361311a565b81010312611f59575185612591612587565b503d6125e7565b87513d86823e3d90fd5b9a9161035b612560926024969594610354565b9b505090919250888a813d831161265c575b612643818361311a565b8101031261048957908a9291838b519b01519a38612535565b503d612639565b8980fd5b61267e91508c8d3d106104c8576104ba818361311a565b386124f9565b8a513d8d823e3d90fd5b5050fd5b50913461040057610120600319360112610400576126ae612fac565b926126b7612fc2565b926126c061306e565b9060e435956001600160a01b03908188168098036121f35760209285610850999361272d6127226024956126f9426101043510156140e6565b6127148d60c435908c60a4359160843591606435918761445f565b9e8f93829f929c838561372d565b9b8c80943390614dc3565b885196879586946335313c2160e11b8652850152165af19182156127a9578092612773575b50506105049151938493846040919493926060820195825260208201520152565b9091506020823d82116127a1575b8161278e6020938361311a565b810103126103f357505161050438612752565b3d9150612781565b8351903d90823e3d90fd5b508234610508578060031936011261050857610504906127e36127d5612fac565b6127dd612fc2565b906134fd565b91516001600160a01b039182168152911660208201529081906040820190565b508234610508576060600319360112610508576020906001600160a01b0361284261282c612fac565b612834612fc2565b61283c61306e565b9161372d565b915191168152f35b50809291346105085761285c366132ca565b93808a9b989d9a92949c99969c7f00000000000000000000000043000000000000000000000000000000000000046001600160a01b03169c61289f908e8c61372d565b90600014966020966128cf966128c895610a04946129099b612a44576000199030903390615171565b898761372d565b8b516323b872dd60e01b8152338882019081526001600160a01b039092166020830181905260408301959095529283918291606090910190565b038189865af1908115612a3a578691612a1c575b50156121f357889060248251809c819363226bf2d160e21b835230898401525af1988915612a12578490859a6129d9575b5082610ad9999a9288926001600160a01b0361296d8a612992986134fd565b50166001600160a01b03841614600014610fd55790610d71919b8c959b861015614131565b823b15610508578460248392838a519687948593632e1a7d4d60e01b85528401525af19081156129ce5750918391610db193610b4f5750614c97565b8651903d90823e3d90fd5b809a50898092503d8311612a0b575b6129f2818361311a565b81010312611f595788516020909901519861299261294e565b503d6129e8565b88513d86823e3d90fd5b612a34915060203d81116104c8576104ba818361311a565b3861291d565b8a513d88823e3d90fd5b8c906109fb565b8382346103f35760806003193601126103f35750610db1612a6a612fac565b612a72612fc2565b612a7a61306e565b9060643592613fab565b50823461050857610504906104f9612aad610777612aa13661327b565b9692909591369161348a565b916148a1565b5090346105085761016060031936011261050857612acf612fac565b612ad7612fc2565b9260443590612ae4613004565b60c43560e4358015158103611f5957610104359060ff821682036121f357612b34929161195391612b158b8a6135f9565b9015612b7b57600019915b846101443593610124359330903390615171565b612b3e86856135f9565b87516323b872dd60e01b8152338782019081526001600160a01b039283166020828101829052604083019790975292959082908190606001611235565b8791612b20565b50823461050857610504906104f9612b9f610777612aa13661327b565b91614ad1565b50823461050857610504906104f9612bbc366131fc565b93929092614ad1565b5091346104005760e060031936011261040057612be0612fee565b606435926001600160a01b0390818516809503610489576084359182151580930361188757612c0d613004565b90612c1c4260c43510156140e6565b85519386850185811067ffffffffffffffff821117612d1f57875260018552885b602080821015612c6e57885160209291612c56826130e2565b8c82528c818301528c8b830152828901015201612c3d565b50509194979690929783612c8186613bf8565b51911690526020612c9185613bf8565b51015284612c9e84613bf8565b510152612cac828735613c54565b948551906000198201918211612d0c5761050487876121da88886121d489612ce2602435612cda8c8a613c1b565b5110156145b0565b6121c281612cef85613bf8565b5151169180612cfd86613bf8565b5151169060206121b487613bf8565b80601189634e487b7160e01b6024945252fd5b60248a604187634e487b7160e01b835252fd5b5090346105085761010060031936011261050857612d4e612fac565b612d56612fc2565b92612d5f61306e565b90612d7a612d6b612fd8565b926102a04260e43510156140e6565b86516323b872dd60e01b8152338682019081526001600160a01b039283166020828101829052606435604084015293959390929182908190606001038187865af1908115611320578491612e62575b501561040057602488928486938551998a95869463226bf2d160e21b865216908401525af19485156112f65781948296612e28575b5090612e0b8392856134fd565b50905016911614600014611a195790611a0b608435831015614131565b87809297508196503d8311612e5b575b612e42818361311a565b810103126103f357835160209094015194612e0b612dfe565b503d612e38565b612e7a915060203d81116104c8576104ba818361311a565b38612dc9565b5091903461040057612e913661302e565b97929591939794909442111593612ea7856140e6565b6001600160a01b0398612edc8a7f000000000000000000000000430000000000000000000000000000000000000416966140e6565b612eeb6020610ebd88866135f9565b038189865af1908115612a3a578691612f8e575b50156121f357888591602482518094819363226bf2d160e21b8352308a8401525af1998a15612f84578591869b612f4a575b5092610ad9999a9288928561299296610f588b866134fd565b8a80929c508193503d8311612f7d575b612f64818361311a565b810103126121f357805160209091015199612992612f31565b503d612f5a565b89513d87823e3d90fd5b612fa6915060203d81116104c8576104ba818361311a565b38612eff565b600435906001600160a01b038216820361043057565b602435906001600160a01b038216820361043057565b60c435906001600160a01b038216820361043057565b604435906001600160a01b038216820361043057565b60a435906001600160a01b038216820361043057565b35906001600160a01b038216820361043057565b60031960c0910112610430576001600160a01b03600435818116810361043057916024359160443591606435916084359081168103610430579060a43590565b60443590811515820361043057565b6020908160408183019282815285518094520193019160005b8281106130a4575050505090565b835185529381019392810192600101613096565b67ffffffffffffffff81116130cc57604052565b634e487b7160e01b600052604160045260246000fd5b6060810190811067ffffffffffffffff8211176130cc57604052565b6020810190811067ffffffffffffffff8211176130cc57604052565b90601f601f19910116810190811067ffffffffffffffff8211176130cc57604052565b67ffffffffffffffff81116130cc5760051b60200190565b81601f820112156104305780359061316c8261313d565b9260409061317c8251958661311a565b8385526020918286019183606080970286010194818611610430578401925b8584106131ac575050505050505090565b8684830312610430578251906131c1826130e2565b6131ca8561301a565b82526131d786860161301a565b868301528385013590811515820361043057828792868b95015281520193019261319b565b60a06003198201126104305760043591602435916044359067ffffffffffffffff82116104305761322f91600401613155565b906064356001600160a01b0381168103610430579060843590565b9181601f840112156104305782359167ffffffffffffffff8311610430576020808501948460051b01011161043057565b60a06003198201126104305760043591602435916044359067ffffffffffffffff8211610430576132ae9160040161324a565b90916064356001600160a01b0381168103610430579060843590565b600319610160910112610430576001600160a01b0390600435828116810361043057916024358015158103610430579160443591606435916084359160a4359081168103610430579060c4359060e435801515810361043057906101043560ff81168103610430579061012435906101443590565b600319610140910112610430576001600160a01b03600435818116810361043057916024359160443591606435916084359081168103610430579060a4359060c4358015158103610430579060e43560ff81168103610430579061010435906101243590565b90608060031983011261043057600435916024359067ffffffffffffffff8211610430576133d591600401613155565b906044356001600160a01b0381168103610430579060643590565b90608060031983011261043057600435916024359067ffffffffffffffff8211610430576134209160040161324a565b90916044356001600160a01b0381168103610430579060643590565b60031960e0910112610430576001600160a01b0390600435828116810361043057916024358015158103610430579160443591606435916084359160a4359081168103610430579060c43590565b92916134958261313d565b916134a3604051938461311a565b829481845260208094019160051b810192831161043057905b8282106134c95750505050565b8380916134d58461301a565b8152019101906134bc565b156134e757565b634e487b7160e01b600052600160045260246000fd5b90916001600160a01b039182841683821681811461357057101561356b57925b9183161561352757565b606460405162461bcd60e51b815260206004820152601a60248201527f426173655631526f757465723a205a45524f5f414444524553530000000000006044820152fd5b61351d565b608460405162461bcd60e51b815260206004820152602160248201527f426173655631526f757465723a204944454e544943414c5f414444524553534560448201527f53000000000000000000000000000000000000000000000000000000000000006064820152fd5b9081602091031261043057516001600160a01b03811681036104305790565b90613603916134fd565b906040519060208201926bffffffffffffffffffffffff19809260601b16845260601b1660348201526000604882015260298152613640816130e2565b5190206040517f5c60da1b0000000000000000000000000000000000000000000000000000000081527f000000000000000000000000a19c51d91891d3df7c13ed22a2f89d328a82950f6020826004816001600160a01b0385165afa92831561372157605593604393600091613703575b506040519260388401526f5af43d82803e903d91602b57fd5bf3ff60248401526014830152733d602d80600a3d3981f3363d3d373d3d3d363d73825260588201526037600c8201206078820152012090565b61371b915060203d8111611d8b57611d7c818361311a565b386136b1565b6040513d6000823e3d90fd5b90613737916134fd565b916040519160208301936bffffffffffffffffffffffff19809260601b16855260601b166034830152151560f81b604882015260298152613640816130e2565b51906dffffffffffffffffffffffffffff8216820361043057565b90816060910312610430576137a681613777565b9160406137b560208401613777565b92015163ffffffff811681036104305790565b6004919260606137d885846134fd565b50946137ee6001600160a01b039384928661372d565b1660405194858092630240bc6b60e21b82525afa92831561372157600090819461383d575b5081906dffffffffffffffffffffffffffff809116941694169116146000146138395791565b9091565b829450613858915060603d811161111a5761110b818361311a565b5093613813565b90816020910312610430575180151581036104305790565b919061388382826134fd565b916040928351602093848201926bffffffffffffffffffffffff19809260601b16845260601b1660348201527f01000000000000000000000000000000000000000000000000000000000000006048820152602981526138e2816130e2565b5190207f000000000000000000000000a19c51d91891d3df7c13ed22a2f89d328a82950f956001600160a01b03968781169286517f5c60da1b0000000000000000000000000000000000000000000000000000000081528681600481885afa908115610e20579160559391604393600091613b90575b5089519260388401526f5af43d82803e903d91602b57fd5bf3ff60248401526014830152733d602d80600a3d3981f3363d3d373d3d3d363d73825260588201526037600c8201206078820152012096600097889787518363e5e31b1360e01b93848352169081600482015288816024818a5afa908115613b86578c91613b69575b50613ad7575b509060246139ee8893886135f9565b9189519485938492835216968760048301525afa908115610b5e57600091613aba575b50613a34575b5050505050808211600014613a2d575090600190565b9160009150565b84516378a051ad60e11b815260048101919091526001600160a01b039290921660248301529093508190849060449082905afa918215613ab05750600091613a84575b5090503880808080613a17565b82813d8311613aa9575b613a98818361311a565b810103126103f35750518038613a77565b503d613a8e565b513d6000823e3d90fd5b613ad19150853d87116104c8576104ba818361311a565b38613a11565b88516378a051ad60e11b8152600481018690526001600160a01b0388166024820152919a91908890829060449082905afa918215613b5e579081899493613b28575b50909a919250602490506139df565b9150919282813d8311613b57575b613b40818361311a565b810103126103f35750518691906139ee6024613b19565b503d613b36565b8951903d90823e3d90fd5b613b809150893d8b116104c8576104ba818361311a565b386139d9565b8a513d8e823e3d90fd5b613ba79150893d8b11611d8b57611d7c818361311a565b38613958565b15613bb457565b606460405162461bcd60e51b815260206004820152601a60248201527f426173655631526f757465723a20494e56414c49445f504154480000000000006044820152fd5b805115613c055760200190565b634e487b7160e01b600052603260045260246000fd5b8051821015613c055760209160051b010190565b6000198114613c3e5760010190565b634e487b7160e01b600052601160045260246000fd5b91906001613c658183511015613bad565b8151818101809111613c3e57613c7a8161313d565b601f19613c97604093613c8f8551948561311a565b80845261313d565b019360209436868401378196613cac83613bf8565b526001600160a01b03907f000000000000000000000000a19c51d91891d3df7c13ed22a2f89d328a82950f82166000865b613cec575b5050505050505050565b8251811015613e6657613d2184613d038386613c1b565b515116858a613d128588613c1b565b51015116886114628588613c1b565b8487519163e5e31b1360e01b8352169060049180838301526024918b818481895afa908115610bee57918c918c989796959493600091613e49575b50613d77575b50505050613d6f90613c2f565b909192613cdd565b8495969750613d89613dca958b613c1b565b519089613d96888b613c1b565b515116918c518097819482936378a051ad60e11b84528984019092916001600160a01b036020916040840195845216910152565b03915afa928315610b9b57600093613e1a575b5089840191828511613e0757505091613d6f91613dfd8a96959489613c1b565b5290388a81613d62565b601190634e487b7160e01b600052526000fd5b90928b82813d8311613e42575b613e31818361311a565b810103126103f35750519138613ddd565b503d613e27565b613e609150833d85116104c8576104ba818361311a565b38613d5c565b613ce2565b81810292918115918404141715613c3e57565b8115613e88570490565b634e487b7160e01b600052601260045260246000fd5b91908203918211613c3e57565b8015613f415781151580613f38575b15613ecf57613ecc92611c7691613e6b565b90565b608460405162461bcd60e51b8152602060048201526024808201527f426173655631526f757465723a20494e53554646494349454e545f4c4951554960448201527f44495459000000000000000000000000000000000000000000000000000000006064820152fd5b50821515613eba565b608460405162461bcd60e51b815260206004820152602160248201527f426173655631526f757465723a20494e53554646494349454e545f414d4f554e60448201527f54000000000000000000000000000000000000000000000000000000000000006064820152fd5b6040516306801cc360e41b81526001600160a01b0382811660048301528381166024830152841515604483015294959460209492939185816064817f000000000000000000000000a19c51d91891d3df7c13ed22a2f89d328a82950f86165afa908115613721576000916140c9575b50169283156140ba57849392600492614032926137c8565b949092604051928380927f18160ddd0000000000000000000000000000000000000000000000000000000082525afa92831561372157600093614087575b5050613ecc92611c7b83611c76611c769489613e6b565b8181949293943d83116140b3575b61409f818361311a565b810103126103f35750519082611c7b614070565b503d614095565b50505050509050600090600090565b6140e09150863d8811611d8b57611d7c818361311a565b3861401a565b156140ed57565b606460405162461bcd60e51b815260206004820152601560248201527f426173655631526f757465723a204558504952454400000000000000000000006044820152fd5b1561413857565b608460405162461bcd60e51b815260206004820152602360248201527f426173655631526f757465723a20494e53554646494349454e545f415f414d4f60448201527f554e5400000000000000000000000000000000000000000000000000000000006064820152fd5b156141a957565b608460405162461bcd60e51b815260206004820152602360248201527f426173655631526f757465723a20494e53554646494349454e545f425f414d4f60448201527f554e5400000000000000000000000000000000000000000000000000000000006064820152fd5b9491949390929381861061043057828510610430576001600160a01b0393847f000000000000000000000000a19c51d91891d3df7c13ed22a2f89d328a82950f16946040928351926306801cc360e41b845282821693846004820152838216988960248301526000998a60448401526020928381606481865afa9081156115e9579187809594928e948591614442575b5016156143ae575b505050506060906142c9836142c2600495876134fd565b50956135f9565b16865192838092630240bc6b60e21b82525afa9485156143a5575087908895614381575b506dffffffffffffffffffffffffffff80911694169650161460001461437b575b801580614373575b15614324575050505090915b565b61433384828897959697613eab565b9483861161434b5750505050613839908210156141a2565b8395506138399450906143629161436b9394613eab565b948511156134e0565b831015614131565b508315614316565b9261430e565b905061439c91945060603d811161111a5761110b818361311a565b509390386142ed565b513d89823e3d90fd5b8394506064908a9493945194859384927f82dfdce40000000000000000000000000000000000000000000000000000000084528c600485015260248401528160448401525af180156144385760049360609387936142c99361441a575b508195508394508c92506142ab565b8161443092903d10611d8b57611d7c818361311a565b50388061440b565b87513d8c823e3d90fd5b6144599150863d8811611d8b57611d7c818361311a565b386142a3565b919095929594939484871061043057838610610430576040516306801cc360e41b81526001600160a01b038481166004830152828116602483015283151560448301527f000000000000000000000000a19c51d91891d3df7c13ed22a2f89d328a82950f811694916020919082816064818a5afa90811561372157600091614593575b50161561450b575b506144f593506137c8565b9290801580614373571561432457505050509091565b6040517f82dfdce40000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152841660248201528415156044820152948190869060649082906000905af1948515613721576144f595614575575b506144ea565b8161458b92903d10611d8b57611d7c818361311a565b50388061456f565b6145aa9150833d8511611d8b57611d7c818361311a565b386144e2565b156145b757565b608460405162461bcd60e51b815260206004820152602860248201527f426173655631526f757465723a20494e53554646494349454e545f4f5554505560448201527f545f414d4f554e540000000000000000000000000000000000000000000000006064820152fd5b926001600160a01b03919594958452602092838501521660408301526080606083015283519384608084015260005b85811061467257505050601f19601f84600060a0809697860101520116010190565b81810183015184820160a001528201614650565b929160005b825181101561489a576001600160a01b03806146a78386613c1b565b5151166146c660209183836146bc878a613c1b565b51015116906134fd565b50906001840191828511613c3e576146de838a613c1b565b519084806146ec888b613c1b565b51511691161460001461489257600090915b87516000198101908111613c3e5786948987928710600014614885578261474d838261472d6147799686613c1b565b515116906040611462858a614742858a613c1b565b510151169287613c1b565b945b614767898361475e8287613c1b565b51511694613c1b565b510151168b6114626040998a92613c1b565b16845193614786856130fe565b60008552813b1561043057600080946147cd8851978896879586947f022c0d9f00000000000000000000000000000000000000000000000000000000865260048601614621565b03925af1801561487a57906148669493929161486b575b507f423c093a1f80c354c75d4f9e86fde37d7c9014453df9643f585a1b199d094e50614810848a613c1b565b51918361481d868a613c1b565b5151169361485e8261482f888c613c1b565b51015192519485526001600160a01b039095166020850152901515604084015286169233929081906060820190565b0390a3613c2f565b61468b565b614874906130b8565b386147e4565b82513d6000823e3d90fd5b6147799150828a9461474f565b6000916146fe565b5050509050565b916148ba9193926148b582964211156140e6565b613c54565b9283516000198101908111613c3e57613ecc93612cda6148da9287613c1b565b6149276001600160a01b0361491e816148f285613bf8565b515116918061490086613bf8565b51511690602061490f87613bf8565b51015116604061146287613bf8565b6121cb87613bf8565b83614686565b9190939261493d904211156140e6565b6000936001600160a01b038061495283613bf8565b51511690614984817f000000000000000000000000430000000000000000000000000000000000000416809314613bad565b61498e8334613c54565b9485516000198101908111614abd5790612cda6149ab9288613c1b565b6149b485613bf8565b5187833b156103f35760049160405192838092630d0e30db60e41b8252875af18015614ab257614a94575b50614a5091614a11826020936149f487613bf8565b5151169084614a0288613bf8565b51015116604061146288613bf8565b90614a1b87613bf8565b51918960405180968195829463a9059cbb60e01b845260048401602090939291936001600160a01b0360408201951681520152565b03925af1908115614a89579061492791613ecc95969791614a7157506134e0565b6120b2915060203d81116104c8576104ba818361311a565b6040513d88823e3d90fd5b91614a1160209298614aa8614a50956130b8565b98925050916149df565b6040513d8a823e3d90fd5b602489634e487b7160e01b81526011600452fd5b9093614adf904211156140e6565b60009082519260001993848101908111614c4357614b4182614b0e9260206001600160a01b0394859284613c1b565b51015116946148b5847f000000000000000000000000430000000000000000000000000000000000000416809714613bad565b968751868101908111614c2f5791614b64614b7a92612cda614b8296958c613c1b565b614b71816148f285613bf8565b6121cb8a613bf8565b309087614686565b8451838101908111614c1b57614b989086613c1b565b51813b15610400578291602483926040519485938492632e1a7d4d60e01b845260048401525af18015614c1057614c01575b508351918201918211614bed575090614be6613ecc9284613c1b565b5190614c97565b80634e487b7160e01b602492526011600452fd5b614c0a906130b8565b38614bca565b6040513d84823e3d90fd5b602483634e487b7160e01b81526011600452fd5b602486634e487b7160e01b81526011600452fd5b602484634e487b7160e01b81526011600452fd5b3d15614c92573d9067ffffffffffffffff82116130cc5760405191614c866020601f19601f840116018461311a565b82523d6000602084013e565b606090565b6000808093819382604051614cab816130fe565b525af1614cb6614c57565b5015614cbe57565b608460405162461bcd60e51b815260206004820152602360248201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960448201527f4c454400000000000000000000000000000000000000000000000000000000006064820152fd5b919091803b156104305760405163a9059cbb60e01b602082019081526001600160a01b039094166024820152604481019290925260009283928390614d7a81606481015b03601f19810183528261311a565b51925af1614d86614c57565b81614d94575b501561043057565b8051801592508215614da9575b505038614d8c565b614dbc925060208091830101910161385f565b3880614da1565b90929192813b15610430576040516323b872dd60e01b602082019081526001600160a01b039283166024830152949091166044820152606481019290925260009283928390614d7a8160848101614d6c565b9190614e219083613e9e565b918211614e2a57565b606460405162461bcd60e51b815260206004820152601360248201527f4d6174683a205375622d756e646572666c6f77000000000000000000000000006044820152fd5b916000925b805184101561516b576001600160a01b039384614e908284613c1b565b5151166020958087614ea28587613c1b565b5101511690614eb182846134fd565b5081614ebd8688613c1b565b5151169882614ee48183614ed18a8c613c1b565b510151169b60409c8d6114628b8d613c1b565b16908a5191630240bc6b60e21b8352606060049381818681865afa958615615160578791600093849861512e575b5050168814946dffffffffffffffffffffffffffff91908615615125575016915b8c51926370a0823160e01b84528285850152602493828186818d5afa90811561511a576000916150eb575b50614f7491614f6c91614e15565b978989613877565b5094156150e357600094925b8a5160001981019081116150cf578a10156150c65760018a0190818b116150b35750908a8e611462848a80614fb8614fd09887613c1b565b51511695614fc68387613c1b565b5101511693613c1b565b935b8c51614fdd816130fe565b60008152823b15610430576000946150248f92879351988997889687957f022c0d9f0000000000000000000000000000000000000000000000000000000087528601614621565b03925af18015610b9b579161509c96979899917f423c093a1f80c354c75d4f9e86fde37d7c9014453df9643f585a1b199d094e50936150a4575b5061485e8261506d888b613c1b565b51015192519485526001600160a01b039095166020850152901515604084015288169233929081906060820190565b929190614e73565b6150ad906130b8565b3861505e565b601186634e487b7160e01b600052526000fd5b50508a93614fd2565b50601185634e487b7160e01b600052526000fd5b600092614f80565b908382813d8311615113575b615101818361311a565b810103126103f3575051614f74614f5e565b503d6150f7565b8f513d6000823e3d90fd5b90501691614f33565b6151569298506dffffffffffffffffffffffffffff9450803d1061111a5761110b818361311a565b5096909238614f12565b8e513d6000823e3d90fd5b50915050565b959690939192966001600160a01b0380971695863b156104305760ff90604051947fd505accf0000000000000000000000000000000000000000000000000000000086526000998089166004880152871660248701528a6044870152606486015216608484015260a483015260c4820152848160e48183885af190816152dd575b506152d6576040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081526001600160a01b0392831660048201529116602482015290602090829060449082905afa9182156152ca5791615299575b50101561432257606460405162461bcd60e51b815260206004820152600e60248201527f5065726d6974206661696c7572650000000000000000000000000000000000006044820152fd5b90506020813d82116152c2575b816152b36020938361311a565b8101031261043057513861524e565b3d91506152a6565b604051903d90823e3d90fd5b5050505050565b6152e9909591956130b8565b93386151f2565b80519160001990818401938411613c3e5761530a8461313d565b90601f196153286040966153208851958661311a565b80855261313d565b0160005b8181106153b657505060005b8451848101908111613c3e578110156153ad576001600160a01b038061535e8388613c1b565b5116916001810192838211613c3e576153a79261537b858a613c1b565b5116895191615389836130e2565b825260208201526000898201526153a08287613c1b565b5284613c1b565b50615338565b50935091505090565b60209087516153c4816130e2565b600081528260008183015260008a83015282870101520161532c56fea164736f6c6343000813000a
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000004867664baafe5926b3ca338e96c88fb5a5feab30000000000000000000000000a19c51d91891d3df7c13ed22a2f89d328a82950f0000000000000000000000004300000000000000000000000000000000000004
-----Decoded View---------------
Arg [0] : _blastGovernor (address): 0x4867664BaAFE5926B3cA338e96c88fB5a5FeAb30
Arg [1] : _factory (address): 0xa19C51D91891D3DF7C13Ed22a2f89d328A82950f
Arg [2] : _wETH (address): 0x4300000000000000000000000000000000000004
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000004867664baafe5926b3ca338e96c88fb5a5feab30
Arg [1] : 000000000000000000000000a19c51d91891d3df7c13ed22a2f89d328a82950f
Arg [2] : 0000000000000000000000004300000000000000000000000000000000000004
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.