More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 30 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Reinvest | 5884443 | 10 mins ago | IN | 0 S | 0.02242047 | ||||
Reinvest | 5882825 | 28 mins ago | IN | 0 S | 0.02242047 | ||||
Reinvest | 5882028 | 37 mins ago | IN | 0 S | 0.0225568 | ||||
Reinvest | 5880053 | 58 mins ago | IN | 0 S | 0.02242047 | ||||
Reinvest | 5878343 | 1 hr ago | IN | 0 S | 0.02242047 | ||||
Reinvest | 5875137 | 1 hr ago | IN | 0 S | 0.02226345 | ||||
Reinvest | 5873082 | 2 hrs ago | IN | 0 S | 0.02242047 | ||||
Reinvest | 5870090 | 2 hrs ago | IN | 0 S | 0.02242047 | ||||
Reinvest | 5867717 | 3 hrs ago | IN | 0 S | 0.02242047 | ||||
Reinvest | 5865180 | 3 hrs ago | IN | 0 S | 0.02242047 | ||||
Reinvest | 5862800 | 4 hrs ago | IN | 0 S | 0.023408 | ||||
Reinvest | 5859569 | 5 hrs ago | IN | 0 S | 0.02242047 | ||||
Reinvest | 5855187 | 6 hrs ago | IN | 0 S | 0.03968662 | ||||
Reinvest | 5841651 | 9 hrs ago | IN | 0 S | 0.0230846 | ||||
Reinvest | 5829486 | 11 hrs ago | IN | 0 S | 0.023408 | ||||
Reinvest | 5823177 | 12 hrs ago | IN | 0 S | 0.02242047 | ||||
Reinvest | 5816200 | 14 hrs ago | IN | 0 S | 0.02242455 | ||||
Reinvest | 5808032 | 15 hrs ago | IN | 0 S | 0.02690457 | ||||
Reinvest | 5797131 | 17 hrs ago | IN | 0 S | 0.023408 | ||||
Reinvest | 5758600 | 26 hrs ago | IN | 0 S | 0.02242047 | ||||
Reinvest | 5756635 | 26 hrs ago | IN | 0 S | 0.02242047 | ||||
Reinvest | 5754244 | 27 hrs ago | IN | 0 S | 0.02242455 | ||||
Reinvest | 5751990 | 27 hrs ago | IN | 0 S | 0.02242047 | ||||
Reinvest | 5747699 | 29 hrs ago | IN | 0 S | 0.02242047 | ||||
Reinvest | 5744944 | 30 hrs ago | IN | 0 S | 0.02242047 |
Latest 1 internal transaction
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
5287189 | 5 days ago | Contract Creation | 0 S |
Loading...
Loading
Contract Name:
StakedLPTokenSolidlyBase7
Compiler Version
v0.5.16+commit.9c3226ce
Optimization Enabled:
Yes with 999999 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// Sources flattened with hardhat v2.22.1 https://hardhat.org pragma experimental ABIEncoderV2; // File extra/uniswap/staked-lp-token/libraries/SafeMath.sol pragma solidity =0.5.16; // From https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/math/Math.sol // Subject to the MIT license. /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the addition of two unsigned integers, reverting with custom message on overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, errorMessage); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on underflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot underflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction underflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on underflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot underflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, errorMessage); return c; } /** * @dev Returns the integer division of two unsigned integers. * Reverts on division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. * Reverts with custom message on division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File extra/uniswap/staked-lp-token/ImpermaxERC20.sol pragma solidity =0.5.16; // This contract is basically UniswapV2ERC20 with small modifications // src: https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol contract ImpermaxERC20 { using SafeMath for uint; string public name; string public symbol; uint8 public decimals = 18; uint public totalSupply; mapping(address => uint) public balanceOf; mapping(address => mapping(address => uint)) public allowance; bytes32 public DOMAIN_SEPARATOR; mapping(address => uint) public nonces; event Transfer(address indexed from, address indexed to, uint value); event Approval(address indexed owner, address indexed spender, uint value); constructor() public {} function _setName(string memory _name, string memory _symbol) internal { name = _name; symbol = _symbol; uint chainId; assembly { chainId := chainid } DOMAIN_SEPARATOR = keccak256( abi.encode( keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), keccak256(bytes(_name)), keccak256(bytes("1")), chainId, address(this) ) ); } function _mint(address to, uint value) internal { totalSupply = totalSupply.add(value); balanceOf[to] = balanceOf[to].add(value); emit Transfer(address(0), to, value); } function _burn(address from, uint value) internal { balanceOf[from] = balanceOf[from].sub(value); totalSupply = totalSupply.sub(value); emit Transfer(from, address(0), value); } function _approve(address owner, address spender, uint value) private { allowance[owner][spender] = value; emit Approval(owner, spender, value); } function _transfer(address from, address to, uint value) internal { balanceOf[from] = balanceOf[from].sub(value, "Impermax: TRANSFER_TOO_HIGH"); balanceOf[to] = balanceOf[to].add(value); emit Transfer(from, to, value); } function approve(address spender, uint value) external returns (bool) { _approve(msg.sender, spender, value); return true; } function transfer(address to, uint value) external returns (bool) { _transfer(msg.sender, to, value); return true; } function transferFrom(address from, address to, uint value) external returns (bool) { if (allowance[from][msg.sender] != uint(-1)) { allowance[from][msg.sender] = allowance[from][msg.sender].sub(value, "Impermax: TRANSFER_NOT_ALLOWED"); } _transfer(from, to, value); return true; } function _checkSignature(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s, bytes32 typehash) internal { require(deadline >= block.timestamp, "Impermax: EXPIRED"); bytes32 digest = keccak256( abi.encodePacked( '\x19\x01', DOMAIN_SEPARATOR, keccak256(abi.encode(typehash, owner, spender, value, nonces[owner]++, deadline)) ) ); address recoveredAddress = ecrecover(digest, v, r, s); require(recoveredAddress != address(0) && recoveredAddress == owner, "Impermax: INVALID_SIGNATURE"); } // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9; function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external { _checkSignature(owner, spender, value, deadline, v, r, s, PERMIT_TYPEHASH); _approve(owner, spender, value); } } // File extra/uniswap/staked-lp-token/interfaces/IERC20.sol pragma solidity >=0.5.0; interface IERC20 { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint 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 (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); } // File extra/uniswap/staked-lp-token/interfaces/IPoolToken.sol pragma solidity >=0.5.0; interface IPoolToken { /*** Impermax ERC20 ***/ event Transfer(address indexed from, address indexed to, uint value); event Approval(address indexed owner, address indexed spender, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint 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 (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; /*** Pool Token ***/ event Mint(address indexed sender, address indexed minter, uint mintAmount, uint mintTokens); event Redeem(address indexed sender, address indexed redeemer, uint redeemAmount, uint redeemTokens); event Sync(uint totalBalance); function underlying() external view returns (address); function factory() external view returns (address); function totalBalance() external view returns (uint); function MINIMUM_LIQUIDITY() external pure returns (uint); function exchangeRate() external returns (uint); function mint(address minter) external returns (uint mintTokens); function redeem(address redeemer) external returns (uint redeemAmount); function skim(address to) external; function sync() external; function _setFactory() external; } // File extra/uniswap/staked-lp-token/PoolToken.sol pragma solidity =0.5.16; contract PoolToken is IPoolToken, ImpermaxERC20 { uint internal constant initialExchangeRate = 1e18; address public underlying; address public factory; uint public totalBalance; uint public constant MINIMUM_LIQUIDITY = 1000; event Mint(address indexed sender, address indexed minter, uint mintAmount, uint mintTokens); event Redeem(address indexed sender, address indexed redeemer, uint redeemAmount, uint redeemTokens); event Sync(uint totalBalance); /*** Initialize ***/ // called once by the factory function _setFactory() external { require(factory == address(0), "Impermax: FACTORY_ALREADY_SET"); factory = msg.sender; } /*** PoolToken ***/ function _update() internal { totalBalance = IERC20(underlying).balanceOf(address(this)); emit Sync(totalBalance); } function exchangeRate() public returns (uint) { uint _totalSupply = totalSupply; // gas savings uint _totalBalance = totalBalance; // gas savings if (_totalSupply == 0 || _totalBalance == 0) return initialExchangeRate; return _totalBalance.mul(1e18).div(_totalSupply); } // this low-level function should be called from another contract function mint(address minter) external nonReentrant update returns (uint mintTokens) { uint balance = IERC20(underlying).balanceOf(address(this)); uint mintAmount = balance.sub(totalBalance); mintTokens = mintAmount.mul(1e18).div(exchangeRate()); if(totalSupply == 0) { // permanently lock the first MINIMUM_LIQUIDITY tokens mintTokens = mintTokens.sub(MINIMUM_LIQUIDITY); _mint(address(0), MINIMUM_LIQUIDITY); } require(mintTokens > 0, "Impermax: MINT_AMOUNT_ZERO"); _mint(minter, mintTokens); emit Mint(msg.sender, minter, mintAmount, mintTokens); } // this low-level function should be called from another contract function redeem(address redeemer) external nonReentrant update returns (uint redeemAmount) { uint redeemTokens = balanceOf[address(this)]; redeemAmount = redeemTokens.mul(exchangeRate()).div(1e18); require(redeemAmount > 0, "Impermax: REDEEM_AMOUNT_ZERO"); require(redeemAmount <= totalBalance, "Impermax: INSUFFICIENT_CASH"); _burn(address(this), redeemTokens); _safeTransfer(redeemer, redeemAmount); emit Redeem(msg.sender, redeemer, redeemAmount, redeemTokens); } // force real balance to match totalBalance function skim(address to) external nonReentrant { _safeTransfer(to, IERC20(underlying).balanceOf(address(this)).sub(totalBalance)); } // force totalBalance to match real balance function sync() external nonReentrant update {} /*** Utilities ***/ // same safe transfer function used by UniSwapV2 (with fixed underlying) bytes4 private constant SELECTOR = bytes4(keccak256(bytes("transfer(address,uint256)"))); function _safeTransfer(address to, uint amount) internal { (bool success, bytes memory data) = underlying.call(abi.encodeWithSelector(SELECTOR, to, amount)); require(success && (data.length == 0 || abi.decode(data, (bool))), "Impermax: TRANSFER_FAILED"); } // prevents a contract from calling itself, directly or indirectly. bool internal _notEntered = true; modifier nonReentrant() { require(_notEntered, "Impermax: REENTERED"); _notEntered = false; _; _notEntered = true; } // update totalBalance with current balance modifier update() { _; _update(); } } // File extra/uniswap/staked-lp-token/interfaces/IUniswapV2Pair.sol pragma solidity >=0.5.0; interface IUniswapV2Pair { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); } // File extra/uniswap/staked-lp-token/interfaces/IUniswapV2Router01.sol pragma solidity >=0.5.0; interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); } // File extra/uniswap/staked-lp-token/interfaces/IBaseV1Factory.sol pragma solidity >=0.5.0; interface IBaseV1Factory { function getPair(address tokenA, address tokenB, bool stable) external view returns (address pair); function getPool(address tokenA, address tokenB, bool stable) external view returns (address pair); } // File extra/uniswap/staked-lp-token/interfaces/IBaseV1Pair.sol pragma solidity >=0.5.0; interface IBaseV1Pair { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function stable() external view returns (bool); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint reserve0, uint reserve1, uint blockTimestampLast); function observationLength() external view returns (uint); function observations(uint) external view returns ( uint timestamp, uint reserve0Cumulative, uint reserve1Cumulative ); function currentCumulativePrices() external view returns ( uint reserve0Cumulative, uint reserve1Cumulative, uint timestamp ); } // File extra/uniswap/staked-lp-token/interfaces/IBaseV1Router02.sol pragma solidity >=0.5.0; // Original pragma directive: pragma experimental ABIEncoderV2 interface IBaseV1Router02 { struct Route { address from; address to; bool stable; } function wftm() external pure returns (address); function factory() external pure returns (address); function defaultFactory() external view returns (address); function addLiquidity( address tokenA, address tokenB, bool stable, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, Route[] calldata routes, address to, uint256 deadline ) external returns (uint256[] memory amounts); } // File extra/uniswap/staked-lp-token/interfaces/ISolidlyGauge7.sol pragma solidity >=0.5.0; interface ISolidlyGauge7 { function notifyRewardAmount(address token, uint amount) external; function getReward(address, address[] calldata) external; function claimFees() external returns (uint claimed0, uint claimed1); function left(address token) external view returns (uint); function isForPair() external view returns (bool); function earned(address account) external view returns (uint); function balanceOf(address account) external view returns (uint); function rewardRate() external view returns (uint); function deposit(uint256 amount) external; function withdraw(uint256 amount) external; } // File extra/uniswap/staked-lp-token/interfaces/ISolidlyVoter.sol pragma solidity >=0.5.0; interface ISolidlyVoter { function _ve() external view returns (address); function governor() external view returns (address); function emergencyCouncil() external view returns (address); function attachTokenToGauge(uint _tokenId, address account) external; function detachTokenFromGauge(uint _tokenId, address account) external; function emitDeposit(uint _tokenId, address account, uint amount) external; function emitWithdraw(uint _tokenId, address account, uint amount) external; function isWhitelisted(address token) external view returns (bool); function notifyRewardAmount(uint amount) external; function distribute(address _gauge) external; function gauges(address token) external view returns (address); function poolToGauge(address token) external view returns (address); function gaugeForPool(address token) external view returns (address); } // File extra/uniswap/staked-lp-token/libraries/Math.sol pragma solidity =0.5.16; // a library for performing various math operations // forked from: https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/libraries/Math.sol library Math { function min(uint x, uint y) internal pure returns (uint z) { z = x < y ? x : y; } // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method) function sqrt(uint y) internal pure returns (uint z) { if (y > 3) { z = y; uint x = y / 2 + 1; while (x < z) { z = x; x = (y / x + x) / 2; } } else if (y != 0) { z = 1; } } } // File extra/uniswap/staked-lp-token/libraries/SafeToken.sol pragma solidity 0.5.16; interface ERC20Interface { function balanceOf(address user) external view returns (uint256); } library SafeToken { function myBalance(address token) internal view returns (uint256) { return ERC20Interface(token).balanceOf(address(this)); } function balanceOf(address token, address user) internal view returns (uint256) { return ERC20Interface(token).balanceOf(user); } 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))), "!safeApprove"); } 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))), "!safeTransfer"); } 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))), "!safeTransferFrom"); } function safeTransferETH(address to, uint256 value) internal { (bool success, ) = to.call.value(value)(new bytes(0)); require(success, "!safeTransferETH"); } } // File extra/uniswap/staked-lp-token/StakedLPTokenSolidlyBase7.sol pragma solidity =0.5.16; interface IXShadow { function exit( uint256 _amount ) external returns (uint256 _exitedAmount); } // updated codebase for thena v2 and pearl contract StakedLPTokenSolidlyBase7 is PoolToken { using SafeToken for address; bool public constant isStakedLPToken = true; string public constant stakedLPTokenType = "SolidlyBase7"; bool public constant stable = false; address public token0; address public token1; address public router; address public gauge; address public rewardsToken; address public rewardsToken1; address[] public bridgeTokens; uint256 public constant REINVEST_BOUNTY = 0.02e18; event Reinvest(address indexed caller, uint256 reward, uint256 bounty); function _initialize( address _underlying, address _token0, address _token1, address _router, address _voter, address _rewardsToken, address _rewardsToken1, address[] calldata _bridgeTokens ) external { require(factory == address(0), "StakedLPToken: FACTORY_ALREADY_SET"); // sufficient check factory = msg.sender; _setName("Staked Uniswap V2", "STKD-UNI-V2"); underlying = _underlying; token0 = _token0; token1 = _token1; router = _router; gauge = ISolidlyVoter(_voter).gaugeForPool(_underlying); require(gauge != address(0), "StakedLPToken: NO_GAUGE"); rewardsToken = _rewardsToken; rewardsToken1 = _rewardsToken1; bridgeTokens = _bridgeTokens; _rewardsToken.safeApprove(address(_router), uint256(-1)); _underlying.safeApprove(address(gauge), uint256(-1)); for (uint i = 0; i < _bridgeTokens.length; i++) { _bridgeTokens[i].safeApprove(address(_router), uint256(-1)); } } /*** PoolToken Overrides ***/ function _update() internal { uint256 _totalBalance = ISolidlyGauge7(gauge).balanceOf(address(this)); totalBalance = _totalBalance; emit Sync(_totalBalance); } // this low-level function should be called from another contract function mint(address minter) external nonReentrant update returns (uint mintTokens) { uint mintAmount = underlying.myBalance(); // handle pools with deposit fees by checking balance before and after deposit uint256 _totalBalanceBefore = ISolidlyGauge7(gauge).balanceOf(address(this)); ISolidlyGauge7(gauge).deposit(mintAmount); uint256 _totalBalanceAfter = ISolidlyGauge7(gauge).balanceOf(address(this)); mintTokens = _totalBalanceAfter.sub(_totalBalanceBefore).mul(1e18).div(exchangeRate()); if(totalSupply == 0) { // permanently lock the first MINIMUM_LIQUIDITY tokens mintTokens = mintTokens.sub(MINIMUM_LIQUIDITY); _mint(address(0), MINIMUM_LIQUIDITY); } require(mintTokens > 0, "StakedLPToken: MINT_AMOUNT_ZERO"); _mint(minter, mintTokens); emit Mint(msg.sender, minter, mintAmount, mintTokens); } // this low-level function should be called from another contract function redeem(address redeemer) external nonReentrant update returns (uint redeemAmount) { uint redeemTokens = balanceOf[address(this)]; redeemAmount = redeemTokens.mul(exchangeRate()).div(1e18); require(redeemAmount > 0, "StakedLPToken: REDEEM_AMOUNT_ZERO"); require(redeemAmount <= totalBalance, "StakedLPToken: INSUFFICIENT_CASH"); _burn(address(this), redeemTokens); ISolidlyGauge7(gauge).withdraw(redeemAmount); _safeTransfer(redeemer, redeemAmount); emit Redeem(msg.sender, redeemer, redeemAmount, redeemTokens); } /*** Reinvest ***/ function _optimalDepositA(uint256 amountA, uint256 reserveA) internal pure returns (uint256) { uint256 a = uint256(1997).mul(reserveA); uint256 b = amountA.mul(1000).mul(reserveA).mul(3988); uint256 c = Math.sqrt(a.mul(a).add(b)); return c.sub(a).div(1994); } function approveRouter(address token, uint256 amount) internal { if (IERC20(token).allowance(address(this), router) >= amount) return; token.safeApprove(address(router), uint256(-1)); } function swapExactTokensForTokens(address tokenIn, address tokenOut, uint256 amount) internal { approveRouter(tokenIn, amount); IBaseV1Router02.Route[] memory path = new IBaseV1Router02.Route[](1); path[0] = IBaseV1Router02.Route(tokenIn, tokenOut, false); IBaseV1Router02(router).swapExactTokensForTokens(amount, 0, path, address(this), now); } function addLiquidity(address tokenA, address tokenB, uint256 amountA, uint256 amountB) internal returns (uint256 liquidity) { approveRouter(tokenA, amountA); approveRouter(tokenB, amountB); (,,liquidity) = IBaseV1Router02(router).addLiquidity(tokenA, tokenB, false, amountA, amountB, 0, 0, address(this), now); } function swapReward1ToReward() internal { uint rewards1Balance = rewardsToken1.myBalance(); if(rewards1Balance > 0) { IXShadow(rewardsToken1).exit(rewards1Balance); } } function _getReward() internal returns (uint256) { address[] memory rewardTokens = new address[](2); rewardTokens[0] = rewardsToken; rewardTokens[1] = rewardsToken1; ISolidlyGauge7(gauge).getReward(address(this), rewardTokens); swapReward1ToReward(); return rewardsToken.myBalance(); } function getReward() external nonReentrant returns (uint256) { require(msg.sender == tx.origin); return _getReward(); } function _swapWithBestBridge() internal view returns (address bestBridgeToken, uint bestIndex) { for (uint i = 0; i < bridgeTokens.length; i++) { if (token0 == bridgeTokens[i]) return (bridgeTokens[i], 0); if (token1 == bridgeTokens[i]) return (bridgeTokens[i], 1); } (uint256 r0, uint256 r1,) = IUniswapV2Pair(underlying).getReserves(); address[2] memory tokens = [token0, token1]; uint[2] memory reserves = [r0, r1]; bestBridgeToken = bridgeTokens[0]; bestIndex = 0; uint bestLiquidity = 0; address pairFactory = IBaseV1Router02(router).factory(); for (uint i = 0; i < bridgeTokens.length; i++) { for (uint j = 0; j < 2; j++) { address pair = IBaseV1Factory(pairFactory).getPair(tokens[j], bridgeTokens[i], false); if (pair == address(0)) continue; uint liquidity = tokens[j].balanceOf(pair).mul(1e18).div(reserves[j]); if (liquidity > bestLiquidity) { bestLiquidity = liquidity; bestIndex = j; bestBridgeToken = bridgeTokens[i]; } } } return (bestBridgeToken, bestIndex); } function reinvest() external nonReentrant update { require(msg.sender == tx.origin); // 1. Withdraw all the rewards. uint256 reward = _getReward(); if (reward == 0) return; // 2. Send the reward bounty to the caller. uint256 bounty = reward.mul(REINVEST_BOUNTY) / 1e18; rewardsToken.safeTransfer(msg.sender, bounty); // 3. Convert all the remaining rewards to token0 or token1. address tokenA; address tokenB; if (token0 == rewardsToken || token1 == rewardsToken) { (tokenA, tokenB) = token0 == rewardsToken ? (token0, token1) : (token1, token0); } else { (address bridgeToken, uint index) = _swapWithBestBridge(); swapExactTokensForTokens(rewardsToken, bridgeToken, reward.sub(bounty)); if (token0 == bridgeToken || token1 == bridgeToken) { (tokenA, tokenB) = token0 == bridgeToken ? (token0, token1) : (token1, token0); } else { swapExactTokensForTokens(bridgeToken, index == 0 ? token0 : token1, bridgeToken.myBalance()); (tokenA, tokenB) = index == 0 ? (token0, token1) : (token1, token0); } } // 4. Convert tokenA to LP Token underlyings. uint256 totalAmountA = tokenA.myBalance(); assert(totalAmountA > 0); (uint256 r0, uint256 r1,) = IUniswapV2Pair(underlying).getReserves(); uint256 reserveA = tokenA == token0 ? r0 : r1; uint256 swapAmount = _optimalDepositA(totalAmountA, reserveA); swapExactTokensForTokens(tokenA, tokenB, swapAmount); uint256 liquidity = addLiquidity(tokenA, tokenB, totalAmountA.sub(swapAmount), tokenB.myBalance()); // 5. Stake the LP Tokens. ISolidlyGauge7(gauge).deposit(liquidity); emit Reinvest(msg.sender, reward, bounty); } /*** Mirrored From uniswapV2Pair ***/ function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast) { (uint _reserve0, uint _reserve1, uint _blockTimestampLast) = IUniswapV2Pair(underlying).getReserves(); reserve0 = safe112(_reserve0); reserve1 = safe112(_reserve1); blockTimestampLast = uint32(_blockTimestampLast % 2**32); // if no token has been minted yet mirror uniswap getReserves if (totalSupply == 0) return (reserve0, reserve1, blockTimestampLast); // else, return the underlying reserves of this contract uint256 _totalBalance = totalBalance; uint256 _totalSupply = IUniswapV2Pair(underlying).totalSupply(); reserve0 = safe112(_totalBalance.mul(reserve0).div(_totalSupply)); reserve1 = safe112(_totalBalance.mul(reserve1).div(_totalSupply)); require(reserve0 > 100 && reserve1 > 100, "StakedLPToken: INSUFFICIENT_RESERVES"); } function observationLength() external view returns (uint) { return IBaseV1Pair(underlying).observationLength(); } function observations(uint index) external view returns ( uint timestamp, uint reserve0Cumulative, uint reserve1Cumulative ) { return IBaseV1Pair(underlying).observations(index); } function currentCumulativePrices() external view returns ( uint reserve0Cumulative, uint reserve1Cumulative, uint timestamp ) { return IBaseV1Pair(underlying).currentCumulativePrices(); } /*** Utilities ***/ function safe112(uint n) internal pure returns (uint112) { require(n < 2**112, "StakedLPToken: SAFE112"); return uint112(n); } } // File extra/uniswap/staked-lp-token/StakedLPTokenFactorySolidlyBase7.sol pragma solidity =0.5.16; // updated codebase for thena v2 and pearl contract StakedLPTokenFactorySolidlyBase7 { address public router; address public voter; address public rewardsToken; address public rewardsToken1; address[] public bridgeTokens; mapping(address => address) public getStakedLPToken; address[] public allStakedLPToken; event StakedLPTokenCreated(address indexed token0, address indexed token1, address indexed pair, address stakedLPToken, uint); constructor(address _router, address _voter, address _rewardsToken, address _rewardsToken1, address[] memory _bridgeTokens) public { router = _router; voter = _voter; rewardsToken = _rewardsToken; rewardsToken1 = _rewardsToken1; bridgeTokens = _bridgeTokens; } function allStakedLPTokenLength() external view returns (uint) { return allStakedLPToken.length; } function createStakedLPToken(address pair) external returns (address stakedLPToken) { require(getStakedLPToken[pair] == address(0), "StakedLPTokenFactory: POOL_EXISTS"); require(!IBaseV1Pair(pair).stable(), "StakedLPTokenFactory: STABLE_PAIR"); address token0 = IUniswapV2Pair(pair).token0(); address token1 = IUniswapV2Pair(pair).token1(); bytes memory bytecode = type(StakedLPTokenSolidlyBase7).creationCode; assembly { stakedLPToken := create2(0, add(bytecode, 32), mload(bytecode), pair) } StakedLPTokenSolidlyBase7(stakedLPToken)._initialize(pair, token0, token1, router, voter, rewardsToken, rewardsToken1, bridgeTokens); getStakedLPToken[pair] = stakedLPToken; allStakedLPToken.push(stakedLPToken); emit StakedLPTokenCreated(token0, token1, pair, stakedLPToken, allStakedLPToken.length); } }
{ "optimizer": { "enabled": true, "runs": 999999 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"mintAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mintTokens","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"redeemer","type":"address"},{"indexed":false,"internalType":"uint256","name":"redeemAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"redeemTokens","type":"uint256"}],"name":"Redeem","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bounty","type":"uint256"}],"name":"Reinvest","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"totalBalance","type":"uint256"}],"name":"Sync","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"constant":true,"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MINIMUM_LIQUIDITY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"REINVEST_BOUNTY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_underlying","type":"address"},{"internalType":"address","name":"_token0","type":"address"},{"internalType":"address","name":"_token1","type":"address"},{"internalType":"address","name":"_router","type":"address"},{"internalType":"address","name":"_voter","type":"address"},{"internalType":"address","name":"_rewardsToken","type":"address"},{"internalType":"address","name":"_rewardsToken1","type":"address"},{"internalType":"address[]","name":"_bridgeTokens","type":"address[]"}],"name":"_initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"_setFactory","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"bridgeTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"currentCumulativePrices","outputs":[{"internalType":"uint256","name":"reserve0Cumulative","type":"uint256"},{"internalType":"uint256","name":"reserve1Cumulative","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"exchangeRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"gauge","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getReserves","outputs":[{"internalType":"uint112","name":"reserve0","type":"uint112"},{"internalType":"uint112","name":"reserve1","type":"uint112"},{"internalType":"uint32","name":"blockTimestampLast","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"getReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isStakedLPToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"mint","outputs":[{"internalType":"uint256","name":"mintTokens","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"observationLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"observations","outputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"reserve0Cumulative","type":"uint256"},{"internalType":"uint256","name":"reserve1Cumulative","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"redeemer","type":"address"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"redeemAmount","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"reinvest","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"rewardsToken","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rewardsToken1","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"router","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"skim","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"stable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"stakedLPTokenType","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"sync","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"token0","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"token1","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"underlying","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040526002805460ff19908116601217909155600b80549091166001179055614cd78061002f6000396000f3fe608060405234801561001057600080fd5b50600436106102d35760003560e01c806370e5a89811610186578063c45a0155116100e3578063e8bea16711610097578063f887ea4011610071578063f887ea4014610501578063fdb5a03e14610509578063fff6cae914610511576102d3565b8063e8bea167146104de578063ebce9331146104e6578063ebeb31db146104f9576102d3565b8063d21220a7116100c8578063d21220a7146104b0578063d505accf146104b8578063dd62ed3e146104cb576102d3565b8063c45a0155146104a0578063d1af0c7d146104a8576102d3565b8063a6f19c841161013a578063ad7a672f1161011f578063ad7a672f1461047d578063ba9a7a5614610485578063bc25cf771461048d576102d3565b8063a6f19c8414610462578063a9059cbb1461046a576102d3565b80638950b9a61161016b5780638950b9a61461043f57806395a2251f1461044757806395d89b411461045a576102d3565b806370e5a898146104195780637ecebe001461042c576102d3565b806330adf81f116102345780634a5d316c116101e85780636c2a3bc5116101cd5780636c2a3bc5146103f65780636f307dc3146103fe57806370a0823114610406576102d3565b80634a5d316c146103d95780636a627842146103e3576102d3565b80633644e515116102195780633644e515146103c15780633ba0b9a9146103c95780633d18b912146103d1576102d3565b806330adf81f146103a4578063313ce567146103ac576102d3565b806318160ddd1161028b57806322be3de11161027057806322be3de11461037657806323b872dd1461037e578063252c09d714610391576102d3565b806318160ddd1461034a5780631df8c7171461035f576102d3565b8063095ea7b3116102bc578063095ea7b31461030d5780630a6410631461032d5780630dfe168114610335576102d3565b806306fdde03146102d85780630902f1ac146102f6575b600080fd5b6102e0610519565b6040516102ed9190614988565b60405180910390f35b6102fe6105c5565b6040516102ed93929190614a99565b61032061031b366004613f55565b610853565b6040516102ed919061489d565b61032061086a565b61033d61086f565b6040516102ed919061478b565b610352610890565b6040516102ed91906148ab565b610367610896565b6040516102ed93929190614b18565b610320610946565b61032061038c366004613e6c565b61094b565b61036761039f36600461401b565b610a60565b610352610b18565b6103b4610b3c565b6040516102ed9190614b40565b610352610b45565b610352610b4b565b610352610b9b565b6103e1610c46565b005b6103526103f1366004613d22565b610cc2565b610352611075565b61033d611080565b610352610414366004613d22565b61109c565b61033d61042736600461401b565b6110ae565b61035261043a366004613d22565b6110e2565b61033d6110f4565b610352610455366004613d22565b611110565b6102e061132f565b61033d6113a7565b610320610478366004613f55565b6113c3565b6103526113d0565b6103526113d6565b6103e161049b366004613d22565b6113dc565b61033d611532565b61033d61154e565b61033d61156a565b6103e16104c6366004613eb9565b611586565b6103526104d9366004613d66565b6115ca565b6102e06115e7565b6103e16104f4366004613da0565b611620565b610352611a21565b61033d611ac9565b6103e1611ae5565b6103e1612103565b6000805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f810184900484028201840190925281815292918301828280156105bd5780601f10610592576101008083540402835291602001916105bd565b820191906000526020600020905b8154815290600101906020018083116105a057829003601f168201915b505050505081565b600080600080600080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561063657600080fd5b505afa15801561064a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061066e9190810190613fd8565b63ffffffff1692506dffffffffffffffffffffffffffff1692506dffffffffffffffffffffffffffff1692506106a38361216f565b95506106ae8261216f565b945064010000000081069350600354600014156106ce575061084e915050565b600a54600854604080517f18160ddd000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff16916318160ddd916004808301926020929190829003018186803b15801561073c57600080fd5b505afa158015610750573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506107749190810190614039565b90506107ae6107a98261079d856dffffffffffffffffffffffffffff8d1663ffffffff6121c116565b9063ffffffff61221516565b61216f565b97506107d76107a98261079d856dffffffffffffffffffffffffffff8c1663ffffffff6121c116565b96506064886dffffffffffffffffffffffffffff1611801561080957506064876dffffffffffffffffffffffffffff16115b610848576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f906149d9565b60405180910390fd5b50505050505b909192565b6000610860338484612257565b5060015b92915050565b600181565b600b54610100900473ffffffffffffffffffffffffffffffffffffffff1681565b60035481565b6000806000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631df8c7176040518163ffffffff1660e01b815260040160606040518083038186803b15801561090357600080fd5b505afa158015610917573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061093b9190810190614057565b925092509250909192565b600081565b73ffffffffffffffffffffffffffffffffffffffff831660009081526005602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14610a4a57604080518082018252601e81527f496d7065726d61783a205452414e534645525f4e4f545f414c4c4f574544000060208083019190915273ffffffffffffffffffffffffffffffffffffffff87166000908152600582528381203382529091529190912054610a1891849063ffffffff6122cc16565b73ffffffffffffffffffffffffffffffffffffffff851660009081526005602090815260408083203384529091529020555b610a55848484612312565b5060015b9392505050565b6008546040517f252c09d70000000000000000000000000000000000000000000000000000000081526000918291829173ffffffffffffffffffffffffffffffffffffffff169063252c09d790610abb9087906004016148ab565b60606040518083038186803b158015610ad357600080fd5b505afa158015610ae7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610b0b9190810190614057565b9250925092509193909250565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60025460ff1681565b60065481565b600354600a5460009190811580610b60575080155b15610b7757670de0b6b3a764000092505050610b98565b610b938261079d83670de0b6b3a764000063ffffffff6121c116565b925050505b90565b600b5460009060ff16610bda576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90614a89565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055333214610c0e57600080fd5b610c16612421565b9050600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905590565b60095473ffffffffffffffffffffffffffffffffffffffff1615610c96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f906149a9565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001633179055565b600b5460009060ff16610d01576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90614a89565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600854600090610d4e9073ffffffffffffffffffffffffffffffffffffffff1661256d565b600e546040517f70a0823100000000000000000000000000000000000000000000000000000000815291925060009173ffffffffffffffffffffffffffffffffffffffff909116906370a0823190610daa90309060040161478b565b60206040518083038186803b158015610dc257600080fd5b505afa158015610dd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610dfa9190810190614039565b600e546040517fb6b55f2500000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff169063b6b55f2590610e519085906004016148ab565b600060405180830381600087803b158015610e6b57600080fd5b505af1158015610e7f573d6000803e3d6000fd5b5050600e546040517f70a082310000000000000000000000000000000000000000000000000000000081526000935073ffffffffffffffffffffffffffffffffffffffff90911691506370a0823190610edc90309060040161478b565b60206040518083038186803b158015610ef457600080fd5b505afa158015610f08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610f2c9190810190614039565b9050610f61610f39610b4b565b61079d670de0b6b3a7640000610f55858763ffffffff61261216565b9063ffffffff6121c116565b935060035460001415610f8f57610f80846103e863ffffffff61261216565b9350610f8f60006103e8612654565b60008411610fc9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f906149b9565b610fd38585612654565b8473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f2f00e3cdd69a77be7ed215ec7b2a36784dd158f921fca79ac29deffa353fe6ee8587604051611032929190614b0a565b60405180910390a3505050611045612708565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055919050565b66470de4df82000081565b60085473ffffffffffffffffffffffffffffffffffffffff1681565b60046020526000908152604090205481565b601181815481106110bb57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b60076020526000908152604090205481565b60105473ffffffffffffffffffffffffffffffffffffffff1681565b600b5460009060ff1661114f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90614a89565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055306000908152600460205260409020546111ab670de0b6b3a764000061079d61119e610b4b565b849063ffffffff6121c116565b9150600082116111e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f906149f9565b600a54821115611223576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90614a49565b61122d30826127f2565b600e546040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690632e1a7d4d906112839085906004016148ab565b600060405180830381600087803b15801561129d57600080fd5b505af11580156112b1573d6000803e3d6000fd5b505050506112bf83836128af565b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f3f693fff038bb8a046aa76d9516190ac7444f7d69cf952c4cbdc086fdef2d6fc848460405161131e929190614b0a565b60405180910390a350611045612708565b60018054604080516020600284861615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f810184900484028201840190925281815292918301828280156105bd5780601f10610592576101008083540402835291602001916105bd565b600e5473ffffffffffffffffffffffffffffffffffffffff1681565b6000610860338484612312565b600a5481565b6103e881565b600b5460ff16611418576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90614a89565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600a546008546040517f70a082310000000000000000000000000000000000000000000000000000000081526115049284926114ff9273ffffffffffffffffffffffffffffffffffffffff909116906370a08231906114a390309060040161478b565b60206040518083038186803b1580156114bb57600080fd5b505afa1580156114cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506114f39190810190614039565b9063ffffffff61261216565b6128af565b50600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60095473ffffffffffffffffffffffffffffffffffffffff1681565b600f5473ffffffffffffffffffffffffffffffffffffffff1681565b600c5473ffffffffffffffffffffffffffffffffffffffff1681565b6115b6878787878787877f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9612a69565b6115c1878787612257565b50505050505050565b600560209081526000928352604080842090915290825290205481565b6040518060400160405280600c81526020017f536f6c69646c794261736537000000000000000000000000000000000000000081525081565b60095473ffffffffffffffffffffffffffffffffffffffff1615611670576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90614a59565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001633179055604080518082018252601181527f5374616b656420556e69737761702056320000000000000000000000000000006020808301919091528251808401909352600b83527f53544b442d554e492d56320000000000000000000000000000000000000000009083015261170b91612c28565b600880547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff8c811691909117909255600b80547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101008c851602179055600c805482168a8416179055600d80549091168883161790556040517f2045be9000000000000000000000000000000000000000000000000000000000815290861690632045be90906117d9908c9060040161478b565b60206040518083038186803b1580156117f157600080fd5b505afa158015611805573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506118299190810190613d48565b600e80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9283161790819055166118a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90614a79565b600f805473ffffffffffffffffffffffffffffffffffffffff8087167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255601080549286169290911691909117905561190460118383613a6c565b5061194c73ffffffffffffffffffffffffffffffffffffffff8516877fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff63ffffffff612d1616565b600e546119999073ffffffffffffffffffffffffffffffffffffffff8b811691167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff63ffffffff612d1616565b60005b81811015611a1557611a0d877fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8585858181106119d557fe5b90506020020160206119ea9190810190613d22565b73ffffffffffffffffffffffffffffffffffffffff16919063ffffffff612d1616565b60010161199c565b50505050505050505050565b600854604080517febeb31db000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163ebeb31db916004808301926020929190829003018186803b158015611a8c57600080fd5b505afa158015611aa0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611ac49190810190614039565b905090565b600d5473ffffffffffffffffffffffffffffffffffffffff1681565b600b5460ff16611b21576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90614a89565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055333214611b5557600080fd5b6000611b5f612421565b905080611b6c57506120ce565b6000670de0b6b3a7640000611b8e8366470de4df82000063ffffffff6121c116565b81611b9557fe5b600f549190049150611bc49073ffffffffffffffffffffffffffffffffffffffff16338363ffffffff612e4016565b600f54600b546000918291610100900473ffffffffffffffffffffffffffffffffffffffff90811691161480611c175750600f54600c5473ffffffffffffffffffffffffffffffffffffffff9081169116145b15611ca157600f54600b54610100900473ffffffffffffffffffffffffffffffffffffffff908116911614611c7157600c54600b5473ffffffffffffffffffffffffffffffffffffffff9182169161010090910416611c97565b600b54600c5473ffffffffffffffffffffffffffffffffffffffff610100909204821691165b9092509050611e79565b600080611cac612f63565b600f549193509150611ce49073ffffffffffffffffffffffffffffffffffffffff1683611cdf898963ffffffff61261216565b61343c565b600b5473ffffffffffffffffffffffffffffffffffffffff838116610100909204161480611d2c5750600c5473ffffffffffffffffffffffffffffffffffffffff8381169116145b15611db357600b5473ffffffffffffffffffffffffffffffffffffffff8381166101009092041614611d8357600c54600b5473ffffffffffffffffffffffffffffffffffffffff9182169161010090910416611da9565b600b54600c5473ffffffffffffffffffffffffffffffffffffffff610100909204821691165b9094509250611e76565b611e19828215611ddb57600c5473ffffffffffffffffffffffffffffffffffffffff16611dfa565b600b54610100900473ffffffffffffffffffffffffffffffffffffffff165b611cdf8573ffffffffffffffffffffffffffffffffffffffff1661256d565b8015611e4a57600c54600b5473ffffffffffffffffffffffffffffffffffffffff9182169161010090910416611e70565b600b54600c5473ffffffffffffffffffffffffffffffffffffffff610100909204821691165b90945092505b50505b6000611e9a8373ffffffffffffffffffffffffffffffffffffffff1661256d565b905060008111611ea657fe5b600080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015611f1157600080fd5b505afa158015611f25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611f499190810190613fd8565b50600b546dffffffffffffffffffffffffffff92831694509116915060009073ffffffffffffffffffffffffffffffffffffffff8781166101009092041614611f925781611f94565b825b90506000611fa285836135af565b9050611faf87878361343c565b6000611fea8888611fc6898663ffffffff61261216565b611fe58b73ffffffffffffffffffffffffffffffffffffffff1661256d565b613630565b600e546040517fb6b55f2500000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff169063b6b55f25906120419084906004016148ab565b600060405180830381600087803b15801561205b57600080fd5b505af115801561206f573d6000803e3d6000fd5b505050503373ffffffffffffffffffffffffffffffffffffffff167fc003f45bc224d116b6d079100d4ab57a5b9633244c47a5a92a176c5b79a85f288b8b6040516120bb929190614b0a565b60405180910390a2505050505050505050505b6120d6612708565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b600b5460ff1661213f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90614a89565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556120d6612708565b60006e01000000000000000000000000000082106121b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90614a19565b50805b919050565b6000826121d057506000610864565b828202828482816121dd57fe5b0414610a59576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90614a29565b6000610a5983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061370a565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526005602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906122bf9085906148ab565b60405180910390a3505050565b6000818484111561230a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f9190614988565b505050900390565b604080518082018252601b81527f496d7065726d61783a205452414e534645525f544f4f5f48494748000000000060208083019190915273ffffffffffffffffffffffffffffffffffffffff861660009081526004909152919091205461238091839063ffffffff6122cc16565b73ffffffffffffffffffffffffffffffffffffffff80851660009081526004602052604080822093909355908416815220546123c2908263ffffffff61375b16565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526004602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906122bf9085906148ab565b60408051600280825260608083018452600093909291906020830190803883395050600f54825192935073ffffffffffffffffffffffffffffffffffffffff169183915060009061246e57fe5b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920101526010548251911690829060019081106124a657fe5b73ffffffffffffffffffffffffffffffffffffffff9283166020918202929092010152600e546040517f31279d3d0000000000000000000000000000000000000000000000000000000081529116906331279d3d9061250b9030908590600401614862565b600060405180830381600087803b15801561252557600080fd5b505af1158015612539573d6000803e3d6000fd5b5050505061254561379a565b600f546125679073ffffffffffffffffffffffffffffffffffffffff1661256d565b91505090565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8316906370a08231906125c290309060040161478b565b60206040518083038186803b1580156125da57600080fd5b505afa1580156125ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506108649190810190614039565b6000610a5983836040518060400160405280601f81526020017f536166654d6174683a207375627472616374696f6e20756e646572666c6f77008152506122cc565b600354612667908263ffffffff61375b16565b60035573ffffffffffffffffffffffffffffffffffffffff82166000908152600460205260409020546126a0908263ffffffff61375b16565b73ffffffffffffffffffffffffffffffffffffffff83166000818152600460205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906126fc9085906148ab565b60405180910390a35050565b600e546040517f70a0823100000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906370a082319061275f90309060040161478b565b60206040518083038186803b15801561277757600080fd5b505afa15801561278b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506127af9190810190614039565b905080600a819055507f8a0df8ef054fae2c3d2d19a7b322e864870cc9fd3cb07fb9526309c596244bf4816040516127e791906148ab565b60405180910390a150565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260046020526040902054612828908263ffffffff61261216565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260046020526040902055600354612861908263ffffffff61261216565b60035560405160009073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906126fc9085906148ab565b600854604080518082018252601981527f7472616e7366657228616464726573732c75696e7432353629000000000000006020909101525160009160609173ffffffffffffffffffffffffffffffffffffffff909116907fa9059cbb2ab09eb219583f4a59a5d0623ade346d962bcd4e46b11da047c9049b906129389087908790602401614882565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516129c19190614743565b6000604051808303816000865af19150503d80600081146129fe576040519150601f19603f3d011682016040523d82523d6000602084013e612a03565b606091505b5091509150818015612a2d575080511580612a2d575080806020019051612a2d9190810190613fba565b612a63576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90614a69565b50505050565b42851015612aa3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90614999565b60065473ffffffffffffffffffffffffffffffffffffffff891660009081526007602090815260408083208054600181019091559051929392612af19286928e928e928e92918e91016148b9565b60405160208183030381529060405280519060200120604051602001612b1892919061474f565b604051602081830303815290604052805190602001209050600060018287878760405160008152602001604052604051612b55949392919061494a565b6020604051602081039080840390855afa158015612b77573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590612bf257508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b611a15576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90614a09565b8151612c3b906000906020850190613af4565b508051612c4f906001906020840190613af4565b506040514690612c5e90614780565b6040805191829003822085516020808801919091208484018452600185527f3100000000000000000000000000000000000000000000000000000000000000948201949094529151612cd89391927fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6918691309101614908565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120600655505050565b600060608473ffffffffffffffffffffffffffffffffffffffff1663095ea7b38585604051602401612d49929190614882565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051612d979190614743565b6000604051808303816000865af19150503d8060008114612dd4576040519150601f19603f3d011682016040523d82523d6000602084013e612dd9565b606091505b5091509150818015612e03575080511580612e03575080806020019051612e039190810190613fba565b612e39576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f906149c9565b5050505050565b600060608473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401612e73929190614882565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051612ec19190614743565b6000604051808303816000865af19150503d8060008114612efe576040519150601f19603f3d011682016040523d82523d6000602084013e612f03565b606091505b5091509150818015612f2d575080511580612f2d575080806020019051612f2d9190810190613fba565b612e39576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90614a39565b600080805b60115481101561306c5760118181548110612f7f57fe5b600091825260209091200154600b54610100900473ffffffffffffffffffffffffffffffffffffffff90811691161415612fec5760118181548110612fc057fe5b600091825260208220015473ffffffffffffffffffffffffffffffffffffffff16935091506134389050565b60118181548110612ff957fe5b600091825260209091200154600c5473ffffffffffffffffffffffffffffffffffffffff90811691161415613064576011818154811061303557fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169250600191506134389050565b600101612f68565b50600080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156130d857600080fd5b505afa1580156130ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506131109190810190613fd8565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff16915061313d613b6e565b5060408051808201909152600b5473ffffffffffffffffffffffffffffffffffffffff61010090910481168252600c5416602082015261317b613b6e565b604051806040016040528085815260200184815250905060116000815481106131a057fe5b600091825260208083209190910154600d54604080517fc45a0155000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9384169b5094995089948594939092169263c45a015592600480840193829003018186803b15801561322157600080fd5b505afa158015613235573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506132599190810190613d48565b905060005b6011548110156134305760005b60028110156134275760008373ffffffffffffffffffffffffffffffffffffffff16636801cc3088846002811061329e57fe5b6020020151601186815481106132b057fe5b60009182526020822001546040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815261330e939273ffffffffffffffffffffffffffffffffffffffff90921691906004016147b4565b60206040518083038186803b15801561332657600080fd5b505afa15801561333a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061335e9190810190613d48565b905073ffffffffffffffffffffffffffffffffffffffff8116613381575061341f565b60006133da87846002811061339257fe5b602002015161079d670de0b6b3a7640000610f55868d89600281106133b357fe5b602002015173ffffffffffffffffffffffffffffffffffffffff169063ffffffff61387416565b90508581111561341c57809550829a50601184815481106133f757fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169b505b50505b60010161326b565b5060010161325e565b505050505050505b9091565b6134468382613919565b604080516001808252818301909252606091816020015b613465613b8c565b81526020019060019003908161345d57905050905060405180606001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff16815260200160001515815250816000815181106134d157fe5b6020908102919091010152600d546040517ff41766d800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063f41766d89061353b908590600090869030904290600401614ac1565b600060405180830381600087803b15801561355557600080fd5b505af1158015613569573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052612e399190810190613f85565b6000806135c46107cd8463ffffffff6121c116565b905060006135e2610f94610f558681896103e863ffffffff6121c116565b9050600061360e613609836135fd868063ffffffff6121c116565b9063ffffffff61375b16565b613a1b565b90506136266107ca61079d838663ffffffff61261216565b9695505050505050565b600061363c8584613919565b6136468483613919565b600d546040517f5a47ddc300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690635a47ddc3906136ad90889088906000908990899083908190309042906004016147dc565b606060405180830381600087803b1580156136c757600080fd5b505af11580156136db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506136ff9190810190614057565b979650505050505050565b60008183613745576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f9190614988565b50600083858161375157fe5b0495945050505050565b600082820183811015610a59576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f906149e9565b6010546000906137bf9073ffffffffffffffffffffffffffffffffffffffff1661256d565b90508015613871576010546040517f7f8661a100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690637f8661a19061381d9084906004016148ab565b602060405180830381600087803b15801561383757600080fd5b505af115801561384b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061386f9190810190614039565b505b50565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8416906370a08231906138c990859060040161478b565b60206040518083038186803b1580156138e157600080fd5b505afa1580156138f5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610a599190810190614039565b600d546040517fdd62ed3e000000000000000000000000000000000000000000000000000000008152829173ffffffffffffffffffffffffffffffffffffffff8086169263dd62ed3e92613974923092911690600401614799565b60206040518083038186803b15801561398c57600080fd5b505afa1580156139a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506139c49190810190614039565b106139ce5761386f565b600d5461386f9073ffffffffffffffffffffffffffffffffffffffff84811691167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff63ffffffff612d1616565b60006003821115613a5e575080600160028204015b81811015613a5857809150600281828581613a4757fe5b040181613a5057fe5b049050613a30565b506121bc565b81156121bc57506001919050565b828054828255906000526020600020908101928215613ae4579160200282015b82811115613ae45781547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff843516178255602090920191600190910190613a8c565b50613af0929150613bac565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613b3557805160ff1916838001178555613b62565b82800160010185558215613b62579182015b82811115613b62578251825591602001919060010190613b47565b50613af0929150613be8565b60405180604001604052806002906020820280388339509192915050565b604080516060810182526000808252602082018190529181019190915290565b610b9891905b80821115613af05780547fffffffffffffffffffffffff0000000000000000000000000000000000000000168155600101613bb2565b610b9891905b80821115613af05760008155600101613bee565b803561086481614c53565b805161086481614c53565b60008083601f840112613c2a57600080fd5b50813567ffffffffffffffff811115613c4257600080fd5b602083019150836020820283011115613c5a57600080fd5b9250929050565b600082601f830112613c7257600080fd5b8151613c85613c8082614b75565b614b4e565b91508181835260208401935060208101905083856020840282011115613caa57600080fd5b60005b83811015613cd65781613cc08882613d01565b8452506020928301929190910190600101613cad565b5050505092915050565b805161086481614c67565b803561086481614c70565b805161086481614c79565b805161086481614c70565b805161086481614c82565b803561086481614c8b565b600060208284031215613d3457600080fd5b6000613d408484613c02565b949350505050565b600060208284031215613d5a57600080fd5b6000613d408484613c0d565b60008060408385031215613d7957600080fd5b6000613d858585613c02565b9250506020613d9685828601613c02565b9150509250929050565b60008060008060008060008060006101008a8c031215613dbf57600080fd5b6000613dcb8c8c613c02565b9950506020613ddc8c828d01613c02565b9850506040613ded8c828d01613c02565b9750506060613dfe8c828d01613c02565b9650506080613e0f8c828d01613c02565b95505060a0613e208c828d01613c02565b94505060c0613e318c828d01613c02565b93505060e08a013567ffffffffffffffff811115613e4e57600080fd5b613e5a8c828d01613c18565b92509250509295985092959850929598565b600080600060608486031215613e8157600080fd5b6000613e8d8686613c02565b9350506020613e9e86828701613c02565b9250506040613eaf86828701613ceb565b9150509250925092565b600080600080600080600060e0888a031215613ed457600080fd5b6000613ee08a8a613c02565b9750506020613ef18a828b01613c02565b9650506040613f028a828b01613ceb565b9550506060613f138a828b01613ceb565b9450506080613f248a828b01613d17565b93505060a0613f358a828b01613ceb565b92505060c0613f468a828b01613ceb565b91505092959891949750929550565b60008060408385031215613f6857600080fd5b6000613f748585613c02565b9250506020613d9685828601613ceb565b600060208284031215613f9757600080fd5b815167ffffffffffffffff811115613fae57600080fd5b613d4084828501613c61565b600060208284031215613fcc57600080fd5b6000613d408484613ce0565b600080600060608486031215613fed57600080fd5b6000613ff98686613cf6565b935050602061400a86828701613cf6565b9250506040613eaf86828701613d0c565b60006020828403121561402d57600080fd5b6000613d408484613ceb565b60006020828403121561404b57600080fd5b6000613d408484613d01565b60008060006060848603121561406c57600080fd5b60006140788686613d01565b935050602061408986828701613d01565b9250506040613eaf86828701613d01565b60006140a683836140c2565b505060200190565b60006140ba83836146f1565b505060600190565b6140cb81614ba9565b82525050565b60006140dc82614b9c565b6140e68185614ba0565b93506140f183614b96565b8060005b8381101561411f578151614109888261409a565b975061411483614b96565b9250506001016140f5565b509495945050505050565b600061413582614b9c565b61413f8185614ba0565b935061414a83614b96565b8060005b8381101561411f57815161416288826140ae565b975061416d83614b96565b92505060010161414e565b6140cb81614bb4565b6140cb81610b98565b6140cb61419682610b98565b610b98565b60006141a682614b9c565b6141b081856121bc565b93506141c0818560208601614bff565b9290920192915050565b6140cb81614bf4565b60006141de82614b9c565b6141e88185614ba0565b93506141f8818560208601614bff565b61420181614c2b565b9093019392505050565b6000614218601183614ba0565b7f496d7065726d61783a2045585049524544000000000000000000000000000000815260200192915050565b6000614251601d83614ba0565b7f496d7065726d61783a20464143544f52595f414c52454144595f534554000000815260200192915050565b600061428a601f83614ba0565b7f5374616b65644c50546f6b656e3a204d494e545f414d4f554e545f5a45524f00815260200192915050565b60006142c3600c83614ba0565b7f2173616665417070726f76650000000000000000000000000000000000000000815260200192915050565b60006142fc602483614ba0565b7f5374616b65644c50546f6b656e3a20494e53554646494349454e545f5245534581527f5256455300000000000000000000000000000000000000000000000000000000602082015260400192915050565b600061435b6002836121bc565b7f1901000000000000000000000000000000000000000000000000000000000000815260020192915050565b6000614394601b83614ba0565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000815260200192915050565b60006143cd602183614ba0565b7f5374616b65644c50546f6b656e3a2052454445454d5f414d4f554e545f5a455281527f4f00000000000000000000000000000000000000000000000000000000000000602082015260400192915050565b600061442c601b83614ba0565b7f496d7065726d61783a20494e56414c49445f5349474e41545552450000000000815260200192915050565b6000614465601683614ba0565b7f5374616b65644c50546f6b656e3a205341464531313200000000000000000000815260200192915050565b600061449e6052836121bc565b7f454950373132446f6d61696e28737472696e67206e616d652c737472696e672081527f76657273696f6e2c75696e7432353620636861696e49642c616464726573732060208201527f766572696679696e67436f6e7472616374290000000000000000000000000000604082015260520192915050565b6000614523602183614ba0565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f81527f7700000000000000000000000000000000000000000000000000000000000000602082015260400192915050565b6000614582600d83614ba0565b7f21736166655472616e7366657200000000000000000000000000000000000000815260200192915050565b60006145bb602083614ba0565b7f5374616b65644c50546f6b656e3a20494e53554646494349454e545f43415348815260200192915050565b60006145f4602283614ba0565b7f5374616b65644c50546f6b656e3a20464143544f52595f414c52454144595f5381527f4554000000000000000000000000000000000000000000000000000000000000602082015260400192915050565b6000614653601983614ba0565b7f496d7065726d61783a205452414e534645525f4641494c454400000000000000815260200192915050565b600061468c601783614ba0565b7f5374616b65644c50546f6b656e3a204e4f5f4741554745000000000000000000815260200192915050565b60006146c5601383614ba0565b7f496d7065726d61783a205245454e544552454400000000000000000000000000815260200192915050565b8051606083019061470284826140c2565b50602082015161471560208501826140c2565b506040820151612a636040850182614178565b6140cb81614bb9565b6140cb81614be5565b6140cb81614bee565b6000610a59828461419b565b600061475a8261434e565b9150614766828561418a565b602082019150614776828461418a565b5060200192915050565b600061086482614491565b6020810161086482846140c2565b604081016147a782856140c2565b610a5960208301846140c2565b606081016147c282866140c2565b6147cf60208301856140c2565b613d406040830184614178565b61012081016147eb828c6140c2565b6147f8602083018b6140c2565b614805604083018a614178565b6148126060830189614181565b61481f6080830188614181565b61482c60a08301876141ca565b61483960c08301866141ca565b61484660e08301856140c2565b614854610100830184614181565b9a9950505050505050505050565b6040810161487082856140c2565b8181036020830152613d4081846140d1565b6040810161489082856140c2565b610a596020830184614181565b602081016108648284614178565b602081016108648284614181565b60c081016148c78289614181565b6148d460208301886140c2565b6148e160408301876140c2565b6148ee6060830186614181565b6148fb6080830185614181565b6136ff60a0830184614181565b60a081016149168288614181565b6149236020830187614181565b6149306040830186614181565b61493d6060830185614181565b61362660808301846140c2565b608081016149588287614181565b614965602083018661473a565b6149726040830185614181565b61497f6060830184614181565b95945050505050565b60208082528101610a5981846141d3565b602080825281016108648161420b565b6020808252810161086481614244565b602080825281016108648161427d565b60208082528101610864816142b6565b60208082528101610864816142ef565b6020808252810161086481614387565b60208082528101610864816143c0565b602080825281016108648161441f565b6020808252810161086481614458565b6020808252810161086481614516565b6020808252810161086481614575565b60208082528101610864816145ae565b60208082528101610864816145e7565b6020808252810161086481614646565b602080825281016108648161467f565b60208082528101610864816146b8565b60608101614aa78286614728565b614ab46020830185614728565b613d406040830184614731565b60a08101614acf8288614181565b614adc60208301876141ca565b8181036040830152614aee818661412a565b9050614afd60608301856140c2565b6136266080830184614181565b604081016148908285614181565b60608101614b268286614181565b614b336020830185614181565b613d406040830184614181565b60208101610864828461473a565b60405181810167ffffffffffffffff81118282101715614b6d57600080fd5b604052919050565b600067ffffffffffffffff821115614b8c57600080fd5b5060209081020190565b60200190565b5190565b90815260200190565b600061086482614bcc565b151590565b6dffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b63ffffffff1690565b60ff1690565b600061086482610b98565b60005b83811015614c1a578181015183820152602001614c02565b83811115612a635750506000910152565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690565b614c5c81614ba9565b811461387157600080fd5b614c5c81614bb4565b614c5c81610b98565b614c5c81614bb9565b614c5c81614be5565b614c5c81614bee56fea365627a7a723158208217ad06e1fa4cf23286e805088a20640f6d511893e8bc522d668584ec740f2a6c6578706572696d656e74616cf564736f6c63430005100040
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102d35760003560e01c806370e5a89811610186578063c45a0155116100e3578063e8bea16711610097578063f887ea4011610071578063f887ea4014610501578063fdb5a03e14610509578063fff6cae914610511576102d3565b8063e8bea167146104de578063ebce9331146104e6578063ebeb31db146104f9576102d3565b8063d21220a7116100c8578063d21220a7146104b0578063d505accf146104b8578063dd62ed3e146104cb576102d3565b8063c45a0155146104a0578063d1af0c7d146104a8576102d3565b8063a6f19c841161013a578063ad7a672f1161011f578063ad7a672f1461047d578063ba9a7a5614610485578063bc25cf771461048d576102d3565b8063a6f19c8414610462578063a9059cbb1461046a576102d3565b80638950b9a61161016b5780638950b9a61461043f57806395a2251f1461044757806395d89b411461045a576102d3565b806370e5a898146104195780637ecebe001461042c576102d3565b806330adf81f116102345780634a5d316c116101e85780636c2a3bc5116101cd5780636c2a3bc5146103f65780636f307dc3146103fe57806370a0823114610406576102d3565b80634a5d316c146103d95780636a627842146103e3576102d3565b80633644e515116102195780633644e515146103c15780633ba0b9a9146103c95780633d18b912146103d1576102d3565b806330adf81f146103a4578063313ce567146103ac576102d3565b806318160ddd1161028b57806322be3de11161027057806322be3de11461037657806323b872dd1461037e578063252c09d714610391576102d3565b806318160ddd1461034a5780631df8c7171461035f576102d3565b8063095ea7b3116102bc578063095ea7b31461030d5780630a6410631461032d5780630dfe168114610335576102d3565b806306fdde03146102d85780630902f1ac146102f6575b600080fd5b6102e0610519565b6040516102ed9190614988565b60405180910390f35b6102fe6105c5565b6040516102ed93929190614a99565b61032061031b366004613f55565b610853565b6040516102ed919061489d565b61032061086a565b61033d61086f565b6040516102ed919061478b565b610352610890565b6040516102ed91906148ab565b610367610896565b6040516102ed93929190614b18565b610320610946565b61032061038c366004613e6c565b61094b565b61036761039f36600461401b565b610a60565b610352610b18565b6103b4610b3c565b6040516102ed9190614b40565b610352610b45565b610352610b4b565b610352610b9b565b6103e1610c46565b005b6103526103f1366004613d22565b610cc2565b610352611075565b61033d611080565b610352610414366004613d22565b61109c565b61033d61042736600461401b565b6110ae565b61035261043a366004613d22565b6110e2565b61033d6110f4565b610352610455366004613d22565b611110565b6102e061132f565b61033d6113a7565b610320610478366004613f55565b6113c3565b6103526113d0565b6103526113d6565b6103e161049b366004613d22565b6113dc565b61033d611532565b61033d61154e565b61033d61156a565b6103e16104c6366004613eb9565b611586565b6103526104d9366004613d66565b6115ca565b6102e06115e7565b6103e16104f4366004613da0565b611620565b610352611a21565b61033d611ac9565b6103e1611ae5565b6103e1612103565b6000805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f810184900484028201840190925281815292918301828280156105bd5780601f10610592576101008083540402835291602001916105bd565b820191906000526020600020905b8154815290600101906020018083116105a057829003601f168201915b505050505081565b600080600080600080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561063657600080fd5b505afa15801561064a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061066e9190810190613fd8565b63ffffffff1692506dffffffffffffffffffffffffffff1692506dffffffffffffffffffffffffffff1692506106a38361216f565b95506106ae8261216f565b945064010000000081069350600354600014156106ce575061084e915050565b600a54600854604080517f18160ddd000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff16916318160ddd916004808301926020929190829003018186803b15801561073c57600080fd5b505afa158015610750573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506107749190810190614039565b90506107ae6107a98261079d856dffffffffffffffffffffffffffff8d1663ffffffff6121c116565b9063ffffffff61221516565b61216f565b97506107d76107a98261079d856dffffffffffffffffffffffffffff8c1663ffffffff6121c116565b96506064886dffffffffffffffffffffffffffff1611801561080957506064876dffffffffffffffffffffffffffff16115b610848576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f906149d9565b60405180910390fd5b50505050505b909192565b6000610860338484612257565b5060015b92915050565b600181565b600b54610100900473ffffffffffffffffffffffffffffffffffffffff1681565b60035481565b6000806000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631df8c7176040518163ffffffff1660e01b815260040160606040518083038186803b15801561090357600080fd5b505afa158015610917573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061093b9190810190614057565b925092509250909192565b600081565b73ffffffffffffffffffffffffffffffffffffffff831660009081526005602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14610a4a57604080518082018252601e81527f496d7065726d61783a205452414e534645525f4e4f545f414c4c4f574544000060208083019190915273ffffffffffffffffffffffffffffffffffffffff87166000908152600582528381203382529091529190912054610a1891849063ffffffff6122cc16565b73ffffffffffffffffffffffffffffffffffffffff851660009081526005602090815260408083203384529091529020555b610a55848484612312565b5060015b9392505050565b6008546040517f252c09d70000000000000000000000000000000000000000000000000000000081526000918291829173ffffffffffffffffffffffffffffffffffffffff169063252c09d790610abb9087906004016148ab565b60606040518083038186803b158015610ad357600080fd5b505afa158015610ae7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610b0b9190810190614057565b9250925092509193909250565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60025460ff1681565b60065481565b600354600a5460009190811580610b60575080155b15610b7757670de0b6b3a764000092505050610b98565b610b938261079d83670de0b6b3a764000063ffffffff6121c116565b925050505b90565b600b5460009060ff16610bda576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90614a89565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055333214610c0e57600080fd5b610c16612421565b9050600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905590565b60095473ffffffffffffffffffffffffffffffffffffffff1615610c96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f906149a9565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001633179055565b600b5460009060ff16610d01576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90614a89565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600854600090610d4e9073ffffffffffffffffffffffffffffffffffffffff1661256d565b600e546040517f70a0823100000000000000000000000000000000000000000000000000000000815291925060009173ffffffffffffffffffffffffffffffffffffffff909116906370a0823190610daa90309060040161478b565b60206040518083038186803b158015610dc257600080fd5b505afa158015610dd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610dfa9190810190614039565b600e546040517fb6b55f2500000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff169063b6b55f2590610e519085906004016148ab565b600060405180830381600087803b158015610e6b57600080fd5b505af1158015610e7f573d6000803e3d6000fd5b5050600e546040517f70a082310000000000000000000000000000000000000000000000000000000081526000935073ffffffffffffffffffffffffffffffffffffffff90911691506370a0823190610edc90309060040161478b565b60206040518083038186803b158015610ef457600080fd5b505afa158015610f08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610f2c9190810190614039565b9050610f61610f39610b4b565b61079d670de0b6b3a7640000610f55858763ffffffff61261216565b9063ffffffff6121c116565b935060035460001415610f8f57610f80846103e863ffffffff61261216565b9350610f8f60006103e8612654565b60008411610fc9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f906149b9565b610fd38585612654565b8473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f2f00e3cdd69a77be7ed215ec7b2a36784dd158f921fca79ac29deffa353fe6ee8587604051611032929190614b0a565b60405180910390a3505050611045612708565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055919050565b66470de4df82000081565b60085473ffffffffffffffffffffffffffffffffffffffff1681565b60046020526000908152604090205481565b601181815481106110bb57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b60076020526000908152604090205481565b60105473ffffffffffffffffffffffffffffffffffffffff1681565b600b5460009060ff1661114f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90614a89565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055306000908152600460205260409020546111ab670de0b6b3a764000061079d61119e610b4b565b849063ffffffff6121c116565b9150600082116111e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f906149f9565b600a54821115611223576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90614a49565b61122d30826127f2565b600e546040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690632e1a7d4d906112839085906004016148ab565b600060405180830381600087803b15801561129d57600080fd5b505af11580156112b1573d6000803e3d6000fd5b505050506112bf83836128af565b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f3f693fff038bb8a046aa76d9516190ac7444f7d69cf952c4cbdc086fdef2d6fc848460405161131e929190614b0a565b60405180910390a350611045612708565b60018054604080516020600284861615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f810184900484028201840190925281815292918301828280156105bd5780601f10610592576101008083540402835291602001916105bd565b600e5473ffffffffffffffffffffffffffffffffffffffff1681565b6000610860338484612312565b600a5481565b6103e881565b600b5460ff16611418576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90614a89565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600a546008546040517f70a082310000000000000000000000000000000000000000000000000000000081526115049284926114ff9273ffffffffffffffffffffffffffffffffffffffff909116906370a08231906114a390309060040161478b565b60206040518083038186803b1580156114bb57600080fd5b505afa1580156114cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506114f39190810190614039565b9063ffffffff61261216565b6128af565b50600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60095473ffffffffffffffffffffffffffffffffffffffff1681565b600f5473ffffffffffffffffffffffffffffffffffffffff1681565b600c5473ffffffffffffffffffffffffffffffffffffffff1681565b6115b6878787878787877f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9612a69565b6115c1878787612257565b50505050505050565b600560209081526000928352604080842090915290825290205481565b6040518060400160405280600c81526020017f536f6c69646c794261736537000000000000000000000000000000000000000081525081565b60095473ffffffffffffffffffffffffffffffffffffffff1615611670576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90614a59565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001633179055604080518082018252601181527f5374616b656420556e69737761702056320000000000000000000000000000006020808301919091528251808401909352600b83527f53544b442d554e492d56320000000000000000000000000000000000000000009083015261170b91612c28565b600880547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff8c811691909117909255600b80547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101008c851602179055600c805482168a8416179055600d80549091168883161790556040517f2045be9000000000000000000000000000000000000000000000000000000000815290861690632045be90906117d9908c9060040161478b565b60206040518083038186803b1580156117f157600080fd5b505afa158015611805573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506118299190810190613d48565b600e80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9283161790819055166118a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90614a79565b600f805473ffffffffffffffffffffffffffffffffffffffff8087167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255601080549286169290911691909117905561190460118383613a6c565b5061194c73ffffffffffffffffffffffffffffffffffffffff8516877fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff63ffffffff612d1616565b600e546119999073ffffffffffffffffffffffffffffffffffffffff8b811691167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff63ffffffff612d1616565b60005b81811015611a1557611a0d877fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8585858181106119d557fe5b90506020020160206119ea9190810190613d22565b73ffffffffffffffffffffffffffffffffffffffff16919063ffffffff612d1616565b60010161199c565b50505050505050505050565b600854604080517febeb31db000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163ebeb31db916004808301926020929190829003018186803b158015611a8c57600080fd5b505afa158015611aa0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611ac49190810190614039565b905090565b600d5473ffffffffffffffffffffffffffffffffffffffff1681565b600b5460ff16611b21576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90614a89565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055333214611b5557600080fd5b6000611b5f612421565b905080611b6c57506120ce565b6000670de0b6b3a7640000611b8e8366470de4df82000063ffffffff6121c116565b81611b9557fe5b600f549190049150611bc49073ffffffffffffffffffffffffffffffffffffffff16338363ffffffff612e4016565b600f54600b546000918291610100900473ffffffffffffffffffffffffffffffffffffffff90811691161480611c175750600f54600c5473ffffffffffffffffffffffffffffffffffffffff9081169116145b15611ca157600f54600b54610100900473ffffffffffffffffffffffffffffffffffffffff908116911614611c7157600c54600b5473ffffffffffffffffffffffffffffffffffffffff9182169161010090910416611c97565b600b54600c5473ffffffffffffffffffffffffffffffffffffffff610100909204821691165b9092509050611e79565b600080611cac612f63565b600f549193509150611ce49073ffffffffffffffffffffffffffffffffffffffff1683611cdf898963ffffffff61261216565b61343c565b600b5473ffffffffffffffffffffffffffffffffffffffff838116610100909204161480611d2c5750600c5473ffffffffffffffffffffffffffffffffffffffff8381169116145b15611db357600b5473ffffffffffffffffffffffffffffffffffffffff8381166101009092041614611d8357600c54600b5473ffffffffffffffffffffffffffffffffffffffff9182169161010090910416611da9565b600b54600c5473ffffffffffffffffffffffffffffffffffffffff610100909204821691165b9094509250611e76565b611e19828215611ddb57600c5473ffffffffffffffffffffffffffffffffffffffff16611dfa565b600b54610100900473ffffffffffffffffffffffffffffffffffffffff165b611cdf8573ffffffffffffffffffffffffffffffffffffffff1661256d565b8015611e4a57600c54600b5473ffffffffffffffffffffffffffffffffffffffff9182169161010090910416611e70565b600b54600c5473ffffffffffffffffffffffffffffffffffffffff610100909204821691165b90945092505b50505b6000611e9a8373ffffffffffffffffffffffffffffffffffffffff1661256d565b905060008111611ea657fe5b600080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015611f1157600080fd5b505afa158015611f25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611f499190810190613fd8565b50600b546dffffffffffffffffffffffffffff92831694509116915060009073ffffffffffffffffffffffffffffffffffffffff8781166101009092041614611f925781611f94565b825b90506000611fa285836135af565b9050611faf87878361343c565b6000611fea8888611fc6898663ffffffff61261216565b611fe58b73ffffffffffffffffffffffffffffffffffffffff1661256d565b613630565b600e546040517fb6b55f2500000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff169063b6b55f25906120419084906004016148ab565b600060405180830381600087803b15801561205b57600080fd5b505af115801561206f573d6000803e3d6000fd5b505050503373ffffffffffffffffffffffffffffffffffffffff167fc003f45bc224d116b6d079100d4ab57a5b9633244c47a5a92a176c5b79a85f288b8b6040516120bb929190614b0a565b60405180910390a2505050505050505050505b6120d6612708565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b600b5460ff1661213f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90614a89565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556120d6612708565b60006e01000000000000000000000000000082106121b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90614a19565b50805b919050565b6000826121d057506000610864565b828202828482816121dd57fe5b0414610a59576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90614a29565b6000610a5983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061370a565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526005602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906122bf9085906148ab565b60405180910390a3505050565b6000818484111561230a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f9190614988565b505050900390565b604080518082018252601b81527f496d7065726d61783a205452414e534645525f544f4f5f48494748000000000060208083019190915273ffffffffffffffffffffffffffffffffffffffff861660009081526004909152919091205461238091839063ffffffff6122cc16565b73ffffffffffffffffffffffffffffffffffffffff80851660009081526004602052604080822093909355908416815220546123c2908263ffffffff61375b16565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526004602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906122bf9085906148ab565b60408051600280825260608083018452600093909291906020830190803883395050600f54825192935073ffffffffffffffffffffffffffffffffffffffff169183915060009061246e57fe5b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920101526010548251911690829060019081106124a657fe5b73ffffffffffffffffffffffffffffffffffffffff9283166020918202929092010152600e546040517f31279d3d0000000000000000000000000000000000000000000000000000000081529116906331279d3d9061250b9030908590600401614862565b600060405180830381600087803b15801561252557600080fd5b505af1158015612539573d6000803e3d6000fd5b5050505061254561379a565b600f546125679073ffffffffffffffffffffffffffffffffffffffff1661256d565b91505090565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8316906370a08231906125c290309060040161478b565b60206040518083038186803b1580156125da57600080fd5b505afa1580156125ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506108649190810190614039565b6000610a5983836040518060400160405280601f81526020017f536166654d6174683a207375627472616374696f6e20756e646572666c6f77008152506122cc565b600354612667908263ffffffff61375b16565b60035573ffffffffffffffffffffffffffffffffffffffff82166000908152600460205260409020546126a0908263ffffffff61375b16565b73ffffffffffffffffffffffffffffffffffffffff83166000818152600460205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906126fc9085906148ab565b60405180910390a35050565b600e546040517f70a0823100000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906370a082319061275f90309060040161478b565b60206040518083038186803b15801561277757600080fd5b505afa15801561278b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506127af9190810190614039565b905080600a819055507f8a0df8ef054fae2c3d2d19a7b322e864870cc9fd3cb07fb9526309c596244bf4816040516127e791906148ab565b60405180910390a150565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260046020526040902054612828908263ffffffff61261216565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260046020526040902055600354612861908263ffffffff61261216565b60035560405160009073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906126fc9085906148ab565b600854604080518082018252601981527f7472616e7366657228616464726573732c75696e7432353629000000000000006020909101525160009160609173ffffffffffffffffffffffffffffffffffffffff909116907fa9059cbb2ab09eb219583f4a59a5d0623ade346d962bcd4e46b11da047c9049b906129389087908790602401614882565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516129c19190614743565b6000604051808303816000865af19150503d80600081146129fe576040519150601f19603f3d011682016040523d82523d6000602084013e612a03565b606091505b5091509150818015612a2d575080511580612a2d575080806020019051612a2d9190810190613fba565b612a63576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90614a69565b50505050565b42851015612aa3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90614999565b60065473ffffffffffffffffffffffffffffffffffffffff891660009081526007602090815260408083208054600181019091559051929392612af19286928e928e928e92918e91016148b9565b60405160208183030381529060405280519060200120604051602001612b1892919061474f565b604051602081830303815290604052805190602001209050600060018287878760405160008152602001604052604051612b55949392919061494a565b6020604051602081039080840390855afa158015612b77573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590612bf257508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b611a15576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90614a09565b8151612c3b906000906020850190613af4565b508051612c4f906001906020840190613af4565b506040514690612c5e90614780565b6040805191829003822085516020808801919091208484018452600185527f3100000000000000000000000000000000000000000000000000000000000000948201949094529151612cd89391927fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6918691309101614908565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120600655505050565b600060608473ffffffffffffffffffffffffffffffffffffffff1663095ea7b38585604051602401612d49929190614882565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051612d979190614743565b6000604051808303816000865af19150503d8060008114612dd4576040519150601f19603f3d011682016040523d82523d6000602084013e612dd9565b606091505b5091509150818015612e03575080511580612e03575080806020019051612e039190810190613fba565b612e39576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f906149c9565b5050505050565b600060608473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401612e73929190614882565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051612ec19190614743565b6000604051808303816000865af19150503d8060008114612efe576040519150601f19603f3d011682016040523d82523d6000602084013e612f03565b606091505b5091509150818015612f2d575080511580612f2d575080806020019051612f2d9190810190613fba565b612e39576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90614a39565b600080805b60115481101561306c5760118181548110612f7f57fe5b600091825260209091200154600b54610100900473ffffffffffffffffffffffffffffffffffffffff90811691161415612fec5760118181548110612fc057fe5b600091825260208220015473ffffffffffffffffffffffffffffffffffffffff16935091506134389050565b60118181548110612ff957fe5b600091825260209091200154600c5473ffffffffffffffffffffffffffffffffffffffff90811691161415613064576011818154811061303557fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169250600191506134389050565b600101612f68565b50600080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156130d857600080fd5b505afa1580156130ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506131109190810190613fd8565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff16915061313d613b6e565b5060408051808201909152600b5473ffffffffffffffffffffffffffffffffffffffff61010090910481168252600c5416602082015261317b613b6e565b604051806040016040528085815260200184815250905060116000815481106131a057fe5b600091825260208083209190910154600d54604080517fc45a0155000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9384169b5094995089948594939092169263c45a015592600480840193829003018186803b15801561322157600080fd5b505afa158015613235573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506132599190810190613d48565b905060005b6011548110156134305760005b60028110156134275760008373ffffffffffffffffffffffffffffffffffffffff16636801cc3088846002811061329e57fe5b6020020151601186815481106132b057fe5b60009182526020822001546040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815261330e939273ffffffffffffffffffffffffffffffffffffffff90921691906004016147b4565b60206040518083038186803b15801561332657600080fd5b505afa15801561333a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061335e9190810190613d48565b905073ffffffffffffffffffffffffffffffffffffffff8116613381575061341f565b60006133da87846002811061339257fe5b602002015161079d670de0b6b3a7640000610f55868d89600281106133b357fe5b602002015173ffffffffffffffffffffffffffffffffffffffff169063ffffffff61387416565b90508581111561341c57809550829a50601184815481106133f757fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169b505b50505b60010161326b565b5060010161325e565b505050505050505b9091565b6134468382613919565b604080516001808252818301909252606091816020015b613465613b8c565b81526020019060019003908161345d57905050905060405180606001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff16815260200160001515815250816000815181106134d157fe5b6020908102919091010152600d546040517ff41766d800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063f41766d89061353b908590600090869030904290600401614ac1565b600060405180830381600087803b15801561355557600080fd5b505af1158015613569573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052612e399190810190613f85565b6000806135c46107cd8463ffffffff6121c116565b905060006135e2610f94610f558681896103e863ffffffff6121c116565b9050600061360e613609836135fd868063ffffffff6121c116565b9063ffffffff61375b16565b613a1b565b90506136266107ca61079d838663ffffffff61261216565b9695505050505050565b600061363c8584613919565b6136468483613919565b600d546040517f5a47ddc300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690635a47ddc3906136ad90889088906000908990899083908190309042906004016147dc565b606060405180830381600087803b1580156136c757600080fd5b505af11580156136db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506136ff9190810190614057565b979650505050505050565b60008183613745576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f9190614988565b50600083858161375157fe5b0495945050505050565b600082820183811015610a59576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f906149e9565b6010546000906137bf9073ffffffffffffffffffffffffffffffffffffffff1661256d565b90508015613871576010546040517f7f8661a100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690637f8661a19061381d9084906004016148ab565b602060405180830381600087803b15801561383757600080fd5b505af115801561384b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061386f9190810190614039565b505b50565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8416906370a08231906138c990859060040161478b565b60206040518083038186803b1580156138e157600080fd5b505afa1580156138f5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610a599190810190614039565b600d546040517fdd62ed3e000000000000000000000000000000000000000000000000000000008152829173ffffffffffffffffffffffffffffffffffffffff8086169263dd62ed3e92613974923092911690600401614799565b60206040518083038186803b15801561398c57600080fd5b505afa1580156139a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506139c49190810190614039565b106139ce5761386f565b600d5461386f9073ffffffffffffffffffffffffffffffffffffffff84811691167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff63ffffffff612d1616565b60006003821115613a5e575080600160028204015b81811015613a5857809150600281828581613a4757fe5b040181613a5057fe5b049050613a30565b506121bc565b81156121bc57506001919050565b828054828255906000526020600020908101928215613ae4579160200282015b82811115613ae45781547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff843516178255602090920191600190910190613a8c565b50613af0929150613bac565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613b3557805160ff1916838001178555613b62565b82800160010185558215613b62579182015b82811115613b62578251825591602001919060010190613b47565b50613af0929150613be8565b60405180604001604052806002906020820280388339509192915050565b604080516060810182526000808252602082018190529181019190915290565b610b9891905b80821115613af05780547fffffffffffffffffffffffff0000000000000000000000000000000000000000168155600101613bb2565b610b9891905b80821115613af05760008155600101613bee565b803561086481614c53565b805161086481614c53565b60008083601f840112613c2a57600080fd5b50813567ffffffffffffffff811115613c4257600080fd5b602083019150836020820283011115613c5a57600080fd5b9250929050565b600082601f830112613c7257600080fd5b8151613c85613c8082614b75565b614b4e565b91508181835260208401935060208101905083856020840282011115613caa57600080fd5b60005b83811015613cd65781613cc08882613d01565b8452506020928301929190910190600101613cad565b5050505092915050565b805161086481614c67565b803561086481614c70565b805161086481614c79565b805161086481614c70565b805161086481614c82565b803561086481614c8b565b600060208284031215613d3457600080fd5b6000613d408484613c02565b949350505050565b600060208284031215613d5a57600080fd5b6000613d408484613c0d565b60008060408385031215613d7957600080fd5b6000613d858585613c02565b9250506020613d9685828601613c02565b9150509250929050565b60008060008060008060008060006101008a8c031215613dbf57600080fd5b6000613dcb8c8c613c02565b9950506020613ddc8c828d01613c02565b9850506040613ded8c828d01613c02565b9750506060613dfe8c828d01613c02565b9650506080613e0f8c828d01613c02565b95505060a0613e208c828d01613c02565b94505060c0613e318c828d01613c02565b93505060e08a013567ffffffffffffffff811115613e4e57600080fd5b613e5a8c828d01613c18565b92509250509295985092959850929598565b600080600060608486031215613e8157600080fd5b6000613e8d8686613c02565b9350506020613e9e86828701613c02565b9250506040613eaf86828701613ceb565b9150509250925092565b600080600080600080600060e0888a031215613ed457600080fd5b6000613ee08a8a613c02565b9750506020613ef18a828b01613c02565b9650506040613f028a828b01613ceb565b9550506060613f138a828b01613ceb565b9450506080613f248a828b01613d17565b93505060a0613f358a828b01613ceb565b92505060c0613f468a828b01613ceb565b91505092959891949750929550565b60008060408385031215613f6857600080fd5b6000613f748585613c02565b9250506020613d9685828601613ceb565b600060208284031215613f9757600080fd5b815167ffffffffffffffff811115613fae57600080fd5b613d4084828501613c61565b600060208284031215613fcc57600080fd5b6000613d408484613ce0565b600080600060608486031215613fed57600080fd5b6000613ff98686613cf6565b935050602061400a86828701613cf6565b9250506040613eaf86828701613d0c565b60006020828403121561402d57600080fd5b6000613d408484613ceb565b60006020828403121561404b57600080fd5b6000613d408484613d01565b60008060006060848603121561406c57600080fd5b60006140788686613d01565b935050602061408986828701613d01565b9250506040613eaf86828701613d01565b60006140a683836140c2565b505060200190565b60006140ba83836146f1565b505060600190565b6140cb81614ba9565b82525050565b60006140dc82614b9c565b6140e68185614ba0565b93506140f183614b96565b8060005b8381101561411f578151614109888261409a565b975061411483614b96565b9250506001016140f5565b509495945050505050565b600061413582614b9c565b61413f8185614ba0565b935061414a83614b96565b8060005b8381101561411f57815161416288826140ae565b975061416d83614b96565b92505060010161414e565b6140cb81614bb4565b6140cb81610b98565b6140cb61419682610b98565b610b98565b60006141a682614b9c565b6141b081856121bc565b93506141c0818560208601614bff565b9290920192915050565b6140cb81614bf4565b60006141de82614b9c565b6141e88185614ba0565b93506141f8818560208601614bff565b61420181614c2b565b9093019392505050565b6000614218601183614ba0565b7f496d7065726d61783a2045585049524544000000000000000000000000000000815260200192915050565b6000614251601d83614ba0565b7f496d7065726d61783a20464143544f52595f414c52454144595f534554000000815260200192915050565b600061428a601f83614ba0565b7f5374616b65644c50546f6b656e3a204d494e545f414d4f554e545f5a45524f00815260200192915050565b60006142c3600c83614ba0565b7f2173616665417070726f76650000000000000000000000000000000000000000815260200192915050565b60006142fc602483614ba0565b7f5374616b65644c50546f6b656e3a20494e53554646494349454e545f5245534581527f5256455300000000000000000000000000000000000000000000000000000000602082015260400192915050565b600061435b6002836121bc565b7f1901000000000000000000000000000000000000000000000000000000000000815260020192915050565b6000614394601b83614ba0565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000815260200192915050565b60006143cd602183614ba0565b7f5374616b65644c50546f6b656e3a2052454445454d5f414d4f554e545f5a455281527f4f00000000000000000000000000000000000000000000000000000000000000602082015260400192915050565b600061442c601b83614ba0565b7f496d7065726d61783a20494e56414c49445f5349474e41545552450000000000815260200192915050565b6000614465601683614ba0565b7f5374616b65644c50546f6b656e3a205341464531313200000000000000000000815260200192915050565b600061449e6052836121bc565b7f454950373132446f6d61696e28737472696e67206e616d652c737472696e672081527f76657273696f6e2c75696e7432353620636861696e49642c616464726573732060208201527f766572696679696e67436f6e7472616374290000000000000000000000000000604082015260520192915050565b6000614523602183614ba0565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f81527f7700000000000000000000000000000000000000000000000000000000000000602082015260400192915050565b6000614582600d83614ba0565b7f21736166655472616e7366657200000000000000000000000000000000000000815260200192915050565b60006145bb602083614ba0565b7f5374616b65644c50546f6b656e3a20494e53554646494349454e545f43415348815260200192915050565b60006145f4602283614ba0565b7f5374616b65644c50546f6b656e3a20464143544f52595f414c52454144595f5381527f4554000000000000000000000000000000000000000000000000000000000000602082015260400192915050565b6000614653601983614ba0565b7f496d7065726d61783a205452414e534645525f4641494c454400000000000000815260200192915050565b600061468c601783614ba0565b7f5374616b65644c50546f6b656e3a204e4f5f4741554745000000000000000000815260200192915050565b60006146c5601383614ba0565b7f496d7065726d61783a205245454e544552454400000000000000000000000000815260200192915050565b8051606083019061470284826140c2565b50602082015161471560208501826140c2565b506040820151612a636040850182614178565b6140cb81614bb9565b6140cb81614be5565b6140cb81614bee565b6000610a59828461419b565b600061475a8261434e565b9150614766828561418a565b602082019150614776828461418a565b5060200192915050565b600061086482614491565b6020810161086482846140c2565b604081016147a782856140c2565b610a5960208301846140c2565b606081016147c282866140c2565b6147cf60208301856140c2565b613d406040830184614178565b61012081016147eb828c6140c2565b6147f8602083018b6140c2565b614805604083018a614178565b6148126060830189614181565b61481f6080830188614181565b61482c60a08301876141ca565b61483960c08301866141ca565b61484660e08301856140c2565b614854610100830184614181565b9a9950505050505050505050565b6040810161487082856140c2565b8181036020830152613d4081846140d1565b6040810161489082856140c2565b610a596020830184614181565b602081016108648284614178565b602081016108648284614181565b60c081016148c78289614181565b6148d460208301886140c2565b6148e160408301876140c2565b6148ee6060830186614181565b6148fb6080830185614181565b6136ff60a0830184614181565b60a081016149168288614181565b6149236020830187614181565b6149306040830186614181565b61493d6060830185614181565b61362660808301846140c2565b608081016149588287614181565b614965602083018661473a565b6149726040830185614181565b61497f6060830184614181565b95945050505050565b60208082528101610a5981846141d3565b602080825281016108648161420b565b6020808252810161086481614244565b602080825281016108648161427d565b60208082528101610864816142b6565b60208082528101610864816142ef565b6020808252810161086481614387565b60208082528101610864816143c0565b602080825281016108648161441f565b6020808252810161086481614458565b6020808252810161086481614516565b6020808252810161086481614575565b60208082528101610864816145ae565b60208082528101610864816145e7565b6020808252810161086481614646565b602080825281016108648161467f565b60208082528101610864816146b8565b60608101614aa78286614728565b614ab46020830185614728565b613d406040830184614731565b60a08101614acf8288614181565b614adc60208301876141ca565b8181036040830152614aee818661412a565b9050614afd60608301856140c2565b6136266080830184614181565b604081016148908285614181565b60608101614b268286614181565b614b336020830185614181565b613d406040830184614181565b60208101610864828461473a565b60405181810167ffffffffffffffff81118282101715614b6d57600080fd5b604052919050565b600067ffffffffffffffff821115614b8c57600080fd5b5060209081020190565b60200190565b5190565b90815260200190565b600061086482614bcc565b151590565b6dffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b63ffffffff1690565b60ff1690565b600061086482610b98565b60005b83811015614c1a578181015183820152602001614c02565b83811115612a635750506000910152565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690565b614c5c81614ba9565b811461387157600080fd5b614c5c81614bb4565b614c5c81610b98565b614c5c81614bb9565b614c5c81614be5565b614c5c81614bee56fea365627a7a723158208217ad06e1fa4cf23286e805088a20640f6d511893e8bc522d668584ec740f2a6c6578706572696d656e74616cf564736f6c63430005100040
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.