ETH Price: $3,266.98 (+0.21%)
Gas: 2 Gwei

Contract

0x3CCb4668903688A9FE2A0157Fd78761b73B603eC
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
0x60806040148434002022-05-25 18:21:29794 days ago1653502889IN
 Create: SporeYield
0 ETH0.1716917379.89299946

Advanced mode:
Parent Transaction Hash Block From To
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SporeYield

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-05-25
*/

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

//////////////////////////////////////////////////
//      ____               __  ___     __   __  //
//     / __/__  ___  ______\ \/ (_)__ / /__/ /  //
//    _\ \/ _ \/ _ \/ __/ -_)  / / -_) / _  /   //
//   /___/ .__/\___/_/  \__//_/_/\__/_/\_,_/    //
//      /_/                                     //
//                        by 0xInuarashi.eth    //
//////////////////////////////////////////////////

// Open0x ECDSA 
library ECDSA {

    ///// Signer Address Recovery /////
    
    // In its pure form, address recovery requires the following parameters
    // params: hash, v, r ,s

    // First, we define some standard checks
    function checkValidityOf_s(bytes32 s) public pure returns (bool) {
        if (uint256(s) > 
            0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            revert("recoverAddressFrom_hash_v_r_s: Invalid s value");
        }
        return true;
    }
    function checkValidityOf_v(uint8 v) public pure returns (bool) {
        if (v != 27 && v != 28) {
            revert("recoverAddressFrom_hash_v_r_s: Invalid v value");
        }
        return true;
    }

    // Then, we first define the pure form of recovery.
    function recoverAddressFrom_hash_v_r_s(bytes32 hash, uint8 v, bytes32 r,
    bytes32 s) public pure returns (address) {
        // First, we need to make sure that s and v are in correct ranges
        require(checkValidityOf_s(s) && checkValidityOf_v(v));

        // call recovery using solidity's built-in ecrecover method
        address _signer = ecrecover(hash, v, r, s);
        
        require(_signer != address(0),
            "_signer == address(0)");

        return _signer;
    }

    // There are also other ways to receive input without v, r, s values which
    // you will need to parse the unsupported data to find v, r, s and then
    // use those to call ecrecover.

    // For these, there are 2 other methods:
    // 1. params: hash, r, vs
    // 2. params: hash, signature

    // These then return the v, r, s values required to use recoverAddressFrom_hash_v_r_s

    // So, we will parse the first method to get v, r, s
    function get_v_r_s_from_r_vs(bytes32 r, bytes32 vs) public pure 
    returns (uint8, bytes32, bytes32) {
        bytes32 s = vs & 
            bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        
        uint8 v = uint8((uint256(vs) >> 255) + 27);

        return (v, r, s);
    }

    function get_v_r_s_from_signature(bytes memory signature) public pure 
    returns (uint8, bytes32, bytes32) {
        // signature.length can be 64 and 65. this depends on the method
        // the standard is 65 bytes1, eip-2098 is 64 bytes1.
        // so, we need to account for these differences

        // in the case that it is a standard 65 bytes1 signature
        if (signature.length == 65) {
            uint8 v;
            bytes32 r;
            bytes32 s;

            // assembly magic
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }

            // return the v, r, s 
            return (v, r, s);
        }

        // in the case that it is eip-2098 64 bytes1 signature
        else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;

            // assembly magic 
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }

            return get_v_r_s_from_r_vs(r, vs);
        }

        else {
            revert("Invalid signature length");
        }
    }

    // ///// Embedded toString /////

    // // We need this in one of the methods of returning a signed message below.

    // function _toString(uint256 value_) internal pure returns (string memory) {
    //     if (value_ == 0) { return "0"; }
    //     uint256 _iterate = value_; uint256 _digits;
    //     while (_iterate != 0) { _digits++; _iterate /= 10; } // get digits in value_
    //     bytes memory _buffer = new bytes(_digits);
    //     while (value_ != 0) { _digits--; _buffer[_digits] = bytes1(uint8(
    //         48 + uint256(value_ % 10 ))); value_ /= 10; } // create bytes of value_
    //     return string(_buffer); // return string converted bytes of value_
    // }

    // ///// Generation of Hashes /////
    
    // // We need these methods because these methods are used to compare
    // // hash generated off-chain to hash generated on-chain to cross-check the
    // // validity of the signatures

    // // 1. A bytes32 hash to generate a bytes32 hash embedded with prefix
    // // 2. A bytes memory s to generate a bytes32 hash embedded with prefix
    // // 3. A bytes32 domain seperator and bytes32 structhash to generate 
    // //      a bytes32 hash embedded with prefix

    // // See: EIP-191
    // function toEthSignedMessageHashBytes32(bytes32 hash) public pure 
    // returns (bytes32) {
    //     return keccak256(abi.encodePacked(
    //         // Magic prefix determined by the devs
    //         "\x19Ethereum Signed Message:\n32",
    //         hash
    //     ));
    // }

    // // See: EIP-191
    // function toEthSignedMessageHashBytes(bytes memory s) public pure
    // returns (bytes32) {
    //     return keccak256(abi.encodePacked(
    //         // Another magic prefix determined by the devs
    //         "\x19Ethereum Signed Message:\n", 
    //         // The bytes length of s
    //         _toString(s.length),
    //         // s itself
    //         s
    //     ));
    // }

    // // See: EIP-712
    // function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) public
    // pure returns (bytes32) {
    //     return keccak256(abi.encodePacked(
    //         // Yet another magic prefix determined by the devs
    //         "\x19\x01",
    //         // The domain seperator (EIP-712)
    //         domainSeparator,
    //         // struct hash
    //         structHash
    //     ));
    // }
}

abstract contract Ownable {
    address public owner; 
    constructor() { owner = msg.sender; }
    modifier onlyOwner { require(owner == msg.sender, "Not Owner!"); _; }
    function transferOwnership(address new_) external onlyOwner { owner = new_; }
}

interface iSpore {
    function transfer(address to_, uint256 amount_) external;
    function mintAsController(address to_, uint256 amount_) external;
}

interface iNFF {
    function totalSupply() external view returns (uint256);
    function balanceOf(address address_) external view returns (uint256);
    function ownerOf(uint256 tokenId_) external view returns (address);
    function walletOfOwner(address address_) external view returns (uint256[] memory);

    function transferFrom(address from_, address to_, uint256 tokenId_) external;
}

contract SporeYield is Ownable {

    // Interfaces
    iSpore public Spore = iSpore(0xC1CE4Af7009c0f0fFD5c10d13d1BD2a580ec4296); 
    function setSpore(address address_) external onlyOwner { 
        Spore = iSpore(address_); 
    }

    iNFF public NFFGenerative = iNFF(0x90ee3Cf59FcDe2FE11838b9075Ea4681462362F1);
    function setNFFGenerative(address address_) external onlyOwner {
        NFFGenerative = iNFF(address_);
    }

    iNFF public NFFGenesis = iNFF(0x5f47079D0E45d95f5d5167A480B695883C4E47D9);
    function setNFFGenesis(address address_) external onlyOwner {
        NFFGenesis = iNFF(address_);
    }

    // Times
    uint256 public yieldStartTime = 1653264000; // May 23 2022 14:00:00 GMT+0000
    uint256 public yieldEndTime = 1732060800; // November 20 2024 14:00:00 GMT+0000
    function setYieldEndTime(uint256 yieldEndTime_) external onlyOwner { 
        yieldEndTime = yieldEndTime_; }

    // Yield Info
    mapping(uint256 => uint256) public indexToYield;
    
    // @dev this is a function to override yield setting. use it with caution.
    function O_setIndexToYields(uint256[] calldata tokenIds_,
    uint256[] calldata yields_) external onlyOwner {
        require(tokenIds_.length == yields_.length,
            "Array lengths mismatch!");
        
        for (uint256 i = 0; i < tokenIds_.length; i++) {
            indexToYield[tokenIds_[i]] = yields_[i];
        }
    }

    // Yield Database
    mapping(uint256 => uint256) public indexToClaimedTimestamp;

    // Timestamp Controller
    mapping(address => bool) public addressToTimestampControllers;

    // Timestamp Controllers can be given externally to other addresses 
    // in order to modify the timestamp of mappings. 
    // Only use if you know what you are doing. 
    modifier onlyTimestampControllers {
        require(addressToTimestampControllers[msg.sender],
            "Invalid timestamp controller!");
        _;
    }

    function controllerSetClaimTimestamps(uint256[] memory indexes_, 
    uint256[] memory timestamps_) public onlyTimestampControllers {
        for (uint256 i = 0; i < indexes_.length; i++) {
            // The timestamp set must never be below the yieldStartTime
            require(yieldStartTime <= timestamps_[i],
                "Timestamp set below yieldStartTime!");

            indexToClaimedTimestamp[indexes_[i]] = timestamps_[i];
        }
    }
    ////

    // Events
    event Claim(address to_, uint256[] indexes_, uint256 totalClaimed);

    // Internal Calculators
    function _getCurrentTimeOrEnded() public view returns (uint256) {
        // Return block.timestamp if it's lower than yieldEndTime, otherwise
        // return yieldEndTime instead.
        return block.timestamp < yieldEndTime ?
            block.timestamp : yieldEndTime;
    }
    function _getTimestampOfToken(uint256 index_) public view returns (uint256) {
        return indexToClaimedTimestamp[index_] == 0 ?
            yieldStartTime : indexToClaimedTimestamp[index_];
    }

    // Yield Accountants
    function getPendingTokens(uint256 index_) public view returns (uint256) {

        // First, grab the timestamp of the token
        uint256 _lastClaimedTimestamp = _getTimestampOfToken(index_);

        // Then, we grab the current timestamp or ended
        uint256 _timeCurrentOrEnded = _getCurrentTimeOrEnded();

        // Lastly, we calculate the time-units in seconds of elapsed time
        uint256 _timeElapsed = _timeCurrentOrEnded - _lastClaimedTimestamp;

        // Now, return the calculation of yield
        require(indexToYield[index_] != 0,
            "Yield Lookup not Initialized!");
        
        return (_timeElapsed * indexToYield[index_]) / 1 days;
    }
    function getPendingTokensMany(uint256[] memory indexes_) public
    view returns (uint256) {
        // First, create an empty MSTORE to store the pending tokens tracker
        uint256 _pendingTokens;

        // Now, run a loop through the entire indexes array to add it
        for (uint256 i = 0; i < indexes_.length; i++) {
            _pendingTokens += getPendingTokens(indexes_[i]);
        }

        // Then, return the final value
        return _pendingTokens;
    }

    // Internal Timekeepers
    function _updateTimestampOfTokens(uint256[] memory indexes_) internal {
        // Get the timestamp using internal function
        uint256 _timeCurrentOrEnded = _getCurrentTimeOrEnded();
        
        // Loop through the entire indexes_ array and set the timestamps
        for (uint256 i = 0; i < indexes_.length; i++) {
            // Prevents duplicate setting of same token in the same block
            require(indexToClaimedTimestamp[indexes_[i]] != _timeCurrentOrEnded,
                "Unable to set timestamp duplication in the same block!");

            indexToClaimedTimestamp[indexes_[i]] = _timeCurrentOrEnded;
        }
    }

    // Public Claim (here we go!)
    function getIndexOfTokens(address[] memory contracts_,
    uint256[] memory tokenIds_) public view returns (uint256[] memory) {

        // Make sure the array lengths are equal
        require(contracts_.length == tokenIds_.length,
            "getIndexOfTokens(): Array lengths mismatch!");
        
        // MSTORE to save GAS
        uint256 _items = tokenIds_.length;
        address _NFFGenerativeAddress = address(NFFGenerative);
        address _NFFGenesisAddress = address(NFFGenesis);

        // Make sure all items are of supported contracts
        for (uint256 i = 0; i < _items; i++) {
            require(contracts_[i] == _NFFGenerativeAddress ||
                contracts_[i] == _NFFGenesisAddress,
                "getIndexOfTokens(): Unsupported Contract!");
        }
        
        // MSTORE _indexes to return
        uint256[] memory _indexes = new uint256[](_items);

        // Generate the index array
        for (uint256 i = 0; i < _items; i++) {
            // Generate the offset. If generative, offeset is 10000, else, it's 0.
            uint256 _offset = contracts_[i] == _NFFGenerativeAddress ? 0 : 10000;
            _indexes[i] = tokenIds_[i] + _offset;
        }

        // Return the _indexes array
        return _indexes;
    }

    function claim(address[] calldata contracts_,  uint256[] calldata tokenIds_) 
    public returns (uint256) {
        // Make sure the array lengths are equal
        require(contracts_.length == tokenIds_.length,
            "Array Lengths Mismatch!");

        // Make sure the sender owns all the tokens
        for (uint256 i = 0; i < tokenIds_.length; i++) {
            require(msg.sender == iNFF(contracts_[i]).ownerOf(tokenIds_[i]),
                "You do not own this token!");
        }

        // Generate the index array
        uint256[] memory _claimIndexes = getIndexOfTokens(contracts_, tokenIds_);

        // Calculate the total pending tokens to be claimed from index array
        uint256 _pendingTokens = getPendingTokensMany(_claimIndexes);

        // Set the new timestamp of the tokens
        // @dev: this step will fail if duplicate tokenIds_ are passed in
        _updateTimestampOfTokens(_claimIndexes);

        // Mint the total tokens for the msg.sender
        Spore.mintAsController(msg.sender, _pendingTokens);

        // Emit claim of total tokens
        emit Claim(msg.sender, _claimIndexes, _pendingTokens);

        // Return the claim amount
        return _pendingTokens;
    }

    address public sporeDataSigner = 0xe4535f8EE9b374BBc2c5A57B35f09A89fe43a657; 

    function setSporeDataSigner(address address_) public onlyOwner {
        sporeDataSigner = address_;
    }

    // Data initializer controllers
    mapping(address => bool) public addressToYieldDataInitializers;

    function setYieldDataInitializers(address[] calldata initializers_,
    bool bool_) external onlyOwner {
        for (uint256 i = 0; i < initializers_.length; i++) {
            addressToYieldDataInitializers[initializers_[i]] = bool_;
        }
    }

    modifier onlyYieldDataInitializer {
        require(addressToYieldDataInitializers[msg.sender],
            "Invalid yield data initializer!");
        _;
    }

    function controllerInitializeYieldDatas(uint256[] memory indexes_, 
    uint256[] memory yieldDatas_, bytes[] memory signatures_) public 
    onlyYieldDataInitializer {
        _initializeYieldDatas(indexes_, yieldDatas_, signatures_);
    }

    // Core initialization logic
    function _initializeYieldDatas(uint256[] memory indexes_, 
    uint256[] memory yieldDatas_, bytes[] memory signatures_) internal {
        require(indexes_.length == yieldDatas_.length &&
            indexes_.length == signatures_.length,
            "Array lengths mismatch!");
        
        // Make sure all the indexes to yieldDatas is valid through ECDSA 
        for (uint256 i = 0; i < indexes_.length; i++) {
            // make sure the yieldDatas_[i] and signatures_[i] is correct
            // thus we need to use get_v_r_s_from_signature function before
            // address recovery
            (uint8 v, bytes32 r, bytes32 s) = 
                ECDSA.get_v_r_s_from_signature(signatures_[i]);

            // Create the token data hash to use with ecrecover
            bytes32 _tokenDataHash = keccak256(abi.encodePacked(
                indexes_[i],
                yieldDatas_[i]
            ));

            require(sporeDataSigner == 
                ECDSA.recoverAddressFrom_hash_v_r_s(_tokenDataHash, v, r, s),
                "Invalid signer");

            // Initialize them if empty
            if (indexToYield[indexes_[i]] == 0) { 
                // 10 Ether is the maximum per day as yield data is concerned.
                // We added leeway for 20 Ether in case any future changes.
                // We hardcoded this to save on gas.
                require(20 ether >= yieldDatas_[i],
                    "Yield value not intended!");
                
                indexToYield[indexes_[i]] = yieldDatas_[i];
            }
        }
    }

    function claimWithYieldData(address[] calldata contracts_,  
    uint256[] calldata tokenIds_, uint256[] calldata yieldDatas_,
    bytes[] calldata signatures_) public returns (uint256) {
        // Make sure the array lengths are equal
        require(contracts_.length == tokenIds_.length &&
            contracts_.length == yieldDatas_.length &&
            contracts_.length == signatures_.length,
            "Array Lengths Mismatch!");

        // Make sure the sender owns all the tokens
        for (uint256 i = 0; i < tokenIds_.length; i++) {
            require(msg.sender == iNFF(contracts_[i]).ownerOf(tokenIds_[i]),
                "You do not own this token!");
        }

        // Generate the index array
        uint256[] memory _claimIndexes = getIndexOfTokens(contracts_, tokenIds_);

        // Initialize the Yield Datas
        _initializeYieldDatas(_claimIndexes, yieldDatas_, signatures_);

        // Calculate the total pending tokens to be claimed from index array
        // Without _initializeYieldDatas, this function would revert.
        uint256 _pendingTokens = getPendingTokensMany(_claimIndexes);

        // Set the new timestamp of the tokens
        // If there are duplicate indexes in the array, this function will revert.
        _updateTimestampOfTokens(_claimIndexes);

        // Mint the total tokens for the msg.sender
        Spore.mintAsController(msg.sender, _pendingTokens);

        // Emit claim of total tokens
        emit Claim(msg.sender, _claimIndexes, _pendingTokens);

        // Return token amount
        return _pendingTokens;
    }

    // Public View Functions for Helpers
    function walletOfGenesis(address address_) public view 
    returns (uint256[] memory) {
        return NFFGenesis.walletOfOwner(address_);
    }
    function walletOfGenerative(address address_) public view 
    returns (uint256[] memory) {
        return NFFGenerative.walletOfOwner(address_);
    }

    function walletIndexOfOwner(address address_) public view 
    returns (uint256[] memory) {
        // For this function, we want to return a unified index 
        uint256 _genesisBalance = NFFGenesis.balanceOf(address_);
        uint256 _generativeBalance = NFFGenerative.balanceOf(address_);
        uint256 _totalBalance = _genesisBalance + _generativeBalance;
        
        // Create the indexes based on a combined balance to input datas
        uint256[] memory _indexes = new uint256[] (_totalBalance);

        // Call both wallet of owners
        uint256[] memory _walletOfGenesis = walletOfGenesis(address_);
        uint256[] memory _walletOfGenerative = walletOfGenerative(address_);

        // Now start inserting into the index with both wallets with offsets
        uint256 _currentIndex;
        for (uint256 i = 0; i < _walletOfGenerative.length; i++) {
            // Generative has an offset of 0
            _indexes[_currentIndex++] = _walletOfGenerative[i];
        }
        for (uint256 i = 0; i < _walletOfGenesis.length; i++) {
            // Genesis has an offset of 10000
            _indexes[_currentIndex++] = _walletOfGenesis[i] + 10000;
        }

        return _indexes;
    }
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to_","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"indexes_","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"totalClaimed","type":"uint256"}],"name":"Claim","type":"event"},{"inputs":[],"name":"NFFGenerative","outputs":[{"internalType":"contract iNFF","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NFFGenesis","outputs":[{"internalType":"contract iNFF","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds_","type":"uint256[]"},{"internalType":"uint256[]","name":"yields_","type":"uint256[]"}],"name":"O_setIndexToYields","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"Spore","outputs":[{"internalType":"contract iSpore","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_getCurrentTimeOrEnded","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index_","type":"uint256"}],"name":"_getTimestampOfToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressToTimestampControllers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressToYieldDataInitializers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"contracts_","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds_","type":"uint256[]"}],"name":"claim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"contracts_","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds_","type":"uint256[]"},{"internalType":"uint256[]","name":"yieldDatas_","type":"uint256[]"},{"internalType":"bytes[]","name":"signatures_","type":"bytes[]"}],"name":"claimWithYieldData","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"indexes_","type":"uint256[]"},{"internalType":"uint256[]","name":"yieldDatas_","type":"uint256[]"},{"internalType":"bytes[]","name":"signatures_","type":"bytes[]"}],"name":"controllerInitializeYieldDatas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"indexes_","type":"uint256[]"},{"internalType":"uint256[]","name":"timestamps_","type":"uint256[]"}],"name":"controllerSetClaimTimestamps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"contracts_","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds_","type":"uint256[]"}],"name":"getIndexOfTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index_","type":"uint256"}],"name":"getPendingTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"indexes_","type":"uint256[]"}],"name":"getPendingTokensMany","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"indexToClaimedTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"indexToYield","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"}],"name":"setNFFGenerative","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"}],"name":"setNFFGenesis","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"}],"name":"setSpore","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"}],"name":"setSporeDataSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"initializers_","type":"address[]"},{"internalType":"bool","name":"bool_","type":"bool"}],"name":"setYieldDataInitializers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"yieldEndTime_","type":"uint256"}],"name":"setYieldEndTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sporeDataSigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"new_","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"}],"name":"walletIndexOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"}],"name":"walletOfGenerative","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"}],"name":"walletOfGenesis","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"yieldEndTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"yieldStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

6080604052600180546001600160a01b031990811673c1ce4af7009c0f0ffd5c10d13d1bd2a580ec4296179091556002805482167390ee3cf59fcde2fe11838b9075ea4681462362f1179055600380548216735f47079d0e45d95f5d5167a480b695883c4e47d917905563628ace8060045563673d26806005556009805490911673e4535f8ee9b374bbc2c5a57b35f09a89fe43a6571790553480156100a457600080fd5b50600080546001600160a01b03191633179055612312806100c66000396000f3fe608060405234801561001057600080fd5b50600436106101e55760003560e01c80636e3463fe1161010f578063a8123dc8116100a2578063cf21823d11610071578063cf21823d14610450578063dae36bde14610463578063e771779414610476578063f2fde38b1461048957600080fd5b8063a8123dc814610404578063aefb2b5214610417578063c19355321461042a578063cb9eb93f1461043d57600080fd5b80638a4f3771116100de5780638a4f3771146103b85780638da5cb5b146103cb578063955f33ad146103de578063a0a6e32b146103f157600080fd5b80636e3463fe14610366578063747250011461038957806374f239f91461039c5780637c073ede146103af57600080fd5b8063314ca0391161018757806358d78c8c1161015657806358d78c8c1461030d5780635bd962001461032057806367c65041146103405780636cc532fa1461035357600080fd5b8063314ca0391461029e57806339a30fca146102a75780634d042fa8146102c75780635819a7a6146102fa57600080fd5b806315cbc3a2116101c357806315cbc3a21461022d5780631ffac581146102585780632b7c63701461026b5780632f72c8111461028b57600080fd5b806308cf8f06146101ea5780630d16beed146102105780631394818e14610218575b600080fd5b6101fd6101f836600461202d565b61049c565b6040519081526020015b60405180910390f35b6101fd610556565b61022b61022636600461202d565b61056d565b005b600954610240906001600160a01b031681565b6040516001600160a01b039091168152602001610207565b61022b610266366004611f46565b61059c565b61027e610279366004611be1565b6106e0565b604051610207919061210b565b6101fd610299366004611c8d565b610933565b6101fd60055481565b6101fd6102b536600461202d565b60066020526000908152604090205481565b6102ea6102d5366004611be1565b600a6020526000908152604090205460ff1681565b6040519015158152602001610207565b600254610240906001600160a01b031681565b6101fd61031b366004611e73565b610c4b565b6101fd61032e36600461202d565b60076020526000908152604090205481565b61022b61034e366004611d50565b610ca1565b61027e610361366004611be1565b610d42565b6102ea610374366004611be1565b60086020526000908152604090205460ff1681565b6101fd610397366004611c22565b610dca565b61022b6103aa366004611be1565b61107f565b6101fd60045481565b61027e6103c6366004611dab565b6110cb565b600054610240906001600160a01b031681565b61022b6103ec366004611f92565b61131c565b61022b6103ff366004611c22565b611386565b61022b610412366004611be1565b611466565b6101fd61042536600461202d565b6114b2565b61022b610438366004611be1565b6114e2565b600154610240906001600160a01b031681565b61027e61045e366004611be1565b61152e565b600354610240906001600160a01b031681565b61022b610484366004611be1565b611560565b61022b610497366004611be1565b6115ac565b6000806104a8836114b2565b905060006104b4610556565b905060006104c28383612243565b6000868152600660205260409020549091506105255760405162461bcd60e51b815260206004820152601d60248201527f5969656c64204c6f6f6b7570206e6f7420496e697469616c697a65642100000060448201526064015b60405180910390fd5b60008581526006602052604090205462015180906105439083612224565b61054d9190612202565b95945050505050565b60006005544210610568575060055490565b504290565b6000546001600160a01b031633146105975760405162461bcd60e51b815260040161051c90612173565b600555565b3360009081526008602052604090205460ff166105fb5760405162461bcd60e51b815260206004820152601d60248201527f496e76616c69642074696d657374616d7020636f6e74726f6c6c657221000000604482015260640161051c565b60005b82518110156106db5781818151811061061957610619612298565b6020026020010151600454111561067e5760405162461bcd60e51b815260206004820152602360248201527f54696d657374616d70207365742062656c6f77207969656c64537461727454696044820152626d652160e81b606482015260840161051c565b81818151811061069057610690612298565b6020026020010151600760008584815181106106ae576106ae612298565b602002602001015181526020019081526020016000208190555080806106d390612267565b9150506105fe565b505050565b6003546040516370a0823160e01b81526001600160a01b0383811660048301526060926000929116906370a082319060240160206040518083038186803b15801561072a57600080fd5b505afa15801561073e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107629190612046565b6002546040516370a0823160e01b81526001600160a01b038681166004830152929350600092909116906370a082319060240160206040518083038186803b1580156107ad57600080fd5b505afa1580156107c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e59190612046565b905060006107f382846121ea565b90506000816001600160401b0381111561080f5761080f6122ae565b604051908082528060200260200182016040528015610838578160200160208202803683370190505b509050600061084687610d42565b905060006108538861152e565b90506000805b82518110156108b75782818151811061087457610874612298565b602002602001015185838061088890612267565b94508151811061089a5761089a612298565b6020908102919091010152806108af81612267565b915050610859565b5060005b8351811015610925578381815181106108d6576108d6612298565b60200260200101516127106108eb91906121ea565b85836108f681612267565b94508151811061090857610908612298565b60209081029190910101528061091d81612267565b9150506108bb565b509298975050505050505050565b6000878614801561094357508784145b801561094e57508782145b6109945760405162461bcd60e51b81526020600482015260176024820152764172726179204c656e67746873204d69736d617463682160481b604482015260640161051c565b60005b86811015610acd578989828181106109b1576109b1612298565b90506020020160208101906109c69190611be1565b6001600160a01b0316636352211e8989848181106109e6576109e6612298565b905060200201356040518263ffffffff1660e01b8152600401610a0b91815260200190565b60206040518083038186803b158015610a2357600080fd5b505afa158015610a37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a5b9190611c05565b6001600160a01b0316336001600160a01b031614610abb5760405162461bcd60e51b815260206004820152601a60248201527f596f7520646f206e6f74206f776e207468697320746f6b656e21000000000000604482015260640161051c565b80610ac581612267565b915050610997565b506000610b3d8a8a8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808e0282810182019093528d82529093508d92508c9182918501908490808284376000920191909152506110cb92505050565b9050610b8881878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250610b83925088915089905061225a565b6115f8565b6000610b9382610c4b565b9050610b9e82611960565b600154604051630a9edcc560e11b8152336004820152602481018390526001600160a01b039091169063153db98a90604401600060405180830381600087803b158015610bea57600080fd5b505af1158015610bfe573d6000803e3d6000fd5b505050507fbb39cc58932f85e3e9d3d6b8b315e628b6ea052a07d36a8d550d9ff478cbf4df338383604051610c35939291906120d7565b60405180910390a19a9950505050505050505050565b60008060005b8351811015610c9a57610c7c848281518110610c6f57610c6f612298565b602002602001015161049c565b610c8690836121ea565b915080610c9281612267565b915050610c51565b5092915050565b6000546001600160a01b03163314610ccb5760405162461bcd60e51b815260040161051c90612173565b60005b82811015610d3c5781600a6000868685818110610ced57610ced612298565b9050602002016020810190610d029190611be1565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580610d3481612267565b915050610cce565b50505050565b60035460405162438b6360e81b81526001600160a01b038381166004830152606092169063438b6300906024015b60006040518083038186803b158015610d8857600080fd5b505afa158015610d9c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610dc49190810190611eaf565b92915050565b6000838214610e155760405162461bcd60e51b81526020600482015260176024820152764172726179204c656e67746873204d69736d617463682160481b604482015260640161051c565b60005b82811015610f4e57858582818110610e3257610e32612298565b9050602002016020810190610e479190611be1565b6001600160a01b0316636352211e858584818110610e6757610e67612298565b905060200201356040518263ffffffff1660e01b8152600401610e8c91815260200190565b60206040518083038186803b158015610ea457600080fd5b505afa158015610eb8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610edc9190611c05565b6001600160a01b0316336001600160a01b031614610f3c5760405162461bcd60e51b815260206004820152601a60248201527f596f7520646f206e6f74206f776e207468697320746f6b656e21000000000000604482015260640161051c565b80610f4681612267565b915050610e18565b506000610fbe86868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808a028281018201909352898252909350899250889182918501908490808284376000920191909152506110cb92505050565b90506000610fcb82610c4b565b9050610fd682611960565b600154604051630a9edcc560e11b8152336004820152602481018390526001600160a01b039091169063153db98a90604401600060405180830381600087803b15801561102257600080fd5b505af1158015611036573d6000803e3d6000fd5b505050507fbb39cc58932f85e3e9d3d6b8b315e628b6ea052a07d36a8d550d9ff478cbf4df33838360405161106d939291906120d7565b60405180910390a19695505050505050565b6000546001600160a01b031633146110a95760405162461bcd60e51b815260040161051c90612173565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b606081518351146111325760405162461bcd60e51b815260206004820152602b60248201527f676574496e6465784f66546f6b656e7328293a204172726179206c656e67746860448201526a73206d69736d617463682160a81b606482015260840161051c565b81516002546003546001600160a01b03918216911660005b8381101561122557826001600160a01b031687828151811061116e5761116e612298565b60200260200101516001600160a01b031614806111b55750816001600160a01b03168782815181106111a2576111a2612298565b60200260200101516001600160a01b0316145b6112135760405162461bcd60e51b815260206004820152602960248201527f676574496e6465784f66546f6b656e7328293a20556e737570706f7274656420604482015268436f6e74726163742160b81b606482015260840161051c565b8061121d81612267565b91505061114a565b506000836001600160401b03811115611240576112406122ae565b604051908082528060200260200182016040528015611269578160200160208202803683370190505b50905060005b84811015611311576000846001600160a01b031689838151811061129557611295612298565b60200260200101516001600160a01b0316146112b3576127106112b6565b60005b61ffff169050808883815181106112cf576112cf612298565b60200260200101516112e191906121ea565b8383815181106112f3576112f3612298565b6020908102919091010152508061130981612267565b91505061126f565b509695505050505050565b336000908152600a602052604090205460ff1661137b5760405162461bcd60e51b815260206004820152601f60248201527f496e76616c6964207969656c64206461746120696e697469616c697a65722100604482015260640161051c565b6106db8383836115f8565b6000546001600160a01b031633146113b05760405162461bcd60e51b815260040161051c90612173565b8281146113f95760405162461bcd60e51b81526020600482015260176024820152764172726179206c656e67746873206d69736d617463682160481b604482015260640161051c565b60005b8381101561145f5782828281811061141657611416612298565b905060200201356006600087878581811061143357611433612298565b90506020020135815260200190815260200160002081905550808061145790612267565b9150506113fc565b5050505050565b6000546001600160a01b031633146114905760405162461bcd60e51b815260040161051c90612173565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b600081815260076020526040812054156114da57600082815260076020526040902054610dc4565b505060045490565b6000546001600160a01b0316331461150c5760405162461bcd60e51b815260040161051c90612173565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b60025460405162438b6360e81b81526001600160a01b038381166004830152606092169063438b630090602401610d70565b6000546001600160a01b0316331461158a5760405162461bcd60e51b815260040161051c90612173565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146115d65760405162461bcd60e51b815260040161051c90612173565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b8151835114801561160a575080518351145b6116505760405162461bcd60e51b81526020600482015260176024820152764172726179206c656e67746873206d69736d617463682160481b604482015260640161051c565b60005b8351811015610d3c57600080600073efcfed8a9e2ffeeb605b96d7120b2cb6ab092097638ee0498c86868151811061168d5761168d612298565b60200260200101516040518263ffffffff1660e01b81526004016116b1919061211e565b60606040518083038186803b1580156116c957600080fd5b505af41580156116dd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611701919061205f565b925092509250600087858151811061171b5761171b612298565b602002602001015187868151811061173557611735612298565b6020026020010151604051602001611757929190918252602082015260400190565b60408051808303601f19018152908290528051602090910120635f72e03360e01b82526004820181905260ff861660248301526044820185905260648201849052915073efcfed8a9e2ffeeb605b96d7120b2cb6ab09209790635f72e0339060840160206040518083038186803b1580156117d157600080fd5b505af41580156117e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118099190611c05565b6009546001600160a01b039081169116146118575760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b21039b4b3b732b960911b604482015260640161051c565b6006600089878151811061186d5761186d612298565b6020026020010151815260200190815260200160002054600014156119495786858151811061189e5761189e612298565b60200260200101516801158e460913d0000010156118fe5760405162461bcd60e51b815260206004820152601960248201527f5969656c642076616c7565206e6f7420696e74656e6465642100000000000000604482015260640161051c565b86858151811061191057611910612298565b6020026020010151600660008a888151811061192e5761192e612298565b60200260200101518152602001908152602001600020819055505b50505050808061195890612267565b915050611653565b600061196a610556565b905060005b82518110156106db57816007600085848151811061198f5761198f612298565b60200260200101518152602001908152602001600020541415611a135760405162461bcd60e51b815260206004820152603660248201527f556e61626c6520746f207365742074696d657374616d70206475706c69636174604482015275696f6e20696e207468652073616d6520626c6f636b2160501b606482015260840161051c565b8160076000858481518110611a2a57611a2a612298565b60200260200101518152602001908152602001600020819055508080611a4f90612267565b91505061196f565b6000611a6a611a65846121c7565b612197565b9050808382526020808301915083868660051b86011115611a8a57600080fd5b60005b86811015611b1e5781356001600160401b0380821115611aac57600080fd5b8188019150601f8a81840112611ac157600080fd5b823582811115611ad357611ad36122ae565b611ae4818301601f19168801612197565b92508083528b87828601011115611afa57600080fd5b80878501888501376000908301870152508552509282019290820190600101611a8d565b505050509392505050565b60008083601f840112611b3b57600080fd5b5081356001600160401b03811115611b5257600080fd5b6020830191508360208260051b8501011115611b6d57600080fd5b9250929050565b600082601f830112611b8557600080fd5b81356020611b95611a65836121c7565b80838252828201915082860187848660051b8901011115611bb557600080fd5b60005b85811015611bd457813584529284019290840190600101611bb8565b5090979650505050505050565b600060208284031215611bf357600080fd5b8135611bfe816122c4565b9392505050565b600060208284031215611c1757600080fd5b8151611bfe816122c4565b60008060008060408587031215611c3857600080fd5b84356001600160401b0380821115611c4f57600080fd5b611c5b88838901611b29565b90965094506020870135915080821115611c7457600080fd5b50611c8187828801611b29565b95989497509550505050565b6000806000806000806000806080898b031215611ca957600080fd5b88356001600160401b0380821115611cc057600080fd5b611ccc8c838d01611b29565b909a50985060208b0135915080821115611ce557600080fd5b611cf18c838d01611b29565b909850965060408b0135915080821115611d0a57600080fd5b611d168c838d01611b29565b909650945060608b0135915080821115611d2f57600080fd5b50611d3c8b828c01611b29565b999c989b5096995094979396929594505050565b600080600060408486031215611d6557600080fd5b83356001600160401b03811115611d7b57600080fd5b611d8786828701611b29565b90945092505060208401358015158114611da057600080fd5b809150509250925092565b60008060408385031215611dbe57600080fd5b82356001600160401b0380821115611dd557600080fd5b818501915085601f830112611de957600080fd5b81356020611df9611a65836121c7565b8083825282820191508286018a848660051b8901011115611e1957600080fd5b600096505b84871015611e45578035611e31816122c4565b835260019690960195918301918301611e1e565b5096505086013592505080821115611e5c57600080fd5b50611e6985828601611b74565b9150509250929050565b600060208284031215611e8557600080fd5b81356001600160401b03811115611e9b57600080fd5b611ea784828501611b74565b949350505050565b60006020808385031215611ec257600080fd5b82516001600160401b03811115611ed857600080fd5b8301601f81018513611ee957600080fd5b8051611ef7611a65826121c7565b80828252848201915084840188868560051b8701011115611f1757600080fd5b600094505b83851015611f3a578051835260019490940193918501918501611f1c565b50979650505050505050565b60008060408385031215611f5957600080fd5b82356001600160401b0380821115611f7057600080fd5b611f7c86838701611b74565b93506020850135915080821115611e5c57600080fd5b600080600060608486031215611fa757600080fd5b83356001600160401b0380821115611fbe57600080fd5b611fca87838801611b74565b94506020860135915080821115611fe057600080fd5b611fec87838801611b74565b9350604086013591508082111561200257600080fd5b508401601f8101861361201457600080fd5b61202386823560208401611a57565b9150509250925092565b60006020828403121561203f57600080fd5b5035919050565b60006020828403121561205857600080fd5b5051919050565b60008060006060848603121561207457600080fd5b835160ff8116811461208557600080fd5b602085015160409095015190969495509392505050565b600081518084526020808501945080840160005b838110156120cc578151875295820195908201906001016120b0565b509495945050505050565b6001600160a01b03841681526060602082018190526000906120fb9083018561209c565b9050826040830152949350505050565b602081526000611bfe602083018461209c565b600060208083528351808285015260005b8181101561214b5785810183015185820160400152820161212f565b8181111561215d576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252600a90820152694e6f74204f776e65722160b01b604082015260600190565b604051601f8201601f191681016001600160401b03811182821017156121bf576121bf6122ae565b604052919050565b60006001600160401b038211156121e0576121e06122ae565b5060051b60200190565b600082198211156121fd576121fd612282565b500190565b60008261221f57634e487b7160e01b600052601260045260246000fd5b500490565b600081600019048311821515161561223e5761223e612282565b500290565b60008282101561225557612255612282565b500390565b6000611bfe368484611a57565b600060001982141561227b5761227b612282565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146122d957600080fd5b5056fea26469706673582212201334124f03e476484269b54fae128aad5e80e4a10140710fcf5aa6f1e0442efc64736f6c63430008070033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101e55760003560e01c80636e3463fe1161010f578063a8123dc8116100a2578063cf21823d11610071578063cf21823d14610450578063dae36bde14610463578063e771779414610476578063f2fde38b1461048957600080fd5b8063a8123dc814610404578063aefb2b5214610417578063c19355321461042a578063cb9eb93f1461043d57600080fd5b80638a4f3771116100de5780638a4f3771146103b85780638da5cb5b146103cb578063955f33ad146103de578063a0a6e32b146103f157600080fd5b80636e3463fe14610366578063747250011461038957806374f239f91461039c5780637c073ede146103af57600080fd5b8063314ca0391161018757806358d78c8c1161015657806358d78c8c1461030d5780635bd962001461032057806367c65041146103405780636cc532fa1461035357600080fd5b8063314ca0391461029e57806339a30fca146102a75780634d042fa8146102c75780635819a7a6146102fa57600080fd5b806315cbc3a2116101c357806315cbc3a21461022d5780631ffac581146102585780632b7c63701461026b5780632f72c8111461028b57600080fd5b806308cf8f06146101ea5780630d16beed146102105780631394818e14610218575b600080fd5b6101fd6101f836600461202d565b61049c565b6040519081526020015b60405180910390f35b6101fd610556565b61022b61022636600461202d565b61056d565b005b600954610240906001600160a01b031681565b6040516001600160a01b039091168152602001610207565b61022b610266366004611f46565b61059c565b61027e610279366004611be1565b6106e0565b604051610207919061210b565b6101fd610299366004611c8d565b610933565b6101fd60055481565b6101fd6102b536600461202d565b60066020526000908152604090205481565b6102ea6102d5366004611be1565b600a6020526000908152604090205460ff1681565b6040519015158152602001610207565b600254610240906001600160a01b031681565b6101fd61031b366004611e73565b610c4b565b6101fd61032e36600461202d565b60076020526000908152604090205481565b61022b61034e366004611d50565b610ca1565b61027e610361366004611be1565b610d42565b6102ea610374366004611be1565b60086020526000908152604090205460ff1681565b6101fd610397366004611c22565b610dca565b61022b6103aa366004611be1565b61107f565b6101fd60045481565b61027e6103c6366004611dab565b6110cb565b600054610240906001600160a01b031681565b61022b6103ec366004611f92565b61131c565b61022b6103ff366004611c22565b611386565b61022b610412366004611be1565b611466565b6101fd61042536600461202d565b6114b2565b61022b610438366004611be1565b6114e2565b600154610240906001600160a01b031681565b61027e61045e366004611be1565b61152e565b600354610240906001600160a01b031681565b61022b610484366004611be1565b611560565b61022b610497366004611be1565b6115ac565b6000806104a8836114b2565b905060006104b4610556565b905060006104c28383612243565b6000868152600660205260409020549091506105255760405162461bcd60e51b815260206004820152601d60248201527f5969656c64204c6f6f6b7570206e6f7420496e697469616c697a65642100000060448201526064015b60405180910390fd5b60008581526006602052604090205462015180906105439083612224565b61054d9190612202565b95945050505050565b60006005544210610568575060055490565b504290565b6000546001600160a01b031633146105975760405162461bcd60e51b815260040161051c90612173565b600555565b3360009081526008602052604090205460ff166105fb5760405162461bcd60e51b815260206004820152601d60248201527f496e76616c69642074696d657374616d7020636f6e74726f6c6c657221000000604482015260640161051c565b60005b82518110156106db5781818151811061061957610619612298565b6020026020010151600454111561067e5760405162461bcd60e51b815260206004820152602360248201527f54696d657374616d70207365742062656c6f77207969656c64537461727454696044820152626d652160e81b606482015260840161051c565b81818151811061069057610690612298565b6020026020010151600760008584815181106106ae576106ae612298565b602002602001015181526020019081526020016000208190555080806106d390612267565b9150506105fe565b505050565b6003546040516370a0823160e01b81526001600160a01b0383811660048301526060926000929116906370a082319060240160206040518083038186803b15801561072a57600080fd5b505afa15801561073e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107629190612046565b6002546040516370a0823160e01b81526001600160a01b038681166004830152929350600092909116906370a082319060240160206040518083038186803b1580156107ad57600080fd5b505afa1580156107c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e59190612046565b905060006107f382846121ea565b90506000816001600160401b0381111561080f5761080f6122ae565b604051908082528060200260200182016040528015610838578160200160208202803683370190505b509050600061084687610d42565b905060006108538861152e565b90506000805b82518110156108b75782818151811061087457610874612298565b602002602001015185838061088890612267565b94508151811061089a5761089a612298565b6020908102919091010152806108af81612267565b915050610859565b5060005b8351811015610925578381815181106108d6576108d6612298565b60200260200101516127106108eb91906121ea565b85836108f681612267565b94508151811061090857610908612298565b60209081029190910101528061091d81612267565b9150506108bb565b509298975050505050505050565b6000878614801561094357508784145b801561094e57508782145b6109945760405162461bcd60e51b81526020600482015260176024820152764172726179204c656e67746873204d69736d617463682160481b604482015260640161051c565b60005b86811015610acd578989828181106109b1576109b1612298565b90506020020160208101906109c69190611be1565b6001600160a01b0316636352211e8989848181106109e6576109e6612298565b905060200201356040518263ffffffff1660e01b8152600401610a0b91815260200190565b60206040518083038186803b158015610a2357600080fd5b505afa158015610a37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a5b9190611c05565b6001600160a01b0316336001600160a01b031614610abb5760405162461bcd60e51b815260206004820152601a60248201527f596f7520646f206e6f74206f776e207468697320746f6b656e21000000000000604482015260640161051c565b80610ac581612267565b915050610997565b506000610b3d8a8a8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808e0282810182019093528d82529093508d92508c9182918501908490808284376000920191909152506110cb92505050565b9050610b8881878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250610b83925088915089905061225a565b6115f8565b6000610b9382610c4b565b9050610b9e82611960565b600154604051630a9edcc560e11b8152336004820152602481018390526001600160a01b039091169063153db98a90604401600060405180830381600087803b158015610bea57600080fd5b505af1158015610bfe573d6000803e3d6000fd5b505050507fbb39cc58932f85e3e9d3d6b8b315e628b6ea052a07d36a8d550d9ff478cbf4df338383604051610c35939291906120d7565b60405180910390a19a9950505050505050505050565b60008060005b8351811015610c9a57610c7c848281518110610c6f57610c6f612298565b602002602001015161049c565b610c8690836121ea565b915080610c9281612267565b915050610c51565b5092915050565b6000546001600160a01b03163314610ccb5760405162461bcd60e51b815260040161051c90612173565b60005b82811015610d3c5781600a6000868685818110610ced57610ced612298565b9050602002016020810190610d029190611be1565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580610d3481612267565b915050610cce565b50505050565b60035460405162438b6360e81b81526001600160a01b038381166004830152606092169063438b6300906024015b60006040518083038186803b158015610d8857600080fd5b505afa158015610d9c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610dc49190810190611eaf565b92915050565b6000838214610e155760405162461bcd60e51b81526020600482015260176024820152764172726179204c656e67746873204d69736d617463682160481b604482015260640161051c565b60005b82811015610f4e57858582818110610e3257610e32612298565b9050602002016020810190610e479190611be1565b6001600160a01b0316636352211e858584818110610e6757610e67612298565b905060200201356040518263ffffffff1660e01b8152600401610e8c91815260200190565b60206040518083038186803b158015610ea457600080fd5b505afa158015610eb8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610edc9190611c05565b6001600160a01b0316336001600160a01b031614610f3c5760405162461bcd60e51b815260206004820152601a60248201527f596f7520646f206e6f74206f776e207468697320746f6b656e21000000000000604482015260640161051c565b80610f4681612267565b915050610e18565b506000610fbe86868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808a028281018201909352898252909350899250889182918501908490808284376000920191909152506110cb92505050565b90506000610fcb82610c4b565b9050610fd682611960565b600154604051630a9edcc560e11b8152336004820152602481018390526001600160a01b039091169063153db98a90604401600060405180830381600087803b15801561102257600080fd5b505af1158015611036573d6000803e3d6000fd5b505050507fbb39cc58932f85e3e9d3d6b8b315e628b6ea052a07d36a8d550d9ff478cbf4df33838360405161106d939291906120d7565b60405180910390a19695505050505050565b6000546001600160a01b031633146110a95760405162461bcd60e51b815260040161051c90612173565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b606081518351146111325760405162461bcd60e51b815260206004820152602b60248201527f676574496e6465784f66546f6b656e7328293a204172726179206c656e67746860448201526a73206d69736d617463682160a81b606482015260840161051c565b81516002546003546001600160a01b03918216911660005b8381101561122557826001600160a01b031687828151811061116e5761116e612298565b60200260200101516001600160a01b031614806111b55750816001600160a01b03168782815181106111a2576111a2612298565b60200260200101516001600160a01b0316145b6112135760405162461bcd60e51b815260206004820152602960248201527f676574496e6465784f66546f6b656e7328293a20556e737570706f7274656420604482015268436f6e74726163742160b81b606482015260840161051c565b8061121d81612267565b91505061114a565b506000836001600160401b03811115611240576112406122ae565b604051908082528060200260200182016040528015611269578160200160208202803683370190505b50905060005b84811015611311576000846001600160a01b031689838151811061129557611295612298565b60200260200101516001600160a01b0316146112b3576127106112b6565b60005b61ffff169050808883815181106112cf576112cf612298565b60200260200101516112e191906121ea565b8383815181106112f3576112f3612298565b6020908102919091010152508061130981612267565b91505061126f565b509695505050505050565b336000908152600a602052604090205460ff1661137b5760405162461bcd60e51b815260206004820152601f60248201527f496e76616c6964207969656c64206461746120696e697469616c697a65722100604482015260640161051c565b6106db8383836115f8565b6000546001600160a01b031633146113b05760405162461bcd60e51b815260040161051c90612173565b8281146113f95760405162461bcd60e51b81526020600482015260176024820152764172726179206c656e67746873206d69736d617463682160481b604482015260640161051c565b60005b8381101561145f5782828281811061141657611416612298565b905060200201356006600087878581811061143357611433612298565b90506020020135815260200190815260200160002081905550808061145790612267565b9150506113fc565b5050505050565b6000546001600160a01b031633146114905760405162461bcd60e51b815260040161051c90612173565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b600081815260076020526040812054156114da57600082815260076020526040902054610dc4565b505060045490565b6000546001600160a01b0316331461150c5760405162461bcd60e51b815260040161051c90612173565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b60025460405162438b6360e81b81526001600160a01b038381166004830152606092169063438b630090602401610d70565b6000546001600160a01b0316331461158a5760405162461bcd60e51b815260040161051c90612173565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146115d65760405162461bcd60e51b815260040161051c90612173565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b8151835114801561160a575080518351145b6116505760405162461bcd60e51b81526020600482015260176024820152764172726179206c656e67746873206d69736d617463682160481b604482015260640161051c565b60005b8351811015610d3c57600080600073efcfed8a9e2ffeeb605b96d7120b2cb6ab092097638ee0498c86868151811061168d5761168d612298565b60200260200101516040518263ffffffff1660e01b81526004016116b1919061211e565b60606040518083038186803b1580156116c957600080fd5b505af41580156116dd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611701919061205f565b925092509250600087858151811061171b5761171b612298565b602002602001015187868151811061173557611735612298565b6020026020010151604051602001611757929190918252602082015260400190565b60408051808303601f19018152908290528051602090910120635f72e03360e01b82526004820181905260ff861660248301526044820185905260648201849052915073efcfed8a9e2ffeeb605b96d7120b2cb6ab09209790635f72e0339060840160206040518083038186803b1580156117d157600080fd5b505af41580156117e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118099190611c05565b6009546001600160a01b039081169116146118575760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b21039b4b3b732b960911b604482015260640161051c565b6006600089878151811061186d5761186d612298565b6020026020010151815260200190815260200160002054600014156119495786858151811061189e5761189e612298565b60200260200101516801158e460913d0000010156118fe5760405162461bcd60e51b815260206004820152601960248201527f5969656c642076616c7565206e6f7420696e74656e6465642100000000000000604482015260640161051c565b86858151811061191057611910612298565b6020026020010151600660008a888151811061192e5761192e612298565b60200260200101518152602001908152602001600020819055505b50505050808061195890612267565b915050611653565b600061196a610556565b905060005b82518110156106db57816007600085848151811061198f5761198f612298565b60200260200101518152602001908152602001600020541415611a135760405162461bcd60e51b815260206004820152603660248201527f556e61626c6520746f207365742074696d657374616d70206475706c69636174604482015275696f6e20696e207468652073616d6520626c6f636b2160501b606482015260840161051c565b8160076000858481518110611a2a57611a2a612298565b60200260200101518152602001908152602001600020819055508080611a4f90612267565b91505061196f565b6000611a6a611a65846121c7565b612197565b9050808382526020808301915083868660051b86011115611a8a57600080fd5b60005b86811015611b1e5781356001600160401b0380821115611aac57600080fd5b8188019150601f8a81840112611ac157600080fd5b823582811115611ad357611ad36122ae565b611ae4818301601f19168801612197565b92508083528b87828601011115611afa57600080fd5b80878501888501376000908301870152508552509282019290820190600101611a8d565b505050509392505050565b60008083601f840112611b3b57600080fd5b5081356001600160401b03811115611b5257600080fd5b6020830191508360208260051b8501011115611b6d57600080fd5b9250929050565b600082601f830112611b8557600080fd5b81356020611b95611a65836121c7565b80838252828201915082860187848660051b8901011115611bb557600080fd5b60005b85811015611bd457813584529284019290840190600101611bb8565b5090979650505050505050565b600060208284031215611bf357600080fd5b8135611bfe816122c4565b9392505050565b600060208284031215611c1757600080fd5b8151611bfe816122c4565b60008060008060408587031215611c3857600080fd5b84356001600160401b0380821115611c4f57600080fd5b611c5b88838901611b29565b90965094506020870135915080821115611c7457600080fd5b50611c8187828801611b29565b95989497509550505050565b6000806000806000806000806080898b031215611ca957600080fd5b88356001600160401b0380821115611cc057600080fd5b611ccc8c838d01611b29565b909a50985060208b0135915080821115611ce557600080fd5b611cf18c838d01611b29565b909850965060408b0135915080821115611d0a57600080fd5b611d168c838d01611b29565b909650945060608b0135915080821115611d2f57600080fd5b50611d3c8b828c01611b29565b999c989b5096995094979396929594505050565b600080600060408486031215611d6557600080fd5b83356001600160401b03811115611d7b57600080fd5b611d8786828701611b29565b90945092505060208401358015158114611da057600080fd5b809150509250925092565b60008060408385031215611dbe57600080fd5b82356001600160401b0380821115611dd557600080fd5b818501915085601f830112611de957600080fd5b81356020611df9611a65836121c7565b8083825282820191508286018a848660051b8901011115611e1957600080fd5b600096505b84871015611e45578035611e31816122c4565b835260019690960195918301918301611e1e565b5096505086013592505080821115611e5c57600080fd5b50611e6985828601611b74565b9150509250929050565b600060208284031215611e8557600080fd5b81356001600160401b03811115611e9b57600080fd5b611ea784828501611b74565b949350505050565b60006020808385031215611ec257600080fd5b82516001600160401b03811115611ed857600080fd5b8301601f81018513611ee957600080fd5b8051611ef7611a65826121c7565b80828252848201915084840188868560051b8701011115611f1757600080fd5b600094505b83851015611f3a578051835260019490940193918501918501611f1c565b50979650505050505050565b60008060408385031215611f5957600080fd5b82356001600160401b0380821115611f7057600080fd5b611f7c86838701611b74565b93506020850135915080821115611e5c57600080fd5b600080600060608486031215611fa757600080fd5b83356001600160401b0380821115611fbe57600080fd5b611fca87838801611b74565b94506020860135915080821115611fe057600080fd5b611fec87838801611b74565b9350604086013591508082111561200257600080fd5b508401601f8101861361201457600080fd5b61202386823560208401611a57565b9150509250925092565b60006020828403121561203f57600080fd5b5035919050565b60006020828403121561205857600080fd5b5051919050565b60008060006060848603121561207457600080fd5b835160ff8116811461208557600080fd5b602085015160409095015190969495509392505050565b600081518084526020808501945080840160005b838110156120cc578151875295820195908201906001016120b0565b509495945050505050565b6001600160a01b03841681526060602082018190526000906120fb9083018561209c565b9050826040830152949350505050565b602081526000611bfe602083018461209c565b600060208083528351808285015260005b8181101561214b5785810183015185820160400152820161212f565b8181111561215d576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252600a90820152694e6f74204f776e65722160b01b604082015260600190565b604051601f8201601f191681016001600160401b03811182821017156121bf576121bf6122ae565b604052919050565b60006001600160401b038211156121e0576121e06122ae565b5060051b60200190565b600082198211156121fd576121fd612282565b500190565b60008261221f57634e487b7160e01b600052601260045260246000fd5b500490565b600081600019048311821515161561223e5761223e612282565b500290565b60008282101561225557612255612282565b500390565b6000611bfe368484611a57565b600060001982141561227b5761227b612282565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146122d957600080fd5b5056fea26469706673582212201334124f03e476484269b54fae128aad5e80e4a10140710fcf5aa6f1e0442efc64736f6c63430008070033

Deployed Bytecode Sourcemap

7159:13522:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10279:698;;;;;;:::i;:::-;;:::i;:::-;;;19679:25:1;;;19667:2;19652:18;10279:698:0;;;;;;;;9752:285;;;:::i;7984:110::-;;;;;;:::i;:::-;;:::i;:::-;;14780:75;;;;;-1:-1:-1;;;;;14780:75:0;;;;;;-1:-1:-1;;;;;12037:32:1;;;12019:51;;12007:2;11992:18;14780:75:0;11873:203:1;9151:464:0;;;;;;:::i;:::-;;:::i;19436:1242::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;17436:1634::-;;;;;;:::i;:::-;;:::i;7899:40::-;;;;;;8121:47;;;;;;:::i;:::-;;;;;;;;;;;;;;15018:62;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;13225:14:1;;13218:22;13200:41;;13188:2;13173:18;15018:62:0;13060:187:1;7406:76:0;;;;;-1:-1:-1;;;;;7406:76:0;;;10983:489;;;;;;:::i;:::-;;:::i;8637:58::-;;;;;;:::i;:::-;;;;;;;;;;;;;;15089:256;;;;;;:::i;:::-;;:::i;19120:148::-;;;;;;:::i;:::-;;:::i;8733:61::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;13520:1252;;;;;;:::i;:::-;;:::i;14865:108::-;;;;;;:::i;:::-;;:::i;7817:42::-;;;;;;12209:1303;;;;;;:::i;:::-;;:::i;6365:20::-;;;;;-1:-1:-1;;;;;6365:20:0;;;15525:245;;;;;;:::i;:::-;;:::i;8261:345::-;;;;;;:::i;:::-;;:::i;7489:112::-;;;;;;:::i;:::-;;:::i;10043:202::-;;;;;;:::i;:::-;;:::i;7298:100::-;;;;;;:::i;:::-;;:::i;7218:72::-;;;;;-1:-1:-1;;;;;7218:72:0;;;19274:154;;;;;;:::i;:::-;;:::i;7609:73::-;;;;;-1:-1:-1;;;;;7609:73:0;;;7689:106;;;;;;:::i;:::-;;:::i;6511:77::-;;;;;;:::i;:::-;;:::i;10279:698::-;10342:7;10415:29;10447:28;10468:6;10447:20;:28::i;:::-;10415:60;;10545:27;10575:24;:22;:24::i;:::-;10545:54;-1:-1:-1;10687:20:0;10710:43;10732:21;10545:54;10710:43;:::i;:::-;10823:20;;;;:12;:20;;;;;;10687:66;;-1:-1:-1;10815:80:0;;;;-1:-1:-1;;;10815:80:0;;18668:2:1;10815:80:0;;;18650:21:1;18707:2;18687:18;;;18680:30;18746:31;18726:18;;;18719:59;18795:18;;10815:80:0;;;;;;;;;10939:20;;;;:12;:20;;;;;;10963:6;;10924:35;;:12;:35;:::i;:::-;10923:46;;;;:::i;:::-;10916:53;10279:698;-1:-1:-1;;;;;10279:698:0:o;9752:285::-;9807:7;9971:12;;9953:15;:30;:76;;-1:-1:-1;10017:12:0;;;9752:285::o;9953:76::-;-1:-1:-1;9999:15:0;;9752:285::o;7984:110::-;6465:5;;-1:-1:-1;;;;;6465:5:0;6474:10;6465:19;6457:42;;;;-1:-1:-1;;;6457:42:0;;;;;;;:::i;:::-;8063:12:::1;:28:::0;7984:110::o;9151:464::-;9065:10;9035:41;;;;:29;:41;;;;;;;;9027:96;;;;-1:-1:-1;;;9027:96:0;;17950:2:1;9027:96:0;;;17932:21:1;17989:2;17969:18;;;17962:30;18028:31;18008:18;;;18001:59;18077:18;;9027:96:0;17748:353:1;9027:96:0;9300:9:::1;9295:313;9319:8;:15;9315:1;:19;9295:313;;;9455:11;9467:1;9455:14;;;;;;;;:::i;:::-;;;;;;;9437;;:32;;9429:97;;;::::0;-1:-1:-1;;;9429:97:0;;16441:2:1;9429:97:0::1;::::0;::::1;16423:21:1::0;16480:2;16460:18;;;16453:30;16519:34;16499:18;;;16492:62;-1:-1:-1;;;16570:18:1;;;16563:33;16613:19;;9429:97:0::1;16239:399:1::0;9429:97:0::1;9582:11;9594:1;9582:14;;;;;;;;:::i;:::-;;;;;;;9543:23;:36;9567:8;9576:1;9567:11;;;;;;;;:::i;:::-;;;;;;;9543:36;;;;;;;;;;;:53;;;;9336:3;;;;;:::i;:::-;;;;9295:313;;;;9151:464:::0;;:::o;19436:1242::-;19630:10;;:30;;-1:-1:-1;;;19630:30:0;;-1:-1:-1;;;;;12037:32:1;;;19630:30:0;;;12019:51:1;19509:16:0;;19604:23;;19630:10;;;:20;;11992:18:1;;19630:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19700:13;;:33;;-1:-1:-1;;;19700:33:0;;-1:-1:-1;;;;;12037:32:1;;;19700:33:0;;;12019:51:1;19604:56:0;;-1:-1:-1;19671:26:0;;19700:13;;;;:23;;11992:18:1;;19700:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19671:62;-1:-1:-1;19744:21:0;19768:36;19671:62;19768:15;:36;:::i;:::-;19744:60;;19899:25;19942:13;-1:-1:-1;;;;;19927:29:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19927:29:0;;19899:57;;20008:33;20044:25;20060:8;20044:15;:25::i;:::-;20008:61;;20080:36;20119:28;20138:8;20119:18;:28::i;:::-;20080:67;-1:-1:-1;20238:21:0;;20270:180;20294:19;:26;20290:1;:30;20270:180;;;20416:19;20436:1;20416:22;;;;;;;;:::i;:::-;;;;;;;20388:8;20397:15;;;;;:::i;:::-;;;20388:25;;;;;;;;:::i;:::-;;;;;;;;;;:50;20322:3;;;;:::i;:::-;;;;20270:180;;;;20465:9;20460:183;20484:16;:23;20480:1;:27;20460:183;;;20604:16;20621:1;20604:19;;;;;;;;:::i;:::-;;;;;;;20626:5;20604:27;;;;:::i;:::-;20576:8;20585:15;;;;:::i;:::-;;;20576:25;;;;;;;;:::i;:::-;;;;;;;;;;:55;20509:3;;;;:::i;:::-;;;;20460:183;;;-1:-1:-1;20662:8:0;;19436:1242;-1:-1:-1;;;;;;;;19436:1242:0:o;17436:1634::-;17615:7;17693:37;;;:93;;;;-1:-1:-1;17747:39:0;;;17693:93;:149;;;;-1:-1:-1;17803:39:0;;;17693:149;17685:198;;;;-1:-1:-1;;;17685:198:0;;15338:2:1;17685:198:0;;;15320:21:1;15377:2;15357:18;;;15350:30;-1:-1:-1;;;15396:18:1;;;15389:53;15459:18;;17685:198:0;15136:347:1;17685:198:0;17954:9;17949:185;17969:20;;;17949:185;;;18038:10;;18049:1;18038:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;18033:27:0;;18061:9;;18071:1;18061:12;;;;;;;:::i;:::-;;;;;;;18033:41;;;;;;;;;;;;;19679:25:1;;19667:2;19652:18;;19533:177;18033:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;18019:55:0;:10;-1:-1:-1;;;;;18019:55:0;;18011:111;;;;-1:-1:-1;;;18011:111:0;;19380:2:1;18011:111:0;;;19362:21:1;19419:2;19399:18;;;19392:30;19458:28;19438:18;;;19431:56;19504:18;;18011:111:0;19178:350:1;18011:111:0;17991:3;;;;:::i;:::-;;;;17949:185;;;;18183:30;18216:39;18233:10;;18216:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;18216:39:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18245:9:0;;-1:-1:-1;18245:9:0;;;;18216:39;;;18245:9;;18216:39;18245:9;18216:39;;;;;;;;;-1:-1:-1;18216:16:0;;-1:-1:-1;;;18216:39:0:i;:::-;18183:72;;18307:62;18329:13;18344:11;;18307:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18307:62:0;;-1:-1:-1;18357:11:0;;-1:-1:-1;18357:11:0;;-1:-1:-1;18307:62:0;:::i;:::-;:21;:62::i;:::-;18531:22;18556:35;18577:13;18556:20;:35::i;:::-;18531:60;;18736:39;18761:13;18736:24;:39::i;:::-;18841:5;;:50;;-1:-1:-1;;;18841:50:0;;18864:10;18841:50;;;12689:51:1;12756:18;;;12749:34;;;-1:-1:-1;;;;;18841:5:0;;;;:22;;12662:18:1;;18841:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18948:48;18954:10;18966:13;18981:14;18948:48;;;;;;;;:::i;:::-;;;;;;;;19048:14;17436:1634;-1:-1:-1;;;;;;;;;;17436:1634:0:o;10983:489::-;11066:7;11164:22;11275:9;11270:120;11294:8;:15;11290:1;:19;11270:120;;;11349:29;11366:8;11375:1;11366:11;;;;;;;;:::i;:::-;;;;;;;11349:16;:29::i;:::-;11331:47;;;;:::i;:::-;;-1:-1:-1;11311:3:0;;;;:::i;:::-;;;;11270:120;;;-1:-1:-1;11450:14:0;10983:489;-1:-1:-1;;10983:489:0:o;15089:256::-;6465:5;;-1:-1:-1;;;;;6465:5:0;6474:10;6465:19;6457:42;;;;-1:-1:-1;;;6457:42:0;;;;;;;:::i;:::-;15209:9:::1;15204:134;15224:24:::0;;::::1;15204:134;;;15321:5;15270:30;:48;15301:13;;15315:1;15301:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;15270:48:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;15270:48:0;:56;;-1:-1:-1;;15270:56:0::1;::::0;::::1;;::::0;;;::::1;::::0;;15250:3;::::1;::::0;::::1;:::i;:::-;;;;15204:134;;;;15089:256:::0;;;:::o;19120:148::-;19226:10;;:34;;-1:-1:-1;;;19226:34:0;;-1:-1:-1;;;;;12037:32:1;;;19226:34:0;;;12019:51:1;19190:16:0;;19226:10;;:24;;11992:18:1;;19226:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;19226:34:0;;;;;;;;;;;;:::i;:::-;19219:41;19120:148;-1:-1:-1;;19120:148:0:o;13520:1252::-;13619:7;13697:37;;;13689:86;;;;-1:-1:-1;;;13689:86:0;;15338:2:1;13689:86:0;;;15320:21:1;15377:2;15357:18;;;15350:30;-1:-1:-1;;;15396:18:1;;;15389:53;15459:18;;13689:86:0;15136:347:1;13689:86:0;13846:9;13841:185;13861:20;;;13841:185;;;13930:10;;13941:1;13930:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;13925:27:0;;13953:9;;13963:1;13953:12;;;;;;;:::i;:::-;;;;;;;13925:41;;;;;;;;;;;;;19679:25:1;;19667:2;19652:18;;19533:177;13925:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;13911:55:0;:10;-1:-1:-1;;;;;13911:55:0;;13903:111;;;;-1:-1:-1;;;13903:111:0;;19380:2:1;13903:111:0;;;19362:21:1;19419:2;19399:18;;;19392:30;19458:28;19438:18;;;19431:56;19504:18;;13903:111:0;19178:350:1;13903:111:0;13883:3;;;;:::i;:::-;;;;13841:185;;;;14075:30;14108:39;14125:10;;14108:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;14108:39:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14137:9:0;;-1:-1:-1;14137:9:0;;;;14108:39;;;14137:9;;14108:39;14137:9;14108:39;;;;;;;;;-1:-1:-1;14108:16:0;;-1:-1:-1;;;14108:39:0:i;:::-;14075:72;;14238:22;14263:35;14284:13;14263:20;:35::i;:::-;14238:60;;14434:39;14459:13;14434:24;:39::i;:::-;14539:5;;:50;;-1:-1:-1;;;14539:50:0;;14562:10;14539:50;;;12689:51:1;12756:18;;;12749:34;;;-1:-1:-1;;;;;14539:5:0;;;;:22;;12662:18:1;;14539:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14646:48;14652:10;14664:13;14679:14;14646:48;;;;;;;;:::i;:::-;;;;;;;;14750:14;13520:1252;-1:-1:-1;;;;;;13520:1252:0:o;14865:108::-;6465:5;;-1:-1:-1;;;;;6465:5:0;6474:10;6465:19;6457:42;;;;-1:-1:-1;;;6457:42:0;;;;;;;:::i;:::-;14939:15:::1;:26:::0;;-1:-1:-1;;;;;;14939:26:0::1;-1:-1:-1::0;;;;;14939:26:0;;;::::1;::::0;;;::::1;::::0;;14865:108::o;12209:1303::-;12318:16;12428:9;:16;12407:10;:17;:37;12399:106;;;;-1:-1:-1;;;12399:106:0;;16029:2:1;12399:106:0;;;16011:21:1;16068:2;16048:18;;;16041:30;16107:34;16087:18;;;16080:62;-1:-1:-1;;;16158:18:1;;;16151:41;16209:19;;12399:106:0;15827:407:1;12399:106:0;12574:16;;12641:13;;12703:10;;-1:-1:-1;;;;;12641:13:0;;;;12703:10;12557:14;12786:229;12810:6;12806:1;:10;12786:229;;;12863:21;-1:-1:-1;;;;;12846:38:0;:10;12857:1;12846:13;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;12846:38:0;;:94;;;;12922:18;-1:-1:-1;;;;;12905:35:0;:10;12916:1;12905:13;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;12905:35:0;;12846:94;12838:165;;;;-1:-1:-1;;;12838:165:0;;16845:2:1;12838:165:0;;;16827:21:1;16884:2;16864:18;;;16857:30;16923:34;16903:18;;;16896:62;-1:-1:-1;;;16974:18:1;;;16967:39;17023:19;;12838:165:0;16643:405:1;12838:165:0;12818:3;;;;:::i;:::-;;;;12786:229;;;;13073:25;13115:6;-1:-1:-1;;;;;13101:21:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13101:21:0;;13073:49;;13177:9;13172:267;13196:6;13192:1;:10;13172:267;;;13308:15;13343:21;-1:-1:-1;;;;;13326:38:0;:10;13337:1;13326:13;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;13326:38:0;;:50;;13371:5;13326:50;;;13367:1;13326:50;13308:68;;;;13420:7;13405:9;13415:1;13405:12;;;;;;;;:::i;:::-;;;;;;;:22;;;;:::i;:::-;13391:8;13400:1;13391:11;;;;;;;;:::i;:::-;;;;;;;;;;:36;-1:-1:-1;13204:3:0;;;;:::i;:::-;;;;13172:267;;;-1:-1:-1;13496:8:0;12209:1303;-1:-1:-1;;;;;;12209:1303:0:o;15525:245::-;15437:10;15406:42;;;;:30;:42;;;;;;;;15398:99;;;;-1:-1:-1;;;15398:99:0;;18308:2:1;15398:99:0;;;18290:21:1;18347:2;18327:18;;;18320:30;18386:33;18366:18;;;18359:61;18437:18;;15398:99:0;18106:355:1;15398:99:0;15705:57:::1;15727:8;15737:11;15750;15705:21;:57::i;8261:345::-:0;6465:5;;-1:-1:-1;;;;;6465:5:0;6474:10;6465:19;6457:42;;;;-1:-1:-1;;;6457:42:0;;;;;;;:::i;:::-;8390:34;;::::1;8382:83;;;::::0;-1:-1:-1;;;8382:83:0;;17255:2:1;8382:83:0::1;::::0;::::1;17237:21:1::0;17294:2;17274:18;;;17267:30;-1:-1:-1;;;17313:18:1;;;17306:53;17376:18;;8382:83:0::1;17053:347:1::0;8382:83:0::1;8491:9;8486:113;8506:20:::0;;::::1;8486:113;;;8577:7;;8585:1;8577:10;;;;;;;:::i;:::-;;;;;;;8548:12;:26;8561:9;;8571:1;8561:12;;;;;;;:::i;:::-;;;;;;;8548:26;;;;;;;;;;;:39;;;;8528:3;;;;;:::i;:::-;;;;8486:113;;;;8261:345:::0;;;;:::o;7489:112::-;6465:5;;-1:-1:-1;;;;;6465:5:0;6474:10;6465:19;6457:42;;;;-1:-1:-1;;;6457:42:0;;;;;;;:::i;:::-;7563:13:::1;:30:::0;;-1:-1:-1;;;;;;7563:30:0::1;-1:-1:-1::0;;;;;7563:30:0;;;::::1;::::0;;;::::1;::::0;;7489:112::o;10043:202::-;10110:7;10137:31;;;:23;:31;;;;;;:36;:100;;10206:31;;;;:23;:31;;;;;;10137:100;;;-1:-1:-1;;10189:14:0;;;10043:202::o;7298:100::-;6465:5;;-1:-1:-1;;;;;6465:5:0;6474:10;6465:19;6457:42;;;;-1:-1:-1;;;6457:42:0;;;;;;;:::i;:::-;7365:5:::1;:24:::0;;-1:-1:-1;;;;;;7365:24:0::1;-1:-1:-1::0;;;;;7365:24:0;;;::::1;::::0;;;::::1;::::0;;7298:100::o;19274:154::-;19383:13;;:37;;-1:-1:-1;;;19383:37:0;;-1:-1:-1;;;;;12037:32:1;;;19383:37:0;;;12019:51:1;19347:16:0;;19383:13;;:27;;11992:18:1;;19383:37:0;11873:203:1;7689:106:0;6465:5;;-1:-1:-1;;;;;6465:5:0;6474:10;6465:19;6457:42;;;;-1:-1:-1;;;6457:42:0;;;;;;;:::i;:::-;7760:10:::1;:27:::0;;-1:-1:-1;;;;;;7760:27:0::1;-1:-1:-1::0;;;;;7760:27:0;;;::::1;::::0;;;::::1;::::0;;7689:106::o;6511:77::-;6465:5;;-1:-1:-1;;;;;6465:5:0;6474:10;6465:19;6457:42;;;;-1:-1:-1;;;6457:42:0;;;;;;;:::i;:::-;6573:5:::1;:12:::0;;-1:-1:-1;;;;;;6573:12:0::1;-1:-1:-1::0;;;;;6573:12:0;;;::::1;::::0;;;::::1;::::0;;6511:77::o;15812:1616::-;15981:11;:18;15962:8;:15;:37;:91;;;;;16035:11;:18;16016:8;:15;:37;15962:91;15954:140;;;;-1:-1:-1;;;15954:140:0;;17255:2:1;15954:140:0;;;17237:21:1;17294:2;17274:18;;;17267:30;-1:-1:-1;;;17313:18:1;;;17306:53;17376:18;;15954:140:0;17053:347:1;15954:140:0;16196:9;16191:1230;16215:8;:15;16211:1;:19;16191:1230;;;16438:7;16447:9;16458;16489:5;:30;16520:11;16532:1;16520:14;;;;;;;;:::i;:::-;;;;;;;16489:46;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16437:98;;;;;;16617:22;16687:8;16696:1;16687:11;;;;;;;;:::i;:::-;;;;;;;16717;16729:1;16717:14;;;;;;;;:::i;:::-;;;;;;;16652:94;;;;;;;;11778:19:1;;;11822:2;11813:12;;11806:28;11859:2;11850:12;;11621:247;16652:94:0;;;;;;;-1:-1:-1;;16652:94:0;;;;;;;16642:105;;16652:94;16642:105;;;;-1:-1:-1;;;16809:60:0;;;;;13487:25:1;;;13560:4;13548:17;;13528:18;;;13521:45;13582:18;;;13575:34;;;13625:18;;;13618:34;;;16642:105:0;-1:-1:-1;16809:5:0;;:35;;13459:19:1;;16809:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16772:15;;-1:-1:-1;;;;;16772:15:0;;;:97;;;16764:141;;;;-1:-1:-1;;;16764:141:0;;17607:2:1;16764:141:0;;;17589:21:1;17646:2;17626:18;;;17619:30;-1:-1:-1;;;17665:18:1;;;17658:44;17719:18;;16764:141:0;17405:338:1;16764:141:0;16967:12;:25;16980:8;16989:1;16980:11;;;;;;;;:::i;:::-;;;;;;;16967:25;;;;;;;;;;;;16996:1;16967:30;16963:447;;;17250:11;17262:1;17250:14;;;;;;;;:::i;:::-;;;;;;;17238:8;:26;;17230:85;;;;-1:-1:-1;;;17230:85:0;;19026:2:1;17230:85:0;;;19008:21:1;19065:2;19045:18;;;19038:30;19104:27;19084:18;;;19077:55;19149:18;;17230:85:0;18824:349:1;17230:85:0;17380:11;17392:1;17380:14;;;;;;;;:::i;:::-;;;;;;;17352:12;:25;17365:8;17374:1;17365:11;;;;;;;;:::i;:::-;;;;;;;17352:25;;;;;;;;;;;:42;;;;16963:447;16237:1184;;;;16232:3;;;;;:::i;:::-;;;;16191:1230;;11509:657;11644:27;11674:24;:22;:24::i;:::-;11644:54;;11798:9;11793:366;11817:8;:15;11813:1;:19;11793:366;;;11977:19;11937:23;:36;11961:8;11970:1;11961:11;;;;;;;;:::i;:::-;;;;;;;11937:36;;;;;;;;;;;;:59;;11929:143;;;;-1:-1:-1;;;11929:143:0;;14915:2:1;11929:143:0;;;14897:21:1;14954:2;14934:18;;;14927:30;14993:34;14973:18;;;14966:62;-1:-1:-1;;;15044:18:1;;;15037:52;15106:19;;11929:143:0;14713:418:1;11929:143:0;12128:19;12089:23;:36;12113:8;12122:1;12113:11;;;;;;;;:::i;:::-;;;;;;;12089:36;;;;;;;;;;;:58;;;;11834:3;;;;;:::i;:::-;;;;11793:366;;14:1208:1;91:5;120:64;136:47;176:6;136:47;:::i;:::-;120:64;:::i;:::-;111:73;;204:5;232:6;225:5;218:21;258:4;289:2;282:5;278:14;271:21;;312:6;362:3;352:6;349:1;345:14;337:6;333:27;330:36;327:56;;;379:1;376;369:12;327:56;401:1;411:805;425:6;422:1;419:13;411:805;;;506:3;493:17;-1:-1:-1;;;;;583:2:1;570:11;567:19;564:39;;;599:1;596;589:12;564:39;638:11;630:6;626:24;616:34;;673:4;717:3;712:2;708;704:11;700:21;690:49;;735:1;732;725:12;690:49;775:2;762:16;801:2;797;794:10;791:36;;;807:18;;:::i;:::-;855:51;879:11;;;-1:-1:-1;;875:25:1;871:34;;855:51;:::i;:::-;840:66;;935:2;926:7;919:19;979:3;974:2;969;965;961:11;957:20;954:29;951:49;;;996:1;993;986:12;951:49;1057:2;1052;1048;1044:11;1039:2;1030:7;1026:16;1013:47;1107:1;1084:16;;;1080:25;;1073:36;-1:-1:-1;1122:20:1;;-1:-1:-1;1162:12:1;;;;1194;;;;447:1;440:9;411:805;;;415:3;;;;14:1208;;;;;:::o;1227:367::-;1290:8;1300:6;1354:3;1347:4;1339:6;1335:17;1331:27;1321:55;;1372:1;1369;1362:12;1321:55;-1:-1:-1;1395:20:1;;-1:-1:-1;;;;;1427:30:1;;1424:50;;;1470:1;1467;1460:12;1424:50;1507:4;1499:6;1495:17;1483:29;;1567:3;1560:4;1550:6;1547:1;1543:14;1535:6;1531:27;1527:38;1524:47;1521:67;;;1584:1;1581;1574:12;1521:67;1227:367;;;;;:::o;1599:673::-;1653:5;1706:3;1699:4;1691:6;1687:17;1683:27;1673:55;;1724:1;1721;1714:12;1673:55;1760:6;1747:20;1786:4;1810:60;1826:43;1866:2;1826:43;:::i;1810:60::-;1892:3;1916:2;1911:3;1904:15;1944:2;1939:3;1935:12;1928:19;;1979:2;1971:6;1967:15;2031:3;2026:2;2020;2017:1;2013:10;2005:6;2001:23;1997:32;1994:41;1991:61;;;2048:1;2045;2038:12;1991:61;2070:1;2080:163;2094:2;2091:1;2088:9;2080:163;;;2151:17;;2139:30;;2189:12;;;;2221;;;;2112:1;2105:9;2080:163;;;-1:-1:-1;2261:5:1;;1599:673;-1:-1:-1;;;;;;;1599:673:1:o;2277:247::-;2336:6;2389:2;2377:9;2368:7;2364:23;2360:32;2357:52;;;2405:1;2402;2395:12;2357:52;2444:9;2431:23;2463:31;2488:5;2463:31;:::i;:::-;2513:5;2277:247;-1:-1:-1;;;2277:247:1:o;2529:251::-;2599:6;2652:2;2640:9;2631:7;2627:23;2623:32;2620:52;;;2668:1;2665;2658:12;2620:52;2700:9;2694:16;2719:31;2744:5;2719:31;:::i;2785:773::-;2907:6;2915;2923;2931;2984:2;2972:9;2963:7;2959:23;2955:32;2952:52;;;3000:1;2997;2990:12;2952:52;3040:9;3027:23;-1:-1:-1;;;;;3110:2:1;3102:6;3099:14;3096:34;;;3126:1;3123;3116:12;3096:34;3165:70;3227:7;3218:6;3207:9;3203:22;3165:70;:::i;:::-;3254:8;;-1:-1:-1;3139:96:1;-1:-1:-1;3342:2:1;3327:18;;3314:32;;-1:-1:-1;3358:16:1;;;3355:36;;;3387:1;3384;3377:12;3355:36;;3426:72;3490:7;3479:8;3468:9;3464:24;3426:72;:::i;:::-;2785:773;;;;-1:-1:-1;3517:8:1;-1:-1:-1;;;;2785:773:1:o;3563:1415::-;3768:6;3776;3784;3792;3800;3808;3816;3824;3877:3;3865:9;3856:7;3852:23;3848:33;3845:53;;;3894:1;3891;3884:12;3845:53;3934:9;3921:23;-1:-1:-1;;;;;4004:2:1;3996:6;3993:14;3990:34;;;4020:1;4017;4010:12;3990:34;4059:70;4121:7;4112:6;4101:9;4097:22;4059:70;:::i;:::-;4148:8;;-1:-1:-1;4033:96:1;-1:-1:-1;4236:2:1;4221:18;;4208:32;;-1:-1:-1;4252:16:1;;;4249:36;;;4281:1;4278;4271:12;4249:36;4320:72;4384:7;4373:8;4362:9;4358:24;4320:72;:::i;:::-;4411:8;;-1:-1:-1;4294:98:1;-1:-1:-1;4499:2:1;4484:18;;4471:32;;-1:-1:-1;4515:16:1;;;4512:36;;;4544:1;4541;4534:12;4512:36;4583:72;4647:7;4636:8;4625:9;4621:24;4583:72;:::i;:::-;4674:8;;-1:-1:-1;4557:98:1;-1:-1:-1;4762:2:1;4747:18;;4734:32;;-1:-1:-1;4778:16:1;;;4775:36;;;4807:1;4804;4797:12;4775:36;;4846:72;4910:7;4899:8;4888:9;4884:24;4846:72;:::i;:::-;3563:1415;;;;-1:-1:-1;3563:1415:1;;-1:-1:-1;3563:1415:1;;;;;;4937:8;-1:-1:-1;;;3563:1415:1:o;4983:598::-;5075:6;5083;5091;5144:2;5132:9;5123:7;5119:23;5115:32;5112:52;;;5160:1;5157;5150:12;5112:52;5200:9;5187:23;-1:-1:-1;;;;;5225:6:1;5222:30;5219:50;;;5265:1;5262;5255:12;5219:50;5304:70;5366:7;5357:6;5346:9;5342:22;5304:70;:::i;:::-;5393:8;;-1:-1:-1;5278:96:1;-1:-1:-1;;5478:2:1;5463:18;;5450:32;5518:13;;5511:21;5501:32;;5491:60;;5547:1;5544;5537:12;5491:60;5570:5;5560:15;;;4983:598;;;;;:::o;5586:1226::-;5704:6;5712;5765:2;5753:9;5744:7;5740:23;5736:32;5733:52;;;5781:1;5778;5771:12;5733:52;5821:9;5808:23;-1:-1:-1;;;;;5891:2:1;5883:6;5880:14;5877:34;;;5907:1;5904;5897:12;5877:34;5945:6;5934:9;5930:22;5920:32;;5990:7;5983:4;5979:2;5975:13;5971:27;5961:55;;6012:1;6009;6002:12;5961:55;6048:2;6035:16;6070:4;6094:60;6110:43;6150:2;6110:43;:::i;6094:60::-;6176:3;6200:2;6195:3;6188:15;6228:2;6223:3;6219:12;6212:19;;6259:2;6255;6251:11;6307:7;6302:2;6296;6293:1;6289:10;6285:2;6281:19;6277:28;6274:41;6271:61;;;6328:1;6325;6318:12;6271:61;6350:1;6341:10;;6360:238;6374:2;6371:1;6368:9;6360:238;;;6445:3;6432:17;6462:31;6487:5;6462:31;:::i;:::-;6506:18;;6392:1;6385:9;;;;;6544:12;;;;6576;;6360:238;;;-1:-1:-1;6617:5:1;-1:-1:-1;;6660:18:1;;6647:32;;-1:-1:-1;;6691:16:1;;;6688:36;;;6720:1;6717;6710:12;6688:36;;6743:63;6798:7;6787:8;6776:9;6772:24;6743:63;:::i;:::-;6733:73;;;5586:1226;;;;;:::o;7595:348::-;7679:6;7732:2;7720:9;7711:7;7707:23;7703:32;7700:52;;;7748:1;7745;7738:12;7700:52;7788:9;7775:23;-1:-1:-1;;;;;7813:6:1;7810:30;7807:50;;;7853:1;7850;7843:12;7807:50;7876:61;7929:7;7920:6;7909:9;7905:22;7876:61;:::i;:::-;7866:71;7595:348;-1:-1:-1;;;;7595:348:1:o;7948:892::-;8043:6;8074:2;8117;8105:9;8096:7;8092:23;8088:32;8085:52;;;8133:1;8130;8123:12;8085:52;8166:9;8160:16;-1:-1:-1;;;;;8191:6:1;8188:30;8185:50;;;8231:1;8228;8221:12;8185:50;8254:22;;8307:4;8299:13;;8295:27;-1:-1:-1;8285:55:1;;8336:1;8333;8326:12;8285:55;8365:2;8359:9;8388:60;8404:43;8444:2;8404:43;:::i;8388:60::-;8470:3;8494:2;8489:3;8482:15;8522:2;8517:3;8513:12;8506:19;;8553:2;8549;8545:11;8601:7;8596:2;8590;8587:1;8583:10;8579:2;8575:19;8571:28;8568:41;8565:61;;;8622:1;8619;8612:12;8565:61;8644:1;8635:10;;8654:156;8668:2;8665:1;8662:9;8654:156;;;8725:10;;8713:23;;8686:1;8679:9;;;;;8756:12;;;;8788;;8654:156;;;-1:-1:-1;8829:5:1;7948:892;-1:-1:-1;;;;;;;7948:892:1:o;8845:595::-;8963:6;8971;9024:2;9012:9;9003:7;8999:23;8995:32;8992:52;;;9040:1;9037;9030:12;8992:52;9080:9;9067:23;-1:-1:-1;;;;;9150:2:1;9142:6;9139:14;9136:34;;;9166:1;9163;9156:12;9136:34;9189:61;9242:7;9233:6;9222:9;9218:22;9189:61;:::i;:::-;9179:71;;9303:2;9292:9;9288:18;9275:32;9259:48;;9332:2;9322:8;9319:16;9316:36;;;9348:1;9345;9338:12;9445:957;9606:6;9614;9622;9675:2;9663:9;9654:7;9650:23;9646:32;9643:52;;;9691:1;9688;9681:12;9643:52;9731:9;9718:23;-1:-1:-1;;;;;9801:2:1;9793:6;9790:14;9787:34;;;9817:1;9814;9807:12;9787:34;9840:61;9893:7;9884:6;9873:9;9869:22;9840:61;:::i;:::-;9830:71;;9954:2;9943:9;9939:18;9926:32;9910:48;;9983:2;9973:8;9970:16;9967:36;;;9999:1;9996;9989:12;9967:36;10022:63;10077:7;10066:8;10055:9;10051:24;10022:63;:::i;:::-;10012:73;;10138:2;10127:9;10123:18;10110:32;10094:48;;10167:2;10157:8;10154:16;10151:36;;;10183:1;10180;10173:12;10151:36;-1:-1:-1;10206:24:1;;10261:4;10253:13;;10249:27;-1:-1:-1;10239:55:1;;10290:1;10287;10280:12;10239:55;10313:83;10388:7;10383:2;10370:16;10365:2;10361;10357:11;10313:83;:::i;:::-;10303:93;;;9445:957;;;;;:::o;10407:180::-;10466:6;10519:2;10507:9;10498:7;10494:23;10490:32;10487:52;;;10535:1;10532;10525:12;10487:52;-1:-1:-1;10558:23:1;;10407:180;-1:-1:-1;10407:180:1:o;10592:184::-;10662:6;10715:2;10703:9;10694:7;10690:23;10686:32;10683:52;;;10731:1;10728;10721:12;10683:52;-1:-1:-1;10754:16:1;;10592:184;-1:-1:-1;10592:184:1:o;10781:395::-;10867:6;10875;10883;10936:2;10924:9;10915:7;10911:23;10907:32;10904:52;;;10952:1;10949;10942:12;10904:52;10984:9;10978:16;11034:4;11027:5;11023:16;11016:5;11013:27;11003:55;;11054:1;11051;11044:12;11003:55;11122:2;11107:18;;11101:25;11166:2;11151:18;;;11145:25;11077:5;;11101:25;;-1:-1:-1;11145:25:1;10781:395;-1:-1:-1;;;10781:395:1:o;11181:435::-;11234:3;11272:5;11266:12;11299:6;11294:3;11287:19;11325:4;11354:2;11349:3;11345:12;11338:19;;11391:2;11384:5;11380:14;11412:1;11422:169;11436:6;11433:1;11430:13;11422:169;;;11497:13;;11485:26;;11531:12;;;;11566:15;;;;11458:1;11451:9;11422:169;;;-1:-1:-1;11607:3:1;;11181:435;-1:-1:-1;;;;;11181:435:1:o;12081:429::-;-1:-1:-1;;;;;12316:32:1;;12298:51;;12385:2;12380;12365:18;;12358:30;;;-1:-1:-1;;12405:56:1;;12442:18;;12434:6;12405:56;:::i;:::-;12397:64;;12497:6;12492:2;12481:9;12477:18;12470:34;12081:429;;;;;;:::o;12794:261::-;12973:2;12962:9;12955:21;12936:4;12993:56;13045:2;13034:9;13030:18;13022:6;12993:56;:::i;13663:603::-;13781:4;13810:2;13839;13828:9;13821:21;13871:6;13865:13;13914:6;13909:2;13898:9;13894:18;13887:34;13939:1;13949:140;13963:6;13960:1;13957:13;13949:140;;;14058:14;;;14054:23;;14048:30;14024:17;;;14043:2;14020:26;14013:66;13978:10;;13949:140;;;14107:6;14104:1;14101:13;14098:91;;;14177:1;14172:2;14163:6;14152:9;14148:22;14144:31;14137:42;14098:91;-1:-1:-1;14250:2:1;14229:15;-1:-1:-1;;14225:29:1;14210:45;;;;14257:2;14206:54;;13663:603;-1:-1:-1;;;13663:603:1:o;15488:334::-;15690:2;15672:21;;;15729:2;15709:18;;;15702:30;-1:-1:-1;;;15763:2:1;15748:18;;15741:40;15813:2;15798:18;;15488:334::o;19715:275::-;19786:2;19780:9;19851:2;19832:13;;-1:-1:-1;;19828:27:1;19816:40;;-1:-1:-1;;;;;19871:34:1;;19907:22;;;19868:62;19865:88;;;19933:18;;:::i;:::-;19969:2;19962:22;19715:275;;-1:-1:-1;19715:275:1:o;19995:183::-;20055:4;-1:-1:-1;;;;;20080:6:1;20077:30;20074:56;;;20110:18;;:::i;:::-;-1:-1:-1;20155:1:1;20151:14;20167:4;20147:25;;19995:183::o;20183:128::-;20223:3;20254:1;20250:6;20247:1;20244:13;20241:39;;;20260:18;;:::i;:::-;-1:-1:-1;20296:9:1;;20183:128::o;20316:217::-;20356:1;20382;20372:132;;20426:10;20421:3;20417:20;20414:1;20407:31;20461:4;20458:1;20451:15;20489:4;20486:1;20479:15;20372:132;-1:-1:-1;20518:9:1;;20316:217::o;20538:168::-;20578:7;20644:1;20640;20636:6;20632:14;20629:1;20626:21;20621:1;20614:9;20607:17;20603:45;20600:71;;;20651:18;;:::i;:::-;-1:-1:-1;20691:9:1;;20538:168::o;20711:125::-;20751:4;20779:1;20776;20773:8;20770:34;;;20784:18;;:::i;:::-;-1:-1:-1;20821:9:1;;20711:125::o;20841:253::-;20977:9;21014:74;21073:14;21065:6;21058:5;21014:74;:::i;21099:135::-;21138:3;-1:-1:-1;;21159:17:1;;21156:43;;;21179:18;;:::i;:::-;-1:-1:-1;21226:1:1;21215:13;;21099:135::o;21239:127::-;21300:10;21295:3;21291:20;21288:1;21281:31;21331:4;21328:1;21321:15;21355:4;21352:1;21345:15;21371:127;21432:10;21427:3;21423:20;21420:1;21413:31;21463:4;21460:1;21453:15;21487:4;21484:1;21477:15;21503:127;21564:10;21559:3;21555:20;21552:1;21545:31;21595:4;21592:1;21585:15;21619:4;21616:1;21609:15;21635:131;-1:-1:-1;;;;;21710:31:1;;21700:42;;21690:70;;21756:1;21753;21746:12;21690:70;21635:131;:::o

Swarm Source

ipfs://1334124f03e476484269b54fae128aad5e80e4a10140710fcf5aa6f1e0442efc

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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