Contract 0xac8d17451f9f64f053bfdc148e97f239e2dc5045

Txn Hash Method
Block
From
To
Value [Txn Fee]
0xf03c1d42f8a57e03d992cec48bce6f0ee0f9c781573b09f46bc1fc14070356520x6080604047200912022-09-20 11:38:29556 days 53 mins agoCronos ID Name stronghands.cro IN  Create: YieldToken0 CRO15.537827600826 4,917.237898415
[ Download CSV Export 
Parent Txn Hash Block From To Value
Index Block
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
YieldToken

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at cronoscan.com on 2022-09-20
*/

// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;

library Address {
    function isContract(address account) internal view returns (bool) {
        uint256 size;
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            if (returndata.length > 0) {
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

library SafeMath {
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b > a) return (false, 0);
        return (true, a - b);
    }

    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (a == 0) return (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }

    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }

    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "SafeMath: subtraction overflow");
        return a - b;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) return 0;
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: division by zero");
        return a / b;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: modulo by zero");
        return a % b;
    }

    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        return a - b;
    }

    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a / b;
    }

    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a % b;
    }

    function safeSub(uint a, uint b) internal pure returns (uint) {
        if (b > a) {return 0;} else {return a - b;}
    }
}

library SafeERC20 {
    using SafeMath for uint256;
    using Address for address;

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

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

    function safeApprove(IERC20 token, address spender, uint256 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 safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).add(value);
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

interface IERC20 {
    function totalSupply() 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);
}

interface IMigratorChef {
    function migrate(IERC20 token) external returns (IERC20);
}

abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this;
        return msg.data;
    }
}

abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    constructor () internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    function owner() public view virtual returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

contract Whitelist is Ownable {
    mapping(address => bool) public whitelist;

    event WhitelistedAddressAdded(address addr);
    event WhitelistedAddressRemoved(address addr);

    modifier onlyWhitelisted() {
        require(whitelist[msg.sender], 'no whitelist');
        _;
    }

    function addAddressToWhitelist(address addr) onlyOwner public returns(bool success) {
        if (!whitelist[addr]) {
            whitelist[addr] = true;
            emit WhitelistedAddressAdded(addr);
            success = true;
        }
    }

    function addAddressesToWhitelist(address[] memory addrs) onlyOwner public returns(bool success) {
        for (uint256 i = 0; i < addrs.length; i++) {
            if (addAddressToWhitelist(addrs[i])) {
                success = true;
            }
        }
        return success;
    }

    function removeAddressFromWhitelist(address addr) onlyOwner public returns(bool success) {
        if (whitelist[addr]) {
            whitelist[addr] = false;
            emit WhitelistedAddressRemoved(addr);
            success = true;
        }
        return success;
    }

    function removeAddressesFromWhitelist(address[] memory addrs) onlyOwner public returns(bool success) {
        for (uint256 i = 0; i < addrs.length; i++) {
            if (removeAddressFromWhitelist(addrs[i])) {
                success = true;
            }
        }
        return success;
    }
}

contract ERC20 is Context, IERC20 {
    using SafeMath for uint256;

    mapping (address => uint256) private _balances;

    mapping (address => mapping (address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;
    uint8 private _decimals;

    constructor (string memory name_, string memory symbol_) public {
        _name = name_;
        _symbol = symbol_;
        _decimals = 18;
    }

    function name() public view virtual returns (string memory) {
        return _name;
    }

    function symbol() public view virtual returns (string memory) {
        return _symbol;
    }

    function decimals() public view virtual returns (uint8) {
        return _decimals;
    }

    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    function _transfer(address sender, address recipient, uint256 amount) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    function _setupDecimals(uint8 decimals_) internal virtual {
        _decimals = decimals_;
    }

    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }
}

contract YieldToken is ERC20('Stronghands Farm', 'SFARM'), Whitelist {

    struct Checkpoint {
        uint32 fromBlock;
        uint256 votes;
    }

    mapping (address => uint) public nonces;

    mapping (address => address) internal _delegates;
    
    mapping (address => uint32) public numCheckpoints;

    mapping (address => mapping (uint32 => Checkpoint)) public checkpoints;

    bytes32 public constant DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)");
    bytes32 public constant DELEGATION_TYPEHASH = keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)");

    event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);
    event DelegateVotesChanged(address indexed delegate, uint previousBalance, uint newBalance);

    ////////////////////
    // VIEW FUNCTIONS //
    ////////////////////

    function delegates(address delegator) external view returns (address) {
        return _delegates[delegator];
    }

    function getCurrentVotes(address account) external view returns (uint256) {
        uint32 nCheckpoints = numCheckpoints[account];
        return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0;
    }

    function getPriorVotes(address account, uint blockNumber) external view returns (uint256) {
        require(blockNumber < block.number, "getPriorVotes: not yet determined");

        uint32 nCheckpoints = numCheckpoints[account];
        if (nCheckpoints == 0) {
            return 0;
        }

        // First check most recent balance
        if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) {
            return checkpoints[account][nCheckpoints - 1].votes;
        }

        // Next check implicit zero balance
        if (checkpoints[account][0].fromBlock > blockNumber) {
            return 0;
        }

        uint32 lower = 0;
        uint32 upper = nCheckpoints - 1;
        while (upper > lower) {
            uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow
            Checkpoint memory cp = checkpoints[account][center];
            if (cp.fromBlock == blockNumber) {
                return cp.votes;
            } else if (cp.fromBlock < blockNumber) {
                lower = center;
            } else {
                upper = center - 1;
            }
        }
        return checkpoints[account][lower].votes;
    }

    /////////////////////
    // WRITE FUNCTIONS //
    /////////////////////

    function delegate(address delegatee) external {
        return _delegate(msg.sender, delegatee);
    }

    function delegateBySig(address delegatee, uint nonce, uint expiry, uint8 v, bytes32 r, bytes32 s) external {
        bytes32 domainSeparator = keccak256(abi.encode(DOMAIN_TYPEHASH, keccak256(bytes(name())), getChainId(), address(this)));
        bytes32 structHash = keccak256(abi.encode(DELEGATION_TYPEHASH, delegatee, nonce, expiry));
        bytes32 digest = keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));

        address signatory = ecrecover(digest, v, r, s);

        require(signatory != address(0), "delegateBySig: invalid signature");
        require(nonce == nonces[signatory]++, "delegateBySig: invalid nonce");
        require(now <= expiry, "delegateBySig: signature expired");
        
        return _delegate(signatory, delegatee);
    }

    //////////////////////////
    // RESTRICTED FUNCTIONS //
    //////////////////////////
    
    function mint(address _to, uint256 _amount) public onlyWhitelisted() {
        _mint(_to, _amount);
        _moveDelegates(address(0), _delegates[_to], _amount);
    }

    ////////////////////////
    // INTERNAL FUNCTIONS //
    ////////////////////////

    function _delegate(address delegator, address delegatee) internal {
        address currentDelegate = _delegates[delegator];
        uint256 delegatorBalance = balanceOf(delegator);
        _delegates[delegator] = delegatee;

        emit DelegateChanged(delegator, currentDelegate, delegatee);

        _moveDelegates(currentDelegate, delegatee, delegatorBalance);
    }

    function _moveDelegates(address srcRep, address dstRep, uint256 amount) internal {
        if (srcRep != dstRep && amount > 0) {
            if (srcRep != address(0)) {
                // decrease old representative
                uint32 srcRepNum = numCheckpoints[srcRep];
                uint256 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0;
                uint256 srcRepNew = srcRepOld.sub(amount);
                _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew);
            }

            if (dstRep != address(0)) {
                // increase new representative
                uint32 dstRepNum = numCheckpoints[dstRep];
                uint256 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0;
                uint256 dstRepNew = dstRepOld.add(amount);
                _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew);
            }
        }
    }

    function _writeCheckpoint(address delegatee, uint32 nCheckpoints, uint256 oldVotes, uint256 newVotes) internal {
        uint32 blockNumber = safe32(block.number, "_writeCheckpoint: block number exceeds 32 bits");

        if (nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber) {
            checkpoints[delegatee][nCheckpoints - 1].votes = newVotes;
        } else {
            checkpoints[delegatee][nCheckpoints] = Checkpoint(blockNumber, newVotes);
            numCheckpoints[delegatee] = nCheckpoints + 1;
        }

        emit DelegateVotesChanged(delegatee, oldVotes, newVotes);
    }

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

    function getChainId() internal pure returns (uint) {
        uint256 chainId;
        assembly { chainId := chainid() }
        return chainId;
    }
}

contract StakeToken is ERC20('Staked SFARM', 'xSFARM'), Whitelist {

    YieldToken public yieldToken;

    constructor(YieldToken _yield) public {
        yieldToken = _yield;
    }

    function mint(address _to, uint256 _amount) public onlyWhitelisted {
        _mint(_to, _amount);
    }

    function burn(address _from ,uint256 _amount) public onlyWhitelisted {
        _burn(_from, _amount);
    }

    function safeYieldTransfer(address _to, uint256 _amount) public onlyWhitelisted {
        uint256 yieldBal = yieldToken.balanceOf(address(this));
        if (_amount > yieldBal) {
            yieldToken.transfer(_to, yieldBal);
        } else {
            yieldToken.transfer(_to, _amount);
        }
    }
}

contract MasterChef is Whitelist {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;

    //////////////////
    // DATA STRUCTS //
    //////////////////

    // Info of each user.
    struct UserInfo {
        uint256 amount;
        uint256 rewardDebt;
    }

    // Info of each pool.
    struct PoolInfo {
        IERC20 lpToken;
        uint256 allocPoint;
        uint256 lastRewardBlock;
        uint256 accYieldPerShare;
    }

    /////////////////////////
    // CONTRACT INTERFACES //
    /////////////////////////

    YieldToken public yield;
    StakeToken public stake;
    IMigratorChef public migrator;

    PoolInfo[] public poolInfo;

    ///////////////////////////////
    // CONFIGURABLES & VARIABLES //
    ///////////////////////////////

    address public feeRecipient;

    uint256 public startBlock;
    uint256 public yieldPerBlock;
    uint256 public BONUS_MULTIPLIER = 1;
    uint256 public totalAllocPoint = 0;

    mapping(address => bool) public poolExists;
    mapping (uint256 => mapping (address => UserInfo)) public userInfo;

    /////////////////////
    // CONTRACT EVENTS //
    /////////////////////

    event Deposit(address indexed user, uint256 indexed pid, uint256 amount);
    event Withdraw(address indexed user, uint256 indexed pid, uint256 amount);
    event EmergencyWithdraw(address indexed user, uint256 indexed pid, uint256 amount);

    ////////////////////////////
    // CONSTRUCTOR & FALLBACK //
    ////////////////////////////

    constructor(
        YieldToken _yield,
        StakeToken _stake,
        address _feeRecipient,
        uint256 _yieldPerBlock,
        uint256 _startBlock
    ) public {
        yield = _yield;
        stake = _stake;
        feeRecipient = _feeRecipient;
        yieldPerBlock = _yieldPerBlock;
        startBlock = _startBlock;

        // staking pool
        poolInfo.push(PoolInfo({
            lpToken: _yield,
            allocPoint: 1000,
            lastRewardBlock: startBlock,
            accYieldPerShare: 0
        }));

        totalAllocPoint = 1000;
    }

    ////////////////////
    // VIEW FUNCTIONS //
    ////////////////////

    // Total number of pools created
    function poolLength() external view returns (uint256) {
        return poolInfo.length;
    }

    // Return reward multiplier over the given _from to _to block.
    function getMultiplier(uint256 _from, uint256 _to) public view returns (uint256) {
        return _to.sub(_from).mul(BONUS_MULTIPLIER);
    }

    // View function to see pending yield on frontend.
    function pendingYield(uint256 _pid, address _user) external view returns (uint256) {
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][_user];
        uint256 accYieldPerShare = pool.accYieldPerShare;
        uint256 lpSupply = pool.lpToken.balanceOf(address(this));
        if (block.number > pool.lastRewardBlock && lpSupply != 0) {
            uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number);
            uint256 yieldReward = multiplier.mul(yieldPerBlock).mul(pool.allocPoint).div(totalAllocPoint);
            accYieldPerShare = accYieldPerShare.add(yieldReward.mul(1e12).div(lpSupply));
        }
        return user.amount.mul(accYieldPerShare).div(1e12).sub(user.rewardDebt);
    }

    /////////////////////
    // WRITE FUNCTIONS //
    /////////////////////

    // Update reward variables for all pools. Be careful of gas spending!
    function massUpdatePools() public {
        uint256 length = poolInfo.length;
        for (uint256 pid = 0; pid < length; ++pid) {
            updatePool(pid);
        }
    }

    // Update reward variables of the given pool to be up-to-date.
    function updatePool(uint256 _pid) public {
        PoolInfo storage pool = poolInfo[_pid];

        if (block.number <= pool.lastRewardBlock) {
            return;
        }

        uint256 lpSupply = pool.lpToken.balanceOf(address(this));

        if (lpSupply == 0) {
            pool.lastRewardBlock = block.number;
            return;
        }

        uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number);
        uint256 yieldReward = multiplier.mul(yieldPerBlock).mul(pool.allocPoint).div(totalAllocPoint);

        yield.mint(feeRecipient, yieldReward.div(10));
        yield.mint(address(stake), yieldReward);

        pool.accYieldPerShare = pool.accYieldPerShare.add(yieldReward.mul(1e12).div(lpSupply));
        pool.lastRewardBlock = block.number;
    }

    // Deposit LP tokens to MasterChef for yield allocation.
    function deposit(uint256 _pid, uint256 _amount) public {

        require (_pid != 0, 'deposit yield by staking');

        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][msg.sender];
        updatePool(_pid);
        if (user.amount > 0) {
            uint256 pending = user.amount.mul(pool.accYieldPerShare).div(1e12).sub(user.rewardDebt);
            if(pending > 0) {
                safeYieldTransfer(msg.sender, pending);
            }
        }
        if (_amount > 0) {
            pool.lpToken.safeTransferFrom(address(msg.sender), address(this), _amount);
            user.amount = user.amount.add(_amount);
        }
        user.rewardDebt = user.amount.mul(pool.accYieldPerShare).div(1e12);
        emit Deposit(msg.sender, _pid, _amount);
    }

    // Withdraw LP tokens from MasterChef.
    function withdraw(uint256 _pid, uint256 _amount) public {

        require (_pid != 0, 'withdraw yield by unstaking');

        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][msg.sender];

        require(user.amount >= _amount, "withdraw: not good");
        
        updatePool(_pid);
        
        uint256 pending = user.amount.mul(pool.accYieldPerShare).div(1e12).sub(user.rewardDebt);
        
        if(pending > 0) {
            safeYieldTransfer(msg.sender, pending);
        }

        if(_amount > 0) {
            user.amount = user.amount.sub(_amount);
            pool.lpToken.safeTransfer(address(msg.sender), _amount);
        }

        user.rewardDebt = user.amount.mul(pool.accYieldPerShare).div(1e12);
        emit Withdraw(msg.sender, _pid, _amount);
    }

    // Stake yield tokens to MasterChef
    function enterStaking(uint256 _amount) public {
        PoolInfo storage pool = poolInfo[0];
        UserInfo storage user = userInfo[0][msg.sender];

        updatePool(0);

        if (user.amount > 0) {
            uint256 pending = user.amount.mul(pool.accYieldPerShare).div(1e12).sub(user.rewardDebt);
            if(pending > 0) {
                safeYieldTransfer(msg.sender, pending);
            }
        }

        if(_amount > 0) {
            pool.lpToken.safeTransferFrom(address(msg.sender), address(this), _amount);
            user.amount = user.amount.add(_amount);
        }

        user.rewardDebt = user.amount.mul(pool.accYieldPerShare).div(1e12);

        stake.mint(msg.sender, _amount);
        emit Deposit(msg.sender, 0, _amount);
    }

    // Withdraw yield tokens from STAKING.
    function leaveStaking(uint256 _amount) public {
        PoolInfo storage pool = poolInfo[0];
        UserInfo storage user = userInfo[0][msg.sender];

        require(user.amount >= _amount, "withdraw: not good");

        updatePool(0);

        uint256 pending = user.amount.mul(pool.accYieldPerShare).div(1e12).sub(user.rewardDebt);

        if(pending > 0) {
            safeYieldTransfer(msg.sender, pending);
        }

        if(_amount > 0) {
            user.amount = user.amount.sub(_amount);
            pool.lpToken.safeTransfer(address(msg.sender), _amount);
        }

        user.rewardDebt = user.amount.mul(pool.accYieldPerShare).div(1e12);

        stake.burn(msg.sender, _amount);

        emit Withdraw(msg.sender, 0, _amount);
    }

    // Withdraw without caring about rewards. EMERGENCY ONLY.
    function emergencyWithdraw(uint256 _pid) public {
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][msg.sender];

        pool.lpToken.safeTransfer(address(msg.sender), user.amount);

        emit EmergencyWithdraw(msg.sender, _pid, user.amount);
        user.amount = 0;
        user.rewardDebt = 0;
    }

    //////////////////////////
    // RESTRICTED FUNCTIONS //
    //////////////////////////

    // Migrate lp token to another lp contract.
    function migrate(uint256 _pid) public onlyOwner {
        require(address(migrator) != address(0), "migrate: no migrator");
        
        PoolInfo storage pool = poolInfo[_pid];
        
        IERC20 lpToken = pool.lpToken;

        uint256 bal = lpToken.balanceOf(address(this));
        
        lpToken.safeApprove(address(migrator), bal);

        IERC20 newLpToken = migrator.migrate(lpToken);

        require(bal == newLpToken.balanceOf(address(this)), "migrate: bad");
        
        pool.lpToken = newLpToken;
    }

    // Set the migrator contract. Can only be called by the owner.
    function setMigrator(IMigratorChef _migrator) public onlyOwner {
        migrator = _migrator;
    }

    // Update fee recipient address
    function setFeeRecipient(address _feeRecipient) public onlyOwner {
        feeRecipient = _feeRecipient;
    }

    // Set yield multiplier for early stakers.
    function updateMultiplier(uint256 multiplierNumber) public onlyOwner {
        BONUS_MULTIPLIER = multiplierNumber;
    }

    // Add a new lp to the pool. Can only be called by the owner.
    function add(uint256 _allocPoint, IERC20 _lpToken, bool _withUpdate) public onlyOwner {
        require(!poolExists[address(_lpToken)], "ALREADY_EXISTS");

        if (_withUpdate) {
            massUpdatePools();
        }

        uint256 lastRewardBlock = block.number > startBlock ? block.number : startBlock;
        
        totalAllocPoint = totalAllocPoint.add(_allocPoint);
        
        poolInfo.push(PoolInfo({
            lpToken: _lpToken,
            allocPoint: _allocPoint,
            lastRewardBlock: lastRewardBlock,
            accYieldPerShare: 0
        }));

        poolExists[address(_lpToken)] = true;
        
        updateStakingPool();
    }

    // Update the given pool's yield allocation point. Can only be called by the owner.
    function set(uint256 _pid, uint256 _allocPoint, bool _withUpdate) public onlyOwner {
        if (_withUpdate) {
            massUpdatePools();
        }
        totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add(_allocPoint);
        uint256 prevAllocPoint = poolInfo[_pid].allocPoint;
        poolInfo[_pid].allocPoint = _allocPoint;
        if (prevAllocPoint != _allocPoint) {
            updateStakingPool();
        }
    }

    //////////////////////////////////
    // INTERNAL & PRIVATE FUNCTIONS //
    //////////////////////////////////

    // Safe yield transfer function, just in case if rounding error causes pool to not have enough yield.
    function safeYieldTransfer(address _to, uint256 _amount) internal {
        stake.safeYieldTransfer(_to, _amount);
    }

    function updateStakingPool() internal {
        uint256 length = poolInfo.length;
        uint256 points = 0;
        for (uint256 pid = 1; pid < length; ++pid) {
            points = points.add(poolInfo[pid].allocPoint);
        }
        if (points != 0) {
            points = points.div(3);
            totalAllocPoint = totalAllocPoint.sub(poolInfo[0].allocPoint).add(points);
            poolInfo[0].allocPoint = points;
        }
    }
}

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"addr","type":"address"}],"name":"WhitelistedAddressAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"addr","type":"address"}],"name":"WhitelistedAddressRemoved","type":"event"},{"inputs":[],"name":"DELEGATION_TYPEHASH","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":[{"internalType":"address","name":"addr","type":"address"}],"name":"addAddressToWhitelist","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addrs","type":"address[]"}],"name":"addAddressesToWhitelist","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","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":"uint32","name":"","type":"uint32"}],"name":"checkpoints","outputs":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"internalType":"uint256","name":"votes","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"delegateBySig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegator","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getCurrentVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPriorVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"address","name":"","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"removeAddressFromWhitelist","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addrs","type":"address[]"}],"name":"removeAddressesFromWhitelist","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","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":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b506040518060400160405280601081526020017f5374726f6e6768616e6473204661726d000000000000000000000000000000008152506040518060400160405280600581526020017f534641524d0000000000000000000000000000000000000000000000000000008152508160039080519060200190620000969291906200018d565b508060049080519060200190620000af9291906200018d565b506012600560006101000a81548160ff021916908360ff16021790555050506000620000e06200018560201b60201c565b905080600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35062000233565b600033905090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620001d057805160ff191683800117855562000201565b8280016001018555821562000201579182015b8281111562000200578251825591602001919060010190620001e3565b5b50905062000210919062000214565b5090565b5b808211156200022f57600081600090555060010162000215565b5090565b6136e080620002436000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c8063782d6fe111610104578063a9059cbb116100a2578063e2ec6ec311610071578063e2ec6ec314610b29578063e7a324dc14610bf7578063f1127ed814610c15578063f2fde38b14610c8a576101da565b8063a9059cbb1461097c578063b4b5ea57146109e0578063c3cda52014610a38578063dd62ed3e14610ab1576101da565b80638da5cb5b116100de5780638da5cb5b1461080757806395d89b411461083b5780639b19251a146108be578063a457c2d714610918576101da565b8063782d6fe1146106f35780637b9417c8146107555780637ecebe00146107af576101da565b8063313ce5671161017c5780635c19a95c1161014b5780635c19a95c146105ef5780636fcfff451461063357806370a0823114610691578063715018a6146106e9576101da565b8063313ce567146104ae57806339509351146104cf57806340c10f1914610533578063587cde1e14610581576101da565b806320606b70116101b857806320606b70146102e457806323b872dd1461030257806324953eaa14610386578063286dd3f514610454576101da565b806306fdde03146101df578063095ea7b31461026257806318160ddd146102c6575b600080fd5b6101e7610cce565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561022757808201518184015260208101905061020c565b50505050905090810190601f1680156102545780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102ae6004803603604081101561027857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610d70565b60405180821515815260200191505060405180910390f35b6102ce610d8e565b6040518082815260200191505060405180910390f35b6102ec610d98565b6040518082815260200191505060405180910390f35b61036e6004803603606081101561031857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610dbc565b60405180821515815260200191505060405180910390f35b61043c6004803603602081101561039c57600080fd5b81019080803590602001906401000000008111156103b957600080fd5b8201836020820111156103cb57600080fd5b803590602001918460208302840111640100000000831117156103ed57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290505050610e95565b60405180821515815260200191505060405180910390f35b6104966004803603602081101561046a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f8b565b60405180821515815260200191505060405180910390f35b6104b661113d565b604051808260ff16815260200191505060405180910390f35b61051b600480360360408110156104e557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611154565b60405180821515815260200191505060405180910390f35b61057f6004803603604081101561054957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611207565b005b6105c36004803603602081101561059757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061133f565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6106316004803603602081101561060557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506113a8565b005b6106756004803603602081101561064957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506113b5565b604051808263ffffffff16815260200191505060405180910390f35b6106d3600480360360208110156106a757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506113d8565b6040518082815260200191505060405180910390f35b6106f1611420565b005b61073f6004803603604081101561070957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611590565b6040518082815260200191505060405180910390f35b6107976004803603602081101561076b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611951565b60405180821515815260200191505060405180910390f35b6107f1600480360360208110156107c557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b02565b6040518082815260200191505060405180910390f35b61080f611b1a565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610843611b44565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610883578082015181840152602081019050610868565b50505050905090810190601f1680156108b05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610900600480360360208110156108d457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611be6565b60405180821515815260200191505060405180910390f35b6109646004803603604081101561092e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611c06565b60405180821515815260200191505060405180910390f35b6109c86004803603604081101561099257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611cd3565b60405180821515815260200191505060405180910390f35b610a22600480360360208110156109f657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611cf1565b6040518082815260200191505060405180910390f35b610aaf600480360360c0811015610a4e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190803560ff1690602001909291908035906020019092919080359060200190929190505050611dc7565b005b610b1360048036036040811015610ac757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612182565b6040518082815260200191505060405180910390f35b610bdf60048036036020811015610b3f57600080fd5b8101908080359060200190640100000000811115610b5c57600080fd5b820183602082011115610b6e57600080fd5b80359060200191846020830284011164010000000083111715610b9057600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290505050612209565b60405180821515815260200191505060405180910390f35b610bff6122ff565b6040518082815260200191505060405180910390f35b610c6760048036036040811015610c2b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803563ffffffff169060200190929190505050612323565b604051808363ffffffff1681526020018281526020019250505060405180910390f35b610ccc60048036036020811015610ca057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612364565b005b606060038054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610d665780601f10610d3b57610100808354040283529160200191610d66565b820191906000526020600020905b815481529060010190602001808311610d4957829003601f168201915b5050505050905090565b6000610d84610d7d612559565b8484612561565b6001905092915050565b6000600254905090565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6000610dc9848484612758565b610e8a84610dd5612559565b610e85856040518060600160405280602881526020016135e760289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610e3b612559565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612a199092919063ffffffff16565b612561565b600190509392505050565b6000610e9f612559565b73ffffffffffffffffffffffffffffffffffffffff16610ebd611b1a565b73ffffffffffffffffffffffffffffffffffffffff1614610f46576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60005b8251811015610f8557610f6e838281518110610f6157fe5b6020026020010151610f8b565b15610f7857600191505b8080600101915050610f49565b50919050565b6000610f95612559565b73ffffffffffffffffffffffffffffffffffffffff16610fb3611b1a565b73ffffffffffffffffffffffffffffffffffffffff161461103c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611138576000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507ff1abf01a1043b7c244d128e8595cf0c1d10743b022b03a02dffd8ca3bf729f5a82604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1600190505b919050565b6000600560009054906101000a900460ff16905090565b60006111fd611161612559565b846111f88560016000611172612559565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612ad390919063ffffffff16565b612561565b6001905092915050565b600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166112c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f6e6f2077686974656c697374000000000000000000000000000000000000000081525060200191505060405180910390fd5b6112d08282612b5b565b61133b6000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683612d22565b5050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6113b23382612fbf565b50565b60096020528060005260406000206000915054906101000a900463ffffffff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611428612559565b73ffffffffffffffffffffffffffffffffffffffff16611446611b1a565b73ffffffffffffffffffffffffffffffffffffffff16146114cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60004382106115ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806135356021913960400191505060405180910390fd5b6000600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff16905060008163ffffffff16141561165757600091505061194b565b82600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001840363ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff161161174157600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001830363ffffffff1663ffffffff1681526020019081526020016000206001015491505061194b565b82600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008063ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff1611156117c257600091505061194b565b6000806001830390505b8163ffffffff168163ffffffff1611156118e5576000600283830363ffffffff16816117f457fe5b0482039050611801613514565b600a60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008363ffffffff1663ffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff168152602001600182015481525050905086816000015163ffffffff1614156118bd5780602001519550505050505061194b565b86816000015163ffffffff1610156118d7578193506118de565b6001820392505b50506117cc565b600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008363ffffffff1663ffffffff1681526020019081526020016000206001015493505050505b92915050565b600061195b612559565b73ffffffffffffffffffffffffffffffffffffffff16611979611b1a565b73ffffffffffffffffffffffffffffffffffffffff1614611a02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611afd576001600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507fd1bba68c128cc3f427e5831b3c6f99f480b6efa6b9e80c757768f6124158cc3f82604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1600190505b919050565b60076020528060005260406000206000915090505481565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611bdc5780601f10611bb157610100808354040283529160200191611bdc565b820191906000526020600020905b815481529060010190602001808311611bbf57829003601f168201915b5050505050905090565b60066020528060005260406000206000915054906101000a900460ff1681565b6000611cc9611c13612559565b84611cc4856040518060600160405280602581526020016136866025913960016000611c3d612559565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612a199092919063ffffffff16565b612561565b6001905092915050565b6000611ce7611ce0612559565b8484612758565b6001905092915050565b600080600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff16905060008163ffffffff1611611d5b576000611dbf565b600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001830363ffffffff1663ffffffff168152602001908152602001600020600101545b915050919050565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866611df2610cce565b80519060200120611e01613130565b30604051602001808581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200194505050505060405160208183030381529060405280519060200120905060007fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf888888604051602001808581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018281526020019450505050506040516020818303038152906040528051906020012090506000828260405160200180807f190100000000000000000000000000000000000000000000000000000000000081525060020183815260200182815260200192505050604051602081830303815290604052805190602001209050600060018288888860405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015611f85573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612034576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f64656c656761746542795369673a20696e76616c6964207369676e617475726581525060200191505060405180910390fd5b600760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505589146120f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f64656c656761746542795369673a20696e76616c6964206e6f6e63650000000081525060200191505060405180910390fd5b8742111561216c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f64656c656761746542795369673a207369676e6174757265206578706972656481525060200191505060405180910390fd5b612176818b612fbf565b50505050505050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000612213612559565b73ffffffffffffffffffffffffffffffffffffffff16612231611b1a565b73ffffffffffffffffffffffffffffffffffffffff16146122ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60005b82518110156122f9576122e28382815181106122d557fe5b6020026020010151611951565b156122ec57600191505b80806001019150506122bd565b50919050565b7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b600a602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900463ffffffff16908060010154905082565b61236c612559565b73ffffffffffffffffffffffffffffffffffffffff1661238a611b1a565b73ffffffffffffffffffffffffffffffffffffffff1614612413576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612499576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806135796026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156125e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806136626024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561266d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602281526020018061359f6022913960400191505060405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156127de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602581526020018061363d6025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612864576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806135566023913960400191505060405180910390fd5b61286f83838361313d565b6128da816040518060600160405280602681526020016135c1602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612a199092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061296d816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612ad390919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b6000838311158290612ac6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612a8b578082015181840152602081019050612a70565b50505050905090810190601f168015612ab85780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5082840390509392505050565b600080828401905083811015612b51576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612bfe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b612c0a6000838361313d565b612c1f81600254612ad390919063ffffffff16565b600281905550612c76816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612ad390919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015612d5e5750600081115b15612fba57600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612e8e576000600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff1611612e01576000612e65565b600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001840363ffffffff1663ffffffff168152602001908152602001600020600101545b90506000612e7c848361314290919063ffffffff16565b9050612e8a868484846131c5565b5050505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612fb9576000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff1611612f2c576000612f90565b600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001840363ffffffff1663ffffffff168152602001908152602001600020600101545b90506000612fa78483612ad390919063ffffffff16565b9050612fb5858484846131c5565b5050505b5b505050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600061302e846113d8565b905082600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a461312a828483612d22565b50505050565b6000804690508091505090565b505050565b6000828211156131ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525060200191505060405180910390fd5b818303905092915050565b60006131e9436040518060600160405280602e815260200161360f602e9139613459565b905060008463ffffffff1611801561327e57508063ffffffff16600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001870363ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff16145b156132ef5781600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001870363ffffffff1663ffffffff168152602001908152602001600020600101819055506133fc565b60405180604001604052808263ffffffff16815260200183815250600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008663ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff1602179055506020820151816001015590505060018401600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055505b8473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248484604051808381526020018281526020019250505060405180910390a25050505050565b60006401000000008310829061350a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156134cf5780820151818401526020810190506134b4565b50505050905090810190601f1680156134fc5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5082905092915050565b6040518060400160405280600063ffffffff16815260200160008152509056fe6765745072696f72566f7465733a206e6f74207965742064657465726d696e656445524332303a207472616e7366657220746f20746865207a65726f20616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63655f7772697465436865636b706f696e743a20626c6f636b206e756d6265722065786365656473203332206269747345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122099932a0a54aafa6e8a9daf130da6c2dc08d03d4010b5832c4debcc96606ddda664736f6c634300060c0033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101da5760003560e01c8063782d6fe111610104578063a9059cbb116100a2578063e2ec6ec311610071578063e2ec6ec314610b29578063e7a324dc14610bf7578063f1127ed814610c15578063f2fde38b14610c8a576101da565b8063a9059cbb1461097c578063b4b5ea57146109e0578063c3cda52014610a38578063dd62ed3e14610ab1576101da565b80638da5cb5b116100de5780638da5cb5b1461080757806395d89b411461083b5780639b19251a146108be578063a457c2d714610918576101da565b8063782d6fe1146106f35780637b9417c8146107555780637ecebe00146107af576101da565b8063313ce5671161017c5780635c19a95c1161014b5780635c19a95c146105ef5780636fcfff451461063357806370a0823114610691578063715018a6146106e9576101da565b8063313ce567146104ae57806339509351146104cf57806340c10f1914610533578063587cde1e14610581576101da565b806320606b70116101b857806320606b70146102e457806323b872dd1461030257806324953eaa14610386578063286dd3f514610454576101da565b806306fdde03146101df578063095ea7b31461026257806318160ddd146102c6575b600080fd5b6101e7610cce565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561022757808201518184015260208101905061020c565b50505050905090810190601f1680156102545780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102ae6004803603604081101561027857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610d70565b60405180821515815260200191505060405180910390f35b6102ce610d8e565b6040518082815260200191505060405180910390f35b6102ec610d98565b6040518082815260200191505060405180910390f35b61036e6004803603606081101561031857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610dbc565b60405180821515815260200191505060405180910390f35b61043c6004803603602081101561039c57600080fd5b81019080803590602001906401000000008111156103b957600080fd5b8201836020820111156103cb57600080fd5b803590602001918460208302840111640100000000831117156103ed57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290505050610e95565b60405180821515815260200191505060405180910390f35b6104966004803603602081101561046a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f8b565b60405180821515815260200191505060405180910390f35b6104b661113d565b604051808260ff16815260200191505060405180910390f35b61051b600480360360408110156104e557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611154565b60405180821515815260200191505060405180910390f35b61057f6004803603604081101561054957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611207565b005b6105c36004803603602081101561059757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061133f565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6106316004803603602081101561060557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506113a8565b005b6106756004803603602081101561064957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506113b5565b604051808263ffffffff16815260200191505060405180910390f35b6106d3600480360360208110156106a757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506113d8565b6040518082815260200191505060405180910390f35b6106f1611420565b005b61073f6004803603604081101561070957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611590565b6040518082815260200191505060405180910390f35b6107976004803603602081101561076b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611951565b60405180821515815260200191505060405180910390f35b6107f1600480360360208110156107c557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b02565b6040518082815260200191505060405180910390f35b61080f611b1a565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610843611b44565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610883578082015181840152602081019050610868565b50505050905090810190601f1680156108b05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610900600480360360208110156108d457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611be6565b60405180821515815260200191505060405180910390f35b6109646004803603604081101561092e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611c06565b60405180821515815260200191505060405180910390f35b6109c86004803603604081101561099257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611cd3565b60405180821515815260200191505060405180910390f35b610a22600480360360208110156109f657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611cf1565b6040518082815260200191505060405180910390f35b610aaf600480360360c0811015610a4e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190803560ff1690602001909291908035906020019092919080359060200190929190505050611dc7565b005b610b1360048036036040811015610ac757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612182565b6040518082815260200191505060405180910390f35b610bdf60048036036020811015610b3f57600080fd5b8101908080359060200190640100000000811115610b5c57600080fd5b820183602082011115610b6e57600080fd5b80359060200191846020830284011164010000000083111715610b9057600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290505050612209565b60405180821515815260200191505060405180910390f35b610bff6122ff565b6040518082815260200191505060405180910390f35b610c6760048036036040811015610c2b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803563ffffffff169060200190929190505050612323565b604051808363ffffffff1681526020018281526020019250505060405180910390f35b610ccc60048036036020811015610ca057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612364565b005b606060038054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610d665780601f10610d3b57610100808354040283529160200191610d66565b820191906000526020600020905b815481529060010190602001808311610d4957829003601f168201915b5050505050905090565b6000610d84610d7d612559565b8484612561565b6001905092915050565b6000600254905090565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6000610dc9848484612758565b610e8a84610dd5612559565b610e85856040518060600160405280602881526020016135e760289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610e3b612559565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612a199092919063ffffffff16565b612561565b600190509392505050565b6000610e9f612559565b73ffffffffffffffffffffffffffffffffffffffff16610ebd611b1a565b73ffffffffffffffffffffffffffffffffffffffff1614610f46576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60005b8251811015610f8557610f6e838281518110610f6157fe5b6020026020010151610f8b565b15610f7857600191505b8080600101915050610f49565b50919050565b6000610f95612559565b73ffffffffffffffffffffffffffffffffffffffff16610fb3611b1a565b73ffffffffffffffffffffffffffffffffffffffff161461103c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611138576000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507ff1abf01a1043b7c244d128e8595cf0c1d10743b022b03a02dffd8ca3bf729f5a82604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1600190505b919050565b6000600560009054906101000a900460ff16905090565b60006111fd611161612559565b846111f88560016000611172612559565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612ad390919063ffffffff16565b612561565b6001905092915050565b600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166112c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f6e6f2077686974656c697374000000000000000000000000000000000000000081525060200191505060405180910390fd5b6112d08282612b5b565b61133b6000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683612d22565b5050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6113b23382612fbf565b50565b60096020528060005260406000206000915054906101000a900463ffffffff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611428612559565b73ffffffffffffffffffffffffffffffffffffffff16611446611b1a565b73ffffffffffffffffffffffffffffffffffffffff16146114cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60004382106115ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806135356021913960400191505060405180910390fd5b6000600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff16905060008163ffffffff16141561165757600091505061194b565b82600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001840363ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff161161174157600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001830363ffffffff1663ffffffff1681526020019081526020016000206001015491505061194b565b82600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008063ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff1611156117c257600091505061194b565b6000806001830390505b8163ffffffff168163ffffffff1611156118e5576000600283830363ffffffff16816117f457fe5b0482039050611801613514565b600a60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008363ffffffff1663ffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff168152602001600182015481525050905086816000015163ffffffff1614156118bd5780602001519550505050505061194b565b86816000015163ffffffff1610156118d7578193506118de565b6001820392505b50506117cc565b600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008363ffffffff1663ffffffff1681526020019081526020016000206001015493505050505b92915050565b600061195b612559565b73ffffffffffffffffffffffffffffffffffffffff16611979611b1a565b73ffffffffffffffffffffffffffffffffffffffff1614611a02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611afd576001600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507fd1bba68c128cc3f427e5831b3c6f99f480b6efa6b9e80c757768f6124158cc3f82604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1600190505b919050565b60076020528060005260406000206000915090505481565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611bdc5780601f10611bb157610100808354040283529160200191611bdc565b820191906000526020600020905b815481529060010190602001808311611bbf57829003601f168201915b5050505050905090565b60066020528060005260406000206000915054906101000a900460ff1681565b6000611cc9611c13612559565b84611cc4856040518060600160405280602581526020016136866025913960016000611c3d612559565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612a199092919063ffffffff16565b612561565b6001905092915050565b6000611ce7611ce0612559565b8484612758565b6001905092915050565b600080600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff16905060008163ffffffff1611611d5b576000611dbf565b600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001830363ffffffff1663ffffffff168152602001908152602001600020600101545b915050919050565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866611df2610cce565b80519060200120611e01613130565b30604051602001808581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200194505050505060405160208183030381529060405280519060200120905060007fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf888888604051602001808581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018281526020019450505050506040516020818303038152906040528051906020012090506000828260405160200180807f190100000000000000000000000000000000000000000000000000000000000081525060020183815260200182815260200192505050604051602081830303815290604052805190602001209050600060018288888860405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015611f85573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612034576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f64656c656761746542795369673a20696e76616c6964207369676e617475726581525060200191505060405180910390fd5b600760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505589146120f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f64656c656761746542795369673a20696e76616c6964206e6f6e63650000000081525060200191505060405180910390fd5b8742111561216c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f64656c656761746542795369673a207369676e6174757265206578706972656481525060200191505060405180910390fd5b612176818b612fbf565b50505050505050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000612213612559565b73ffffffffffffffffffffffffffffffffffffffff16612231611b1a565b73ffffffffffffffffffffffffffffffffffffffff16146122ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60005b82518110156122f9576122e28382815181106122d557fe5b6020026020010151611951565b156122ec57600191505b80806001019150506122bd565b50919050565b7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b600a602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900463ffffffff16908060010154905082565b61236c612559565b73ffffffffffffffffffffffffffffffffffffffff1661238a611b1a565b73ffffffffffffffffffffffffffffffffffffffff1614612413576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612499576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806135796026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156125e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806136626024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561266d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602281526020018061359f6022913960400191505060405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156127de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602581526020018061363d6025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612864576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806135566023913960400191505060405180910390fd5b61286f83838361313d565b6128da816040518060600160405280602681526020016135c1602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612a199092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061296d816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612ad390919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b6000838311158290612ac6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612a8b578082015181840152602081019050612a70565b50505050905090810190601f168015612ab85780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5082840390509392505050565b600080828401905083811015612b51576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612bfe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b612c0a6000838361313d565b612c1f81600254612ad390919063ffffffff16565b600281905550612c76816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612ad390919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015612d5e5750600081115b15612fba57600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612e8e576000600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff1611612e01576000612e65565b600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001840363ffffffff1663ffffffff168152602001908152602001600020600101545b90506000612e7c848361314290919063ffffffff16565b9050612e8a868484846131c5565b5050505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612fb9576000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff1611612f2c576000612f90565b600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001840363ffffffff1663ffffffff168152602001908152602001600020600101545b90506000612fa78483612ad390919063ffffffff16565b9050612fb5858484846131c5565b5050505b5b505050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600061302e846113d8565b905082600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a461312a828483612d22565b50505050565b6000804690508091505090565b505050565b6000828211156131ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525060200191505060405180910390fd5b818303905092915050565b60006131e9436040518060600160405280602e815260200161360f602e9139613459565b905060008463ffffffff1611801561327e57508063ffffffff16600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001870363ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff16145b156132ef5781600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001870363ffffffff1663ffffffff168152602001908152602001600020600101819055506133fc565b60405180604001604052808263ffffffff16815260200183815250600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008663ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff1602179055506020820151816001015590505060018401600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055505b8473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248484604051808381526020018281526020019250505060405180910390a25050505050565b60006401000000008310829061350a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156134cf5780820151818401526020810190506134b4565b50505050905090810190601f1680156134fc5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5082905092915050565b6040518060400160405280600063ffffffff16815260200160008152509056fe6765745072696f72566f7465733a206e6f74207965742064657465726d696e656445524332303a207472616e7366657220746f20746865207a65726f20616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63655f7772697465436865636b706f696e743a20626c6f636b206e756d6265722065786365656473203332206269747345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122099932a0a54aafa6e8a9daf130da6c2dc08d03d4010b5832c4debcc96606ddda664736f6c634300060c0033

Deployed ByteCode Sourcemap

15425:6216:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11604:91;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12498:169;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;11905:108;;;:::i;:::-;;;;;;;;;;;;;;;;;;;15834:122;;;:::i;:::-;;;;;;;;;;;;;;;;;;;12675:321;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;10802:304;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;10511:283;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;11806:91;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;13004:218;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;19055:170;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;16382:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;18044:104;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;15697:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;12021:127;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;9240:148;;;:::i;:::-;;16738:1215;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;9950:251;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;15588:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;9017:87;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;11703:95;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9684:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;13230:269;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;12156:175;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;16507:223;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;18156:789;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;12339:151;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;10209:294;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;15963:117;;;:::i;:::-;;;;;;;;;;;;;;;;;;;15755:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;9396:244;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;11604:91;11649:13;11682:5;11675:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11604:91;:::o;12498:169::-;12581:4;12598:39;12607:12;:10;:12::i;:::-;12621:7;12630:6;12598:8;:39::i;:::-;12655:4;12648:11;;12498:169;;;;:::o;11905:108::-;11966:7;11993:12;;11986:19;;11905:108;:::o;15834:122::-;15876:80;15834:122;:::o;12675:321::-;12781:4;12798:36;12808:6;12816:9;12827:6;12798:9;:36::i;:::-;12845:121;12854:6;12862:12;:10;:12::i;:::-;12876:89;12914:6;12876:89;;;;;;;;;;;;;;;;;:11;:19;12888:6;12876:19;;;;;;;;;;;;;;;:33;12896:12;:10;:12::i;:::-;12876:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;12845:8;:121::i;:::-;12984:4;12977:11;;12675:321;;;;;:::o;10802:304::-;10889:12;9163;:10;:12::i;:::-;9152:23;;:7;:5;:7::i;:::-;:23;;;9144:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10919:9:::1;10914:160;10938:5;:12;10934:1;:16;10914:160;;;10976:36;11003:5;11009:1;11003:8;;;;;;;;;;;;;;10976:26;:36::i;:::-;10972:91;;;11043:4;11033:14;;10972:91;10952:3;;;;;;;10914:160;;;;10802:304:::0;;;:::o;10511:283::-;10586:12;9163;:10;:12::i;:::-;9152:23;;:7;:5;:7::i;:::-;:23;;;9144:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10615:9:::1;:15;10625:4;10615:15;;;;;;;;;;;;;;;;;;;;;;;;;10611:151;;;10665:5;10647:9;:15;10657:4;10647:15;;;;;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;10690:31;10716:4;10690:31;;;;;;;;;;;;;;;;;;;;10746:4;10736:14;;10611:151;10511:283:::0;;;:::o;11806:91::-;11855:5;11880:9;;;;;;;;;;;11873:16;;11806:91;:::o;13004:218::-;13092:4;13109:83;13118:12;:10;:12::i;:::-;13132:7;13141:50;13180:10;13141:11;:25;13153:12;:10;:12::i;:::-;13141:25;;;;;;;;;;;;;;;:34;13167:7;13141:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;13109:8;:83::i;:::-;13210:4;13203:11;;13004:218;;;;:::o;19055:170::-;9884:9;:21;9894:10;9884:21;;;;;;;;;;;;;;;;;;;;;;;;;9876:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19135:19:::1;19141:3;19146:7;19135:5;:19::i;:::-;19165:52;19188:1;19192:10;:15;19203:3;19192:15;;;;;;;;;;;;;;;;;;;;;;;;;19209:7;19165:14;:52::i;:::-;19055:170:::0;;:::o;16382:117::-;16443:7;16470:10;:21;16481:9;16470:21;;;;;;;;;;;;;;;;;;;;;;;;;16463:28;;16382:117;;;:::o;18044:104::-;18108:32;18118:10;18130:9;18108;:32::i;:::-;18044:104;:::o;15697:49::-;;;;;;;;;;;;;;;;;;;;;;:::o;12021:127::-;12095:7;12122:9;:18;12132:7;12122:18;;;;;;;;;;;;;;;;12115:25;;12021:127;;;:::o;9240:148::-;9163:12;:10;:12::i;:::-;9152:23;;:7;:5;:7::i;:::-;:23;;;9144:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9347:1:::1;9310:40;;9331:6;;;;;;;;;;;9310:40;;;;;;;;;;;;9378:1;9361:6;;:19;;;;;;;;;;;;;;;;;;9240:148::o:0;16738:1215::-;16819:7;16861:12;16847:11;:26;16839:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16924:19;16946:14;:23;16961:7;16946:23;;;;;;;;;;;;;;;;;;;;;;;;;16924:45;;17000:1;16984:12;:17;;;16980:58;;;17025:1;17018:8;;;;;16980:58;17150:11;17098;:20;17110:7;17098:20;;;;;;;;;;;;;;;:38;17134:1;17119:12;:16;17098:38;;;;;;;;;;;;;;;:48;;;;;;;;;;;;:63;;;17094:147;;17185:11;:20;17197:7;17185:20;;;;;;;;;;;;;;;:38;17221:1;17206:12;:16;17185:38;;;;;;;;;;;;;;;:44;;;17178:51;;;;;17094:147;17338:11;17302;:20;17314:7;17302:20;;;;;;;;;;;;;;;:23;17323:1;17302:23;;;;;;;;;;;;;:33;;;;;;;;;;;;:47;;;17298:88;;;17373:1;17366:8;;;;;17298:88;17398:12;17425;17455:1;17440:12;:16;17425:31;;17467:428;17482:5;17474:13;;:5;:13;;;17467:428;;;17504:13;17546:1;17537:5;17529;:13;17528:19;;;;;;;;17520:5;:27;17504:43;;17589:20;;:::i;:::-;17612:11;:20;17624:7;17612:20;;;;;;;;;;;;;;;:28;17633:6;17612:28;;;;;;;;;;;;;;;17589:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17675:11;17659:2;:12;;;:27;;;17655:229;;;17714:2;:8;;;17707:15;;;;;;;;;17655:229;17763:11;17748:2;:12;;;:26;;;17744:140;;;17803:6;17795:14;;17744:140;;;17867:1;17858:6;:10;17850:18;;17744:140;17467:428;;;;;17912:11;:20;17924:7;17912:20;;;;;;;;;;;;;;;:27;17933:5;17912:27;;;;;;;;;;;;;;;:33;;;17905:40;;;;;16738:1215;;;;;:::o;9950:251::-;10020:12;9163;:10;:12::i;:::-;9152:23;;:7;:5;:7::i;:::-;:23;;;9144:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10050:9:::1;:15;10060:4;10050:15;;;;;;;;;;;;;;;;;;;;;;;;;10045:149;;10100:4;10082:9;:15;10092:4;10082:15;;;;;;;;;;;;;;;;:22;;;;;;;;;;;;;;;;;;10124:29;10148:4;10124:29;;;;;;;;;;;;;;;;;;;;10178:4;10168:14;;10045:149;9950:251:::0;;;:::o;15588:39::-;;;;;;;;;;;;;;;;;:::o;9017:87::-;9063:7;9090:6;;;;;;;;;;;9083:13;;9017:87;:::o;11703:95::-;11750:13;11783:7;11776:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11703:95;:::o;9684:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;13230:269::-;13323:4;13340:129;13349:12;:10;:12::i;:::-;13363:7;13372:96;13411:15;13372:96;;;;;;;;;;;;;;;;;:11;:25;13384:12;:10;:12::i;:::-;13372:25;;;;;;;;;;;;;;;:34;13398:7;13372:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;13340:8;:129::i;:::-;13487:4;13480:11;;13230:269;;;;:::o;12156:175::-;12242:4;12259:42;12269:12;:10;:12::i;:::-;12283:9;12294:6;12259:9;:42::i;:::-;12319:4;12312:11;;12156:175;;;;:::o;16507:223::-;16572:7;16592:19;16614:14;:23;16629:7;16614:23;;;;;;;;;;;;;;;;;;;;;;;;;16592:45;;16670:1;16655:12;:16;;;:67;;16721:1;16655:67;;;16674:11;:20;16686:7;16674:20;;;;;;;;;;;;;;;:38;16710:1;16695:12;:16;16674:38;;;;;;;;;;;;;;;:44;;;16655:67;16648:74;;;16507:223;;;:::o;18156:789::-;18274:23;15876:80;18354:6;:4;:6::i;:::-;18338:24;;;;;;18364:12;:10;:12::i;:::-;18386:4;18310:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18300:93;;;;;;18274:119;;18404:18;16009:71;18467:9;18478:5;18485:6;18435:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18425:68;;;;;;18404:89;;18504:14;18560:15;18577:10;18531:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18521:68;;;;;;18504:85;;18602:17;18622:26;18632:6;18640:1;18643;18646;18622:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18602:46;;18690:1;18669:23;;:9;:23;;;;18661:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18757:6;:17;18764:9;18757:17;;;;;;;;;;;;;;;;:19;;;;;;;;;;;;18748:5;:28;18740:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18835:6;18828:3;:13;;18820:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18906:31;18916:9;18927;18906;:31::i;:::-;18899:38;;;;18156:789;;;;;;:::o;12339:151::-;12428:7;12455:11;:18;12467:5;12455:18;;;;;;;;;;;;;;;:27;12474:7;12455:27;;;;;;;;;;;;;;;;12448:34;;12339:151;;;;:::o;10209:294::-;10291:12;9163;:10;:12::i;:::-;9152:23;;:7;:5;:7::i;:::-;:23;;;9144:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10321:9:::1;10316:155;10340:5;:12;10336:1;:16;10316:155;;;10378:31;10400:5;10406:1;10400:8;;;;;;;;;;;;;;10378:21;:31::i;:::-;10374:86;;;10440:4;10430:14;;10374:86;10354:3;;;;;;;10316:155;;;;10209:294:::0;;;:::o;15963:117::-;16009:71;15963:117;:::o;15755:70::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;9396:244::-;9163:12;:10;:12::i;:::-;9152:23;;:7;:5;:7::i;:::-;:23;;;9144:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9505:1:::1;9485:22;;:8;:22;;;;9477:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9595:8;9566:38;;9587:6;;;;;;;;;;;9566:38;;;;;;;;;;;;9624:8;9615:6;;:17;;;;;;;;;;;;;;;;;;9396:244:::0;:::o;8444:106::-;8497:15;8532:10;8525:17;;8444:106;:::o;14866:346::-;14985:1;14968:19;;:5;:19;;;;14960:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15066:1;15047:21;;:7;:21;;;;15039:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15150:6;15120:11;:18;15132:5;15120:18;;;;;;;;;;;;;;;:27;15139:7;15120:27;;;;;;;;;;;;;;;:36;;;;15188:7;15172:32;;15181:5;15172:32;;;15197:6;15172:32;;;;;;;;;;;;;;;;;;14866:346;;;:::o;13507:539::-;13631:1;13613:20;;:6;:20;;;;13605:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13715:1;13694:23;;:9;:23;;;;13686:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13770:47;13791:6;13799:9;13810:6;13770:20;:47::i;:::-;13850:71;13872:6;13850:71;;;;;;;;;;;;;;;;;:9;:17;13860:6;13850:17;;;;;;;;;;;;;;;;:21;;:71;;;;;:::i;:::-;13830:9;:17;13840:6;13830:17;;;;;;;;;;;;;;;:91;;;;13955:32;13980:6;13955:9;:20;13965:9;13955:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;13932:9;:20;13942:9;13932:20;;;;;;;;;;;;;;;:55;;;;14020:9;14003:35;;14012:6;14003:35;;;14031:6;14003:35;;;;;;;;;;;;;;;;;;13507:539;;;:::o;5187:166::-;5273:7;5306:1;5301;:6;;5309:12;5293:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5344:1;5340;:5;5333:12;;5187:166;;;;;:::o;4286:179::-;4344:7;4364:9;4380:1;4376;:5;4364:17;;4405:1;4400;:6;;4392:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4456:1;4449:8;;;4286:179;;;;:::o;14054:378::-;14157:1;14138:21;;:7;:21;;;;14130:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14208:49;14237:1;14241:7;14250:6;14208:20;:49::i;:::-;14285:24;14302:6;14285:12;;:16;;:24;;;;:::i;:::-;14270:12;:39;;;;14341:30;14364:6;14341:9;:18;14351:7;14341:18;;;;;;;;;;;;;;;;:22;;:30;;;;:::i;:::-;14320:9;:18;14330:7;14320:18;;;;;;;;;;;;;;;:51;;;;14408:7;14387:37;;14404:1;14387:37;;;14417:6;14387:37;;;;;;;;;;;;;;;;;;14054:378;;:::o;19712:947::-;19818:6;19808:16;;:6;:16;;;;:30;;;;;19837:1;19828:6;:10;19808:30;19804:848;;;19877:1;19859:20;;:6;:20;;;19855:385;;19948:16;19967:14;:22;19982:6;19967:22;;;;;;;;;;;;;;;;;;;;;;;;;19948:41;;20008:17;20040:1;20028:9;:13;;;:60;;20087:1;20028:60;;;20044:11;:19;20056:6;20044:19;;;;;;;;;;;;;;;:34;20076:1;20064:9;:13;20044:34;;;;;;;;;;;;;;;:40;;;20028:60;20008:80;;20107:17;20127:21;20141:6;20127:9;:13;;:21;;;;:::i;:::-;20107:41;;20167:57;20184:6;20192:9;20203;20214;20167:16;:57::i;:::-;19855:385;;;;20278:1;20260:20;;:6;:20;;;20256:385;;20349:16;20368:14;:22;20383:6;20368:22;;;;;;;;;;;;;;;;;;;;;;;;;20349:41;;20409:17;20441:1;20429:9;:13;;;:60;;20488:1;20429:60;;;20445:11;:19;20457:6;20445:19;;;;;;;;;;;;;;;:34;20477:1;20465:9;:13;20445:34;;;;;;;;;;;;;;;:40;;;20429:60;20409:80;;20508:17;20528:21;20542:6;20528:9;:13;;:21;;;;:::i;:::-;20508:41;;20568:57;20585:6;20593:9;20604;20615;20568:16;:57::i;:::-;20256:385;;;;19804:848;19712:947;;;:::o;19325:379::-;19402:23;19428:10;:21;19439:9;19428:21;;;;;;;;;;;;;;;;;;;;;;;;;19402:47;;19460:24;19487:20;19497:9;19487;:20::i;:::-;19460:47;;19542:9;19518:10;:21;19529:9;19518:21;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;19613:9;19569:54;;19596:15;19569:54;;19585:9;19569:54;;;;;;;;;;;;19636:60;19651:15;19668:9;19679:16;19636:14;:60::i;:::-;19325:379;;;;:::o;21485:153::-;21530:4;21547:15;21595:9;21584:20;;21623:7;21616:14;;;21485:153;:::o;15326:92::-;;;;:::o;4473:158::-;4531:7;4564:1;4559;:6;;4551:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4622:1;4618;:5;4611:12;;4473:158;;;;:::o;20667:641::-;20789:18;20810:70;20817:12;20810:70;;;;;;;;;;;;;;;;;:6;:70::i;:::-;20789:91;;20912:1;20897:12;:16;;;:85;;;;;20971:11;20917:65;;:11;:22;20929:9;20917:22;;;;;;;;;;;;;;;:40;20955:1;20940:12;:16;20917:40;;;;;;;;;;;;;;;:50;;;;;;;;;;;;:65;;;20897:85;20893:339;;;21048:8;20999:11;:22;21011:9;20999:22;;;;;;;;;;;;;;;:40;21037:1;21022:12;:16;20999:40;;;;;;;;;;;;;;;:46;;:57;;;;20893:339;;;21128:33;;;;;;;;21139:11;21128:33;;;;;;21152:8;21128:33;;;21089:11;:22;21101:9;21089:22;;;;;;;;;;;;;;;:36;21112:12;21089:36;;;;;;;;;;;;;;;:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21219:1;21204:12;:16;21176:14;:25;21191:9;21176:25;;;;;;;;;;;;;;;;:44;;;;;;;;;;;;;;;;;;20893:339;21270:9;21249:51;;;21281:8;21291;21249:51;;;;;;;;;;;;;;;;;;;;;;;;20667:641;;;;;:::o;21316:161::-;21391:6;21422:5;21418:1;:9;21429:12;21410:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21467:1;21453:16;;21316:161;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

ipfs://99932a0a54aafa6e8a9daf130da6c2dc08d03d4010b5832c4debcc96606ddda6
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.