S Price: $0.431275 (+1.56%)

Token

Staked Uniswap V2 (STKD-UNI-V2)

Overview

Max Total Supply

27,279.600154697379399399 STKD-UNI-V2

Holders

1

Market

Price

$0.00 @ 0.000000 S

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0 STKD-UNI-V2

Value
$0.00
0xd9de9f15994182518a688933d09787a9a9fb5bc9
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
StakedLPTokenSolidlyBase7

Compiler Version
v0.5.16+commit.9c3226ce

Optimization Enabled:
Yes with 999999 runs

Other Settings:
default evmVersion
File 1 of 1 : StakedLPTokenSolidlyBase7Flattened.sol
// 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);
	}
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 999999
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"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"}]

60806040526002805460ff19908116601217909155600b80549091166001179055614cd78061002f6000396000f3fe608060405234801561001057600080fd5b50600436106102d35760003560e01c806370e5a89811610186578063c45a0155116100e3578063e8bea16711610097578063f887ea4011610071578063f887ea4014610501578063fdb5a03e14610509578063fff6cae914610511576102d3565b8063e8bea167146104de578063ebce9331146104e6578063ebeb31db146104f9576102d3565b8063d21220a7116100c8578063d21220a7146104b0578063d505accf146104b8578063dd62ed3e146104cb576102d3565b8063c45a0155146104a0578063d1af0c7d146104a8576102d3565b8063a6f19c841161013a578063ad7a672f1161011f578063ad7a672f1461047d578063ba9a7a5614610485578063bc25cf771461048d576102d3565b8063a6f19c8414610462578063a9059cbb1461046a576102d3565b80638950b9a61161016b5780638950b9a61461043f57806395a2251f1461044757806395d89b411461045a576102d3565b806370e5a898146104195780637ecebe001461042c576102d3565b806330adf81f116102345780634a5d316c116101e85780636c2a3bc5116101cd5780636c2a3bc5146103f65780636f307dc3146103fe57806370a0823114610406576102d3565b80634a5d316c146103d95780636a627842146103e3576102d3565b80633644e515116102195780633644e515146103c15780633ba0b9a9146103c95780633d18b912146103d1576102d3565b806330adf81f146103a4578063313ce567146103ac576102d3565b806318160ddd1161028b57806322be3de11161027057806322be3de11461037657806323b872dd1461037e578063252c09d714610391576102d3565b806318160ddd1461034a5780631df8c7171461035f576102d3565b8063095ea7b3116102bc578063095ea7b31461030d5780630a6410631461032d5780630dfe168114610335576102d3565b806306fdde03146102d85780630902f1ac146102f6575b600080fd5b6102e0610519565b6040516102ed9190614988565b60405180910390f35b6102fe6105c5565b6040516102ed93929190614a99565b61032061031b366004613f55565b610853565b6040516102ed919061489d565b61032061086a565b61033d61086f565b6040516102ed919061478b565b610352610890565b6040516102ed91906148ab565b610367610896565b6040516102ed93929190614b18565b610320610946565b61032061038c366004613e6c565b61094b565b61036761039f36600461401b565b610a60565b610352610b18565b6103b4610b3c565b6040516102ed9190614b40565b610352610b45565b610352610b4b565b610352610b9b565b6103e1610c46565b005b6103526103f1366004613d22565b610cc2565b610352611075565b61033d611080565b610352610414366004613d22565b61109c565b61033d61042736600461401b565b6110ae565b61035261043a366004613d22565b6110e2565b61033d6110f4565b610352610455366004613d22565b611110565b6102e061132f565b61033d6113a7565b610320610478366004613f55565b6113c3565b6103526113d0565b6103526113d6565b6103e161049b366004613d22565b6113dc565b61033d611532565b61033d61154e565b61033d61156a565b6103e16104c6366004613eb9565b611586565b6103526104d9366004613d66565b6115ca565b6102e06115e7565b6103e16104f4366004613da0565b611620565b610352611a21565b61033d611ac9565b6103e1611ae5565b6103e1612103565b6000805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f810184900484028201840190925281815292918301828280156105bd5780601f10610592576101008083540402835291602001916105bd565b820191906000526020600020905b8154815290600101906020018083116105a057829003601f168201915b505050505081565b600080600080600080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561063657600080fd5b505afa15801561064a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061066e9190810190613fd8565b63ffffffff1692506dffffffffffffffffffffffffffff1692506dffffffffffffffffffffffffffff1692506106a38361216f565b95506106ae8261216f565b945064010000000081069350600354600014156106ce575061084e915050565b600a54600854604080517f18160ddd000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff16916318160ddd916004808301926020929190829003018186803b15801561073c57600080fd5b505afa158015610750573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506107749190810190614039565b90506107ae6107a98261079d856dffffffffffffffffffffffffffff8d1663ffffffff6121c116565b9063ffffffff61221516565b61216f565b97506107d76107a98261079d856dffffffffffffffffffffffffffff8c1663ffffffff6121c116565b96506064886dffffffffffffffffffffffffffff1611801561080957506064876dffffffffffffffffffffffffffff16115b610848576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f906149d9565b60405180910390fd5b50505050505b909192565b6000610860338484612257565b5060015b92915050565b600181565b600b54610100900473ffffffffffffffffffffffffffffffffffffffff1681565b60035481565b6000806000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631df8c7176040518163ffffffff1660e01b815260040160606040518083038186803b15801561090357600080fd5b505afa158015610917573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061093b9190810190614057565b925092509250909192565b600081565b73ffffffffffffffffffffffffffffffffffffffff831660009081526005602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14610a4a57604080518082018252601e81527f496d7065726d61783a205452414e534645525f4e4f545f414c4c4f574544000060208083019190915273ffffffffffffffffffffffffffffffffffffffff87166000908152600582528381203382529091529190912054610a1891849063ffffffff6122cc16565b73ffffffffffffffffffffffffffffffffffffffff851660009081526005602090815260408083203384529091529020555b610a55848484612312565b5060015b9392505050565b6008546040517f252c09d70000000000000000000000000000000000000000000000000000000081526000918291829173ffffffffffffffffffffffffffffffffffffffff169063252c09d790610abb9087906004016148ab565b60606040518083038186803b158015610ad357600080fd5b505afa158015610ae7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610b0b9190810190614057565b9250925092509193909250565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60025460ff1681565b60065481565b600354600a5460009190811580610b60575080155b15610b7757670de0b6b3a764000092505050610b98565b610b938261079d83670de0b6b3a764000063ffffffff6121c116565b925050505b90565b600b5460009060ff16610bda576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90614a89565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055333214610c0e57600080fd5b610c16612421565b9050600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905590565b60095473ffffffffffffffffffffffffffffffffffffffff1615610c96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f906149a9565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001633179055565b600b5460009060ff16610d01576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90614a89565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600854600090610d4e9073ffffffffffffffffffffffffffffffffffffffff1661256d565b600e546040517f70a0823100000000000000000000000000000000000000000000000000000000815291925060009173ffffffffffffffffffffffffffffffffffffffff909116906370a0823190610daa90309060040161478b565b60206040518083038186803b158015610dc257600080fd5b505afa158015610dd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610dfa9190810190614039565b600e546040517fb6b55f2500000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff169063b6b55f2590610e519085906004016148ab565b600060405180830381600087803b158015610e6b57600080fd5b505af1158015610e7f573d6000803e3d6000fd5b5050600e546040517f70a082310000000000000000000000000000000000000000000000000000000081526000935073ffffffffffffffffffffffffffffffffffffffff90911691506370a0823190610edc90309060040161478b565b60206040518083038186803b158015610ef457600080fd5b505afa158015610f08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610f2c9190810190614039565b9050610f61610f39610b4b565b61079d670de0b6b3a7640000610f55858763ffffffff61261216565b9063ffffffff6121c116565b935060035460001415610f8f57610f80846103e863ffffffff61261216565b9350610f8f60006103e8612654565b60008411610fc9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f906149b9565b610fd38585612654565b8473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f2f00e3cdd69a77be7ed215ec7b2a36784dd158f921fca79ac29deffa353fe6ee8587604051611032929190614b0a565b60405180910390a3505050611045612708565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055919050565b66470de4df82000081565b60085473ffffffffffffffffffffffffffffffffffffffff1681565b60046020526000908152604090205481565b601181815481106110bb57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b60076020526000908152604090205481565b60105473ffffffffffffffffffffffffffffffffffffffff1681565b600b5460009060ff1661114f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90614a89565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055306000908152600460205260409020546111ab670de0b6b3a764000061079d61119e610b4b565b849063ffffffff6121c116565b9150600082116111e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f906149f9565b600a54821115611223576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90614a49565b61122d30826127f2565b600e546040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690632e1a7d4d906112839085906004016148ab565b600060405180830381600087803b15801561129d57600080fd5b505af11580156112b1573d6000803e3d6000fd5b505050506112bf83836128af565b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f3f693fff038bb8a046aa76d9516190ac7444f7d69cf952c4cbdc086fdef2d6fc848460405161131e929190614b0a565b60405180910390a350611045612708565b60018054604080516020600284861615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f810184900484028201840190925281815292918301828280156105bd5780601f10610592576101008083540402835291602001916105bd565b600e5473ffffffffffffffffffffffffffffffffffffffff1681565b6000610860338484612312565b600a5481565b6103e881565b600b5460ff16611418576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90614a89565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600a546008546040517f70a082310000000000000000000000000000000000000000000000000000000081526115049284926114ff9273ffffffffffffffffffffffffffffffffffffffff909116906370a08231906114a390309060040161478b565b60206040518083038186803b1580156114bb57600080fd5b505afa1580156114cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506114f39190810190614039565b9063ffffffff61261216565b6128af565b50600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60095473ffffffffffffffffffffffffffffffffffffffff1681565b600f5473ffffffffffffffffffffffffffffffffffffffff1681565b600c5473ffffffffffffffffffffffffffffffffffffffff1681565b6115b6878787878787877f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9612a69565b6115c1878787612257565b50505050505050565b600560209081526000928352604080842090915290825290205481565b6040518060400160405280600c81526020017f536f6c69646c794261736537000000000000000000000000000000000000000081525081565b60095473ffffffffffffffffffffffffffffffffffffffff1615611670576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90614a59565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001633179055604080518082018252601181527f5374616b656420556e69737761702056320000000000000000000000000000006020808301919091528251808401909352600b83527f53544b442d554e492d56320000000000000000000000000000000000000000009083015261170b91612c28565b600880547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff8c811691909117909255600b80547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101008c851602179055600c805482168a8416179055600d80549091168883161790556040517f2045be9000000000000000000000000000000000000000000000000000000000815290861690632045be90906117d9908c9060040161478b565b60206040518083038186803b1580156117f157600080fd5b505afa158015611805573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506118299190810190613d48565b600e80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9283161790819055166118a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90614a79565b600f805473ffffffffffffffffffffffffffffffffffffffff8087167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255601080549286169290911691909117905561190460118383613a6c565b5061194c73ffffffffffffffffffffffffffffffffffffffff8516877fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff63ffffffff612d1616565b600e546119999073ffffffffffffffffffffffffffffffffffffffff8b811691167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff63ffffffff612d1616565b60005b81811015611a1557611a0d877fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8585858181106119d557fe5b90506020020160206119ea9190810190613d22565b73ffffffffffffffffffffffffffffffffffffffff16919063ffffffff612d1616565b60010161199c565b50505050505050505050565b600854604080517febeb31db000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163ebeb31db916004808301926020929190829003018186803b158015611a8c57600080fd5b505afa158015611aa0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611ac49190810190614039565b905090565b600d5473ffffffffffffffffffffffffffffffffffffffff1681565b600b5460ff16611b21576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90614a89565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055333214611b5557600080fd5b6000611b5f612421565b905080611b6c57506120ce565b6000670de0b6b3a7640000611b8e8366470de4df82000063ffffffff6121c116565b81611b9557fe5b600f549190049150611bc49073ffffffffffffffffffffffffffffffffffffffff16338363ffffffff612e4016565b600f54600b546000918291610100900473ffffffffffffffffffffffffffffffffffffffff90811691161480611c175750600f54600c5473ffffffffffffffffffffffffffffffffffffffff9081169116145b15611ca157600f54600b54610100900473ffffffffffffffffffffffffffffffffffffffff908116911614611c7157600c54600b5473ffffffffffffffffffffffffffffffffffffffff9182169161010090910416611c97565b600b54600c5473ffffffffffffffffffffffffffffffffffffffff610100909204821691165b9092509050611e79565b600080611cac612f63565b600f549193509150611ce49073ffffffffffffffffffffffffffffffffffffffff1683611cdf898963ffffffff61261216565b61343c565b600b5473ffffffffffffffffffffffffffffffffffffffff838116610100909204161480611d2c5750600c5473ffffffffffffffffffffffffffffffffffffffff8381169116145b15611db357600b5473ffffffffffffffffffffffffffffffffffffffff8381166101009092041614611d8357600c54600b5473ffffffffffffffffffffffffffffffffffffffff9182169161010090910416611da9565b600b54600c5473ffffffffffffffffffffffffffffffffffffffff610100909204821691165b9094509250611e76565b611e19828215611ddb57600c5473ffffffffffffffffffffffffffffffffffffffff16611dfa565b600b54610100900473ffffffffffffffffffffffffffffffffffffffff165b611cdf8573ffffffffffffffffffffffffffffffffffffffff1661256d565b8015611e4a57600c54600b5473ffffffffffffffffffffffffffffffffffffffff9182169161010090910416611e70565b600b54600c5473ffffffffffffffffffffffffffffffffffffffff610100909204821691165b90945092505b50505b6000611e9a8373ffffffffffffffffffffffffffffffffffffffff1661256d565b905060008111611ea657fe5b600080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015611f1157600080fd5b505afa158015611f25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611f499190810190613fd8565b50600b546dffffffffffffffffffffffffffff92831694509116915060009073ffffffffffffffffffffffffffffffffffffffff8781166101009092041614611f925781611f94565b825b90506000611fa285836135af565b9050611faf87878361343c565b6000611fea8888611fc6898663ffffffff61261216565b611fe58b73ffffffffffffffffffffffffffffffffffffffff1661256d565b613630565b600e546040517fb6b55f2500000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff169063b6b55f25906120419084906004016148ab565b600060405180830381600087803b15801561205b57600080fd5b505af115801561206f573d6000803e3d6000fd5b505050503373ffffffffffffffffffffffffffffffffffffffff167fc003f45bc224d116b6d079100d4ab57a5b9633244c47a5a92a176c5b79a85f288b8b6040516120bb929190614b0a565b60405180910390a2505050505050505050505b6120d6612708565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b600b5460ff1661213f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90614a89565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556120d6612708565b60006e01000000000000000000000000000082106121b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90614a19565b50805b919050565b6000826121d057506000610864565b828202828482816121dd57fe5b0414610a59576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90614a29565b6000610a5983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061370a565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526005602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906122bf9085906148ab565b60405180910390a3505050565b6000818484111561230a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f9190614988565b505050900390565b604080518082018252601b81527f496d7065726d61783a205452414e534645525f544f4f5f48494748000000000060208083019190915273ffffffffffffffffffffffffffffffffffffffff861660009081526004909152919091205461238091839063ffffffff6122cc16565b73ffffffffffffffffffffffffffffffffffffffff80851660009081526004602052604080822093909355908416815220546123c2908263ffffffff61375b16565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526004602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906122bf9085906148ab565b60408051600280825260608083018452600093909291906020830190803883395050600f54825192935073ffffffffffffffffffffffffffffffffffffffff169183915060009061246e57fe5b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920101526010548251911690829060019081106124a657fe5b73ffffffffffffffffffffffffffffffffffffffff9283166020918202929092010152600e546040517f31279d3d0000000000000000000000000000000000000000000000000000000081529116906331279d3d9061250b9030908590600401614862565b600060405180830381600087803b15801561252557600080fd5b505af1158015612539573d6000803e3d6000fd5b5050505061254561379a565b600f546125679073ffffffffffffffffffffffffffffffffffffffff1661256d565b91505090565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8316906370a08231906125c290309060040161478b565b60206040518083038186803b1580156125da57600080fd5b505afa1580156125ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506108649190810190614039565b6000610a5983836040518060400160405280601f81526020017f536166654d6174683a207375627472616374696f6e20756e646572666c6f77008152506122cc565b600354612667908263ffffffff61375b16565b60035573ffffffffffffffffffffffffffffffffffffffff82166000908152600460205260409020546126a0908263ffffffff61375b16565b73ffffffffffffffffffffffffffffffffffffffff83166000818152600460205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906126fc9085906148ab565b60405180910390a35050565b600e546040517f70a0823100000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906370a082319061275f90309060040161478b565b60206040518083038186803b15801561277757600080fd5b505afa15801561278b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506127af9190810190614039565b905080600a819055507f8a0df8ef054fae2c3d2d19a7b322e864870cc9fd3cb07fb9526309c596244bf4816040516127e791906148ab565b60405180910390a150565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260046020526040902054612828908263ffffffff61261216565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260046020526040902055600354612861908263ffffffff61261216565b60035560405160009073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906126fc9085906148ab565b600854604080518082018252601981527f7472616e7366657228616464726573732c75696e7432353629000000000000006020909101525160009160609173ffffffffffffffffffffffffffffffffffffffff909116907fa9059cbb2ab09eb219583f4a59a5d0623ade346d962bcd4e46b11da047c9049b906129389087908790602401614882565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516129c19190614743565b6000604051808303816000865af19150503d80600081146129fe576040519150601f19603f3d011682016040523d82523d6000602084013e612a03565b606091505b5091509150818015612a2d575080511580612a2d575080806020019051612a2d9190810190613fba565b612a63576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90614a69565b50505050565b42851015612aa3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90614999565b60065473ffffffffffffffffffffffffffffffffffffffff891660009081526007602090815260408083208054600181019091559051929392612af19286928e928e928e92918e91016148b9565b60405160208183030381529060405280519060200120604051602001612b1892919061474f565b604051602081830303815290604052805190602001209050600060018287878760405160008152602001604052604051612b55949392919061494a565b6020604051602081039080840390855afa158015612b77573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590612bf257508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b611a15576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90614a09565b8151612c3b906000906020850190613af4565b508051612c4f906001906020840190613af4565b506040514690612c5e90614780565b6040805191829003822085516020808801919091208484018452600185527f3100000000000000000000000000000000000000000000000000000000000000948201949094529151612cd89391927fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6918691309101614908565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120600655505050565b600060608473ffffffffffffffffffffffffffffffffffffffff1663095ea7b38585604051602401612d49929190614882565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051612d979190614743565b6000604051808303816000865af19150503d8060008114612dd4576040519150601f19603f3d011682016040523d82523d6000602084013e612dd9565b606091505b5091509150818015612e03575080511580612e03575080806020019051612e039190810190613fba565b612e39576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f906149c9565b5050505050565b600060608473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401612e73929190614882565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051612ec19190614743565b6000604051808303816000865af19150503d8060008114612efe576040519150601f19603f3d011682016040523d82523d6000602084013e612f03565b606091505b5091509150818015612f2d575080511580612f2d575080806020019051612f2d9190810190613fba565b612e39576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90614a39565b600080805b60115481101561306c5760118181548110612f7f57fe5b600091825260209091200154600b54610100900473ffffffffffffffffffffffffffffffffffffffff90811691161415612fec5760118181548110612fc057fe5b600091825260208220015473ffffffffffffffffffffffffffffffffffffffff16935091506134389050565b60118181548110612ff957fe5b600091825260209091200154600c5473ffffffffffffffffffffffffffffffffffffffff90811691161415613064576011818154811061303557fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169250600191506134389050565b600101612f68565b50600080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156130d857600080fd5b505afa1580156130ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506131109190810190613fd8565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff16915061313d613b6e565b5060408051808201909152600b5473ffffffffffffffffffffffffffffffffffffffff61010090910481168252600c5416602082015261317b613b6e565b604051806040016040528085815260200184815250905060116000815481106131a057fe5b600091825260208083209190910154600d54604080517fc45a0155000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9384169b5094995089948594939092169263c45a015592600480840193829003018186803b15801561322157600080fd5b505afa158015613235573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506132599190810190613d48565b905060005b6011548110156134305760005b60028110156134275760008373ffffffffffffffffffffffffffffffffffffffff16636801cc3088846002811061329e57fe5b6020020151601186815481106132b057fe5b60009182526020822001546040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815261330e939273ffffffffffffffffffffffffffffffffffffffff90921691906004016147b4565b60206040518083038186803b15801561332657600080fd5b505afa15801561333a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061335e9190810190613d48565b905073ffffffffffffffffffffffffffffffffffffffff8116613381575061341f565b60006133da87846002811061339257fe5b602002015161079d670de0b6b3a7640000610f55868d89600281106133b357fe5b602002015173ffffffffffffffffffffffffffffffffffffffff169063ffffffff61387416565b90508581111561341c57809550829a50601184815481106133f757fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169b505b50505b60010161326b565b5060010161325e565b505050505050505b9091565b6134468382613919565b604080516001808252818301909252606091816020015b613465613b8c565b81526020019060019003908161345d57905050905060405180606001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff16815260200160001515815250816000815181106134d157fe5b6020908102919091010152600d546040517ff41766d800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063f41766d89061353b908590600090869030904290600401614ac1565b600060405180830381600087803b15801561355557600080fd5b505af1158015613569573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052612e399190810190613f85565b6000806135c46107cd8463ffffffff6121c116565b905060006135e2610f94610f558681896103e863ffffffff6121c116565b9050600061360e613609836135fd868063ffffffff6121c116565b9063ffffffff61375b16565b613a1b565b90506136266107ca61079d838663ffffffff61261216565b9695505050505050565b600061363c8584613919565b6136468483613919565b600d546040517f5a47ddc300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690635a47ddc3906136ad90889088906000908990899083908190309042906004016147dc565b606060405180830381600087803b1580156136c757600080fd5b505af11580156136db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506136ff9190810190614057565b979650505050505050565b60008183613745576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f9190614988565b50600083858161375157fe5b0495945050505050565b600082820183811015610a59576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f906149e9565b6010546000906137bf9073ffffffffffffffffffffffffffffffffffffffff1661256d565b90508015613871576010546040517f7f8661a100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690637f8661a19061381d9084906004016148ab565b602060405180830381600087803b15801561383757600080fd5b505af115801561384b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061386f9190810190614039565b505b50565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8416906370a08231906138c990859060040161478b565b60206040518083038186803b1580156138e157600080fd5b505afa1580156138f5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610a599190810190614039565b600d546040517fdd62ed3e000000000000000000000000000000000000000000000000000000008152829173ffffffffffffffffffffffffffffffffffffffff8086169263dd62ed3e92613974923092911690600401614799565b60206040518083038186803b15801561398c57600080fd5b505afa1580156139a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506139c49190810190614039565b106139ce5761386f565b600d5461386f9073ffffffffffffffffffffffffffffffffffffffff84811691167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff63ffffffff612d1616565b60006003821115613a5e575080600160028204015b81811015613a5857809150600281828581613a4757fe5b040181613a5057fe5b049050613a30565b506121bc565b81156121bc57506001919050565b828054828255906000526020600020908101928215613ae4579160200282015b82811115613ae45781547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff843516178255602090920191600190910190613a8c565b50613af0929150613bac565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613b3557805160ff1916838001178555613b62565b82800160010185558215613b62579182015b82811115613b62578251825591602001919060010190613b47565b50613af0929150613be8565b60405180604001604052806002906020820280388339509192915050565b604080516060810182526000808252602082018190529181019190915290565b610b9891905b80821115613af05780547fffffffffffffffffffffffff0000000000000000000000000000000000000000168155600101613bb2565b610b9891905b80821115613af05760008155600101613bee565b803561086481614c53565b805161086481614c53565b60008083601f840112613c2a57600080fd5b50813567ffffffffffffffff811115613c4257600080fd5b602083019150836020820283011115613c5a57600080fd5b9250929050565b600082601f830112613c7257600080fd5b8151613c85613c8082614b75565b614b4e565b91508181835260208401935060208101905083856020840282011115613caa57600080fd5b60005b83811015613cd65781613cc08882613d01565b8452506020928301929190910190600101613cad565b5050505092915050565b805161086481614c67565b803561086481614c70565b805161086481614c79565b805161086481614c70565b805161086481614c82565b803561086481614c8b565b600060208284031215613d3457600080fd5b6000613d408484613c02565b949350505050565b600060208284031215613d5a57600080fd5b6000613d408484613c0d565b60008060408385031215613d7957600080fd5b6000613d858585613c02565b9250506020613d9685828601613c02565b9150509250929050565b60008060008060008060008060006101008a8c031215613dbf57600080fd5b6000613dcb8c8c613c02565b9950506020613ddc8c828d01613c02565b9850506040613ded8c828d01613c02565b9750506060613dfe8c828d01613c02565b9650506080613e0f8c828d01613c02565b95505060a0613e208c828d01613c02565b94505060c0613e318c828d01613c02565b93505060e08a013567ffffffffffffffff811115613e4e57600080fd5b613e5a8c828d01613c18565b92509250509295985092959850929598565b600080600060608486031215613e8157600080fd5b6000613e8d8686613c02565b9350506020613e9e86828701613c02565b9250506040613eaf86828701613ceb565b9150509250925092565b600080600080600080600060e0888a031215613ed457600080fd5b6000613ee08a8a613c02565b9750506020613ef18a828b01613c02565b9650506040613f028a828b01613ceb565b9550506060613f138a828b01613ceb565b9450506080613f248a828b01613d17565b93505060a0613f358a828b01613ceb565b92505060c0613f468a828b01613ceb565b91505092959891949750929550565b60008060408385031215613f6857600080fd5b6000613f748585613c02565b9250506020613d9685828601613ceb565b600060208284031215613f9757600080fd5b815167ffffffffffffffff811115613fae57600080fd5b613d4084828501613c61565b600060208284031215613fcc57600080fd5b6000613d408484613ce0565b600080600060608486031215613fed57600080fd5b6000613ff98686613cf6565b935050602061400a86828701613cf6565b9250506040613eaf86828701613d0c565b60006020828403121561402d57600080fd5b6000613d408484613ceb565b60006020828403121561404b57600080fd5b6000613d408484613d01565b60008060006060848603121561406c57600080fd5b60006140788686613d01565b935050602061408986828701613d01565b9250506040613eaf86828701613d01565b60006140a683836140c2565b505060200190565b60006140ba83836146f1565b505060600190565b6140cb81614ba9565b82525050565b60006140dc82614b9c565b6140e68185614ba0565b93506140f183614b96565b8060005b8381101561411f578151614109888261409a565b975061411483614b96565b9250506001016140f5565b509495945050505050565b600061413582614b9c565b61413f8185614ba0565b935061414a83614b96565b8060005b8381101561411f57815161416288826140ae565b975061416d83614b96565b92505060010161414e565b6140cb81614bb4565b6140cb81610b98565b6140cb61419682610b98565b610b98565b60006141a682614b9c565b6141b081856121bc565b93506141c0818560208601614bff565b9290920192915050565b6140cb81614bf4565b60006141de82614b9c565b6141e88185614ba0565b93506141f8818560208601614bff565b61420181614c2b565b9093019392505050565b6000614218601183614ba0565b7f496d7065726d61783a2045585049524544000000000000000000000000000000815260200192915050565b6000614251601d83614ba0565b7f496d7065726d61783a20464143544f52595f414c52454144595f534554000000815260200192915050565b600061428a601f83614ba0565b7f5374616b65644c50546f6b656e3a204d494e545f414d4f554e545f5a45524f00815260200192915050565b60006142c3600c83614ba0565b7f2173616665417070726f76650000000000000000000000000000000000000000815260200192915050565b60006142fc602483614ba0565b7f5374616b65644c50546f6b656e3a20494e53554646494349454e545f5245534581527f5256455300000000000000000000000000000000000000000000000000000000602082015260400192915050565b600061435b6002836121bc565b7f1901000000000000000000000000000000000000000000000000000000000000815260020192915050565b6000614394601b83614ba0565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000815260200192915050565b60006143cd602183614ba0565b7f5374616b65644c50546f6b656e3a2052454445454d5f414d4f554e545f5a455281527f4f00000000000000000000000000000000000000000000000000000000000000602082015260400192915050565b600061442c601b83614ba0565b7f496d7065726d61783a20494e56414c49445f5349474e41545552450000000000815260200192915050565b6000614465601683614ba0565b7f5374616b65644c50546f6b656e3a205341464531313200000000000000000000815260200192915050565b600061449e6052836121bc565b7f454950373132446f6d61696e28737472696e67206e616d652c737472696e672081527f76657273696f6e2c75696e7432353620636861696e49642c616464726573732060208201527f766572696679696e67436f6e7472616374290000000000000000000000000000604082015260520192915050565b6000614523602183614ba0565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f81527f7700000000000000000000000000000000000000000000000000000000000000602082015260400192915050565b6000614582600d83614ba0565b7f21736166655472616e7366657200000000000000000000000000000000000000815260200192915050565b60006145bb602083614ba0565b7f5374616b65644c50546f6b656e3a20494e53554646494349454e545f43415348815260200192915050565b60006145f4602283614ba0565b7f5374616b65644c50546f6b656e3a20464143544f52595f414c52454144595f5381527f4554000000000000000000000000000000000000000000000000000000000000602082015260400192915050565b6000614653601983614ba0565b7f496d7065726d61783a205452414e534645525f4641494c454400000000000000815260200192915050565b600061468c601783614ba0565b7f5374616b65644c50546f6b656e3a204e4f5f4741554745000000000000000000815260200192915050565b60006146c5601383614ba0565b7f496d7065726d61783a205245454e544552454400000000000000000000000000815260200192915050565b8051606083019061470284826140c2565b50602082015161471560208501826140c2565b506040820151612a636040850182614178565b6140cb81614bb9565b6140cb81614be5565b6140cb81614bee565b6000610a59828461419b565b600061475a8261434e565b9150614766828561418a565b602082019150614776828461418a565b5060200192915050565b600061086482614491565b6020810161086482846140c2565b604081016147a782856140c2565b610a5960208301846140c2565b606081016147c282866140c2565b6147cf60208301856140c2565b613d406040830184614178565b61012081016147eb828c6140c2565b6147f8602083018b6140c2565b614805604083018a614178565b6148126060830189614181565b61481f6080830188614181565b61482c60a08301876141ca565b61483960c08301866141ca565b61484660e08301856140c2565b614854610100830184614181565b9a9950505050505050505050565b6040810161487082856140c2565b8181036020830152613d4081846140d1565b6040810161489082856140c2565b610a596020830184614181565b602081016108648284614178565b602081016108648284614181565b60c081016148c78289614181565b6148d460208301886140c2565b6148e160408301876140c2565b6148ee6060830186614181565b6148fb6080830185614181565b6136ff60a0830184614181565b60a081016149168288614181565b6149236020830187614181565b6149306040830186614181565b61493d6060830185614181565b61362660808301846140c2565b608081016149588287614181565b614965602083018661473a565b6149726040830185614181565b61497f6060830184614181565b95945050505050565b60208082528101610a5981846141d3565b602080825281016108648161420b565b6020808252810161086481614244565b602080825281016108648161427d565b60208082528101610864816142b6565b60208082528101610864816142ef565b6020808252810161086481614387565b60208082528101610864816143c0565b602080825281016108648161441f565b6020808252810161086481614458565b6020808252810161086481614516565b6020808252810161086481614575565b60208082528101610864816145ae565b60208082528101610864816145e7565b6020808252810161086481614646565b602080825281016108648161467f565b60208082528101610864816146b8565b60608101614aa78286614728565b614ab46020830185614728565b613d406040830184614731565b60a08101614acf8288614181565b614adc60208301876141ca565b8181036040830152614aee818661412a565b9050614afd60608301856140c2565b6136266080830184614181565b604081016148908285614181565b60608101614b268286614181565b614b336020830185614181565b613d406040830184614181565b60208101610864828461473a565b60405181810167ffffffffffffffff81118282101715614b6d57600080fd5b604052919050565b600067ffffffffffffffff821115614b8c57600080fd5b5060209081020190565b60200190565b5190565b90815260200190565b600061086482614bcc565b151590565b6dffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b63ffffffff1690565b60ff1690565b600061086482610b98565b60005b83811015614c1a578181015183820152602001614c02565b83811115612a635750506000910152565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690565b614c5c81614ba9565b811461387157600080fd5b614c5c81614bb4565b614c5c81610b98565b614c5c81614bb9565b614c5c81614be5565b614c5c81614bee56fea365627a7a723158208217ad06e1fa4cf23286e805088a20640f6d511893e8bc522d668584ec740f2a6c6578706572696d656e74616cf564736f6c63430005100040

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102d35760003560e01c806370e5a89811610186578063c45a0155116100e3578063e8bea16711610097578063f887ea4011610071578063f887ea4014610501578063fdb5a03e14610509578063fff6cae914610511576102d3565b8063e8bea167146104de578063ebce9331146104e6578063ebeb31db146104f9576102d3565b8063d21220a7116100c8578063d21220a7146104b0578063d505accf146104b8578063dd62ed3e146104cb576102d3565b8063c45a0155146104a0578063d1af0c7d146104a8576102d3565b8063a6f19c841161013a578063ad7a672f1161011f578063ad7a672f1461047d578063ba9a7a5614610485578063bc25cf771461048d576102d3565b8063a6f19c8414610462578063a9059cbb1461046a576102d3565b80638950b9a61161016b5780638950b9a61461043f57806395a2251f1461044757806395d89b411461045a576102d3565b806370e5a898146104195780637ecebe001461042c576102d3565b806330adf81f116102345780634a5d316c116101e85780636c2a3bc5116101cd5780636c2a3bc5146103f65780636f307dc3146103fe57806370a0823114610406576102d3565b80634a5d316c146103d95780636a627842146103e3576102d3565b80633644e515116102195780633644e515146103c15780633ba0b9a9146103c95780633d18b912146103d1576102d3565b806330adf81f146103a4578063313ce567146103ac576102d3565b806318160ddd1161028b57806322be3de11161027057806322be3de11461037657806323b872dd1461037e578063252c09d714610391576102d3565b806318160ddd1461034a5780631df8c7171461035f576102d3565b8063095ea7b3116102bc578063095ea7b31461030d5780630a6410631461032d5780630dfe168114610335576102d3565b806306fdde03146102d85780630902f1ac146102f6575b600080fd5b6102e0610519565b6040516102ed9190614988565b60405180910390f35b6102fe6105c5565b6040516102ed93929190614a99565b61032061031b366004613f55565b610853565b6040516102ed919061489d565b61032061086a565b61033d61086f565b6040516102ed919061478b565b610352610890565b6040516102ed91906148ab565b610367610896565b6040516102ed93929190614b18565b610320610946565b61032061038c366004613e6c565b61094b565b61036761039f36600461401b565b610a60565b610352610b18565b6103b4610b3c565b6040516102ed9190614b40565b610352610b45565b610352610b4b565b610352610b9b565b6103e1610c46565b005b6103526103f1366004613d22565b610cc2565b610352611075565b61033d611080565b610352610414366004613d22565b61109c565b61033d61042736600461401b565b6110ae565b61035261043a366004613d22565b6110e2565b61033d6110f4565b610352610455366004613d22565b611110565b6102e061132f565b61033d6113a7565b610320610478366004613f55565b6113c3565b6103526113d0565b6103526113d6565b6103e161049b366004613d22565b6113dc565b61033d611532565b61033d61154e565b61033d61156a565b6103e16104c6366004613eb9565b611586565b6103526104d9366004613d66565b6115ca565b6102e06115e7565b6103e16104f4366004613da0565b611620565b610352611a21565b61033d611ac9565b6103e1611ae5565b6103e1612103565b6000805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f810184900484028201840190925281815292918301828280156105bd5780601f10610592576101008083540402835291602001916105bd565b820191906000526020600020905b8154815290600101906020018083116105a057829003601f168201915b505050505081565b600080600080600080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561063657600080fd5b505afa15801561064a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061066e9190810190613fd8565b63ffffffff1692506dffffffffffffffffffffffffffff1692506dffffffffffffffffffffffffffff1692506106a38361216f565b95506106ae8261216f565b945064010000000081069350600354600014156106ce575061084e915050565b600a54600854604080517f18160ddd000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff16916318160ddd916004808301926020929190829003018186803b15801561073c57600080fd5b505afa158015610750573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506107749190810190614039565b90506107ae6107a98261079d856dffffffffffffffffffffffffffff8d1663ffffffff6121c116565b9063ffffffff61221516565b61216f565b97506107d76107a98261079d856dffffffffffffffffffffffffffff8c1663ffffffff6121c116565b96506064886dffffffffffffffffffffffffffff1611801561080957506064876dffffffffffffffffffffffffffff16115b610848576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f906149d9565b60405180910390fd5b50505050505b909192565b6000610860338484612257565b5060015b92915050565b600181565b600b54610100900473ffffffffffffffffffffffffffffffffffffffff1681565b60035481565b6000806000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631df8c7176040518163ffffffff1660e01b815260040160606040518083038186803b15801561090357600080fd5b505afa158015610917573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061093b9190810190614057565b925092509250909192565b600081565b73ffffffffffffffffffffffffffffffffffffffff831660009081526005602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14610a4a57604080518082018252601e81527f496d7065726d61783a205452414e534645525f4e4f545f414c4c4f574544000060208083019190915273ffffffffffffffffffffffffffffffffffffffff87166000908152600582528381203382529091529190912054610a1891849063ffffffff6122cc16565b73ffffffffffffffffffffffffffffffffffffffff851660009081526005602090815260408083203384529091529020555b610a55848484612312565b5060015b9392505050565b6008546040517f252c09d70000000000000000000000000000000000000000000000000000000081526000918291829173ffffffffffffffffffffffffffffffffffffffff169063252c09d790610abb9087906004016148ab565b60606040518083038186803b158015610ad357600080fd5b505afa158015610ae7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610b0b9190810190614057565b9250925092509193909250565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60025460ff1681565b60065481565b600354600a5460009190811580610b60575080155b15610b7757670de0b6b3a764000092505050610b98565b610b938261079d83670de0b6b3a764000063ffffffff6121c116565b925050505b90565b600b5460009060ff16610bda576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90614a89565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055333214610c0e57600080fd5b610c16612421565b9050600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905590565b60095473ffffffffffffffffffffffffffffffffffffffff1615610c96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f906149a9565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001633179055565b600b5460009060ff16610d01576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90614a89565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600854600090610d4e9073ffffffffffffffffffffffffffffffffffffffff1661256d565b600e546040517f70a0823100000000000000000000000000000000000000000000000000000000815291925060009173ffffffffffffffffffffffffffffffffffffffff909116906370a0823190610daa90309060040161478b565b60206040518083038186803b158015610dc257600080fd5b505afa158015610dd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610dfa9190810190614039565b600e546040517fb6b55f2500000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff169063b6b55f2590610e519085906004016148ab565b600060405180830381600087803b158015610e6b57600080fd5b505af1158015610e7f573d6000803e3d6000fd5b5050600e546040517f70a082310000000000000000000000000000000000000000000000000000000081526000935073ffffffffffffffffffffffffffffffffffffffff90911691506370a0823190610edc90309060040161478b565b60206040518083038186803b158015610ef457600080fd5b505afa158015610f08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610f2c9190810190614039565b9050610f61610f39610b4b565b61079d670de0b6b3a7640000610f55858763ffffffff61261216565b9063ffffffff6121c116565b935060035460001415610f8f57610f80846103e863ffffffff61261216565b9350610f8f60006103e8612654565b60008411610fc9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f906149b9565b610fd38585612654565b8473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f2f00e3cdd69a77be7ed215ec7b2a36784dd158f921fca79ac29deffa353fe6ee8587604051611032929190614b0a565b60405180910390a3505050611045612708565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055919050565b66470de4df82000081565b60085473ffffffffffffffffffffffffffffffffffffffff1681565b60046020526000908152604090205481565b601181815481106110bb57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b60076020526000908152604090205481565b60105473ffffffffffffffffffffffffffffffffffffffff1681565b600b5460009060ff1661114f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90614a89565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055306000908152600460205260409020546111ab670de0b6b3a764000061079d61119e610b4b565b849063ffffffff6121c116565b9150600082116111e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f906149f9565b600a54821115611223576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90614a49565b61122d30826127f2565b600e546040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690632e1a7d4d906112839085906004016148ab565b600060405180830381600087803b15801561129d57600080fd5b505af11580156112b1573d6000803e3d6000fd5b505050506112bf83836128af565b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f3f693fff038bb8a046aa76d9516190ac7444f7d69cf952c4cbdc086fdef2d6fc848460405161131e929190614b0a565b60405180910390a350611045612708565b60018054604080516020600284861615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f810184900484028201840190925281815292918301828280156105bd5780601f10610592576101008083540402835291602001916105bd565b600e5473ffffffffffffffffffffffffffffffffffffffff1681565b6000610860338484612312565b600a5481565b6103e881565b600b5460ff16611418576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90614a89565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600a546008546040517f70a082310000000000000000000000000000000000000000000000000000000081526115049284926114ff9273ffffffffffffffffffffffffffffffffffffffff909116906370a08231906114a390309060040161478b565b60206040518083038186803b1580156114bb57600080fd5b505afa1580156114cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506114f39190810190614039565b9063ffffffff61261216565b6128af565b50600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60095473ffffffffffffffffffffffffffffffffffffffff1681565b600f5473ffffffffffffffffffffffffffffffffffffffff1681565b600c5473ffffffffffffffffffffffffffffffffffffffff1681565b6115b6878787878787877f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9612a69565b6115c1878787612257565b50505050505050565b600560209081526000928352604080842090915290825290205481565b6040518060400160405280600c81526020017f536f6c69646c794261736537000000000000000000000000000000000000000081525081565b60095473ffffffffffffffffffffffffffffffffffffffff1615611670576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90614a59565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001633179055604080518082018252601181527f5374616b656420556e69737761702056320000000000000000000000000000006020808301919091528251808401909352600b83527f53544b442d554e492d56320000000000000000000000000000000000000000009083015261170b91612c28565b600880547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff8c811691909117909255600b80547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101008c851602179055600c805482168a8416179055600d80549091168883161790556040517f2045be9000000000000000000000000000000000000000000000000000000000815290861690632045be90906117d9908c9060040161478b565b60206040518083038186803b1580156117f157600080fd5b505afa158015611805573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506118299190810190613d48565b600e80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9283161790819055166118a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90614a79565b600f805473ffffffffffffffffffffffffffffffffffffffff8087167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255601080549286169290911691909117905561190460118383613a6c565b5061194c73ffffffffffffffffffffffffffffffffffffffff8516877fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff63ffffffff612d1616565b600e546119999073ffffffffffffffffffffffffffffffffffffffff8b811691167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff63ffffffff612d1616565b60005b81811015611a1557611a0d877fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8585858181106119d557fe5b90506020020160206119ea9190810190613d22565b73ffffffffffffffffffffffffffffffffffffffff16919063ffffffff612d1616565b60010161199c565b50505050505050505050565b600854604080517febeb31db000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163ebeb31db916004808301926020929190829003018186803b158015611a8c57600080fd5b505afa158015611aa0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611ac49190810190614039565b905090565b600d5473ffffffffffffffffffffffffffffffffffffffff1681565b600b5460ff16611b21576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90614a89565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055333214611b5557600080fd5b6000611b5f612421565b905080611b6c57506120ce565b6000670de0b6b3a7640000611b8e8366470de4df82000063ffffffff6121c116565b81611b9557fe5b600f549190049150611bc49073ffffffffffffffffffffffffffffffffffffffff16338363ffffffff612e4016565b600f54600b546000918291610100900473ffffffffffffffffffffffffffffffffffffffff90811691161480611c175750600f54600c5473ffffffffffffffffffffffffffffffffffffffff9081169116145b15611ca157600f54600b54610100900473ffffffffffffffffffffffffffffffffffffffff908116911614611c7157600c54600b5473ffffffffffffffffffffffffffffffffffffffff9182169161010090910416611c97565b600b54600c5473ffffffffffffffffffffffffffffffffffffffff610100909204821691165b9092509050611e79565b600080611cac612f63565b600f549193509150611ce49073ffffffffffffffffffffffffffffffffffffffff1683611cdf898963ffffffff61261216565b61343c565b600b5473ffffffffffffffffffffffffffffffffffffffff838116610100909204161480611d2c5750600c5473ffffffffffffffffffffffffffffffffffffffff8381169116145b15611db357600b5473ffffffffffffffffffffffffffffffffffffffff8381166101009092041614611d8357600c54600b5473ffffffffffffffffffffffffffffffffffffffff9182169161010090910416611da9565b600b54600c5473ffffffffffffffffffffffffffffffffffffffff610100909204821691165b9094509250611e76565b611e19828215611ddb57600c5473ffffffffffffffffffffffffffffffffffffffff16611dfa565b600b54610100900473ffffffffffffffffffffffffffffffffffffffff165b611cdf8573ffffffffffffffffffffffffffffffffffffffff1661256d565b8015611e4a57600c54600b5473ffffffffffffffffffffffffffffffffffffffff9182169161010090910416611e70565b600b54600c5473ffffffffffffffffffffffffffffffffffffffff610100909204821691165b90945092505b50505b6000611e9a8373ffffffffffffffffffffffffffffffffffffffff1661256d565b905060008111611ea657fe5b600080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015611f1157600080fd5b505afa158015611f25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611f499190810190613fd8565b50600b546dffffffffffffffffffffffffffff92831694509116915060009073ffffffffffffffffffffffffffffffffffffffff8781166101009092041614611f925781611f94565b825b90506000611fa285836135af565b9050611faf87878361343c565b6000611fea8888611fc6898663ffffffff61261216565b611fe58b73ffffffffffffffffffffffffffffffffffffffff1661256d565b613630565b600e546040517fb6b55f2500000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff169063b6b55f25906120419084906004016148ab565b600060405180830381600087803b15801561205b57600080fd5b505af115801561206f573d6000803e3d6000fd5b505050503373ffffffffffffffffffffffffffffffffffffffff167fc003f45bc224d116b6d079100d4ab57a5b9633244c47a5a92a176c5b79a85f288b8b6040516120bb929190614b0a565b60405180910390a2505050505050505050505b6120d6612708565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b600b5460ff1661213f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90614a89565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556120d6612708565b60006e01000000000000000000000000000082106121b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90614a19565b50805b919050565b6000826121d057506000610864565b828202828482816121dd57fe5b0414610a59576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90614a29565b6000610a5983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061370a565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526005602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906122bf9085906148ab565b60405180910390a3505050565b6000818484111561230a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f9190614988565b505050900390565b604080518082018252601b81527f496d7065726d61783a205452414e534645525f544f4f5f48494748000000000060208083019190915273ffffffffffffffffffffffffffffffffffffffff861660009081526004909152919091205461238091839063ffffffff6122cc16565b73ffffffffffffffffffffffffffffffffffffffff80851660009081526004602052604080822093909355908416815220546123c2908263ffffffff61375b16565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526004602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906122bf9085906148ab565b60408051600280825260608083018452600093909291906020830190803883395050600f54825192935073ffffffffffffffffffffffffffffffffffffffff169183915060009061246e57fe5b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920101526010548251911690829060019081106124a657fe5b73ffffffffffffffffffffffffffffffffffffffff9283166020918202929092010152600e546040517f31279d3d0000000000000000000000000000000000000000000000000000000081529116906331279d3d9061250b9030908590600401614862565b600060405180830381600087803b15801561252557600080fd5b505af1158015612539573d6000803e3d6000fd5b5050505061254561379a565b600f546125679073ffffffffffffffffffffffffffffffffffffffff1661256d565b91505090565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8316906370a08231906125c290309060040161478b565b60206040518083038186803b1580156125da57600080fd5b505afa1580156125ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506108649190810190614039565b6000610a5983836040518060400160405280601f81526020017f536166654d6174683a207375627472616374696f6e20756e646572666c6f77008152506122cc565b600354612667908263ffffffff61375b16565b60035573ffffffffffffffffffffffffffffffffffffffff82166000908152600460205260409020546126a0908263ffffffff61375b16565b73ffffffffffffffffffffffffffffffffffffffff83166000818152600460205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906126fc9085906148ab565b60405180910390a35050565b600e546040517f70a0823100000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906370a082319061275f90309060040161478b565b60206040518083038186803b15801561277757600080fd5b505afa15801561278b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506127af9190810190614039565b905080600a819055507f8a0df8ef054fae2c3d2d19a7b322e864870cc9fd3cb07fb9526309c596244bf4816040516127e791906148ab565b60405180910390a150565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260046020526040902054612828908263ffffffff61261216565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260046020526040902055600354612861908263ffffffff61261216565b60035560405160009073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906126fc9085906148ab565b600854604080518082018252601981527f7472616e7366657228616464726573732c75696e7432353629000000000000006020909101525160009160609173ffffffffffffffffffffffffffffffffffffffff909116907fa9059cbb2ab09eb219583f4a59a5d0623ade346d962bcd4e46b11da047c9049b906129389087908790602401614882565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516129c19190614743565b6000604051808303816000865af19150503d80600081146129fe576040519150601f19603f3d011682016040523d82523d6000602084013e612a03565b606091505b5091509150818015612a2d575080511580612a2d575080806020019051612a2d9190810190613fba565b612a63576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90614a69565b50505050565b42851015612aa3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90614999565b60065473ffffffffffffffffffffffffffffffffffffffff891660009081526007602090815260408083208054600181019091559051929392612af19286928e928e928e92918e91016148b9565b60405160208183030381529060405280519060200120604051602001612b1892919061474f565b604051602081830303815290604052805190602001209050600060018287878760405160008152602001604052604051612b55949392919061494a565b6020604051602081039080840390855afa158015612b77573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590612bf257508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b611a15576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90614a09565b8151612c3b906000906020850190613af4565b508051612c4f906001906020840190613af4565b506040514690612c5e90614780565b6040805191829003822085516020808801919091208484018452600185527f3100000000000000000000000000000000000000000000000000000000000000948201949094529151612cd89391927fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6918691309101614908565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120600655505050565b600060608473ffffffffffffffffffffffffffffffffffffffff1663095ea7b38585604051602401612d49929190614882565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051612d979190614743565b6000604051808303816000865af19150503d8060008114612dd4576040519150601f19603f3d011682016040523d82523d6000602084013e612dd9565b606091505b5091509150818015612e03575080511580612e03575080806020019051612e039190810190613fba565b612e39576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f906149c9565b5050505050565b600060608473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401612e73929190614882565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051612ec19190614743565b6000604051808303816000865af19150503d8060008114612efe576040519150601f19603f3d011682016040523d82523d6000602084013e612f03565b606091505b5091509150818015612f2d575080511580612f2d575080806020019051612f2d9190810190613fba565b612e39576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90614a39565b600080805b60115481101561306c5760118181548110612f7f57fe5b600091825260209091200154600b54610100900473ffffffffffffffffffffffffffffffffffffffff90811691161415612fec5760118181548110612fc057fe5b600091825260208220015473ffffffffffffffffffffffffffffffffffffffff16935091506134389050565b60118181548110612ff957fe5b600091825260209091200154600c5473ffffffffffffffffffffffffffffffffffffffff90811691161415613064576011818154811061303557fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169250600191506134389050565b600101612f68565b50600080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156130d857600080fd5b505afa1580156130ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506131109190810190613fd8565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff16915061313d613b6e565b5060408051808201909152600b5473ffffffffffffffffffffffffffffffffffffffff61010090910481168252600c5416602082015261317b613b6e565b604051806040016040528085815260200184815250905060116000815481106131a057fe5b600091825260208083209190910154600d54604080517fc45a0155000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9384169b5094995089948594939092169263c45a015592600480840193829003018186803b15801561322157600080fd5b505afa158015613235573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506132599190810190613d48565b905060005b6011548110156134305760005b60028110156134275760008373ffffffffffffffffffffffffffffffffffffffff16636801cc3088846002811061329e57fe5b6020020151601186815481106132b057fe5b60009182526020822001546040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815261330e939273ffffffffffffffffffffffffffffffffffffffff90921691906004016147b4565b60206040518083038186803b15801561332657600080fd5b505afa15801561333a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061335e9190810190613d48565b905073ffffffffffffffffffffffffffffffffffffffff8116613381575061341f565b60006133da87846002811061339257fe5b602002015161079d670de0b6b3a7640000610f55868d89600281106133b357fe5b602002015173ffffffffffffffffffffffffffffffffffffffff169063ffffffff61387416565b90508581111561341c57809550829a50601184815481106133f757fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169b505b50505b60010161326b565b5060010161325e565b505050505050505b9091565b6134468382613919565b604080516001808252818301909252606091816020015b613465613b8c565b81526020019060019003908161345d57905050905060405180606001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff16815260200160001515815250816000815181106134d157fe5b6020908102919091010152600d546040517ff41766d800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063f41766d89061353b908590600090869030904290600401614ac1565b600060405180830381600087803b15801561355557600080fd5b505af1158015613569573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052612e399190810190613f85565b6000806135c46107cd8463ffffffff6121c116565b905060006135e2610f94610f558681896103e863ffffffff6121c116565b9050600061360e613609836135fd868063ffffffff6121c116565b9063ffffffff61375b16565b613a1b565b90506136266107ca61079d838663ffffffff61261216565b9695505050505050565b600061363c8584613919565b6136468483613919565b600d546040517f5a47ddc300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690635a47ddc3906136ad90889088906000908990899083908190309042906004016147dc565b606060405180830381600087803b1580156136c757600080fd5b505af11580156136db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506136ff9190810190614057565b979650505050505050565b60008183613745576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f9190614988565b50600083858161375157fe5b0495945050505050565b600082820183811015610a59576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f906149e9565b6010546000906137bf9073ffffffffffffffffffffffffffffffffffffffff1661256d565b90508015613871576010546040517f7f8661a100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690637f8661a19061381d9084906004016148ab565b602060405180830381600087803b15801561383757600080fd5b505af115801561384b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061386f9190810190614039565b505b50565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8416906370a08231906138c990859060040161478b565b60206040518083038186803b1580156138e157600080fd5b505afa1580156138f5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610a599190810190614039565b600d546040517fdd62ed3e000000000000000000000000000000000000000000000000000000008152829173ffffffffffffffffffffffffffffffffffffffff8086169263dd62ed3e92613974923092911690600401614799565b60206040518083038186803b15801561398c57600080fd5b505afa1580156139a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506139c49190810190614039565b106139ce5761386f565b600d5461386f9073ffffffffffffffffffffffffffffffffffffffff84811691167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff63ffffffff612d1616565b60006003821115613a5e575080600160028204015b81811015613a5857809150600281828581613a4757fe5b040181613a5057fe5b049050613a30565b506121bc565b81156121bc57506001919050565b828054828255906000526020600020908101928215613ae4579160200282015b82811115613ae45781547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff843516178255602090920191600190910190613a8c565b50613af0929150613bac565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613b3557805160ff1916838001178555613b62565b82800160010185558215613b62579182015b82811115613b62578251825591602001919060010190613b47565b50613af0929150613be8565b60405180604001604052806002906020820280388339509192915050565b604080516060810182526000808252602082018190529181019190915290565b610b9891905b80821115613af05780547fffffffffffffffffffffffff0000000000000000000000000000000000000000168155600101613bb2565b610b9891905b80821115613af05760008155600101613bee565b803561086481614c53565b805161086481614c53565b60008083601f840112613c2a57600080fd5b50813567ffffffffffffffff811115613c4257600080fd5b602083019150836020820283011115613c5a57600080fd5b9250929050565b600082601f830112613c7257600080fd5b8151613c85613c8082614b75565b614b4e565b91508181835260208401935060208101905083856020840282011115613caa57600080fd5b60005b83811015613cd65781613cc08882613d01565b8452506020928301929190910190600101613cad565b5050505092915050565b805161086481614c67565b803561086481614c70565b805161086481614c79565b805161086481614c70565b805161086481614c82565b803561086481614c8b565b600060208284031215613d3457600080fd5b6000613d408484613c02565b949350505050565b600060208284031215613d5a57600080fd5b6000613d408484613c0d565b60008060408385031215613d7957600080fd5b6000613d858585613c02565b9250506020613d9685828601613c02565b9150509250929050565b60008060008060008060008060006101008a8c031215613dbf57600080fd5b6000613dcb8c8c613c02565b9950506020613ddc8c828d01613c02565b9850506040613ded8c828d01613c02565b9750506060613dfe8c828d01613c02565b9650506080613e0f8c828d01613c02565b95505060a0613e208c828d01613c02565b94505060c0613e318c828d01613c02565b93505060e08a013567ffffffffffffffff811115613e4e57600080fd5b613e5a8c828d01613c18565b92509250509295985092959850929598565b600080600060608486031215613e8157600080fd5b6000613e8d8686613c02565b9350506020613e9e86828701613c02565b9250506040613eaf86828701613ceb565b9150509250925092565b600080600080600080600060e0888a031215613ed457600080fd5b6000613ee08a8a613c02565b9750506020613ef18a828b01613c02565b9650506040613f028a828b01613ceb565b9550506060613f138a828b01613ceb565b9450506080613f248a828b01613d17565b93505060a0613f358a828b01613ceb565b92505060c0613f468a828b01613ceb565b91505092959891949750929550565b60008060408385031215613f6857600080fd5b6000613f748585613c02565b9250506020613d9685828601613ceb565b600060208284031215613f9757600080fd5b815167ffffffffffffffff811115613fae57600080fd5b613d4084828501613c61565b600060208284031215613fcc57600080fd5b6000613d408484613ce0565b600080600060608486031215613fed57600080fd5b6000613ff98686613cf6565b935050602061400a86828701613cf6565b9250506040613eaf86828701613d0c565b60006020828403121561402d57600080fd5b6000613d408484613ceb565b60006020828403121561404b57600080fd5b6000613d408484613d01565b60008060006060848603121561406c57600080fd5b60006140788686613d01565b935050602061408986828701613d01565b9250506040613eaf86828701613d01565b60006140a683836140c2565b505060200190565b60006140ba83836146f1565b505060600190565b6140cb81614ba9565b82525050565b60006140dc82614b9c565b6140e68185614ba0565b93506140f183614b96565b8060005b8381101561411f578151614109888261409a565b975061411483614b96565b9250506001016140f5565b509495945050505050565b600061413582614b9c565b61413f8185614ba0565b935061414a83614b96565b8060005b8381101561411f57815161416288826140ae565b975061416d83614b96565b92505060010161414e565b6140cb81614bb4565b6140cb81610b98565b6140cb61419682610b98565b610b98565b60006141a682614b9c565b6141b081856121bc565b93506141c0818560208601614bff565b9290920192915050565b6140cb81614bf4565b60006141de82614b9c565b6141e88185614ba0565b93506141f8818560208601614bff565b61420181614c2b565b9093019392505050565b6000614218601183614ba0565b7f496d7065726d61783a2045585049524544000000000000000000000000000000815260200192915050565b6000614251601d83614ba0565b7f496d7065726d61783a20464143544f52595f414c52454144595f534554000000815260200192915050565b600061428a601f83614ba0565b7f5374616b65644c50546f6b656e3a204d494e545f414d4f554e545f5a45524f00815260200192915050565b60006142c3600c83614ba0565b7f2173616665417070726f76650000000000000000000000000000000000000000815260200192915050565b60006142fc602483614ba0565b7f5374616b65644c50546f6b656e3a20494e53554646494349454e545f5245534581527f5256455300000000000000000000000000000000000000000000000000000000602082015260400192915050565b600061435b6002836121bc565b7f1901000000000000000000000000000000000000000000000000000000000000815260020192915050565b6000614394601b83614ba0565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000815260200192915050565b60006143cd602183614ba0565b7f5374616b65644c50546f6b656e3a2052454445454d5f414d4f554e545f5a455281527f4f00000000000000000000000000000000000000000000000000000000000000602082015260400192915050565b600061442c601b83614ba0565b7f496d7065726d61783a20494e56414c49445f5349474e41545552450000000000815260200192915050565b6000614465601683614ba0565b7f5374616b65644c50546f6b656e3a205341464531313200000000000000000000815260200192915050565b600061449e6052836121bc565b7f454950373132446f6d61696e28737472696e67206e616d652c737472696e672081527f76657273696f6e2c75696e7432353620636861696e49642c616464726573732060208201527f766572696679696e67436f6e7472616374290000000000000000000000000000604082015260520192915050565b6000614523602183614ba0565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f81527f7700000000000000000000000000000000000000000000000000000000000000602082015260400192915050565b6000614582600d83614ba0565b7f21736166655472616e7366657200000000000000000000000000000000000000815260200192915050565b60006145bb602083614ba0565b7f5374616b65644c50546f6b656e3a20494e53554646494349454e545f43415348815260200192915050565b60006145f4602283614ba0565b7f5374616b65644c50546f6b656e3a20464143544f52595f414c52454144595f5381527f4554000000000000000000000000000000000000000000000000000000000000602082015260400192915050565b6000614653601983614ba0565b7f496d7065726d61783a205452414e534645525f4641494c454400000000000000815260200192915050565b600061468c601783614ba0565b7f5374616b65644c50546f6b656e3a204e4f5f4741554745000000000000000000815260200192915050565b60006146c5601383614ba0565b7f496d7065726d61783a205245454e544552454400000000000000000000000000815260200192915050565b8051606083019061470284826140c2565b50602082015161471560208501826140c2565b506040820151612a636040850182614178565b6140cb81614bb9565b6140cb81614be5565b6140cb81614bee565b6000610a59828461419b565b600061475a8261434e565b9150614766828561418a565b602082019150614776828461418a565b5060200192915050565b600061086482614491565b6020810161086482846140c2565b604081016147a782856140c2565b610a5960208301846140c2565b606081016147c282866140c2565b6147cf60208301856140c2565b613d406040830184614178565b61012081016147eb828c6140c2565b6147f8602083018b6140c2565b614805604083018a614178565b6148126060830189614181565b61481f6080830188614181565b61482c60a08301876141ca565b61483960c08301866141ca565b61484660e08301856140c2565b614854610100830184614181565b9a9950505050505050505050565b6040810161487082856140c2565b8181036020830152613d4081846140d1565b6040810161489082856140c2565b610a596020830184614181565b602081016108648284614178565b602081016108648284614181565b60c081016148c78289614181565b6148d460208301886140c2565b6148e160408301876140c2565b6148ee6060830186614181565b6148fb6080830185614181565b6136ff60a0830184614181565b60a081016149168288614181565b6149236020830187614181565b6149306040830186614181565b61493d6060830185614181565b61362660808301846140c2565b608081016149588287614181565b614965602083018661473a565b6149726040830185614181565b61497f6060830184614181565b95945050505050565b60208082528101610a5981846141d3565b602080825281016108648161420b565b6020808252810161086481614244565b602080825281016108648161427d565b60208082528101610864816142b6565b60208082528101610864816142ef565b6020808252810161086481614387565b60208082528101610864816143c0565b602080825281016108648161441f565b6020808252810161086481614458565b6020808252810161086481614516565b6020808252810161086481614575565b60208082528101610864816145ae565b60208082528101610864816145e7565b6020808252810161086481614646565b602080825281016108648161467f565b60208082528101610864816146b8565b60608101614aa78286614728565b614ab46020830185614728565b613d406040830184614731565b60a08101614acf8288614181565b614adc60208301876141ca565b8181036040830152614aee818661412a565b9050614afd60608301856140c2565b6136266080830184614181565b604081016148908285614181565b60608101614b268286614181565b614b336020830185614181565b613d406040830184614181565b60208101610864828461473a565b60405181810167ffffffffffffffff81118282101715614b6d57600080fd5b604052919050565b600067ffffffffffffffff821115614b8c57600080fd5b5060209081020190565b60200190565b5190565b90815260200190565b600061086482614bcc565b151590565b6dffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b63ffffffff1690565b60ff1690565b600061086482610b98565b60005b83811015614c1a578181015183820152602001614c02565b83811115612a635750506000910152565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690565b614c5c81614ba9565b811461387157600080fd5b614c5c81614bb4565b614c5c81610b98565b614c5c81614bb9565b614c5c81614be5565b614c5c81614bee56fea365627a7a723158208217ad06e1fa4cf23286e805088a20640f6d511893e8bc522d668584ec740f2a6c6578706572696d656e74616cf564736f6c63430005100040

[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.