ETH Price: $3,407.15 (+1.57%)

Contract

0xE0839f9b9688a77924208aD509e29952dc660261
 
Transaction Hash
Method
Block
From
To
Approve170098052023-04-09 9:17:11628 days ago1681031831IN
0xE0839f9b...2dc660261
0 ETH0.0004825119.85248354
Approve170095712023-04-09 8:29:11628 days ago1681028951IN
0xE0839f9b...2dc660261
0 ETH0.0004835819.89666625
Approve170092952023-04-09 7:31:59628 days ago1681025519IN
0xE0839f9b...2dc660261
0 ETH0.0004880520.08040971
Approve134989862021-10-27 10:54:551157 days ago1635332095IN
0xE0839f9b...2dc660261
0 ETH0.00683372146.68115961
Approve132761702021-09-22 14:47:531191 days ago1632322073IN
0xE0839f9b...2dc660261
0 ETH0.0021874590
Approve132757832021-09-22 13:14:211191 days ago1632316461IN
0xE0839f9b...2dc660261
0 ETH0.0021716589.35
Approve127001992021-06-25 0:48:231281 days ago1624582103IN
0xE0839f9b...2dc660261
0 ETH0.0001600811
Approve123090512021-04-25 10:55:561342 days ago1619348156IN
0xE0839f9b...2dc660261
0 ETH0.0007130949
Approve120537962021-03-17 3:44:531381 days ago1615952693IN
0xE0839f9b...2dc660261
0 ETH0.00186278128
Approve119442862021-02-28 6:38:151398 days ago1614494295IN
0xE0839f9b...2dc660261
0 ETH0.00167359115.00000145
Approve119415092021-02-27 20:31:311398 days ago1614457891IN
0xE0839f9b...2dc660261
0 ETH0.00152806105
Approve119413212021-02-27 19:47:141398 days ago1614455234IN
0xE0839f9b...2dc660261
0 ETH0.00174636120
Transfer116967802021-01-21 4:53:441436 days ago1611204824IN
0xE0839f9b...2dc660261
0 ETH0.0035287268
Approve116731642021-01-17 14:10:321439 days ago1610892632IN
0xE0839f9b...2dc660261
0 ETH0.0026940661
Get Reward116495892021-01-13 22:58:011443 days ago1610578681IN
0xE0839f9b...2dc660261
0 ETH0.0033393947
Approve116419452021-01-12 19:00:291444 days ago1610478029IN
0xE0839f9b...2dc660261
0 ETH0.0006985448
Approve116378962021-01-12 4:09:321445 days ago1610424572IN
0xE0839f9b...2dc660261
0 ETH0.0039595289.00000156
Approve116378902021-01-12 4:08:071445 days ago1610424487IN
0xE0839f9b...2dc660261
0 ETH0.0036480982.00000156
Transfer116378822021-01-12 4:06:241445 days ago1610424384IN
0xE0839f9b...2dc660261
0 ETH0.0028795278.00000156
Approve115935112021-01-05 8:44:061452 days ago1609836246IN
0xE0839f9b...2dc660261
0 ETH0.0038674286.93
Transfer115890922021-01-04 16:30:431452 days ago1609777843IN
0xE0839f9b...2dc660261
0 ETH0.00635178172
Transfer115845412021-01-03 23:36:151453 days ago1609716975IN
0xE0839f9b...2dc660261
0 ETH0.00453681207
Withdraw All115839552021-01-03 21:24:131453 days ago1609709053IN
0xE0839f9b...2dc660261
0 ETH0.0191208472.1
Exit115839552021-01-03 21:24:131453 days ago1609709053IN
0xE0839f9b...2dc660261
0 ETH0.0083007272.1
Approve115838892021-01-03 21:07:381453 days ago1609708058IN
0xE0839f9b...2dc660261
0 ETH0.00542765122
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
StableYieldCredit

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-12-31
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function decimals() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

library Address {
    function isContract(address account) internal view returns (bool) {
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != 0x0 && codehash != accountHash);
    }
}

library SafeERC20 {
    using Address for address;

    function safeTransfer(IERC20 token, address to, uint value) internal {
        callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint value) internal {
        callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    function safeApprove(IERC20 token, address spender, uint value) internal {
        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }
    function callOptionalReturn(IERC20 token, bytes memory data) private {
        require(address(token).isContract(), "SafeERC20: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = address(token).call(data);
        require(success, "SafeERC20: low-level call failed");

        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

interface Oracle {
    function getPriceUSD(address reserve) external view returns (uint);
}

interface ISushiswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

    function createPair(address tokenA, address tokenB) external returns (address pair);

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

interface ISushiswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, 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;

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor () {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}



library SushiswapV2Library {
    // returns sorted token addresses, used to handle return values from pairs sorted in this order
    function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) {
        require(tokenA != tokenB, 'SushiswapV2Library: IDENTICAL_ADDRESSES');
        (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        require(token0 != address(0), 'SushiswapV2Library: ZERO_ADDRESS');
    }

    // calculates the CREATE2 address for a pair without making any external calls
    function pairFor(address factory, address tokenA, address tokenB) internal pure returns (address pair) {
        (address token0, address token1) = sortTokens(tokenA, tokenB);
        pair = address(uint160(uint(keccak256(abi.encodePacked(
                hex'ff',
                factory,
                keccak256(abi.encodePacked(token0, token1)),
                hex'e18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303' // init code hash
            )))));
    }

    // fetches and sorts the reserves for a pair
    function getReserves(address factory, address tokenA, address tokenB) internal view returns (uint reserveA, uint reserveB) {
        (address token0,) = sortTokens(tokenA, tokenB);
        (uint reserve0, uint reserve1,) = ISushiswapV2Pair(pairFor(factory, tokenA, tokenB)).getReserves();
        (reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
    }
    

    // given some amount of an asset and pair reserves, returns an equivalent amount of the other asset
    function quote(uint amountA, uint reserveA, uint reserveB) internal pure returns (uint amountB) {
        require(amountA > 0, 'SushiswapV2Library: INSUFFICIENT_AMOUNT');
        require(reserveA > 0 && reserveB > 0, 'SushiswapV2Library: INSUFFICIENT_LIQUIDITY');
        amountB = amountA * reserveB / reserveA;
    }
}

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a >= b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow, so we distribute
        return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2);
    }
}

contract StableYieldCredit is ReentrancyGuard {
    using SafeERC20 for IERC20;

    /// @notice EIP-20 token name for this token
    string public constant name = "Stable Yield Credit";

    /// @notice EIP-20 token symbol for this token
    string public constant symbol = "yCREDIT";

    /// @notice EIP-20 token decimals for this token
    uint8 public constant decimals = 8;

    /// @notice Total number of tokens in circulation
    uint public totalSupply = 0;
    
    /// @notice Total number of tokens staked for yield
    uint public stakedSupply = 0;

    mapping(address => mapping (address => uint)) internal allowances;
    mapping(address => uint) internal balances;
    mapping(address => uint) public stakes;

    /// @notice The EIP-712 typehash for the contract's domain
    bytes32 public constant DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,uint chainId,address verifyingContract)");
    bytes32 public immutable DOMAINSEPARATOR;

    /// @notice The EIP-712 typehash for the permit struct used by the contract
    bytes32 public constant PERMIT_TYPEHASH = keccak256("Permit(address owner,address spender,uint value,uint nonce,uint deadline)");

    /// @notice A record of states for signing / validating signatures
    mapping (address => uint) public nonces;

    function safe32(uint n, string memory errorMessage) internal pure returns (uint32) {
        require(n < 2**32, errorMessage);
        return uint32(n);
    }

    /// @notice The standard EIP-20 transfer event
    event Transfer(address indexed from, address indexed to, uint amount);
    
    /// @notice Stake event for claiming rewards
    event Staked(address indexed from, uint amount);
    
    // @notice Unstake event
    event Unstaked(address indexed from, uint amount);
    
    event Earned(address indexed from, uint amount);
    event Fees(uint amount);

    /// @notice The standard EIP-20 approval event
    event Approval(address indexed owner, address indexed spender, uint amount);

    // Oracle used for price debt data (external to the AMM balance to avoid internal manipulation)
    Oracle public constant LINK = Oracle(0x271bf4568fb737cc2e6277e9B1EE0034098cDA2a);
    ISushiswapV2Factory public constant FACTORY = ISushiswapV2Factory(0xC0AEe478e3658e2610c5F7A4A2E1777cE9e4f2Ac);
    
    // user => token => collateral
    mapping (address => mapping(address => uint)) public collateral;
    // user => token => credit
    mapping (address => mapping(address => uint)) public collateralCredit;
    
    address[] private _markets;
    mapping (address => bool) pairs;
    
    uint public rewardRate = 0;
    uint public periodFinish = 0;
    uint public DURATION = 7 days;
    uint public lastUpdateTime;
    uint public rewardPerTokenStored;
    
    mapping(address => uint) public userRewardPerTokenPaid;
    mapping(address => uint) public rewards;
    
    event Deposit(address indexed creditor, address indexed collateral, uint creditOut, uint amountIn, uint creditMinted);
    event Withdraw(address indexed creditor, address indexed collateral, uint creditIn, uint creditOut, uint amountOut);
    
    constructor () {
        DOMAINSEPARATOR = keccak256(abi.encode(DOMAIN_TYPEHASH, keccak256(bytes(name)), _getChainId(), address(this)));
    }
    
    uint public FEE = 50;
    uint public BASE = 10000;
    
    function lastTimeRewardApplicable() public view returns (uint) {
        return Math.min(block.timestamp, periodFinish);
    }
    
    function rewardPerToken() public view returns (uint) {
        if (stakedSupply == 0) {
            return rewardPerTokenStored;
        }
        return
            rewardPerTokenStored +
                ((lastTimeRewardApplicable() - 
                lastUpdateTime) * 
                rewardRate * 1e18 / stakedSupply);
    }
    
    function earned(address account) public view returns (uint) {
        return (stakes[account] * (rewardPerToken() - userRewardPerTokenPaid[account]) / 1e18) + rewards[account];
    }

    function getRewardForDuration() external view returns (uint) {
        return rewardRate * DURATION;
    }
    
    modifier updateReward(address account) {
        rewardPerTokenStored = rewardPerToken();
        lastUpdateTime = lastTimeRewardApplicable();
        if (account != address(0)) {
            rewards[account] = earned(account);
            userRewardPerTokenPaid[account] = rewardPerTokenStored;
        }
        _;
    }
    
    function stake(uint256 amount) external nonReentrant updateReward(msg.sender) {
        require(amount > 0, "Cannot stake 0");
        stakedSupply += amount;
        stakes[msg.sender] += amount;
        _transferTokens(msg.sender, address(this), amount);
        emit Staked(msg.sender, amount);
    }

    function unstake(uint amount) public nonReentrant updateReward(msg.sender) {
        require(amount > 0, "Cannot withdraw 0");
        stakedSupply -= amount;
        stakes[msg.sender] -= amount;
        _transferTokens(address(this), msg.sender, amount);
        emit Unstaked(msg.sender, amount);
    }

    function getReward() public nonReentrant updateReward(msg.sender) {
        uint256 reward = rewards[msg.sender];
        if (reward > 0) {
            rewards[msg.sender] = 0;
            _transferTokens(address(this), msg.sender, reward);
            emit Earned(msg.sender, reward);
        }
    }

    function exit() external {
        unstake(stakes[msg.sender]);
        getReward();
    }
    
    function notifyFeeAmount(uint reward) internal updateReward(address(0)) {
        if (block.timestamp >= periodFinish) {
            rewardRate = reward / DURATION;
        } else {
            uint remaining = periodFinish - block.timestamp;
            uint leftover = remaining * rewardRate;
            rewardRate = (reward + leftover) / DURATION;
        }

        // Ensure the provided reward amount is not more than the balance in the contract.
        // This keeps the reward rate in the right range, preventing overflows due to
        // very high values of rewardRate in the earned and rewardsPerToken functions;
        // Reward + leftover must be less than 2^256 / 10^18 to avoid overflow.
        uint balance = balances[address(this)];
        require(rewardRate <= balance / DURATION, "Provided reward too high");

        lastUpdateTime = block.timestamp;
        periodFinish = block.timestamp + DURATION;
        emit Fees(reward);
    }
    
    function markets() external view returns (address[] memory) {
        return _markets;
    }
    
    function _mint(address dst, uint amount) internal {
        // mint the amount
        totalSupply += amount;
        // transfer the amount to the recipient
        balances[dst] += amount;
        emit Transfer(address(0), dst, amount);
    }
    
    function _burn(address dst, uint amount) internal {
        // burn the amount
        totalSupply -= amount;
        // transfer the amount from the recipient
        balances[dst] -= amount;
        emit Transfer(dst, address(0), amount);
    }
    
    function depositAll(IERC20 token) external {
        _deposit(token, token.balanceOf(msg.sender));
    }
    
    function deposit(IERC20 token, uint amount) external {
        _deposit(token, amount);
    }
    
    function _addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired
    ) internal virtual returns (address pair, uint amountA, uint amountB) {
        // create the pair if it doesn't exist yet
        pair = FACTORY.getPair(tokenA, tokenB);
        if (pair == address(0)) {
            pair = FACTORY.createPair(tokenA, tokenB);
            pairs[pair] = true;
            _markets.push(tokenA);
        } else if (!pairs[pair]) {
            pairs[pair] = true;
            _markets.push(tokenA);
        }
        
        (uint reserveA, uint reserveB) = SushiswapV2Library.getReserves(address(FACTORY), tokenA, tokenB);
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint amountBOptimal = SushiswapV2Library.quote(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint amountAOptimal = SushiswapV2Library.quote(amountBDesired, reserveB, reserveA);
                assert(amountAOptimal <= amountADesired);
                (amountA, amountB) = (amountAOptimal, amountBDesired);
            }
        }
    }
    
    function _deposit(IERC20 token, uint amount) internal {
        uint _value = LINK.getPriceUSD(address(token)) * amount / uint256(10)**token.decimals();
        require(_value > 0, "!value");
        
        (address _pair, uint amountA,) = _addLiquidity(address(token), address(this), amount, _value);
        
        token.safeTransferFrom(msg.sender, _pair, amountA);
        _mint(_pair, _value); // Amount of scUSD to mint
        
        uint _liquidity = ISushiswapV2Pair(_pair).mint(address(this));
        collateral[msg.sender][address(token)] += _liquidity;
        
        collateralCredit[msg.sender][address(token)] += _value;
        uint _fee = _value * FEE / BASE;
        _mint(msg.sender, _value - _fee);
        _mint(address(this), _fee);
        notifyFeeAmount(_fee);
        
        emit Deposit(msg.sender, address(token), _value, amount, _value);
    }
    
    function withdrawAll(IERC20 token) external {
        _withdraw(token, IERC20(address(this)).balanceOf(msg.sender));
    }
    
    function withdraw(IERC20 token, uint amount) external {
        _withdraw(token, amount);
    }
    
    function _withdraw(IERC20 token, uint amount) internal {
        uint _credit = collateralCredit[msg.sender][address(token)];
        uint _collateral = collateral[msg.sender][address(token)];
        
        if (_credit < amount) {
            amount = _credit;
        }
        
        // Calculate % of collateral to release
        uint _burned = _collateral * amount / _credit;
        address _pair = FACTORY.getPair(address(token), address(this));
        
        IERC20(_pair).safeTransfer(_pair, _burned); // send liquidity to pair
        (uint _amount0, uint _amount1) = ISushiswapV2Pair(_pair).burn(msg.sender);
        (address _token0,) = SushiswapV2Library.sortTokens(address(token), address(this));
        (uint _amountA, uint _amountB) = address(token) == _token0 ? (_amount0, _amount1) : (_amount1, _amount0);
        
        collateralCredit[msg.sender][address(token)] -= amount;
        collateral[msg.sender][address(token)] -= _burned;
        _burn(msg.sender, _amountB+amount); // Amount of scUSD to burn (value of A leaving the system)
        
        emit Withdraw(msg.sender, address(token), amount, _amountB, _amountA);
    }

    /**
     * @notice Get the number of tokens `spender` is approved to spend on behalf of `account`
     * @param account The address of the account holding the funds
     * @param spender The address of the account spending the funds
     * @return The number of tokens approved
     */
    function allowance(address account, address spender) external view returns (uint) {
        return allowances[account][spender];
    }

    /**
     * @notice Approve `spender` to transfer up to `amount` from `src`
     * @dev This will overwrite the approval amount for `spender`
     *  and is subject to issues noted [here](https://eips.ethereum.org/EIPS/eip-20#approve)
     * @param spender The address of the account which may transfer tokens
     * @param amount The number of tokens that are approved (2^256-1 means infinite)
     * @return Whether or not the approval succeeded
     */
    function approve(address spender, uint amount) external returns (bool) {
        allowances[msg.sender][spender] = amount;

        emit Approval(msg.sender, spender, amount);
        return true;
    }

    /**
     * @notice Triggers an approval from owner to spends
     * @param owner The address to approve from
     * @param spender The address to be approved
     * @param amount The number of tokens that are approved (2^256-1 means infinite)
     * @param deadline The time at which to expire the signature
     * @param v The recovery byte of the signature
     * @param r Half of the ECDSA signature pair
     * @param s Half of the ECDSA signature pair
     */
    function permit(address owner, address spender, uint amount, uint deadline, uint8 v, bytes32 r, bytes32 s) external {
        bytes32 structHash = keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, amount, nonces[owner]++, deadline));
        bytes32 digest = keccak256(abi.encodePacked("\x19\x01", DOMAINSEPARATOR, structHash));
        address signatory = ecrecover(digest, v, r, s);
        require(signatory != address(0), "permit: signature");
        require(signatory == owner, "permit: unauthorized");
        require(block.timestamp <= deadline, "permit: expired");

        allowances[owner][spender] = amount;

        emit Approval(owner, spender, amount);
    }

    /**
     * @notice Get the number of tokens held by the `account`
     * @param account The address of the account to get the balance of
     * @return The number of tokens held
     */
    function balanceOf(address account) external view returns (uint) {
        return balances[account];
    }

    /**
     * @notice Transfer `amount` tokens from `msg.sender` to `dst`
     * @param dst The address of the destination account
     * @param amount The number of tokens to transfer
     * @return Whether or not the transfer succeeded
     */
    function transfer(address dst, uint amount) external returns (bool) {
        _transferTokens(msg.sender, dst, amount);
        return true;
    }

    /**
     * @notice Transfer `amount` tokens from `src` to `dst`
     * @param src The address of the source account
     * @param dst The address of the destination account
     * @param amount The number of tokens to transfer
     * @return Whether or not the transfer succeeded
     */
    function transferFrom(address src, address dst, uint amount) external returns (bool) {
        address spender = msg.sender;
        uint spenderAllowance = allowances[src][spender];

        if (spender != src && spenderAllowance != type(uint).max) {
            uint newAllowance = spenderAllowance - amount;
            allowances[src][spender] = newAllowance;

            emit Approval(src, spender, newAllowance);
        }

        _transferTokens(src, dst, amount);
        return true;
    }

    function _transferTokens(address src, address dst, uint amount) internal {
        balances[src] -= amount;
        balances[dst] += amount;
        
        emit Transfer(src, dst, amount);
        
        if (pairs[src]) {
            uint _fee = amount * FEE / BASE;
            _transferTokens(dst, address(this), _fee);
            notifyFeeAmount(_fee);
        }
    }

    function _getChainId() internal view returns (uint) {
        uint chainId;
        assembly { chainId := chainid() }
        return chainId;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"creditor","type":"address"},{"indexed":true,"internalType":"address","name":"collateral","type":"address"},{"indexed":false,"internalType":"uint256","name":"creditOut","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"creditMinted","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Earned","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Fees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Staked","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":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Unstaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"creditor","type":"address"},{"indexed":true,"internalType":"address","name":"collateral","type":"address"},{"indexed":false,"internalType":"uint256","name":"creditIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"creditOut","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"BASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAINSEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DURATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FACTORY","outputs":[{"internalType":"contract ISushiswapV2Factory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LINK","outputs":[{"internalType":"contract Oracle","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"collateral","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"collateralCredit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"depositAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"earned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"exit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getRewardForDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastTimeRewardApplicable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastUpdateTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"markets","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodFinish","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","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":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardPerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPerTokenStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakedSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userRewardPerTokenPaid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a0604052600060015560006002556000600b556000600c5562093a80600d5560326012556127106013553480156200003757600080fd5b50600160005560408051808201909152601381527f537461626c65205969656c6420437265646974000000000000000000000000006020909101527f797cfab58fcb15f590eb8e4252d5c228ff88f94f907e119e80c4393a946e8f357f731d4321f0316462c5e2d7805654a6b50447396c1df9b8234424c9752f8ec7d2620000be620000f5565b30604051602001620000d49493929190620000f9565b60408051601f1981840301815291905280516020909101206080526200011d565b4690565b938452602084019290925260408301526001600160a01b0316606082015260800190565b60805161299f620001406000396000818161061a0152610d9c015261299f6000f3fe608060405234801561001057600080fd5b506004361061025d5760003560e01c80637ecebe0011610146578063cd3daf9d116100c3578063df136d6511610087578063df136d6514610496578063e9fad8ee1461049e578063ebe2b12b146104a6578063ec342ad0146104ae578063f3fef3a3146104b6578063fa09e630146104c95761025d565b8063cd3daf9d1461044d578063d41ce4b114610455578063d505accf1461045d578063dd62ed3e14610470578063de3db0fe146104835761025d565b8063a694fc3a1161010a578063a694fc3a14610404578063a9059cbb14610417578063c57981b51461042a578063c8f33c9114610432578063cc218ece1461043a5761025d565b80637ecebe00146103bb57806380faa57d146103ce5780638b876347146103d657806395d89b41146103e95780639f0d5f27146103f15761025d565b806320606b70116101df578063313ce567116101a3578063313ce5671461035b5780633ac2a032146103705780633d18b9121461038557806347e7ef241461038d57806370a08231146103a05780637b0a47ee146103b35761025d565b806320606b701461031b57806323b872dd146103235780632dd31000146103365780632e17de781461033e57806330adf81f146103535761025d565b80631778e29c116102265780631778e29c146102e657806318160ddd146102ee5780631b6b6d23146102f65780631be052891461030b5780631c1f78eb146103135761025d565b80628cc2621461026257806306fdde031461028b5780630700037d146102a0578063095ea7b3146102b357806316934fc4146102d3575b600080fd5b610275610270366004612015565b6104dc565b604051610282919061239d565b60405180910390f35b61029361055b565b60405161028291906123f8565b6102756102ae366004612015565b61058a565b6102c66102c136600461213a565b61059c565b6040516102829190612392565b6102756102e1366004612015565b610606565b610275610618565b61027561063c565b6102fe610642565b60405161028291906122da565b61027561065a565b610275610660565b610275610678565b6102c6610331366004612085565b61069c565b6102fe61076a565b61035161034c3660046121d3565b610782565b005b6102756108bf565b6103636108e3565b6040516102829190612767565b6103786108e8565b6040516102829190612345565b61035161094a565b61035161039b36600461213a565b610a41565b6102756103ae366004612015565b610a4f565b610275610a6a565b6102756103c9366004612015565b610a70565b610275610a82565b6102756103e4366004612015565b610a90565b610293610aa2565b6103516103ff366004612015565b610ac5565b6103516104123660046121d3565b610b4d565b6102c661042536600461213a565b610c70565b610275610c86565b610275610c8c565b61027561044836600461204d565b610c92565b610275610caf565b610275610d13565b61035161046b3660046120c5565b610d19565b61027561047e36600461204d565b610f1f565b61027561049136600461204d565b610f4a565b610275610f67565b610351610f6d565b610275610f90565b610275610f96565b6103516104c436600461213a565b610f9c565b6103516104d7366004612015565b610fa6565b6001600160a01b0381166000908152601160209081526040808320546010909252822054670de0b6b3a764000090610512610caf565b61051c91906128e0565b6001600160a01b03851660009081526005602052604090205461053f91906128c1565b610549919061278d565b6105539190612775565b90505b919050565b6040518060400160405280601381526020017214dd18589b1948165a595b190810dc99591a5d606a1b81525081565b60116020526000908152604090205481565b3360008181526003602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906105f590869061239d565b60405180910390a350600192915050565b60056020526000908152604090205481565b7f000000000000000000000000000000000000000000000000000000000000000081565b60015481565b73271bf4568fb737cc2e6277e9b1ee0034098cda2a81565b600d5481565b6000600d54600b5461067291906128c1565b90505b90565b7f797cfab58fcb15f590eb8e4252d5c228ff88f94f907e119e80c4393a946e8f3581565b6001600160a01b0383166000818152600360209081526040808320338085529252822054919290919082148015906106d657506000198114155b156107515760006106e785836128e0565b6001600160a01b03808916600081815260036020908152604080832094891680845294909152908190208490555192935090917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061074790859061239d565b60405180910390a3505b61075c868686611024565b6001925050505b9392505050565b73c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac81565b600260005414156107ae5760405162461bcd60e51b81526004016107a5906126e3565b60405180910390fd5b6002600055336107bc610caf565b600f556107c7610a82565b600e556001600160a01b0381161561080e576107e2816104dc565b6001600160a01b038216600090815260116020908152604080832093909355600f546010909152919020555b6000821161082e5760405162461bcd60e51b81526004016107a5906125c5565b816002600082825461084091906128e0565b909155505033600090815260056020526040812080548492906108649084906128e0565b909155506108759050303384611024565b336001600160a01b03167f0f5bb82176feb1b5e747e28471aa92156a04d9f3ab9f45f28e2d704232b93f75836040516108ae919061239d565b60405180910390a250506001600055565b7f5fae9ec55a1e547936e0e74d606b44cd5f912f9adcd0bba561fea62d570259e981565b600881565b6060600980548060200260200160405190810160405280929190818152602001828054801561094057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610922575b5050505050905090565b6002600054141561096d5760405162461bcd60e51b81526004016107a5906126e3565b60026000553361097b610caf565b600f55610986610a82565b600e556001600160a01b038116156109cd576109a1816104dc565b6001600160a01b038216600090815260116020908152604080832093909355600f546010909152919020555b336000908152601160205260409020548015610a3857336000818152601160205260408120556109ff90309083611024565b336001600160a01b03167f053fa1fc52294a40b4ff1a988765bd298c00caa24d685cc3f767dcfde254ef9a826040516108ae919061239d565b50506001600055565b610a4b8282611126565b5050565b6001600160a01b031660009081526004602052604090205490565b600b5481565b60066020526000908152604090205481565b600061067242600c5461142b565b60106020526000908152604090205481565b604051806040016040528060078152602001661e50d49151125560ca1b81525081565b610b4a81826001600160a01b03166370a08231336040518263ffffffff1660e01b8152600401610af591906122da565b60206040518083038186803b158015610b0d57600080fd5b505afa158015610b21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4591906121eb565b611126565b50565b60026000541415610b705760405162461bcd60e51b81526004016107a5906126e3565b600260005533610b7e610caf565b600f55610b89610a82565b600e556001600160a01b03811615610bd057610ba4816104dc565b6001600160a01b038216600090815260116020908152604080832093909355600f546010909152919020555b60008211610bf05760405162461bcd60e51b81526004016107a5906124dc565b8160026000828254610c029190612775565b90915550503360009081526005602052604081208054849290610c26908490612775565b90915550610c379050333084611024565b336001600160a01b03167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d836040516108ae919061239d565b6000610c7d338484611024565b50600192915050565b60125481565b600e5481565b600760209081526000928352604080842090915290825290205481565b600060025460001415610cc55750600f54610675565b600254600b54600e54610cd6610a82565b610ce091906128e0565b610cea91906128c1565b610cfc90670de0b6b3a76400006128c1565b610d06919061278d565b600f546106729190612775565b60025481565b6001600160a01b038716600090815260066020526040812080547f5fae9ec55a1e547936e0e74d606b44cd5f912f9adcd0bba561fea62d570259e9918a918a918a919086610d6683612923565b9190505589604051602001610d80969594939291906123a6565b60405160208183030381529060405280519060200120905060007f000000000000000000000000000000000000000000000000000000000000000082604051602001610dcd929190612269565b604051602081830303815290604052805190602001209050600060018287878760405160008152602001604052604051610e0a94939291906123da565b6020604051602081039080840390855afa158015610e2c573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610e5f5760405162461bcd60e51b81526004016107a59061266e565b896001600160a01b0316816001600160a01b031614610e905760405162461bcd60e51b81526004016107a590612597565b86421115610eb05760405162461bcd60e51b81526004016107a590612539565b6001600160a01b03808b166000818152600360209081526040808320948e1680845294909152908190208b9055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610f0b908c9061239d565b60405180910390a350505050505050505050565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b600860209081526000928352604080842090915290825290205481565b600f5481565b33600090815260056020526040902054610f8690610782565b610f8e61094a565b565b600c5481565b60135481565b610a4b8282611441565b6040516370a0823160e01b8152610b4a90829030906370a0823190610fcf9033906004016122da565b60206040518083038186803b158015610fe757600080fd5b505afa158015610ffb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061101f91906121eb565b611441565b6001600160a01b0383166000908152600460205260408120805483929061104c9084906128e0565b90915550506001600160a01b03821660009081526004602052604081208054839290611079908490612775565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516110c3919061239d565b60405180910390a36001600160a01b0383166000908152600a602052604090205460ff1615611121576000601354601254836110ff91906128c1565b611109919061278d565b9050611116833083611024565b61111f81611704565b505b505050565b6000826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561116157600080fd5b505afa158015611175573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061119991906121eb565b6111a490600a6127f3565b604051635708447d60e01b8152839073271bf4568fb737cc2e6277e9b1ee0034098cda2a90635708447d906111dd9088906004016122da565b60206040518083038186803b1580156111f557600080fd5b505afa158015611209573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122d91906121eb565b61123791906128c1565b611241919061278d565b9050600081116112635760405162461bcd60e51b81526004016107a5906124bc565b60008061127285308686611850565b50909250905061128d6001600160a01b038616338484611b1f565b6112978284611b77565b6040516335313c2160e11b81526000906001600160a01b03841690636a627842906112c69030906004016122da565b602060405180830381600087803b1580156112e057600080fd5b505af11580156112f4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061131891906121eb565b3360009081526007602090815260408083206001600160a01b038b168452909152812080549293508392909190611350908490612775565b90915550503360009081526008602090815260408083206001600160a01b038a16845290915281208054869290611388908490612775565b9091555050601354601254600091906113a190876128c1565b6113ab919061278d565b90506113c0336113bb83886128e0565b611b77565b6113ca3082611b77565b6113d381611704565b866001600160a01b0316336001600160a01b03167f4e2ca0515ed1aef1395f66b5303bb5d6f1bf9d61a353fa53f73f8ac9973fa9f687898960405161141a93929190612751565b60405180910390a350505050505050565b600081831061143a5781610763565b5090919050565b3360008181526008602090815260408083206001600160a01b038716808552908352818420549484526007835281842090845290915290205482821015611486578192505b60008261149385846128c1565b61149d919061278d565b60405163e6a4390560e01b815290915060009073c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac9063e6a43905906114dc90899030906004016122ee565b60206040518083038186803b1580156114f457600080fd5b505afa158015611508573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061152c9190612031565b90506115426001600160a01b0382168284611c05565b600080826001600160a01b03166389afcb44336040518263ffffffff1660e01b815260040161157191906122da565b6040805180830381600087803b15801561158a57600080fd5b505af115801561159e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c29190612203565b9150915060006115d28930611c24565b509050600080826001600160a01b03168b6001600160a01b0316146115f85783856115fb565b84845b915091508960086000336001600160a01b03166001600160a01b0316815260200190815260200160002060008d6001600160a01b03166001600160a01b03168152602001908152602001600020600082825461165791906128e0565b90915550503360009081526007602090815260408083206001600160a01b038f1684529091528120805489929061168f9084906128e0565b909155506116a89050336116a38c84612775565b611cae565b8a6001600160a01b0316336001600160a01b03167febff2602b3f468259e1e99f613fed6691f3a6526effe6ef3e768ba7ae7a36c4f8c84866040516116ef93929190612751565b60405180910390a35050505050505050505050565b600061170e610caf565b600f55611719610a82565b600e556001600160a01b0381161561176057611734816104dc565b6001600160a01b038216600090815260116020908152604080832093909355600f546010909152919020555b600c54421061177e57600d54611776908361278d565b600b556117c0565b600042600c5461178e91906128e0565b90506000600b54826117a091906128c1565b600d549091506117b08286612775565b6117ba919061278d565b600b5550505b30600090815260046020526040902054600d546117dd908261278d565b600b5411156117fe5760405162461bcd60e51b81526004016107a5906125f0565b42600e819055600d5461181091612775565b600c556040517f6860fd583f67fab4724ed49beb2ba910ec616cb579289e3726f71d72389d40649061184390859061239d565b60405180910390a1505050565b60405163e6a4390560e01b81526000908190819073c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac9063e6a4390590611890908a908a906004016122ee565b60206040518083038186803b1580156118a857600080fd5b505afa1580156118bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e09190612031565b92506001600160a01b0383166119ed576040516364e329cb60e11b815273c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac9063c9c6539690611929908a908a906004016122ee565b602060405180830381600087803b15801561194357600080fd5b505af1158015611957573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061197b9190612031565b6001600160a01b038181166000908152600a602052604081208054600160ff1990911681179091556009805491820181559091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0180546001600160a01b031916918a169190911790559250611a79565b6001600160a01b0383166000908152600a602052604090205460ff16611a79576001600160a01b038381166000908152600a602052604081208054600160ff1990911681179091556009805491820181559091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0180546001600160a01b0319169189169190911790555b600080611a9b73c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac8a8a611d30565b91509150816000148015611aad575080155b15611abd57869350859250611b13565b6000611aca888484611e09565b9050868111611ade57879450925082611b11565b6000611aeb888486611e09565b905088811115611b0b57634e487b7160e01b600052600160045260246000fd5b94508693505b505b50509450945094915050565b61111f846323b872dd60e01b858585604051602401611b4093929190612308565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611e73565b8060016000828254611b899190612775565b90915550506001600160a01b03821660009081526004602052604081208054839290611bb6908490612775565b90915550506040516001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611bf990859061239d565b60405180910390a35050565b6111218363a9059cbb60e01b8484604051602401611b4092919061232c565b600080826001600160a01b0316846001600160a01b03161415611c595760405162461bcd60e51b81526004016107a590612475565b826001600160a01b0316846001600160a01b031610611c79578284611c7c565b83835b90925090506001600160a01b038216611ca75760405162461bcd60e51b81526004016107a590612562565b9250929050565b8060016000828254611cc091906128e0565b90915550506001600160a01b03821660009081526004602052604081208054839290611ced9084906128e0565b90915550506040516000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611bf990859061239d565b6000806000611d3f8585611c24565b509050600080611d50888888611f57565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015611d8857600080fd5b505afa158015611d9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dc09190612185565b506001600160701b031691506001600160701b03169150826001600160a01b0316876001600160a01b031614611df7578082611dfa565b81815b90999098509650505050505050565b6000808411611e2a5760405162461bcd60e51b81526004016107a590612627565b600083118015611e3a5750600082115b611e565760405162461bcd60e51b81526004016107a59061242b565b82611e6183866128c1565b611e6b919061278d565b949350505050565b611e85826001600160a01b0316611fc7565b611ea15760405162461bcd60e51b81526004016107a59061271a565b600080836001600160a01b031683604051611ebc919061224d565b6000604051808303816000865af19150503d8060008114611ef9576040519150601f19603f3d011682016040523d82523d6000602084013e611efe565b606091505b509150915081611f205760405162461bcd60e51b81526004016107a590612504565b80511561111f5780806020019051810190611f3b9190612165565b61111f5760405162461bcd60e51b81526004016107a590612699565b6000806000611f668585611c24565b91509150858282604051602001611f7e929190612226565b60405160208183030381529060405280519060200120604051602001611fa5929190612284565b60408051601f1981840301815291905280516020909101209695505050505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708115801590611e6b5750141592915050565b80516001600160701b038116811461055657600080fd5b600060208284031215612026578081fd5b813561076381612954565b600060208284031215612042578081fd5b815161076381612954565b6000806040838503121561205f578081fd5b823561206a81612954565b9150602083013561207a81612954565b809150509250929050565b600080600060608486031215612099578081fd5b83356120a481612954565b925060208401356120b481612954565b929592945050506040919091013590565b600080600080600080600060e0888a0312156120df578283fd5b87356120ea81612954565b965060208801356120fa81612954565b95506040880135945060608801359350608088013560ff8116811461211d578384fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561214c578182fd5b823561215781612954565b946020939093013593505050565b600060208284031215612176578081fd5b81518015158114610763578182fd5b600080600060608486031215612199578283fd5b6121a284611ffe565b92506121b060208501611ffe565b9150604084015163ffffffff811681146121c8578182fd5b809150509250925092565b6000602082840312156121e4578081fd5b5035919050565b6000602082840312156121fc578081fd5b5051919050565b60008060408385031215612215578182fd5b505080516020909101519092909150565b6bffffffffffffffffffffffff19606093841b811682529190921b16601482015260280190565b6000825161225f8184602087016128f7565b9190910192915050565b61190160f01b81526002810192909252602282015260420190565b6001600160f81b0319815260609290921b6bffffffffffffffffffffffff1916600183015260158201527fe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303603582015260550190565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b818110156123865783516001600160a01b031683529284019291840191600101612361565b50909695505050505050565b901515815260200190565b90815260200190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b93845260ff9290921660208401526040830152606082015260800190565b60006020825282518060208401526124178160408501602087016128f7565b601f01601f19169190910160400192915050565b6020808252602a908201527f53757368697377617056324c6962726172793a20494e53554646494349454e546040820152695f4c495155494449545960b01b606082015260800190565b60208082526027908201527f53757368697377617056324c6962726172793a204944454e544943414c5f41446040820152664452455353455360c81b606082015260800190565b6020808252600690820152652176616c756560d01b604082015260600190565b6020808252600e908201526d043616e6e6f74207374616b6520360941b604082015260600190565b6020808252818101527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604082015260600190565b6020808252600f908201526e1c195c9b5a5d0e88195e1c1a5c9959608a1b604082015260600190565b6020808252818101527f53757368697377617056324c6962726172793a205a45524f5f41444452455353604082015260600190565b6020808252601490820152731c195c9b5a5d0e881d5b985d5d1a1bdc9a5e995960621b604082015260600190565b602080825260119082015270043616e6e6f74207769746864726177203607c1b604082015260600190565b60208082526018908201527f50726f76696465642072657761726420746f6f20686967680000000000000000604082015260600190565b60208082526027908201527f53757368697377617056324c6962726172793a20494e53554646494349454e5460408201526617d05353d5539560ca1b606082015260800190565b6020808252601190820152707065726d69743a207369676e617475726560781b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252601f908201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604082015260600190565b9283526020830191909152604082015260600190565b60ff91909116815260200190565b600082198211156127885761278861293e565b500190565b6000826127a857634e487b7160e01b81526012600452602481fd5b500490565b80825b60018086116127bf57506127ea565b8187048211156127d1576127d161293e565b808616156127de57918102915b9490941c9380026127b0565b94509492505050565b6000610763600019848460008261280c57506001610763565b8161281957506000610763565b816001811461282f576002811461283957612866565b6001915050610763565b60ff84111561284a5761284a61293e565b6001841b9150848211156128605761286061293e565b50610763565b5060208310610133831016604e8410600b8410161715612899575081810a838111156128945761289461293e565b610763565b6128a684848460016127ad565b8086048211156128b8576128b861293e565b02949350505050565b60008160001904831182151516156128db576128db61293e565b500290565b6000828210156128f2576128f261293e565b500390565b60005b838110156129125781810151838201526020016128fa565b8381111561111f5750506000910152565b60006000198214156129375761293761293e565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114610b4a57600080fdfea2646970667358221220c16ab7e80e9c19ad986fe514c380a4512ce143ef0c9f8c39a435e87077c210bf64736f6c63430008000033

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061025d5760003560e01c80637ecebe0011610146578063cd3daf9d116100c3578063df136d6511610087578063df136d6514610496578063e9fad8ee1461049e578063ebe2b12b146104a6578063ec342ad0146104ae578063f3fef3a3146104b6578063fa09e630146104c95761025d565b8063cd3daf9d1461044d578063d41ce4b114610455578063d505accf1461045d578063dd62ed3e14610470578063de3db0fe146104835761025d565b8063a694fc3a1161010a578063a694fc3a14610404578063a9059cbb14610417578063c57981b51461042a578063c8f33c9114610432578063cc218ece1461043a5761025d565b80637ecebe00146103bb57806380faa57d146103ce5780638b876347146103d657806395d89b41146103e95780639f0d5f27146103f15761025d565b806320606b70116101df578063313ce567116101a3578063313ce5671461035b5780633ac2a032146103705780633d18b9121461038557806347e7ef241461038d57806370a08231146103a05780637b0a47ee146103b35761025d565b806320606b701461031b57806323b872dd146103235780632dd31000146103365780632e17de781461033e57806330adf81f146103535761025d565b80631778e29c116102265780631778e29c146102e657806318160ddd146102ee5780631b6b6d23146102f65780631be052891461030b5780631c1f78eb146103135761025d565b80628cc2621461026257806306fdde031461028b5780630700037d146102a0578063095ea7b3146102b357806316934fc4146102d3575b600080fd5b610275610270366004612015565b6104dc565b604051610282919061239d565b60405180910390f35b61029361055b565b60405161028291906123f8565b6102756102ae366004612015565b61058a565b6102c66102c136600461213a565b61059c565b6040516102829190612392565b6102756102e1366004612015565b610606565b610275610618565b61027561063c565b6102fe610642565b60405161028291906122da565b61027561065a565b610275610660565b610275610678565b6102c6610331366004612085565b61069c565b6102fe61076a565b61035161034c3660046121d3565b610782565b005b6102756108bf565b6103636108e3565b6040516102829190612767565b6103786108e8565b6040516102829190612345565b61035161094a565b61035161039b36600461213a565b610a41565b6102756103ae366004612015565b610a4f565b610275610a6a565b6102756103c9366004612015565b610a70565b610275610a82565b6102756103e4366004612015565b610a90565b610293610aa2565b6103516103ff366004612015565b610ac5565b6103516104123660046121d3565b610b4d565b6102c661042536600461213a565b610c70565b610275610c86565b610275610c8c565b61027561044836600461204d565b610c92565b610275610caf565b610275610d13565b61035161046b3660046120c5565b610d19565b61027561047e36600461204d565b610f1f565b61027561049136600461204d565b610f4a565b610275610f67565b610351610f6d565b610275610f90565b610275610f96565b6103516104c436600461213a565b610f9c565b6103516104d7366004612015565b610fa6565b6001600160a01b0381166000908152601160209081526040808320546010909252822054670de0b6b3a764000090610512610caf565b61051c91906128e0565b6001600160a01b03851660009081526005602052604090205461053f91906128c1565b610549919061278d565b6105539190612775565b90505b919050565b6040518060400160405280601381526020017214dd18589b1948165a595b190810dc99591a5d606a1b81525081565b60116020526000908152604090205481565b3360008181526003602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906105f590869061239d565b60405180910390a350600192915050565b60056020526000908152604090205481565b7f636e940c6e0b9a383949256d4dea314c874dc3ac442beba74cc2e7b5faf674bd81565b60015481565b73271bf4568fb737cc2e6277e9b1ee0034098cda2a81565b600d5481565b6000600d54600b5461067291906128c1565b90505b90565b7f797cfab58fcb15f590eb8e4252d5c228ff88f94f907e119e80c4393a946e8f3581565b6001600160a01b0383166000818152600360209081526040808320338085529252822054919290919082148015906106d657506000198114155b156107515760006106e785836128e0565b6001600160a01b03808916600081815260036020908152604080832094891680845294909152908190208490555192935090917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061074790859061239d565b60405180910390a3505b61075c868686611024565b6001925050505b9392505050565b73c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac81565b600260005414156107ae5760405162461bcd60e51b81526004016107a5906126e3565b60405180910390fd5b6002600055336107bc610caf565b600f556107c7610a82565b600e556001600160a01b0381161561080e576107e2816104dc565b6001600160a01b038216600090815260116020908152604080832093909355600f546010909152919020555b6000821161082e5760405162461bcd60e51b81526004016107a5906125c5565b816002600082825461084091906128e0565b909155505033600090815260056020526040812080548492906108649084906128e0565b909155506108759050303384611024565b336001600160a01b03167f0f5bb82176feb1b5e747e28471aa92156a04d9f3ab9f45f28e2d704232b93f75836040516108ae919061239d565b60405180910390a250506001600055565b7f5fae9ec55a1e547936e0e74d606b44cd5f912f9adcd0bba561fea62d570259e981565b600881565b6060600980548060200260200160405190810160405280929190818152602001828054801561094057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610922575b5050505050905090565b6002600054141561096d5760405162461bcd60e51b81526004016107a5906126e3565b60026000553361097b610caf565b600f55610986610a82565b600e556001600160a01b038116156109cd576109a1816104dc565b6001600160a01b038216600090815260116020908152604080832093909355600f546010909152919020555b336000908152601160205260409020548015610a3857336000818152601160205260408120556109ff90309083611024565b336001600160a01b03167f053fa1fc52294a40b4ff1a988765bd298c00caa24d685cc3f767dcfde254ef9a826040516108ae919061239d565b50506001600055565b610a4b8282611126565b5050565b6001600160a01b031660009081526004602052604090205490565b600b5481565b60066020526000908152604090205481565b600061067242600c5461142b565b60106020526000908152604090205481565b604051806040016040528060078152602001661e50d49151125560ca1b81525081565b610b4a81826001600160a01b03166370a08231336040518263ffffffff1660e01b8152600401610af591906122da565b60206040518083038186803b158015610b0d57600080fd5b505afa158015610b21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4591906121eb565b611126565b50565b60026000541415610b705760405162461bcd60e51b81526004016107a5906126e3565b600260005533610b7e610caf565b600f55610b89610a82565b600e556001600160a01b03811615610bd057610ba4816104dc565b6001600160a01b038216600090815260116020908152604080832093909355600f546010909152919020555b60008211610bf05760405162461bcd60e51b81526004016107a5906124dc565b8160026000828254610c029190612775565b90915550503360009081526005602052604081208054849290610c26908490612775565b90915550610c379050333084611024565b336001600160a01b03167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d836040516108ae919061239d565b6000610c7d338484611024565b50600192915050565b60125481565b600e5481565b600760209081526000928352604080842090915290825290205481565b600060025460001415610cc55750600f54610675565b600254600b54600e54610cd6610a82565b610ce091906128e0565b610cea91906128c1565b610cfc90670de0b6b3a76400006128c1565b610d06919061278d565b600f546106729190612775565b60025481565b6001600160a01b038716600090815260066020526040812080547f5fae9ec55a1e547936e0e74d606b44cd5f912f9adcd0bba561fea62d570259e9918a918a918a919086610d6683612923565b9190505589604051602001610d80969594939291906123a6565b60405160208183030381529060405280519060200120905060007f636e940c6e0b9a383949256d4dea314c874dc3ac442beba74cc2e7b5faf674bd82604051602001610dcd929190612269565b604051602081830303815290604052805190602001209050600060018287878760405160008152602001604052604051610e0a94939291906123da565b6020604051602081039080840390855afa158015610e2c573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610e5f5760405162461bcd60e51b81526004016107a59061266e565b896001600160a01b0316816001600160a01b031614610e905760405162461bcd60e51b81526004016107a590612597565b86421115610eb05760405162461bcd60e51b81526004016107a590612539565b6001600160a01b03808b166000818152600360209081526040808320948e1680845294909152908190208b9055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610f0b908c9061239d565b60405180910390a350505050505050505050565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b600860209081526000928352604080842090915290825290205481565b600f5481565b33600090815260056020526040902054610f8690610782565b610f8e61094a565b565b600c5481565b60135481565b610a4b8282611441565b6040516370a0823160e01b8152610b4a90829030906370a0823190610fcf9033906004016122da565b60206040518083038186803b158015610fe757600080fd5b505afa158015610ffb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061101f91906121eb565b611441565b6001600160a01b0383166000908152600460205260408120805483929061104c9084906128e0565b90915550506001600160a01b03821660009081526004602052604081208054839290611079908490612775565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516110c3919061239d565b60405180910390a36001600160a01b0383166000908152600a602052604090205460ff1615611121576000601354601254836110ff91906128c1565b611109919061278d565b9050611116833083611024565b61111f81611704565b505b505050565b6000826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561116157600080fd5b505afa158015611175573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061119991906121eb565b6111a490600a6127f3565b604051635708447d60e01b8152839073271bf4568fb737cc2e6277e9b1ee0034098cda2a90635708447d906111dd9088906004016122da565b60206040518083038186803b1580156111f557600080fd5b505afa158015611209573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122d91906121eb565b61123791906128c1565b611241919061278d565b9050600081116112635760405162461bcd60e51b81526004016107a5906124bc565b60008061127285308686611850565b50909250905061128d6001600160a01b038616338484611b1f565b6112978284611b77565b6040516335313c2160e11b81526000906001600160a01b03841690636a627842906112c69030906004016122da565b602060405180830381600087803b1580156112e057600080fd5b505af11580156112f4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061131891906121eb565b3360009081526007602090815260408083206001600160a01b038b168452909152812080549293508392909190611350908490612775565b90915550503360009081526008602090815260408083206001600160a01b038a16845290915281208054869290611388908490612775565b9091555050601354601254600091906113a190876128c1565b6113ab919061278d565b90506113c0336113bb83886128e0565b611b77565b6113ca3082611b77565b6113d381611704565b866001600160a01b0316336001600160a01b03167f4e2ca0515ed1aef1395f66b5303bb5d6f1bf9d61a353fa53f73f8ac9973fa9f687898960405161141a93929190612751565b60405180910390a350505050505050565b600081831061143a5781610763565b5090919050565b3360008181526008602090815260408083206001600160a01b038716808552908352818420549484526007835281842090845290915290205482821015611486578192505b60008261149385846128c1565b61149d919061278d565b60405163e6a4390560e01b815290915060009073c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac9063e6a43905906114dc90899030906004016122ee565b60206040518083038186803b1580156114f457600080fd5b505afa158015611508573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061152c9190612031565b90506115426001600160a01b0382168284611c05565b600080826001600160a01b03166389afcb44336040518263ffffffff1660e01b815260040161157191906122da565b6040805180830381600087803b15801561158a57600080fd5b505af115801561159e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c29190612203565b9150915060006115d28930611c24565b509050600080826001600160a01b03168b6001600160a01b0316146115f85783856115fb565b84845b915091508960086000336001600160a01b03166001600160a01b0316815260200190815260200160002060008d6001600160a01b03166001600160a01b03168152602001908152602001600020600082825461165791906128e0565b90915550503360009081526007602090815260408083206001600160a01b038f1684529091528120805489929061168f9084906128e0565b909155506116a89050336116a38c84612775565b611cae565b8a6001600160a01b0316336001600160a01b03167febff2602b3f468259e1e99f613fed6691f3a6526effe6ef3e768ba7ae7a36c4f8c84866040516116ef93929190612751565b60405180910390a35050505050505050505050565b600061170e610caf565b600f55611719610a82565b600e556001600160a01b0381161561176057611734816104dc565b6001600160a01b038216600090815260116020908152604080832093909355600f546010909152919020555b600c54421061177e57600d54611776908361278d565b600b556117c0565b600042600c5461178e91906128e0565b90506000600b54826117a091906128c1565b600d549091506117b08286612775565b6117ba919061278d565b600b5550505b30600090815260046020526040902054600d546117dd908261278d565b600b5411156117fe5760405162461bcd60e51b81526004016107a5906125f0565b42600e819055600d5461181091612775565b600c556040517f6860fd583f67fab4724ed49beb2ba910ec616cb579289e3726f71d72389d40649061184390859061239d565b60405180910390a1505050565b60405163e6a4390560e01b81526000908190819073c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac9063e6a4390590611890908a908a906004016122ee565b60206040518083038186803b1580156118a857600080fd5b505afa1580156118bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e09190612031565b92506001600160a01b0383166119ed576040516364e329cb60e11b815273c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac9063c9c6539690611929908a908a906004016122ee565b602060405180830381600087803b15801561194357600080fd5b505af1158015611957573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061197b9190612031565b6001600160a01b038181166000908152600a602052604081208054600160ff1990911681179091556009805491820181559091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0180546001600160a01b031916918a169190911790559250611a79565b6001600160a01b0383166000908152600a602052604090205460ff16611a79576001600160a01b038381166000908152600a602052604081208054600160ff1990911681179091556009805491820181559091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0180546001600160a01b0319169189169190911790555b600080611a9b73c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac8a8a611d30565b91509150816000148015611aad575080155b15611abd57869350859250611b13565b6000611aca888484611e09565b9050868111611ade57879450925082611b11565b6000611aeb888486611e09565b905088811115611b0b57634e487b7160e01b600052600160045260246000fd5b94508693505b505b50509450945094915050565b61111f846323b872dd60e01b858585604051602401611b4093929190612308565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611e73565b8060016000828254611b899190612775565b90915550506001600160a01b03821660009081526004602052604081208054839290611bb6908490612775565b90915550506040516001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611bf990859061239d565b60405180910390a35050565b6111218363a9059cbb60e01b8484604051602401611b4092919061232c565b600080826001600160a01b0316846001600160a01b03161415611c595760405162461bcd60e51b81526004016107a590612475565b826001600160a01b0316846001600160a01b031610611c79578284611c7c565b83835b90925090506001600160a01b038216611ca75760405162461bcd60e51b81526004016107a590612562565b9250929050565b8060016000828254611cc091906128e0565b90915550506001600160a01b03821660009081526004602052604081208054839290611ced9084906128e0565b90915550506040516000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611bf990859061239d565b6000806000611d3f8585611c24565b509050600080611d50888888611f57565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015611d8857600080fd5b505afa158015611d9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dc09190612185565b506001600160701b031691506001600160701b03169150826001600160a01b0316876001600160a01b031614611df7578082611dfa565b81815b90999098509650505050505050565b6000808411611e2a5760405162461bcd60e51b81526004016107a590612627565b600083118015611e3a5750600082115b611e565760405162461bcd60e51b81526004016107a59061242b565b82611e6183866128c1565b611e6b919061278d565b949350505050565b611e85826001600160a01b0316611fc7565b611ea15760405162461bcd60e51b81526004016107a59061271a565b600080836001600160a01b031683604051611ebc919061224d565b6000604051808303816000865af19150503d8060008114611ef9576040519150601f19603f3d011682016040523d82523d6000602084013e611efe565b606091505b509150915081611f205760405162461bcd60e51b81526004016107a590612504565b80511561111f5780806020019051810190611f3b9190612165565b61111f5760405162461bcd60e51b81526004016107a590612699565b6000806000611f668585611c24565b91509150858282604051602001611f7e929190612226565b60405160208183030381529060405280519060200120604051602001611fa5929190612284565b60408051601f1981840301815291905280516020909101209695505050505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708115801590611e6b5750141592915050565b80516001600160701b038116811461055657600080fd5b600060208284031215612026578081fd5b813561076381612954565b600060208284031215612042578081fd5b815161076381612954565b6000806040838503121561205f578081fd5b823561206a81612954565b9150602083013561207a81612954565b809150509250929050565b600080600060608486031215612099578081fd5b83356120a481612954565b925060208401356120b481612954565b929592945050506040919091013590565b600080600080600080600060e0888a0312156120df578283fd5b87356120ea81612954565b965060208801356120fa81612954565b95506040880135945060608801359350608088013560ff8116811461211d578384fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561214c578182fd5b823561215781612954565b946020939093013593505050565b600060208284031215612176578081fd5b81518015158114610763578182fd5b600080600060608486031215612199578283fd5b6121a284611ffe565b92506121b060208501611ffe565b9150604084015163ffffffff811681146121c8578182fd5b809150509250925092565b6000602082840312156121e4578081fd5b5035919050565b6000602082840312156121fc578081fd5b5051919050565b60008060408385031215612215578182fd5b505080516020909101519092909150565b6bffffffffffffffffffffffff19606093841b811682529190921b16601482015260280190565b6000825161225f8184602087016128f7565b9190910192915050565b61190160f01b81526002810192909252602282015260420190565b6001600160f81b0319815260609290921b6bffffffffffffffffffffffff1916600183015260158201527fe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303603582015260550190565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b818110156123865783516001600160a01b031683529284019291840191600101612361565b50909695505050505050565b901515815260200190565b90815260200190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b93845260ff9290921660208401526040830152606082015260800190565b60006020825282518060208401526124178160408501602087016128f7565b601f01601f19169190910160400192915050565b6020808252602a908201527f53757368697377617056324c6962726172793a20494e53554646494349454e546040820152695f4c495155494449545960b01b606082015260800190565b60208082526027908201527f53757368697377617056324c6962726172793a204944454e544943414c5f41446040820152664452455353455360c81b606082015260800190565b6020808252600690820152652176616c756560d01b604082015260600190565b6020808252600e908201526d043616e6e6f74207374616b6520360941b604082015260600190565b6020808252818101527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604082015260600190565b6020808252600f908201526e1c195c9b5a5d0e88195e1c1a5c9959608a1b604082015260600190565b6020808252818101527f53757368697377617056324c6962726172793a205a45524f5f41444452455353604082015260600190565b6020808252601490820152731c195c9b5a5d0e881d5b985d5d1a1bdc9a5e995960621b604082015260600190565b602080825260119082015270043616e6e6f74207769746864726177203607c1b604082015260600190565b60208082526018908201527f50726f76696465642072657761726420746f6f20686967680000000000000000604082015260600190565b60208082526027908201527f53757368697377617056324c6962726172793a20494e53554646494349454e5460408201526617d05353d5539560ca1b606082015260800190565b6020808252601190820152707065726d69743a207369676e617475726560781b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252601f908201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604082015260600190565b9283526020830191909152604082015260600190565b60ff91909116815260200190565b600082198211156127885761278861293e565b500190565b6000826127a857634e487b7160e01b81526012600452602481fd5b500490565b80825b60018086116127bf57506127ea565b8187048211156127d1576127d161293e565b808616156127de57918102915b9490941c9380026127b0565b94509492505050565b6000610763600019848460008261280c57506001610763565b8161281957506000610763565b816001811461282f576002811461283957612866565b6001915050610763565b60ff84111561284a5761284a61293e565b6001841b9150848211156128605761286061293e565b50610763565b5060208310610133831016604e8410600b8410161715612899575081810a838111156128945761289461293e565b610763565b6128a684848460016127ad565b8086048211156128b8576128b861293e565b02949350505050565b60008160001904831182151516156128db576128db61293e565b500290565b6000828210156128f2576128f261293e565b500390565b60005b838110156129125781810151838201526020016128fa565b8381111561111f5750506000910152565b60006000198214156129375761293761293e565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114610b4a57600080fdfea2646970667358221220c16ab7e80e9c19ad986fe514c380a4512ce143ef0c9f8c39a435e87077c210bf64736f6c63430008000033

Deployed Bytecode Sourcemap

11146:15575:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15067:184;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11284:51;;;:::i;:::-;;;;;;;:::i;14054:39::-;;;;;;:::i;:::-;;:::i;23241:207::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;11853:38::-;;;;;;:::i;:::-;;:::i;12090:40::-;;;:::i;11598:27::-;;;:::i;13305:80::-;;;:::i;:::-;;;;;;;:::i;13879:29::-;;;:::i;15259:108::-;;;:::i;11964:119::-;;;:::i;25651:513::-;;;;;;:::i;:::-;;:::i;13392:109::-;;;:::i;16038:311::-;;;;;;:::i;:::-;;:::i;:::-;;12220:128;;;:::i;11500:34::-;;;:::i;:::-;;;;;;;:::i;17769:94::-;;;:::i;:::-;;;;;;;:::i;16357:308::-;;;:::i;18519:95::-;;;;;;:::i;:::-;;:::i;24826:108::-;;;;;;:::i;:::-;;:::i;13811:26::-;;;:::i;12429:39::-;;;;;;:::i;:::-;;:::i;14578:128::-;;;:::i;13993:54::-;;;;;;:::i;:::-;;:::i;11396:41::-;;;:::i;18401:106::-;;;;;;:::i;:::-;;:::i;15721:309::-;;;;;;:::i;:::-;;:::i;25195:149::-;;;;;;:::i;:::-;;:::i;14514:20::-;;;:::i;13915:26::-;;;:::i;13550:63::-;;;;;;:::i;:::-;;:::i;14718:337::-;;;:::i;11695:28::-;;;:::i;23935:688::-;;;;;;:::i;:::-;;:::i;22630:136::-;;;;;;:::i;:::-;;:::i;13652:69::-;;;;;;:::i;:::-;;:::i;13948:32::-;;;:::i;16673:93::-;;;:::i;13844:28::-;;;:::i;14541:24::-;;;:::i;21034:97::-;;;;;;:::i;:::-;;:::i;20898:124::-;;;;;;:::i;:::-;;:::i;15067:184::-;-1:-1:-1;;;;;15227:16:0;;15121:4;15227:16;;;:7;:16;;;;;;;;;15184:22;:31;;;;;;15219:4;;15165:16;:14;:16::i;:::-;:50;;;;:::i;:::-;-1:-1:-1;;;;;15146:15:0;;;;;;:6;:15;;;;;;:70;;;;:::i;:::-;:77;;;;:::i;:::-;15145:98;;;;:::i;:::-;15138:105;;15067:184;;;;:::o;11284:51::-;;;;;;;;;;;;;;-1:-1:-1;;;11284:51:0;;;;:::o;14054:39::-;;;;;;;;;;;;;:::o;23241:207::-;23334:10;23306:4;23323:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;23323:31:0;;;;;;;;;;:40;;;23381:37;23306:4;;23323:31;;23381:37;;;;23357:6;;23381:37;:::i;:::-;;;;;;;;-1:-1:-1;23436:4:0;23241:207;;;;:::o;11853:38::-;;;;;;;;;;;;;:::o;12090:40::-;;;:::o;11598:27::-;;;;:::o;13305:80::-;13342:42;13305:80;:::o;13879:29::-;;;;:::o;15259:108::-;15314:4;15351:8;;15338:10;;:21;;;;:::i;:::-;15331:28;;15259:108;;:::o;11964:119::-;12006:77;11964:119;:::o;25651:513::-;-1:-1:-1;;;;;25810:15:0;;25730:4;25810:15;;;:10;:15;;;;;;;;25765:10;25810:24;;;;;;;;25730:4;;25765:10;;25810:24;25851:14;;;;;:52;;;-1:-1:-1;;25869:16:0;:34;;25851:52;25847:242;;;25920:17;25940:25;25959:6;25940:16;:25;:::i;:::-;-1:-1:-1;;;;;25980:15:0;;;;;;;:10;:15;;;;;;;;:24;;;;;;;;;;;;;;:39;;;26041:36;25920:45;;-1:-1:-1;25980:24:0;;26041:36;;;;25920:45;;26041:36;:::i;:::-;;;;;;;;25847:242;;26101:33;26117:3;26122;26127:6;26101:15;:33::i;:::-;26152:4;26145:11;;;;25651:513;;;;;;:::o;13392:109::-;13458:42;13392:109;:::o;16038:311::-;7458:1;8055:7;;:19;;8047:63;;;;-1:-1:-1;;;8047:63:0;;;;;;;:::i;:::-;;;;;;;;;7458:1;8188:7;:18;16101:10:::1;15452:16;:14;:16::i;:::-;15429:20;:39:::0;15496:26:::1;:24;:26::i;:::-;15479:14;:43:::0;-1:-1:-1;;;;;15537:21:0;::::1;::::0;15533:157:::1;;15594:15;15601:7;15594:6;:15::i;:::-;-1:-1:-1::0;;;;;15575:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;;;:34;;;;15658:20:::1;::::0;15624:22:::1;:31:::0;;;;;;:54;15533:157:::1;16141:1:::2;16132:6;:10;16124:40;;;;-1:-1:-1::0;;;16124:40:0::2;;;;;;;:::i;:::-;16191:6;16175:12;;:22;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;16215:10:0::2;16208:18;::::0;;;:6:::2;:18;::::0;;;;:28;;16230:6;;16208:18;:28:::2;::::0;16230:6;;16208:28:::2;:::i;:::-;::::0;;;-1:-1:-1;16247:50:0::2;::::0;-1:-1:-1;16271:4:0::2;16278:10;16290:6:::0;16247:15:::2;:50::i;:::-;16322:10;-1:-1:-1::0;;;;;16313:28:0::2;;16334:6;16313:28;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;7414:1:0;8367:7;:22;16038:311::o;12220:128::-;12262:86;12220:128;:::o;11500:34::-;11533:1;11500:34;:::o;17769:94::-;17811:16;17847:8;17840:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17840:15:0;;;;;;;;;;;;;;;;;;;;;;;17769:94;:::o;16357:308::-;7458:1;8055:7;;:19;;8047:63;;;;-1:-1:-1;;;8047:63:0;;;;;;;:::i;:::-;7458:1;8188:7;:18;16411:10:::1;15452:16;:14;:16::i;:::-;15429:20;:39:::0;15496:26:::1;:24;:26::i;:::-;15479:14;:43:::0;-1:-1:-1;;;;;15537:21:0;::::1;::::0;15533:157:::1;;15594:15;15601:7;15594:6;:15::i;:::-;-1:-1:-1::0;;;;;15575:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;;;:34;;;;15658:20:::1;::::0;15624:22:::1;:31:::0;;;;;;:54;15533:157:::1;16459:10:::2;16434:14;16451:19:::0;;;:7:::2;:19;::::0;;;;;16485:10;;16481:177:::2;;16520:10;16534:1;16512:19:::0;;;:7:::2;:19;::::0;;;;:23;16550:50:::2;::::0;16574:4:::2;::::0;16593:6;16550:15:::2;:50::i;:::-;16627:10;-1:-1:-1::0;;;;;16620:26:0::2;;16639:6;16620:26;;;;;;:::i;16481:177::-;-1:-1:-1::0;;7414:1:0;8367:7;:22;16357:308::o;18519:95::-;18583:23;18592:5;18599:6;18583:8;:23::i;:::-;18519:95;;:::o;24826:108::-;-1:-1:-1;;;;;24909:17:0;24885:4;24909:17;;;:8;:17;;;;;;;24826:108::o;13811:26::-;;;;:::o;12429:39::-;;;;;;;;;;;;;:::o;14578:128::-;14635:4;14659:39;14668:15;14685:12;;14659:8;:39::i;13993:54::-;;;;;;;;;;;;;:::o;11396:41::-;;;;;;;;;;;;;;-1:-1:-1;;;11396:41:0;;;;:::o;18401:106::-;18455:44;18464:5;18471;-1:-1:-1;;;;;18471:15:0;;18487:10;18471:27;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18455:8;:44::i;:::-;18401:106;:::o;15721:309::-;7458:1;8055:7;;:19;;8047:63;;;;-1:-1:-1;;;8047:63:0;;;;;;;:::i;:::-;7458:1;8188:7;:18;15787:10:::1;15452:16;:14;:16::i;:::-;15429:20;:39:::0;15496:26:::1;:24;:26::i;:::-;15479:14;:43:::0;-1:-1:-1;;;;;15537:21:0;::::1;::::0;15533:157:::1;;15594:15;15601:7;15594:6;:15::i;:::-;-1:-1:-1::0;;;;;15575:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;;;:34;;;;15658:20:::1;::::0;15624:22:::1;:31:::0;;;;;;:54;15533:157:::1;15827:1:::2;15818:6;:10;15810:37;;;;-1:-1:-1::0;;;15810:37:0::2;;;;;;;:::i;:::-;15874:6;15858:12;;:22;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;15898:10:0::2;15891:18;::::0;;;:6:::2;:18;::::0;;;;:28;;15913:6;;15891:18;:28:::2;::::0;15913:6;;15891:28:::2;:::i;:::-;::::0;;;-1:-1:-1;15930:50:0::2;::::0;-1:-1:-1;15946:10:0::2;15966:4;15973:6:::0;15930:15:::2;:50::i;:::-;16003:10;-1:-1:-1::0;;;;;15996:26:0::2;;16015:6;15996:26;;;;;;:::i;25195:149::-:0;25257:4;25274:40;25290:10;25302:3;25307:6;25274:15;:40::i;:::-;-1:-1:-1;25332:4:0;25195:149;;;;:::o;14514:20::-;;;;:::o;13915:26::-;;;;:::o;13550:63::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;14718:337::-;14765:4;14786:12;;14802:1;14786:17;14782:77;;;-1:-1:-1;14827:20:0;;14820:27;;14782:77;15034:12;;15014:10;;14978:14;;14931:26;:24;:26::i;:::-;:61;;;;:::i;:::-;14930:94;;;;:::i;:::-;:101;;15027:4;14930:101;:::i;:::-;:116;;;;:::i;:::-;14889:20;;:158;;;;:::i;11695:28::-;;;;:::o;23935:688::-;-1:-1:-1;;;;;24145:13:0;;24062:18;24145:13;;;:6;:13;;;;;:15;;12262:86;;24121:5;;24128:7;;24137:6;;24145:15;24062:18;24145:15;;;:::i;:::-;;;;;24162:8;24093:78;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;24083:89;;;;;;24062:110;;24183:14;24239:15;24256:10;24210:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;24200:68;;;;;;24183:85;;24279:17;24299:26;24309:6;24317:1;24320;24323;24299:26;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;24299:26:0;;-1:-1:-1;;24299:26:0;;;-1:-1:-1;;;;;;;24344:23:0;;24336:53;;;;-1:-1:-1;;;24336:53:0;;;;;;;:::i;:::-;24421:5;-1:-1:-1;;;;;24408:18:0;:9;-1:-1:-1;;;;;24408:18:0;;24400:51;;;;-1:-1:-1;;;24400:51:0;;;;;;;:::i;:::-;24489:8;24470:15;:27;;24462:55;;;;-1:-1:-1;;;24462:55:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;24530:17:0;;;;;;;:10;:17;;;;;;;;:26;;;;;;;;;;;;;;:35;;;24583:32;;;;;24559:6;;24583:32;:::i;:::-;;;;;;;;23935:688;;;;;;;;;;:::o;22630:136::-;-1:-1:-1;;;;;22730:19:0;;;22706:4;22730:19;;;:10;:19;;;;;;;;:28;;;;;;;;;;;;;22630:136::o;13652:69::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;13948:32::-;;;;:::o;16673:93::-;16724:10;16717:18;;;;:6;:18;;;;;;16709:27;;:7;:27::i;:::-;16747:11;:9;:11::i;:::-;16673:93::o;13844:28::-;;;;:::o;14541:24::-;;;;:::o;21034:97::-;21099:24;21109:5;21116:6;21099:9;:24::i;20898:124::-;20970:43;;-1:-1:-1;;;20970:43:0;;20953:61;;20963:5;;20985:4;;20970:31;;:43;;21002:10;;20970:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20953:9;:61::i;26172:387::-;-1:-1:-1;;;;;26256:13:0;;;;;;:8;:13;;;;;:23;;26273:6;;26256:13;:23;;26273:6;;26256:23;:::i;:::-;;;;-1:-1:-1;;;;;;;26290:13:0;;;;;;:8;:13;;;;;:23;;26307:6;;26290:13;:23;;26307:6;;26290:23;:::i;:::-;;;;;;;;26353:3;-1:-1:-1;;;;;26339:26:0;26348:3;-1:-1:-1;;;;;26339:26:0;;26358:6;26339:26;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;26390:10:0;;;;;;:5;:10;;;;;;;;26386:166;;;26417:9;26444:4;;26438:3;;26429:6;:12;;;;:::i;:::-;:19;;;;:::i;:::-;26417:31;;26463:41;26479:3;26492:4;26499;26463:15;:41::i;:::-;26519:21;26535:4;26519:15;:21::i;:::-;26386:166;;26172:387;;;:::o;19984:902::-;20049:11;20120:5;-1:-1:-1;;;;;20120:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20107:29;;20115:2;20107:29;:::i;:::-;20063:32;;-1:-1:-1;;;20063:32:0;;20098:6;;13342:42;;20063:16;;:32;;20088:5;;20063:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41;;;;:::i;:::-;:73;;;;:::i;:::-;20049:87;;20164:1;20155:6;:10;20147:29;;;;-1:-1:-1;;;20147:29:0;;;;;;;:::i;:::-;20198:13;20213:12;20230:60;20252:5;20268:4;20275:6;20283;20230:13;:60::i;:::-;-1:-1:-1;20197:93:0;;-1:-1:-1;20197:93:0;-1:-1:-1;20311:50:0;-1:-1:-1;;;;;20311:22:0;;20334:10;20197:93;;20311:22;:50::i;:::-;20372:20;20378:5;20385:6;20372:5;:20::i;:::-;20458:43;;-1:-1:-1;;;20458:43:0;;20440:15;;-1:-1:-1;;;;;20458:28:0;;;;;:43;;20495:4;;20458:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20523:10;20512:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;20512:38:0;;;;;;;;;:52;;20440:61;;-1:-1:-1;20440:61:0;;20512:38;;:22;:52;;20440:61;;20512:52;:::i;:::-;;;;-1:-1:-1;;20602:10:0;20585:28;;;;:16;:28;;;;;;;;-1:-1:-1;;;;;20585:44:0;;;;;;;;;:54;;20633:6;;20585:28;:54;;20633:6;;20585:54;:::i;:::-;;;;-1:-1:-1;;20677:4:0;;20671:3;;20650:9;;20677:4;20662:12;;:6;:12;:::i;:::-;:19;;;;:::i;:::-;20650:31;-1:-1:-1;20692:32:0;20698:10;20710:13;20650:31;20710:6;:13;:::i;:::-;20692:5;:32::i;:::-;20735:26;20749:4;20756;20735:5;:26::i;:::-;20772:21;20788:4;20772:15;:21::i;:::-;20847:5;-1:-1:-1;;;;;20819:59:0;20827:10;-1:-1:-1;;;;;20819:59:0;;20855:6;20863;20871;20819:59;;;;;;;;:::i;:::-;;;;;;;;19984:902;;;;;;;:::o;10721:106::-;10779:7;10810:1;10806;:5;:13;;10818:1;10806:13;;;-1:-1:-1;10814:1:0;;10799:20;-1:-1:-1;10721:106:0:o;21143:1183::-;21241:10;21209:12;21224:28;;;:16;:28;;;;;;;;-1:-1:-1;;;;;21224:44:0;;;;;;;;;;;;21298:22;;;:10;:22;;;;;:38;;;;;;;;;21361:16;;;21357:65;;;21403:7;21394:16;;21357:65;21491:12;21529:7;21506:20;21520:6;21506:11;:20;:::i;:::-;:30;;;;:::i;:::-;21563:46;;-1:-1:-1;;;21563:46:0;;21491:45;;-1:-1:-1;21547:13:0;;13458:42;;21563:15;;:46;;21587:5;;21603:4;;21563:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21547:62;-1:-1:-1;21630:42:0;-1:-1:-1;;;;;21630:26:0;;21547:62;21664:7;21630:26;:42::i;:::-;21710:13;21725;21759:5;-1:-1:-1;;;;;21742:28:0;;21771:10;21742:40;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21709:73;;;;21794:15;21814:60;21852:5;21868:4;21814:29;:60::i;:::-;21793:81;;;21886:13;21901;21936:7;-1:-1:-1;;;;;21918:25:0;21926:5;-1:-1:-1;;;;;21918:25:0;;:71;;21970:8;21980;21918:71;;;21947:8;21957;21918:71;21885:104;;;;22058:6;22010:16;:28;22027:10;-1:-1:-1;;;;;22010:28:0;-1:-1:-1;;;;;22010:28:0;;;;;;;;;;;;:44;22047:5;-1:-1:-1;;;;;22010:44:0;-1:-1:-1;;;;;22010:44:0;;;;;;;;;;;;;:54;;;;;;;:::i;:::-;;;;-1:-1:-1;;22086:10:0;22075:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;22075:38:0;;;;;;;;;:49;;22117:7;;22075:22;:49;;22117:7;;22075:49;:::i;:::-;;;;-1:-1:-1;22135:34:0;;-1:-1:-1;22141:10:0;22153:15;22162:6;22153:8;:15;:::i;:::-;22135:5;:34::i;:::-;22283:5;-1:-1:-1;;;;;22254:64:0;22263:10;-1:-1:-1;;;;;22254:64:0;;22291:6;22299:8;22309;22254:64;;;;;;;;:::i;:::-;;;;;;;;21143:1183;;;;;;;;;;;:::o;16778:979::-;16846:1;15452:16;:14;:16::i;:::-;15429:20;:39;15496:26;:24;:26::i;:::-;15479:14;:43;-1:-1:-1;;;;;15537:21:0;;;15533:157;;15594:15;15601:7;15594:6;:15::i;:::-;-1:-1:-1;;;;;15575:16:0;;;;;;:7;:16;;;;;;;;:34;;;;15658:20;;15624:22;:31;;;;;;:54;15533:157;16884:12:::1;;16865:15;:31;16861:285;;16935:8;::::0;16926:17:::1;::::0;:6;:17:::1;:::i;:::-;16913:10;:30:::0;16861:285:::1;;;16976:14;17008:15;16993:12;;:30;;;;:::i;:::-;16976:47;;17038:13;17066:10;;17054:9;:22;;;;:::i;:::-;17126:8;::::0;17038:38;;-1:-1:-1;17105:17:0::1;17038:38:::0;17105:6;:17:::1;:::i;:::-;17104:30;;;;:::i;:::-;17091:10;:43:::0;-1:-1:-1;;16861:285:0::1;17538:4;17506:12;17521:23:::0;;;:8:::1;:23;::::0;;;;;17587:8:::1;::::0;17577:18:::1;::::0;17521:23;17577:18:::1;:::i;:::-;17563:10;;:32;;17555:69;;;;-1:-1:-1::0;;;17555:69:0::1;;;;;;;:::i;:::-;17654:15;17637:14;:32:::0;;;17713:8:::1;::::0;17695:26:::1;::::0;::::1;:::i;:::-;17680:12;:41:::0;17737:12:::1;::::0;::::1;::::0;::::1;::::0;17742:6;;17737:12:::1;:::i;:::-;;;;;;;;15700:1;16778:979:::0;;:::o;18626:1346::-;18904:31;;-1:-1:-1;;;18904:31:0;;18792:12;;;;;;13458:42;;18904:15;;:31;;18920:6;;18928;;18904:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18897:38;-1:-1:-1;;;;;;18950:18:0;;18946:266;;18992:34;;-1:-1:-1;;;18992:34:0;;13458:42;;18992:18;;:34;;19011:6;;19019;;18992:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;19041:11:0;;;;;;;:5;:11;;;;;:18;;19055:4;-1:-1:-1;;19041:18:0;;;;;;;;19074:8;:21;;;;;;;;;;;;;;-1:-1:-1;;;;;;19074:21:0;;;;;;;;;;19041:11;-1:-1:-1;18946:266:0;;;-1:-1:-1;;;;;19118:11:0;;;;;;:5;:11;;;;;;;;19113:99;;-1:-1:-1;;;;;19146:11:0;;;;;;;:5;:11;;;;;:18;;19160:4;-1:-1:-1;;19146:18:0;;;;;;;;19179:8;:21;;;;;;;;;;;;;;-1:-1:-1;;;;;;19179:21:0;;;;;;;;;;19113:99;19233:13;19248;19265:64;13458:42;19314:6;19322;19265:30;:64::i;:::-;19232:97;;;;19344:8;19356:1;19344:13;:30;;;;-1:-1:-1;19361:13:0;;19344:30;19340:625;;;19413:14;;-1:-1:-1;19429:14:0;;-1:-1:-1;19340:625:0;;;19477:19;19499:60;19524:14;19540:8;19550;19499:24;:60::i;:::-;19477:82;;19596:14;19578;:32;19574:380;;19653:14;;-1:-1:-1;19669:14:0;-1:-1:-1;19669:14:0;19574:380;;;19725:19;19747:60;19772:14;19788:8;19798;19747:24;:60::i;:::-;19725:82;;19851:14;19833;:32;;19826:40;;-1:-1:-1;;;19826:40:0;;;;;;;;;19907:14;-1:-1:-1;19923:14:0;;-1:-1:-1;19574:380:0;19340:625;;18626:1346;;;;;;;;;;:::o;1439:201::-;1537:95;1556:5;1586:27;;;1615:4;1621:2;1625:5;1563:68;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;1563:68:0;;;;;;;;;;;;;;-1:-1:-1;;;;;1563:68:0;-1:-1:-1;;;;;;1563:68:0;;;;;;;;;;1537:18;:95::i;17875:250::-;17979:6;17964:11;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;18045:13:0;;;;;;:8;:13;;;;;:23;;18062:6;;18045:13;:23;;18062:6;;18045:23;:::i;:::-;;;;-1:-1:-1;;18084:33:0;;-1:-1:-1;;;;;18084:33:0;;;18101:1;;18084:33;;;;18110:6;;18084:33;:::i;:::-;;;;;;;;17875:250;;:::o;1258:173::-;1338:85;1357:5;1387:23;;;1412:2;1416:5;1364:58;;;;;;;;;:::i;8543:353::-;8618:14;8634;8679:6;-1:-1:-1;;;;;8669:16:0;:6;-1:-1:-1;;;;;8669:16:0;;;8661:68;;;;-1:-1:-1;;;8661:68:0;;;;;;;:::i;:::-;8768:6;-1:-1:-1;;;;;8759:15:0;:6;-1:-1:-1;;;;;8759:15:0;;:53;;8797:6;8805;8759:53;;;8778:6;8786;8759:53;8740:72;;-1:-1:-1;8740:72:0;-1:-1:-1;;;;;;8831:20:0;;8823:65;;;;-1:-1:-1;;;8823:65:0;;;;;;;:::i;:::-;8543:353;;;;;:::o;18137:252::-;18241:6;18226:11;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;18309:13:0;;;;;;:8;:13;;;;;:23;;18326:6;;18309:13;:23;;18326:6;;18309:23;:::i;:::-;;;;-1:-1:-1;;18348:33:0;;18370:1;;-1:-1:-1;;;;;18348:33:0;;;;;;;18374:6;;18348:33;:::i;9533:393::-;9626:13;9641;9668:14;9687:26;9698:6;9706;9687:10;:26::i;:::-;9667:46;;;9725:13;9740;9775:32;9783:7;9792:6;9800;9775:7;:32::i;:::-;-1:-1:-1;;;;;9758:62:0;;:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9724:98;-1:-1:-1;;;;;9724:98:0;;;-1:-1:-1;;;;;9724:98:0;;;9866:6;-1:-1:-1;;;;;9856:16:0;:6;-1:-1:-1;;;;;9856:16:0;;:62;;9899:8;9909;9856:62;;;9876:8;9886;9856:62;9833:85;;;;-1:-1:-1;9533:393:0;-1:-1:-1;;;;;;;9533:393:0:o;10045:322::-;10127:12;10170:1;10160:7;:11;10152:63;;;;-1:-1:-1;;;10152:63:0;;;;;;;:::i;:::-;10245:1;10234:8;:12;:28;;;;;10261:1;10250:8;:12;10234:28;10226:83;;;;-1:-1:-1;;;10226:83:0;;;;;;;:::i;:::-;10351:8;10330:18;10340:8;10330:7;:18;:::i;:::-;:29;;;;:::i;:::-;10320:39;10045:322;-1:-1:-1;;;;10045:322:0:o;1998:598::-;2086:27;2094:5;-1:-1:-1;;;;;2086:25:0;;:27::i;:::-;2078:71;;;;-1:-1:-1;;;2078:71:0;;;;;;;:::i;:::-;2223:12;2237:23;2272:5;-1:-1:-1;;;;;2264:19:0;2284:4;2264:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2222:67;;;;2308:7;2300:52;;;;-1:-1:-1;;;2300:52:0;;;;;;;:::i;:::-;2369:17;;:21;2365:224;;2511:10;2500:30;;;;;;;;;;;;:::i;:::-;2492:85;;;;-1:-1:-1;;;2492:85:0;;;;;;;:::i;8988:487::-;9077:12;9103:14;9119;9137:26;9148:6;9156;9137:10;:26::i;:::-;9102:61;;;;9273:7;9326:6;9334;9309:32;;;;;;;;;:::i;:::-;;;;;;;;;;;;;9299:43;;;;;;9212:251;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;9212:251:0;;;;;;;;;9202:262;;9212:251;9202:262;;;;;8988:487;-1:-1:-1;;;;;;8988:487:0:o;818:374::-;878:4;1101:20;;944:66;1141:15;;;;;:42;;-1:-1:-1;1160:23:0;;;1133:51;-1:-1:-1;;818:374:0:o;14:190:1:-;95:13;;-1:-1:-1;;;;;137:42:1;;127:53;;117:2;;194:1;191;184:12;209:259;;321:2;309:9;300:7;296:23;292:32;289:2;;;342:6;334;327:22;289:2;386:9;373:23;405:33;432:5;405:33;:::i;473:263::-;;596:2;584:9;575:7;571:23;567:32;564:2;;;617:6;609;602:22;564:2;654:9;648:16;673:33;700:5;673:33;:::i;741:402::-;;;870:2;858:9;849:7;845:23;841:32;838:2;;;891:6;883;876:22;838:2;935:9;922:23;954:33;981:5;954:33;:::i;:::-;1006:5;-1:-1:-1;1063:2:1;1048:18;;1035:32;1076:35;1035:32;1076:35;:::i;:::-;1130:7;1120:17;;;828:315;;;;;:::o;1148:470::-;;;;1294:2;1282:9;1273:7;1269:23;1265:32;1262:2;;;1315:6;1307;1300:22;1262:2;1359:9;1346:23;1378:33;1405:5;1378:33;:::i;:::-;1430:5;-1:-1:-1;1487:2:1;1472:18;;1459:32;1500:35;1459:32;1500:35;:::i;:::-;1252:366;;1554:7;;-1:-1:-1;;;1608:2:1;1593:18;;;;1580:32;;1252:366::o;1623:853::-;;;;;;;;1835:3;1823:9;1814:7;1810:23;1806:33;1803:2;;;1857:6;1849;1842:22;1803:2;1901:9;1888:23;1920:33;1947:5;1920:33;:::i;:::-;1972:5;-1:-1:-1;2029:2:1;2014:18;;2001:32;2042:35;2001:32;2042:35;:::i;:::-;2096:7;-1:-1:-1;2150:2:1;2135:18;;2122:32;;-1:-1:-1;2201:2:1;2186:18;;2173:32;;-1:-1:-1;2257:3:1;2242:19;;2229:33;2306:4;2293:18;;2281:31;;2271:2;;2331:6;2323;2316:22;2271:2;1793:683;;;;-1:-1:-1;1793:683:1;;;;2359:7;2413:3;2398:19;;2385:33;;-1:-1:-1;2465:3:1;2450:19;;;2437:33;;1793:683;-1:-1:-1;;1793:683:1:o;2481:327::-;;;2610:2;2598:9;2589:7;2585:23;2581:32;2578:2;;;2631:6;2623;2616:22;2578:2;2675:9;2662:23;2694:33;2721:5;2694:33;:::i;:::-;2746:5;2798:2;2783:18;;;;2770:32;;-1:-1:-1;;;2568:240:1:o;2813:297::-;;2933:2;2921:9;2912:7;2908:23;2904:32;2901:2;;;2954:6;2946;2939:22;2901:2;2991:9;2985:16;3044:5;3037:13;3030:21;3023:5;3020:32;3010:2;;3071:6;3063;3056:22;3737:474;;;;3893:2;3881:9;3872:7;3868:23;3864:32;3861:2;;;3914:6;3906;3899:22;3861:2;3942:42;3974:9;3942:42;:::i;:::-;3932:52;;4003:51;4050:2;4039:9;4035:18;4003:51;:::i;:::-;3993:61;;4097:2;4086:9;4082:18;4076:25;4141:10;4134:5;4130:22;4123:5;4120:33;4110:2;;4172:6;4164;4157:22;4110:2;4200:5;4190:15;;;3851:360;;;;;:::o;4216:190::-;;4328:2;4316:9;4307:7;4303:23;4299:32;4296:2;;;4349:6;4341;4334:22;4296:2;-1:-1:-1;4377:23:1;;4286:120;-1:-1:-1;4286:120:1:o;4411:194::-;;4534:2;4522:9;4513:7;4509:23;4505:32;4502:2;;;4555:6;4547;4540:22;4502:2;-1:-1:-1;4583:16:1;;4492:113;-1:-1:-1;4492:113:1:o;4610:255::-;;;4750:2;4738:9;4729:7;4725:23;4721:32;4718:2;;;4771:6;4763;4756:22;4718:2;-1:-1:-1;;4799:16:1;;4855:2;4840:18;;;4834:25;4799:16;;4834:25;;-1:-1:-1;4708:157:1:o;4870:333::-;-1:-1:-1;;5097:2:1;5093:15;;;5089:24;;5077:37;;5148:15;;;;5144:24;5139:2;5130:12;;5123:46;5194:2;5185:12;;5017:186::o;5208:274::-;;5375:6;5369:13;5391:53;5437:6;5432:3;5425:4;5417:6;5413:17;5391:53;:::i;:::-;5460:16;;;;;5345:137;-1:-1:-1;;5345:137:1:o;5487:392::-;-1:-1:-1;;;5745:27:1;;5797:1;5788:11;;5781:27;;;;5833:2;5824:12;;5817:28;5870:2;5861:12;;5735:144::o;5884:636::-;-1:-1:-1;;;;;;6243:26:1;;6306:2;6302:15;;;;-1:-1:-1;;6298:53:1;6294:1;6285:11;;6278:74;6377:2;6368:12;;6361:28;6419:66;6414:2;6405:12;;6398:88;6511:2;6502:12;;6233:287::o;6525:203::-;-1:-1:-1;;;;;6689:32:1;;;;6671:51;;6659:2;6644:18;;6626:102::o;6733:304::-;-1:-1:-1;;;;;6963:15:1;;;6945:34;;7015:15;;7010:2;6995:18;;6988:43;6895:2;6880:18;;6862:175::o;7042:375::-;-1:-1:-1;;;;;7300:15:1;;;7282:34;;7352:15;;;;7347:2;7332:18;;7325:43;7399:2;7384:18;;7377:34;;;;7232:2;7217:18;;7199:218::o;7422:274::-;-1:-1:-1;;;;;7614:32:1;;;;7596:51;;7678:2;7663:18;;7656:34;7584:2;7569:18;;7551:145::o;7701:661::-;7872:2;7924:21;;;7994:13;;7897:18;;;8016:22;;;7701:661;;7872:2;8095:15;;;;8069:2;8054:18;;;7701:661;8141:195;8155:6;8152:1;8149:13;8141:195;;;8220:13;;-1:-1:-1;;;;;8216:39:1;8204:52;;8311:15;;;;8276:12;;;;8252:1;8170:9;8141:195;;;-1:-1:-1;8353:3:1;;7852:510;-1:-1:-1;;;;;;7852:510:1:o;8367:187::-;8532:14;;8525:22;8507:41;;8495:2;8480:18;;8462:92::o;8559:177::-;8705:25;;;8693:2;8678:18;;8660:76::o;8741:591::-;9028:25;;;-1:-1:-1;;;;;9127:15:1;;;9122:2;9107:18;;9100:43;9179:15;;;;9174:2;9159:18;;9152:43;9226:2;9211:18;;9204:34;9269:3;9254:19;;9247:35;;;;9080:3;9298:19;;9291:35;9015:3;9000:19;;8982:350::o;9337:398::-;9564:25;;;9637:4;9625:17;;;;9620:2;9605:18;;9598:45;9674:2;9659:18;;9652:34;9717:2;9702:18;;9695:34;9551:3;9536:19;;9518:217::o;10197:383::-;;10346:2;10335:9;10328:21;10378:6;10372:13;10421:6;10416:2;10405:9;10401:18;10394:34;10437:66;10496:6;10491:2;10480:9;10476:18;10471:2;10463:6;10459:15;10437:66;:::i;:::-;10564:2;10543:15;-1:-1:-1;;10539:29:1;10524:45;;;;10571:2;10520:54;;10318:262;-1:-1:-1;;10318:262:1:o;10585:406::-;10787:2;10769:21;;;10826:2;10806:18;;;10799:30;10865:34;10860:2;10845:18;;10838:62;-1:-1:-1;;;10931:2:1;10916:18;;10909:40;10981:3;10966:19;;10759:232::o;10996:403::-;11198:2;11180:21;;;11237:2;11217:18;;;11210:30;11276:34;11271:2;11256:18;;11249:62;-1:-1:-1;;;11342:2:1;11327:18;;11320:37;11389:3;11374:19;;11170:229::o;11404:329::-;11606:2;11588:21;;;11645:1;11625:18;;;11618:29;-1:-1:-1;;;11678:2:1;11663:18;;11656:36;11724:2;11709:18;;11578:155::o;11738:338::-;11940:2;11922:21;;;11979:2;11959:18;;;11952:30;-1:-1:-1;;;12013:2:1;11998:18;;11991:44;12067:2;12052:18;;11912:164::o;12081:356::-;12283:2;12265:21;;;12302:18;;;12295:30;12361:34;12356:2;12341:18;;12334:62;12428:2;12413:18;;12255:182::o;12442:339::-;12644:2;12626:21;;;12683:2;12663:18;;;12656:30;-1:-1:-1;;;12717:2:1;12702:18;;12695:45;12772:2;12757:18;;12616:165::o;12786:356::-;12988:2;12970:21;;;13007:18;;;13000:30;13066:34;13061:2;13046:18;;13039:62;13133:2;13118:18;;12960:182::o;13147:344::-;13349:2;13331:21;;;13388:2;13368:18;;;13361:30;-1:-1:-1;;;13422:2:1;13407:18;;13400:50;13482:2;13467:18;;13321:170::o;13496:341::-;13698:2;13680:21;;;13737:2;13717:18;;;13710:30;-1:-1:-1;;;13771:2:1;13756:18;;13749:47;13828:2;13813:18;;13670:167::o;13842:348::-;14044:2;14026:21;;;14083:2;14063:18;;;14056:30;14122:26;14117:2;14102:18;;14095:54;14181:2;14166:18;;14016:174::o;14195:403::-;14397:2;14379:21;;;14436:2;14416:18;;;14409:30;14475:34;14470:2;14455:18;;14448:62;-1:-1:-1;;;14541:2:1;14526:18;;14519:37;14588:3;14573:19;;14369:229::o;14603:341::-;14805:2;14787:21;;;14844:2;14824:18;;;14817:30;-1:-1:-1;;;14878:2:1;14863:18;;14856:47;14935:2;14920:18;;14777:167::o;14949:406::-;15151:2;15133:21;;;15190:2;15170:18;;;15163:30;15229:34;15224:2;15209:18;;15202:62;-1:-1:-1;;;15295:2:1;15280:18;;15273:40;15345:3;15330:19;;15123:232::o;15360:355::-;15562:2;15544:21;;;15601:2;15581:18;;;15574:30;15640:33;15635:2;15620:18;;15613:61;15706:2;15691:18;;15534:181::o;15720:355::-;15922:2;15904:21;;;15961:2;15941:18;;;15934:30;16000:33;15995:2;15980:18;;15973:61;16066:2;16051:18;;15894:181::o;16262:319::-;16464:25;;;16520:2;16505:18;;16498:34;;;;16563:2;16548:18;;16541:34;16452:2;16437:18;;16419:162::o;16586:184::-;16758:4;16746:17;;;;16728:36;;16716:2;16701:18;;16683:87::o;16775:128::-;;16846:1;16842:6;16839:1;16836:13;16833:2;;;16852:18;;:::i;:::-;-1:-1:-1;16888:9:1;;16823:80::o;16908:217::-;;16974:1;16964:2;;-1:-1:-1;;;16999:31:1;;17053:4;17050:1;17043:15;17081:4;17006:1;17071:15;16964:2;-1:-1:-1;17110:9:1;;16954:171::o;17130:453::-;17226:6;17249:5;17263:314;17312:1;17349:2;17339:8;17336:16;17326:2;;17356:5;;;17326:2;17397:4;17392:3;17388:14;17382:4;17379:24;17376:2;;;17406:18;;:::i;:::-;17456:2;17446:8;17442:17;17439:2;;;17471:16;;;;17439:2;17550:17;;;;;17510:15;;17263:314;;;17207:376;;;;;;;:::o;17588:139::-;;17677:44;-1:-1:-1;;17704:8:1;17698:4;17732:922;17816:8;17806:2;;-1:-1:-1;17857:1:1;17871:5;;17806:2;17905:4;17895:2;;-1:-1:-1;17942:1:1;17956:5;;17895:2;17987:4;18005:1;18000:59;;;;18073:1;18068:183;;;;17980:271;;18000:59;18030:1;18021:10;;18044:5;;;18068:183;18105:3;18095:8;18092:17;18089:2;;;18112:18;;:::i;:::-;18168:1;18158:8;18154:16;18145:25;;18196:3;18189:5;18186:14;18183:2;;;18203:18;;:::i;:::-;18236:5;;;17980:271;;18335:2;18325:8;18322:16;18316:3;18310:4;18307:13;18303:36;18297:2;18287:8;18284:16;18279:2;18273:4;18270:12;18266:35;18263:77;18260:2;;;-1:-1:-1;18372:19:1;;;18407:14;;;18404:2;;;18424:18;;:::i;:::-;18457:5;;18260:2;18504:42;18542:3;18532:8;18526:4;18523:1;18504:42;:::i;:::-;18579:6;18574:3;18570:16;18561:7;18558:29;18555:2;;;18590:18;;:::i;:::-;18628:20;;17796:858;-1:-1:-1;;;;17796:858:1:o;18659:168::-;;18765:1;18761;18757:6;18753:14;18750:1;18747:21;18742:1;18735:9;18728:17;18724:45;18721:2;;;18772:18;;:::i;:::-;-1:-1:-1;18812:9:1;;18711:116::o;18832:125::-;;18900:1;18897;18894:8;18891:2;;;18905:18;;:::i;:::-;-1:-1:-1;18942:9:1;;18881:76::o;18962:258::-;19034:1;19044:113;19058:6;19055:1;19052:13;19044:113;;;19134:11;;;19128:18;19115:11;;;19108:39;19080:2;19073:10;19044:113;;;19175:6;19172:1;19169:13;19166:2;;;-1:-1:-1;;19210:1:1;19192:16;;19185:27;19015:205::o;19225:135::-;;-1:-1:-1;;19285:17:1;;19282:2;;;19305:18;;:::i;:::-;-1:-1:-1;19352:1:1;19341:13;;19272:88::o;19365:127::-;19426:10;19421:3;19417:20;19414:1;19407:31;19457:4;19454:1;19447:15;19481:4;19478:1;19471:15;19497:133;-1:-1:-1;;;;;19574:31:1;;19564:42;;19554:2;;19620:1;19617;19610:12

Swarm Source

ipfs://c16ab7e80e9c19ad986fe514c380a4512ce143ef0c9f8c39a435e87077c210bf

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.