More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 28 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 19687503 | 298 days ago | IN | 0 ETH | 0.00172165 | ||||
Remove Liquidity | 12578148 | 1347 days ago | IN | 0 ETH | 0.00122841 | ||||
Remove Liquidity | 12576193 | 1347 days ago | IN | 0 ETH | 0.00134008 | ||||
Remove Liquidity | 12575852 | 1347 days ago | IN | 0 ETH | 0.00134008 | ||||
Remove Liquidity | 12573946 | 1347 days ago | IN | 0 ETH | 0.00347809 | ||||
Remove Liquidity | 12573440 | 1347 days ago | IN | 0 ETH | 0.00289417 | ||||
Remove Liquidity | 12569408 | 1348 days ago | IN | 0 ETH | 0.00424856 | ||||
Remove Liquidity | 12566890 | 1348 days ago | IN | 0 ETH | 0.0053107 | ||||
Get All Rewards | 12566063 | 1348 days ago | IN | 0 ETH | 0.00207354 | ||||
Get All Rewards | 12565159 | 1349 days ago | IN | 0 ETH | 0.00396891 | ||||
Remove Liquidity | 12564504 | 1349 days ago | IN | 0 ETH | 0.00823158 | ||||
Get All Rewards | 12533391 | 1354 days ago | IN | 0 ETH | 0.00251364 | ||||
Remove Liquidity | 12527925 | 1354 days ago | IN | 0 ETH | 0.00694065 | ||||
Remove Liquidity | 12512631 | 1357 days ago | IN | 0 ETH | 0.01001901 | ||||
Get All Rewards | 12405281 | 1373 days ago | IN | 0 ETH | 0.01364729 | ||||
Get All Rewards | 12403688 | 1374 days ago | IN | 0 ETH | 0.01539149 | ||||
Get All Rewards | 12355327 | 1381 days ago | IN | 0 ETH | 0.0049796 | ||||
Remove Liquidity | 12228073 | 1401 days ago | IN | 0 ETH | 0.03240179 | ||||
Remove Liquidity | 12225374 | 1401 days ago | IN | 0 ETH | 0.02719598 | ||||
Remove Liquidity | 12225368 | 1401 days ago | IN | 0 ETH | 0.03142214 | ||||
Get All Rewards | 12225366 | 1401 days ago | IN | 0 ETH | 0.01415408 | ||||
Get All Rewards | 12223549 | 1401 days ago | IN | 0 ETH | 0.00750801 | ||||
Remove Liquidity | 12191195 | 1406 days ago | IN | 0 ETH | 0.03903798 | ||||
Get All Rewards | 12133196 | 1415 days ago | IN | 0 ETH | 0.01283628 | ||||
Remove Liquidity | 12115085 | 1418 days ago | IN | 0 ETH | 0.03426025 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
11950485 | 1443 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
StakePool
Compiler Version
v0.7.6+commit.7338295f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-03-03 */ /** *Submitted for verification at Etherscan.io on 2021-02-03 */ // SPDX-License-Identifier: SEE LICENSE IN LICENSE pragma solidity >=0.7.6; pragma abicoder v2; interface IStakePoolCreator { function version() external returns (uint256); function create() external returns (address); function initialize( address poolAddress, address pair, address rewardToken, address timelock, address stakePoolRewardFund, bytes calldata data ) external; } interface IValueLiquidRouter { struct Swap { address pool; address tokenIn; address tokenOut; uint256 swapAmount; // tokenInAmount / tokenOutAmount uint256 limitReturnAmount; // minAmountOut / maxAmountIn uint256 maxPrice; bool isBPool; } function factory() external view returns (address); function controller() external view returns (address); function formula() external view returns (address); function WETH() external view returns (address); function addLiquidity( address pair, address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns ( uint256 amountA, uint256 amountB, uint256 liquidity ); function addLiquidityETH( address pair, address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable returns ( uint256 amountToken, uint256 amountETH, uint256 liquidity ); function swapExactTokensForTokens( address tokenIn, address tokenOut, uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline, uint8 flag ) external returns (uint256[] memory amounts); function swapTokensForExactTokens( address tokenIn, address tokenOut, uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline, uint8 flag ) external returns (uint256[] memory amounts); function swapExactETHForTokens( address tokenOut, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline, uint8 flag ) external payable returns (uint256[] memory amounts); function swapTokensForExactETH( address tokenIn, uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline, uint8 flag ) external returns (uint256[] memory amounts); function swapExactTokensForETH( address tokenIn, uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline, uint8 flag ) external returns (uint256[] memory amounts); function swapETHForExactTokens( address tokenOut, uint256 amountOut, address[] calldata path, address to, uint256 deadline, uint8 flag ) external payable returns (uint256[] memory amounts); function swapExactTokensForTokensSupportingFeeOnTransferTokens( address tokenIn, address tokenOut, uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline, uint8 flag ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( address tokenOut, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline, uint8 flag ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( address tokenIn, uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline, uint8 flag ) external; function addStakeLiquidity( address stakePool, address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, uint256 deadline ) external returns ( uint256 amountA, uint256 amountB, uint256 liquidity ); function addStakeLiquidityETH( address stakePool, address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, uint256 deadline ) external payable returns ( uint256 amountToken, uint256 amountETH, uint256 liquidity ); function multihopBatchSwapExactIn( Swap[][] memory swapSequences, address tokenIn, address tokenOut, uint256 totalAmountIn, uint256 minTotalAmountOut, uint256 deadline, uint8 flag ) external payable returns (uint256 totalAmountOut); function multihopBatchSwapExactOut( Swap[][] memory swapSequences, address tokenIn, address tokenOut, uint256 maxTotalAmountIn, uint256 deadline, uint8 flag ) external payable returns (uint256 totalAmountIn); function createPair( address tokenA, address tokenB, uint256 amountA, uint256 amountB, uint32 tokenWeightA, uint32 swapFee, address to, uint8 flag ) external returns (uint256 liquidity); function createPairETH( address token, uint256 amountToken, uint32 tokenWeight, uint32 swapFee, address to, uint8 flag ) external payable returns (uint256 liquidity); } interface IValueLiquidFactory { event PairCreated(address indexed token0, address indexed token1, address pair, uint32 tokenWeight0, uint32 swapFee, uint256); function feeTo() external view returns (address); function formula() external view returns (address); function protocolFee() external view returns (uint256); function feeToSetter() external view returns (address); function getPair( address tokenA, address tokenB, uint32 tokenWeightA, uint32 swapFee ) external view returns (address pair); function allPairs(uint256) external view returns (address pair); function isPair(address) external view returns (bool); function allPairsLength() external view returns (uint256); function createPair( address tokenA, address tokenB, uint32 tokenWeightA, uint32 swapFee ) external returns (address pair); function getWeightsAndSwapFee(address pair) external view returns ( uint32 tokenWeight0, uint32 tokenWeight1, uint32 swapFee ); function setFeeTo(address) external; function setFeeToSetter(address) external; function setProtocolFee(uint256) external; } // helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false library TransferHelper { function safeApprove( address token, address to, uint256 value ) internal { // bytes4(keccak256(bytes('approve(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), "TransferHelper: APPROVE_FAILED"); } function safeTransfer( address token, address to, uint256 value ) internal { // bytes4(keccak256(bytes('transfer(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), "TransferHelper: TRANSFER_FAILED"); } function safeTransferFrom( address token, address from, address to, uint256 value ) internal { // bytes4(keccak256(bytes('transferFrom(address,address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), "TransferHelper: TRANSFER_FROM_FAILED"); } function safeTransferETH(address to, uint256 value) internal { (bool success, ) = to.call{value: value}(new bytes(0)); require(success, "TransferHelper: ETH_TRANSFER_FAILED"); } } interface IValueLiquidPair { event Approval(address indexed owner, address indexed spender, uint256 value); event Transfer(address indexed from, address indexed to, uint256 value); function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address owner) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); function transfer(address to, uint256 value) external returns (bool); function transferFrom( address from, address to, uint256 value ) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint256); function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; event PaidProtocolFee(uint112 collectedFee0, uint112 collectedFee1); event Mint(address indexed sender, uint256 amount0, uint256 amount1); event Burn(address indexed sender, uint256 amount0, uint256 amount1, address indexed to); event Swap(address indexed sender, uint256 amount0In, uint256 amount1In, uint256 amount0Out, uint256 amount1Out, address indexed to); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint256); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns ( uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast ); function getCollectedFees() external view returns (uint112 _collectedFee0, uint112 _collectedFee1); function getTokenWeights() external view returns (uint32 tokenWeight0, uint32 tokenWeight1); function getSwapFee() external view returns (uint32); function price0CumulativeLast() external view returns (uint256); function price1CumulativeLast() external view returns (uint256); function mint(address to) external returns (uint256 liquidity); function burn(address to) external returns (uint256 amount0, uint256 amount1); function swap( uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data ) external; function skim(address to) external; function sync() external; function initialize( address, address, uint32, uint32 ) external; } // a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math) library SafeMath { function add(uint256 x, uint256 y) internal pure returns (uint256 z) { require((z = x + y) >= x, "ds-math-add-overflow"); } function sub(uint256 x, uint256 y) internal pure returns (uint256 z) { require((z = x - y) <= x, "ds-math-sub-underflow"); } function mul(uint256 x, uint256 y) internal pure returns (uint256 z) { require(y == 0 || (z = x * y) / y == x, "ds-math-mul-overflow"); } function div(uint256 a, uint256 b) internal pure returns (uint256 c) { require(b > 0, "ds-math-division-by-zero"); c = a / b; } } contract TimeLock { using SafeMath for uint256; event NewAdmin(address indexed newAdmin); event NewPendingAdmin(address indexed newPendingAdmin); event NewDelay(uint256 indexed newDelay); event CancelTransaction(bytes32 indexed txHash, address indexed target, uint256 value, string signature, bytes data, uint256 eta); event ExecuteTransaction(bytes32 indexed txHash, address indexed target, uint256 value, string signature, bytes data, uint256 eta); event QueueTransaction(bytes32 indexed txHash, address indexed target, uint256 value, string signature, bytes data, uint256 eta); uint256 public constant GRACE_PERIOD = 14 days; uint256 public constant MINIMUM_DELAY = 1 days; uint256 public constant MAXIMUM_DELAY = 30 days; bool private _initialized; address public admin; address public pendingAdmin; uint256 public delay; bool public admin_initialized; mapping(bytes32 => bool) public queuedTransactions; constructor() { admin_initialized = false; _initialized = false; } function initialize(address _admin, uint256 _delay) public { require(_initialized == false, "Timelock::constructor: Initialized must be false."); require(_delay >= MINIMUM_DELAY, "Timelock::setDelay: Delay must exceed minimum delay."); require(_delay <= MAXIMUM_DELAY, "Timelock::setDelay: Delay must not exceed maximum delay."); delay = _delay; admin = _admin; _initialized = true; emit NewAdmin(admin); emit NewDelay(delay); } receive() external payable {} function setDelay(uint256 _delay) public { require(msg.sender == address(this), "Timelock::setDelay: Call must come from Timelock."); require(_delay >= MINIMUM_DELAY, "Timelock::setDelay: Delay must exceed minimum delay."); require(_delay <= MAXIMUM_DELAY, "Timelock::setDelay: Delay must not exceed maximum delay."); delay = _delay; emit NewDelay(delay); } function acceptAdmin() public { require(msg.sender == pendingAdmin, "Timelock::acceptAdmin: Call must come from pendingAdmin."); admin = msg.sender; pendingAdmin = address(0); emit NewAdmin(admin); } function setPendingAdmin(address _pendingAdmin) public { // allows one time setting of admin for deployment purposes if (admin_initialized) { require(msg.sender == address(this), "Timelock::setPendingAdmin: Call must come from Timelock."); } else { require(msg.sender == admin, "Timelock::setPendingAdmin: First call must come from admin."); admin_initialized = true; } pendingAdmin = _pendingAdmin; emit NewPendingAdmin(pendingAdmin); } function queueTransaction( address target, uint256 value, string memory signature, bytes memory data, uint256 eta ) public returns (bytes32) { require(msg.sender == admin, "Timelock::queueTransaction: Call must come from admin."); require(eta >= getBlockTimestamp().add(delay), "Timelock::queueTransaction: Estimated execution block must satisfy delay."); bytes32 txHash = keccak256(abi.encode(target, value, signature, data, eta)); queuedTransactions[txHash] = true; emit QueueTransaction(txHash, target, value, signature, data, eta); return txHash; } function cancelTransaction( address target, uint256 value, string memory signature, bytes memory data, uint256 eta ) public { require(msg.sender == admin, "Timelock::cancelTransaction: Call must come from admin."); bytes32 txHash = keccak256(abi.encode(target, value, signature, data, eta)); queuedTransactions[txHash] = false; emit CancelTransaction(txHash, target, value, signature, data, eta); } function executeTransaction( address target, uint256 value, string memory signature, bytes memory data, uint256 eta ) public payable returns (bytes memory) { require(msg.sender == admin, "Timelock::executeTransaction: Call must come from admin."); bytes32 txHash = keccak256(abi.encode(target, value, signature, data, eta)); require(queuedTransactions[txHash], "Timelock::executeTransaction: Transaction hasn't been queued."); require(getBlockTimestamp() >= eta, "Timelock::executeTransaction: Transaction hasn't surpassed time lock."); require(getBlockTimestamp() <= eta.add(GRACE_PERIOD), "Timelock::executeTransaction: Transaction is stale."); queuedTransactions[txHash] = false; bytes memory callData; if (bytes(signature).length == 0) { callData = data; } else { callData = abi.encodePacked(bytes4(keccak256(bytes(signature))), data); } // solium-disable-next-line security/no-call-value (bool success, bytes memory returnData) = target.call{value: value}(callData); require(success, "Timelock::executeTransaction: Transaction execution reverted."); emit ExecuteTransaction(txHash, target, value, signature, data, eta); return returnData; } function getBlockTimestamp() internal view returns (uint256) { return block.timestamp; } } interface IStakePool { event Deposit(address indexed account, uint256 amount); event AddRewardPool(uint256 indexed poolId); event UpdateRewardPool(uint256 indexed poolId, uint256 endRewardBlock, uint256 rewardPerBlock); event PayRewardPool( uint256 indexed poolId, address indexed rewardToken, address indexed account, uint256 pendingReward, uint256 rebaseAmount, uint256 paidReward ); event UpdateRewardRebaser(uint256 indexed poolId, address rewardRebaser); event UpdateRewardMultiplier(uint256 indexed poolId, address rewardMultiplier); event Withdraw(address indexed account, uint256 amount); function version() external view returns (uint256); function pair() external view returns (address); function initialize( address _pair, uint256 _unstakingFrozenTime, address _rewardFund, address _timelock ) external; function stake(uint256) external; function stakeFor(address _account) external; function withdraw(uint256) external; function getReward(uint8 _pid, address _account) external; function getAllRewards(address _account) external; function claimReward() external; function pendingReward(uint8 _pid, address _account) external view returns (uint256); function allowRecoverRewardToken(address _token) external view returns (bool); function getRewardPerBlock(uint8 pid) external view returns (uint256); function rewardPoolInfoLength() external view returns (uint256); function unfrozenStakeTime(address _account) external view returns (uint256); function emergencyWithdraw() external; function updateReward() external; function updateReward(uint8 _pid) external; function updateRewardPool( uint8 _pid, uint256 _endRewardBlock, uint256 _rewardPerBlock ) external; function getRewardMultiplier( uint8 _pid, uint256 _from, uint256 _to, uint256 _rewardPerBlock ) external view returns (uint256); function getRewardRebase( uint8 _pid, address _rewardToken, uint256 _pendingReward ) external view returns (uint256); function updateRewardRebaser(uint8 _pid, address _rewardRebaser) external; function updateRewardMultiplier(uint8 _pid, address _rewardMultiplier) external; function getUserInfo(uint8 _pid, address _account) external view returns ( uint256 amount, uint256 rewardDebt, uint256 accumulatedEarned, uint256 lockReward, uint256 lockRewardReleased ); function addRewardPool( address _rewardToken, address _rewardRebaser, address _rewardMultiplier, uint256 _startBlock, uint256 _endRewardBlock, uint256 _rewardPerBlock, uint256 _lockRewardPercent, uint256 _startVestingBlock, uint256 _endVestingBlock ) external; function removeLiquidity( address provider, address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETH( address provider, address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountToken, uint256 amountETH); function removeLiquidityETHSupportingFeeOnTransferTokens( address provider, address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountETH); } interface IValueLiquidProvider { function factory() external view returns (address); function controller() external view returns (address); function formula() external view returns (address); function WETH() external view returns (address); function removeLiquidity( address pair, address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETH( address pair, address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountToken, uint256 amountETH); function removeLiquidityWithPermit( address pair, address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETHWithPermit( address pair, address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountToken, uint256 amountETH); function removeLiquidityETHSupportingFeeOnTransferTokens( address pair, address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address pair, address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountETH); function stake( address stakePool, uint256 amount, uint256 deadline ) external; function stakeWithPermit( address stakePool, uint256 amount, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external; } interface IStakePoolController { event MasterCreated(address indexed farm, address indexed pair, uint256 version, address timelock, address stakePoolRewardFund, uint256 totalStakePool); event SetWhitelistStakingFor(address indexed contractAddress, bool value); event SetWhitelistStakePool(address indexed contractAddress, int8 value); event SetStakePoolCreator(address indexed contractAddress, uint256 verion); event SetWhitelistRewardRebaser(address indexed contractAddress, bool value); event SetWhitelistRewardMultiplier(address indexed contractAddress, bool value); event SetStakePoolVerifier(address indexed contractAddress, bool value); event ChangeGovernance(address indexed governance); event SetFeeCollector(address indexed feeCollector); event SetFeeToken(address indexed token); event SetFeeAmount(uint256 indexed amount); function allStakePools(uint256) external view returns (address stakePool); function isStakePool(address contractAddress) external view returns (bool); function isStakePoolVerifier(address contractAddress) external view returns (bool); function isWhitelistStakingFor(address contractAddress) external view returns (bool); function isWhitelistStakePool(address contractAddress) external view returns (int8); function setStakePoolVerifier(address contractAddress, bool state) external; function setWhitelistStakingFor(address contractAddress, bool state) external; function setWhitelistStakePool(address contractAddress, int8 state) external; function addStakePoolCreator(address contractAddress) external; function isWhitelistRewardRebaser(address contractAddress) external view returns (bool); function isAllowEmergencyWithdrawStakePool(address _address) external view returns (bool); function setWhitelistRewardRebaser(address contractAddress, bool state) external; function isWhitelistRewardMultiplier(address contractAddress) external view returns (bool); function setAllowEmergencyWithdrawStakePool(address _address, bool state) external; function setWhitelistRewardMultiplier(address contractAddress, bool state) external; function setEnableWhitelistRewardRebaser(bool value) external; function setEnableWhitelistRewardMultiplier(bool value) external; function allStakePoolsLength() external view returns (uint256); function create( uint256 version, address pair, address rewardToken, uint256 rewardFundAmount, uint256 delayTimeLock, bytes calldata data, uint8 flag ) external returns (address); function createPair( uint256 version, address tokenA, address tokenB, uint32 tokenWeightA, uint32 swapFee, address rewardToken, uint256 rewardFundAmount, uint256 delayTimeLock, bytes calldata poolRewardInfo, uint8 flag ) external returns (address); function setGovernance(address) external; function setFeeCollector(address _address) external; function setFeeToken(address _token) external; function setFeeAmount(uint256 _token) external; } interface IStakePoolRewardRebaser { function getRebaseAmount(address rewardToken, uint256 baseAmount) external view returns (uint256); } interface IStakePoolRewardMultiplier { function getRewardMultiplier( uint256 _start, uint256 _end, uint256 _from, uint256 _to, uint256 _rewardPerBlock ) external view returns (uint256); } interface IERC20 { event Approval(address indexed owner, address indexed spender, uint256 value); event Transfer(address indexed from, address indexed to, uint256 value); function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address owner) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); function transfer(address to, uint256 value) external returns (bool); function transferFrom( address from, address to, uint256 value ) external returns (bool); } interface IStakePoolRewardFund { function initialize(address _stakePool, address _timelock) external; function safeTransfer( address _token, address _to, uint256 _value ) external; } // This implements BPool contract, and allows for generalized staking, yield farming, and token distribution. contract StakePool is IStakePool { using SafeMath for uint256; uint256 public override version; // Info of each user. struct UserInfo { uint256 amount; mapping(uint8 => uint256) rewardDebt; mapping(uint8 => uint256) reward; mapping(uint8 => uint256) accumulatedEarned; // will accumulate every time user harvest mapping(uint8 => uint256) lockReward; mapping(uint8 => uint256) lockRewardReleased; uint256 lastStakeTime; } // Info of each rewardPool funding. struct RewardPoolInfo { address rewardToken; // Address of rewardPool token contract. address rewardRebaser; // Address of rewardRebaser contract. address rewardMultiplier; // Address of rewardMultiplier contract. uint256 startRewardBlock; // Start reward block number that rewardPool distribution occurs. uint256 lastRewardBlock; // Last block number that rewardPool distribution occurs. uint256 endRewardBlock; // Block number which rewardPool distribution ends. uint256 rewardPerBlock; // Reward token amount to distribute per block. uint256 accRewardPerShare; // Accumulated rewardPool per share, times 1e18. uint256 lockRewardPercent; // Lock reward percent - 0 to disable lock & vesting uint256 startVestingBlock; // Block number which vesting starts. uint256 endVestingBlock; // Block number which vesting ends. uint256 numOfVestingBlocks; uint256 totalPaidRewards; } mapping(address => UserInfo) public userInfo; RewardPoolInfo[] public rewardPoolInfo; address public override pair; address public rewardFund; address public timelock; address public controller; uint256 public balance; uint256 public unstakingFrozenTime = 3 days; uint256 private unlocked = 1; bool private _initialized = false; uint256 public constant BLOCKS_PER_DAY = 6528; constructor(address _controller, uint256 _version) { controller = _controller; timelock = msg.sender; version = _version; } modifier lock() { require(unlocked == 1, "StakePool: LOCKED"); unlocked = 0; _; unlocked = 1; } modifier onlyTimeLock() { require(msg.sender == timelock, "StakePool: !timelock"); _; } function allowRecoverRewardToken(address _token) external view override returns (bool) { for (uint8 pid = 0; pid < rewardPoolInfo.length; ++pid) { RewardPoolInfo storage rewardPool = rewardPoolInfo[pid]; if (rewardPool.rewardToken == _token) { // do not allow to drain reward token if less than 30 days after pool ends if (block.number < (rewardPool.endRewardBlock + (BLOCKS_PER_DAY * 30))) { return false; } } } return true; } // called once by the factory at time of deployment function initialize( address _pair, uint256 _unstakingFrozenTime, address _rewardFund, address _timelock ) external override { require(_initialized == false, "StakePool: Initialize must be false."); require(unstakingFrozenTime <= 30 days, "StakePool: unstakingFrozenTime > 30 days"); pair = _pair; unstakingFrozenTime = _unstakingFrozenTime; rewardFund = _rewardFund; timelock = _timelock; _initialized = true; } function addRewardPool( address _rewardToken, address _rewardRebaser, address _rewardMultiplier, uint256 _startBlock, uint256 _endRewardBlock, uint256 _rewardPerBlock, uint256 _lockRewardPercent, uint256 _startVestingBlock, uint256 _endVestingBlock ) external override lock onlyTimeLock { require(rewardPoolInfo.length <= 16, "StakePool: Reward pool length > 16"); require(IStakePoolController(controller).isWhitelistRewardRebaser(_rewardRebaser), "StakePool: Invalid reward rebaser"); require(IStakePoolController(controller).isWhitelistRewardMultiplier(_rewardMultiplier), "StakePool: Invalid reward multiplier"); require(_startVestingBlock <= _endVestingBlock, "StakePool: startVestingBlock > endVestingBlock"); _startBlock = (block.number > _startBlock) ? block.number : _startBlock; require(_startBlock < _endRewardBlock, "StakePool: startBlock >= endRewardBlock"); require(_lockRewardPercent <= 100, "StakePool: invalid lockRewardPercent"); updateReward(); rewardPoolInfo.push( RewardPoolInfo({ rewardToken: _rewardToken, rewardRebaser: _rewardRebaser, startRewardBlock: _startBlock, rewardMultiplier: _rewardMultiplier, lastRewardBlock: _startBlock, endRewardBlock: _endRewardBlock, rewardPerBlock: _rewardPerBlock, accRewardPerShare: 0, lockRewardPercent: _lockRewardPercent, startVestingBlock: _startVestingBlock, endVestingBlock: _endVestingBlock, numOfVestingBlocks: _endVestingBlock - _startVestingBlock, totalPaidRewards: 0 }) ); emit AddRewardPool(rewardPoolInfo.length - 1); } function updateRewardMultiplier(uint8 _pid, address _rewardMultiplier) external override lock onlyTimeLock { require(IStakePoolController(controller).isWhitelistRewardMultiplier(_rewardMultiplier), "StakePool: Invalid reward multiplier"); updateReward(_pid); RewardPoolInfo storage rewardPool = rewardPoolInfo[_pid]; rewardPool.rewardMultiplier = _rewardMultiplier; emit UpdateRewardMultiplier(_pid, _rewardMultiplier); } function updateRewardRebaser(uint8 _pid, address _rewardRebaser) external override lock onlyTimeLock { require(IStakePoolController(controller).isWhitelistRewardRebaser(_rewardRebaser), "StakePool: Invalid reward rebaser"); updateReward(_pid); RewardPoolInfo storage rewardPool = rewardPoolInfo[_pid]; rewardPool.rewardRebaser = _rewardRebaser; emit UpdateRewardRebaser(_pid, _rewardRebaser); } // Return reward multiplier over the given _from to _to block. function getRewardMultiplier( uint8 _pid, uint256 _from, uint256 _to, uint256 _rewardPerBlock ) public view override returns (uint256) { RewardPoolInfo storage rewardPool = rewardPoolInfo[_pid]; address rewardMultiplier = rewardPool.rewardMultiplier; if (rewardMultiplier == address(0)) { return _to.sub(_from).mul(_rewardPerBlock); } return IStakePoolRewardMultiplier(rewardMultiplier).getRewardMultiplier( rewardPool.startRewardBlock, rewardPool.endRewardBlock, _from, _to, _rewardPerBlock ); } function getRewardRebase( uint8 _pid, address _rewardToken, uint256 _pendingReward ) public view override returns (uint256) { RewardPoolInfo storage rewardPool = rewardPoolInfo[_pid]; address rewardRebaser = rewardPool.rewardRebaser; if (rewardRebaser == address(0)) { return _pendingReward; } return IStakePoolRewardRebaser(rewardRebaser).getRebaseAmount(_rewardToken, _pendingReward); } function getRewardPerBlock(uint8 pid) external view override returns (uint256) { RewardPoolInfo storage rewardPool = rewardPoolInfo[pid]; uint256 rewardPerBlock = rewardPool.rewardPerBlock; if (block.number < rewardPool.startRewardBlock || block.number > rewardPool.endRewardBlock) return 0; uint256 reward = getRewardMultiplier(pid, block.number, block.number + 1, rewardPerBlock); return getRewardRebase(pid, rewardPool.rewardToken, reward); } function updateRewardPool( uint8 _pid, uint256 _endRewardBlock, uint256 _rewardPerBlock ) external override lock onlyTimeLock { RewardPoolInfo storage rewardPool = rewardPoolInfo[_pid]; require(block.number <= rewardPool.endRewardBlock && block.number <= _endRewardBlock, "StakePool: blockNumber > endRewardBlock"); updateReward(_pid); rewardPool.endRewardBlock = _endRewardBlock; rewardPool.rewardPerBlock = _rewardPerBlock; emit UpdateRewardPool(_pid, _endRewardBlock, _rewardPerBlock); } function stake(uint256 _amount) external override lock { IValueLiquidPair(pair).transferFrom(msg.sender, address(this), _amount); _stakeFor(msg.sender); } function stakeFor(address _account) external override lock { require(IStakePoolController(controller).isWhitelistStakingFor(msg.sender), "StakePool: Invalid sender"); _stakeFor(_account); } function _stakeFor(address _account) internal { uint256 _amount = IValueLiquidPair(pair).balanceOf(address(this)).sub(balance); require(_amount > 0, "StakePool: Invalid balance"); balance = balance.add(_amount); UserInfo storage user = userInfo[_account]; getAllRewards(_account); user.amount = user.amount.add(_amount); uint8 rewardPoolLength = uint8(rewardPoolInfo.length); for (uint8 _pid = 0; _pid < rewardPoolLength; ++_pid) { user.rewardDebt[_pid] = user.amount.mul(rewardPoolInfo[_pid].accRewardPerShare).div(1e18); } user.lastStakeTime = block.timestamp; emit Deposit(_account, _amount); } function rewardPoolInfoLength() public view override returns (uint256) { return rewardPoolInfo.length; } function unfrozenStakeTime(address _account) public view override returns (uint256) { return userInfo[_account].lastStakeTime + unstakingFrozenTime; } function removeStakeInternal(uint256 _amount) internal { UserInfo storage user = userInfo[msg.sender]; require(user.amount >= _amount, "StakePool: invalid withdraw amount"); require(block.timestamp >= user.lastStakeTime.add(unstakingFrozenTime), "StakePool: frozen"); getAllRewards(msg.sender); balance = balance.sub(_amount); user.amount = user.amount.sub(_amount); uint8 rewardPoolLength = uint8(rewardPoolInfo.length); for (uint8 _pid = 0; _pid < rewardPoolLength; ++_pid) { user.rewardDebt[_pid] = user.amount.mul(rewardPoolInfo[_pid].accRewardPerShare).div(1e18); } } function withdraw(uint256 _amount) external override lock { removeStakeInternal(_amount); IValueLiquidPair(pair).transfer(msg.sender, _amount); emit Withdraw(msg.sender, _amount); } function getAllRewards(address _account) public override { uint8 rewardPoolLength = uint8(rewardPoolInfo.length); for (uint8 _pid = 0; _pid < rewardPoolLength; ++_pid) { getReward(_pid, _account); } } function claimReward() external override { getAllRewards(msg.sender); } function getReward(uint8 _pid, address _account) public override { updateReward(_pid); UserInfo storage user = userInfo[_account]; RewardPoolInfo storage rewardPool = rewardPoolInfo[_pid]; uint256 _accRewardPerShare = rewardPool.accRewardPerShare; uint256 _pendingReward = user.amount.mul(_accRewardPerShare).div(1e18).sub(user.rewardDebt[_pid]); uint256 _lockRewardPercent = rewardPool.lockRewardPercent; if (_lockRewardPercent > 0) { if (block.number > rewardPool.endVestingBlock) { uint256 _unlockReward = user.lockReward[_pid].sub(user.lockRewardReleased[_pid]); if (_unlockReward > 0) { _pendingReward = _pendingReward.add(_unlockReward); user.lockRewardReleased[_pid] = user.lockRewardReleased[_pid].add(_unlockReward); } } else { if (_pendingReward > 0) { uint256 _toLocked = _pendingReward.mul(_lockRewardPercent).div(100); _pendingReward = _pendingReward.sub(_toLocked); user.lockReward[_pid] = user.lockReward[_pid].add(_toLocked); } uint256 _startVestingBlock = rewardPool.startVestingBlock; if (block.number > _startVestingBlock) { uint256 _toReleased = user.lockReward[_pid].mul(block.number.sub(_startVestingBlock)).div(rewardPool.numOfVestingBlocks); uint256 _lockRewardReleased = user.lockRewardReleased[_pid]; if (_toReleased > _lockRewardReleased) { uint256 _unlockReward = _toReleased.sub(_lockRewardReleased); user.lockRewardReleased[_pid] = _lockRewardReleased.add(_unlockReward); _pendingReward = _pendingReward.add(_unlockReward); } } } } if (_pendingReward > 0) { user.accumulatedEarned[_pid] = user.accumulatedEarned[_pid].add(_pendingReward); rewardPool.totalPaidRewards = rewardPool.totalPaidRewards.add(_pendingReward); user.rewardDebt[_pid] = user.amount.mul(_accRewardPerShare).div(1e18); uint256 reward = user.reward[_pid].add(_pendingReward); user.reward[_pid] = reward; // Safe reward transfer, just in case if rounding error causes pool to not have enough reward amount address rewardToken = rewardPool.rewardToken; uint256 rewardBalance = IERC20(rewardToken).balanceOf(rewardFund); if (rewardBalance > 0) { user.reward[_pid] = 0; uint256 rebaseAmount = getRewardRebase(_pid, rewardToken, reward); uint256 paidAmount = rebaseAmount > rewardBalance ? rewardBalance : rebaseAmount; IStakePoolRewardFund(rewardFund).safeTransfer(rewardToken, _account, paidAmount); emit PayRewardPool(_pid, rewardToken, _account, reward, rebaseAmount, paidAmount); } } } function pendingReward(uint8 _pid, address _account) external view override returns (uint256) { UserInfo storage user = userInfo[_account]; RewardPoolInfo storage rewardPool = rewardPoolInfo[_pid]; uint256 _accRewardPerShare = rewardPool.accRewardPerShare; uint256 lpSupply = IValueLiquidPair(pair).balanceOf(address(this)); uint256 _endRewardBlock = rewardPool.endRewardBlock; uint256 _endRewardBlockApplicable = block.number > _endRewardBlock ? _endRewardBlock : block.number; uint256 _lastRewardBlock = rewardPool.lastRewardBlock; if (_endRewardBlockApplicable > _lastRewardBlock && lpSupply != 0) { uint256 _incRewardPerShare = getRewardMultiplier(_pid, _lastRewardBlock, _endRewardBlockApplicable, rewardPool.rewardPerBlock).mul(1e18).div(lpSupply); _accRewardPerShare = _accRewardPerShare.add(_incRewardPerShare); } uint256 pending = user.amount.mul(_accRewardPerShare).div(1e18).add(user.reward[_pid]).sub(user.rewardDebt[_pid]); return getRewardRebase(_pid, rewardPool.rewardToken, pending); } // Withdraw without caring about rewards. EMERGENCY ONLY. function emergencyWithdraw() external override lock { require(IStakePoolController(controller).isAllowEmergencyWithdrawStakePool(address(this)), "StakePool: Not allow emergencyWithdraw"); UserInfo storage user = userInfo[msg.sender]; uint256 amount = user.amount; balance = balance.sub(amount); user.amount = 0; IValueLiquidPair(pair).transfer(msg.sender, amount); uint8 rewardPoolLength = uint8(rewardPoolInfo.length); for (uint8 _pid = 0; _pid < rewardPoolLength; ++_pid) { user.rewardDebt[_pid] = 0; user.reward[_pid] = 0; } } function getUserInfo(uint8 _pid, address _account) public view override returns ( uint256 amount, uint256 rewardDebt, uint256 accumulatedEarned, uint256 lockReward, uint256 lockRewardReleased ) { UserInfo storage user = userInfo[_account]; amount = user.amount; rewardDebt = user.rewardDebt[_pid]; accumulatedEarned = user.accumulatedEarned[_pid]; lockReward = user.lockReward[_pid]; lockRewardReleased = user.lockRewardReleased[_pid]; } function updateReward() public override { uint8 rewardPoolLength = uint8(rewardPoolInfo.length); for (uint8 _pid = 0; _pid < rewardPoolLength; ++_pid) { updateReward(_pid); } } function updateReward(uint8 _pid) public override { RewardPoolInfo storage rewardPool = rewardPoolInfo[_pid]; uint256 _endRewardBlock = rewardPool.endRewardBlock; uint256 _endRewardBlockApplicable = block.number > _endRewardBlock ? _endRewardBlock : block.number; uint256 _lastRewardBlock = rewardPool.lastRewardBlock; if (_endRewardBlockApplicable > _lastRewardBlock) { uint256 lpSupply = IValueLiquidPair(pair).balanceOf(address(this)); if (lpSupply > 0) { uint256 _incRewardPerShare = getRewardMultiplier(_pid, _lastRewardBlock, _endRewardBlockApplicable, rewardPool.rewardPerBlock).mul(1e18).div(lpSupply); rewardPool.accRewardPerShare = rewardPool.accRewardPerShare.add(_incRewardPerShare); } rewardPool.lastRewardBlock = _endRewardBlockApplicable; } } function removeLiquidity( address provider, address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) public override lock returns (uint256 amountA, uint256 amountB) { require(IStakePoolController(controller).isWhitelistStakingFor(provider), "StakePool: Invalid provider"); removeStakeInternal(liquidity); IValueLiquidPair(pair).approve(provider, liquidity); emit Withdraw(msg.sender, liquidity); (amountA, amountB) = IValueLiquidProvider(provider).removeLiquidity(address(pair), tokenA, tokenB, liquidity, amountAMin, amountBMin, to, deadline); } function removeLiquidityETH( address provider, address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external override lock returns (uint256 amountToken, uint256 amountETH) { require(IStakePoolController(controller).isWhitelistStakingFor(provider), "StakePool: Invalid provider"); removeStakeInternal(liquidity); IValueLiquidPair(pair).approve(provider, liquidity); emit Withdraw(msg.sender, liquidity); (amountToken, amountETH) = IValueLiquidProvider(provider).removeLiquidityETH( address(pair), token, liquidity, amountTokenMin, amountETHMin, to, deadline ); } function removeLiquidityETHSupportingFeeOnTransferTokens( address provider, address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external override lock returns (uint256 amountETH) { require(IStakePoolController(controller).isWhitelistStakingFor(provider), "StakePool: Invalid provider"); removeStakeInternal(liquidity); IValueLiquidPair(pair).approve(provider, liquidity); emit Withdraw(msg.sender, liquidity); amountETH = IValueLiquidProvider(provider).removeLiquidityETHSupportingFeeOnTransferTokens( address(pair), token, liquidity, amountTokenMin, amountETHMin, to, deadline ); } } contract StakePoolCreator is IStakePoolCreator { uint256 public override version = 3001; struct PoolRewardInfo { address rewardRebaser; address rewardMultiplier; uint256 startBlock; uint256 endRewardBlock; uint256 rewardPerBlock; uint256 lockRewardPercent; uint256 startVestingBlock; uint256 endVestingBlock; uint256 unstakingFrozenTime; } function create() external override returns (address) { StakePool pool = new StakePool(msg.sender, version); return address(pool); } function initialize( address poolAddress, address pair, address rewardToken, address timelock, address stakePoolRewardFund, bytes calldata data ) external override { StakePool pool = StakePool(poolAddress); PoolRewardInfo memory poolRewardInfo = abi.decode(data, (PoolRewardInfo)); pool.addRewardPool( rewardToken, poolRewardInfo.rewardRebaser, poolRewardInfo.rewardMultiplier, poolRewardInfo.startBlock, poolRewardInfo.endRewardBlock, poolRewardInfo.rewardPerBlock, poolRewardInfo.lockRewardPercent, poolRewardInfo.startVestingBlock, poolRewardInfo.endVestingBlock ); pool.initialize(pair, poolRewardInfo.unstakingFrozenTime, address(stakePoolRewardFund), address(timelock)); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_controller","type":"address"},{"internalType":"uint256","name":"_version","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"AddRewardPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"poolId","type":"uint256"},{"indexed":true,"internalType":"address","name":"rewardToken","type":"address"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"pendingReward","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rebaseAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"paidReward","type":"uint256"}],"name":"PayRewardPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"poolId","type":"uint256"},{"indexed":false,"internalType":"address","name":"rewardMultiplier","type":"address"}],"name":"UpdateRewardMultiplier","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"poolId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endRewardBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardPerBlock","type":"uint256"}],"name":"UpdateRewardPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"poolId","type":"uint256"},{"indexed":false,"internalType":"address","name":"rewardRebaser","type":"address"}],"name":"UpdateRewardRebaser","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"BLOCKS_PER_DAY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardToken","type":"address"},{"internalType":"address","name":"_rewardRebaser","type":"address"},{"internalType":"address","name":"_rewardMultiplier","type":"address"},{"internalType":"uint256","name":"_startBlock","type":"uint256"},{"internalType":"uint256","name":"_endRewardBlock","type":"uint256"},{"internalType":"uint256","name":"_rewardPerBlock","type":"uint256"},{"internalType":"uint256","name":"_lockRewardPercent","type":"uint256"},{"internalType":"uint256","name":"_startVestingBlock","type":"uint256"},{"internalType":"uint256","name":"_endVestingBlock","type":"uint256"}],"name":"addRewardPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"allowRecoverRewardToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"controller","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"getAllRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_pid","type":"uint8"},{"internalType":"address","name":"_account","type":"address"}],"name":"getReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_pid","type":"uint8"},{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"_to","type":"uint256"},{"internalType":"uint256","name":"_rewardPerBlock","type":"uint256"}],"name":"getRewardMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"pid","type":"uint8"}],"name":"getRewardPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_pid","type":"uint8"},{"internalType":"address","name":"_rewardToken","type":"address"},{"internalType":"uint256","name":"_pendingReward","type":"uint256"}],"name":"getRewardRebase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_pid","type":"uint8"},{"internalType":"address","name":"_account","type":"address"}],"name":"getUserInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"},{"internalType":"uint256","name":"accumulatedEarned","type":"uint256"},{"internalType":"uint256","name":"lockReward","type":"uint256"},{"internalType":"uint256","name":"lockRewardReleased","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_pair","type":"address"},{"internalType":"uint256","name":"_unstakingFrozenTime","type":"uint256"},{"internalType":"address","name":"_rewardFund","type":"address"},{"internalType":"address","name":"_timelock","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_pid","type":"uint8"},{"internalType":"address","name":"_account","type":"address"}],"name":"pendingReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"provider","type":"address"},{"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":"provider","type":"address"},{"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":"provider","type":"address"},{"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":[],"name":"rewardFund","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardPoolInfo","outputs":[{"internalType":"address","name":"rewardToken","type":"address"},{"internalType":"address","name":"rewardRebaser","type":"address"},{"internalType":"address","name":"rewardMultiplier","type":"address"},{"internalType":"uint256","name":"startRewardBlock","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"endRewardBlock","type":"uint256"},{"internalType":"uint256","name":"rewardPerBlock","type":"uint256"},{"internalType":"uint256","name":"accRewardPerShare","type":"uint256"},{"internalType":"uint256","name":"lockRewardPercent","type":"uint256"},{"internalType":"uint256","name":"startVestingBlock","type":"uint256"},{"internalType":"uint256","name":"endVestingBlock","type":"uint256"},{"internalType":"uint256","name":"numOfVestingBlocks","type":"uint256"},{"internalType":"uint256","name":"totalPaidRewards","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPoolInfoLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"stakeFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"timelock","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"unfrozenStakeTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unstakingFrozenTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_pid","type":"uint8"}],"name":"updateReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updateReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_pid","type":"uint8"},{"internalType":"address","name":"_rewardMultiplier","type":"address"}],"name":"updateRewardMultiplier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_pid","type":"uint8"},{"internalType":"uint256","name":"_endRewardBlock","type":"uint256"},{"internalType":"uint256","name":"_rewardPerBlock","type":"uint256"}],"name":"updateRewardPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_pid","type":"uint8"},{"internalType":"address","name":"_rewardRebaser","type":"address"}],"name":"updateRewardRebaser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"lastStakeTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526203f4806008556001600955600a805460ff191690553480156200002757600080fd5b5060405162003d8038038062003d808339810160408190526200004a916200007d565b600680546001600160a01b039093166001600160a01b0319938416179055600580549092163317909155600055620000b7565b6000806040838503121562000090578182fd5b82516001600160a01b0381168114620000a7578283fd5b6020939093015192949293505050565b613cb980620000c76000396000f3fe608060405234801561001057600080fd5b50600436106102415760003560e01c806385cc179e11610145578063c0eac9ea116100bd578063e2589d381161008c578063efe2226611610071578063efe22266146104ad578063f36c0a72146104b5578063f77c4791146104bd57610241565b8063e2589d3814610487578063ebb5d2e91461049a57610241565b8063c0eac9ea14610451578063d33219b414610464578063db2e21bc1461046c578063e1f4a7841461047457610241565b8063b56b681d11610114578063b88a802f116100f9578063b88a802f14610423578063be6153351461042b578063c012c42e1461043e57610241565b8063b56b681d14610408578063b69ef8a81461041b57610241565b806385cc179e146103ba57806393ae1d1f146103cd578063a694fc3a146103e0578063a8aa1b31146103f357610241565b80634bf69206116101d85780636bb987fe116101a757806372aa0a601161018c57806372aa0a601461036857806376d743fe146103945780638583f6a5146103a757610241565b80636bb987fe1461034d5780636d3c6d921461035557610241565b80634bf692061461030c57806354fd4d501461031f578063597293f31461032757806360d470881461033a57610241565b80633468a5b8116102145780633468a5b8146102be578063358394d8146102de578063362a3fad146102f1578063437686491461030457610241565b806317837baa146102465780631959a0021461026457806329d79588146102855780632e1a7d4d146102a9575b600080fd5b61024e6104c5565b60405161025b9190613c33565b60405180910390f35b610277610272366004613146565b6104cb565b60405161025b929190613c3c565b610298610293366004613396565b6104e4565b60405161025b959493929190613c60565b6102bc6102b7366004613329565b610544565b005b6102d16102cc366004613146565b610698565b60405161025b9190613603565b6102bc6102ec3660046132bd565b610720565b6102bc6102ff366004613146565b610831565b61024e61085c565b6102bc61031a366004613146565b610862565b61024e610990565b61024e6103353660046133c8565b610996565b61024e610348366004613146565b610a96565b61024e610ac8565b6102bc610363366004613396565b610ace565b61037b610376366004613329565b610fa3565b60405161025b9d9c9b9a9998979695949392919061353b565b6102bc6103a2366004613403565b611036565b6102bc6103b5366004613396565b611195565b6102bc6103c836600461337c565b6113ba565b61024e6103db36600461337c565b611506565b6102bc6103ee366004613329565b611598565b6103fb61168f565b60405161025b919061346d565b610277610416366004613254565b6116ab565b61024e611997565b6102bc61199d565b61024e610439366004613396565b6119a8565b61024e61044c366004613435565b611b8b565b6102bc61045f3660046131da565b611ca3565b6103fb61223f565b6102bc61225b565b610277610482366004613160565b612495565b6102bc610495366004613396565b612784565b61024e6104a8366004613254565b612997565b6103fb612c7f565b6102bc612c9b565b6103fb612cc4565b60085481565b6001602052600090815260409020805460069091015482565b73ffffffffffffffffffffffffffffffffffffffff166000908152600160208181526040808420805460ff909616855292830182528084205460038401835281852054600485018452828620546005909501909352932054939492939092565b600954600114610589576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058090613895565b60405180910390fd5b600060095561059781612ce0565b6003546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063a9059cbb906105ef90339085906004016134bf565b602060405180830381600087803b15801561060957600080fd5b505af115801561061d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106419190613309565b503373ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364826040516106889190613c33565b60405180910390a2506001600955565b6000805b60025460ff8216101561071557600060028260ff16815481106106bb57fe5b60009182526020909120600d90910201805490915073ffffffffffffffffffffffffffffffffffffffff8581169116141561070c5760058101546202fd000143101561070c5760009250505061071b565b5060010161069c565b50600190505b919050565b600a5460ff161561075d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610580906136a2565b62278d00600854111561079c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105809061376d565b6003805473ffffffffffffffffffffffffffffffffffffffff9586167fffffffffffffffffffffffff000000000000000000000000000000000000000091821617909155600893909355600480549285169284169290921790915560058054919093169116179055600a80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60025460005b8160ff168160ff1610156108575761084f8184610ace565b600101610837565b505050565b60025490565b60095460011461089e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058090613895565b60006009556006546040517f393a748400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063393a7484906108f990339060040161346d565b60206040518083038186803b15801561091157600080fd5b505afa158015610925573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109499190613309565b61097f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610580906137ca565b61098881612e10565b506001600955565b60005481565b60008060028560ff16815481106109a957fe5b60009182526020909120600d90910201600181015490915073ffffffffffffffffffffffffffffffffffffffff16806109e6578392505050610a8f565b6040517f2e81056600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821690632e81056690610a3a90889088906004016134bf565b60206040518083038186803b158015610a5257600080fd5b505afa158015610a66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a8a9190613341565b925050505b9392505050565b60085473ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604090206006015401919050565b61198081565b610ad7826113ba565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604081206002805491929160ff8616908110610b1057fe5b600091825260208083206007600d909302019182015460ff881684526001860190915260408320548554929450909291610b699190610b6390670de0b6b3a764000090610b5d9087612ffa565b9061304b565b90613097565b60088401549091508015610cfb5783600a0154431115610bfe5760ff8716600090815260058601602090815260408083205460048901909252822054610bae91613097565b90508015610bf857610bc083826130d4565b60ff89166000908152600588016020526040902054909350610be290826130d4565b60ff891660009081526005880160205260409020555b50610cfb565b8115610c5a576000610c156064610b5d8585612ffa565b9050610c218382613097565b60ff89166000908152600488016020526040902054909350610c4390826130d4565b60ff89166000908152600488016020526040902055505b600984015443811015610cf957600b850154600090610c9b90610b5d610c804386613097565b60ff8d16600090815260048c01602052604090205490612ffa565b60ff8a16600090815260058901602052604090205490915080821115610cf6576000610cc78383613097565b9050610cd382826130d4565b60ff8c16600090815260058b016020526040902055610cf286826130d4565b9550505b50505b505b8115610f9a5760ff87166000908152600386016020526040902054610d2090836130d4565b60ff88166000908152600387016020526040902055600c840154610d4490836130d4565b600c8501558454610d6390670de0b6b3a764000090610b5d9086612ffa565b60ff8816600090815260018701602090815260408083209390935560028801905290812054610d9290846130d4565b60ff8916600090815260028801602052604080822083905587546004805492517f70a0823100000000000000000000000000000000000000000000000000000000815294955073ffffffffffffffffffffffffffffffffffffffff9182169485936370a0823193610e06939116910161346d565b60206040518083038186803b158015610e1e57600080fd5b505afa158015610e32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e569190613341565b90508015610f965760ff8a1660009081526002890160205260408120819055610e808b8486610996565b90506000828211610e915781610e93565b825b9050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d1660f99858d846040518463ffffffff1660e01b8152600401610ef49392919061348e565b600060405180830381600087803b158015610f0e57600080fd5b505af1158015610f22573d6000803e3d6000fd5b505050508a73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168d60ff167f16dc511f817964d1eb39e0c3e84ce317f07b5b12cdfa1f8c2f179a08836af51a888686604051610f8b93929190613c4a565b60405180910390a450505b5050505b50505050505050565b60028181548110610fb357600080fd5b60009182526020909120600d9091020180546001820154600283015460038401546004850154600586015460068701546007880154600889015460098a0154600a8b0154600b8c0154600c909c015473ffffffffffffffffffffffffffffffffffffffff9b8c169d50998b169b9a9098169996989597949693959294919390928d565b600954600114611072576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058090613895565b600060095560055473ffffffffffffffffffffffffffffffffffffffff1633146110c8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058090613bc5565b600060028460ff16815481106110da57fe5b90600052602060002090600d02019050806005015443111580156110fe5750824311155b611134576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610580906138cc565b61113d846113ba565b600581018390556006810182905560405160ff8516907fd50c9d621671c3fc38b7813912936d3cee3f956bdbf5f6c61b5091f2ff2b0fd5906111829086908690613c3c565b60405180910390a2505060016009555050565b6009546001146111d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058090613895565b600060095560055473ffffffffffffffffffffffffffffffffffffffff163314611227576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058090613bc5565b6006546040517fbd5b622a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bd5b622a9061127d90849060040161346d565b60206040518083038186803b15801561129557600080fd5b505afa1580156112a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112cd9190613309565b611303576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058090613a1a565b61130c826113ba565b600060028360ff168154811061131e57fe5b60009182526020909120600d909102016001810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff851617905560405190915060ff8416907fe6b2c8a01867d369cd4952ca70fea492ef433a6ff31b8c8d15c4781f136e60ed906113a890859061346d565b60405180910390a25050600160095550565b600060028260ff16815481106113cc57fe5b90600052602060002090600d0201905060008160050154905060008143116113f457436113f6565b815b6004840154909150808211156114ff576003546040517f70a0823100000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906370a082319061145d90309060040161346d565b60206040518083038186803b15801561147557600080fd5b505afa158015611489573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ad9190613341565b905080156114f65760006114dd82610b5d670de0b6b3a76400006114d78b888a8d60060154611b8b565b90612ffa565b60078701549091506114ef90826130d4565b6007870155505b50600484018290555b5050505050565b60008060028360ff168154811061151957fe5b90600052602060002090600d0201905060008160060154905081600301544310806115475750816005015443115b156115575760009250505061071b565b600061156885434360010185611b8b565b835490915061158f90869073ffffffffffffffffffffffffffffffffffffffff1683610996565b95945050505050565b6009546001146115d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058090613895565b60006009556003546040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116906323b872dd906116339033903090869060040161348e565b602060405180830381600087803b15801561164d57600080fd5b505af1158015611661573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116859190613309565b5061098833612e10565b60035473ffffffffffffffffffffffffffffffffffffffff1681565b6000806009546001146116ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058090613895565b60006009556006546040517f393a748400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063393a748490611745908c9060040161346d565b60206040518083038186803b15801561175d57600080fd5b505afa158015611771573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117959190613309565b6117cb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610580906136ff565b6117d487612ce0565b6003546040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063095ea7b39061182c908c908b906004016134bf565b602060405180830381600087803b15801561184657600080fd5b505af115801561185a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061187e9190613309565b503373ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364886040516118c59190613c33565b60405180910390a26003546040517fb56b681d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b81169263b56b681d9261193192909116908c908c908c908c908c908c906004016135b6565b6040805180830381600087803b15801561194a57600080fd5b505af115801561195e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119829190613359565b6001600955909a909950975050505050505050565b60075481565b6119a633610831565b565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604081206002805483919060ff87169081106119e157fe5b6000918252602082206007600d90920201908101546003546040517f70a0823100000000000000000000000000000000000000000000000000000000815292945090929173ffffffffffffffffffffffffffffffffffffffff909116906370a0823190611a5290309060040161346d565b60206040518083038186803b158015611a6a57600080fd5b505afa158015611a7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aa29190613341565b60058401549091506000438210611ab95743611abb565b815b60048601549091508082118015611ad157508315155b15611b08576000611af885610b5d670de0b6b3a76400006114d78f87898e60060154611b8b565b9050611b0486826130d4565b9550505b60ff8a16600090815260018801602090815260408083205460028b019092528220548954611b539291610b6391611b4d90670de0b6b3a764000090610b5d908d612ffa565b906130d4565b8754909150611b7a908c9073ffffffffffffffffffffffffffffffffffffffff1683610996565b985050505050505050505b92915050565b60008060028660ff1681548110611b9e57fe5b60009182526020909120600d90910201600281015490915073ffffffffffffffffffffffffffffffffffffffff1680611be857611bdf846114d78789613097565b92505050611c9b565b600382015460058301546040517e9fc04700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841692629fc04792611c46928b908b908b90600401613c60565b60206040518083038186803b158015611c5e57600080fd5b505afa158015611c72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c969190613341565b925050505b949350505050565b600954600114611cdf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058090613895565b600060095560055473ffffffffffffffffffffffffffffffffffffffff163314611d35576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058090613bc5565b60025460101015611d72576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058090613645565b6006546040517fbd5b622a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bd5b622a90611dc8908b9060040161346d565b60206040518083038186803b158015611de057600080fd5b505afa158015611df4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e189190613309565b611e4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058090613a1a565b6006546040517fa5120bd500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063a5120bd590611ea4908a9060040161346d565b60206040518083038186803b158015611ebc57600080fd5b505afa158015611ed0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ef49190613309565b611f2a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058090613a77565b80821115611f64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610580906139bd565b854311611f715785611f73565b435b9550848610611fae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058090613838565b6064831115611fe9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058090613ad4565b611ff1612c9b565b6002604051806101a001604052808b73ffffffffffffffffffffffffffffffffffffffff1681526020018a73ffffffffffffffffffffffffffffffffffffffff1681526020018973ffffffffffffffffffffffffffffffffffffffff168152602001888152602001888152602001878152602001868152602001600081526020018581526020018481526020018381526020018484038152602001600081525090806001815401808255809150506001900390600052602060002090600d020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155610120820151816009015561014082015181600a015561016082015181600b015561018082015181600c015550506001600280549050037fa2c202ffa25e71dc0d2875a9b67a9e2572541a0a246c21d72355cca968fd4be160405160405180910390a25050600160095550505050505050565b60055473ffffffffffffffffffffffffffffffffffffffff1681565b600954600114612297576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058090613895565b60006009556006546040517fea74109e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063ea74109e906122f290309060040161346d565b60206040518083038186803b15801561230a57600080fd5b505afa15801561231e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123429190613309565b612378576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058090613960565b33600090815260016020526040902080546007546123969082613097565b600755600082556003546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063a9059cbb906123f590339085906004016134bf565b602060405180830381600087803b15801561240f57600080fd5b505af1158015612423573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124479190613309565b5060025460005b8160ff168160ff16101561248a5760ff81166000908152600180860160209081526040808420849055600288019091528220919091550161244e565b505060016009555050565b6000806009546001146124d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058090613895565b60006009556006546040517f393a748400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063393a74849061252f908d9060040161346d565b60206040518083038186803b15801561254757600080fd5b505afa15801561255b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061257f9190613309565b6125b5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610580906136ff565b6125be87612ce0565b6003546040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063095ea7b390612616908d908b906004016134bf565b602060405180830381600087803b15801561263057600080fd5b505af1158015612644573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126689190613309565b503373ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364886040516126af9190613c33565b60405180910390a26003546040517fe1f4a78400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81169263e1f4a7849261271d92909116908d908d908d908d908d908d908d906004016134e5565b6040805180830381600087803b15801561273657600080fd5b505af115801561274a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061276e9190613359565b6001600955909b909a5098505050505050505050565b6009546001146127c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058090613895565b600060095560055473ffffffffffffffffffffffffffffffffffffffff163314612816576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058090613bc5565b6006546040517fa5120bd500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063a5120bd59061286c90849060040161346d565b60206040518083038186803b15801561288457600080fd5b505afa158015612898573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128bc9190613309565b6128f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058090613a77565b6128fb826113ba565b600060028360ff168154811061290d57fe5b60009182526020909120600d909102016002810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff851617905560405190915060ff8416907fa5e6b0a10fde1bb3c6184cb03bd87ce234e172121088195454746cf4a2e8094d906113a890859061346d565b60006009546001146129d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058090613895565b60006009556006546040517f393a748400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063393a748490612a30908b9060040161346d565b60206040518083038186803b158015612a4857600080fd5b505afa158015612a5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a809190613309565b612ab6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610580906136ff565b612abf86612ce0565b6003546040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063095ea7b390612b17908b908a906004016134bf565b602060405180830381600087803b158015612b3157600080fd5b505af1158015612b45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b699190613309565b503373ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a942436487604051612bb09190613c33565b60405180910390a26003546040517febb5d2e900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a81169263ebb5d2e992612c1c92909116908b908b908b908b908b908b906004016135b6565b602060405180830381600087803b158015612c3657600080fd5b505af1158015612c4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c6e9190613341565b600160095598975050505050505050565b60045473ffffffffffffffffffffffffffffffffffffffff1681565b60025460005b8160ff168160ff161015612cc057612cb8816113ba565b600101612ca1565b5050565b60065473ffffffffffffffffffffffffffffffffffffffff1681565b3360009081526001602052604090208054821115612d2a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058090613b31565b6008546006820154612d3b916130d4565b421015612d74576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058090613b8e565b612d7d33610831565b600754612d8a9083613097565b6007558054612d999083613097565b815560025460005b8160ff168160ff161015612e0a57612dea670de0b6b3a7640000610b5d60028460ff1681548110612dce57fe5b600091825260209091206007600d909202010154865490612ffa565b60ff82166000908152600180860160205260409091209190915501612da1565b50505050565b6007546003546040517f70a08231000000000000000000000000000000000000000000000000000000008152600092612ec292909173ffffffffffffffffffffffffffffffffffffffff909116906370a0823190612e7290309060040161346d565b60206040518083038186803b158015612e8a57600080fd5b505afa158015612e9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b639190613341565b905060008111612efe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058090613929565b600754612f0b90826130d4565b60075573ffffffffffffffffffffffffffffffffffffffff82166000908152600160205260409020612f3c83610831565b8054612f4890836130d4565b815560025460005b8160ff168160ff161015612f9d57612f7d670de0b6b3a7640000610b5d60028460ff1681548110612dce57fe5b60ff82166000908152600180860160205260409091209190915501612f50565b5042600683015560405173ffffffffffffffffffffffffffffffffffffffff8516907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c90612fec908690613c33565b60405180910390a250505050565b60008115806130155750508082028282828161301257fe5b04145b611b85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058090613736565b6000808211613086576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058090613bfc565b81838161308f57fe5b049392505050565b80820382811115611b85576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105809061360e565b80820182811015611b85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058090613801565b803573ffffffffffffffffffffffffffffffffffffffff8116811461071b57600080fd5b803560ff8116811461071b57600080fd5b600060208284031215613157578081fd5b610a8f82613111565b600080600080600080600080610100898b03121561317c578384fd5b61318589613111565b975061319360208a01613111565b96506131a160408a01613111565b9550606089013594506080890135935060a089013592506131c460c08a01613111565b915060e089013590509295985092959890939650565b60008060008060008060008060006101208a8c0312156131f8578081fd5b6132018a613111565b985061320f60208b01613111565b975061321d60408b01613111565b989b979a5097986060810135985060808101359760a0820135975060c0820135965060e08201359550610100909101359350915050565b600080600080600080600060e0888a03121561326e578283fd5b61327788613111565b965061328560208901613111565b95506040880135945060608801359350608088013592506132a860a08901613111565b915060c0880135905092959891949750929550565b600080600080608085870312156132d2578384fd5b6132db85613111565b9350602085013592506132f060408601613111565b91506132fe60608601613111565b905092959194509250565b60006020828403121561331a578081fd5b81518015158114610a8f578182fd5b60006020828403121561333a578081fd5b5035919050565b600060208284031215613352578081fd5b5051919050565b6000806040838503121561336b578182fd5b505080516020909101519092909150565b60006020828403121561338d578081fd5b610a8f82613135565b600080604083850312156133a8578182fd5b6133b183613135565b91506133bf60208401613111565b90509250929050565b6000806000606084860312156133dc578081fd5b6133e584613135565b92506133f360208501613111565b9150604084013590509250925092565b600080600060608486031215613417578081fd5b61342084613135565b95602085013595506040909401359392505050565b6000806000806080858703121561344a578182fd5b61345385613135565b966020860135965060408601359560600135945092505050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9889168152968816602088015294871660408701526060860193909352608085019190915260a084015290921660c082015260e08101919091526101000190565b73ffffffffffffffffffffffffffffffffffffffff9d8e1681529b8d1660208d015299909b1660408b015260608a0197909752608089019590955260a088019390935260c087019190915260e08601526101008501526101208401526101408301526101608201929092526101808101919091526101a00190565b73ffffffffffffffffffffffffffffffffffffffff9788168152958716602087015260408601949094526060850192909252608084015290921660a082015260c081019190915260e00190565b901515815260200190565b60208082526015908201527f64732d6d6174682d7375622d756e646572666c6f770000000000000000000000604082015260600190565b60208082526022908201527f5374616b65506f6f6c3a2052657761726420706f6f6c206c656e677468203e2060408201527f3136000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526024908201527f5374616b65506f6f6c3a20496e697469616c697a65206d75737420626520666160408201527f6c73652e00000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601b908201527f5374616b65506f6f6c3a20496e76616c69642070726f76696465720000000000604082015260600190565b60208082526014908201527f64732d6d6174682d6d756c2d6f766572666c6f77000000000000000000000000604082015260600190565b60208082526028908201527f5374616b65506f6f6c3a20756e7374616b696e6746726f7a656e54696d65203e60408201527f2033302064617973000000000000000000000000000000000000000000000000606082015260800190565b60208082526019908201527f5374616b65506f6f6c3a20496e76616c69642073656e64657200000000000000604082015260600190565b60208082526014908201527f64732d6d6174682d6164642d6f766572666c6f77000000000000000000000000604082015260600190565b60208082526027908201527f5374616b65506f6f6c3a207374617274426c6f636b203e3d20656e645265776160408201527f7264426c6f636b00000000000000000000000000000000000000000000000000606082015260800190565b60208082526011908201527f5374616b65506f6f6c3a204c4f434b4544000000000000000000000000000000604082015260600190565b60208082526027908201527f5374616b65506f6f6c3a20626c6f636b4e756d626572203e20656e645265776160408201527f7264426c6f636b00000000000000000000000000000000000000000000000000606082015260800190565b6020808252601a908201527f5374616b65506f6f6c3a20496e76616c69642062616c616e6365000000000000604082015260600190565b60208082526026908201527f5374616b65506f6f6c3a204e6f7420616c6c6f7720656d657267656e6379576960408201527f7468647261770000000000000000000000000000000000000000000000000000606082015260800190565b6020808252602e908201527f5374616b65506f6f6c3a20737461727456657374696e67426c6f636b203e206560408201527f6e6456657374696e67426c6f636b000000000000000000000000000000000000606082015260800190565b60208082526021908201527f5374616b65506f6f6c3a20496e76616c6964207265776172642072656261736560408201527f7200000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526024908201527f5374616b65506f6f6c3a20496e76616c696420726577617264206d756c74697060408201527f6c69657200000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526024908201527f5374616b65506f6f6c3a20696e76616c6964206c6f636b52657761726450657260408201527f63656e7400000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526022908201527f5374616b65506f6f6c3a20696e76616c696420776974686472617720616d6f7560408201527f6e74000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526011908201527f5374616b65506f6f6c3a2066726f7a656e000000000000000000000000000000604082015260600190565b60208082526014908201527f5374616b65506f6f6c3a202174696d656c6f636b000000000000000000000000604082015260600190565b60208082526018908201527f64732d6d6174682d6469766973696f6e2d62792d7a65726f0000000000000000604082015260600190565b90815260200190565b918252602082015260400190565b9283526020830191909152604082015260600190565b948552602085019390935260408401919091526060830152608082015260a0019056fea2646970667358221220cc61c989077f5ccc64e8214e4583bf3c9d48d510812103a4013648f227694ce264736f6c63430007060033000000000000000000000000f0159d041db29029ccf285a1043dcaac7088030b0000000000000000000000000000000000000000000000000000000000000bb9
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102415760003560e01c806385cc179e11610145578063c0eac9ea116100bd578063e2589d381161008c578063efe2226611610071578063efe22266146104ad578063f36c0a72146104b5578063f77c4791146104bd57610241565b8063e2589d3814610487578063ebb5d2e91461049a57610241565b8063c0eac9ea14610451578063d33219b414610464578063db2e21bc1461046c578063e1f4a7841461047457610241565b8063b56b681d11610114578063b88a802f116100f9578063b88a802f14610423578063be6153351461042b578063c012c42e1461043e57610241565b8063b56b681d14610408578063b69ef8a81461041b57610241565b806385cc179e146103ba57806393ae1d1f146103cd578063a694fc3a146103e0578063a8aa1b31146103f357610241565b80634bf69206116101d85780636bb987fe116101a757806372aa0a601161018c57806372aa0a601461036857806376d743fe146103945780638583f6a5146103a757610241565b80636bb987fe1461034d5780636d3c6d921461035557610241565b80634bf692061461030c57806354fd4d501461031f578063597293f31461032757806360d470881461033a57610241565b80633468a5b8116102145780633468a5b8146102be578063358394d8146102de578063362a3fad146102f1578063437686491461030457610241565b806317837baa146102465780631959a0021461026457806329d79588146102855780632e1a7d4d146102a9575b600080fd5b61024e6104c5565b60405161025b9190613c33565b60405180910390f35b610277610272366004613146565b6104cb565b60405161025b929190613c3c565b610298610293366004613396565b6104e4565b60405161025b959493929190613c60565b6102bc6102b7366004613329565b610544565b005b6102d16102cc366004613146565b610698565b60405161025b9190613603565b6102bc6102ec3660046132bd565b610720565b6102bc6102ff366004613146565b610831565b61024e61085c565b6102bc61031a366004613146565b610862565b61024e610990565b61024e6103353660046133c8565b610996565b61024e610348366004613146565b610a96565b61024e610ac8565b6102bc610363366004613396565b610ace565b61037b610376366004613329565b610fa3565b60405161025b9d9c9b9a9998979695949392919061353b565b6102bc6103a2366004613403565b611036565b6102bc6103b5366004613396565b611195565b6102bc6103c836600461337c565b6113ba565b61024e6103db36600461337c565b611506565b6102bc6103ee366004613329565b611598565b6103fb61168f565b60405161025b919061346d565b610277610416366004613254565b6116ab565b61024e611997565b6102bc61199d565b61024e610439366004613396565b6119a8565b61024e61044c366004613435565b611b8b565b6102bc61045f3660046131da565b611ca3565b6103fb61223f565b6102bc61225b565b610277610482366004613160565b612495565b6102bc610495366004613396565b612784565b61024e6104a8366004613254565b612997565b6103fb612c7f565b6102bc612c9b565b6103fb612cc4565b60085481565b6001602052600090815260409020805460069091015482565b73ffffffffffffffffffffffffffffffffffffffff166000908152600160208181526040808420805460ff909616855292830182528084205460038401835281852054600485018452828620546005909501909352932054939492939092565b600954600114610589576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058090613895565b60405180910390fd5b600060095561059781612ce0565b6003546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063a9059cbb906105ef90339085906004016134bf565b602060405180830381600087803b15801561060957600080fd5b505af115801561061d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106419190613309565b503373ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364826040516106889190613c33565b60405180910390a2506001600955565b6000805b60025460ff8216101561071557600060028260ff16815481106106bb57fe5b60009182526020909120600d90910201805490915073ffffffffffffffffffffffffffffffffffffffff8581169116141561070c5760058101546202fd000143101561070c5760009250505061071b565b5060010161069c565b50600190505b919050565b600a5460ff161561075d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610580906136a2565b62278d00600854111561079c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105809061376d565b6003805473ffffffffffffffffffffffffffffffffffffffff9586167fffffffffffffffffffffffff000000000000000000000000000000000000000091821617909155600893909355600480549285169284169290921790915560058054919093169116179055600a80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60025460005b8160ff168160ff1610156108575761084f8184610ace565b600101610837565b505050565b60025490565b60095460011461089e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058090613895565b60006009556006546040517f393a748400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063393a7484906108f990339060040161346d565b60206040518083038186803b15801561091157600080fd5b505afa158015610925573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109499190613309565b61097f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610580906137ca565b61098881612e10565b506001600955565b60005481565b60008060028560ff16815481106109a957fe5b60009182526020909120600d90910201600181015490915073ffffffffffffffffffffffffffffffffffffffff16806109e6578392505050610a8f565b6040517f2e81056600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821690632e81056690610a3a90889088906004016134bf565b60206040518083038186803b158015610a5257600080fd5b505afa158015610a66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a8a9190613341565b925050505b9392505050565b60085473ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604090206006015401919050565b61198081565b610ad7826113ba565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604081206002805491929160ff8616908110610b1057fe5b600091825260208083206007600d909302019182015460ff881684526001860190915260408320548554929450909291610b699190610b6390670de0b6b3a764000090610b5d9087612ffa565b9061304b565b90613097565b60088401549091508015610cfb5783600a0154431115610bfe5760ff8716600090815260058601602090815260408083205460048901909252822054610bae91613097565b90508015610bf857610bc083826130d4565b60ff89166000908152600588016020526040902054909350610be290826130d4565b60ff891660009081526005880160205260409020555b50610cfb565b8115610c5a576000610c156064610b5d8585612ffa565b9050610c218382613097565b60ff89166000908152600488016020526040902054909350610c4390826130d4565b60ff89166000908152600488016020526040902055505b600984015443811015610cf957600b850154600090610c9b90610b5d610c804386613097565b60ff8d16600090815260048c01602052604090205490612ffa565b60ff8a16600090815260058901602052604090205490915080821115610cf6576000610cc78383613097565b9050610cd382826130d4565b60ff8c16600090815260058b016020526040902055610cf286826130d4565b9550505b50505b505b8115610f9a5760ff87166000908152600386016020526040902054610d2090836130d4565b60ff88166000908152600387016020526040902055600c840154610d4490836130d4565b600c8501558454610d6390670de0b6b3a764000090610b5d9086612ffa565b60ff8816600090815260018701602090815260408083209390935560028801905290812054610d9290846130d4565b60ff8916600090815260028801602052604080822083905587546004805492517f70a0823100000000000000000000000000000000000000000000000000000000815294955073ffffffffffffffffffffffffffffffffffffffff9182169485936370a0823193610e06939116910161346d565b60206040518083038186803b158015610e1e57600080fd5b505afa158015610e32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e569190613341565b90508015610f965760ff8a1660009081526002890160205260408120819055610e808b8486610996565b90506000828211610e915781610e93565b825b9050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d1660f99858d846040518463ffffffff1660e01b8152600401610ef49392919061348e565b600060405180830381600087803b158015610f0e57600080fd5b505af1158015610f22573d6000803e3d6000fd5b505050508a73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168d60ff167f16dc511f817964d1eb39e0c3e84ce317f07b5b12cdfa1f8c2f179a08836af51a888686604051610f8b93929190613c4a565b60405180910390a450505b5050505b50505050505050565b60028181548110610fb357600080fd5b60009182526020909120600d9091020180546001820154600283015460038401546004850154600586015460068701546007880154600889015460098a0154600a8b0154600b8c0154600c909c015473ffffffffffffffffffffffffffffffffffffffff9b8c169d50998b169b9a9098169996989597949693959294919390928d565b600954600114611072576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058090613895565b600060095560055473ffffffffffffffffffffffffffffffffffffffff1633146110c8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058090613bc5565b600060028460ff16815481106110da57fe5b90600052602060002090600d02019050806005015443111580156110fe5750824311155b611134576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610580906138cc565b61113d846113ba565b600581018390556006810182905560405160ff8516907fd50c9d621671c3fc38b7813912936d3cee3f956bdbf5f6c61b5091f2ff2b0fd5906111829086908690613c3c565b60405180910390a2505060016009555050565b6009546001146111d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058090613895565b600060095560055473ffffffffffffffffffffffffffffffffffffffff163314611227576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058090613bc5565b6006546040517fbd5b622a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bd5b622a9061127d90849060040161346d565b60206040518083038186803b15801561129557600080fd5b505afa1580156112a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112cd9190613309565b611303576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058090613a1a565b61130c826113ba565b600060028360ff168154811061131e57fe5b60009182526020909120600d909102016001810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff851617905560405190915060ff8416907fe6b2c8a01867d369cd4952ca70fea492ef433a6ff31b8c8d15c4781f136e60ed906113a890859061346d565b60405180910390a25050600160095550565b600060028260ff16815481106113cc57fe5b90600052602060002090600d0201905060008160050154905060008143116113f457436113f6565b815b6004840154909150808211156114ff576003546040517f70a0823100000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906370a082319061145d90309060040161346d565b60206040518083038186803b15801561147557600080fd5b505afa158015611489573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ad9190613341565b905080156114f65760006114dd82610b5d670de0b6b3a76400006114d78b888a8d60060154611b8b565b90612ffa565b60078701549091506114ef90826130d4565b6007870155505b50600484018290555b5050505050565b60008060028360ff168154811061151957fe5b90600052602060002090600d0201905060008160060154905081600301544310806115475750816005015443115b156115575760009250505061071b565b600061156885434360010185611b8b565b835490915061158f90869073ffffffffffffffffffffffffffffffffffffffff1683610996565b95945050505050565b6009546001146115d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058090613895565b60006009556003546040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116906323b872dd906116339033903090869060040161348e565b602060405180830381600087803b15801561164d57600080fd5b505af1158015611661573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116859190613309565b5061098833612e10565b60035473ffffffffffffffffffffffffffffffffffffffff1681565b6000806009546001146116ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058090613895565b60006009556006546040517f393a748400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063393a748490611745908c9060040161346d565b60206040518083038186803b15801561175d57600080fd5b505afa158015611771573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117959190613309565b6117cb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610580906136ff565b6117d487612ce0565b6003546040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063095ea7b39061182c908c908b906004016134bf565b602060405180830381600087803b15801561184657600080fd5b505af115801561185a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061187e9190613309565b503373ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364886040516118c59190613c33565b60405180910390a26003546040517fb56b681d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b81169263b56b681d9261193192909116908c908c908c908c908c908c906004016135b6565b6040805180830381600087803b15801561194a57600080fd5b505af115801561195e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119829190613359565b6001600955909a909950975050505050505050565b60075481565b6119a633610831565b565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604081206002805483919060ff87169081106119e157fe5b6000918252602082206007600d90920201908101546003546040517f70a0823100000000000000000000000000000000000000000000000000000000815292945090929173ffffffffffffffffffffffffffffffffffffffff909116906370a0823190611a5290309060040161346d565b60206040518083038186803b158015611a6a57600080fd5b505afa158015611a7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aa29190613341565b60058401549091506000438210611ab95743611abb565b815b60048601549091508082118015611ad157508315155b15611b08576000611af885610b5d670de0b6b3a76400006114d78f87898e60060154611b8b565b9050611b0486826130d4565b9550505b60ff8a16600090815260018801602090815260408083205460028b019092528220548954611b539291610b6391611b4d90670de0b6b3a764000090610b5d908d612ffa565b906130d4565b8754909150611b7a908c9073ffffffffffffffffffffffffffffffffffffffff1683610996565b985050505050505050505b92915050565b60008060028660ff1681548110611b9e57fe5b60009182526020909120600d90910201600281015490915073ffffffffffffffffffffffffffffffffffffffff1680611be857611bdf846114d78789613097565b92505050611c9b565b600382015460058301546040517e9fc04700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841692629fc04792611c46928b908b908b90600401613c60565b60206040518083038186803b158015611c5e57600080fd5b505afa158015611c72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c969190613341565b925050505b949350505050565b600954600114611cdf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058090613895565b600060095560055473ffffffffffffffffffffffffffffffffffffffff163314611d35576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058090613bc5565b60025460101015611d72576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058090613645565b6006546040517fbd5b622a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bd5b622a90611dc8908b9060040161346d565b60206040518083038186803b158015611de057600080fd5b505afa158015611df4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e189190613309565b611e4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058090613a1a565b6006546040517fa5120bd500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063a5120bd590611ea4908a9060040161346d565b60206040518083038186803b158015611ebc57600080fd5b505afa158015611ed0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ef49190613309565b611f2a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058090613a77565b80821115611f64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610580906139bd565b854311611f715785611f73565b435b9550848610611fae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058090613838565b6064831115611fe9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058090613ad4565b611ff1612c9b565b6002604051806101a001604052808b73ffffffffffffffffffffffffffffffffffffffff1681526020018a73ffffffffffffffffffffffffffffffffffffffff1681526020018973ffffffffffffffffffffffffffffffffffffffff168152602001888152602001888152602001878152602001868152602001600081526020018581526020018481526020018381526020018484038152602001600081525090806001815401808255809150506001900390600052602060002090600d020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155610120820151816009015561014082015181600a015561016082015181600b015561018082015181600c015550506001600280549050037fa2c202ffa25e71dc0d2875a9b67a9e2572541a0a246c21d72355cca968fd4be160405160405180910390a25050600160095550505050505050565b60055473ffffffffffffffffffffffffffffffffffffffff1681565b600954600114612297576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058090613895565b60006009556006546040517fea74109e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063ea74109e906122f290309060040161346d565b60206040518083038186803b15801561230a57600080fd5b505afa15801561231e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123429190613309565b612378576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058090613960565b33600090815260016020526040902080546007546123969082613097565b600755600082556003546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063a9059cbb906123f590339085906004016134bf565b602060405180830381600087803b15801561240f57600080fd5b505af1158015612423573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124479190613309565b5060025460005b8160ff168160ff16101561248a5760ff81166000908152600180860160209081526040808420849055600288019091528220919091550161244e565b505060016009555050565b6000806009546001146124d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058090613895565b60006009556006546040517f393a748400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063393a74849061252f908d9060040161346d565b60206040518083038186803b15801561254757600080fd5b505afa15801561255b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061257f9190613309565b6125b5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610580906136ff565b6125be87612ce0565b6003546040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063095ea7b390612616908d908b906004016134bf565b602060405180830381600087803b15801561263057600080fd5b505af1158015612644573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126689190613309565b503373ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364886040516126af9190613c33565b60405180910390a26003546040517fe1f4a78400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81169263e1f4a7849261271d92909116908d908d908d908d908d908d908d906004016134e5565b6040805180830381600087803b15801561273657600080fd5b505af115801561274a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061276e9190613359565b6001600955909b909a5098505050505050505050565b6009546001146127c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058090613895565b600060095560055473ffffffffffffffffffffffffffffffffffffffff163314612816576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058090613bc5565b6006546040517fa5120bd500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063a5120bd59061286c90849060040161346d565b60206040518083038186803b15801561288457600080fd5b505afa158015612898573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128bc9190613309565b6128f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058090613a77565b6128fb826113ba565b600060028360ff168154811061290d57fe5b60009182526020909120600d909102016002810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff851617905560405190915060ff8416907fa5e6b0a10fde1bb3c6184cb03bd87ce234e172121088195454746cf4a2e8094d906113a890859061346d565b60006009546001146129d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058090613895565b60006009556006546040517f393a748400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063393a748490612a30908b9060040161346d565b60206040518083038186803b158015612a4857600080fd5b505afa158015612a5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a809190613309565b612ab6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610580906136ff565b612abf86612ce0565b6003546040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063095ea7b390612b17908b908a906004016134bf565b602060405180830381600087803b158015612b3157600080fd5b505af1158015612b45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b699190613309565b503373ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a942436487604051612bb09190613c33565b60405180910390a26003546040517febb5d2e900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a81169263ebb5d2e992612c1c92909116908b908b908b908b908b908b906004016135b6565b602060405180830381600087803b158015612c3657600080fd5b505af1158015612c4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c6e9190613341565b600160095598975050505050505050565b60045473ffffffffffffffffffffffffffffffffffffffff1681565b60025460005b8160ff168160ff161015612cc057612cb8816113ba565b600101612ca1565b5050565b60065473ffffffffffffffffffffffffffffffffffffffff1681565b3360009081526001602052604090208054821115612d2a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058090613b31565b6008546006820154612d3b916130d4565b421015612d74576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058090613b8e565b612d7d33610831565b600754612d8a9083613097565b6007558054612d999083613097565b815560025460005b8160ff168160ff161015612e0a57612dea670de0b6b3a7640000610b5d60028460ff1681548110612dce57fe5b600091825260209091206007600d909202010154865490612ffa565b60ff82166000908152600180860160205260409091209190915501612da1565b50505050565b6007546003546040517f70a08231000000000000000000000000000000000000000000000000000000008152600092612ec292909173ffffffffffffffffffffffffffffffffffffffff909116906370a0823190612e7290309060040161346d565b60206040518083038186803b158015612e8a57600080fd5b505afa158015612e9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b639190613341565b905060008111612efe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058090613929565b600754612f0b90826130d4565b60075573ffffffffffffffffffffffffffffffffffffffff82166000908152600160205260409020612f3c83610831565b8054612f4890836130d4565b815560025460005b8160ff168160ff161015612f9d57612f7d670de0b6b3a7640000610b5d60028460ff1681548110612dce57fe5b60ff82166000908152600180860160205260409091209190915501612f50565b5042600683015560405173ffffffffffffffffffffffffffffffffffffffff8516907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c90612fec908690613c33565b60405180910390a250505050565b60008115806130155750508082028282828161301257fe5b04145b611b85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058090613736565b6000808211613086576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058090613bfc565b81838161308f57fe5b049392505050565b80820382811115611b85576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105809061360e565b80820182811015611b85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058090613801565b803573ffffffffffffffffffffffffffffffffffffffff8116811461071b57600080fd5b803560ff8116811461071b57600080fd5b600060208284031215613157578081fd5b610a8f82613111565b600080600080600080600080610100898b03121561317c578384fd5b61318589613111565b975061319360208a01613111565b96506131a160408a01613111565b9550606089013594506080890135935060a089013592506131c460c08a01613111565b915060e089013590509295985092959890939650565b60008060008060008060008060006101208a8c0312156131f8578081fd5b6132018a613111565b985061320f60208b01613111565b975061321d60408b01613111565b989b979a5097986060810135985060808101359760a0820135975060c0820135965060e08201359550610100909101359350915050565b600080600080600080600060e0888a03121561326e578283fd5b61327788613111565b965061328560208901613111565b95506040880135945060608801359350608088013592506132a860a08901613111565b915060c0880135905092959891949750929550565b600080600080608085870312156132d2578384fd5b6132db85613111565b9350602085013592506132f060408601613111565b91506132fe60608601613111565b905092959194509250565b60006020828403121561331a578081fd5b81518015158114610a8f578182fd5b60006020828403121561333a578081fd5b5035919050565b600060208284031215613352578081fd5b5051919050565b6000806040838503121561336b578182fd5b505080516020909101519092909150565b60006020828403121561338d578081fd5b610a8f82613135565b600080604083850312156133a8578182fd5b6133b183613135565b91506133bf60208401613111565b90509250929050565b6000806000606084860312156133dc578081fd5b6133e584613135565b92506133f360208501613111565b9150604084013590509250925092565b600080600060608486031215613417578081fd5b61342084613135565b95602085013595506040909401359392505050565b6000806000806080858703121561344a578182fd5b61345385613135565b966020860135965060408601359560600135945092505050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9889168152968816602088015294871660408701526060860193909352608085019190915260a084015290921660c082015260e08101919091526101000190565b73ffffffffffffffffffffffffffffffffffffffff9d8e1681529b8d1660208d015299909b1660408b015260608a0197909752608089019590955260a088019390935260c087019190915260e08601526101008501526101208401526101408301526101608201929092526101808101919091526101a00190565b73ffffffffffffffffffffffffffffffffffffffff9788168152958716602087015260408601949094526060850192909252608084015290921660a082015260c081019190915260e00190565b901515815260200190565b60208082526015908201527f64732d6d6174682d7375622d756e646572666c6f770000000000000000000000604082015260600190565b60208082526022908201527f5374616b65506f6f6c3a2052657761726420706f6f6c206c656e677468203e2060408201527f3136000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526024908201527f5374616b65506f6f6c3a20496e697469616c697a65206d75737420626520666160408201527f6c73652e00000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601b908201527f5374616b65506f6f6c3a20496e76616c69642070726f76696465720000000000604082015260600190565b60208082526014908201527f64732d6d6174682d6d756c2d6f766572666c6f77000000000000000000000000604082015260600190565b60208082526028908201527f5374616b65506f6f6c3a20756e7374616b696e6746726f7a656e54696d65203e60408201527f2033302064617973000000000000000000000000000000000000000000000000606082015260800190565b60208082526019908201527f5374616b65506f6f6c3a20496e76616c69642073656e64657200000000000000604082015260600190565b60208082526014908201527f64732d6d6174682d6164642d6f766572666c6f77000000000000000000000000604082015260600190565b60208082526027908201527f5374616b65506f6f6c3a207374617274426c6f636b203e3d20656e645265776160408201527f7264426c6f636b00000000000000000000000000000000000000000000000000606082015260800190565b60208082526011908201527f5374616b65506f6f6c3a204c4f434b4544000000000000000000000000000000604082015260600190565b60208082526027908201527f5374616b65506f6f6c3a20626c6f636b4e756d626572203e20656e645265776160408201527f7264426c6f636b00000000000000000000000000000000000000000000000000606082015260800190565b6020808252601a908201527f5374616b65506f6f6c3a20496e76616c69642062616c616e6365000000000000604082015260600190565b60208082526026908201527f5374616b65506f6f6c3a204e6f7420616c6c6f7720656d657267656e6379576960408201527f7468647261770000000000000000000000000000000000000000000000000000606082015260800190565b6020808252602e908201527f5374616b65506f6f6c3a20737461727456657374696e67426c6f636b203e206560408201527f6e6456657374696e67426c6f636b000000000000000000000000000000000000606082015260800190565b60208082526021908201527f5374616b65506f6f6c3a20496e76616c6964207265776172642072656261736560408201527f7200000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526024908201527f5374616b65506f6f6c3a20496e76616c696420726577617264206d756c74697060408201527f6c69657200000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526024908201527f5374616b65506f6f6c3a20696e76616c6964206c6f636b52657761726450657260408201527f63656e7400000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526022908201527f5374616b65506f6f6c3a20696e76616c696420776974686472617720616d6f7560408201527f6e74000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526011908201527f5374616b65506f6f6c3a2066726f7a656e000000000000000000000000000000604082015260600190565b60208082526014908201527f5374616b65506f6f6c3a202174696d656c6f636b000000000000000000000000604082015260600190565b60208082526018908201527f64732d6d6174682d6469766973696f6e2d62792d7a65726f0000000000000000604082015260600190565b90815260200190565b918252602082015260400190565b9283526020830191909152604082015260600190565b948552602085019390935260408401919091526060830152608082015260a0019056fea2646970667358221220cc61c989077f5ccc64e8214e4583bf3c9d48d510812103a4013648f227694ce264736f6c63430007060033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000f0159d041db29029ccf285a1043dcaac7088030b0000000000000000000000000000000000000000000000000000000000000bb9
-----Decoded View---------------
Arg [0] : _controller (address): 0xf0159d041DB29029cCF285A1043DcAAc7088030b
Arg [1] : _version (uint256): 3001
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000f0159d041db29029ccf285a1043dcaac7088030b
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000bb9
Deployed Bytecode Sourcemap
30125:20732:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31942:43;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31686:44;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;46625:611::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;41049:213::-;;;;;;:::i;:::-;;:::i;:::-;;32544:570;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;33179:521::-;;;;;;:::i;:::-;;:::i;41270:245::-;;;;;;:::i;:::-;;:::i;40072:118::-;;;:::i;39130:212::-;;;;;;:::i;:::-;;:::i;30198:31::-;;;:::i;37362:483::-;;;;;;:::i;:::-;;:::i;40198:164::-;;;;;;:::i;:::-;;:::i;32067:45::-;;;:::i;41616:3133::-;;;;;;:::i;:::-;;:::i;31737:38::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;38356:581::-;;;;;;:::i;:::-;;:::i;36123:444::-;;;;;;:::i;:::-;;:::i;47473:923::-;;;;;;:::i;:::-;;:::i;37853:495::-;;;;;;:::i;:::-;;:::i;38945:177::-;;;;;;:::i;:::-;;:::i;31782:28::-;;;:::i;:::-;;;;;;;:::i;49150:837::-;;;;;;:::i;:::-;;:::i;31913:22::-;;;:::i;41523:85::-;;;:::i;44757:1148::-;;;;;;:::i;:::-;;:::i;36643:711::-;;;;;;:::i;:::-;;:::i;33708:1928::-;;;;;;:::i;:::-;;:::i;31849:23::-;;;:::i;45976:641::-;;;:::i;48404:738::-;;;;;;:::i;:::-;;:::i;35644:471::-;;;;;;:::i;:::-;;:::i;49995:859::-;;;;;;:::i;:::-;;:::i;31817:25::-;;;:::i;47244:221::-;;;:::i;31879:25::-;;;:::i;31942:43::-;;;;:::o;31686:44::-;;;;;;;;;;;;;;;;;;;:::o;46625:611::-;46969:18;;46756:14;46969:18;;;:8;:18;;;;;;;;47007:11;;47042:21;;;;;;:15;;;:21;;;;;;47094:22;;;:28;;;;;;47146:15;;;:21;;;;;;47199:23;;;;:29;;;;;;47007:11;;47042:21;;47094:28;;46625:611::o;41049:213::-;32319:8;;32331:1;32319:13;32311:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;32376:1;32365:8;:12;41118:28:::1;41138:7:::0;41118:19:::1;:28::i;:::-;41174:4;::::0;41157:52:::1;::::0;;;;41174:4:::1;::::0;;::::1;::::0;41157:31:::1;::::0;:52:::1;::::0;41189:10:::1;::::0;41201:7;;41157:52:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;41234:10;41225:29;;;41246:7;41225:29;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;32411:1:0;32400:8;:12;41049:213::o;32544:570::-;32625:4;;32642:443;32668:14;:21;32662:27;;;;32642:443;;;32713:33;32749:14;32764:3;32749:19;;;;;;;;;;;;;;;;;;;;;;;32787:22;;32749:19;;-1:-1:-1;32787:32:0;;;;:22;;:32;32783:291;;;32952:25;;;;32981:19;32952:49;32936:12;:66;32932:127;;;33034:5;33027:12;;;;;;32932:127;-1:-1:-1;32691:5:0;;32642:443;;;;33102:4;33095:11;;32544:570;;;;:::o;33179:521::-;33364:12;;;;:21;33356:70;;;;;;;;;;;;:::i;:::-;33468:7;33445:19;;:30;;33437:83;;;;;;;;;;;;:::i;:::-;33531:4;:12;;;;;;;;;;;;;;33554:19;:42;;;;33607:10;:24;;;;;;;;;;;;;;;33642:8;:20;;;;;;;;;;;33673:12;:19;;;;33531:12;33673:19;;;33179:521::o;41270:245::-;41369:14;:21;41338:22;41402:106;41430:16;41423:23;;:4;:23;;;41402:106;;;41471:25;41481:4;41487:8;41471:9;:25::i;:::-;41448:6;;41402:106;;;;41270:245;;:::o;40072:118::-;40161:14;:21;40072:118;:::o;39130:212::-;32319:8;;32331:1;32319:13;32311:43;;;;;;;;;;;;:::i;:::-;32376:1;32365:8;:12;39229:10:::1;::::0;39208:66:::1;::::0;;;;39229:10:::1;::::0;;::::1;::::0;39208:54:::1;::::0;:66:::1;::::0;39263:10:::1;::::0;39208:66:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39200:104;;;;;;;;;;;;:::i;:::-;39315:19;39325:8;39315:9;:19::i;:::-;-1:-1:-1::0;32411:1:0;32400:8;:12;39130:212::o;30198:31::-;;;;:::o;37362:483::-;37509:7;37529:33;37565:14;37580:4;37565:20;;;;;;;;;;;;;;;;;;;;;;;37620:24;;;;37565:20;;-1:-1:-1;37620:24:0;;;37655:81;;37710:14;37703:21;;;;;;37655:81;37753:84;;;;;:54;;;;;;:84;;37808:12;;37822:14;;37753:84;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37746:91;;;;37362:483;;;;;;:::o;40198:164::-;40335:19;;40300:18;;;40273:7;40300:18;;;:8;:18;;;;;:32;;;:54;40198:164;;;:::o;32067:45::-;32108:4;32067:45;:::o;41616:3133::-;41692:18;41705:4;41692:12;:18::i;:::-;41745;;;41721:21;41745:18;;;:8;:18;;;;;41810:14;:20;;41745:18;;41721:21;41810:20;;;;;;;;;;;;;;;;;;41870:28;41810:20;;;;;41870:28;;;;41984:21;;;;;:15;;;:21;;;;;;;41934:11;;41810:20;;-1:-1:-1;41870:28:0;;41810:20;41934:72;;41984:21;41934:45;;41974:4;;41934:35;;41870:28;41934:15;:35::i;:::-;:39;;:45::i;:::-;:49;;:72::i;:::-;42046:28;;;;41909:97;;-1:-1:-1;42089:22:0;;42085:1503;;42147:10;:26;;;42132:12;:41;42128:1449;;;42244:29;;;42194:21;42244:29;;;:23;;;:29;;;;;;;;;42218:15;;;:21;;;;;;:56;;:25;:56::i;:::-;42194:80;-1:-1:-1;42297:17:0;;42293:219;;42356:33;:14;42375:13;42356:18;:33::i;:::-;42444:29;;;;;;;:23;;;:29;;;;;;42339:50;;-1:-1:-1;42444:48:0;;42478:13;42444:33;:48::i;:::-;42412:29;;;;;;;:23;;;:29;;;;;:80;42293:219;42128:1449;;;;42556:18;;42552:286;;42599:17;42619:47;42662:3;42619:38;:14;42638:18;42619;:38::i;:47::-;42599:67;-1:-1:-1;42706:29:0;:14;42599:67;42706:18;:29::i;:::-;42782:21;;;;;;;:15;;;:21;;;;;;42689:46;;-1:-1:-1;42782:36:0;;42808:9;42782:25;:36::i;:::-;42758:21;;;;;;;:15;;;:21;;;;;:60;-1:-1:-1;42552:286:0;42885:28;;;;42936:12;:33;-1:-1:-1;42932:630:0;;;43084:29;;;;42994:19;;43016:98;;:63;43042:36;:12;43059:18;43042:16;:36::i;:::-;43016:21;;;;;;;:15;;;:21;;;;;;;:25;:63::i;:98::-;43167:29;;;43137:27;43167:29;;;:23;;;:29;;;;;;42994:120;;-1:-1:-1;43223:33:0;;;43219:324;;;43285:21;43309:36;:11;43325:19;43309:15;:36::i;:::-;43285:60;-1:-1:-1;43404:38:0;:19;43285:60;43404:23;:38::i;:::-;43372:29;;;;;;;:23;;;:29;;;;;:70;43486:33;:14;43505:13;43486:18;:33::i;:::-;43469:50;;43219:324;;42932:630;;;42128:1449;;43602:18;;43598:1144;;43668:28;;;;;;;:22;;;:28;;;;;;:48;;43701:14;43668:32;:48::i;:::-;43637:28;;;;;;;:22;;;:28;;;;;:79;43761:27;;;;:47;;43793:14;43761:31;:47::i;:::-;43731:27;;;:77;43847:11;;:45;;43887:4;;43847:35;;43863:18;43847:15;:35::i;:45::-;43823:21;;;;;;;:15;;;:21;;;;;;;;:69;;;;43924:11;;;:17;;;;;;:37;;43946:14;43924:21;:37::i;:::-;43976:17;;;;;;;:11;;;:17;;;;;;:26;;;44153:22;;44244:10;;;44214:41;;;;;43907:54;;-1:-1:-1;44153:22:0;;;;;;;44214:29;;:41;;44244:10;;;44214:41;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44190:65;-1:-1:-1;44274:17:0;;44270:461;;44312:17;;;44332:1;44312:17;;;:11;;;:17;;;;;:21;;;44375:42;44324:4;44397:11;44410:6;44375:15;:42::i;:::-;44352:65;;44436:18;44472:13;44457:12;:28;:59;;44504:12;44457:59;;;44488:13;44457:59;44436:80;;44556:10;;;;;;;;;;;44535:45;;;44581:11;44594:8;44604:10;44535:80;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44672:8;44639:76;;44659:11;44639:76;;44653:4;44639:76;;;44682:6;44690:12;44704:10;44639:76;;;;;;;;:::i;:::-;;;;;;;;44270:461;;;43598:1144;;;;41616:3133;;;;;;;:::o;31737:38::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31737:38:0;;;;;;;;;;;;;;;;;;;;;;;;:::o;38356:581::-;32319:8;;32331:1;32319:13;32311:43;;;;;;;;;;;;:::i;:::-;32376:1;32365:8;:12;32483:8:::1;::::0;::::1;;32469:10;:22;32461:55;;;;;;;;;;;;:::i;:::-;38525:33:::2;38561:14;38576:4;38561:20;;;;;;;;;;;;;;;;;;;;38525:56;;38616:10;:25;;;38600:12;:41;;:76;;;;;38661:15;38645:12;:31;;38600:76;38592:128;;;;;;;;;;;;:::i;:::-;38731:18;38744:4;38731:12;:18::i;:::-;38760:25;::::0;::::2;:43:::0;;;38814:25:::2;::::0;::::2;:43:::0;;;38873:56:::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;38788:15;;38842;;38873:56:::2;:::i;:::-;;;;;;;;-1:-1:-1::0;;32411:1:0;32400:8;:12;-1:-1:-1;;38356:581:0:o;36123:444::-;32319:8;;32331:1;32319:13;32311:43;;;;;;;;;;;;:::i;:::-;32376:1;32365:8;:12;32483:8:::1;::::0;::::1;;32469:10;:22;32461:55;;;;;;;;;;;;:::i;:::-;36264:10:::2;::::0;36243:73:::2;::::0;;;;36264:10:::2;::::0;;::::2;::::0;36243:57:::2;::::0;:73:::2;::::0;36301:14;;36243:73:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36235:119;;;;;;;;;;;;:::i;:::-;36365:18;36378:4;36365:12;:18::i;:::-;36394:33;36430:14;36445:4;36430:20;;;;;;;;;;;::::0;;;::::2;::::0;;;::::2;::::0;;::::2;;36461:24;::::0;::::2;:41:::0;;;::::2;;::::0;::::2;;::::0;;36518::::2;::::0;36430:20;;-1:-1:-1;36518:41:0::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;36461;;36518::::2;:::i;:::-;;;;;;;;-1:-1:-1::0;;32411:1:0;32400:8;:12;-1:-1:-1;36123:444:0:o;47473:923::-;47534:33;47570:14;47585:4;47570:20;;;;;;;;;;;;;;;;;;;;47534:56;;47601:23;47627:10;:25;;;47601:51;;47663:33;47714:15;47699:12;:30;:63;;47750:12;47699:63;;;47732:15;47699:63;47800:26;;;;47663:99;;-1:-1:-1;47841:44:0;;;47837:552;;;47938:4;;47921:47;;;;;47902:16;;47938:4;;;47921:32;;:47;;47962:4;;47921:47;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47902:66;-1:-1:-1;47987:12:0;;47983:326;;48020:26;48070:121;48182:8;48070:107;48172:4;48070:97;48090:4;48096:16;48114:25;48141:10;:25;;;48070:19;:97::i;:::-;:101;;:107::i;:121::-;48241:28;;;;48020:171;;-1:-1:-1;48241:52:0;;48020:171;48241:32;:52::i;:::-;48210:28;;;:83;-1:-1:-1;47983:326:0;-1:-1:-1;48323:26:0;;;:54;;;47837:552;47473:923;;;;;:::o;37853:495::-;37923:7;37943:33;37979:14;37994:3;37979:19;;;;;;;;;;;;;;;;;;;;37943:55;;38009:22;38034:10;:25;;;38009:50;;38089:10;:27;;;38074:12;:42;:86;;;;38135:10;:25;;;38120:12;:40;38074:86;38070:100;;;38169:1;38162:8;;;;;;38070:100;38181:14;38198:72;38218:3;38223:12;38237;38252:1;38237:16;38255:14;38198:19;:72::i;:::-;38309:22;;38181:89;;-1:-1:-1;38288:52:0;;38304:3;;38309:22;;38181:89;38288:15;:52::i;:::-;38281:59;37853:495;-1:-1:-1;;;;;37853:495:0:o;38945:177::-;32319:8;;32331:1;32319:13;32311:43;;;;;;;;;;;;:::i;:::-;32376:1;32365:8;:12;39028:4:::1;::::0;39011:71:::1;::::0;;;;39028:4:::1;::::0;;::::1;::::0;39011:35:::1;::::0;:71:::1;::::0;39047:10:::1;::::0;39067:4:::1;::::0;39074:7;;39011:71:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;39093:21;39103:10;39093:9;:21::i;31782:28::-:0;;;;;;:::o;49150:837::-;49408:19;49429:17;32319:8;;32331:1;32319:13;32311:43;;;;;;;;;;;;:::i;:::-;32376:1;32365:8;:12;49488:10:::1;::::0;49467:64:::1;::::0;;;;49488:10:::1;::::0;;::::1;::::0;49467:54:::1;::::0;:64:::1;::::0;49522:8;;49467:64:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49459:104;;;;;;;;;;;;:::i;:::-;49574:30;49594:9;49574:19;:30::i;:::-;49632:4;::::0;49615:51:::1;::::0;;;;49632:4:::1;::::0;;::::1;::::0;49615:30:::1;::::0;:51:::1;::::0;49646:8;;49656:9;;49615:51:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;49691:10;49682:31;;;49703:9;49682:31;;;;;;:::i;:::-;;;;;;;;49823:4;::::0;49751:228:::1;::::0;;;;:49:::1;::::0;;::::1;::::0;::::1;::::0;:228:::1;::::0;49823:4;;::::1;::::0;49843:5;;49863:9;;49887:14;;49916:12;;49943:2;;49960:8;;49751:228:::1;;;:::i;:::-;;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32411:1:::0;32400:8;:12;49724:255;;;;-1:-1:-1;49150:837:0;-1:-1:-1;;;;;;;;49150:837:0:o;31913:22::-;;;;:::o;41523:85::-;41575:25;41589:10;41575:13;:25::i;:::-;41523:85::o;44757:1148::-;44886:18;;;44842:7;44886:18;;;:8;:18;;;;;44951:14;:20;;44842:7;;44951:14;:20;;;;;;;;;;;;;;;;;45011:28;44951:20;;;;;45011:28;;;;45086:4;;45069:47;;;;;44951:20;;-1:-1:-1;45011:28:0;;44951:20;45086:4;;;;;45069:32;;:47;;45110:4;;45069:47;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45153:25;;;;45050:66;;-1:-1:-1;45127:23:0;45225:12;:30;-1:-1:-1;45225:63:0;;45276:12;45225:63;;;45258:15;45225:63;45326:26;;;;45189:99;;-1:-1:-1;45367:44:0;;;:61;;;;-1:-1:-1;45415:13:0;;;45367:61;45363:339;;;45445:26;45491:121;45603:8;45491:107;45593:4;45491:97;45511:4;45517:16;45535:25;45562:10;:25;;;45491:19;:97::i;:121::-;45445:167;-1:-1:-1;45648:42:0;:18;45445:167;45648:22;:42::i;:::-;45627:63;;45363:339;;45803:21;;;45712:15;45803:21;;;:15;;;:21;;;;;;;;;45780:11;;;:17;;;;;;45730:11;;:95;;45803:21;45730:68;;:45;;45770:4;;45730:35;;45746:18;45730:15;:35::i;:45::-;:49;;:68::i;:95::-;45865:22;;45712:113;;-1:-1:-1;45843:54:0;;45859:4;;45865:22;;45712:113;45843:15;:54::i;:::-;45836:61;;;;;;;;;;44757:1148;;;;;:::o;36643:711::-;36810:7;36830:33;36866:14;36881:4;36866:20;;;;;;;;;;;;;;;;;;;;;;;36924:27;;;;36866:20;;-1:-1:-1;36924:27:0;;;36962:105;;37020:35;37039:15;37020:14;:3;37028:5;37020:7;:14::i;:35::-;37013:42;;;;;;36962:105;37180:27;;;;37226:25;;;;37097:249;;;;;:64;;;;;;:249;;37270:5;;37294:3;;37316:15;;37097:249;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37077:269;;;;36643:711;;;;;;;:::o;33708:1928::-;32319:8;;32331:1;32319:13;32311:43;;;;;;;;;;;;:::i;:::-;32376:1;32365:8;:12;32483:8:::1;::::0;::::1;;32469:10;:22;32461:55;;;;;;;;;;;;:::i;:::-;34100:14:::2;:21:::0;34125:2:::2;-1:-1:-1::0;34100:27:0::2;34092:74;;;;;;;;;;;;:::i;:::-;34206:10;::::0;34185:73:::2;::::0;;;;34206:10:::2;::::0;;::::2;::::0;34185:57:::2;::::0;:73:::2;::::0;34243:14;;34185:73:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34177:119;;;;;;;;;;;;:::i;:::-;34336:10;::::0;34315:79:::2;::::0;;;;34336:10:::2;::::0;;::::2;::::0;34315:60:::2;::::0;:79:::2;::::0;34376:17;;34315:79:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34307:128;;;;;;;;;;;;:::i;:::-;34476:16;34454:18;:38;;34446:97;;;;;;;;;;;;:::i;:::-;34584:11;34569:12;:26;34568:57;;34614:11;34568:57;;;34599:12;34568:57;34554:71;;34658:15;34644:11;:29;34636:81;;;;;;;;;;;;:::i;:::-;34758:3;34736:18;:25;;34728:74;;;;;;;;;;;;:::i;:::-;34813:14;:12;:14::i;:::-;34838;34872:689;;;;;;;;34919:12;34872:689;;;;;;34965:14;34872:689;;;;;;35064:17;34872:689;;;;;;35016:11;34872:689;;;;35117:11;34872:689;;;;35163:15;34872:689;;;;35213:15;34872:689;;;;35266:1;34872:689;;;;35305:18;34872:689;;;;35361:18;34872:689;;;;35415:16;34872:689;;;;35489:18;35470:16;:37;34872:689;;;;35544:1;34872:689;;::::0;34838:734:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35626:1;35602:14;:21;;;;:25;35588:40;;;;;;;;;;-1:-1:-1::0;;32411:1:0;32400:8;:12;-1:-1:-1;;;;;;;33708:1928:0:o;31849:23::-;;;;;;:::o;45976:641::-;32319:8;;32331:1;32319:13;32311:43;;;;;;;;;;;;:::i;:::-;32376:1;32365:8;:12;46068:10:::1;::::0;46047:81:::1;::::0;;;;46068:10:::1;::::0;;::::1;::::0;46047:66:::1;::::0;:81:::1;::::0;46122:4:::1;::::0;46047:81:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46039:132;;;;;;;;;;;;:::i;:::-;46215:10;46182:21;46206:20:::0;;;:8:::1;:20;::::0;;;;46254:11;;46286:7:::1;::::0;:19:::1;::::0;46254:11;46286::::1;:19::i;:::-;46276:7;:29:::0;46330:1:::1;46316:15:::0;;46359:4:::1;::::0;46342:51:::1;::::0;;;;46359:4:::1;::::0;;::::1;::::0;46342:31:::1;::::0;:51:::1;::::0;46374:10:::1;::::0;46386:6;;46342:51:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;46435:14:0::1;:21:::0;46404:22:::1;46468:142;46496:16;46489:23;;:4;:23;;;46468:142;;;46537:21;::::0;::::1;46561:1;46537:21:::0;;;:15:::1;::::0;;::::1;:21;::::0;;;;;;;:25;;;46577:11:::1;::::0;::::1;:17:::0;;;;;:21;;;;46514:6:::1;46468:142;;;-1:-1:-1::0;;32411:1:0;32400:8;:12;-1:-1:-1;;45976:641:0:o;48404:738::-;48677:15;48694;32319:8;;32331:1;32319:13;32311:43;;;;;;;;;;;;:::i;:::-;32376:1;32365:8;:12;48751:10:::1;::::0;48730:64:::1;::::0;;;;48751:10:::1;::::0;;::::1;::::0;48730:54:::1;::::0;:64:::1;::::0;48785:8;;48730:64:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48722:104;;;;;;;;;;;;:::i;:::-;48837:30;48857:9;48837:19;:30::i;:::-;48895:4;::::0;48878:51:::1;::::0;;;;48895:4:::1;::::0;;::::1;::::0;48878:30:::1;::::0;:51:::1;::::0;48909:8;;48919:9;;48878:51:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;48954:10;48945:31;;;48966:9;48945:31;;;;;;:::i;:::-;;;;;;;;49063:4;::::0;49008:126:::1;::::0;;;;:46:::1;::::0;;::::1;::::0;::::1;::::0;:126:::1;::::0;49063:4;;::::1;::::0;49070:6;;49078;;49086:9;;49097:10;;49109;;49121:2;;49125:8;;49008:126:::1;;;:::i;:::-;;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32411:1:::0;32400:8;:12;48987:147;;;;-1:-1:-1;48404:738:0;-1:-1:-1;;;;;;;;;48404:738:0:o;35644:471::-;32319:8;;32331:1;32319:13;32311:43;;;;;;;;;;;;:::i;:::-;32376:1;32365:8;:12;32483:8:::1;::::0;::::1;;32469:10;:22;32461:55;;;;;;;;;;;;:::i;:::-;35791:10:::2;::::0;35770:79:::2;::::0;;;;35791:10:::2;::::0;;::::2;::::0;35770:60:::2;::::0;:79:::2;::::0;35831:17;;35770:79:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35762:128;;;;;;;;;;;;:::i;:::-;35901:18;35914:4;35901:12;:18::i;:::-;35930:33;35966:14;35981:4;35966:20;;;;;;;;;;;::::0;;;::::2;::::0;;;::::2;::::0;;::::2;;35997:27;::::0;::::2;:47:::0;;;::::2;;::::0;::::2;;::::0;;36060::::2;::::0;35966:20;;-1:-1:-1;36060:47:0::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;35997;;36060::::2;:::i;49995:859::-:0;50282:17;32319:8;;32331:1;32319:13;32311:43;;;;;;;;;;;;:::i;:::-;32376:1;32365:8;:12;50341:10:::1;::::0;50320:64:::1;::::0;;;;50341:10:::1;::::0;;::::1;::::0;50320:54:::1;::::0;:64:::1;::::0;50375:8;;50320:64:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50312:104;;;;;;;;;;;;:::i;:::-;50427:30;50447:9;50427:19;:30::i;:::-;50485:4;::::0;50468:51:::1;::::0;;;;50485:4:::1;::::0;;::::1;::::0;50468:30:::1;::::0;:51:::1;::::0;50499:8;;50509:9;;50468:51:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;50544:10;50535:31;;;50556:9;50535:31;;;;;;:::i;:::-;;;;;;;;50690:4;::::0;50589:257:::1;::::0;;;;:78:::1;::::0;;::::1;::::0;::::1;::::0;:257:::1;::::0;50690:4;;::::1;::::0;50710:5;;50730:9;;50754:14;;50783:12;;50810:2;;50827:8;;50589:257:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32411:1:::0;32400:8;:12;50577:269;49995:859;-1:-1:-1;;;;;;;;49995:859:0:o;31817:25::-;;;;;;:::o;47244:221::-;47326:14;:21;47295:22;47359:99;47387:16;47380:23;;:4;:23;;;47359:99;;;47428:18;47441:4;47428:12;:18::i;:::-;47405:6;;47359:99;;;;47244:221;:::o;31879:25::-;;;;;;:::o;40370:671::-;40469:10;40436:21;40460:20;;;:8;:20;;;;;40499:11;;:22;-1:-1:-1;40499:22:0;40491:69;;;;;;;;;;;;:::i;:::-;40621:19;;40598:18;;;;:43;;:22;:43::i;:::-;40579:15;:62;;40571:92;;;;;;;;;;;;:::i;:::-;40674:25;40688:10;40674:13;:25::i;:::-;40720:7;;:20;;40732:7;40720:11;:20::i;:::-;40710:7;:30;40765:11;;:24;;40781:7;40765:15;:24::i;:::-;40751:38;;40831:14;:21;40751:11;40864:170;40892:16;40885:23;;:4;:23;;;40864:170;;;40957:65;41017:4;40957:55;40973:14;40988:4;40973:20;;;;;;;;;;;;;;;;;;:38;:20;;;;;:38;;40957:11;;;:15;:55::i;:65::-;40933:21;;;;;;;:15;;;;:21;;;;;;:89;;;;40910:6;40864:170;;;;40370:671;;;:::o;39350:714::-;39477:7;;39442:4;;39425:47;;;;;39407:15;;39425:60;;39477:7;;39442:4;;;;;39425:32;;:47;;39466:4;;39425:47;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:60::-;39407:78;;39514:1;39504:7;:11;39496:50;;;;;;;;;;;;:::i;:::-;39567:7;;:20;;39579:7;39567:11;:20::i;:::-;39557:7;:30;39622:18;;;39598:21;39622:18;;;:8;:18;;;;;39651:23;39631:8;39651:13;:23::i;:::-;39699:11;;:24;;39715:7;39699:15;:24::i;:::-;39685:38;;39765:14;:21;39685:11;39798:170;39826:16;39819:23;;:4;:23;;;39798:170;;;39891:65;39951:4;39891:55;39907:14;39922:4;39907:20;;;;;;;;;39891:65;39867:21;;;;;;;:15;;;;:21;;;;;;:89;;;;39844:6;39798:170;;;-1:-1:-1;39999:15:0;39978:18;;;:36;40030:26;;;;;;;;;;40048:7;;40030:26;:::i;:::-;;;;;;;;39350:714;;;;:::o;12732:151::-;12790:9;12820:6;;;:30;;-1:-1:-1;;12835:5:0;;;12849:1;12844;12835:5;12844:1;12830:15;;;;;:20;12820:30;12812:63;;;;;;;;;;;;:::i;12891:150::-;12949:9;12983:1;12979;:5;12971:42;;;;;;;;;;;;:::i;:::-;13032:1;13028;:5;;;;;;;12891:150;-1:-1:-1;;;12891:150:0:o;12586:138::-;12679:5;;;12674:16;;;;12666:50;;;;;;;;;;;;:::i;12441:137::-;12534:5;;;12529:16;;;;12521:49;;;;;;;;;;;;:::i;14:198:1:-;84:20;;144:42;133:54;;123:65;;113:2;;202:1;199;192:12;217:158;285:20;;345:4;334:16;;324:27;;314:2;;365:1;362;355:12;380:198;;492:2;480:9;471:7;467:23;463:32;460:2;;;513:6;505;498:22;460:2;541:31;562:9;541:31;:::i;583:703::-;;;;;;;;;814:3;802:9;793:7;789:23;785:33;782:2;;;836:6;828;821:22;782:2;864:31;885:9;864:31;:::i;:::-;854:41;;914:40;950:2;939:9;935:18;914:40;:::i;:::-;904:50;;973:40;1009:2;998:9;994:18;973:40;:::i;:::-;963:50;;1060:2;1049:9;1045:18;1032:32;1022:42;;1111:3;1100:9;1096:19;1083:33;1073:43;;1163:3;1152:9;1148:19;1135:33;1125:43;;1187:41;1223:3;1212:9;1208:19;1187:41;:::i;:::-;1177:51;;1275:3;1264:9;1260:19;1247:33;1237:43;;772:514;;;;;;;;;;;:::o;1291:764::-;;;;;;;;;;1539:3;1527:9;1518:7;1514:23;1510:33;1507:2;;;1561:6;1553;1546:22;1507:2;1589:31;1610:9;1589:31;:::i;:::-;1579:41;;1639:40;1675:2;1664:9;1660:18;1639:40;:::i;:::-;1629:50;;1698:40;1734:2;1723:9;1719:18;1698:40;:::i;:::-;1497:558;;;;-1:-1:-1;1688:50:1;;1785:2;1770:18;;1757:32;;-1:-1:-1;1836:3:1;1821:19;;1808:33;;1888:3;1873:19;;1860:33;;-1:-1:-1;1940:3:1;1925:19;;1912:33;;-1:-1:-1;1992:3:1;1977:19;;1964:33;;-1:-1:-1;2044:3:1;2029:19;;;2016:33;;-1:-1:-1;1497:558:1;-1:-1:-1;;1497:558:1:o;2060:626::-;;;;;;;;2274:3;2262:9;2253:7;2249:23;2245:33;2242:2;;;2296:6;2288;2281:22;2242:2;2324:31;2345:9;2324:31;:::i;:::-;2314:41;;2374:40;2410:2;2399:9;2395:18;2374:40;:::i;:::-;2364:50;;2461:2;2450:9;2446:18;2433:32;2423:42;;2512:2;2501:9;2497:18;2484:32;2474:42;;2563:3;2552:9;2548:19;2535:33;2525:43;;2587:41;2623:3;2612:9;2608:19;2587:41;:::i;:::-;2577:51;;2675:3;2664:9;2660:19;2647:33;2637:43;;2232:454;;;;;;;;;;:::o;2691:419::-;;;;;2854:3;2842:9;2833:7;2829:23;2825:33;2822:2;;;2876:6;2868;2861:22;2822:2;2904:31;2925:9;2904:31;:::i;:::-;2894:41;;2982:2;2971:9;2967:18;2954:32;2944:42;;3005:40;3041:2;3030:9;3026:18;3005:40;:::i;:::-;2995:50;;3064:40;3100:2;3089:9;3085:18;3064:40;:::i;:::-;3054:50;;2812:298;;;;;;;:::o;3115:297::-;;3235:2;3223:9;3214:7;3210:23;3206:32;3203:2;;;3256:6;3248;3241:22;3203:2;3293:9;3287:16;3346:5;3339:13;3332:21;3325:5;3322:32;3312:2;;3373:6;3365;3358:22;3417:190;;3529:2;3517:9;3508:7;3504:23;3500:32;3497:2;;;3550:6;3542;3535:22;3497:2;-1:-1:-1;3578:23:1;;3487:120;-1:-1:-1;3487:120:1:o;3612:194::-;;3735:2;3723:9;3714:7;3710:23;3706:32;3703:2;;;3756:6;3748;3741:22;3703:2;-1:-1:-1;3784:16:1;;3693:113;-1:-1:-1;3693:113:1:o;3811:255::-;;;3951:2;3939:9;3930:7;3926:23;3922:32;3919:2;;;3972:6;3964;3957:22;3919:2;-1:-1:-1;;4000:16:1;;4056:2;4041:18;;;4035:25;4000:16;;4035:25;;-1:-1:-1;3909:157:1:o;4071:194::-;;4181:2;4169:9;4160:7;4156:23;4152:32;4149:2;;;4202:6;4194;4187:22;4149:2;4230:29;4249:9;4230:29;:::i;4270:270::-;;;4397:2;4385:9;4376:7;4372:23;4368:32;4365:2;;;4418:6;4410;4403:22;4365:2;4446:29;4465:9;4446:29;:::i;:::-;4436:39;;4494:40;4530:2;4519:9;4515:18;4494:40;:::i;:::-;4484:50;;4355:185;;;;;:::o;4545:338::-;;;;4689:2;4677:9;4668:7;4664:23;4660:32;4657:2;;;4710:6;4702;4695:22;4657:2;4738:29;4757:9;4738:29;:::i;:::-;4728:39;;4786:40;4822:2;4811:9;4807:18;4786:40;:::i;:::-;4776:50;;4873:2;4862:9;4858:18;4845:32;4835:42;;4647:236;;;;;:::o;4888:330::-;;;;5032:2;5020:9;5011:7;5007:23;5003:32;5000:2;;;5053:6;5045;5038:22;5000:2;5081:29;5100:9;5081:29;:::i;:::-;5071:39;5157:2;5142:18;;5129:32;;-1:-1:-1;5208:2:1;5193:18;;;5180:32;;4990:228;-1:-1:-1;;;4990:228:1:o;5223:399::-;;;;;5384:3;5372:9;5363:7;5359:23;5355:33;5352:2;;;5406:6;5398;5391:22;5352:2;5434:29;5453:9;5434:29;:::i;:::-;5424:39;5510:2;5495:18;;5482:32;;-1:-1:-1;5561:2:1;5546:18;;5533:32;;5612:2;5597:18;5584:32;;-1:-1:-1;5342:280:1;-1:-1:-1;;;5342:280:1:o;5627:226::-;5803:42;5791:55;;;;5773:74;;5761:2;5746:18;;5728:125::o;6097:406::-;6317:42;6386:15;;;6368:34;;6438:15;;;;6433:2;6418:18;;6411:43;6485:2;6470:18;;6463:34;;;;6295:2;6280:18;;6262:241::o;6508:305::-;6720:42;6708:55;;;;6690:74;;6795:2;6780:18;;6773:34;6678:2;6663:18;;6645:168::o;6818:776::-;7171:42;7240:15;;;7222:34;;7292:15;;;7287:2;7272:18;;7265:43;7344:15;;;7339:2;7324:18;;7317:43;7391:2;7376:18;;7369:34;;;;7434:3;7419:19;;7412:35;;;;7478:3;7463:19;;7456:35;7528:15;;;7522:3;7507:19;;7500:44;7575:3;7560:19;;7553:35;;;;7148:3;7133:19;;7115:479::o;7599:1192::-;8115:42;8103:55;;;8085:74;;8195:55;;;8190:2;8175:18;;8168:83;8287:55;;;;8282:2;8267:18;;8260:83;8374:2;8359:18;;8352:34;;;;8417:3;8402:19;;8395:35;;;;8461:3;8446:19;;8439:35;;;;8505:3;8490:19;;8483:35;;;;8549:3;8534:19;;8527:35;8593:3;8578:19;;8571:35;8637:3;8622:19;;8615:35;8681:3;8666:19;;8659:36;8726:3;8711:19;;8704:36;;;;8771:3;8756:19;;8749:36;;;;8072:3;8057:19;;8039:752::o;9199:695::-;9524:42;9593:15;;;9575:34;;9645:15;;;9640:2;9625:18;;9618:43;9692:2;9677:18;;9670:34;;;;9735:2;9720:18;;9713:34;;;;9778:3;9763:19;;9756:35;9828:15;;;9822:3;9807:19;;9800:44;9875:3;9860:19;;9853:35;;;;9501:3;9486:19;;9468:426::o;10201:187::-;10366:14;;10359:22;10341:41;;10329:2;10314:18;;10296:92::o;10393:345::-;10595:2;10577:21;;;10634:2;10614:18;;;10607:30;10673:23;10668:2;10653:18;;10646:51;10729:2;10714:18;;10567:171::o;10743:398::-;10945:2;10927:21;;;10984:2;10964:18;;;10957:30;11023:34;11018:2;11003:18;;10996:62;11094:4;11089:2;11074:18;;11067:32;11131:3;11116:19;;10917:224::o;11146:400::-;11348:2;11330:21;;;11387:2;11367:18;;;11360:30;11426:34;11421:2;11406:18;;11399:62;11497:6;11492:2;11477:18;;11470:34;11536:3;11521:19;;11320:226::o;11551:351::-;11753:2;11735:21;;;11792:2;11772:18;;;11765:30;11831:29;11826:2;11811:18;;11804:57;11893:2;11878:18;;11725:177::o;11907:344::-;12109:2;12091:21;;;12148:2;12128:18;;;12121:30;12187:22;12182:2;12167:18;;12160:50;12242:2;12227:18;;12081:170::o;12256:404::-;12458:2;12440:21;;;12497:2;12477:18;;;12470:30;12536:34;12531:2;12516:18;;12509:62;12607:10;12602:2;12587:18;;12580:38;12650:3;12635:19;;12430:230::o;12665:349::-;12867:2;12849:21;;;12906:2;12886:18;;;12879:30;12945:27;12940:2;12925:18;;12918:55;13005:2;12990:18;;12839:175::o;13019:344::-;13221:2;13203:21;;;13260:2;13240:18;;;13233:30;13299:22;13294:2;13279:18;;13272:50;13354:2;13339:18;;13193:170::o;13368:403::-;13570:2;13552:21;;;13609:2;13589:18;;;13582:30;13648:34;13643:2;13628:18;;13621:62;13719:9;13714:2;13699:18;;13692:37;13761:3;13746:19;;13542:229::o;13776:341::-;13978:2;13960:21;;;14017:2;13997:18;;;13990:30;14056:19;14051:2;14036:18;;14029:47;14108:2;14093:18;;13950:167::o;14122:403::-;14324:2;14306:21;;;14363:2;14343:18;;;14336:30;14402:34;14397:2;14382:18;;14375:62;14473:9;14468:2;14453:18;;14446:37;14515:3;14500:19;;14296:229::o;14530:350::-;14732:2;14714:21;;;14771:2;14751:18;;;14744:30;14810:28;14805:2;14790:18;;14783:56;14871:2;14856:18;;14704:176::o;14885:402::-;15087:2;15069:21;;;15126:2;15106:18;;;15099:30;15165:34;15160:2;15145:18;;15138:62;15236:8;15231:2;15216:18;;15209:36;15277:3;15262:19;;15059:228::o;15292:410::-;15494:2;15476:21;;;15533:2;15513:18;;;15506:30;15572:34;15567:2;15552:18;;15545:62;15643:16;15638:2;15623:18;;15616:44;15692:3;15677:19;;15466:236::o;15707:397::-;15909:2;15891:21;;;15948:2;15928:18;;;15921:30;15987:34;15982:2;15967:18;;15960:62;16058:3;16053:2;16038:18;;16031:31;16094:3;16079:19;;15881:223::o;16109:400::-;16311:2;16293:21;;;16350:2;16330:18;;;16323:30;16389:34;16384:2;16369:18;;16362:62;16460:6;16455:2;16440:18;;16433:34;16499:3;16484:19;;16283:226::o;16514:400::-;16716:2;16698:21;;;16755:2;16735:18;;;16728:30;16794:34;16789:2;16774:18;;16767:62;16865:6;16860:2;16845:18;;16838:34;16904:3;16889:19;;16688:226::o;16919:398::-;17121:2;17103:21;;;17160:2;17140:18;;;17133:30;17199:34;17194:2;17179:18;;17172:62;17270:4;17265:2;17250:18;;17243:32;17307:3;17292:19;;17093:224::o;17322:341::-;17524:2;17506:21;;;17563:2;17543:18;;;17536:30;17602:19;17597:2;17582:18;;17575:47;17654:2;17639:18;;17496:167::o;17668:344::-;17870:2;17852:21;;;17909:2;17889:18;;;17882:30;17948:22;17943:2;17928:18;;17921:50;18003:2;17988:18;;17842:170::o;18017:348::-;18219:2;18201:21;;;18258:2;18238:18;;;18231:30;18297:26;18292:2;18277:18;;18270:54;18356:2;18341:18;;18191:174::o;18370:177::-;18516:25;;;18504:2;18489:18;;18471:76::o;18552:248::-;18726:25;;;18782:2;18767:18;;18760:34;18714:2;18699:18;;18681:119::o;18805:319::-;19007:25;;;19063:2;19048:18;;19041:34;;;;19106:2;19091:18;;19084:34;18995:2;18980:18;;18962:162::o;19129:463::-;19388:25;;;19444:2;19429:18;;19422:34;;;;19487:2;19472:18;;19465:34;;;;19530:2;19515:18;;19508:34;19573:3;19558:19;;19551:35;19375:3;19360:19;;19342:250::o
Swarm Source
ipfs://cc61c989077f5ccc64e8214e4583bf3c9d48d510812103a4013648f227694ce2
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ 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.