ETH Price: $3,289.40 (+0.59%)

Contract

0x02F336E7EE2f74256b739bfDA7Ba6611Ed7b0623
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Set Token URI Ha...166231572023-02-13 23:36:23698 days ago1676331383IN
0x02F336E7...1Ed7b0623
0 ETH0.0020484522.20019353
Create Composed ...166231362023-02-13 23:32:11698 days ago1676331131IN
0x02F336E7...1Ed7b0623
0 ETH0.0071377822.69854628
Set Stack NFT Ad...166230932023-02-13 23:23:35698 days ago1676330615IN
0x02F336E7...1Ed7b0623
0 ETH0.0017851626.15506309

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
RBT_NFT

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-02-13
*/

// SPDX-License-Identifier: CC-BY-ND-4.0

pragma solidity ^0.8.18;

interface iStacks {
    function getPiecesPerStack() external view returns(uint);
    function getOwnedPieces(address _owner) external view returns (bytes32[] memory);
    function getPieceCode(uint tokenId) external view returns (string memory);
    function getPieceRarity(uint tokenId) external view returns (uint);
    function getAllPieces() external view returns (bytes32[] memory common,
                                                    bytes32[] memory uncommon,
                                                    bytes32[] memory rare);
    function getStacksForEdition(uint edition) external view returns (bytes32[] memory);
}

contract protected {
    mapping (address => bool) is_auth;
    function authorized(address addy) public view returns(bool) {
        return is_auth[addy];
    }
    function set_authorized(address addy, bool booly) public onlyAuth {
        is_auth[addy] = booly;
    }
    modifier onlyAuth() {
        require( is_auth[msg.sender] || msg.sender==owner, "not owner");
        _;
    }
    address owner;
    modifier onlyOwner() {
        require(msg.sender==owner, "not owner");
        _;
    }
    bool locked;
    modifier safe() {
        require(!locked, "reentrant");
        locked = true;
        _;
        locked = false;
    }
    function change_owner(address new_owner) public onlyAuth {
        owner = new_owner;
    }
    receive() external payable {}
    fallback() external payable {}
}

// SECTION Interfaces
interface ERC165 {
    function supportsInterface(bytes4 interfaceID) external view returns (bool);
}

interface ERC721 is ERC165 {
    event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);
    event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);
    event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);
    function balanceOf(address _owner) external view returns (uint256);
    function ownerOf(uint256 _tokenId) external view returns (address);
    function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes memory data) external;
    function safeTransferFrom(address _from, address _to, uint256 _tokenId) external;
    function transferFrom(address _from, address _to, uint256 _tokenId) external;
    function approve(address _approved, uint256 _tokenId) external;
    function setApprovalForAll(address _operator, bool _approved) external;
    function getApproved(uint256 _tokenId) external view returns (address);
    function isApprovedForAll(address _owner, address _operator) external view returns (bool);
}

interface IERC20 {
    function balanceOf(address _owner) external view returns (uint256 balance);
    function transfer(address _to, uint256 _value) external returns (bool success);
    function transferFrom(address _from, address _to, uint256 _value) external returns (bool success);
    function approve(address _spender, uint256 _value) external returns (bool success);
    function allowance(address _owner, address _spender) external view returns (uint256 remaining);
    event Transfer(address indexed _from, address indexed _to, uint256 _value);
    event Approval(address indexed _owner, address indexed _spender, uint256 _value);
}

interface IERC721Receiver {
    function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes calldata _data) external returns(bytes4);
}
// !SECTION Interfaces

error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintedQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerIndexOutOfBounds();
error OwnerQueryForNonexistentToken();
error TokenIndexOutOfBounds();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error UnableDetermineTokenOwner();
error UnableGetTokenOwnerByIndex();
error URIQueryForNonexistentToken();

/**
 * @notice Updated, minimalist and gas efficient version of OpenZeppelins ERC721 contract.
 *         Includes the Metadata and Enumerable extension.
 *
 * @dev Token IDs are minted  in sequential order starting at 0 (e.g. 0, 1, 2, ...).
 *      Does not support burning tokens.
 *
 * @author beskay0x
 * Credits: chiru-labs, solmate, transmissions11, nftchance, squeebo_nft and others
 */

contract RBT_NFT is ERC721, protected {

    /*///////////////////////////////////////////////////////////////
                          METADATA STORAGE/LOGIC
    //////////////////////////////////////////////////////////////*/

    string public name = "White Rabbit NFT";
    string public symbol = "RBTNFT";
    
    string public baseURI = "https://whiterabbit.mypinata.cloud/ipfs/";
    mapping (uint256 => string) private _tokenURIs;

    function setBaseURI(string memory _baseURI) public onlyAuth {
        baseURI = _baseURI;
    }

    function setTokenURIHash(uint256 tokenId, string memory _tokenURI) public onlyAuth {
        _tokenURIs[tokenId] = _tokenURI;
    }

    function tokenURI(uint256 tokenId) public view returns (string memory) {
        require(_exists(tokenId), "URIQueryForNonexistentToken");
        string memory _tokenId = _tokenURIs[tokenId];
        return string(abi.encodePacked(baseURI, _tokenId));
    }
    /*///////////////////////////////////////////////////////////////
                          ERC721 STORAGE
    //////////////////////////////////////////////////////////////*/

    // Array which maps token ID to address (index is tokenID)
    address[] internal _owners;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /*///////////////////////////////////////////////////////////////
                              CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor() {
        owner = msg.sender;
        is_auth[msg.sender] = true;
    }

    /*///////////////////////////////////////////////////////////////
                              ERC165 LOGIC
    //////////////////////////////////////////////////////////////*/

    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
        return
            interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165
            interfaceId == 0x80ac58cd || // ERC165 Interface ID for ERC721
            interfaceId == 0x780e9d63 || // ERC165 Interface ID for ERC721Enumerable
            interfaceId == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata
    }

    /*///////////////////////////////////////////////////////////////
                       ERC721ENUMERABLE LOGIC
    //////////////////////////////////////////////////////////////*/

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view returns (uint256) {
        return _owners.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * It is not recommended to call this function on chain from another smart contract,
     * as it can become quite expensive for larger collections.
     */
    function tokenOfOwnerByIndex(address _owner, uint256 index) public view virtual returns (uint256 tokenId) {
        if (index >= balanceOf(_owner)) revert OwnerIndexOutOfBounds();

        uint256 count;
        uint256 qty = _owners.length;
        // Cannot realistically overflow, since we are using uint256
        unchecked {
            for (tokenId; tokenId < qty; tokenId++) {
                if (_owner == ownerOf(tokenId)) {
                    if (count == index) return tokenId;
                    else count++;
                }
            }
        }

        revert UnableGetTokenOwnerByIndex();
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual returns (uint256) {
        if (index >= totalSupply()) revert TokenIndexOutOfBounds();
        return index;
    }

    /*///////////////////////////////////////////////////////////////
                              ERC721 LOGIC
    //////////////////////////////////////////////////////////////*/

    /**
     * @dev Returns the number of tokens in `owner`'s account.
     *      Iterates through _owners array -- it is not recommended to call this function
     *      from another contract, as it can become quite expensive for larger collections.
     */
    function balanceOf(address _owner) public view virtual returns (uint256) {
        if (_owner == address(0)) revert BalanceQueryForZeroAddress();

        uint256 count;
        uint256 qty = _owners.length;
        // Cannot realistically overflow, since we are using uint256
        unchecked {
            for (uint256 i; i < qty; i++) {
                if (_owner == ownerOf(i)) {
                    count++;
                }
            }
        }
        return count;
    }

    /**
     * @dev See {IERC721-ownerOf}.
     *      Gas spent here starts off proportional to the maximum mint batch size.
     *      It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function ownerOf(uint256 tokenId) public view virtual returns (address) {
        if (!_exists(tokenId)) revert OwnerQueryForNonexistentToken();

        // Cannot realistically overflow, since we are using uint256
        unchecked {
            for (tokenId; ; tokenId++) {
                if (_owners[tokenId] != address(0)) {
                    return _owners[tokenId];
                }
            }
        }

        revert UnableDetermineTokenOwner();
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual {
        address _owner = ownerOf(tokenId);
        if (to == _owner) revert ApprovalToCurrentOwner();

        if (msg.sender != _owner && !isApprovedForAll(_owner, msg.sender)) revert ApprovalCallerNotOwnerNorApproved();

        _tokenApprovals[tokenId] = to;
        emit Approval(_owner, to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual {
        if (operator == msg.sender) revert ApproveToCaller();

        _operatorApprovals[msg.sender][operator] = approved;
        emit ApprovalForAll(msg.sender, operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address _owner, address operator) public view virtual returns (bool) {
        return _operatorApprovals[_owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual {
        if (!_exists(tokenId)) revert OwnerQueryForNonexistentToken();
        if (ownerOf(tokenId) != from) revert TransferFromIncorrectOwner();
        if (to == address(0)) revert TransferToZeroAddress();

        bool isApprovedOrOwner = (msg.sender == from ||
            msg.sender == getApproved(tokenId) ||
            isApprovedForAll(from, msg.sender));
        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();

        // delete token approvals from previous owner
        delete _tokenApprovals[tokenId];
        _owners[tokenId] = to;

        // if token ID below transferred one isnt set, set it to previous owner
        // if tokenid is zero, skip this to prevent underflow
        if (tokenId > 0 && _owners[tokenId - 1] == address(0)) {
            _owners[tokenId - 1] = from;
        }

        emit Transfer(from, to, tokenId);
    }

    function _internalTransfer(address from, address to, uint tokenId) internal {
        if (_owners[tokenId] != from) revert TransferFromIncorrectOwner();
        if (!_exists(tokenId)) revert OwnerQueryForNonexistentToken();

        // delete token approvals from previous owner
        delete _tokenApprovals[tokenId];
        _owners[tokenId] = to;

        // if token ID below transferred one isnt set, set it to previous owner
        // if tokenid is zero, skip this to prevent underflow
        if (tokenId > 0 && _owners[tokenId - 1] == address(0)) {
            _owners[tokenId - 1] = from;
        }

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id
    ) public virtual {
        safeTransferFrom(from, to, id, '');
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        bytes memory data
    ) public virtual {
        transferFrom(from, to, id);

        if (!_checkOnERC721Received(from, to, id, data)) revert TransferToNonERC721ReceiverImplementer();
    }

    /**
     * @dev Returns whether `tokenId` exists.
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return tokenId < _owners.length;
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     *      The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.code.length == 0) return true;

        try IERC721Receiver(to).onERC721Received(msg.sender, from, tokenId, _data) returns (bytes4 retval) {
            return retval == IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) revert TransferToNonERC721ReceiverImplementer();

            assembly {
                revert(add(32, reason), mload(reason))
            }
        }
    }

    /*///////////////////////////////////////////////////////////////
                       INTERNAL MINT LOGIC
    //////////////////////////////////////////////////////////////*/

    /**
     * @dev Safely mints `qty` tokens and transfers them to `to`.
     *
     *      If `to` refers to a smart contract, it must implement
     *      {IERC721Receiver-onERC721Received}
     *
     *      Unlike in the standard ERC721 implementation {IERC721Receiver-onERC721Received}
     *      is only called once. If the receiving contract confirms the transfer of one token,
     *      all additional tokens are automatically confirmed too.
     */
    function _safeMint(address to, uint256 qty) internal virtual {
        _safeMint(to, qty, '');
    }

    /**
     * @dev Equivalent to {safeMint(to, qty)}, but accepts an additional data argument.
     */
    function _safeMint(
        address to,
        uint256 qty,
        bytes memory data
    ) internal virtual {
        _mint(to, qty);

        if (!_checkOnERC721Received(address(0), to, _owners.length - 1, data))
            revert TransferToNonERC721ReceiverImplementer();
    }

    /**
     * @dev Mints `qty` tokens and transfers them to `to`.
     *      Emits a {Transfer} event for each mint.
     */
    function _mint(address to, uint256 qty) internal virtual {
        if (to == address(0)) revert MintToZeroAddress();
        if (qty == 0) revert MintZeroQuantity();

        uint256 _currentIndex = _owners.length;

        // Cannot realistically overflow, since we are using uint256
        unchecked {
            for (uint256 i; i < qty - 1; i++) {
                _owners.push();
                emit Transfer(address(0), to, _currentIndex + i);
            }
        }

        // set last index to receiver
        _owners.push(to);
        emit Transfer(address(0), to, _currentIndex + (qty - 1));
    }

    // SECTION Completion methods

    address public StackNFTAddress;
    iStacks public StackNFT;

    struct COMPOSED_NFT {
        bytes32[] tokenPieces;
        bool composed;
    }

    mapping (uint256 => COMPOSED_NFT) composedNFTs; // composedNFTs[tokenId] = COMPOSED_NFT

    // ANCHOR Public methods

    function getComposedNFT(uint256 tokenId) public view returns (bytes32[] memory pieces, 
                                                                    bool composed,
                                                                    address owner) {
        return (composedNFTs[tokenId].tokenPieces,
                composedNFTs[tokenId].composed,
                ownerOf(tokenId));
    }

    // NOTE This function is called to have a list of all the composed NFTs available and not available
    function getAllComposedNFTs() external view returns (bytes32[] memory _composedNFTs, 
                                                          bytes32[] memory _inactiveComposedNFTs) { 
        uint256 _length = _owners.length;
        _composedNFTs = new bytes32[](_length);
        _inactiveComposedNFTs = new bytes32[](_length);
        for (uint256 i = 0; i < _length; i++) {
            // Check if the NFT is yet to compose
            if (!composedNFTs[i].composed) {
                _composedNFTs[i] = composedNFTs[i].tokenPieces[0];
            } else {
                _inactiveComposedNFTs[i] = composedNFTs[i].tokenPieces[0];
            }
        }
        // Delete empty elements
        uint256 _composedNFTsLength = 0;
        uint256 _inactiveComposedNFTsLength = 0;
        for (uint256 i = 0; i < _length; i++) {
            if (_composedNFTs[i] != bytes32(0)) {
                _composedNFTs[_composedNFTsLength] = _composedNFTs[i];
                _composedNFTsLength++;
            }
            if (_inactiveComposedNFTs[i] != bytes32(0)) {
                _inactiveComposedNFTs[_inactiveComposedNFTsLength] = _inactiveComposedNFTs[i];
                _inactiveComposedNFTsLength++;
            }
        }
        assembly {
            mstore(_composedNFTs, _composedNFTsLength)
            mstore(_inactiveComposedNFTs, _inactiveComposedNFTsLength)
        }
    }


    // NOTE This function should be called by the owner of all the pieces of the NFT
    function composeNFT(uint256 tokenId) external safe {
        // Check if the NFT is not already composed
        require(!composedNFTs[tokenId].composed, "NFT already composed");
        // Check if the owner of the NFT is the owner of all the pieces
        bool _allPiecesOwned = _hasAllPieces(tokenId, msg.sender);
        // Transfer the NFT to the owner of the pieces
        if (_allPiecesOwned) {
            composedNFTs[tokenId].composed = true;
            _internalTransfer(address(this), msg.sender, tokenId);
        } else {
            revert("You don't own all the pieces of the NFT");
        }
    }

    function hasAllPieces(uint256 tokenId) public view returns (bool) {
        return _hasAllPieces(tokenId, msg.sender);
    }

    function _hasAllPieces(uint256 tokenId, address _owner) internal view returns (bool) {
        bytes32[] memory _tokenPieces = composedNFTs[tokenId].tokenPieces;
        bytes32[] memory _ownedPieces = StackNFT.getOwnedPieces(_owner);
        // Check if the owner of the NFT is the owner of all the pieces of the NFT
        bool _allPiecesOwned = true;
        for (uint i = 0; i < _tokenPieces.length; i++) { // For each piece of the NFT
            bool _pieceOwned = false; // Each piece starts as not owned
            for (uint j = 0; j < _ownedPieces.length; j++) { // For each piece owned
                if (_tokenPieces[i] == _ownedPieces[j]) {
                    _pieceOwned = true; // If the piece is found, we proceed to the next piece
                    break;
                }
            }
            if (!_pieceOwned) {
                _allPiecesOwned = false; // If even one piece is not owned, we stop the loop
                break;
            }
        }
        return _allPiecesOwned;
    }

    // ANCHOR Admin methods

    function setStackNFTAddress(address _address) external onlyOwner {
        StackNFTAddress = _address;
        StackNFT = iStacks(_address);
    }

    // NOTE This creates and store in the contract the composed NFT
    function createComposedNFT(bytes32[] memory tokenPieces) external onlyOwner {
        require(tokenPieces.length == 6, "Invalid number of pieces");
        uint256 tokenId = _owners.length;
        _mint(address(this), 1);
        composedNFTs[tokenId] = COMPOSED_NFT(tokenPieces, false);
    }

    // NOTE This creates and store in the contract the composed NFT automatically
    function createComposedNFTAuto(uint seed) external onlyOwner {
        uint piecesNumber = 6;
        uint256 tokenId = _owners.length;
        // Getting the pieces from the StackNFT contract
        bytes32[] memory _common;
        bytes32[] memory _uncommon;
        bytes32[] memory _rare;
        (_common, _uncommon, _rare) = StackNFT.getAllPieces();
        // Select randomly 1 rare 2 uncommon and 3 common pieces
        bytes32[] memory tokenPieces = new bytes32[](piecesNumber);
        tokenPieces[0] = _rare[uint(keccak256(abi.encodePacked(seed))) % _rare.length];
        tokenPieces[1] = _uncommon[uint(keccak256(abi.encodePacked(seed + 1))) % _uncommon.length];
        tokenPieces[2] = _uncommon[uint(keccak256(abi.encodePacked(seed + 2))) % _uncommon.length];
        tokenPieces[3] = _common[uint(keccak256(abi.encodePacked(seed + 3))) % _common.length];
        tokenPieces[4] = _common[uint(keccak256(abi.encodePacked(seed + 4))) % _common.length];
        tokenPieces[5] = _common[uint(keccak256(abi.encodePacked(seed + 5))) % _common.length];
        // Store the NFT
        composedNFTs[tokenId] = COMPOSED_NFT(tokenPieces, false);
        _mint(address(this), 1);
    }

    // !SECTION Completion methods

    // String manipulation functions
    function uint2str(uint _i) internal pure returns (string memory _uintAsString) {
        if (_i == 0) {
            return "0";
        }
        uint j = _i;
        uint len;
        while (j != 0) {
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint k = len;
        while (_i != 0) {
            k = k-1;
            uint8 temp = (48 + uint8(_i - _i / 10 * 10));
            bytes1 b1 = bytes1(temp);
            bstr[k] = b1;
            _i /= 10;
        }
        return string(bstr);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerIndexOutOfBounds","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TokenIndexOutOfBounds","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"UnableDetermineTokenOwner","type":"error"},{"inputs":[],"name":"UnableGetTokenOwnerByIndex","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"StackNFT","outputs":[{"internalType":"contract iStacks","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"StackNFTAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addy","type":"address"}],"name":"authorized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"new_owner","type":"address"}],"name":"change_owner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"composeNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"tokenPieces","type":"bytes32[]"}],"name":"createComposedNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"seed","type":"uint256"}],"name":"createComposedNFTAuto","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAllComposedNFTs","outputs":[{"internalType":"bytes32[]","name":"_composedNFTs","type":"bytes32[]"},{"internalType":"bytes32[]","name":"_inactiveComposedNFTs","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getComposedNFT","outputs":[{"internalType":"bytes32[]","name":"pieces","type":"bytes32[]"},{"internalType":"bool","name":"composed","type":"bool"},{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"hasAllPieces","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setStackNFTAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"setTokenURIHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addy","type":"address"},{"internalType":"bool","name":"booly","type":"bool"}],"name":"set_authorized","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","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":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c0604052601060809081526f15da1a5d1948149858989a5d0813919560821b60a0526002906200003190826200016f565b5060408051808201909152600681526514909513919560d21b60208201526003906200005e90826200016f565b5060405180606001604052806028815260200162002a5d602891396004906200008890826200016f565b503480156200009657600080fd5b50600180546001600160a01b0319163390811782556000908152602081905260409020805460ff191690911790556200023b565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620000f557607f821691505b6020821081036200011657634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200016a57600081815260208120601f850160051c81016020861015620001455750805b601f850160051c820191505b81811015620001665782815560010162000151565b5050505b505050565b81516001600160401b038111156200018b576200018b620000ca565b620001a3816200019c8454620000e0565b846200011c565b602080601f831160018114620001db5760008415620001c25750858301515b600019600386901b1c1916600185901b17855562000166565b600085815260208120601f198616915b828110156200020c57888601518255948401946001909101908401620001eb565b50858210156200022b5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b612812806200024b6000396000f3fe6080604052600436106101c45760003560e01c80634f6ccce7116100f6578063995c85631161008f578063bdfa08eb11610061578063bdfa08eb14610574578063c42b2d1714610594578063c87b56dd146105b4578063e985e9c5146105d457005b8063995c8563146104db578063a22cb465146104fb578063b88d4fde1461051b578063b91816111461053b57005b80636c0360eb116100c85780636c0360eb1461047157806370a08231146104865780637f7512c3146104a657806395d89b41146104c657005b80634f6ccce7146103e25780635150d2981461040257806355f804b3146104315780636352211e1461045157005b806323b872dd11610168578063374a8af71161013a578063374a8af71461036257806342842e0e1461038257806347d0d4e3146103a25780634cd0dda7146103c257005b806323b872dd146102e2578063253c8bd4146103025780632bfe8742146103225780632f745c591461034257005b8063081812fc116101a1578063081812fc1461024b578063095ea7b31461028357806318160ddd146102a357806322bb3e1b146102c257005b806301393a7a146101cd57806301ffc9a7146101f957806306fdde031461022957005b366101cb57005b005b3480156101d957600080fd5b506101e26105f4565b6040516101f0929190611f33565b60405180910390f35b34801561020557600080fd5b50610219610214366004611f7a565b61084c565b60405190151581526020016101f0565b34801561023557600080fd5b5061023e6108b9565b6040516101f09190611fee565b34801561025757600080fd5b5061026b610266366004612001565b610947565b6040516001600160a01b0390911681526020016101f0565b34801561028f57600080fd5b506101cb61029e366004612036565b61098d565b3480156102af57600080fd5b506006545b6040519081526020016101f0565b3480156102ce57600080fd5b506101cb6102dd36600461211d565b610a66565b3480156102ee57600080fd5b506101cb6102fd366004612163565b610ad0565b34801561030e57600080fd5b506101cb61031d36600461219f565b610ce3565b34801561032e57600080fd5b506101cb61033d3660046121ba565b610d49565b34801561034e57600080fd5b506102b461035d366004612036565b610db8565b34801561036e57600080fd5b506101cb61037d366004612001565b610e4b565b34801561038e57600080fd5b506101cb61039d366004612163565b611278565b3480156103ae57600080fd5b506101cb6103bd366004612001565b611293565b3480156103ce57600080fd5b5060095461026b906001600160a01b031681565b3480156103ee57600080fd5b506102b46103fd366004612001565b6113ee565b34801561040e57600080fd5b5061042261041d366004612001565b61141c565b6040516101f0939291906121f6565b34801561043d57600080fd5b506101cb61044c366004612229565b61149c565b34801561045d57600080fd5b5061026b61046c366004612001565b6114f0565b34801561047d57600080fd5b5061023e61158b565b34801561049257600080fd5b506102b46104a136600461219f565b611598565b3480156104b257600080fd5b506101cb6104c136600461219f565b61160a565b3480156104d257600080fd5b5061023e611660565b3480156104e757600080fd5b506102196104f6366004612001565b61166d565b34801561050757600080fd5b506101cb6105163660046121ba565b611679565b34801561052757600080fd5b506101cb61053636600461225d565b61170e565b34801561054757600080fd5b5061021961055636600461219f565b6001600160a01b031660009081526020819052604090205460ff1690565b34801561058057600080fd5b506101cb61058f3660046122fb565b611748565b3480156105a057600080fd5b50600a5461026b906001600160a01b031681565b3480156105c057600080fd5b5061023e6105cf366004612001565b611826565b3480156105e057600080fd5b506102196105ef366004612390565b611943565b6006546060908190806001600160401b0381111561061457610614612060565b60405190808252806020026020018201604052801561063d578160200160208202803683370190505b509250806001600160401b0381111561065857610658612060565b604051908082528060200260200182016040528015610681578160200160208202803683370190505b50915060005b81811015610750576000818152600b602052604090206001015460ff166106f5576000818152600b6020526040812080549091906106c7576106c76123c3565b90600052602060002001548482815181106106e4576106e46123c3565b60200260200101818152505061073e565b6000818152600b602052604081208054909190610714576107146123c3565b9060005260206000200154838281518110610731576107316123c3565b6020026020010181815250505b80610748816123ef565b915050610687565b5060008060005b83811015610841576000801b868281518110610775576107756123c3565b6020026020010151146107c757858181518110610794576107946123c3565b60200260200101518684815181106107ae576107ae6123c3565b6020908102919091010152826107c3816123ef565b9350505b6000801b8582815181106107dd576107dd6123c3565b60200260200101511461082f578481815181106107fc576107fc6123c3565b6020026020010151858381518110610816576108166123c3565b60209081029190910101528161082b816123ef565b9250505b80610839816123ef565b915050610757565b509084528252509091565b60006301ffc9a760e01b6001600160e01b03198316148061087d57506380ac58cd60e01b6001600160e01b03198316145b80610898575063780e9d6360e01b6001600160e01b03198316145b806108b35750635b5e139f60e01b6001600160e01b03198316145b92915050565b600280546108c690612408565b80601f01602080910402602001604051908101604052809291908181526020018280546108f290612408565b801561093f5780601f106109145761010080835404028352916020019161093f565b820191906000526020600020905b81548152906001019060200180831161092257829003601f168201915b505050505081565b6000610954826006541190565b610971576040516333d1c03960e21b815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b6000610998826114f0565b9050806001600160a01b0316836001600160a01b0316036109cc5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b038216148015906109ec57506109ea8133611943565b155b15610a0a576040516367d9dca160e11b815260040160405180910390fd5b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b3360009081526020819052604090205460ff1680610a8e57506001546001600160a01b031633145b610ab35760405162461bcd60e51b8152600401610aaa90612442565b60405180910390fd5b6000828152600560205260409020610acb82826124b3565b505050565b610adb816006541190565b610af857604051636f96cda160e11b815260040160405180910390fd5b826001600160a01b0316610b0b826114f0565b6001600160a01b031614610b315760405162a1148160e81b815260040160405180910390fd5b6001600160a01b038216610b5857604051633a954ecd60e21b815260040160405180910390fd5b6000336001600160a01b0385161480610b8a5750610b7582610947565b6001600160a01b0316336001600160a01b0316145b80610b9a5750610b9a8433611943565b905080610bba57604051632ce44b5f60e11b815260040160405180910390fd5b600082815260076020526040902080546001600160a01b03191690556006805484919084908110610bed57610bed6123c3565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600082118015610c5c575060006006610c35600185612572565b81548110610c4557610c456123c3565b6000918252602090912001546001600160a01b0316145b15610cae57836006610c6f600185612572565b81548110610c7f57610c7f6123c3565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b81836001600160a01b0316856001600160a01b03166000805160206127bd83398151915260405160405180910390a450505050565b3360009081526020819052604090205460ff1680610d0b57506001546001600160a01b031633145b610d275760405162461bcd60e51b8152600401610aaa90612442565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526020819052604090205460ff1680610d7157506001546001600160a01b031633145b610d8d5760405162461bcd60e51b8152600401610aaa90612442565b6001600160a01b03919091166000908152602081905260409020805460ff1916911515919091179055565b6000610dc383611598565b8210610de2576040516306ed618760e11b815260040160405180910390fd5b6006546000905b80831015610e3257610dfa836114f0565b6001600160a01b0316856001600160a01b031603610e2757838203610e205750506108b3565b6001909101905b600190920191610de9565b604051637339954760e01b815260040160405180910390fd5b6001546001600160a01b03163314610e755760405162461bcd60e51b8152600401610aaa90612442565b60068054600a5460408051630d6fcb8160e41b81529051606092839283926001600160a01b039092169163d6fcb810916004808201926000929091908290030181865afa158015610eca573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ef291908101906125eb565b919450925090506000856001600160401b03811115610f1357610f13612060565b604051908082528060200260200182016040528015610f3c578160200160208202803683370190505b50905081825188604051602001610f5591815260200190565b6040516020818303038152906040528051906020012060001c610f789190612672565b81518110610f8857610f886123c3565b602002602001015181600081518110610fa357610fa36123c3565b602090810291909101015282518390610fbd896001612694565b604051602001610fcf91815260200190565b6040516020818303038152906040528051906020012060001c610ff29190612672565b81518110611002576110026123c3565b60200260200101518160018151811061101d5761101d6123c3565b602090810291909101015282518390611037896002612694565b60405160200161104991815260200190565b6040516020818303038152906040528051906020012060001c61106c9190612672565b8151811061107c5761107c6123c3565b602002602001015181600281518110611097576110976123c3565b6020908102919091010152835184906110b1896003612694565b6040516020016110c391815260200190565b6040516020818303038152906040528051906020012060001c6110e69190612672565b815181106110f6576110f66123c3565b602002602001015181600381518110611111576111116123c3565b60209081029190910101528351849061112b896004612694565b60405160200161113d91815260200190565b6040516020818303038152906040528051906020012060001c6111609190612672565b81518110611170576111706123c3565b60200260200101518160048151811061118b5761118b6123c3565b6020908102919091010152835184906111a5896005612694565b6040516020016111b791815260200190565b6040516020818303038152906040528051906020012060001c6111da9190612672565b815181106111ea576111ea6123c3565b602002602001015181600581518110611205576112056123c3565b6020908102919091018101919091526040805180820182528381526000818401819052888152600b84529190912081518051929391926112489284920190611ea1565b50602091909101516001918201805460ff191691151591909117905561126f903090611971565b50505050505050565b610acb8383836040518060200160405280600081525061170e565b600154600160a01b900460ff16156112d95760405162461bcd60e51b81526020600482015260096024820152681c99595b9d1c985b9d60ba1b6044820152606401610aaa565b6001805460ff60a01b1916600160a01b1781556000828152600b60205260409020015460ff16156113435760405162461bcd60e51b815260206004820152601460248201527313919508185b1c9958591e4818dbdb5c1bdcd95960621b6044820152606401610aaa565b600061134f8233611a8e565b90508015611385576000828152600b602052604090206001908101805460ff19169091179055611380303384611bfd565b6113dd565b60405162461bcd60e51b815260206004820152602760248201527f596f7520646f6e2774206f776e20616c6c2074686520706965636573206f66206044820152661d1a194813919560ca1b6064820152608401610aaa565b50506001805460ff60a01b19169055565b60006113f960065490565b8210611418576040516329c8c00760e21b815260040160405180910390fd5b5090565b6000818152600b60205260408120600181015460609291829160ff16611441866114f0565b82546040805160208084028201810190925282815291859183018282801561148857602002820191906000526020600020905b815481526020019060010190808311611474575b505050505092509250925092509193909250565b3360009081526020819052604090205460ff16806114c457506001546001600160a01b031633145b6114e05760405162461bcd60e51b8152600401610aaa90612442565b60046114ec82826124b3565b5050565b60006114fd826006541190565b61151a57604051636f96cda160e11b815260040160405180910390fd5b60006001600160a01b031660068381548110611538576115386123c3565b6000918252602090912001546001600160a01b0316146115805760068281548110611565576115656123c3565b6000918252602090912001546001600160a01b031692915050565b60019091019061151a565b600480546108c690612408565b60006001600160a01b0382166115c1576040516323d3ad8160e21b815260040160405180910390fd5b600654600090815b81811015611601576115da816114f0565b6001600160a01b0316856001600160a01b0316036115f9576001909201915b6001016115c9565b50909392505050565b6001546001600160a01b031633146116345760405162461bcd60e51b8152600401610aaa90612442565b600980546001600160a01b039092166001600160a01b03199283168117909155600a8054909216179055565b600380546108c690612408565b60006108b38233611a8e565b336001600160a01b038316036116a25760405163b06307db60e01b815260040160405180910390fd5b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611719848484610ad0565b61172584848484611d9c565b611742576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6001546001600160a01b031633146117725760405162461bcd60e51b8152600401610aaa90612442565b80516006146117c35760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964206e756d626572206f662070696563657300000000000000006044820152606401610aaa565b6006546117d1306001611971565b60408051808201825283815260006020808301829052848252600b815292902081518051929391926118069284920190611ea1565b50602091909101516001909101805460ff19169115159190911790555050565b6060611833826006541190565b61187f5760405162461bcd60e51b815260206004820152601b60248201527f5552495175657279466f724e6f6e6578697374656e74546f6b656e00000000006044820152606401610aaa565b6000828152600560205260408120805461189890612408565b80601f01602080910402602001604051908101604052809291908181526020018280546118c490612408565b80156119115780601f106118e657610100808354040283529160200191611911565b820191906000526020600020905b8154815290600101906020018083116118f457829003601f168201915b5050505050905060048160405160200161192c9291906126a7565b604051602081830303815290604052915050919050565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b6001600160a01b03821661199757604051622e076360e81b815260040160405180910390fd5b806000036119b85760405163b562e8dd60e01b815260040160405180910390fd5b60065460005b60018303811015611a04576006805460010181556000908152604051838301916001600160a01b038716916000805160206127bd833981519152908290a46001016119be565b5060068054600180820183556000929092527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0319166001600160a01b038616179055611a5b9083612572565b611a659082612694565b6040516001600160a01b038516906000906000805160206127bd833981519152908290a4505050565b6000828152600b6020908152604080832080548251818502810185019093528083528493830182828015611ae157602002820191906000526020600020905b815481526020019060010190808311611acd575b5050600a54604051631d808f8160e31b81526001600160a01b038981166004830152959650600095909116935063ec047c0892506024019050600060405180830381865afa158015611b37573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611b5f919081019061272e565b9050600160005b8351811015611bf3576000805b8451811015611bd057848181518110611b8e57611b8e6123c3565b6020026020010151868481518110611ba857611ba86123c3565b602002602001015103611bbe5760019150611bd0565b80611bc8816123ef565b915050611b73565b5080611be0576000925050611bf3565b5080611beb816123ef565b915050611b66565b5095945050505050565b826001600160a01b031660068281548110611c1a57611c1a6123c3565b6000918252602090912001546001600160a01b031614611c4c5760405162a1148160e81b815260040160405180910390fd5b611c57816006541190565b611c7457604051636f96cda160e11b815260040160405180910390fd5b600081815260076020526040902080546001600160a01b03191690556006805483919083908110611ca757611ca76123c3565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600081118015611d16575060006006611cef600184612572565b81548110611cff57611cff6123c3565b6000918252602090912001546001600160a01b0316145b15611d6857826006611d29600184612572565b81548110611d3957611d396123c3565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b80826001600160a01b0316846001600160a01b03166000805160206127bd83398151915260405160405180910390a4505050565b6000836001600160a01b03163b600003611db857506001611e99565b604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611dea903390899088908890600401612762565b6020604051808303816000875af1925050508015611e25575060408051601f3d908101601f19168201909252611e229181019061279f565b60015b611e83573d808015611e53576040519150601f19603f3d011682016040523d82523d6000602084013e611e58565b606091505b508051600003611e7b576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b828054828255906000526020600020908101928215611edc579160200282015b82811115611edc578251825591602001919060010190611ec1565b506114189291505b808211156114185760008155600101611ee4565b600081518084526020808501945080840160005b83811015611f2857815187529582019590820190600101611f0c565b509495945050505050565b604081526000611f466040830185611ef8565b8281036020840152611f588185611ef8565b95945050505050565b6001600160e01b031981168114611f7757600080fd5b50565b600060208284031215611f8c57600080fd5b8135611f9781611f61565b9392505050565b60005b83811015611fb9578181015183820152602001611fa1565b50506000910152565b60008151808452611fda816020860160208601611f9e565b601f01601f19169290920160200192915050565b602081526000611f976020830184611fc2565b60006020828403121561201357600080fd5b5035919050565b80356001600160a01b038116811461203157600080fd5b919050565b6000806040838503121561204957600080fd5b6120528361201a565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561209e5761209e612060565b604052919050565b60006001600160401b038311156120bf576120bf612060565b6120d2601f8401601f1916602001612076565b90508281528383830111156120e657600080fd5b828260208301376000602084830101529392505050565b600082601f83011261210e57600080fd5b611f97838335602085016120a6565b6000806040838503121561213057600080fd5b8235915060208301356001600160401b0381111561214d57600080fd5b612159858286016120fd565b9150509250929050565b60008060006060848603121561217857600080fd5b6121818461201a565b925061218f6020850161201a565b9150604084013590509250925092565b6000602082840312156121b157600080fd5b611f978261201a565b600080604083850312156121cd57600080fd5b6121d68361201a565b9150602083013580151581146121eb57600080fd5b809150509250929050565b6060815260006122096060830186611ef8565b9315156020830152506001600160a01b0391909116604090910152919050565b60006020828403121561223b57600080fd5b81356001600160401b0381111561225157600080fd5b611e99848285016120fd565b6000806000806080858703121561227357600080fd5b61227c8561201a565b935061228a6020860161201a565b92506040850135915060608501356001600160401b038111156122ac57600080fd5b8501601f810187136122bd57600080fd5b6122cc878235602084016120a6565b91505092959194509250565b60006001600160401b038211156122f1576122f1612060565b5060051b60200190565b6000602080838503121561230e57600080fd5b82356001600160401b0381111561232457600080fd5b8301601f8101851361233557600080fd5b8035612348612343826122d8565b612076565b81815260059190911b8201830190838101908783111561236757600080fd5b928401925b828410156123855783358252928401929084019061236c565b979650505050505050565b600080604083850312156123a357600080fd5b6123ac8361201a565b91506123ba6020840161201a565b90509250929050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201612401576124016123d9565b5060010190565b600181811c9082168061241c57607f821691505b60208210810361243c57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252600990820152683737ba1037bbb732b960b91b604082015260600190565b601f821115610acb57600081815260208120601f850160051c8101602086101561248c5750805b601f850160051c820191505b818110156124ab57828155600101612498565b505050505050565b81516001600160401b038111156124cc576124cc612060565b6124e0816124da8454612408565b84612465565b602080601f83116001811461251557600084156124fd5750858301515b600019600386901b1c1916600185901b1785556124ab565b600085815260208120601f198616915b8281101561254457888601518255948401946001909101908401612525565b50858210156125625787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b818103818111156108b3576108b36123d9565b600082601f83011261259657600080fd5b815160206125a6612343836122d8565b82815260059290921b840181019181810190868411156125c557600080fd5b8286015b848110156125e057805183529183019183016125c9565b509695505050505050565b60008060006060848603121561260057600080fd5b83516001600160401b038082111561261757600080fd5b61262387838801612585565b9450602086015191508082111561263957600080fd5b61264587838801612585565b9350604086015191508082111561265b57600080fd5b5061266886828701612585565b9150509250925092565b60008261268f57634e487b7160e01b600052601260045260246000fd5b500690565b808201808211156108b3576108b36123d9565b60008084546126b581612408565b600182811680156126cd57600181146126e257612711565b60ff1984168752821515830287019450612711565b8860005260208060002060005b858110156127085781548a8201529084019082016126ef565b50505082870194505b505050508351612725818360208801611f9e565b01949350505050565b60006020828403121561274057600080fd5b81516001600160401b0381111561275657600080fd5b611e9984828501612585565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061279590830184611fc2565b9695505050505050565b6000602082840312156127b157600080fd5b8151611f9781611f6156feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220a0fc48e08f15cbf0bbd38c0f01a0b815f049521a312409f80fb28185f95717d364736f6c6343000812003368747470733a2f2f77686974657261626269742e6d7970696e6174612e636c6f75642f697066732f

Deployed Bytecode

0x6080604052600436106101c45760003560e01c80634f6ccce7116100f6578063995c85631161008f578063bdfa08eb11610061578063bdfa08eb14610574578063c42b2d1714610594578063c87b56dd146105b4578063e985e9c5146105d457005b8063995c8563146104db578063a22cb465146104fb578063b88d4fde1461051b578063b91816111461053b57005b80636c0360eb116100c85780636c0360eb1461047157806370a08231146104865780637f7512c3146104a657806395d89b41146104c657005b80634f6ccce7146103e25780635150d2981461040257806355f804b3146104315780636352211e1461045157005b806323b872dd11610168578063374a8af71161013a578063374a8af71461036257806342842e0e1461038257806347d0d4e3146103a25780634cd0dda7146103c257005b806323b872dd146102e2578063253c8bd4146103025780632bfe8742146103225780632f745c591461034257005b8063081812fc116101a1578063081812fc1461024b578063095ea7b31461028357806318160ddd146102a357806322bb3e1b146102c257005b806301393a7a146101cd57806301ffc9a7146101f957806306fdde031461022957005b366101cb57005b005b3480156101d957600080fd5b506101e26105f4565b6040516101f0929190611f33565b60405180910390f35b34801561020557600080fd5b50610219610214366004611f7a565b61084c565b60405190151581526020016101f0565b34801561023557600080fd5b5061023e6108b9565b6040516101f09190611fee565b34801561025757600080fd5b5061026b610266366004612001565b610947565b6040516001600160a01b0390911681526020016101f0565b34801561028f57600080fd5b506101cb61029e366004612036565b61098d565b3480156102af57600080fd5b506006545b6040519081526020016101f0565b3480156102ce57600080fd5b506101cb6102dd36600461211d565b610a66565b3480156102ee57600080fd5b506101cb6102fd366004612163565b610ad0565b34801561030e57600080fd5b506101cb61031d36600461219f565b610ce3565b34801561032e57600080fd5b506101cb61033d3660046121ba565b610d49565b34801561034e57600080fd5b506102b461035d366004612036565b610db8565b34801561036e57600080fd5b506101cb61037d366004612001565b610e4b565b34801561038e57600080fd5b506101cb61039d366004612163565b611278565b3480156103ae57600080fd5b506101cb6103bd366004612001565b611293565b3480156103ce57600080fd5b5060095461026b906001600160a01b031681565b3480156103ee57600080fd5b506102b46103fd366004612001565b6113ee565b34801561040e57600080fd5b5061042261041d366004612001565b61141c565b6040516101f0939291906121f6565b34801561043d57600080fd5b506101cb61044c366004612229565b61149c565b34801561045d57600080fd5b5061026b61046c366004612001565b6114f0565b34801561047d57600080fd5b5061023e61158b565b34801561049257600080fd5b506102b46104a136600461219f565b611598565b3480156104b257600080fd5b506101cb6104c136600461219f565b61160a565b3480156104d257600080fd5b5061023e611660565b3480156104e757600080fd5b506102196104f6366004612001565b61166d565b34801561050757600080fd5b506101cb6105163660046121ba565b611679565b34801561052757600080fd5b506101cb61053636600461225d565b61170e565b34801561054757600080fd5b5061021961055636600461219f565b6001600160a01b031660009081526020819052604090205460ff1690565b34801561058057600080fd5b506101cb61058f3660046122fb565b611748565b3480156105a057600080fd5b50600a5461026b906001600160a01b031681565b3480156105c057600080fd5b5061023e6105cf366004612001565b611826565b3480156105e057600080fd5b506102196105ef366004612390565b611943565b6006546060908190806001600160401b0381111561061457610614612060565b60405190808252806020026020018201604052801561063d578160200160208202803683370190505b509250806001600160401b0381111561065857610658612060565b604051908082528060200260200182016040528015610681578160200160208202803683370190505b50915060005b81811015610750576000818152600b602052604090206001015460ff166106f5576000818152600b6020526040812080549091906106c7576106c76123c3565b90600052602060002001548482815181106106e4576106e46123c3565b60200260200101818152505061073e565b6000818152600b602052604081208054909190610714576107146123c3565b9060005260206000200154838281518110610731576107316123c3565b6020026020010181815250505b80610748816123ef565b915050610687565b5060008060005b83811015610841576000801b868281518110610775576107756123c3565b6020026020010151146107c757858181518110610794576107946123c3565b60200260200101518684815181106107ae576107ae6123c3565b6020908102919091010152826107c3816123ef565b9350505b6000801b8582815181106107dd576107dd6123c3565b60200260200101511461082f578481815181106107fc576107fc6123c3565b6020026020010151858381518110610816576108166123c3565b60209081029190910101528161082b816123ef565b9250505b80610839816123ef565b915050610757565b509084528252509091565b60006301ffc9a760e01b6001600160e01b03198316148061087d57506380ac58cd60e01b6001600160e01b03198316145b80610898575063780e9d6360e01b6001600160e01b03198316145b806108b35750635b5e139f60e01b6001600160e01b03198316145b92915050565b600280546108c690612408565b80601f01602080910402602001604051908101604052809291908181526020018280546108f290612408565b801561093f5780601f106109145761010080835404028352916020019161093f565b820191906000526020600020905b81548152906001019060200180831161092257829003601f168201915b505050505081565b6000610954826006541190565b610971576040516333d1c03960e21b815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b6000610998826114f0565b9050806001600160a01b0316836001600160a01b0316036109cc5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b038216148015906109ec57506109ea8133611943565b155b15610a0a576040516367d9dca160e11b815260040160405180910390fd5b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b3360009081526020819052604090205460ff1680610a8e57506001546001600160a01b031633145b610ab35760405162461bcd60e51b8152600401610aaa90612442565b60405180910390fd5b6000828152600560205260409020610acb82826124b3565b505050565b610adb816006541190565b610af857604051636f96cda160e11b815260040160405180910390fd5b826001600160a01b0316610b0b826114f0565b6001600160a01b031614610b315760405162a1148160e81b815260040160405180910390fd5b6001600160a01b038216610b5857604051633a954ecd60e21b815260040160405180910390fd5b6000336001600160a01b0385161480610b8a5750610b7582610947565b6001600160a01b0316336001600160a01b0316145b80610b9a5750610b9a8433611943565b905080610bba57604051632ce44b5f60e11b815260040160405180910390fd5b600082815260076020526040902080546001600160a01b03191690556006805484919084908110610bed57610bed6123c3565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600082118015610c5c575060006006610c35600185612572565b81548110610c4557610c456123c3565b6000918252602090912001546001600160a01b0316145b15610cae57836006610c6f600185612572565b81548110610c7f57610c7f6123c3565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b81836001600160a01b0316856001600160a01b03166000805160206127bd83398151915260405160405180910390a450505050565b3360009081526020819052604090205460ff1680610d0b57506001546001600160a01b031633145b610d275760405162461bcd60e51b8152600401610aaa90612442565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526020819052604090205460ff1680610d7157506001546001600160a01b031633145b610d8d5760405162461bcd60e51b8152600401610aaa90612442565b6001600160a01b03919091166000908152602081905260409020805460ff1916911515919091179055565b6000610dc383611598565b8210610de2576040516306ed618760e11b815260040160405180910390fd5b6006546000905b80831015610e3257610dfa836114f0565b6001600160a01b0316856001600160a01b031603610e2757838203610e205750506108b3565b6001909101905b600190920191610de9565b604051637339954760e01b815260040160405180910390fd5b6001546001600160a01b03163314610e755760405162461bcd60e51b8152600401610aaa90612442565b60068054600a5460408051630d6fcb8160e41b81529051606092839283926001600160a01b039092169163d6fcb810916004808201926000929091908290030181865afa158015610eca573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ef291908101906125eb565b919450925090506000856001600160401b03811115610f1357610f13612060565b604051908082528060200260200182016040528015610f3c578160200160208202803683370190505b50905081825188604051602001610f5591815260200190565b6040516020818303038152906040528051906020012060001c610f789190612672565b81518110610f8857610f886123c3565b602002602001015181600081518110610fa357610fa36123c3565b602090810291909101015282518390610fbd896001612694565b604051602001610fcf91815260200190565b6040516020818303038152906040528051906020012060001c610ff29190612672565b81518110611002576110026123c3565b60200260200101518160018151811061101d5761101d6123c3565b602090810291909101015282518390611037896002612694565b60405160200161104991815260200190565b6040516020818303038152906040528051906020012060001c61106c9190612672565b8151811061107c5761107c6123c3565b602002602001015181600281518110611097576110976123c3565b6020908102919091010152835184906110b1896003612694565b6040516020016110c391815260200190565b6040516020818303038152906040528051906020012060001c6110e69190612672565b815181106110f6576110f66123c3565b602002602001015181600381518110611111576111116123c3565b60209081029190910101528351849061112b896004612694565b60405160200161113d91815260200190565b6040516020818303038152906040528051906020012060001c6111609190612672565b81518110611170576111706123c3565b60200260200101518160048151811061118b5761118b6123c3565b6020908102919091010152835184906111a5896005612694565b6040516020016111b791815260200190565b6040516020818303038152906040528051906020012060001c6111da9190612672565b815181106111ea576111ea6123c3565b602002602001015181600581518110611205576112056123c3565b6020908102919091018101919091526040805180820182528381526000818401819052888152600b84529190912081518051929391926112489284920190611ea1565b50602091909101516001918201805460ff191691151591909117905561126f903090611971565b50505050505050565b610acb8383836040518060200160405280600081525061170e565b600154600160a01b900460ff16156112d95760405162461bcd60e51b81526020600482015260096024820152681c99595b9d1c985b9d60ba1b6044820152606401610aaa565b6001805460ff60a01b1916600160a01b1781556000828152600b60205260409020015460ff16156113435760405162461bcd60e51b815260206004820152601460248201527313919508185b1c9958591e4818dbdb5c1bdcd95960621b6044820152606401610aaa565b600061134f8233611a8e565b90508015611385576000828152600b602052604090206001908101805460ff19169091179055611380303384611bfd565b6113dd565b60405162461bcd60e51b815260206004820152602760248201527f596f7520646f6e2774206f776e20616c6c2074686520706965636573206f66206044820152661d1a194813919560ca1b6064820152608401610aaa565b50506001805460ff60a01b19169055565b60006113f960065490565b8210611418576040516329c8c00760e21b815260040160405180910390fd5b5090565b6000818152600b60205260408120600181015460609291829160ff16611441866114f0565b82546040805160208084028201810190925282815291859183018282801561148857602002820191906000526020600020905b815481526020019060010190808311611474575b505050505092509250925092509193909250565b3360009081526020819052604090205460ff16806114c457506001546001600160a01b031633145b6114e05760405162461bcd60e51b8152600401610aaa90612442565b60046114ec82826124b3565b5050565b60006114fd826006541190565b61151a57604051636f96cda160e11b815260040160405180910390fd5b60006001600160a01b031660068381548110611538576115386123c3565b6000918252602090912001546001600160a01b0316146115805760068281548110611565576115656123c3565b6000918252602090912001546001600160a01b031692915050565b60019091019061151a565b600480546108c690612408565b60006001600160a01b0382166115c1576040516323d3ad8160e21b815260040160405180910390fd5b600654600090815b81811015611601576115da816114f0565b6001600160a01b0316856001600160a01b0316036115f9576001909201915b6001016115c9565b50909392505050565b6001546001600160a01b031633146116345760405162461bcd60e51b8152600401610aaa90612442565b600980546001600160a01b039092166001600160a01b03199283168117909155600a8054909216179055565b600380546108c690612408565b60006108b38233611a8e565b336001600160a01b038316036116a25760405163b06307db60e01b815260040160405180910390fd5b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611719848484610ad0565b61172584848484611d9c565b611742576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6001546001600160a01b031633146117725760405162461bcd60e51b8152600401610aaa90612442565b80516006146117c35760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964206e756d626572206f662070696563657300000000000000006044820152606401610aaa565b6006546117d1306001611971565b60408051808201825283815260006020808301829052848252600b815292902081518051929391926118069284920190611ea1565b50602091909101516001909101805460ff19169115159190911790555050565b6060611833826006541190565b61187f5760405162461bcd60e51b815260206004820152601b60248201527f5552495175657279466f724e6f6e6578697374656e74546f6b656e00000000006044820152606401610aaa565b6000828152600560205260408120805461189890612408565b80601f01602080910402602001604051908101604052809291908181526020018280546118c490612408565b80156119115780601f106118e657610100808354040283529160200191611911565b820191906000526020600020905b8154815290600101906020018083116118f457829003601f168201915b5050505050905060048160405160200161192c9291906126a7565b604051602081830303815290604052915050919050565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b6001600160a01b03821661199757604051622e076360e81b815260040160405180910390fd5b806000036119b85760405163b562e8dd60e01b815260040160405180910390fd5b60065460005b60018303811015611a04576006805460010181556000908152604051838301916001600160a01b038716916000805160206127bd833981519152908290a46001016119be565b5060068054600180820183556000929092527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0319166001600160a01b038616179055611a5b9083612572565b611a659082612694565b6040516001600160a01b038516906000906000805160206127bd833981519152908290a4505050565b6000828152600b6020908152604080832080548251818502810185019093528083528493830182828015611ae157602002820191906000526020600020905b815481526020019060010190808311611acd575b5050600a54604051631d808f8160e31b81526001600160a01b038981166004830152959650600095909116935063ec047c0892506024019050600060405180830381865afa158015611b37573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611b5f919081019061272e565b9050600160005b8351811015611bf3576000805b8451811015611bd057848181518110611b8e57611b8e6123c3565b6020026020010151868481518110611ba857611ba86123c3565b602002602001015103611bbe5760019150611bd0565b80611bc8816123ef565b915050611b73565b5080611be0576000925050611bf3565b5080611beb816123ef565b915050611b66565b5095945050505050565b826001600160a01b031660068281548110611c1a57611c1a6123c3565b6000918252602090912001546001600160a01b031614611c4c5760405162a1148160e81b815260040160405180910390fd5b611c57816006541190565b611c7457604051636f96cda160e11b815260040160405180910390fd5b600081815260076020526040902080546001600160a01b03191690556006805483919083908110611ca757611ca76123c3565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600081118015611d16575060006006611cef600184612572565b81548110611cff57611cff6123c3565b6000918252602090912001546001600160a01b0316145b15611d6857826006611d29600184612572565b81548110611d3957611d396123c3565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b80826001600160a01b0316846001600160a01b03166000805160206127bd83398151915260405160405180910390a4505050565b6000836001600160a01b03163b600003611db857506001611e99565b604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611dea903390899088908890600401612762565b6020604051808303816000875af1925050508015611e25575060408051601f3d908101601f19168201909252611e229181019061279f565b60015b611e83573d808015611e53576040519150601f19603f3d011682016040523d82523d6000602084013e611e58565b606091505b508051600003611e7b576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b828054828255906000526020600020908101928215611edc579160200282015b82811115611edc578251825591602001919060010190611ec1565b506114189291505b808211156114185760008155600101611ee4565b600081518084526020808501945080840160005b83811015611f2857815187529582019590820190600101611f0c565b509495945050505050565b604081526000611f466040830185611ef8565b8281036020840152611f588185611ef8565b95945050505050565b6001600160e01b031981168114611f7757600080fd5b50565b600060208284031215611f8c57600080fd5b8135611f9781611f61565b9392505050565b60005b83811015611fb9578181015183820152602001611fa1565b50506000910152565b60008151808452611fda816020860160208601611f9e565b601f01601f19169290920160200192915050565b602081526000611f976020830184611fc2565b60006020828403121561201357600080fd5b5035919050565b80356001600160a01b038116811461203157600080fd5b919050565b6000806040838503121561204957600080fd5b6120528361201a565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561209e5761209e612060565b604052919050565b60006001600160401b038311156120bf576120bf612060565b6120d2601f8401601f1916602001612076565b90508281528383830111156120e657600080fd5b828260208301376000602084830101529392505050565b600082601f83011261210e57600080fd5b611f97838335602085016120a6565b6000806040838503121561213057600080fd5b8235915060208301356001600160401b0381111561214d57600080fd5b612159858286016120fd565b9150509250929050565b60008060006060848603121561217857600080fd5b6121818461201a565b925061218f6020850161201a565b9150604084013590509250925092565b6000602082840312156121b157600080fd5b611f978261201a565b600080604083850312156121cd57600080fd5b6121d68361201a565b9150602083013580151581146121eb57600080fd5b809150509250929050565b6060815260006122096060830186611ef8565b9315156020830152506001600160a01b0391909116604090910152919050565b60006020828403121561223b57600080fd5b81356001600160401b0381111561225157600080fd5b611e99848285016120fd565b6000806000806080858703121561227357600080fd5b61227c8561201a565b935061228a6020860161201a565b92506040850135915060608501356001600160401b038111156122ac57600080fd5b8501601f810187136122bd57600080fd5b6122cc878235602084016120a6565b91505092959194509250565b60006001600160401b038211156122f1576122f1612060565b5060051b60200190565b6000602080838503121561230e57600080fd5b82356001600160401b0381111561232457600080fd5b8301601f8101851361233557600080fd5b8035612348612343826122d8565b612076565b81815260059190911b8201830190838101908783111561236757600080fd5b928401925b828410156123855783358252928401929084019061236c565b979650505050505050565b600080604083850312156123a357600080fd5b6123ac8361201a565b91506123ba6020840161201a565b90509250929050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201612401576124016123d9565b5060010190565b600181811c9082168061241c57607f821691505b60208210810361243c57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252600990820152683737ba1037bbb732b960b91b604082015260600190565b601f821115610acb57600081815260208120601f850160051c8101602086101561248c5750805b601f850160051c820191505b818110156124ab57828155600101612498565b505050505050565b81516001600160401b038111156124cc576124cc612060565b6124e0816124da8454612408565b84612465565b602080601f83116001811461251557600084156124fd5750858301515b600019600386901b1c1916600185901b1785556124ab565b600085815260208120601f198616915b8281101561254457888601518255948401946001909101908401612525565b50858210156125625787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b818103818111156108b3576108b36123d9565b600082601f83011261259657600080fd5b815160206125a6612343836122d8565b82815260059290921b840181019181810190868411156125c557600080fd5b8286015b848110156125e057805183529183019183016125c9565b509695505050505050565b60008060006060848603121561260057600080fd5b83516001600160401b038082111561261757600080fd5b61262387838801612585565b9450602086015191508082111561263957600080fd5b61264587838801612585565b9350604086015191508082111561265b57600080fd5b5061266886828701612585565b9150509250925092565b60008261268f57634e487b7160e01b600052601260045260246000fd5b500690565b808201808211156108b3576108b36123d9565b60008084546126b581612408565b600182811680156126cd57600181146126e257612711565b60ff1984168752821515830287019450612711565b8860005260208060002060005b858110156127085781548a8201529084019082016126ef565b50505082870194505b505050508351612725818360208801611f9e565b01949350505050565b60006020828403121561274057600080fd5b81516001600160401b0381111561275657600080fd5b611e9984828501612585565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061279590830184611fc2565b9695505050505050565b6000602082840312156127b157600080fd5b8151611f9781611f6156feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220a0fc48e08f15cbf0bbd38c0f01a0b815f049521a312409f80fb28185f95717d364736f6c63430008120033

Deployed Bytecode Sourcemap

4655:19258:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18056:1422;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;6619:426;;;;;;;;;;-1:-1:-1;6619:426:0;;;;;:::i;:::-;;:::i;:::-;;;1475:14:1;;1468:22;1450:41;;1438:2;1423:18;6619:426:0;1310:187:1;4895:39:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;10725:203::-;;;;;;;;;;-1:-1:-1;10725:203:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2607:32:1;;;2589:51;;2577:2;2562:18;10725:203:0;2443::1;10277:382:0;;;;;;;;;;-1:-1:-1;10277:382:0;;;;;:::i;:::-;;:::i;7311:93::-;;;;;;;;;;-1:-1:-1;7382:7:0;:14;7311:93;;;3234:25:1;;;3222:2;3207:18;7311:93:0;3088:177:1;5218:133:0;;;;;;;;;;-1:-1:-1;5218:133:0;;;;;:::i;:::-;;:::i;11567:1011::-;;;;;;;;;;-1:-1:-1;11567:1011:0;;;;;:::i;:::-;;:::i;1394:93::-;;;;;;;;;;-1:-1:-1;1394:93:0;;;;;:::i;:::-;;:::i;896:106::-;;;;;;;;;;-1:-1:-1;896:106:0;;;;;:::i;:::-;;:::i;7643:634::-;;;;;;;;;;-1:-1:-1;7643:634:0;;;;;:::i;:::-;;:::i;22038:1215::-;;;;;;;;;;-1:-1:-1;22038:1215:0;;;;;:::i;:::-;;:::i;13330:166::-;;;;;;;;;;-1:-1:-1;13330:166:0;;;;;:::i;:::-;;:::i;19574:629::-;;;;;;;;;;-1:-1:-1;19574:629:0;;;;;:::i;:::-;;:::i;17254:30::-;;;;;;;;;;-1:-1:-1;17254:30:0;;;;-1:-1:-1;;;;;17254:30:0;;;8354:175;;;;;;;;;;-1:-1:-1;8354:175:0;;;;;:::i;:::-;;:::i;17542:401::-;;;;;;;;;;-1:-1:-1;17542:401:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;5113:97::-;;;;;;;;;;-1:-1:-1;5113:97:0;;;;;:::i;:::-;;:::i;9735:480::-;;;;;;;;;;-1:-1:-1;9735:480:0;;;;;:::i;:::-;;:::i;4985:66::-;;;;;;;;;;;;;:::i;8990:497::-;;;;;;;;;;-1:-1:-1;8990:497:0;;;;;:::i;:::-;;:::i;21422:149::-;;;;;;;;;;-1:-1:-1;21422:149:0;;;;;:::i;:::-;;:::i;4941:31::-;;;;;;;;;;;;;:::i;20211:126::-;;;;;;;;;;-1:-1:-1;20211:126:0;;;;;:::i;:::-;;:::i;11000:272::-;;;;;;;;;;-1:-1:-1;11000:272:0;;;;;:::i;:::-;;:::i;13567:295::-;;;;;;;;;;-1:-1:-1;13567:295:0;;;;;:::i;:::-;;:::i;791:99::-;;;;;;;;;;-1:-1:-1;791:99:0;;;;;:::i;:::-;-1:-1:-1;;;;;869:13:0;845:4;869:13;;;;;;;;;;;;;;791:99;21648:299;;;;;;;;;;-1:-1:-1;21648:299:0;;;;;:::i;:::-;;:::i;17291:23::-;;;;;;;;;;-1:-1:-1;17291:23:0;;;;-1:-1:-1;;;;;17291:23:0;;;5359:262;;;;;;;;;;-1:-1:-1;5359:262:0;;;;;:::i;:::-;;:::i;11343:157::-;;;;;;;;;;-1:-1:-1;11343:157:0;;;;;:::i;:::-;;:::i;18056:1422::-;18271:7;:14;18109:30;;;;18271:14;-1:-1:-1;;;;;18312:22:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18312:22:0;;18296:38;;18383:7;-1:-1:-1;;;;;18369:22:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18369:22:0;;18345:46;;18407:9;18402:328;18426:7;18422:1;:11;18402:328;;;18511:15;;;;:12;:15;;;;;:24;;;;;18506:213;;18575:15;;;;:12;:15;;;;;:30;;:15;;;:30;;;;:::i;:::-;;;;;;;;;18556:13;18570:1;18556:16;;;;;;;;:::i;:::-;;;;;;:49;;;;;18506:213;;;18673:15;;;;:12;:15;;;;;:30;;:15;;;:30;;;;:::i;:::-;;;;;;;;;18646:21;18668:1;18646:24;;;;;;;;:::i;:::-;;;;;;:57;;;;;18506:213;18435:3;;;;:::i;:::-;;;;18402:328;;;;18774:27;18816:35;18871:9;18866:446;18890:7;18886:1;:11;18866:446;;;18951:1;18943:10;;18923:13;18937:1;18923:16;;;;;;;;:::i;:::-;;;;;;;:30;18919:164;;19011:13;19025:1;19011:16;;;;;;;;:::i;:::-;;;;;;;18974:13;18988:19;18974:34;;;;;;;;:::i;:::-;;;;;;;;;;:53;19046:21;;;;:::i;:::-;;;;18919:164;19137:1;19129:10;;19101:21;19123:1;19101:24;;;;;;;;:::i;:::-;;;;;;;:38;19097:204;;19213:21;19235:1;19213:24;;;;;;;;:::i;:::-;;;;;;;19160:21;19182:27;19160:50;;;;;;;;:::i;:::-;;;;;;;;;;:77;19256:29;;;;:::i;:::-;;;;19097:204;18899:3;;;;:::i;:::-;;;;18866:446;;;-1:-1:-1;19346:42:0;;;19402:58;;-1:-1:-1;19353:13:0;;18056:1422::o;6619:426::-;6695:4;-1:-1:-1;;;;;;;;;6732:25:0;;;;:101;;-1:-1:-1;;;;;;;;;;6808:25:0;;;6732:101;:177;;;-1:-1:-1;;;;;;;;;;6884:25:0;;;6732:177;:263;;;-1:-1:-1;;;;;;;;;;6970:25:0;;;6732:263;6712:283;6619:426;-1:-1:-1;;6619:426:0:o;4895:39::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;10725:203::-;10792:7;10817:16;10825:7;14034;:14;-1:-1:-1;14024:24:0;13935:121;10817:16;10812:64;;10842:34;;-1:-1:-1;;;10842:34:0;;;;;;;;;;;10812:64;-1:-1:-1;10896:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;10896:24:0;;10725:203::o;10277:382::-;10349:14;10366:16;10374:7;10366;:16::i;:::-;10349:33;;10403:6;-1:-1:-1;;;;;10397:12:0;:2;-1:-1:-1;;;;;10397:12:0;;10393:49;;10418:24;;-1:-1:-1;;;10418:24:0;;;;;;;;;;;10393:49;10459:10;-1:-1:-1;;;;;10459:20:0;;;;;;:61;;;10484:36;10501:6;10509:10;10484:16;:36::i;:::-;10483:37;10459:61;10455:109;;;10529:35;;-1:-1:-1;;;10529:35:0;;;;;;;;;;;10455:109;10577:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;10577:29:0;-1:-1:-1;;;;;10577:29:0;;;;;;;;;10622;;10577:24;;10622:29;;;;;;;10338:321;10277:382;;:::o;5218:133::-;1056:10;1048:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;1083:5:0;;-1:-1:-1;;;;;1083:5:0;1071:10;:17;1048:40;1039:63;;;;-1:-1:-1;;;1039:63:0;;;;;;;:::i;:::-;;;;;;;;;5312:19:::1;::::0;;;:10:::1;:19;::::0;;;;:31:::1;5334:9:::0;5312:19;:31:::1;:::i;:::-;;5218:133:::0;;:::o;11567:1011::-;11697:16;11705:7;14034;:14;-1:-1:-1;14024:24:0;13935:121;11697:16;11692:61;;11722:31;;-1:-1:-1;;;11722:31:0;;;;;;;;;;;11692:61;11788:4;-1:-1:-1;;;;;11768:24:0;:16;11776:7;11768;:16::i;:::-;-1:-1:-1;;;;;11768:24:0;;11764:65;;11801:28;;-1:-1:-1;;;11801:28:0;;;;;;;;;;;11764:65;-1:-1:-1;;;;;11844:16:0;;11840:52;;11869:23;;-1:-1:-1;;;11869:23:0;;;;;;;;;;;11840:52;11905:22;11931:10;-1:-1:-1;;;;;11931:18:0;;;;:69;;;11980:20;11992:7;11980:11;:20::i;:::-;-1:-1:-1;;;;;11966:34:0;:10;-1:-1:-1;;;;;11966:34:0;;11931:69;:120;;;;12017:34;12034:4;12040:10;12017:16;:34::i;:::-;11905:147;;12068:17;12063:66;;12094:35;;-1:-1:-1;;;12094:35:0;;;;;;;;;;;12063:66;12204:24;;;;:15;:24;;;;;12197:31;;-1:-1:-1;;;;;;12197:31:0;;;12239:7;:16;;12258:2;;12239:7;12220;;12239:16;;;;;;:::i;:::-;;;;;;;;;:21;;;;;-1:-1:-1;;;;;12239:21:0;;;;;-1:-1:-1;;;;;12239:21:0;;;;;;12431:1;12421:7;:11;:49;;;;-1:-1:-1;12468:1:0;12436:7;12444:11;12454:1;12444:7;:11;:::i;:::-;12436:20;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;12436:20:0;:34;12421:49;12417:109;;;12510:4;12487:7;12495:11;12505:1;12495:7;:11;:::i;:::-;12487:20;;;;;;;;:::i;:::-;;;;;;;;;:27;;;;;-1:-1:-1;;;;;12487:27:0;;;;;-1:-1:-1;;;;;12487:27:0;;;;;;12417:109;12562:7;12558:2;-1:-1:-1;;;;;12543:27:0;12552:4;-1:-1:-1;;;;;12543:27:0;-1:-1:-1;;;;;;;;;;;12543:27:0;;;;;;;;;11681:897;11567:1011;;;:::o;1394:93::-;1056:10;1048:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;1083:5:0;;-1:-1:-1;;;;;1083:5:0;1071:10;:17;1048:40;1039:63;;;;-1:-1:-1;;;1039:63:0;;;;;;;:::i;:::-;1462:5:::1;:17:::0;;-1:-1:-1;;;;;;1462:17:0::1;-1:-1:-1::0;;;;;1462:17:0;;;::::1;::::0;;;::::1;::::0;;1394:93::o;896:106::-;1056:10;1048:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;1083:5:0;;-1:-1:-1;;;;;1083:5:0;1071:10;:17;1048:40;1039:63;;;;-1:-1:-1;;;1039:63:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;973:13:0;;;::::1;:7;:13:::0;;;::::1;::::0;;;;;;:21;;-1:-1:-1;;973:21:0::1;::::0;::::1;;::::0;;;::::1;::::0;;896:106::o;7643:634::-;7732:15;7773:17;7783:6;7773:9;:17::i;:::-;7764:5;:26;7760:62;;7799:23;;-1:-1:-1;;;7799:23:0;;;;;;;;;;;7760:62;7873:7;:14;7835:13;;7993:218;8017:3;8007:7;:13;7993:218;;;8066:16;8074:7;8066;:16::i;:::-;-1:-1:-1;;;;;8056:26:0;:6;-1:-1:-1;;;;;8056:26:0;;8052:144;;8120:5;8111;:14;8107:69;;8127:14;;;;8107:69;8169:7;;;;;8107:69;8022:9;;;;;7993:218;;;8241:28;;-1:-1:-1;;;8241:28:0;;;;;;;;;;;22038:1215;1200:5;;-1:-1:-1;;;;;1200:5:0;1188:10;:17;1180:39;;;;-1:-1:-1;;;1180:39:0;;;;;;;:::i;:::-;22130:1:::1;22160:14:::0;;22378:8:::1;::::0;:23:::1;::::0;;-1:-1:-1;;;22378:23:0;;;;22243:24:::1;::::0;;;;;-1:-1:-1;;;;;22378:8:0;;::::1;::::0;:21:::1;::::0;:23:::1;::::0;;::::1;::::0;22110:17:::1;::::0;22378:23;;;;;;;;:8;:23:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;22378:23:0::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;22348:53:::0;;-1:-1:-1;22348:53:0;-1:-1:-1;22348:53:0;-1:-1:-1;22478:28:0::1;22523:12:::0;-1:-1:-1;;;;;22509:27:0;::::1;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;22509:27:0::1;;22478:58;;22564:5;22612;:12;22602:4;22585:22;;;;;;13711:19:1::0;;13755:2;13746:12;;13582:182;22585:22:0::1;;;;;;;;;;;;;22575:33;;;;;;22570:39;;:54;;;;:::i;:::-;22564:61;;;;;;;;:::i;:::-;;;;;;;22547:11;22559:1;22547:14;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:78;22709:16;;22653:9;;22695:8:::1;:4:::0;22702:1:::1;22695:8;:::i;:::-;22678:26;;;;;;13711:19:1::0;;13755:2;13746:12;;13582:182;22678:26:0::1;;;;;;;;;;;;;22668:37;;;;;;22663:43;;:62;;;;:::i;:::-;22653:73;;;;;;;;:::i;:::-;;;;;;;22636:11;22648:1;22636:14;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:90;22810:16;;22754:9;;22796:8:::1;:4:::0;22803:1:::1;22796:8;:::i;:::-;22779:26;;;;;;13711:19:1::0;;13755:2;13746:12;;13582:182;22779:26:0::1;;;;;;;;;;;;;22769:37;;;;;;22764:43;;:62;;;;:::i;:::-;22754:73;;;;;;;;:::i;:::-;;;;;;;22737:11;22749:1;22737:14;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:90;22909:14;;22855:7;;22895:8:::1;:4:::0;22902:1:::1;22895:8;:::i;:::-;22878:26;;;;;;13711:19:1::0;;13755:2;13746:12;;13582:182;22878:26:0::1;;;;;;;;;;;;;22868:37;;;;;;22863:43;;:60;;;;:::i;:::-;22855:69;;;;;;;;:::i;:::-;;;;;;;22838:11;22850:1;22838:14;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:86;23006:14;;22952:7;;22992:8:::1;:4:::0;22999:1:::1;22992:8;:::i;:::-;22975:26;;;;;;13711:19:1::0;;13755:2;13746:12;;13582:182;22975:26:0::1;;;;;;;;;;;;;22965:37;;;;;;22960:43;;:60;;;;:::i;:::-;22952:69;;;;;;;;:::i;:::-;;;;;;;22935:11;22947:1;22935:14;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:86;23103:14;;23049:7;;23089:8:::1;:4:::0;23096:1:::1;23089:8;:::i;:::-;23072:26;;;;;;13711:19:1::0;;13755:2;13746:12;;13582:182;23072:26:0::1;;;;;;;;;;;;;23062:37;;;;;;23057:43;;:60;;;;:::i;:::-;23049:69;;;;;;;;:::i;:::-;;;;;;;23032:11;23044:1;23032:14;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;:86;;;;23179:32:::1;::::0;;;;::::1;::::0;;;;;-1:-1:-1;23179:32:0;;::::1;::::0;;;23155:21;;;:12:::1;:21:::0;;;;;;:56;;;;23179:32;;23155:21;;:56:::1;::::0;:21;;:56:::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;23155:56:0::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;::::0;;-1:-1:-1;;23155:56:0::1;::::0;::::1;;::::0;;;::::1;::::0;;23222:23:::1;::::0;23236:4:::1;::::0;23222:5:::1;:23::i;:::-;22099:1154;;;;;;22038:1215:::0;:::o;13330:166::-;13454:34;13471:4;13477:2;13481;13454:34;;;;;;;;;;;;:16;:34::i;19574:629::-;1299:6;;-1:-1:-1;;;1299:6:0;;;;1298:7;1290:29;;;;-1:-1:-1;;;1290:29:0;;14315:2:1;1290:29:0;;;14297:21:1;14354:1;14334:18;;;14327:29;-1:-1:-1;;;14372:18:1;;;14365:39;14421:18;;1290:29:0;14113:332:1;1290:29:0;1339:4;1330:13;;-1:-1:-1;;;;1330:13:0;-1:-1:-1;;;1330:13:0;;;;19698:21;;;:12:::1;:21;::::0;;;;:30:::1;::::0;1330:13;19698:30:::1;19697:31;19689:64;;;::::0;-1:-1:-1;;;19689:64:0;;14652:2:1;19689:64:0::1;::::0;::::1;14634:21:1::0;14691:2;14671:18;;;14664:30;-1:-1:-1;;;14710:18:1;;;14703:50;14770:18;;19689:64:0::1;14450:344:1::0;19689:64:0::1;19837:20;19860:34;19874:7;19883:10;19860:13;:34::i;:::-;19837:57;;19965:15;19961:235;;;19997:21;::::0;;;:12:::1;:21;::::0;;;;20030:4:::1;19997:30:::0;;::::1;:37:::0;;-1:-1:-1;;19997:37:0::1;::::0;;::::1;::::0;;20049:53:::1;20075:4;20082:10;20010:7:::0;20049:17:::1;:53::i;:::-;19961:235;;;20135:49;::::0;-1:-1:-1;;;20135:49:0;;15001:2:1;20135:49:0::1;::::0;::::1;14983:21:1::0;15040:2;15020:18;;;15013:30;15079:34;15059:18;;;15052:62;-1:-1:-1;;;15130:18:1;;;15123:37;15177:19;;20135:49:0::1;14799:403:1::0;19961:235:0::1;-1:-1:-1::0;;1366:6:0;:14;;-1:-1:-1;;;;1366:14:0;;;19574:629::o;8354:175::-;8420:7;8453:13;7382:7;:14;;7311:93;8453:13;8444:5;:22;8440:58;;8475:23;;-1:-1:-1;;;8475:23:0;;;;;;;;;;;8440:58;-1:-1:-1;8516:5:0;8354:175::o;17542:401::-;17699:13;17817:21;;;:12;:21;;;;;17869:30;;;;17604:23;;17699:13;;;17869:30;;17918:16;17830:7;17918;:16::i;:::-;17809:126;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17542:401;;;;;:::o;5113:97::-;1056:10;1048:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;1083:5:0;;-1:-1:-1;;;;;1083:5:0;1071:10;:17;1048:40;1039:63;;;;-1:-1:-1;;;1039:63:0;;;;;;;:::i;:::-;5184:7:::1;:18;5194:8:::0;5184:7;:18:::1;:::i;:::-;;5113:97:::0;:::o;9735:480::-;9798:7;9823:16;9831:7;14034;:14;-1:-1:-1;14024:24:0;13935:121;9823:16;9818:61;;9848:31;;-1:-1:-1;;;9848:31:0;;;;;;;;;;;9818:61;10065:1;-1:-1:-1;;;;;10037:30:0;:7;10045;10037:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;10037:16:0;:30;10033:102;;10099:7;10107;10099:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;10099:16:0;;9735:480;-1:-1:-1;;9735:480:0:o;10033:102::-;10003:9;;;;;9987:163;;4985:66;;;;;;;:::i;8990:497::-;9054:7;-1:-1:-1;;;;;9078:20:0;;9074:61;;9107:28;;-1:-1:-1;;;9107:28:0;;;;;;;;;;;9074:61;9186:7;:14;9148:13;;;9306:140;9326:3;9322:1;:7;9306:140;;;9369:10;9377:1;9369:7;:10::i;:::-;-1:-1:-1;;;;;9359:20:0;:6;-1:-1:-1;;;;;9359:20:0;;9355:76;;9404:7;;;;;9355:76;9331:3;;9306:140;;;-1:-1:-1;9474:5:0;;8990:497;-1:-1:-1;;;8990:497:0:o;21422:149::-;1200:5;;-1:-1:-1;;;;;1200:5:0;1188:10;:17;1180:39;;;;-1:-1:-1;;;1180:39:0;;;;;;;:::i;:::-;21498:15:::1;:26:::0;;-1:-1:-1;;;;;21498:26:0;;::::1;-1:-1:-1::0;;;;;;21498:26:0;;::::1;::::0;::::1;::::0;;;21535:8:::1;:28:::0;;;;::::1;;::::0;;21422:149::o;4941:31::-;;;;;;;:::i;20211:126::-;20271:4;20295:34;20309:7;20318:10;20295:13;:34::i;11000:272::-;11102:10;-1:-1:-1;;;;;11090:22:0;;;11086:52;;11121:17;;-1:-1:-1;;;11121:17:0;;;;;;;;;;;11086:52;11170:10;11151:30;;;;:18;:30;;;;;;;;-1:-1:-1;;;;;11151:40:0;;;;;;;;;;;;:51;;-1:-1:-1;;11151:51:0;;;;;;;;;;11218:46;;1450:41:1;;;11151:40:0;;11170:10;11218:46;;1423:18:1;11218:46:0;;;;;;;11000:272;;:::o;13567:295::-;13719:26;13732:4;13738:2;13742;13719:12;:26::i;:::-;13763:42;13786:4;13792:2;13796;13800:4;13763:22;:42::i;:::-;13758:96;;13814:40;;-1:-1:-1;;;13814:40:0;;;;;;;;;;;13758:96;13567:295;;;;:::o;21648:299::-;1200:5;;-1:-1:-1;;;;;1200:5:0;1188:10;:17;1180:39;;;;-1:-1:-1;;;1180:39:0;;;;;;;:::i;:::-;21743:11:::1;:18;21765:1;21743:23;21735:60;;;::::0;-1:-1:-1;;;21735:60:0;;15409:2:1;21735:60:0::1;::::0;::::1;15391:21:1::0;15448:2;15428:18;;;15421:30;15487:26;15467:18;;;15460:54;15531:18;;21735:60:0::1;15207:348:1::0;21735:60:0::1;21824:7;:14:::0;21849:23:::1;21863:4;21870:1;21849:5;:23::i;:::-;21907:32;::::0;;;;::::1;::::0;;;;;-1:-1:-1;21907:32:0::1;::::0;;::::1;::::0;;;21883:21;;;:12:::1;:21:::0;;;;;:56;;;;21907:32;;21883:21;;:56:::1;::::0;:21;;:56:::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;21883:56:0::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;::::0;;-1:-1:-1;;21883:56:0::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;;21648:299:0:o;5359:262::-;5415:13;5449:16;5457:7;14034;:14;-1:-1:-1;14024:24:0;13935:121;5449:16;5441:56;;;;-1:-1:-1;;;5441:56:0;;15762:2:1;5441:56:0;;;15744:21:1;15801:2;15781:18;;;15774:30;15840:29;15820:18;;;15813:57;15887:18;;5441:56:0;15560:351:1;5441:56:0;5508:22;5533:19;;;:10;:19;;;;;5508:44;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5594:7;5603:8;5577:35;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5563:50;;;5359:262;;;:::o;11343:157::-;-1:-1:-1;;;;;11456:26:0;;;11432:4;11456:26;;;:18;:26;;;;;;;;:36;;;;;;;;;;;;;;;11343:157::o;16581:628::-;-1:-1:-1;;;;;16653:16:0;;16649:48;;16678:19;;-1:-1:-1;;;16678:19:0;;;;;;;;;;;16649:48;16712:3;16719:1;16712:8;16708:39;;16729:18;;-1:-1:-1;;;16729:18:0;;;;;;;;;;;16708:39;16784:7;:14;16760:21;16906:150;16932:1;16926:3;:7;16922:1;:11;16906:150;;;16959:7;:14;;;;;;-1:-1:-1;16959:14:0;;;16997:43;;17022:17;;;;-1:-1:-1;;;;;16997:43:0;;;-1:-1:-1;;;;;;;;;;;16997:43:0;-1:-1:-1;;16997:43:0;16935:3;;16906:150;;;-1:-1:-1;17118:7:0;:16;;;;;;;;-1:-1:-1;17118:16:0;;;;;;;;-1:-1:-1;;;;;;17118:16:0;-1:-1:-1;;;;;17118:16:0;;;;;17192:7;;:3;:7;:::i;:::-;17175:25;;:13;:25;:::i;:::-;17150:51;;-1:-1:-1;;;;;17150:51:0;;;17167:1;;-1:-1:-1;;;;;;;;;;;17150:51:0;17167:1;;17150:51;16638:571;16581:628;;:::o;20345:1038::-;20424:4;20473:21;;;:12;:21;;;;;;;;20441:65;;;;;;;;;;;;;;;;;20424:4;;20441:65;;20473:21;20441:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;20549:8:0;;:31;;-1:-1:-1;;;20549:31:0;;-1:-1:-1;;;;;2607:32:1;;;20549:31:0;;;2589:51:1;20441:65:0;;-1:-1:-1;20517:29:0;;20549:8;;;;-1:-1:-1;20549:23:0;;-1:-1:-1;2562:18:1;;;-1:-1:-1;20549:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;20549:31:0;;;;;;;;;;;;:::i;:::-;20517:63;-1:-1:-1;20698:4:0;20675:20;20713:630;20734:12;:19;20730:1;:23;20713:630;;;20804:16;20882:6;20877:289;20898:12;:19;20894:1;:23;20877:289;;;20990:12;21003:1;20990:15;;;;;;;;:::i;:::-;;;;;;;20971:12;20984:1;20971:15;;;;;;;;:::i;:::-;;;;;;;:34;20967:184;;21044:4;21030:18;;21126:5;;20967:184;20919:3;;;;:::i;:::-;;;;20877:289;;;;21185:11;21180:152;;21235:5;21217:23;;21311:5;;;21180:152;-1:-1:-1;20755:3:0;;;;:::i;:::-;;;;20713:630;;;-1:-1:-1;21360:15:0;20345:1038;-1:-1:-1;;;;;20345:1038:0:o;12586:673::-;12697:4;-1:-1:-1;;;;;12677:24:0;:7;12685;12677:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;12677:16:0;:24;12673:65;;12710:28;;-1:-1:-1;;;12710:28:0;;;;;;;;;;;12673:65;12754:16;12762:7;14034;:14;-1:-1:-1;14024:24:0;13935:121;12754:16;12749:61;;12779:31;;-1:-1:-1;;;12779:31:0;;;;;;;;;;;12749:61;12885:24;;;;:15;:24;;;;;12878:31;;-1:-1:-1;;;;;;12878:31:0;;;12920:7;:16;;12939:2;;12920:7;12901;;12920:16;;;;;;:::i;:::-;;;;;;;;;:21;;;;;-1:-1:-1;;;;;12920:21:0;;;;;-1:-1:-1;;;;;12920:21:0;;;;;;13112:1;13102:7;:11;:49;;;;-1:-1:-1;13149:1:0;13117:7;13125:11;13135:1;13125:7;:11;:::i;:::-;13117:20;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;13117:20:0;:34;13102:49;13098:109;;;13191:4;13168:7;13176:11;13186:1;13176:7;:11;:::i;:::-;13168:20;;;;;;;;:::i;:::-;;;;;;;;;:27;;;;;-1:-1:-1;;;;;13168:27:0;;;;;-1:-1:-1;;;;;13168:27:0;;;;;;13098:109;13243:7;13239:2;-1:-1:-1;;;;;13224:27:0;13233:4;-1:-1:-1;;;;;13224:27:0;-1:-1:-1;;;;;;;;;;;13224:27:0;;;;;;;;;12586:673;;;:::o;14626:640::-;14781:4;14802:2;-1:-1:-1;;;;;14802:14:0;;14820:1;14802:19;14798:36;;-1:-1:-1;14830:4:0;14823:11;;14798:36;14851:70;;-1:-1:-1;;;14851:70:0;;-1:-1:-1;;;;;14851:36:0;;;;;:70;;14888:10;;14900:4;;14906:7;;14915:5;;14851:70;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14851:70:0;;;;;;;;-1:-1:-1;;14851:70:0;;;;;;;;;;;;:::i;:::-;;;14847:412;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15083:6;:13;15100:1;15083:18;15079:71;;15110:40;;-1:-1:-1;;;15110:40:0;;;;;;;;;;;15079:71;15225:6;15219:13;15210:6;15206:2;15202:15;15195:38;14847:412;-1:-1:-1;;;;;;14968:55:0;-1:-1:-1;;;14968:55:0;;-1:-1:-1;14847:412:0;14626:640;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:435:1;67:3;105:5;99:12;132:6;127:3;120:19;158:4;187:2;182:3;178:12;171:19;;224:2;217:5;213:14;245:1;255:169;269:6;266:1;263:13;255:169;;;330:13;;318:26;;364:12;;;;399:15;;;;291:1;284:9;255:169;;;-1:-1:-1;440:3:1;;14:435;-1:-1:-1;;;;;14:435:1:o;454:465::-;711:2;700:9;693:21;674:4;737:56;789:2;778:9;774:18;766:6;737:56;:::i;:::-;841:9;833:6;829:22;824:2;813:9;809:18;802:50;869:44;906:6;898;869:44;:::i;:::-;861:52;454:465;-1:-1:-1;;;;;454:465:1:o;924:131::-;-1:-1:-1;;;;;;998:32:1;;988:43;;978:71;;1045:1;1042;1035:12;978:71;924:131;:::o;1060:245::-;1118:6;1171:2;1159:9;1150:7;1146:23;1142:32;1139:52;;;1187:1;1184;1177:12;1139:52;1226:9;1213:23;1245:30;1269:5;1245:30;:::i;:::-;1294:5;1060:245;-1:-1:-1;;;1060:245:1:o;1502:250::-;1587:1;1597:113;1611:6;1608:1;1605:13;1597:113;;;1687:11;;;1681:18;1668:11;;;1661:39;1633:2;1626:10;1597:113;;;-1:-1:-1;;1744:1:1;1726:16;;1719:27;1502:250::o;1757:271::-;1799:3;1837:5;1831:12;1864:6;1859:3;1852:19;1880:76;1949:6;1942:4;1937:3;1933:14;1926:4;1919:5;1915:16;1880:76;:::i;:::-;2010:2;1989:15;-1:-1:-1;;1985:29:1;1976:39;;;;2017:4;1972:50;;1757:271;-1:-1:-1;;1757:271:1:o;2033:220::-;2182:2;2171:9;2164:21;2145:4;2202:45;2243:2;2232:9;2228:18;2220:6;2202:45;:::i;2258:180::-;2317:6;2370:2;2358:9;2349:7;2345:23;2341:32;2338:52;;;2386:1;2383;2376:12;2338:52;-1:-1:-1;2409:23:1;;2258:180;-1:-1:-1;2258:180:1:o;2651:173::-;2719:20;;-1:-1:-1;;;;;2768:31:1;;2758:42;;2748:70;;2814:1;2811;2804:12;2748:70;2651:173;;;:::o;2829:254::-;2897:6;2905;2958:2;2946:9;2937:7;2933:23;2929:32;2926:52;;;2974:1;2971;2964:12;2926:52;2997:29;3016:9;2997:29;:::i;:::-;2987:39;3073:2;3058:18;;;;3045:32;;-1:-1:-1;;;2829:254:1:o;3270:127::-;3331:10;3326:3;3322:20;3319:1;3312:31;3362:4;3359:1;3352:15;3386:4;3383:1;3376:15;3402:275;3473:2;3467:9;3538:2;3519:13;;-1:-1:-1;;3515:27:1;3503:40;;-1:-1:-1;;;;;3558:34:1;;3594:22;;;3555:62;3552:88;;;3620:18;;:::i;:::-;3656:2;3649:22;3402:275;;-1:-1:-1;3402:275:1:o;3682:407::-;3747:5;-1:-1:-1;;;;;3773:6:1;3770:30;3767:56;;;3803:18;;:::i;:::-;3841:57;3886:2;3865:15;;-1:-1:-1;;3861:29:1;3892:4;3857:40;3841:57;:::i;:::-;3832:66;;3921:6;3914:5;3907:21;3961:3;3952:6;3947:3;3943:16;3940:25;3937:45;;;3978:1;3975;3968:12;3937:45;4027:6;4022:3;4015:4;4008:5;4004:16;3991:43;4081:1;4074:4;4065:6;4058:5;4054:18;4050:29;4043:40;3682:407;;;;;:::o;4094:222::-;4137:5;4190:3;4183:4;4175:6;4171:17;4167:27;4157:55;;4208:1;4205;4198:12;4157:55;4230:80;4306:3;4297:6;4284:20;4277:4;4269:6;4265:17;4230:80;:::i;4321:390::-;4399:6;4407;4460:2;4448:9;4439:7;4435:23;4431:32;4428:52;;;4476:1;4473;4466:12;4428:52;4512:9;4499:23;4489:33;;4573:2;4562:9;4558:18;4545:32;-1:-1:-1;;;;;4592:6:1;4589:30;4586:50;;;4632:1;4629;4622:12;4586:50;4655;4697:7;4688:6;4677:9;4673:22;4655:50;:::i;:::-;4645:60;;;4321:390;;;;;:::o;4716:328::-;4793:6;4801;4809;4862:2;4850:9;4841:7;4837:23;4833:32;4830:52;;;4878:1;4875;4868:12;4830:52;4901:29;4920:9;4901:29;:::i;:::-;4891:39;;4949:38;4983:2;4972:9;4968:18;4949:38;:::i;:::-;4939:48;;5034:2;5023:9;5019:18;5006:32;4996:42;;4716:328;;;;;:::o;5049:186::-;5108:6;5161:2;5149:9;5140:7;5136:23;5132:32;5129:52;;;5177:1;5174;5167:12;5129:52;5200:29;5219:9;5200:29;:::i;5240:347::-;5305:6;5313;5366:2;5354:9;5345:7;5341:23;5337:32;5334:52;;;5382:1;5379;5372:12;5334:52;5405:29;5424:9;5405:29;:::i;:::-;5395:39;;5484:2;5473:9;5469:18;5456:32;5531:5;5524:13;5517:21;5510:5;5507:32;5497:60;;5553:1;5550;5543:12;5497:60;5576:5;5566:15;;;5240:347;;;;;:::o;5592:439::-;5821:2;5810:9;5803:21;5784:4;5841:56;5893:2;5882:9;5878:18;5870:6;5841:56;:::i;:::-;5940:14;;5933:22;5928:2;5913:18;;5906:50;-1:-1:-1;;;;;;5992:32:1;;;;5987:2;5972:18;;;5965:60;5833:64;5592:439;-1:-1:-1;5592:439:1:o;6036:322::-;6105:6;6158:2;6146:9;6137:7;6133:23;6129:32;6126:52;;;6174:1;6171;6164:12;6126:52;6214:9;6201:23;-1:-1:-1;;;;;6239:6:1;6236:30;6233:50;;;6279:1;6276;6269:12;6233:50;6302;6344:7;6335:6;6324:9;6320:22;6302:50;:::i;6363:667::-;6458:6;6466;6474;6482;6535:3;6523:9;6514:7;6510:23;6506:33;6503:53;;;6552:1;6549;6542:12;6503:53;6575:29;6594:9;6575:29;:::i;:::-;6565:39;;6623:38;6657:2;6646:9;6642:18;6623:38;:::i;:::-;6613:48;;6708:2;6697:9;6693:18;6680:32;6670:42;;6763:2;6752:9;6748:18;6735:32;-1:-1:-1;;;;;6782:6:1;6779:30;6776:50;;;6822:1;6819;6812:12;6776:50;6845:22;;6898:4;6890:13;;6886:27;-1:-1:-1;6876:55:1;;6927:1;6924;6917:12;6876:55;6950:74;7016:7;7011:2;6998:16;6993:2;6989;6985:11;6950:74;:::i;:::-;6940:84;;;6363:667;;;;;;;:::o;7035:183::-;7095:4;-1:-1:-1;;;;;7120:6:1;7117:30;7114:56;;;7150:18;;:::i;:::-;-1:-1:-1;7195:1:1;7191:14;7207:4;7187:25;;7035:183::o;7223:891::-;7307:6;7338:2;7381;7369:9;7360:7;7356:23;7352:32;7349:52;;;7397:1;7394;7387:12;7349:52;7437:9;7424:23;-1:-1:-1;;;;;7462:6:1;7459:30;7456:50;;;7502:1;7499;7492:12;7456:50;7525:22;;7578:4;7570:13;;7566:27;-1:-1:-1;7556:55:1;;7607:1;7604;7597:12;7556:55;7643:2;7630:16;7666:60;7682:43;7722:2;7682:43;:::i;:::-;7666:60;:::i;:::-;7760:15;;;7842:1;7838:10;;;;7830:19;;7826:28;;;7791:12;;;;7866:19;;;7863:39;;;7898:1;7895;7888:12;7863:39;7922:11;;;;7942:142;7958:6;7953:3;7950:15;7942:142;;;8024:17;;8012:30;;7975:12;;;;8062;;;;7942:142;;;8103:5;7223:891;-1:-1:-1;;;;;;;7223:891:1:o;8341:260::-;8409:6;8417;8470:2;8458:9;8449:7;8445:23;8441:32;8438:52;;;8486:1;8483;8476:12;8438:52;8509:29;8528:9;8509:29;:::i;:::-;8499:39;;8557:38;8591:2;8580:9;8576:18;8557:38;:::i;:::-;8547:48;;8341:260;;;;;:::o;8606:127::-;8667:10;8662:3;8658:20;8655:1;8648:31;8698:4;8695:1;8688:15;8722:4;8719:1;8712:15;8738:127;8799:10;8794:3;8790:20;8787:1;8780:31;8830:4;8827:1;8820:15;8854:4;8851:1;8844:15;8870:135;8909:3;8930:17;;;8927:43;;8950:18;;:::i;:::-;-1:-1:-1;8997:1:1;8986:13;;8870:135::o;9010:380::-;9089:1;9085:12;;;;9132;;;9153:61;;9207:4;9199:6;9195:17;9185:27;;9153:61;9260:2;9252:6;9249:14;9229:18;9226:38;9223:161;;9306:10;9301:3;9297:20;9294:1;9287:31;9341:4;9338:1;9331:15;9369:4;9366:1;9359:15;9223:161;;9010:380;;;:::o;9395:332::-;9597:2;9579:21;;;9636:1;9616:18;;;9609:29;-1:-1:-1;;;9669:2:1;9654:18;;9647:39;9718:2;9703:18;;9395:332::o;9858:545::-;9960:2;9955:3;9952:11;9949:448;;;9996:1;10021:5;10017:2;10010:17;10066:4;10062:2;10052:19;10136:2;10124:10;10120:19;10117:1;10113:27;10107:4;10103:38;10172:4;10160:10;10157:20;10154:47;;;-1:-1:-1;10195:4:1;10154:47;10250:2;10245:3;10241:12;10238:1;10234:20;10228:4;10224:31;10214:41;;10305:82;10323:2;10316:5;10313:13;10305:82;;;10368:17;;;10349:1;10338:13;10305:82;;;10309:3;;;9858:545;;;:::o;10579:1352::-;10705:3;10699:10;-1:-1:-1;;;;;10724:6:1;10721:30;10718:56;;;10754:18;;:::i;:::-;10783:97;10873:6;10833:38;10865:4;10859:11;10833:38;:::i;:::-;10827:4;10783:97;:::i;:::-;10935:4;;10999:2;10988:14;;11016:1;11011:663;;;;11718:1;11735:6;11732:89;;;-1:-1:-1;11787:19:1;;;11781:26;11732:89;-1:-1:-1;;10536:1:1;10532:11;;;10528:24;10524:29;10514:40;10560:1;10556:11;;;10511:57;11834:81;;10981:944;;11011:663;9805:1;9798:14;;;9842:4;9829:18;;-1:-1:-1;;11047:20:1;;;11165:236;11179:7;11176:1;11173:14;11165:236;;;11268:19;;;11262:26;11247:42;;11360:27;;;;11328:1;11316:14;;;;11195:19;;11165:236;;;11169:3;11429:6;11420:7;11417:19;11414:201;;;11490:19;;;11484:26;-1:-1:-1;;11573:1:1;11569:14;;;11585:3;11565:24;11561:37;11557:42;11542:58;11527:74;;11414:201;-1:-1:-1;;;;;11661:1:1;11645:14;;;11641:22;11628:36;;-1:-1:-1;10579:1352:1:o;11936:128::-;12003:9;;;12024:11;;;12021:37;;;12038:18;;:::i;12069:659::-;12134:5;12187:3;12180:4;12172:6;12168:17;12164:27;12154:55;;12205:1;12202;12195:12;12154:55;12234:6;12228:13;12260:4;12284:60;12300:43;12340:2;12300:43;:::i;12284:60::-;12378:15;;;12464:1;12460:10;;;;12448:23;;12444:32;;;12409:12;;;;12488:15;;;12485:35;;;12516:1;12513;12506:12;12485:35;12552:2;12544:6;12540:15;12564:135;12580:6;12575:3;12572:15;12564:135;;;12646:10;;12634:23;;12677:12;;;;12597;;12564:135;;;-1:-1:-1;12717:5:1;12069:659;-1:-1:-1;;;;;;12069:659:1:o;12733:844::-;12896:6;12904;12912;12965:2;12953:9;12944:7;12940:23;12936:32;12933:52;;;12981:1;12978;12971:12;12933:52;13014:9;13008:16;-1:-1:-1;;;;;13084:2:1;13076:6;13073:14;13070:34;;;13100:1;13097;13090:12;13070:34;13123:72;13187:7;13178:6;13167:9;13163:22;13123:72;:::i;:::-;13113:82;;13241:2;13230:9;13226:18;13220:25;13204:41;;13270:2;13260:8;13257:16;13254:36;;;13286:1;13283;13276:12;13254:36;13309:74;13375:7;13364:8;13353:9;13349:24;13309:74;:::i;:::-;13299:84;;13429:2;13418:9;13414:18;13408:25;13392:41;;13458:2;13448:8;13445:16;13442:36;;;13474:1;13471;13464:12;13442:36;;13497:74;13563:7;13552:8;13541:9;13537:24;13497:74;:::i;:::-;13487:84;;;12733:844;;;;;:::o;13769:209::-;13801:1;13827;13817:132;;13871:10;13866:3;13862:20;13859:1;13852:31;13906:4;13903:1;13896:15;13934:4;13931:1;13924:15;13817:132;-1:-1:-1;13963:9:1;;13769:209::o;13983:125::-;14048:9;;;14069:10;;;14066:36;;;14082:18;;:::i;15916:1020::-;16092:3;16121:1;16154:6;16148:13;16184:36;16210:9;16184:36;:::i;:::-;16239:1;16256:18;;;16283:133;;;;16430:1;16425:356;;;;16249:532;;16283:133;-1:-1:-1;;16316:24:1;;16304:37;;16389:14;;16382:22;16370:35;;16361:45;;;-1:-1:-1;16283:133:1;;16425:356;16456:6;16453:1;16446:17;16486:4;16531:2;16528:1;16518:16;16556:1;16570:165;16584:6;16581:1;16578:13;16570:165;;;16662:14;;16649:11;;;16642:35;16705:16;;;;16599:10;;16570:165;;;16574:3;;;16764:6;16759:3;16755:16;16748:23;;16249:532;;;;;16812:6;16806:13;16828:68;16887:8;16882:3;16875:4;16867:6;16863:17;16828:68;:::i;:::-;16912:18;;15916:1020;-1:-1:-1;;;;15916:1020:1:o;16941:363::-;17036:6;17089:2;17077:9;17068:7;17064:23;17060:32;17057:52;;;17105:1;17102;17095:12;17057:52;17138:9;17132:16;-1:-1:-1;;;;;17163:6:1;17160:30;17157:50;;;17203:1;17200;17193:12;17157:50;17226:72;17290:7;17281:6;17270:9;17266:22;17226:72;:::i;17309:489::-;-1:-1:-1;;;;;17578:15:1;;;17560:34;;17630:15;;17625:2;17610:18;;17603:43;17677:2;17662:18;;17655:34;;;17725:3;17720:2;17705:18;;17698:31;;;17503:4;;17746:46;;17772:19;;17764:6;17746:46;:::i;:::-;17738:54;17309:489;-1:-1:-1;;;;;;17309:489:1:o;17803:249::-;17872:6;17925:2;17913:9;17904:7;17900:23;17896:32;17893:52;;;17941:1;17938;17931:12;17893:52;17973:9;17967:16;17992:30;18016:5;17992:30;:::i

Swarm Source

ipfs://a0fc48e08f15cbf0bbd38c0f01a0b815f049521a312409f80fb28185f95717d3

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.