Contract 0x4B546457CA82574f86911022ECc15cE4569EFB0b

Txn Hash Method
Block
From
To
Value [Txn Fee]
0x7dd6bf6494b318c3063bf931bca63c147fb3d3fd280b92bb69898c2ff7dd73f5Approve49014802022-10-02 9:58:283 days 18 hrs ago0x76e883d43c63718d40052a3749a43ae9002b35f0 IN  0x4b546457ca82574f86911022ecc15ce4569efb0b0 CRO0.218531213416 4,907.946220551
0xc6947f5f565ca646973aed7340798f0118d7f9c3c626bae429b1c8749c73a6a4Remove Address F...49014762022-10-02 9:58:063 days 18 hrs ago0x76e883d43c63718d40052a3749a43ae9002b35f0 IN  0x4b546457ca82574f86911022ecc15ce4569efb0b0 CRO0.137285813225 4,907.446406636
0x834a2ad58886ff596d16ac66a77feae2b243f651227fa5475864ebc53fab941bMint49014722022-10-02 9:57:433 days 18 hrs ago0x76e883d43c63718d40052a3749a43ae9002b35f0 IN  0x4b546457ca82574f86911022ecc15ce4569efb0b0 CRO0.374138820886 4,907.446594088
0xc93c44ad1e52fbbea7007f3f9da5b75a36d3eb62f3b86ba05cb3757b662db65aAdd Address To W...49014672022-10-02 9:57:153 days 18 hrs ago0x76e883d43c63718d40052a3749a43ae9002b35f0 IN  0x4b546457ca82574f86911022ecc15ce4569efb0b0 CRO0.245416508438 4,907.446828347
0xd7093674ed7437271f16cbf7914b732bbca938502e3cb5d42df005322c8263a0Add Address To W...47498112022-09-22 10:28:0713 days 17 hrs ago0x76e883d43c63718d40052a3749a43ae9002b35f0 IN  0x4b546457ca82574f86911022ecc15ce4569efb0b0 CRO0.245896831535 4,915.871964475
0x709c24a78992a405f6099ad68d8ed15e9fdd97eb74b4ac097fcf32b03e404d350x6080604047493082022-09-22 9:40:3713 days 18 hrs ago0x76e883d43c63718d40052a3749a43ae9002b35f0 IN  Create: YieldToken0 CRO16.043889631363 4,915.895337455
[ Download CSV Export 
Parent Txn Hash Block From To Value
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-22
*/

// 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");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
        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 decimals() external view returns (uint8);
    function symbol() external view returns (string memory);
    function name() external view returns (string memory);

    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 ITokensRecoverable {
    function recoverTokens(IERC20 token) external;
}

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

    function _msgData() internal pure virtual returns (bytes calldata) {
        return msg.data;
    }
}

contract Ownable {
    address public owner;

    modifier onlyOwner() {
        require(msg.sender == owner);
        _;
    }

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

    constructor() public {
        owner = msg.sender;
    }

    function transferOwnership(address newOwner) public onlyOwner {
        require(newOwner != address(0));
        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;
    }
}

abstract contract Pausable is Context {

    event Paused(address account);
    event Unpaused(address account);

    bool private _paused;

    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    constructor () public {
        _paused = false;
    }

    function paused() public view virtual returns (bool) {
        return _paused;
    }

    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

abstract contract ReentrancyGuard {
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;
    uint256 private _status;

    constructor() public {
        _status = _NOT_ENTERED;
    }

    modifier nonReentrant() {
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
        _status = _ENTERED;
        _;
        _status = _NOT_ENTERED;
    }
}

abstract contract TokensRecoverable is Ownable, ITokensRecoverable {
    using SafeERC20 for IERC20;

    function recoverTokens(IERC20 token) public override onlyOwner {
        token.safeTransfer(msg.sender, token.balanceOf(address(this)));
    }
}

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 override view returns (string memory) {
        return _name;
    }

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

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

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

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

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

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

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

    function transferFrom (address sender, address recipient, uint256 amount) public 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 returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public 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 {
        require(sender != address(0), 'ERC20: transfer from the zero address');
        require(recipient != address(0), 'ERC20: transfer to the zero address');

        _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 {
        require(account != address(0), 'ERC20: mint to the zero address');

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

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

        _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 {
        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 _burnFrom(address account, uint256 amount) internal {
        _burn(account, amount);
        _approve(account, _msgSender(), _allowances[account][_msgSender()].sub(amount, 'ERC20: burn amount exceeds allowance'));
    }
}

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

    /// @notice A checkpoint for marking number of votes from a given block
    struct Checkpoint {
        uint32 fromBlock;
        uint256 votes;
    }

    /// @notice A record of votes checkpoints for each account, by index
    mapping (address => mapping (uint32 => Checkpoint)) public checkpoints;
    mapping (address => address) internal _delegates;
    mapping (address => uint32) public numCheckpoints;
    mapping (address => uint) public nonces;

    /// @notice The EIP-712 typehash for the contract's domain
    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);

    ////////////////////////////
    // PUBLIC 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), "GOV::delegateBySig: invalid signature");
        require(nonce == nonces[signatory]++, "GOV::delegateBySig: invalid nonce");
        require(now <= expiry, "GOV::delegateBySig: signature expired");

        return _delegate(signatory, delegatee);
    }

    ///////////////////////////
    // PUBLIC VIEW FUNCTIONS //
    ///////////////////////////

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

    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, "GOV::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;
    }

    //////////////////////////
    // 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); // balance of underlying tokens (not scaled);
        _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, "GOV::_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);
    }
}

contract MasterChef is Whitelist, Pausable, ReentrancyGuard, TokensRecoverable {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;

    modifier nonDuplicated(IERC20 _lpToken) {
        require(poolExistence[_lpToken] == false, "nonDuplicated: duplicated");
        _;
    }

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

    // Info of each pool.
    struct PoolInfo {
        IERC20 lpToken;           // Address of LP token contract.
        uint256 allocPoint;       // How many allocation points assigned to this pool. Yield to distribute per block.
        uint256 lastRewardBlock;  // Last block number that yield distribution occurs.
        uint256 accYieldPerShare;   // Accumulated yield per share, times 1e12. See below.
        uint16 depositFeeBP;      // Deposit fee in basis points
    }

    YieldToken public yield; // Yield Token

    address public feeAddress; // Deposit Fee address

    uint256 public yieldPerBlock; // Yield tokens created per block.
    uint256 public totalAllocPoint = 0; // Total allocation points.
    uint256 public startBlock; // The block number when token mining starts.

    uint256 public constant BONUS_MULTIPLIER = 1; // Bonus muliplier for early yield makers.
    
    PoolInfo[] public poolInfo; // Info of each pool.

    // Info of each user that stakes LP tokens.
    mapping(uint256 => mapping(address => UserInfo)) public userInfo;
    mapping(IERC20 => bool) public poolExistence;

    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);
    event SetFeeAddress(address indexed user, address indexed newAddress);
    event UpdateEmissionRate(address indexed user, uint256 yieldPerBlock);

    constructor(YieldToken _yield, address _feeAddress, uint256 _yieldPerBlock, uint256 _startBlock) public {
        yield = _yield;
        feeAddress = _feeAddress;
        yieldPerBlock = _yieldPerBlock;
        startBlock = _startBlock;
    }

    ////////////////////////////
    // PUBLIC 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.allocPoint == 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(feeAddress, yieldReward.div(10));
        yield.mint(address(this), 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 nonReentrant {
        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);
            if (pool.depositFeeBP > 0) {
                uint256 depositFee = _amount.mul(pool.depositFeeBP).div(10000);
                pool.lpToken.safeTransfer(feeAddress, depositFee);
                user.amount = user.amount.add(_amount).sub(depositFee);
            } else {
                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 nonReentrant {
        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);
    }

    // Withdraw without caring about rewards. EMERGENCY ONLY.
    function emergencyWithdraw(uint256 _pid) public nonReentrant {
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][msg.sender];
        uint256 amount = user.amount;
        user.amount = 0;
        user.rewardDebt = 0;
        pool.lpToken.safeTransfer(address(msg.sender), amount);
        emit EmergencyWithdraw(msg.sender, _pid, amount);
    }

    ///////////////////////////
    // PUBLIC VIEW FUNCTIONS //
    ///////////////////////////

    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 pure 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);
    }

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

    function setFeeAddress(address _feeAddress) public onlyOwner {
        feeAddress = _feeAddress;
        emit SetFeeAddress(msg.sender, _feeAddress);
    }

    function updateEmissionRate(uint256 _yieldPerBlock) public onlyOwner {
        massUpdatePools();
        yieldPerBlock = _yieldPerBlock;
        emit UpdateEmissionRate(msg.sender, _yieldPerBlock);
    }

    // Add a new lp to the pool. Can only be called by the owner.
    function add(uint256 _allocPoint, IERC20 _lpToken, uint16 _depositFeeBP, bool _withUpdate) public onlyOwner nonDuplicated(_lpToken) {
        require(_depositFeeBP <= 10000, "add: invalid deposit fee basis points");
        if (_withUpdate) {
            massUpdatePools();
        }
        uint256 lastRewardBlock = block.number > startBlock ? block.number : startBlock;
        totalAllocPoint = totalAllocPoint.add(_allocPoint);
        poolExistence[_lpToken] = true;
        poolInfo.push(PoolInfo({
        lpToken : _lpToken,
        allocPoint : _allocPoint,
        lastRewardBlock : lastRewardBlock,
        accYieldPerShare : 0,
        depositFeeBP : _depositFeeBP
        }));
    }

    // Update the given pool's yield allocation point and deposit fee. Can only be called by the owner.
    function set(uint256 _pid, uint256 _allocPoint, uint16 _depositFeeBP, bool _withUpdate) public onlyOwner {
        require(_depositFeeBP <= 10000, "set: invalid deposit fee basis points");
        if (_withUpdate) {
            massUpdatePools();
        }
        totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add(_allocPoint);
        poolInfo[_pid].allocPoint = _allocPoint;
        poolInfo[_pid].depositFeeBP = _depositFeeBP;
    }

    ////////////////////////
    // INTERNAL 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 {
        uint256 yieldBal = yield.balanceOf(address(this));
        bool transferSuccess = false;
        if (_amount > yieldBal) {
            transferSuccess = yield.transfer(_to, yieldBal);
        } else {
            transferSuccess = yield.transfer(_to, _amount);
        }
        require(transferSuccess, "safeYieldTransfer: transfer failed");
    }
}

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":[],"name":"getChainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","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":"contract IERC20","name":"token","type":"address"}],"name":"recoverTokens","outputs":[],"stateMutability":"nonpayable","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":"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"}]

60806040523480156200001157600080fd5b506040518060400160405280601081526020017f5374726f6e6768616e6473204661726d000000000000000000000000000000008152506040518060400160405280600581526020017f534641524d00000000000000000000000000000000000000000000000000000081525081600390805190602001906200009692919062000115565b508060049080519060200190620000af92919062000115565b506012600560006101000a81548160ff021916908360ff160217905550505033600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620001bb565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200015857805160ff191683800117855562000189565b8280016001018555821562000189579182015b82811115620001885782518255916020019190600101906200016b565b5b5090506200019891906200019c565b5090565b5b80821115620001b75760008160009055506001016200019d565b5090565b6138cb80620001cb6000396000f3fe608060405234801561001057600080fd5b50600436106101e55760003560e01c806370a082311161010f578063a9059cbb116100a2578063e2ec6ec311610071578063e2ec6ec314610b8c578063e7a324dc14610c5a578063f1127ed814610c78578063f2fde38b14610ced576101e5565b8063a9059cbb146109df578063b4b5ea5714610a43578063c3cda52014610a9b578063dd62ed3e14610b14576101e5565b80638da5cb5b116100de5780638da5cb5b1461086a57806395d89b411461089e5780639b19251a14610921578063a457c2d71461097b576101e5565b806370a08231146106fe578063782d6fe1146107565780637b9417c8146107b85780637ecebe0014610812576101e5565b8063286dd3f51161018757806340c10f191161015657806340c10f19146105a0578063587cde1e146105ee5780635c19a95c1461065c5780636fcfff45146106a0576101e5565b8063286dd3f5146104a3578063313ce567146104fd5780633408e4701461051e578063395093511461053c576101e5565b806318160ddd116101c357806318160ddd1461031557806320606b701461033357806323b872dd1461035157806324953eaa146103d5576101e5565b806306fdde03146101ea578063095ea7b31461026d57806316114acd146102d1575b600080fd5b6101f2610d31565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610232578082015181840152602081019050610217565b50505050905090810190601f16801561025f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102b96004803603604081101561028357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610dd3565b60405180821515815260200191505060405180910390f35b610313600480360360208110156102e757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610df1565b005b61031d610f1a565b6040518082815260200191505060405180910390f35b61033b610f24565b6040518082815260200191505060405180910390f35b6103bd6004803603606081101561036757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610f48565b60405180821515815260200191505060405180910390f35b61048b600480360360208110156103eb57600080fd5b810190808035906020019064010000000081111561040857600080fd5b82018360208201111561041a57600080fd5b8035906020019184602083028401116401000000008311171561043c57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290505050611021565b60405180821515815260200191505060405180910390f35b6104e5600480360360208110156104b957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506110c2565b60405180821515815260200191505060405180910390f35b61050561121f565b604051808260ff16815260200191505060405180910390f35b610526611236565b6040518082815260200191505060405180910390f35b6105886004803603604081101561055257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611243565b60405180821515815260200191505060405180910390f35b6105ec600480360360408110156105b657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506112f6565b005b6106306004803603602081101561060457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061142e565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61069e6004803603602081101561067257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611497565b005b6106e2600480360360208110156106b657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506114a4565b604051808263ffffffff16815260200191505060405180910390f35b6107406004803603602081101561071457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506114c7565b6040518082815260200191505060405180910390f35b6107a26004803603604081101561076c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061150f565b6040518082815260200191505060405180910390f35b6107fa600480360360208110156107ce57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506118d0565b60405180821515815260200191505060405180910390f35b6108546004803603602081101561082857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611a2c565b6040518082815260200191505060405180910390f35b610872611a44565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6108a6611a6a565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156108e65780820151818401526020810190506108cb565b50505050905090810190601f1680156109135780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6109636004803603602081101561093757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b0c565b60405180821515815260200191505060405180910390f35b6109c76004803603604081101561099157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611b2c565b60405180821515815260200191505060405180910390f35b610a2b600480360360408110156109f557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611bf9565b60405180821515815260200191505060405180910390f35b610a8560048036036020811015610a5957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c17565b6040518082815260200191505060405180910390f35b610b12600480360360c0811015610ab157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190803560ff1690602001909291908035906020019092919080359060200190929190505050611ced565b005b610b7660048036036040811015610b2a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612051565b6040518082815260200191505060405180910390f35b610c4260048036036020811015610ba257600080fd5b8101908080359060200190640100000000811115610bbf57600080fd5b820183602082011115610bd157600080fd5b80359060200191846020830284011164010000000083111715610bf357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192905050506120d8565b60405180821515815260200191505060405180910390f35b610c62612179565b6040518082815260200191505060405180910390f35b610cca60048036036040811015610c8e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803563ffffffff16906020019092919050505061219d565b604051808363ffffffff1681526020018281526020019250505060405180910390f35b610d2f60048036036020811015610d0357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506121de565b005b606060038054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610dc95780601f10610d9e57610100808354040283529160200191610dc9565b820191906000526020600020905b815481529060010190602001808311610dac57829003601f168201915b5050505050905090565b6000610de7610de0612332565b848461233a565b6001905092915050565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e4b57600080fd5b610f17338273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610eb657600080fd5b505afa158015610eca573d6000803e3d6000fd5b505050506040513d6020811015610ee057600080fd5b81019080805190602001909291905050508373ffffffffffffffffffffffffffffffffffffffff166125319092919063ffffffff16565b50565b6000600254905090565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6000610f558484846125d3565b61101684610f61612332565b6110118560405180606001604052806028815260200161378260289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610fc7612332565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128899092919063ffffffff16565b61233a565b600190509392505050565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461107d57600080fd5b60005b82518110156110bc576110a583828151811061109857fe5b60200260200101516110c2565b156110af57600191505b8080600101915050611080565b50919050565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461111e57600080fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561121a576000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507ff1abf01a1043b7c244d128e8595cf0c1d10743b022b03a02dffd8ca3bf729f5a82604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1600190505b919050565b6000600560009054906101000a900460ff16905090565b6000804690508091505090565b60006112ec611250612332565b846112e78560016000611261612332565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461294390919063ffffffff16565b61233a565b6001905092915050565b600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166113b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f6e6f2077686974656c697374000000000000000000000000000000000000000081525060200191505060405180910390fd5b6113bf82826129cb565b61142a6000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683612b86565b5050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6114a13382612e23565b50565b60096020528060005260406000206000915054906101000a900463ffffffff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000438210611569576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806137376026913960400191505060405180910390fd5b6000600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff16905060008163ffffffff1614156115d65760009150506118ca565b82600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001840363ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff16116116c057600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001830363ffffffff1663ffffffff168152602001908152602001600020600101549150506118ca565b82600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008063ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff1611156117415760009150506118ca565b6000806001830390505b8163ffffffff168163ffffffff161115611864576000600283830363ffffffff168161177357fe5b0482039050611780613686565b600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008363ffffffff1663ffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff168152602001600182015481525050905086816000015163ffffffff16141561183c578060200151955050505050506118ca565b86816000015163ffffffff1610156118565781935061185d565b6001820392505b505061174b565b600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008363ffffffff1663ffffffff1681526020019081526020016000206001015493505050505b92915050565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461192c57600080fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611a27576001600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507fd1bba68c128cc3f427e5831b3c6f99f480b6efa6b9e80c757768f6124158cc3f82604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1600190505b919050565b600a6020528060005260406000206000915090505481565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611b025780601f10611ad757610100808354040283529160200191611b02565b820191906000526020600020905b815481529060010190602001808311611ae557829003601f168201915b5050505050905090565b60066020528060005260406000206000915054906101000a900460ff1681565b6000611bef611b39612332565b84611bea856040518060600160405280602581526020016138716025913960016000611b63612332565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128899092919063ffffffff16565b61233a565b6001905092915050565b6000611c0d611c06612332565b84846125d3565b6001905092915050565b600080600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff16905060008163ffffffff1611611c81576000611ce5565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001830363ffffffff1663ffffffff168152602001908152602001600020600101545b915050919050565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866611d18610d31565b80519060200120611d27611236565b30604051602001808581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200194505050505060405160208183030381529060405280519060200120905060007fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf888888604051602001808581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018281526020019450505050506040516020818303038152906040528051906020012090506000828260405160200180807f190100000000000000000000000000000000000000000000000000000000000081525060020183815260200182815260200192505050604051602081830303815290604052805190602001209050600060018288888860405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015611eab573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611f3d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602581526020018061375d6025913960400191505060405180910390fd5b600a60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600101919050558914611fe2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061381d6021913960400191505060405180910390fd5b8742111561203b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806136ca6025913960400191505060405180910390fd5b612045818b612e23565b50505050505050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461213457600080fd5b60005b82518110156121735761215c83828151811061214f57fe5b60200260200101516118d0565b1561216657600191505b8080600101915050612137565b50919050565b7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b6007602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900463ffffffff16908060010154905082565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461223857600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561227257600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156123c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806137cf6024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612446576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806136ef6022913960400191505060405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b6125ce8363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612f94565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612659576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806137aa6025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806136a76023913960400191505060405180910390fd5b61274a81604051806060016040528060268152602001613711602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128899092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506127dd816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461294390919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b6000838311158290612936576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156128fb5780820151818401526020810190506128e0565b50505050905090810190601f1680156129285780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5082840390509392505050565b6000808284019050838110156129c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a6e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b612a838160025461294390919063ffffffff16565b600281905550612ada816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461294390919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015612bc25750600081115b15612e1e57600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612cf2576000600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff1611612c65576000612cc9565b600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001840363ffffffff1663ffffffff168152602001908152602001600020600101545b90506000612ce0848361308390919063ffffffff16565b9050612cee86848484613106565b5050505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612e1d576000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff1611612d90576000612df4565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001840363ffffffff1663ffffffff168152602001908152602001600020600101545b90506000612e0b848361294390919063ffffffff16565b9050612e1985848484613106565b5050505b5b505050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000612e92846114c7565b905082600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a4612f8e828483612b86565b50505050565b6060612ff6826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661339a9092919063ffffffff16565b905060008151111561307e5780806020019051602081101561301757600080fd5b810190808051906020019092919050505061307d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806137f3602a913960400191505060405180910390fd5b5b505050565b6000828211156130fb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525060200191505060405180910390fd5b818303905092915050565b600061312a4360405180606001604052806033815260200161383e603391396133b2565b905060008463ffffffff161180156131bf57508063ffffffff16600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001870363ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff16145b156132305781600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001870363ffffffff1663ffffffff1681526020019081526020016000206001018190555061333d565b60405180604001604052808263ffffffff16815260200183815250600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008663ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff1602179055506020820151816001015590505060018401600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055505b8473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248484604051808381526020018281526020019250505060405180910390a25050505050565b60606133a9848460008561346d565b90509392505050565b600064010000000083108290613463576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561342857808201518184015260208101905061340d565b50505050905090810190601f1680156134555780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5082905092915050565b606061347885613673565b6134ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b6020831061353a5780518252602082019150602081019050602083039250613517565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461359c576040519150601f19603f3d011682016040523d82523d6000602084013e6135a1565b606091505b509150915081156135b657809250505061366b565b6000815111156135c95780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613630578082015181840152602081019050613615565b50505050905090810190601f16801561365d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b600080823b905060008111915050919050565b6040518060400160405280600063ffffffff16815260200160008152509056fe45524332303a207472616e7366657220746f20746865207a65726f2061646472657373474f563a3a64656c656761746542795369673a207369676e6174757265206578706972656445524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365474f563a3a6765745072696f72566f7465733a206e6f74207965742064657465726d696e6564474f563a3a64656c656761746542795369673a20696e76616c6964207369676e617475726545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573735361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564474f563a3a64656c656761746542795369673a20696e76616c6964206e6f6e6365474f563a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d6265722065786365656473203332206269747345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220d7e634ef6ebb1afbfaf431026019a9df316cd0f3e010af6857dd0710c258355c64736f6c634300060c0033

Deployed ByteCode Sourcemap

15397:6541:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11766:92;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12631:161;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;11134:144;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;12070:100;;;:::i;:::-;;;;;;;;;;;;;;;;;;;16030:122;;;:::i;:::-;;;;;;;;;;;;;;;;;;;12800:364;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;9525:304;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;9234:283;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;11970:92;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;17623:151;;;:::i;:::-;;;;;;;;;;;;;;;;;;;13172:210;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;19464:168;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;17782:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;16606:104;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;15862:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;12178:119;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;18138:1220;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;8673:251;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;15918:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;7896:20;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;11866:96;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8407:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;13390:261;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;12305:167;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;17907:223;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;16718:796;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;12480:143;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;8932:294;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;16159:117;;;:::i;:::-;;;;;;;;;;;;;;;;;;;15730:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;8171:192;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;11766:92;11812:13;11845:5;11838:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11766:92;:::o;12631:161::-;12706:4;12723:39;12732:12;:10;:12::i;:::-;12746:7;12755:6;12723:8;:39::i;:::-;12780:4;12773:11;;12631:161;;;;:::o;11134:144::-;7979:5;;;;;;;;;;;7965:19;;:10;:19;;;7957:28;;;;;;11208:62:::1;11227:10;11239:5;:15;;;11263:4;11239:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;11208:5;:18;;;;:62;;;;;:::i;:::-;11134:144:::0;:::o;12070:100::-;12123:7;12150:12;;12143:19;;12070:100;:::o;16030:122::-;16072:80;16030:122;:::o;12800:364::-;12899:4;12916:36;12926:6;12934:9;12945:6;12916:9;:36::i;:::-;12963:171;12986:6;13007:12;:10;:12::i;:::-;13034:89;13072:6;13034:89;;;;;;;;;;;;;;;;;:11;:19;13046:6;13034:19;;;;;;;;;;;;;;;:33;13054:12;:10;:12::i;:::-;13034:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;12963:8;:171::i;:::-;13152:4;13145:11;;12800:364;;;;;:::o;9525:304::-;9612:12;7979:5;;;;;;;;;;;7965:19;;:10;:19;;;7957:28;;;;;;9642:9:::1;9637:160;9661:5;:12;9657:1;:16;9637:160;;;9699:36;9726:5;9732:1;9726:8;;;;;;;;;;;;;;9699:26;:36::i;:::-;9695:91;;;9766:4;9756:14;;9695:91;9675:3;;;;;;;9637:160;;;;9525:304:::0;;;:::o;9234:283::-;9309:12;7979:5;;;;;;;;;;;7965:19;;:10;:19;;;7957:28;;;;;;9338:9:::1;:15;9348:4;9338:15;;;;;;;;;;;;;;;;;;;;;;;;;9334:151;;;9388:5;9370:9;:15;9380:4;9370:15;;;;;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;9413:31;9439:4;9413:31;;;;;;;;;;;;;;;;;;;;9469:4;9459:14;;9334:151;9234:283:::0;;;:::o;11970:92::-;12020:5;12045:9;;;;;;;;;;;12038:16;;11970:92;:::o;17623:151::-;17666:4;17683:15;17731:9;17720:20;;17759:7;17752:14;;;17623:151;:::o;13172:210::-;13252:4;13269:83;13278:12;:10;:12::i;:::-;13292:7;13301:50;13340:10;13301:11;:25;13313:12;:10;:12::i;:::-;13301:25;;;;;;;;;;;;;;;:34;13327:7;13301:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;13269:8;:83::i;:::-;13370:4;13363:11;;13172:210;;;;:::o;19464:168::-;8607:9;:21;8617:10;8607:21;;;;;;;;;;;;;;;;;;;;;;;;;8599:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19542:19:::1;19548:3;19553:7;19542:5;:19::i;:::-;19572:52;19595:1;19599:10;:15;19610:3;19599:15;;;;;;;;;;;;;;;;;;;;;;;;;19616:7;19572:14;:52::i;:::-;19464:168:::0;;:::o;17782:117::-;17843:7;17870:10;:21;17881:9;17870:21;;;;;;;;;;;;;;;;;;;;;;;;;17863:28;;17782:117;;;:::o;16606:104::-;16670:32;16680:10;16692:9;16670;:32::i;:::-;16606:104;:::o;15862:49::-;;;;;;;;;;;;;;;;;;;;;;:::o;12178:119::-;12244:7;12271:9;:18;12281:7;12271:18;;;;;;;;;;;;;;;;12264:25;;12178:119;;;:::o;18138:1220::-;18219:7;18261:12;18247:11;:26;18239:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18329:19;18351:14;:23;18366:7;18351:23;;;;;;;;;;;;;;;;;;;;;;;;;18329:45;;18405:1;18389:12;:17;;;18385:58;;;18430:1;18423:8;;;;;18385:58;18555:11;18503;:20;18515:7;18503:20;;;;;;;;;;;;;;;:38;18539:1;18524:12;:16;18503:38;;;;;;;;;;;;;;;:48;;;;;;;;;;;;:63;;;18499:147;;18590:11;:20;18602:7;18590:20;;;;;;;;;;;;;;;:38;18626:1;18611:12;:16;18590:38;;;;;;;;;;;;;;;:44;;;18583:51;;;;;18499:147;18743:11;18707;:20;18719:7;18707:20;;;;;;;;;;;;;;;:23;18728:1;18707:23;;;;;;;;;;;;;:33;;;;;;;;;;;;:47;;;18703:88;;;18778:1;18771:8;;;;;18703:88;18803:12;18830;18860:1;18845:12;:16;18830:31;;18872:428;18887:5;18879:13;;:5;:13;;;18872:428;;;18909:13;18951:1;18942:5;18934;:13;18933:19;;;;;;;;18925:5;:27;18909:43;;18994:20;;:::i;:::-;19017:11;:20;19029:7;19017:20;;;;;;;;;;;;;;;:28;19038:6;19017:28;;;;;;;;;;;;;;;18994:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19080:11;19064:2;:12;;;:27;;;19060:229;;;19119:2;:8;;;19112:15;;;;;;;;;19060:229;19168:11;19153:2;:12;;;:26;;;19149:140;;;19208:6;19200:14;;19149:140;;;19272:1;19263:6;:10;19255:18;;19149:140;18872:428;;;;;19317:11;:20;19329:7;19317:20;;;;;;;;;;;;;;;:27;19338:5;19317:27;;;;;;;;;;;;;;;:33;;;19310:40;;;;;18138:1220;;;;;:::o;8673:251::-;8743:12;7979:5;;;;;;;;;;;7965:19;;:10;:19;;;7957:28;;;;;;8773:9:::1;:15;8783:4;8773:15;;;;;;;;;;;;;;;;;;;;;;;;;8768:149;;8823:4;8805:9;:15;8815:4;8805:15;;;;;;;;;;;;;;;;:22;;;;;;;;;;;;;;;;;;8847:29;8871:4;8847:29;;;;;;;;;;;;;;;;;;;;8901:4;8891:14;;8768:149;8673:251:::0;;;:::o;15918:39::-;;;;;;;;;;;;;;;;;:::o;7896:20::-;;;;;;;;;;;;;:::o;11866:96::-;11914:13;11947:7;11940:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11866:96;:::o;8407:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;13390:261::-;13475:4;13492:129;13501:12;:10;:12::i;:::-;13515:7;13524:96;13563:15;13524:96;;;;;;;;;;;;;;;;;:11;:25;13536:12;:10;:12::i;:::-;13524:25;;;;;;;;;;;;;;;:34;13550:7;13524:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;13492:8;:129::i;:::-;13639:4;13632:11;;13390:261;;;;:::o;12305:167::-;12383:4;12400:42;12410:12;:10;:12::i;:::-;12424:9;12435:6;12400:9;:42::i;:::-;12460:4;12453:11;;12305:167;;;;:::o;17907:223::-;17972:7;17992:19;18014:14;:23;18029:7;18014:23;;;;;;;;;;;;;;;;;;;;;;;;;17992:45;;18070:1;18055:12;:16;;;:67;;18121:1;18055:67;;;18074:11;:20;18086:7;18074:20;;;;;;;;;;;;;;;:38;18110:1;18095:12;:16;18074:38;;;;;;;;;;;;;;;:44;;;18055:67;18048:74;;;17907:223;;;:::o;16718:796::-;16836:23;16072:80;16916:6;:4;:6::i;:::-;16900:24;;;;;;16926:12;:10;:12::i;:::-;16948:4;16872:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16862:93;;;;;;16836:119;;16966:18;16205:71;17029:9;17040:5;17047:6;16997:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16987:68;;;;;;16966:89;;17066:14;17122:15;17139:10;17093:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17083:68;;;;;;17066:85;;17164:17;17184:26;17194:6;17202:1;17205;17208;17184:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17164:46;;17252:1;17231:23;;:9;:23;;;;17223:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17324:6;:17;17331:9;17324:17;;;;;;;;;;;;;;;;:19;;;;;;;;;;;;17315:5;:28;17307:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17407:6;17400:3;:13;;17392:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17475:31;17485:9;17496;17475;:31::i;:::-;17468:38;;;;16718:796;;;;;;:::o;12480:143::-;12561:7;12588:11;:18;12600:5;12588:18;;;;;;;;;;;;;;;:27;12607:7;12588:27;;;;;;;;;;;;;;;;12581:34;;12480:143;;;;:::o;8932:294::-;9014:12;7979:5;;;;;;;;;;;7965:19;;:10;:19;;;7957:28;;;;;;9044:9:::1;9039:155;9063:5;:12;9059:1;:16;9039:155;;;9101:31;9123:5;9129:1;9123:8;;;;;;;;;;;;;;9101:21;:31::i;:::-;9097:86;;;9163:4;9153:14;;9097:86;9077:3;;;;;;;9039:155;;;;8932:294:::0;;;:::o;16159:117::-;16205:71;16159:117;:::o;15730:70::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;8171:192::-;7979:5;;;;;;;;;;;7965:19;;:10;:19;;;7957:28;;;;;;8272:1:::1;8252:22;;:8;:22;;;;8244:31;;;::::0;::::1;;8319:8;8291:37;;8312:5;;;;;;;;;;;8291:37;;;;;;;;;;;;8347:8;8339:5;;:16;;;;;;;;;;;;;;;;;;8171:192:::0;:::o;7658:98::-;7711:7;7738:10;7731:17;;7658:98;:::o;14811:339::-;14923:1;14906:19;;:5;:19;;;;14898:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15004:1;14985:21;;:7;:21;;;;14977:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15088:6;15058:11;:18;15070:5;15058:18;;;;;;;;;;;;;;;:27;15077:7;15058:27;;;;;;;;;;;;;;;:36;;;;15126:7;15110:32;;15119:5;15110:32;;;15135:6;15110:32;;;;;;;;;;;;;;;;;;14811:339;;;:::o;4943:177::-;5026:86;5046:5;5076:23;;;5101:2;5105:5;5053:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5026:19;:86::i;:::-;4943:177;;;:::o;13659:472::-;13776:1;13758:20;;:6;:20;;;;13750:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13860:1;13839:23;;:9;:23;;;;13831:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13935;13957:6;13935:71;;;;;;;;;;;;;;;;;:9;:17;13945:6;13935:17;;;;;;;;;;;;;;;;:21;;:71;;;;;:::i;:::-;13915:9;:17;13925:6;13915:17;;;;;;;;;;;;;;;:91;;;;14040:32;14065:6;14040:9;:20;14050:9;14040:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;14017:9;:20;14027:9;14017:20;;;;;;;;;;;;;;;:55;;;;14105:9;14088:35;;14097:6;14088:35;;;14116:6;14088:35;;;;;;;;;;;;;;;;;;13659:472;;;:::o;4201:166::-;4287:7;4320:1;4315;:6;;4323:12;4307:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4358:1;4354;:5;4347:12;;4201:166;;;;;:::o;3300:179::-;3358:7;3378:9;3394:1;3390;:5;3378:17;;3419:1;3414;:6;;3406:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3470:1;3463:8;;;3300:179;;;;:::o;14139:308::-;14234:1;14215:21;;:7;:21;;;;14207:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14300:24;14317:6;14300:12;;:16;;:24;;;;:::i;:::-;14285:12;:39;;;;14356:30;14379:6;14356:9;:18;14366:7;14356:18;;;;;;;;;;;;;;;;:22;;:30;;;;:::i;:::-;14335:9;:18;14345:7;14335:18;;;;;;;;;;;;;;;:51;;;;14423:7;14402:37;;14419:1;14402:37;;;14432:6;14402:37;;;;;;;;;;;;;;;;;;14139:308;;:::o;20165:947::-;20271:6;20261:16;;:6;:16;;;;:30;;;;;20290:1;20281:6;:10;20261:30;20257:848;;;20330:1;20312:20;;:6;:20;;;20308:385;;20401:16;20420:14;:22;20435:6;20420:22;;;;;;;;;;;;;;;;;;;;;;;;;20401:41;;20461:17;20493:1;20481:9;:13;;;:60;;20540:1;20481:60;;;20497:11;:19;20509:6;20497:19;;;;;;;;;;;;;;;:34;20529:1;20517:9;:13;20497:34;;;;;;;;;;;;;;;:40;;;20481:60;20461:80;;20560:17;20580:21;20594:6;20580:9;:13;;:21;;;;:::i;:::-;20560:41;;20620:57;20637:6;20645:9;20656;20667;20620:16;:57::i;:::-;20308:385;;;;20731:1;20713:20;;:6;:20;;;20709:385;;20802:16;20821:14;:22;20836:6;20821:22;;;;;;;;;;;;;;;;;;;;;;;;;20802:41;;20862:17;20894:1;20882:9;:13;;;:60;;20941:1;20882:60;;;20898:11;:19;20910:6;20898:19;;;;;;;;;;;;;;;:34;20930:1;20918:9;:13;20898:34;;;;;;;;;;;;;;;:40;;;20882:60;20862:80;;20961:17;20981:21;20995:6;20981:9;:13;;:21;;;;:::i;:::-;20961:41;;21021:57;21038:6;21046:9;21057;21068;21021:16;:57::i;:::-;20709:385;;;;20257:848;20165:947;;;:::o;19732:425::-;19809:23;19835:10;:21;19846:9;19835:21;;;;;;;;;;;;;;;;;;;;;;;;;19809:47;;19867:24;19894:20;19904:9;19894;:20::i;:::-;19867:47;;19995:9;19971:10;:21;19982:9;19971:21;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;20066:9;20022:54;;20049:15;20022:54;;20038:9;20022:54;;;;;;;;;;;;20089:60;20104:15;20121:9;20132:16;20089:14;:60::i;:::-;19732:425;;;;:::o;6330:333::-;6411:23;6437:69;6465:4;6437:69;;;;;;;;;;;;;;;;;6445:5;6437:27;;;;:69;;;;;:::i;:::-;6411:95;;6541:1;6521:10;:17;:21;6517:139;;;6578:10;6567:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6559:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6517:139;6330:333;;;:::o;3487:158::-;3545:7;3578:1;3573;:6;;3565:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3636:1;3632;:5;3625:12;;3487:158;;;;:::o;21120:646::-;21242:18;21263:75;21270:12;21263:75;;;;;;;;;;;;;;;;;:6;:75::i;:::-;21242:96;;21370:1;21355:12;:16;;;:85;;;;;21429:11;21375:65;;:11;:22;21387:9;21375:22;;;;;;;;;;;;;;;:40;21413:1;21398:12;:16;21375:40;;;;;;;;;;;;;;;:50;;;;;;;;;;;;:65;;;21355:85;21351:339;;;21506:8;21457:11;:22;21469:9;21457:22;;;;;;;;;;;;;;;:40;21495:1;21480:12;:16;21457:40;;;;;;;;;;;;;;;:46;;:57;;;;21351:339;;;21586:33;;;;;;;;21597:11;21586:33;;;;;;21610:8;21586:33;;;21547:11;:22;21559:9;21547:22;;;;;;;;;;;;;;;:36;21570:12;21547:36;;;;;;;;;;;;;;;:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21677:1;21662:12;:16;21634:14;:25;21649:9;21634:25;;;;;;;;;;;;;;;;:44;;;;;;;;;;;;;;;;;;21351:339;21728:9;21707:51;;;21739:8;21749;21707:51;;;;;;;;;;;;;;;;;;;;;;;;21120:646;;;;;:::o;851:196::-;954:12;986:53;1009:6;1017:4;1023:1;1026:12;986:22;:53::i;:::-;979:60;;851:196;;;;;:::o;21774:161::-;21849:6;21880:5;21876:1;:9;21887:12;21868:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21925:1;21911:16;;21774:161;;;;:::o;1613:752::-;1743:12;1776:18;1787:6;1776:10;:18::i;:::-;1768:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1902:12;1916:23;1943:6;:11;;1963:8;1974:4;1943:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1901:78;;;;1994:7;1990:368;;;2025:10;2018:17;;;;;;1990:368;2092:1;2072:10;:17;:21;2068:279;;;2175:10;2169:17;2236:15;2223:10;2219:2;2215:19;2208:44;2123:148;2318:12;2311:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1613:752;;;;;;;:::o;83:174::-;143:4;160:12;214:7;202:20;194:28;;248:1;241:4;:8;234:15;;;83:174;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

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