ETH Price: $3,472.85 (+2.12%)

Contract

0xE9d55Cc6d8D0a0AF1f4D220b7a316bA1a38400AA
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Set Approval For...159975382022-11-18 14:36:35767 days ago1668782195IN
0xE9d55Cc6...1a38400AA
0 ETH0.0008608216.61893476
Set Approval For...159975372022-11-18 14:36:23767 days ago1668782183IN
0xE9d55Cc6...1a38400AA
0 ETH0.0008493716.37878367
Set Approval For...159973032022-11-18 13:49:35767 days ago1668779375IN
0xE9d55Cc6...1a38400AA
0 ETH0.0006627612.80106123

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
210067222024-10-20 12:14:2366 days ago1729426463
0xE9d55Cc6...1a38400AA
0 ETH
207053992024-09-08 10:48:35108 days ago1725792515
0xE9d55Cc6...1a38400AA
0 ETH
206487592024-08-31 13:10:11115 days ago1725109811
0xE9d55Cc6...1a38400AA
0 ETH
206301772024-08-28 22:49:47118 days ago1724885387
0xE9d55Cc6...1a38400AA
0 ETH
206063302024-08-25 14:54:11121 days ago1724597651
0xE9d55Cc6...1a38400AA
0 ETH
205705412024-08-20 14:50:47126 days ago1724165447
0xE9d55Cc6...1a38400AA
0 ETH
205241102024-08-14 3:13:35133 days ago1723605215
0xE9d55Cc6...1a38400AA
0 ETH
205186292024-08-13 8:52:35134 days ago1723539155
0xE9d55Cc6...1a38400AA
0 ETH
205141212024-08-12 17:47:23134 days ago1723484843
0xE9d55Cc6...1a38400AA
0 ETH
204014732024-07-28 0:30:23150 days ago1722126623
0xE9d55Cc6...1a38400AA
0 ETH
203734732024-07-24 2:40:11154 days ago1721788811
0xE9d55Cc6...1a38400AA
0 ETH
203553832024-07-21 14:02:47156 days ago1721570567
0xE9d55Cc6...1a38400AA
0 ETH
203547402024-07-21 11:53:35157 days ago1721562815
0xE9d55Cc6...1a38400AA
0 ETH
203547402024-07-21 11:53:35157 days ago1721562815
0xE9d55Cc6...1a38400AA
0 ETH
203547402024-07-21 11:53:35157 days ago1721562815
0xE9d55Cc6...1a38400AA
0 ETH
203547402024-07-21 11:53:35157 days ago1721562815
0xE9d55Cc6...1a38400AA
0 ETH
202000422024-06-29 21:31:35178 days ago1719696695
0xE9d55Cc6...1a38400AA
0 ETH
201859932024-06-27 22:25:11180 days ago1719527111
0xE9d55Cc6...1a38400AA
0 ETH
200051432024-06-02 15:51:11205 days ago1717343471
0xE9d55Cc6...1a38400AA
0 ETH
198982042024-05-18 17:05:23220 days ago1716051923
0xE9d55Cc6...1a38400AA
0 ETH
198908502024-05-17 16:21:59221 days ago1715962919
0xE9d55Cc6...1a38400AA
0 ETH
198575042024-05-13 0:25:23226 days ago1715559923
0xE9d55Cc6...1a38400AA
0 ETH
198573552024-05-12 23:55:23226 days ago1715558123
0xE9d55Cc6...1a38400AA
0 ETH
198573552024-05-12 23:55:23226 days ago1715558123
0xE9d55Cc6...1a38400AA
0 ETH
198573552024-05-12 23:55:23226 days ago1715558123
0xE9d55Cc6...1a38400AA
0 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Machina

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-11-18
*/

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

// Import Solidity Modules

// Lightweight & Readable Batch Minting ERC721 by 0xInuarashi
// Library: CypherMate
// Inspirations: ERC721G, ERC721A

/** @dev this contract uses batch minting logic which modifies
         _mint to take AMOUNT argument instead of TOKENID argument
*/

abstract contract ERC721TokenReceiver {
    function onERC721Received(address, address, uint256, bytes calldata) 
    external virtual returns (bytes4) {
        return ERC721TokenReceiver.onERC721Received.selector;
    }
}

abstract contract ERC721B {
    
    ///// Events /////
    event Transfer(address indexed from_, address indexed to_, uint256 indexed tokenId_);
    event Approval(address indexed owner_, address indexed spender_, 
        uint256 indexed id_);
    event ApprovalForAll(address indexed owner_, address indexed operator_, 
        bool approved_);

    ///// Token Data /////
    string public name; 
    string public symbol;

    uint256 public nextTokenId;
    uint256 public totalBurned;

    uint256 public constant maxBatchSize = 20; // default: 20
    
    /** @dev change or override this to modify the starting token Id */
    function startTokenId() public pure virtual returns (uint256) {
        return 0;
    }

    /** @dev totalSupply performs arithmetics and then returns */
    function totalSupply() public view virtual returns (uint256) {
        return nextTokenId - totalBurned - startTokenId();
    }

    ///// Constructor /////
    constructor(string memory name_, string memory symbol_) {
        name = name_;
        symbol = symbol_;
        nextTokenId = startTokenId();
    }

    ///// Token Storage /////
    struct TokenData {
        address owner;
        uint40 lastTransfer;
        bool burned; /** @dev burned stores the burn state of token to revert on query */
        bool nextInitialized; /** @dev helps saves 1 SLOAD on bookmark N+1 lookup */
        /** @dev 6 free bytes */
    }
    struct BalanceData {
        uint32 balance;
        uint32 mintedAmount;
        /** @dev 24 free bytes */
    }

    /** @dev these mappings replace ownerOf and balanceOf with structs */
    mapping(uint256 => TokenData) public _tokenData;
    mapping(address => BalanceData) public _balanceData;

    ///// Token Approvals /////
    mapping(uint256 => address) public getApproved;
    mapping(address => mapping(address => bool)) public isApprovedForAll;

    ///// ERC721B Batch Logic /////
    /** @dev _getTokenDataOf returns the TokenData struct of the tokenId_ by either 
             returning the initialized TokenData or performing a lookup-trace to the
             bookmarked location
    */
    function _getTokenDataOf(uint256 tokenId_) public view virtual 
    returns (TokenData memory) {
        // Set the starting lookupId to save on gas on operations
        uint256 _lookupId = tokenId_;
        // The tokenId must be above the startTokenId only
        require(_lookupId >= startTokenId(), "_getTokenDataOf _lookupId < startTokenId");
        // Load the TokenData into memory for subsequent operations
        TokenData memory _TokenData = _tokenData[_lookupId];
        // If the TokenData is initialized and not burned, return it to end the flow
        if (_TokenData.owner != address(0) && !_TokenData.burned) return _TokenData;
        // If that's not the case, check if the token is burned. If so, revert
        require(!_TokenData.burned, "_getTokenDataOf burned token!");
        // If it's not initialized, check if it's above nextTokenId
        require(_lookupId < nextTokenId, "_getTokenDataOf _lookupId > _nextTokenId");
        // If it's not initialized and in-bounds, perform a lookup-trace
        /** @dev this part can be optimized */
        /** @dev we don't need to check burn status here because _burn logic does
                 automatic bookmarking making such circumstance impossible */
        unchecked { while(_tokenData[--_lookupId].owner == address(0)) {} }
        return _tokenData[_lookupId];
    }

    /** @dev returns the balance in the stored BalanceData struct of address */
    function balanceOf(address owner_) public virtual view returns (uint256) {
        require(owner_ != address(0), "balanceOf to 0x0");
        return _balanceData[owner_].balance;
    }

    /** @dev _getTokenDataOf reverts on burned tokens and out-of-bounds tokens 
             thus it will always return non-null addresses only
    */
    function ownerOf(uint256 tokenId_) public view returns (address) {
        return _getTokenDataOf(tokenId_).owner;
    }

    ///// ERC721 Functions /////
    /** @dev _mint and _burn does not have totalMinted manipulations */
    function _mintInternal(address to_, uint256 amount_) internal virtual { unchecked {
        // We cannot mint to 0x0
        require(to_ != address(0), "_mint to 0x0");
        // We store the _startId from _nextTokenId to use for subsequent operations
        uint256 _startId = nextTokenId;
        uint256 _endId = _startId + amount_;
        // Store the initial TokenData bookmark at _startId
        _tokenData[_startId].owner = to_;
        _tokenData[_startId].lastTransfer = uint40(block.timestamp);
        // Add the balance and mint data to the minter
        _balanceData[to_].balance += uint32(amount_);
        _balanceData[to_].mintedAmount += uint32(amount_);
        // Phantom Mint all the tokens
        do { emit Transfer(address(0), to_, _startId); } while (++_startId < _endId);
        // Set the totalMinted as the _endId
        nextTokenId = _endId;
    }}
    /** @dev we use a max batch size to prevent high lookup costs in the future */
    function _mint(address to_, uint256 amount_) internal virtual {
        uint256 _amountToMint = amount_;
        while (_amountToMint > maxBatchSize) {
            _amountToMint -= maxBatchSize;
            _mintInternal(to_, maxBatchSize);
        }
        _mintInternal(to_, _amountToMint);
    }

    /** @dev _mint uses a burn flag instead of deleting token data */
    function _burn(uint256 tokenId_, bool checkApproved_) internal virtual { unchecked {
        // Load the TokenData into memory
        /** @dev if the token is burned, _getTokenDataOf will revert,
                 so we can assume from here that flow is to an unburned token only.
                 _getTokenDataOf also ensures that the TokenData returned is
                 within valid tokenId bounds */
        TokenData memory _TokenData = _getTokenDataOf(tokenId_);
        address _owner = _TokenData.owner;
        // Special checkApproved_ logical flow to save 1 SLOAD
        if (checkApproved_) require(_isApprovedOrOwner(_owner, msg.sender, tokenId_),
                                    "_burn not approved");
        // Delete getApproved to clear any approvals for cleanliness
        delete getApproved[tokenId_];
        // Store the burner data at tokenId_
        _tokenData[tokenId_].owner = _owner;
        _tokenData[tokenId_].lastTransfer = uint40(block.timestamp);
        // Set the burned flag to true on the token
        _tokenData[tokenId_].burned = true;
        // After a burn, the next token must always be initialized
        _tokenData[tokenId_].nextInitialized = true;

        /** @dev Bookmarking Logic */
        // First, we check if slot N+1 is initialized
        if (!_TokenData.nextInitialized) {
            // Check if the slot at N+1 is actually initialized or not
            // because it is possible that the state above is false but 
            // the token is actually initialized (from mint-state)
            uint256 _tokenIdIncremented = tokenId_ + 1;
            if (_tokenData[_tokenIdIncremented].owner == address(0)) {
                // If it's not, we see if the tokenId is in-bounds for bookmarking
                if (tokenId_ < nextTokenId - 1) {
                    // If it is, we bookmark the N+1 slot with the current loaded TokenData
                    /** @dev This retains the owner of subsequent tokens
                            and prevents unintended overwriting of owner data */
                    _tokenData[_tokenIdIncremented] = _TokenData;
                }
            }
        }
        
        // Update user balances
        _balanceData[_owner].balance--;
        // Emit a Burn Transfer
        emit Transfer(_owner, address(0), tokenId_);
        // Increment Burned Amount
        totalBurned++;
    }}
    // /** @dev _burn using standard arguments */
    // function _burn(uint256 tokenId_) internal virtual {
    //     _burn(tokenId_, false);
    // }

    /** @dev _transfer has a special checkApproved_ argument for gas-efficiency */
    function _transfer(address from_, address to_, uint256 tokenId_, 
    bool checkApproved_) internal virtual { unchecked {
        // We can't transfer to 0x0
        require(to_ != address(0), "_transfer to 0x0");
        // Load the TokenData into memory for further operations
        TokenData memory _TokenData = _getTokenDataOf(tokenId_);
        address _owner = _TokenData.owner;
        // Argument from_ must be the owner
        require(from_ == _owner, "_transfer not from owner");
        // Special checkApproved_ logical flow to save 1 SLOAD
        if (checkApproved_) require(_isApprovedOrOwner(_owner, msg.sender, tokenId_),
                               "_transfer not approved");
        // Delete getApproved to clear any approvals on transfer
        delete getApproved[tokenId_];
        // Transfer the token
        _tokenData[tokenId_].owner = to_;
        _tokenData[tokenId_].lastTransfer = uint40(block.timestamp);
        // After a transfer, the next token must always be initialized 
        _tokenData[tokenId_].nextInitialized = true;
        
        /** @dev Bookmarking Logic */
        // First, we check if slot N+1 is initialized from token at N
        if (!_TokenData.nextInitialized) {
            // Check if the slot at N+1 is actually initialized or not
            // because it is possible that the state above is false but 
            // the token is actually initialized (from mint-state)
            uint256 _tokenIdIncremented = tokenId_ + 1;
            if (_tokenData[_tokenIdIncremented].owner == address(0)) {
                // If it's not, we see if the tokenId is in-bounds for bookmarking
                if (tokenId_ < nextTokenId - 1) {
                    // If it is, we bookmark the N+1 slot with the current loaded TokenData
                    /** @dev This retains the owner of subsequent tokens 
                            and prevents unintended overwriting of owner data */
                    _tokenData[_tokenIdIncremented] = _TokenData;
                }
            }
        }

        // Update the balances
        _balanceData[from_].balance--;
        _balanceData[to_].balance++;
        // Emit a Transfer
        emit Transfer(from_, to_, tokenId_);
    }}
    // /** @dev a standard-style transfer mimics ERC721 _transfer behavior with 
    //          no approval checks */
    // function _transfer(address from_, address to_, uint256 tokenId_) internal virtual {
    //     _transfer(from_, to_, tokenId_, false);
    // }

    /** @dev transferFrom uses special _transfer with approval check flow
             which saves 1 SLOAD */
    function transferFrom(address from_, address to_, uint256 tokenId_) public virtual {
        _transfer(from_, to_, tokenId_, true);
    }
    function safeTransferFrom(address from_, address to_, uint256 tokenId_,
    bytes memory data_) public virtual {
        transferFrom(from_, to_, tokenId_);
        require(to_.code.length == 0 ||
            ERC721TokenReceiver(to_)
            .onERC721Received(msg.sender, from_, tokenId_, data_) ==
            ERC721TokenReceiver.onERC721Received.selector, 
            "safeTransferFrom to unsafe address");
    }
    function safeTransferFrom(address from_, address to_, uint256 tokenId_) 
    public virtual {
        safeTransferFrom(from_, to_, tokenId_, "");
    }

    ///// ERC721 Approvals /////
    function approve(address spender_, uint256 tokenId_) public virtual {
        address _owner = ownerOf(tokenId_);
        require(msg.sender == _owner || isApprovedForAll[_owner][msg.sender],
                "approve not authorized!");
        getApproved[tokenId_] = spender_;
        emit Approval(_owner, spender_, tokenId_);
    }
    function setApprovalForAll(address operator_, bool approved_) public virtual {
        isApprovedForAll[msg.sender][operator_] = approved_;
        emit ApprovalForAll(msg.sender, operator_, approved_);
    }
    /** @dev _isApprovedOrOwner has a special owner_ argument for gas-efficiency */
    function _isApprovedOrOwner(address owner_, address spender_, uint256 tokenId_) 
    internal virtual view returns (bool) {
        return (owner_ == spender_ ||
                getApproved[tokenId_] == spender_ ||
                isApprovedForAll[owner_][spender_]);
    }

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

    /** @dev tokenURI is not implemented */
    function tokenURI(uint256 tokenId_) public virtual view returns (string memory);

    bytes32[50] private ___gap;
}

abstract contract ERC721TokenURI {

    string public baseTokenURI;

    function _setBaseTokenURI(string memory uri_) internal virtual {
        baseTokenURI = uri_;
    }

    function _toString(uint256 value_) internal pure virtual 
    returns (string memory _str) {
        assembly {
            let m := add(mload(0x40), 0xa0)
            mstore(0x40, m)
            _str := sub(m, 0x20)
            mstore(_str, 0)

            let end := _str

            for { let temp := value_ } 1 {} {
                _str := sub(_str, 1)
                mstore8(_str, add(48, mod(temp, 10)))
                temp := div(temp, 10)
                if iszero(temp) { break }
            }

            let length := sub(end, _str)
            _str := sub(_str, 0x20)
            mstore(_str, length)
        }
    }
}

// Short and Simple Ownable by 0xInuarashi
// Ownable follows EIP-173 compliant standard

abstract contract Ownable {
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    address public owner;
    constructor() { owner = msg.sender; }
    modifier onlyOwner { require(owner == msg.sender, "onlyOwner not owner!"); _; }
    function transferOwnership(address new_) external onlyOwner {
        address _old = owner;
        owner = new_;
        emit OwnershipTransferred(_old, new_);
    }
}

/** Controllerable: Dynamic Controller System

    string controllerType is a string version of controllerSlot
    bytes32 controllerSlot is a keccak256(abi.encodePacked("ControllerName"<string>))
        used to store the type of controller type
    address controller is the address of the controller
    bool status is the status of controller (true = is controller, false = is not)

    usage: call isController with string type_ and address of user to receive a boolean
*/

abstract contract Controllerable is Ownable {

    event ControllerSet(string indexed controllerType, bytes32 indexed controllerSlot, 
        address indexed controller, bool status);

    mapping(bytes32 => mapping(address => bool)) internal __controllers;

    function isController(string memory type_, address controller_) public 
    view returns (bool) {
        bytes32 _slot = keccak256(abi.encodePacked(type_));
        return __controllers[_slot][controller_];
    }

    function setController(string calldata type_, address controller_, bool bool_) 
    external onlyOwner {
        bytes32 _slot = keccak256(abi.encodePacked(type_));
        __controllers[_slot][controller_] = bool_;
        emit ControllerSet(type_, _slot, controller_, bool_);
    }
}

/**
    OSSubscribeFilter is a simple subscription for OpenSea's Filter Registry.
*/

interface iOperatorFilterRegistry {
    function registerAndSubscribe(address registerer_, address subscribeTo_) external;
    function isOperatorAllowed(address registrant_, address operator_) external 
        view returns (bool);
}

abstract contract OSSubscribeFilter {

    // Errors
    error OperatorNotAllowed(address operator);

    // Targets
    iOperatorFilterRegistry public constant OSFilterRegistry =
        iOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    // Register and Subscribe (Required to be compliant)
    /** @dev Default subscribeTo_ is: 0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6 */
    function _OSRegisterAndSubscribe(address subscribeTo_) internal {
        OSFilterRegistry.registerAndSubscribe(address(this), subscribeTo_);
    }

    // This is for TransferFroms
    modifier onlyAllowedOperator(address from_) virtual {
        // First, if from is the msg.sender, it is the owner and should be allowed.
        if (msg.sender == from_) {
            _;
            return;
        }

        // However, if from_ is not the msg.sender, means it's an approved operator
        // In this case, let's check if the operator is a smart contract.
        if (from_.code.length > 0) {
            if (!OSFilterRegistry.isOperatorAllowed(address(this), msg.sender)) {
                // If the operator (msg.sender) is not allowed based on the list
                // We revert with OperatorNotAllowed(address)
                revert OperatorNotAllowed(msg.sender);
            }
        }
        _;
    }

    // This is for Approves
    modifier onlyAllowedOperatorApproval(address operator_) virtual {
        // For an approval, we simply check the registry if the caller is able
        // to set any approval for the specified address.
        // Again, we use our checks to be able to disable and such.
        if (!OSFilterRegistry.isOperatorAllowed(address(this), operator_)) {
            revert OperatorNotAllowed(operator_);
        }
        _;
    }

    bytes32[50] private ___gap;
}

contract Machina is ERC721B("Machina", "MACHINA"), ERC721TokenURI, Ownable,
Controllerable, OSSubscribeFilter {

    ///// Proxy Initializer /////
    bool public proxyIsInitialized;
    function proxyInitialize(address newOwner_) public {
        require(!proxyIsInitialized, "Proxy already initialized");
        proxyIsInitialized = true;

        // Hardcode
        owner = newOwner_; // Ownable.sol

        name = "Machina"; // ERC721B.sol
        symbol = "MACHINA"; // ERC721B.sol
        nextTokenId = startTokenId(); // ERC721B.sol
    }

    ///// Constructor (For Implementation Contract) /////
    constructor() {
        proxyInitialize(msg.sender);
    }

    ///// Controllerable Config /////
    modifier onlyMinter() {
        require(isController("Minter", msg.sender),
                "Controllerable: Not Minter!");
        _;
    }

    ///// ERC721B Overrides /////
    function startTokenId() public pure virtual override returns (uint256) {
        return 1;
    }

    ///// Ownable Functions /////
    function ownerMint(address to_, uint256 amount_) external onlyOwner {
        _mint(to_, amount_);
    }
    function ownerBurn(uint256[] calldata tokenIds_) external onlyOwner {
        uint256 l = tokenIds_.length;
        uint256 i; unchecked { do {
            _burn(tokenIds_[i], false);
        } while (++i < l); }
    }

    ///// Controllerable Functions /////
    function mintAsController(address to_, uint256 amount_) external onlyMinter {
        _mint(to_, amount_);
    }

    ///// Metadata Governance /////
    function setBaseTokenURI(string calldata uri_) external onlyOwner {
        _setBaseTokenURI(uri_);
    }

    ///// OS Subscribe Filter Config /////
    function setOSRegisterAndSubscribe(address subscribeTo_) external onlyOwner {
        _OSRegisterAndSubscribe(subscribeTo_);
    }

    ///// OS Subscribe Filter Overrides /////
    function setApprovalForAll(address operator_, bool approved_) public override
    onlyAllowedOperatorApproval(operator_) {
        super.setApprovalForAll(operator_, approved_);
    }
    function approve(address operator_, uint256 tokenId_) public override
    onlyAllowedOperatorApproval(operator_) {
        super.approve(operator_, tokenId_);
    }
    function transferFrom(address from_, address to_, uint256 tokenId_) public override
    onlyAllowedOperator(from_) {
        super.transferFrom(from_, to_, tokenId_);
    }
    function safeTransferFrom(address from_, address to_, uint256 tokenId_) public
    override onlyAllowedOperator(from_) {
        super.safeTransferFrom(from_, to_, tokenId_);
    }
    function safeTransferFrom(address from_, address to_, uint256 tokenId_, 
    bytes memory data_) public override onlyAllowedOperator(from_) {
        super.safeTransferFrom(from_, to_, tokenId_, data_);
    }

    ///// OS Subscribe Filter View /////
    function isOperatorAllowedOS(address operator_) external view returns (bool) {
        return OSFilterRegistry.isOperatorAllowed(address(this), operator_);
    }

    ///// TokenURI /////
    function tokenURI(uint256 tokenId_) public virtual view override 
    returns (string memory) {
        require(ownerOf(tokenId_) != address(0), "Token does not exist!");
        return string(abi.encodePacked(baseTokenURI, _toString(tokenId_)));
    }

    bytes32[50] private ___gap;
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner_","type":"address"},{"indexed":true,"internalType":"address","name":"spender_","type":"address"},{"indexed":true,"internalType":"uint256","name":"id_","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":"string","name":"controllerType","type":"string"},{"indexed":true,"internalType":"bytes32","name":"controllerSlot","type":"bytes32"},{"indexed":true,"internalType":"address","name":"controller","type":"address"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"ControllerSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from_","type":"address"},{"indexed":true,"internalType":"address","name":"to_","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"OSFilterRegistry","outputs":[{"internalType":"contract iOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_balanceData","outputs":[{"internalType":"uint32","name":"balance","type":"uint32"},{"internalType":"uint32","name":"mintedAmount","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"_getTokenDataOf","outputs":[{"components":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint40","name":"lastTransfer","type":"uint40"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"bool","name":"nextInitialized","type":"bool"}],"internalType":"struct ERC721B.TokenData","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_tokenData","outputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint40","name":"lastTransfer","type":"uint40"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"bool","name":"nextInitialized","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator_","type":"address"},{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"type_","type":"string"},{"internalType":"address","name":"controller_","type":"address"}],"name":"isController","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator_","type":"address"}],"name":"isOperatorAllowedOS","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBatchSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"mintAsController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds_","type":"uint256[]"}],"name":"ownerBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","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":"newOwner_","type":"address"}],"name":"proxyInitialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"proxyIsInitialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from_","type":"address"},{"internalType":"address","name":"to_","type":"address"},{"internalType":"uint256","name":"tokenId_","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":"tokenId_","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":"uri_","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"type_","type":"string"},{"internalType":"address","name":"controller_","type":"address"},{"internalType":"bool","name":"bool_","type":"bool"}],"name":"setController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"subscribeTo_","type":"address"}],"name":"setOSRegisterAndSubscribe","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes4","name":"iid_","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":"tokenId_","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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"},{"inputs":[{"internalType":"address","name":"new_","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b50604051806040016040528060078152602001664d616368696e6160c81b815250604051806040016040528060078152602001664d414348494e4160c81b81525081600090816200006391906200022b565b5060016200007282826200022b565b5060016002555050603b80546001600160a01b031916339081179091556200009a90620000a0565b620002f7565b606f5460ff1615620000f85760405162461bcd60e51b815260206004820152601960248201527f50726f787920616c726561647920696e697469616c697a656400000000000000604482015260640160405180910390fd5b606f805460ff19166001179055603b80546001600160a01b0383166001600160a01b03199091161790556040805180820190915260078152664d616368696e6160c81b60208201526000906200014f90826200022b565b506040805180820190915260078152664d414348494e4160c81b60208201526001906200017d90826200022b565b50600160025550565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620001b157607f821691505b602082108103620001d257634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200022657600081815260208120601f850160051c81016020861015620002015750805b601f850160051c820191505b8181101562000222578281556001016200020d565b5050505b505050565b81516001600160401b0381111562000247576200024762000186565b6200025f816200025884546200019c565b84620001d8565b602080601f8311600181146200029757600084156200027e5750858301515b600019600386901b1c1916600185901b17855562000222565b600085815260208120601f198616915b82811015620002c857888601518255948401946001909101908401620002a7565b5085821015620002e75787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6123e880620003076000396000f3fe608060405234801561001057600080fd5b50600436106102115760003560e01c806375794a3c11610125578063bd5404a8116100ad578063d89135cd1161007c578063d89135cd14610561578063dd88259b1461056a578063e6798baa1461057d578063e985e9c514610584578063f2fde38b146105b257600080fd5b8063bd5404a814610520578063c87b56dd14610533578063d547cfb714610546578063d8016d201461054e57600080fd5b8063a22cb465116100f4578063a22cb46514610478578063a46db1f91461048b578063a64bc18f146104a0578063b88d4fde146104b3578063ba745f2e146104c657600080fd5b806375794a3c146104415780638cb87a021461044a5780638da5cb5b1461045d57806395d89b411461047057600080fd5b806323b872dd116101a857806342842e0e1161017757806342842e0e146103a6578063484b973c146103b95780635266069d146103cc5780636352211e1461041b57806370a082311461042e57600080fd5b806323b872dd146102f25780632913daa0146103055780632c2cdd601461030d57806330176e131461039357600080fd5b80630bbfe555116101e45780630bbfe555146102a9578063153db98a146102bc57806317170f3a146102cf57806318160ddd146102dc57600080fd5b806301ffc9a71461021657806306fdde031461023e578063081812fc14610253578063095ea7b314610294575b600080fd5b610229610224366004611c5e565b6105c5565b60405190151581526020015b60405180910390f35b610246610617565b6040516102359190611cd2565b61027c610261366004611ce5565b6006602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610235565b6102a76102a2366004611d1a565b6106a5565b005b6102296102b7366004611dd0565b61075f565b6102a76102ca366004611d1a565b6107b5565b606f546102299060ff1681565b6102e4610837565b604051908152602001610235565b6102a7610300366004611e32565b61085a565b6102e4601481565b61035b61031b366004611ce5565b6004602052600090815260409020546001600160a01b0381169064ffffffffff600160a01b8204169060ff600160c81b8204811691600160d01b90041684565b604080516001600160a01b03909516855264ffffffffff90931660208501529015159183019190915215156060820152608001610235565b6102a76103a1366004611eb7565b61092e565b6102a76103b4366004611e32565b610997565b6102a76103c7366004611d1a565b610a60565b6103fe6103da366004611ef9565b60056020526000908152604090205463ffffffff8082169164010000000090041682565b6040805163ffffffff938416815292909116602083015201610235565b61027c610429366004611ce5565b610a8a565b6102e461043c366004611ef9565b610a9c565b6102e460025481565b6102a7610458366004611f14565b610b09565b603b5461027c906001600160a01b031681565b610246610b6a565b6102a7610486366004611f97565b610b77565b61027c6daaeb6d7670e522a718067333cd4e81565b6102a76104ae366004611fce565b610c27565b6102a76104c1366004612035565b610cff565b6104d96104d4366004611ce5565b610dd6565b604051610235919081516001600160a01b0316815260208083015164ffffffffff169082015260408083015115159082015260609182015115159181019190915260800190565b6102a761052e366004611ef9565b611021565b610246610541366004611ce5565b6110fe565b61024661118b565b6102a761055c366004611ef9565b611198565b6102e460035481565b610229610578366004611ef9565b6111ce565b60016102e4565b6102296105923660046120b1565b600760209081526000928352604080842090915290825290205460ff1681565b6102a76105c0366004611ef9565b61124d565b60006301ffc9a760e01b6001600160e01b0319831614806105f657506380ac58cd60e01b6001600160e01b03198316145b806106115750635b5e139f60e01b6001600160e01b03198316145b92915050565b60008054610624906120db565b80601f0160208091040260200160405190810160405280929190818152602001828054610650906120db565b801561069d5780601f106106725761010080835404028352916020019161069d565b820191906000526020600020905b81548152906001019060200180831161068057829003601f168201915b505050505081565b604051633185c44d60e21b81523060048201526001600160a01b038316602482015282906daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa1580156106ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107239190612115565b61075057604051633b79c77360e21b81526001600160a01b03821660048201526024015b60405180910390fd5b61075a83836112c9565b505050565b600080836040516020016107739190612132565b60408051601f1981840301815291815281516020928301206000908152603c83528181206001600160a01b038716825290925290205460ff1691505092915050565b6107dd6040518060400160405280600681526020016526b4b73a32b960d11b8152503361075f565b6108295760405162461bcd60e51b815260206004820152601b60248201527f436f6e74726f6c6c657261626c653a204e6f74204d696e7465722100000000006044820152606401610747565b61083382826113b8565b5050565b6000600160035460025461084b919061214e565b610855919061214e565b905090565b826001600160a01b038116330361087b576108768484846113ea565b610928565b6001600160a01b0381163b1561091d57604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa1580156108da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108fe9190612115565b61091d57604051633b79c77360e21b8152336004820152602401610747565b6109288484846113ea565b50505050565b603b546001600160a01b031633146109585760405162461bcd60e51b81526004016107479061216f565b61083382828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506113f792505050565b826001600160a01b03811633036109b357610876848484611403565b6001600160a01b0381163b15610a5557604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610a12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a369190612115565b610a5557604051633b79c77360e21b8152336004820152602401610747565b610928848484611403565b603b546001600160a01b031633146108295760405162461bcd60e51b81526004016107479061216f565b6000610a9582610dd6565b5192915050565b60006001600160a01b038216610ae75760405162461bcd60e51b815260206004820152601060248201526f062616c616e63654f6620746f203078360841b6044820152606401610747565b506001600160a01b031660009081526005602052604090205463ffffffff1690565b603b546001600160a01b03163314610b335760405162461bcd60e51b81526004016107479061216f565b8060005b610b5a848483818110610b4c57610b4c61219d565b90506020020135600061141e565b600101818110610b375750505050565b60018054610624906120db565b604051633185c44d60e21b81523060048201526001600160a01b038316602482015282906daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610bd1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf59190612115565b610c1d57604051633b79c77360e21b81526001600160a01b0382166004820152602401610747565b61075a8383611603565b603b546001600160a01b03163314610c515760405162461bcd60e51b81526004016107479061216f565b60008484604051602001610c669291906121b3565b60408051808303601f1901815282825280516020918201206000818152603c83528381206001600160a01b038916808352935292909220805460ff1916861515179055909250908290610cbc90889088906121b3565b6040519081900381208515158252907f519b8f8a91fff81fe4f9a7ac479d388b3ff624a8246d0e59d9f088d8bf20c7149060200160405180910390a45050505050565b836001600160a01b0381163303610d2157610d1c8585858561166f565b610dcf565b6001600160a01b0381163b15610dc357604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610d80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da49190612115565b610dc357604051633b79c77360e21b8152336004820152602401610747565b610dcf8585858561166f565b5050505050565b604080516080810182526000808252602082018190529181018290526060810191909152816001811015610e5d5760405162461bcd60e51b815260206004820152602860248201527f5f676574546f6b656e446174614f66205f6c6f6f6b75704964203c20737461726044820152671d151bdad95b925960c21b6064820152608401610747565b600081815260046020908152604091829020825160808101845290546001600160a01b03811680835264ffffffffff600160a01b8304169383019390935260ff600160c81b82048116151594830194909452600160d01b90049092161515606083015215801590610ed057508060400151155b15610edc579392505050565b806040015115610f2e5760405162461bcd60e51b815260206004820152601d60248201527f5f676574546f6b656e446174614f66206275726e656420746f6b656e210000006044820152606401610747565b6002548210610f905760405162461bcd60e51b815260206004820152602860248201527f5f676574546f6b656e446174614f66205f6c6f6f6b75704964203e205f6e65786044820152671d151bdad95b925960c21b6064820152608401610747565b5b6000199091016000818152600460205260409020549091906001600160a01b031615610f915750600090815260046020908152604091829020825160808101845290546001600160a01b038116825264ffffffffff600160a01b8204169282019290925260ff600160c81b83048116151593820193909352600160d01b9091049091161515606082015292915050565b606f5460ff16156110745760405162461bcd60e51b815260206004820152601960248201527f50726f787920616c726561647920696e697469616c697a6564000000000000006044820152606401610747565b606f805460ff19166001179055603b80546001600160a01b0383166001600160a01b03199091161790556040805180820190915260078152664d616368696e6160c81b60208201526000906110c99082612211565b506040805180820190915260078152664d414348494e4160c81b60208201526001906110f59082612211565b50600160025550565b6060600061110b83610a8a565b6001600160a01b0316036111595760405162461bcd60e51b8152602060048201526015602482015274546f6b656e20646f6573206e6f742065786973742160581b6044820152606401610747565b603a61116483611766565b6040516020016111759291906122d1565b6040516020818303038152906040529050919050565b603a8054610624906120db565b603b546001600160a01b031633146111c25760405162461bcd60e51b81526004016107479061216f565b6111cb816117aa565b50565b604051633185c44d60e21b81523060048201526001600160a01b03821660248201526000906daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611229573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106119190612115565b603b546001600160a01b031633146112775760405162461bcd60e51b81526004016107479061216f565b603b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006112d482610a8a565b9050336001600160a01b038216148061131057506001600160a01b038116600090815260076020908152604080832033845290915290205460ff165b61135c5760405162461bcd60e51b815260206004820152601760248201527f617070726f7665206e6f7420617574686f72697a6564210000000000000000006044820152606401610747565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b805b60148111156113e0576113ce60148261214e565b90506113db836014611813565b6113ba565b61075a8382611813565b61075a838383600161192f565b603a6108338282612211565b61075a83838360405180602001604052806000815250610cff565b600061142983610dd6565b805190915082156114805761143f813386611bd5565b6114805760405162461bcd60e51b815260206004820152601260248201527117d89d5c9b881b9bdd08185c1c1c9bdd995960721b6044820152606401610747565b600084815260066020908152604080832080546001600160a01b03191690556004909152902080546001600160a01b0383166001600160c81b031990911617600160a01b4264ffffffffff16021761ffff60c81b191661010160c81b179055606082015161159657600184016000818152600460205260409020546001600160a01b0316611594576001600254038510156115945760008181526004602090815260409182902085518154928701519387015160608801511515600160d01b0260ff60d01b19911515600160c81b029190911661ffff60c81b1964ffffffffff909616600160a01b026001600160c81b03199095166001600160a01b03909316929092179390931793909316929092171790555b505b6001600160a01b038116600081815260056020526040808220805463ffffffff19811663ffffffff91821660001901909116179055518692907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a450506003805460010190555050565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61167a84848461085a565b6001600160a01b0383163b158061170f5750604051630a85bd0160e11b808252906001600160a01b0385169063150b7a02906116c0903390899088908890600401612358565b6020604051808303816000875af11580156116df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117039190612395565b6001600160e01b031916145b6109285760405162461bcd60e51b815260206004820152602260248201527f736166655472616e7366657246726f6d20746f20756e73616665206164647265604482015261737360f01b6064820152608401610747565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a9004806117805750819003601f19909101908152919050565b604051633e9f1edf60e11b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe90604401600060405180830381600087803b1580156117ff57600080fd5b505af1158015610dcf573d6000803e3d6000fd5b6001600160a01b0382166118585760405162461bcd60e51b815260206004820152600c60248201526b05f6d696e7420746f203078360a41b6044820152606401610747565b600254600081815260046020908152604080832080546001600160a01b0388166001600160c81b03199091168117600160a01b4264ffffffffff160217909155835260059091529020805467ffffffffffffffff19811663ffffffff8083168601811691821764010000000063ffffffff1990941690921783900481168601169091021790558181015b60405182906001600160a01b038616906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48082600101925082106118e257600255505050565b6001600160a01b0383166119785760405162461bcd60e51b815260206004820152601060248201526f05f7472616e7366657220746f203078360841b6044820152606401610747565b600061198383610dd6565b80519091506001600160a01b03868116908216146119e35760405162461bcd60e51b815260206004820152601860248201527f5f7472616e73666572206e6f742066726f6d206f776e657200000000000000006044820152606401610747565b8215611a39576119f4813386611bd5565b611a395760405162461bcd60e51b815260206004820152601660248201527517dd1c985b9cd9995c881b9bdd08185c1c1c9bdd995960521b6044820152606401610747565b600084815260066020908152604080832080546001600160a01b031916905560049091529020805460ff60d01b1964ffffffffff4216600160a01b026001600160c81b03199092166001600160a01b038916179190911716600160d01b1790556060820151611b5057600184016000818152600460205260409020546001600160a01b0316611b4e57600160025403851015611b4e5760008181526004602090815260409182902085518154928701519387015160608801511515600160d01b0260ff60d01b19911515600160c81b029190911661ffff60c81b1964ffffffffff909616600160a01b026001600160c81b03199095166001600160a01b03909316929092179390931793909316929092171790555b505b6001600160a01b03868116600081815260056020526040808220805463ffffffff1980821663ffffffff92831660001901831617909255948a1680845282842080549283169287166001019096169190911790945551879392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050505050565b6000826001600160a01b0316846001600160a01b03161480611c1057506000828152600660205260409020546001600160a01b038481169116145b80611c4057506001600160a01b0380851660009081526007602090815260408083209387168352929052205460ff165b949350505050565b6001600160e01b0319811681146111cb57600080fd5b600060208284031215611c7057600080fd5b8135611c7b81611c48565b9392505050565b60005b83811015611c9d578181015183820152602001611c85565b50506000910152565b60008151808452611cbe816020860160208601611c82565b601f01601f19169290920160200192915050565b602081526000611c7b6020830184611ca6565b600060208284031215611cf757600080fd5b5035919050565b80356001600160a01b0381168114611d1557600080fd5b919050565b60008060408385031215611d2d57600080fd5b611d3683611cfe565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115611d7557611d75611d44565b604051601f8501601f19908116603f01168101908282118183101715611d9d57611d9d611d44565b81604052809350858152868686011115611db657600080fd5b858560208301376000602087830101525050509392505050565b60008060408385031215611de357600080fd5b823567ffffffffffffffff811115611dfa57600080fd5b8301601f81018513611e0b57600080fd5b611e1a85823560208401611d5a565b925050611e2960208401611cfe565b90509250929050565b600080600060608486031215611e4757600080fd5b611e5084611cfe565b9250611e5e60208501611cfe565b9150604084013590509250925092565b60008083601f840112611e8057600080fd5b50813567ffffffffffffffff811115611e9857600080fd5b602083019150836020828501011115611eb057600080fd5b9250929050565b60008060208385031215611eca57600080fd5b823567ffffffffffffffff811115611ee157600080fd5b611eed85828601611e6e565b90969095509350505050565b600060208284031215611f0b57600080fd5b611c7b82611cfe565b60008060208385031215611f2757600080fd5b823567ffffffffffffffff80821115611f3f57600080fd5b818501915085601f830112611f5357600080fd5b813581811115611f6257600080fd5b8660208260051b8501011115611f7757600080fd5b60209290920196919550909350505050565b80151581146111cb57600080fd5b60008060408385031215611faa57600080fd5b611fb383611cfe565b91506020830135611fc381611f89565b809150509250929050565b60008060008060608587031215611fe457600080fd5b843567ffffffffffffffff811115611ffb57600080fd5b61200787828801611e6e565b909550935061201a905060208601611cfe565b9150604085013561202a81611f89565b939692955090935050565b6000806000806080858703121561204b57600080fd5b61205485611cfe565b935061206260208601611cfe565b925060408501359150606085013567ffffffffffffffff81111561208557600080fd5b8501601f8101871361209657600080fd5b6120a587823560208401611d5a565b91505092959194509250565b600080604083850312156120c457600080fd5b6120cd83611cfe565b9150611e2960208401611cfe565b600181811c908216806120ef57607f821691505b60208210810361210f57634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561212757600080fd5b8151611c7b81611f89565b60008251612144818460208701611c82565b9190910192915050565b8181038181111561061157634e487b7160e01b600052601160045260246000fd5b6020808252601490820152736f6e6c794f776e6572206e6f74206f776e65722160601b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b8183823760009101908152919050565b601f82111561075a57600081815260208120601f850160051c810160208610156121ea5750805b601f850160051c820191505b81811015612209578281556001016121f6565b505050505050565b815167ffffffffffffffff81111561222b5761222b611d44565b61223f8161223984546120db565b846121c3565b602080601f831160018114612274576000841561225c5750858301515b600019600386901b1c1916600185901b178555612209565b600085815260208120601f198616915b828110156122a357888601518255948401946001909101908401612284565b50858210156122c15787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008084546122df816120db565b600182811680156122f7576001811461230c5761233b565b60ff198416875282151583028701945061233b565b8860005260208060002060005b858110156123325781548a820152908401908201612319565b50505082870194505b50505050835161234f818360208801611c82565b01949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061238b90830184611ca6565b9695505050505050565b6000602082840312156123a757600080fd5b8151611c7b81611c4856fea26469706673582212200d11667aba1d5cb854594ef026606f6582c71c3b6c592c2e533496c00a79099164736f6c63430008110033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102115760003560e01c806375794a3c11610125578063bd5404a8116100ad578063d89135cd1161007c578063d89135cd14610561578063dd88259b1461056a578063e6798baa1461057d578063e985e9c514610584578063f2fde38b146105b257600080fd5b8063bd5404a814610520578063c87b56dd14610533578063d547cfb714610546578063d8016d201461054e57600080fd5b8063a22cb465116100f4578063a22cb46514610478578063a46db1f91461048b578063a64bc18f146104a0578063b88d4fde146104b3578063ba745f2e146104c657600080fd5b806375794a3c146104415780638cb87a021461044a5780638da5cb5b1461045d57806395d89b411461047057600080fd5b806323b872dd116101a857806342842e0e1161017757806342842e0e146103a6578063484b973c146103b95780635266069d146103cc5780636352211e1461041b57806370a082311461042e57600080fd5b806323b872dd146102f25780632913daa0146103055780632c2cdd601461030d57806330176e131461039357600080fd5b80630bbfe555116101e45780630bbfe555146102a9578063153db98a146102bc57806317170f3a146102cf57806318160ddd146102dc57600080fd5b806301ffc9a71461021657806306fdde031461023e578063081812fc14610253578063095ea7b314610294575b600080fd5b610229610224366004611c5e565b6105c5565b60405190151581526020015b60405180910390f35b610246610617565b6040516102359190611cd2565b61027c610261366004611ce5565b6006602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610235565b6102a76102a2366004611d1a565b6106a5565b005b6102296102b7366004611dd0565b61075f565b6102a76102ca366004611d1a565b6107b5565b606f546102299060ff1681565b6102e4610837565b604051908152602001610235565b6102a7610300366004611e32565b61085a565b6102e4601481565b61035b61031b366004611ce5565b6004602052600090815260409020546001600160a01b0381169064ffffffffff600160a01b8204169060ff600160c81b8204811691600160d01b90041684565b604080516001600160a01b03909516855264ffffffffff90931660208501529015159183019190915215156060820152608001610235565b6102a76103a1366004611eb7565b61092e565b6102a76103b4366004611e32565b610997565b6102a76103c7366004611d1a565b610a60565b6103fe6103da366004611ef9565b60056020526000908152604090205463ffffffff8082169164010000000090041682565b6040805163ffffffff938416815292909116602083015201610235565b61027c610429366004611ce5565b610a8a565b6102e461043c366004611ef9565b610a9c565b6102e460025481565b6102a7610458366004611f14565b610b09565b603b5461027c906001600160a01b031681565b610246610b6a565b6102a7610486366004611f97565b610b77565b61027c6daaeb6d7670e522a718067333cd4e81565b6102a76104ae366004611fce565b610c27565b6102a76104c1366004612035565b610cff565b6104d96104d4366004611ce5565b610dd6565b604051610235919081516001600160a01b0316815260208083015164ffffffffff169082015260408083015115159082015260609182015115159181019190915260800190565b6102a761052e366004611ef9565b611021565b610246610541366004611ce5565b6110fe565b61024661118b565b6102a761055c366004611ef9565b611198565b6102e460035481565b610229610578366004611ef9565b6111ce565b60016102e4565b6102296105923660046120b1565b600760209081526000928352604080842090915290825290205460ff1681565b6102a76105c0366004611ef9565b61124d565b60006301ffc9a760e01b6001600160e01b0319831614806105f657506380ac58cd60e01b6001600160e01b03198316145b806106115750635b5e139f60e01b6001600160e01b03198316145b92915050565b60008054610624906120db565b80601f0160208091040260200160405190810160405280929190818152602001828054610650906120db565b801561069d5780601f106106725761010080835404028352916020019161069d565b820191906000526020600020905b81548152906001019060200180831161068057829003601f168201915b505050505081565b604051633185c44d60e21b81523060048201526001600160a01b038316602482015282906daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa1580156106ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107239190612115565b61075057604051633b79c77360e21b81526001600160a01b03821660048201526024015b60405180910390fd5b61075a83836112c9565b505050565b600080836040516020016107739190612132565b60408051601f1981840301815291815281516020928301206000908152603c83528181206001600160a01b038716825290925290205460ff1691505092915050565b6107dd6040518060400160405280600681526020016526b4b73a32b960d11b8152503361075f565b6108295760405162461bcd60e51b815260206004820152601b60248201527f436f6e74726f6c6c657261626c653a204e6f74204d696e7465722100000000006044820152606401610747565b61083382826113b8565b5050565b6000600160035460025461084b919061214e565b610855919061214e565b905090565b826001600160a01b038116330361087b576108768484846113ea565b610928565b6001600160a01b0381163b1561091d57604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa1580156108da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108fe9190612115565b61091d57604051633b79c77360e21b8152336004820152602401610747565b6109288484846113ea565b50505050565b603b546001600160a01b031633146109585760405162461bcd60e51b81526004016107479061216f565b61083382828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506113f792505050565b826001600160a01b03811633036109b357610876848484611403565b6001600160a01b0381163b15610a5557604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610a12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a369190612115565b610a5557604051633b79c77360e21b8152336004820152602401610747565b610928848484611403565b603b546001600160a01b031633146108295760405162461bcd60e51b81526004016107479061216f565b6000610a9582610dd6565b5192915050565b60006001600160a01b038216610ae75760405162461bcd60e51b815260206004820152601060248201526f062616c616e63654f6620746f203078360841b6044820152606401610747565b506001600160a01b031660009081526005602052604090205463ffffffff1690565b603b546001600160a01b03163314610b335760405162461bcd60e51b81526004016107479061216f565b8060005b610b5a848483818110610b4c57610b4c61219d565b90506020020135600061141e565b600101818110610b375750505050565b60018054610624906120db565b604051633185c44d60e21b81523060048201526001600160a01b038316602482015282906daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610bd1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf59190612115565b610c1d57604051633b79c77360e21b81526001600160a01b0382166004820152602401610747565b61075a8383611603565b603b546001600160a01b03163314610c515760405162461bcd60e51b81526004016107479061216f565b60008484604051602001610c669291906121b3565b60408051808303601f1901815282825280516020918201206000818152603c83528381206001600160a01b038916808352935292909220805460ff1916861515179055909250908290610cbc90889088906121b3565b6040519081900381208515158252907f519b8f8a91fff81fe4f9a7ac479d388b3ff624a8246d0e59d9f088d8bf20c7149060200160405180910390a45050505050565b836001600160a01b0381163303610d2157610d1c8585858561166f565b610dcf565b6001600160a01b0381163b15610dc357604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610d80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da49190612115565b610dc357604051633b79c77360e21b8152336004820152602401610747565b610dcf8585858561166f565b5050505050565b604080516080810182526000808252602082018190529181018290526060810191909152816001811015610e5d5760405162461bcd60e51b815260206004820152602860248201527f5f676574546f6b656e446174614f66205f6c6f6f6b75704964203c20737461726044820152671d151bdad95b925960c21b6064820152608401610747565b600081815260046020908152604091829020825160808101845290546001600160a01b03811680835264ffffffffff600160a01b8304169383019390935260ff600160c81b82048116151594830194909452600160d01b90049092161515606083015215801590610ed057508060400151155b15610edc579392505050565b806040015115610f2e5760405162461bcd60e51b815260206004820152601d60248201527f5f676574546f6b656e446174614f66206275726e656420746f6b656e210000006044820152606401610747565b6002548210610f905760405162461bcd60e51b815260206004820152602860248201527f5f676574546f6b656e446174614f66205f6c6f6f6b75704964203e205f6e65786044820152671d151bdad95b925960c21b6064820152608401610747565b5b6000199091016000818152600460205260409020549091906001600160a01b031615610f915750600090815260046020908152604091829020825160808101845290546001600160a01b038116825264ffffffffff600160a01b8204169282019290925260ff600160c81b83048116151593820193909352600160d01b9091049091161515606082015292915050565b606f5460ff16156110745760405162461bcd60e51b815260206004820152601960248201527f50726f787920616c726561647920696e697469616c697a6564000000000000006044820152606401610747565b606f805460ff19166001179055603b80546001600160a01b0383166001600160a01b03199091161790556040805180820190915260078152664d616368696e6160c81b60208201526000906110c99082612211565b506040805180820190915260078152664d414348494e4160c81b60208201526001906110f59082612211565b50600160025550565b6060600061110b83610a8a565b6001600160a01b0316036111595760405162461bcd60e51b8152602060048201526015602482015274546f6b656e20646f6573206e6f742065786973742160581b6044820152606401610747565b603a61116483611766565b6040516020016111759291906122d1565b6040516020818303038152906040529050919050565b603a8054610624906120db565b603b546001600160a01b031633146111c25760405162461bcd60e51b81526004016107479061216f565b6111cb816117aa565b50565b604051633185c44d60e21b81523060048201526001600160a01b03821660248201526000906daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611229573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106119190612115565b603b546001600160a01b031633146112775760405162461bcd60e51b81526004016107479061216f565b603b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006112d482610a8a565b9050336001600160a01b038216148061131057506001600160a01b038116600090815260076020908152604080832033845290915290205460ff165b61135c5760405162461bcd60e51b815260206004820152601760248201527f617070726f7665206e6f7420617574686f72697a6564210000000000000000006044820152606401610747565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b805b60148111156113e0576113ce60148261214e565b90506113db836014611813565b6113ba565b61075a8382611813565b61075a838383600161192f565b603a6108338282612211565b61075a83838360405180602001604052806000815250610cff565b600061142983610dd6565b805190915082156114805761143f813386611bd5565b6114805760405162461bcd60e51b815260206004820152601260248201527117d89d5c9b881b9bdd08185c1c1c9bdd995960721b6044820152606401610747565b600084815260066020908152604080832080546001600160a01b03191690556004909152902080546001600160a01b0383166001600160c81b031990911617600160a01b4264ffffffffff16021761ffff60c81b191661010160c81b179055606082015161159657600184016000818152600460205260409020546001600160a01b0316611594576001600254038510156115945760008181526004602090815260409182902085518154928701519387015160608801511515600160d01b0260ff60d01b19911515600160c81b029190911661ffff60c81b1964ffffffffff909616600160a01b026001600160c81b03199095166001600160a01b03909316929092179390931793909316929092171790555b505b6001600160a01b038116600081815260056020526040808220805463ffffffff19811663ffffffff91821660001901909116179055518692907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a450506003805460010190555050565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61167a84848461085a565b6001600160a01b0383163b158061170f5750604051630a85bd0160e11b808252906001600160a01b0385169063150b7a02906116c0903390899088908890600401612358565b6020604051808303816000875af11580156116df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117039190612395565b6001600160e01b031916145b6109285760405162461bcd60e51b815260206004820152602260248201527f736166655472616e7366657246726f6d20746f20756e73616665206164647265604482015261737360f01b6064820152608401610747565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a9004806117805750819003601f19909101908152919050565b604051633e9f1edf60e11b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe90604401600060405180830381600087803b1580156117ff57600080fd5b505af1158015610dcf573d6000803e3d6000fd5b6001600160a01b0382166118585760405162461bcd60e51b815260206004820152600c60248201526b05f6d696e7420746f203078360a41b6044820152606401610747565b600254600081815260046020908152604080832080546001600160a01b0388166001600160c81b03199091168117600160a01b4264ffffffffff160217909155835260059091529020805467ffffffffffffffff19811663ffffffff8083168601811691821764010000000063ffffffff1990941690921783900481168601169091021790558181015b60405182906001600160a01b038616906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48082600101925082106118e257600255505050565b6001600160a01b0383166119785760405162461bcd60e51b815260206004820152601060248201526f05f7472616e7366657220746f203078360841b6044820152606401610747565b600061198383610dd6565b80519091506001600160a01b03868116908216146119e35760405162461bcd60e51b815260206004820152601860248201527f5f7472616e73666572206e6f742066726f6d206f776e657200000000000000006044820152606401610747565b8215611a39576119f4813386611bd5565b611a395760405162461bcd60e51b815260206004820152601660248201527517dd1c985b9cd9995c881b9bdd08185c1c1c9bdd995960521b6044820152606401610747565b600084815260066020908152604080832080546001600160a01b031916905560049091529020805460ff60d01b1964ffffffffff4216600160a01b026001600160c81b03199092166001600160a01b038916179190911716600160d01b1790556060820151611b5057600184016000818152600460205260409020546001600160a01b0316611b4e57600160025403851015611b4e5760008181526004602090815260409182902085518154928701519387015160608801511515600160d01b0260ff60d01b19911515600160c81b029190911661ffff60c81b1964ffffffffff909616600160a01b026001600160c81b03199095166001600160a01b03909316929092179390931793909316929092171790555b505b6001600160a01b03868116600081815260056020526040808220805463ffffffff1980821663ffffffff92831660001901831617909255948a1680845282842080549283169287166001019096169190911790945551879392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050505050565b6000826001600160a01b0316846001600160a01b03161480611c1057506000828152600660205260409020546001600160a01b038481169116145b80611c4057506001600160a01b0380851660009081526007602090815260408083209387168352929052205460ff165b949350505050565b6001600160e01b0319811681146111cb57600080fd5b600060208284031215611c7057600080fd5b8135611c7b81611c48565b9392505050565b60005b83811015611c9d578181015183820152602001611c85565b50506000910152565b60008151808452611cbe816020860160208601611c82565b601f01601f19169290920160200192915050565b602081526000611c7b6020830184611ca6565b600060208284031215611cf757600080fd5b5035919050565b80356001600160a01b0381168114611d1557600080fd5b919050565b60008060408385031215611d2d57600080fd5b611d3683611cfe565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115611d7557611d75611d44565b604051601f8501601f19908116603f01168101908282118183101715611d9d57611d9d611d44565b81604052809350858152868686011115611db657600080fd5b858560208301376000602087830101525050509392505050565b60008060408385031215611de357600080fd5b823567ffffffffffffffff811115611dfa57600080fd5b8301601f81018513611e0b57600080fd5b611e1a85823560208401611d5a565b925050611e2960208401611cfe565b90509250929050565b600080600060608486031215611e4757600080fd5b611e5084611cfe565b9250611e5e60208501611cfe565b9150604084013590509250925092565b60008083601f840112611e8057600080fd5b50813567ffffffffffffffff811115611e9857600080fd5b602083019150836020828501011115611eb057600080fd5b9250929050565b60008060208385031215611eca57600080fd5b823567ffffffffffffffff811115611ee157600080fd5b611eed85828601611e6e565b90969095509350505050565b600060208284031215611f0b57600080fd5b611c7b82611cfe565b60008060208385031215611f2757600080fd5b823567ffffffffffffffff80821115611f3f57600080fd5b818501915085601f830112611f5357600080fd5b813581811115611f6257600080fd5b8660208260051b8501011115611f7757600080fd5b60209290920196919550909350505050565b80151581146111cb57600080fd5b60008060408385031215611faa57600080fd5b611fb383611cfe565b91506020830135611fc381611f89565b809150509250929050565b60008060008060608587031215611fe457600080fd5b843567ffffffffffffffff811115611ffb57600080fd5b61200787828801611e6e565b909550935061201a905060208601611cfe565b9150604085013561202a81611f89565b939692955090935050565b6000806000806080858703121561204b57600080fd5b61205485611cfe565b935061206260208601611cfe565b925060408501359150606085013567ffffffffffffffff81111561208557600080fd5b8501601f8101871361209657600080fd5b6120a587823560208401611d5a565b91505092959194509250565b600080604083850312156120c457600080fd5b6120cd83611cfe565b9150611e2960208401611cfe565b600181811c908216806120ef57607f821691505b60208210810361210f57634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561212757600080fd5b8151611c7b81611f89565b60008251612144818460208701611c82565b9190910192915050565b8181038181111561061157634e487b7160e01b600052601160045260246000fd5b6020808252601490820152736f6e6c794f776e6572206e6f74206f776e65722160601b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b8183823760009101908152919050565b601f82111561075a57600081815260208120601f850160051c810160208610156121ea5750805b601f850160051c820191505b81811015612209578281556001016121f6565b505050505050565b815167ffffffffffffffff81111561222b5761222b611d44565b61223f8161223984546120db565b846121c3565b602080601f831160018114612274576000841561225c5750858301515b600019600386901b1c1916600185901b178555612209565b600085815260208120601f198616915b828110156122a357888601518255948401946001909101908401612284565b50858210156122c15787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008084546122df816120db565b600182811680156122f7576001811461230c5761233b565b60ff198416875282151583028701945061233b565b8860005260208060002060005b858110156123325781548a820152908401908201612319565b50505082870194505b50505050835161234f818360208801611c82565b01949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061238b90830184611ca6565b9695505050505050565b6000602082840312156123a757600080fd5b8151611c7b81611c4856fea26469706673582212200d11667aba1d5cb854594ef026606f6582c71c3b6c592c2e533496c00a79099164736f6c63430008110033

Deployed Bytecode Sourcemap

18675:3442:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13316:310;;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;13316:310:0;;;;;;;;975:18;;;:::i;:::-;;;;;;;:::i;2405:46::-;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;2405:46:0;;;;;;-1:-1:-1;;;;;1697:32:1;;;1679:51;;1667:2;1652:18;2405:46:0;1533:203:1;20822:167:0;;;;;;:::i;:::-;;:::i;:::-;;15956:217;;;;;;:::i;:::-;;:::i;20125:114::-;;;;;;:::i;:::-;;:::i;18830:30::-;;;;;;;;;1404:129;;;:::i;:::-;;;3627:25:1;;;3615:2;3600:18;1404:129:0;3481:177:1;20995:175:0;;;;;;:::i;:::-;;:::i;1098:41::-;;1137:2;1098:41;;2258:47;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;2258:47:0;;;;-1:-1:-1;;;2258:47:0;;;;;-1:-1:-1;;;2258:47:0;;;;;-1:-1:-1;;;2258:47:0;;;;;;;;;-1:-1:-1;;;;;4231:32:1;;;4213:51;;4312:12;4300:25;;;4295:2;4280:18;;4273:53;4369:14;;4362:22;4342:18;;;4335:50;;;;4428:14;4421:22;4416:2;4401:18;;4394:50;4200:3;4185:19;2258:47:0;3996:454:1;20284:107:0;;;;;;:::i;:::-;;:::i;21176:183::-;;;;;;:::i;:::-;;:::i;19740:106::-;;;;;;:::i;:::-;;:::i;2312:51::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;5595:10:1;5632:15;;;5614:34;;5684:15;;;;5679:2;5664:18;;5657:43;5558:18;2312:51:0;5415:291:1;4595:122:0;;;;;;:::i;:::-;;:::i;4246:187::-;;;;;;:::i;:::-;;:::i;1030:26::-;;;;;;19852:223;;;;;;:::i;:::-;;:::i;14863:20::-;;;;;-1:-1:-1;;;;;14863:20:0;;;1001;;;:::i;20630:186::-;;;;;;:::i;:::-;;:::i;16935:135::-;;17027:42;16935:135;;16181:288;;;;;;:::i;:::-;;:::i;21365:211::-;;;;;;:::i;:::-;;:::i;2786:1371::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;8526:13:1;;-1:-1:-1;;;;;8522:39:1;8504:58;;8622:4;8610:17;;;8604:24;8630:12;8600:43;8578:20;;;8571:73;8714:4;8702:17;;;8696:24;8689:32;8682:40;8660:20;;;8653:70;8793:4;8781:17;;;8775:24;8768:32;8761:40;8739:20;;;8732:70;;;;8491:3;8476:19;;8305:503;18867:371:0;;;;;;:::i;:::-;;:::i;21823:256::-;;;;;;:::i;:::-;;:::i;13843:26::-;;;:::i;20443:132::-;;;;;;:::i;:::-;;:::i;1063:26::-;;;;;;21626:163;;;;;;:::i;:::-;;:::i;19599:98::-;19688:1;19599:98;;2458:68;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;15018:170;;;;;;:::i;:::-;;:::i;13316:310::-;13385:4;-1:-1:-1;;;;;;;;;13410:18:0;;;;:91;;-1:-1:-1;;;;;;;;;;13483:18:0;;;13410:91;:164;;;-1:-1:-1;;;;;;;;;;13556:18:0;;;13410:164;13402:172;13316:310;-1:-1:-1;;13316:310:0:o;975:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;20822:167::-;18489:60;;-1:-1:-1;;;18489:60:0;;18532:4;18489:60;;;9675:34:1;-1:-1:-1;;;;;9745:15:1;;9725:18;;;9718:43;20925:9:0;;17027:42;;18489:34;;9610:18:1;;18489:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18484:130;;18573:29;;-1:-1:-1;;;18573:29:0;;-1:-1:-1;;;;;1697:32:1;;18573:29:0;;;1679:51:1;1652:18;;18573:29:0;;;;;;;;18484:130;20947:34:::1;20961:9;20972:8;20947:13;:34::i;:::-;20822:167:::0;;;:::o;15956:217::-;16047:4;16064:13;16107:5;16090:23;;;;;;;;:::i;:::-;;;;-1:-1:-1;;16090:23:0;;;;;;;;;16080:34;;16090:23;16080:34;;;;16132:20;;;;:13;:20;;;;;-1:-1:-1;;;;;16132:33:0;;;;;;;;;;;;;-1:-1:-1;;15956:217:0;;;;:::o;20125:114::-;19453:34;;;;;;;;;;;;;;-1:-1:-1;;;19453:34:0;;;19476:10;19453:12;:34::i;:::-;19445:91;;;;-1:-1:-1;;;19445:91:0;;10518:2:1;19445:91:0;;;10500:21:1;10557:2;10537:18;;;10530:30;10596:29;10576:18;;;10569:57;10643:18;;19445:91:0;10316:351:1;19445:91:0;20212:19:::1;20218:3;20223:7;20212:5;:19::i;:::-;20125:114:::0;;:::o;1404:129::-;1456:7;19688:1;1497:11;;1483;;:25;;;;:::i;:::-;:42;;;;:::i;:::-;1476:49;;1404:129;:::o;20995:175::-;21104:5;-1:-1:-1;;;;;17565:19:0;;:10;:19;17561:74;;21122:40:::1;21141:5;21148:3;21153:8;21122:18;:40::i;:::-;17617:7:::0;;17561:74;-1:-1:-1;;;;;17811:17:0;;;:21;17807:338;;17854:61;;-1:-1:-1;;;17854:61:0;;17897:4;17854:61;;;9675:34:1;17904:10:0;9725:18:1;;;9718:43;17027:42:0;;17854:34;;9610:18:1;;17854:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17849:285;;18088:30;;-1:-1:-1;;;18088:30:0;;18107:10;18088:30;;;1679:51:1;1652:18;;18088:30:0;1533:203:1;17849:285:0;21122:40:::1;21141:5;21148:3;21153:8;21122:18;:40::i;:::-;20995:175:::0;;;;:::o;20284:107::-;14962:5;;-1:-1:-1;;;;;14962:5:0;14971:10;14962:19;14954:52;;;;-1:-1:-1;;;14954:52:0;;;;;;;:::i;:::-;20361:22:::1;20378:4;;20361:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;20361:16:0::1;::::0;-1:-1:-1;;;20361:22:0:i:1;21176:183::-:0;21289:5;-1:-1:-1;;;;;17565:19:0;;:10;:19;17561:74;;21307:44:::1;21330:5;21337:3;21342:8;21307:22;:44::i;17561:74::-:0;-1:-1:-1;;;;;17811:17:0;;;:21;17807:338;;17854:61;;-1:-1:-1;;;17854:61:0;;17897:4;17854:61;;;9675:34:1;17904:10:0;9725:18:1;;;9718:43;17027:42:0;;17854:34;;9610:18:1;;17854:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17849:285;;18088:30;;-1:-1:-1;;;18088:30:0;;18107:10;18088:30;;;1679:51:1;1652:18;;18088:30:0;1533:203:1;17849:285:0;21307:44:::1;21330:5;21337:3;21342:8;21307:22;:44::i;19740:106::-:0;14962:5;;-1:-1:-1;;;;;14962:5:0;14971:10;14962:19;14954:52;;;;-1:-1:-1;;;14954:52:0;;;;;;;:::i;4595:122::-;4651:7;4678:25;4694:8;4678:15;:25::i;:::-;:31;;4595:122;-1:-1:-1;;4595:122:0:o;4246:187::-;4310:7;-1:-1:-1;;;;;4338:20:0;;4330:49;;;;-1:-1:-1;;;4330:49:0;;11453:2:1;4330:49:0;;;11435:21:1;11492:2;11472:18;;;11465:30;-1:-1:-1;;;11511:18:1;;;11504:46;11567:18;;4330:49:0;11251:340:1;4330:49:0;-1:-1:-1;;;;;;4397:20:0;;;;;:12;:20;;;;;:28;;;;4246:187::o;19852:223::-;14962:5;;-1:-1:-1;;;;;14962:5:0;14971:10;14962:19;14954:52;;;;-1:-1:-1;;;14954:52:0;;;;;;;:::i;:::-;19943:9;19931::::1;19993:73;20011:26;20017:9;;20027:1;20017:12;;;;;;;:::i;:::-;;;;;;;20031:5;20011;:26::i;:::-;20057:3;;:7:::0;;::::1;19993:73;;19920:155;;19852:223:::0;;:::o;1001:20::-;;;;;;;:::i;20630:186::-;18489:60;;-1:-1:-1;;;18489:60:0;;18532:4;18489:60;;;9675:34:1;-1:-1:-1;;;;;9745:15:1;;9725:18;;;9718:43;20741:9:0;;17027:42;;18489:34;;9610:18:1;;18489:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18484:130;;18573:29;;-1:-1:-1;;;18573:29:0;;-1:-1:-1;;;;;1697:32:1;;18573:29:0;;;1679:51:1;1652:18;;18573:29:0;1533:203:1;18484:130:0;20763:45:::1;20787:9;20798;20763:23;:45::i;16181:288::-:0;14962:5;;-1:-1:-1;;;;;14962:5:0;14971:10;14962:19;14954:52;;;;-1:-1:-1;;;14954:52:0;;;;;;;:::i;:::-;16296:13:::1;16339:5;;16322:23;;;;;;;;;:::i;:::-;;::::0;;;;::::1;-1:-1:-1::0;;16322:23:0;;;;;;16312:34;;16322:23:::1;16312:34:::0;;::::1;::::0;16357:20:::1;::::0;;;:13:::1;:20:::0;;;;;-1:-1:-1;;;;;16357:33:0;::::1;::::0;;;;;;;;;:41;;-1:-1:-1;;16357:41:0::1;::::0;::::1;;;::::0;;16312:34;;-1:-1:-1;16357:33:0;16312:34;;16414:47:::1;::::0;16428:5;;;;16414:47:::1;:::i;:::-;;::::0;;;;::::1;::::0;;565:14:1;;558:22;540:41;;16414:47:0;::::1;::::0;528:2:1;513:18;16414:47:0::1;;;;;;;16285:184;16181:288:::0;;;;:::o;21365:211::-;21499:5;-1:-1:-1;;;;;17565:19:0;;:10;:19;17561:74;;21517:51:::1;21540:5;21547:3;21552:8;21562:5;21517:22;:51::i;:::-;17617:7:::0;;17561:74;-1:-1:-1;;;;;17811:17:0;;;:21;17807:338;;17854:61;;-1:-1:-1;;;17854:61:0;;17897:4;17854:61;;;9675:34:1;17904:10:0;9725:18:1;;;9718:43;17027:42:0;;17854:34;;9610:18:1;;17854:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17849:285;;18088:30;;-1:-1:-1;;;18088:30:0;;18107:10;18088:30;;;1679:51:1;1652:18;;18088:30:0;1533:203:1;17849:285:0;21517:51:::1;21540:5;21547:3;21552:8;21562:5;21517:22;:51::i;:::-;21365:211:::0;;;;;:::o;2786:1371::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2980:8:0;19688:1;3067:9;:27;;3059:80;;;;-1:-1:-1;;;3059:80:0;;12208:2:1;3059:80:0;;;12190:21:1;12247:2;12227:18;;;12220:30;12286:34;12266:18;;;12259:62;-1:-1:-1;;;12337:18:1;;;12330:38;12385:19;;3059:80:0;12006:404:1;3059:80:0;3219:27;3249:21;;;:10;:21;;;;;;;;;3219:51;;;;;;;;;-1:-1:-1;;;;;3219:51:0;;;;;;-1:-1:-1;;;3219:51:0;;;;;;;;;;;-1:-1:-1;;;3219:51:0;;;;;;;;;;;;;-1:-1:-1;;;3219:51:0;;;;;;;;;;;3371:30;;;;:52;;;3406:10;:17;;;3405:18;3371:52;3367:75;;;3432:10;2786:1371;-1:-1:-1;;;2786:1371:0:o;3367:75::-;3542:10;:17;;;3541:18;3533:60;;;;-1:-1:-1;;;3533:60:0;;12617:2:1;3533:60:0;;;12599:21:1;12656:2;12636:18;;;12629:30;12695:31;12675:18;;;12668:59;12744:18;;3533:60:0;12415:353:1;3533:60:0;3693:11;;3681:9;:23;3673:76;;;;-1:-1:-1;;;3673:76:0;;12975:2:1;3673:76:0;;;12957:21:1;13014:2;12994:18;;;12987:30;13053:34;13033:18;;;13026:62;-1:-1:-1;;;13104:18:1;;;13097:38;13152:19;;3673:76:0;12773:404:1;3673:76:0;4056:53;-1:-1:-1;;4073:11:0;;;4103:1;4062:23;;;:10;:23;;;;;:29;4073:11;;-1:-1:-1;;;;;;4062:29:0;4056:53;;;-1:-1:-1;4128:21:0;;;;:10;:21;;;;;;;;;4121:28;;;;;;;;;-1:-1:-1;;;;;4121:28:0;;;;;-1:-1:-1;;;4121:28:0;;;;;;;;;;;-1:-1:-1;;;4121:28:0;;;;;;;;;;;;;-1:-1:-1;;;4121:28:0;;;;;;;;;;;;;2786:1371;-1:-1:-1;;2786:1371:0:o;18867:371::-;18938:18;;;;18937:19;18929:57;;;;-1:-1:-1;;;18929:57:0;;13384:2:1;18929:57:0;;;13366:21:1;13423:2;13403:18;;;13396:30;13462:27;13442:18;;;13435:55;13507:18;;18929:57:0;13182:349:1;18929:57:0;18997:18;:25;;-1:-1:-1;;18997:25:0;19018:4;18997:25;;;19056:5;:17;;-1:-1:-1;;;;;19056:17:0;;-1:-1:-1;;;;;;19056:17:0;;;;;;19101:16;;;;;;;;;;;;-1:-1:-1;;;19101:16:0;;;;18997:18;;19101:16;;18997:18;19101:16;:::i;:::-;-1:-1:-1;19143:18:0;;;;;;;;;;;;-1:-1:-1;;;19143:18:0;;;;:6;;:18;;:6;:18;:::i;:::-;-1:-1:-1;19688:1:0;19187:11;:28;-1:-1:-1;18867:371:0:o;21823:256::-;21903:13;21966:1;21937:17;21945:8;21937:7;:17::i;:::-;-1:-1:-1;;;;;21937:31:0;;21929:65;;;;-1:-1:-1;;;21929:65:0;;15942:2:1;21929:65:0;;;15924:21:1;15981:2;15961:18;;;15954:30;-1:-1:-1;;;16000:18:1;;;15993:51;16061:18;;21929:65:0;15740:345:1;21929:65:0;22036:12;22050:19;22060:8;22050:9;:19::i;:::-;22019:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22005:66;;21823:256;;;:::o;13843:26::-;;;;;;;:::i;20443:132::-;14962:5;;-1:-1:-1;;;;;14962:5:0;14971:10;14962:19;14954:52;;;;-1:-1:-1;;;14954:52:0;;;;;;;:::i;:::-;20530:37:::1;20554:12;20530:23;:37::i;:::-;20443:132:::0;:::o;21626:163::-;21721:60;;-1:-1:-1;;;21721:60:0;;21764:4;21721:60;;;9675:34:1;-1:-1:-1;;;;;9745:15:1;;9725:18;;;9718:43;21697:4:0;;17027:42;;21721:34;;9610:18:1;;21721:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;15018:170::-;14962:5;;-1:-1:-1;;;;;14962:5:0;14971:10;14962:19;14954:52;;;;-1:-1:-1;;;14954:52:0;;;;;;;:::i;:::-;15104:5:::1;::::0;;-1:-1:-1;;;;;15120:12:0;;::::1;-1:-1:-1::0;;;;;;15120:12:0;::::1;::::0;::::1;::::0;;;15148:32:::1;::::0;15104:5;::::1;::::0;15120:12;15104:5;;15148:32:::1;::::0;15089:12:::1;::::0;15148:32:::1;15078:110;15018:170:::0;:::o;12348:340::-;12427:14;12444:17;12452:8;12444:7;:17::i;:::-;12427:34;-1:-1:-1;12480:10:0;-1:-1:-1;;;;;12480:20:0;;;;:60;;-1:-1:-1;;;;;;12504:24:0;;;;;;:16;:24;;;;;;;;12529:10;12504:36;;;;;;;;;;12480:60;12472:113;;;;-1:-1:-1;;;12472:113:0;;17317:2:1;12472:113:0;;;17299:21:1;17356:2;17336:18;;;17329:30;17395:25;17375:18;;;17368:53;17438:18;;12472:113:0;17115:347:1;12472:113:0;12596:21;;;;:11;:21;;;;;;:32;;-1:-1:-1;;;;;;12596:32:0;-1:-1:-1;;;;;12596:32:0;;;;;;;;;12644:36;;12596:21;;12644:36;;;;;;;12416:272;12348:340;;:::o;5821:306::-;5918:7;5936:140;1137:2;5943:13;:28;5936:140;;;5988:29;1137:2;5988:29;;:::i;:::-;;;6032:32;6046:3;1137:2;6032:13;:32::i;:::-;5936:140;;;6086:33;6100:3;6105:13;6086;:33::i;11574:139::-;11668:37;11678:5;11685:3;11690:8;11700:4;11668:9;:37::i;13878:101::-;13952:12;:19;13967:4;13952:12;:19;:::i;12152:154::-;12256:42;12273:5;12280:3;12285:8;12256:42;;;;;;;;;;;;:16;:42::i;6206:2440::-;6626:27;6656:25;6672:8;6656:15;:25::i;:::-;6709:16;;6626:55;;-1:-1:-1;6800:136:0;;;;6828:48;6847:6;6855:10;6867:8;6828:18;:48::i;:::-;6820:116;;;;-1:-1:-1;;;6820:116:0;;17669:2:1;6820:116:0;;;17651:21:1;17708:2;17688:18;;;17681:30;-1:-1:-1;;;17727:18:1;;;17720:48;17785:18;;6820:116:0;17467:342:1;6820:116:0;7024:21;;;;:11;:21;;;;;;;;7017:28;;-1:-1:-1;;;;;;7017:28:0;;;7102:10;:20;;;;;:35;;-1:-1:-1;;;;;7102:35:0;;-1:-1:-1;;;;;;7148:59:0;;;;-1:-1:-1;;;7191:15:0;7148:59;;;;-1:-1:-1;;;;7384:43:0;-1:-1:-1;;;7384:43:0;;;7539:26;;;;7534:873;;7837:1;7826:12;;7796:27;7857:31;;;:10;:31;;;;;:37;-1:-1:-1;;;;;7857:37:0;7853:543;;8042:1;8028:11;;:15;8017:8;:26;8013:368;;;8317:31;;;;:10;:31;;;;;;;;;:44;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8317:44:0;-1:-1:-1;;;;8317:44:0;;;-1:-1:-1;;;8317:44:0;;;;;-1:-1:-1;;;;8317:44:0;;;;-1:-1:-1;;;8317:44:0;-1:-1:-1;;;;;;8317:44:0;;;-1:-1:-1;;;;;8317:44:0;;;;;;;;;;;;;;;;;;;;;;8013:368;7567:840;7534:873;-1:-1:-1;;;;;8460:20:0;;;;;;:12;:20;;;;;;:30;;-1:-1:-1;;8460:30:0;;;;;;-1:-1:-1;;8460:30:0;;;;;;;8539:38;8568:8;;8460:20;8539:38;;8460:20;;8539:38;-1:-1:-1;;8624:11:0;:13;;;;;;-1:-1:-1;;6206:2440:0:o;12694:211::-;12799:10;12782:28;;;;:16;:28;;;;;;;;-1:-1:-1;;;;;12782:39:0;;;;;;;;;;;;:51;;-1:-1:-1;;12782:51:0;;;;;;;;;;12849:48;;540:41:1;;;12782:39:0;;12799:10;12849:48;;513:18:1;12849:48:0;;;;;;;12694:211;;:::o;11719:427::-;11842:34;11855:5;11862:3;11867:8;11842:12;:34::i;:::-;-1:-1:-1;;;;;11895:15:0;;;:20;;:190;;-1:-1:-1;11932:91:0;;-1:-1:-1;;;11932:91:0;;;12040:45;-1:-1:-1;;;;;11932:55:0;;;12040:45;;11932:91;;11988:10;;12000:5;;12007:8;;12017:5;;11932:91;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;11932:153:0;;11895:190;11887:251;;;;-1:-1:-1;;;11887:251:0;;18764:2:1;11887:251:0;;;18746:21:1;18803:2;18783:18;;;18776:30;18842:34;18822:18;;;18815:62;-1:-1:-1;;;18893:18:1;;;18886:32;18935:19;;11887:251:0;18562:398:1;13987:653:0;14059:18;14140:4;14133;14127:11;14123:22;14172:1;14166:4;14159:15;14203:4;14200:1;14196:12;14188:20;;;14235:1;14229:4;14222:15;14264:4;14302:6;14284:223;14353:1;14347:4;14343:12;14335:20;;14405:2;14399:4;14395:13;14391:2;14387:22;14381:4;14373:37;14446:2;14436:13;;14467:25;14284:223;14467:25;-1:-1:-1;14537:14:0;;;-1:-1:-1;;14573:15:0;;;14602:20;;;14573:15;13987:653;-1:-1:-1;13987:653:0:o;17222:149::-;17297:66;;-1:-1:-1;;;17297:66:0;;17343:4;17297:66;;;9675:34:1;-1:-1:-1;;;;;9745:15:1;;9725:18;;;9718:43;17027:42:0;;17297:37;;9610:18:1;;17297:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4832:899;-1:-1:-1;;;;;4967:17:0;;4959:42;;;;-1:-1:-1;;;4959:42:0;;19167:2:1;4959:42:0;;;19149:21:1;19206:2;19186:18;;;19179:30;-1:-1:-1;;;19225:18:1;;;19218:42;19277:18;;4959:42:0;18965:336:1;4959:42:0;5116:11;;5097:16;5245:20;;;:10;:20;;;;;;;;:32;;-1:-1:-1;;;;;5245:32:0;;-1:-1:-1;;;;;;5288:59:0;;;;;-1:-1:-1;;;5331:15:0;5288:59;;;;;;;5414:17;;:12;:17;;;;;:44;;-1:-1:-1;;5469:49:0;;5414:44;;;;;;;;5469:49;;;;-1:-1:-1;;5414:44:0;;;;;;5469:49;;;;;;;;;;;;;;5155:18;;;5569:77;5579:35;;5605:8;;-1:-1:-1;;;;;5579:35:0;;;5596:1;;5579:35;;5596:1;;5579:35;5638:6;5625:10;;;;;;:19;5569:77;;5702:11;:20;-1:-1:-1;;;4832:899:0:o;8895:2284::-;-1:-1:-1;;;;;9072:17:0;;9064:46;;;;-1:-1:-1;;;9064:46:0;;19508:2:1;9064:46:0;;;19490:21:1;19547:2;19527:18;;;19520:30;-1:-1:-1;;;19566:18:1;;;19559:46;19622:18;;9064:46:0;19306:340:1;9064:46:0;9187:27;9217:25;9233:8;9217:15;:25::i;:::-;9270:16;;9187:55;;-1:-1:-1;;;;;;9350:15:0;;;;;;;9342:52;;;;-1:-1:-1;;;9342:52:0;;19853:2:1;9342:52:0;;;19835:21:1;19892:2;19872:18;;;19865:30;19931:26;19911:18;;;19904:54;19975:18;;9342:52:0;19651:348:1;9342:52:0;9473:14;9469:135;;;9497:48;9516:6;9524:10;9536:8;9497:18;:48::i;:::-;9489:115;;;;-1:-1:-1;;;9489:115:0;;20206:2:1;9489:115:0;;;20188:21:1;20245:2;20225:18;;;20218:30;-1:-1:-1;;;20264:18:1;;;20257:52;20326:18;;9489:115:0;20004:346:1;9489:115:0;9688:21;;;;:11;:21;;;;;;;;9681:28;;-1:-1:-1;;;;;;9681:28:0;;;9751:10;:20;;;;;:32;;-1:-1:-1;;;;9794:59:0;9837:15;9794:59;-1:-1:-1;;;9794:59:0;-1:-1:-1;;;;;;9794:59:0;;;-1:-1:-1;;;;;9751:32:0;;9794:59;;;;;9937:43;-1:-1:-1;;;9937:43:0;;;10116:26;;;;10111:874;;10414:1;10403:12;;10373:27;10434:31;;;:10;:31;;;;;:37;-1:-1:-1;;;;;10434:37:0;10430:544;;10619:1;10605:11;;:15;10594:8;:26;10590:369;;;10895:31;;;;:10;:31;;;;;;;;;:44;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10895:44:0;-1:-1:-1;;;;10895:44:0;;;-1:-1:-1;;;10895:44:0;;;;;-1:-1:-1;;;;10895:44:0;;;;-1:-1:-1;;;10895:44:0;-1:-1:-1;;;;;;10895:44:0;;;-1:-1:-1;;;;;10895:44:0;;;;;;;;;;;;;;;;;;;;;;10590:369;10144:841;10111:874;-1:-1:-1;;;;;11029:19:0;;;;;;;:12;:19;;;;;;:29;;-1:-1:-1;;11029:29:0;;;;;;;-1:-1:-1;;11029:29:0;;;;;;;11069:17;;;;;;;;;:27;;;;;;;;-1:-1:-1;11069:27:0;;;;;;;;;;;11140:30;11161:8;;11069:17;11029:19;11140:30;;;9006:2172;;8895:2284;;;;:::o;12996:278::-;13113:4;13148:8;-1:-1:-1;;;;;13138:18:0;:6;-1:-1:-1;;;;;13138:18:0;;:72;;;-1:-1:-1;13177:21:0;;;;:11;:21;;;;;;-1:-1:-1;;;;;13177:33:0;;;:21;;:33;13138:72;:127;;;-1:-1:-1;;;;;;13231:24:0;;;;;;;:16;:24;;;;;;;;:34;;;;;;;;;;;;13138:127;13130:136;12996:278;-1:-1:-1;;;;12996:278:0:o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;:::-;384:5;150:245;-1:-1:-1;;;150:245:1:o;592:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:1;816:16;;809:27;592:250::o;847:271::-;889:3;927:5;921:12;954:6;949:3;942:19;970:76;1039:6;1032:4;1027:3;1023:14;1016:4;1009:5;1005:16;970:76;:::i;:::-;1100:2;1079:15;-1:-1:-1;;1075:29:1;1066:39;;;;1107:4;1062:50;;847:271;-1:-1:-1;;847:271:1:o;1123:220::-;1272:2;1261:9;1254:21;1235:4;1292:45;1333:2;1322:9;1318:18;1310:6;1292:45;:::i;1348:180::-;1407:6;1460:2;1448:9;1439:7;1435:23;1431:32;1428:52;;;1476:1;1473;1466:12;1428:52;-1:-1:-1;1499:23:1;;1348:180;-1:-1:-1;1348:180:1:o;1741:173::-;1809:20;;-1:-1:-1;;;;;1858:31:1;;1848:42;;1838:70;;1904:1;1901;1894:12;1838:70;1741:173;;;:::o;1919:254::-;1987:6;1995;2048:2;2036:9;2027:7;2023:23;2019:32;2016:52;;;2064:1;2061;2054:12;2016:52;2087:29;2106:9;2087:29;:::i;:::-;2077:39;2163:2;2148:18;;;;2135:32;;-1:-1:-1;;;1919:254:1:o;2178:127::-;2239:10;2234:3;2230:20;2227:1;2220:31;2270:4;2267:1;2260:15;2294:4;2291:1;2284:15;2310:632;2375:5;2405:18;2446:2;2438:6;2435:14;2432:40;;;2452:18;;:::i;:::-;2527:2;2521:9;2495:2;2581:15;;-1:-1:-1;;2577:24:1;;;2603:2;2573:33;2569:42;2557:55;;;2627:18;;;2647:22;;;2624:46;2621:72;;;2673:18;;:::i;:::-;2713:10;2709:2;2702:22;2742:6;2733:15;;2772:6;2764;2757:22;2812:3;2803:6;2798:3;2794:16;2791:25;2788:45;;;2829:1;2826;2819:12;2788:45;2879:6;2874:3;2867:4;2859:6;2855:17;2842:44;2934:1;2927:4;2918:6;2910;2906:19;2902:30;2895:41;;;;2310:632;;;;;:::o;2947:529::-;3025:6;3033;3086:2;3074:9;3065:7;3061:23;3057:32;3054:52;;;3102:1;3099;3092:12;3054:52;3142:9;3129:23;3175:18;3167:6;3164:30;3161:50;;;3207:1;3204;3197:12;3161:50;3230:22;;3283:4;3275:13;;3271:27;-1:-1:-1;3261:55:1;;3312:1;3309;3302:12;3261:55;3335:76;3403:7;3398:2;3385:16;3378:4;3374:2;3370:13;3335:76;:::i;:::-;3325:86;;;3430:40;3464:4;3453:9;3449:20;3430:40;:::i;:::-;3420:50;;2947:529;;;;;:::o;3663:328::-;3740:6;3748;3756;3809:2;3797:9;3788:7;3784:23;3780:32;3777:52;;;3825:1;3822;3815:12;3777:52;3848:29;3867:9;3848:29;:::i;:::-;3838:39;;3896:38;3930:2;3919:9;3915:18;3896:38;:::i;:::-;3886:48;;3981:2;3970:9;3966:18;3953:32;3943:42;;3663:328;;;;;:::o;4455:348::-;4507:8;4517:6;4571:3;4564:4;4556:6;4552:17;4548:27;4538:55;;4589:1;4586;4579:12;4538:55;-1:-1:-1;4612:20:1;;4655:18;4644:30;;4641:50;;;4687:1;4684;4677:12;4641:50;4724:4;4716:6;4712:17;4700:29;;4776:3;4769:4;4760:6;4752;4748:19;4744:30;4741:39;4738:59;;;4793:1;4790;4783:12;4738:59;4455:348;;;;;:::o;4808:411::-;4879:6;4887;4940:2;4928:9;4919:7;4915:23;4911:32;4908:52;;;4956:1;4953;4946:12;4908:52;4996:9;4983:23;5029:18;5021:6;5018:30;5015:50;;;5061:1;5058;5051:12;5015:50;5100:59;5151:7;5142:6;5131:9;5127:22;5100:59;:::i;:::-;5178:8;;5074:85;;-1:-1:-1;4808:411:1;-1:-1:-1;;;;4808:411:1:o;5224:186::-;5283:6;5336:2;5324:9;5315:7;5311:23;5307:32;5304:52;;;5352:1;5349;5342:12;5304:52;5375:29;5394:9;5375:29;:::i;5711:615::-;5797:6;5805;5858:2;5846:9;5837:7;5833:23;5829:32;5826:52;;;5874:1;5871;5864:12;5826:52;5914:9;5901:23;5943:18;5984:2;5976:6;5973:14;5970:34;;;6000:1;5997;5990:12;5970:34;6038:6;6027:9;6023:22;6013:32;;6083:7;6076:4;6072:2;6068:13;6064:27;6054:55;;6105:1;6102;6095:12;6054:55;6145:2;6132:16;6171:2;6163:6;6160:14;6157:34;;;6187:1;6184;6177:12;6157:34;6240:7;6235:2;6225:6;6222:1;6218:14;6214:2;6210:23;6206:32;6203:45;6200:65;;;6261:1;6258;6251:12;6200:65;6292:2;6284:11;;;;;6314:6;;-1:-1:-1;5711:615:1;;-1:-1:-1;;;;5711:615:1:o;6331:118::-;6417:5;6410:13;6403:21;6396:5;6393:32;6383:60;;6439:1;6436;6429:12;6454:315;6519:6;6527;6580:2;6568:9;6559:7;6555:23;6551:32;6548:52;;;6596:1;6593;6586:12;6548:52;6619:29;6638:9;6619:29;:::i;:::-;6609:39;;6698:2;6687:9;6683:18;6670:32;6711:28;6733:5;6711:28;:::i;:::-;6758:5;6748:15;;;6454:315;;;;;:::o;7014:614::-;7100:6;7108;7116;7124;7177:2;7165:9;7156:7;7152:23;7148:32;7145:52;;;7193:1;7190;7183:12;7145:52;7233:9;7220:23;7266:18;7258:6;7255:30;7252:50;;;7298:1;7295;7288:12;7252:50;7337:59;7388:7;7379:6;7368:9;7364:22;7337:59;:::i;:::-;7415:8;;-1:-1:-1;7311:85:1;-1:-1:-1;7469:38:1;;-1:-1:-1;7503:2:1;7488:18;;7469:38;:::i;:::-;7459:48;;7557:2;7546:9;7542:18;7529:32;7570:28;7592:5;7570:28;:::i;:::-;7014:614;;;;-1:-1:-1;7014:614:1;;-1:-1:-1;;7014:614:1:o;7633:667::-;7728:6;7736;7744;7752;7805:3;7793:9;7784:7;7780:23;7776:33;7773:53;;;7822:1;7819;7812:12;7773:53;7845:29;7864:9;7845:29;:::i;:::-;7835:39;;7893:38;7927:2;7916:9;7912:18;7893:38;:::i;:::-;7883:48;;7978:2;7967:9;7963:18;7950:32;7940:42;;8033:2;8022:9;8018:18;8005:32;8060:18;8052:6;8049:30;8046:50;;;8092:1;8089;8082:12;8046:50;8115:22;;8168:4;8160:13;;8156:27;-1:-1:-1;8146:55:1;;8197:1;8194;8187:12;8146:55;8220:74;8286:7;8281:2;8268:16;8263:2;8259;8255:11;8220:74;:::i;:::-;8210:84;;;7633:667;;;;;;;:::o;8813:260::-;8881:6;8889;8942:2;8930:9;8921:7;8917:23;8913:32;8910:52;;;8958:1;8955;8948:12;8910:52;8981:29;9000:9;8981:29;:::i;:::-;8971:39;;9029:38;9063:2;9052:9;9048:18;9029:38;:::i;9078:380::-;9157:1;9153:12;;;;9200;;;9221:61;;9275:4;9267:6;9263:17;9253:27;;9221:61;9328:2;9320:6;9317:14;9297:18;9294:38;9291:161;;9374:10;9369:3;9365:20;9362:1;9355:31;9409:4;9406:1;9399:15;9437:4;9434:1;9427:15;9291:161;;9078:380;;;:::o;9772:245::-;9839:6;9892:2;9880:9;9871:7;9867:23;9863:32;9860:52;;;9908:1;9905;9898:12;9860:52;9940:9;9934:16;9959:28;9981:5;9959:28;:::i;10022:289::-;10153:3;10191:6;10185:13;10207:66;10266:6;10261:3;10254:4;10246:6;10242:17;10207:66;:::i;:::-;10289:16;;;;;10022:289;-1:-1:-1;;10022:289:1:o;10672:225::-;10739:9;;;10760:11;;;10757:134;;;10813:10;10808:3;10804:20;10801:1;10794:31;10848:4;10845:1;10838:15;10876:4;10873:1;10866:15;10902:344;11104:2;11086:21;;;11143:2;11123:18;;;11116:30;-1:-1:-1;;;11177:2:1;11162:18;;11155:50;11237:2;11222:18;;10902:344::o;11596:127::-;11657:10;11652:3;11648:20;11645:1;11638:31;11688:4;11685:1;11678:15;11712:4;11709:1;11702:15;11728:273;11913:6;11905;11900:3;11887:33;11869:3;11939:16;;11964:13;;;11939:16;11728:273;-1:-1:-1;11728:273:1:o;13662:545::-;13764:2;13759:3;13756:11;13753:448;;;13800:1;13825:5;13821:2;13814:17;13870:4;13866:2;13856:19;13940:2;13928:10;13924:19;13921:1;13917:27;13911:4;13907:38;13976:4;13964:10;13961:20;13958:47;;;-1:-1:-1;13999:4:1;13958:47;14054:2;14049:3;14045:12;14042:1;14038:20;14032:4;14028:31;14018:41;;14109:82;14127:2;14120:5;14117:13;14109:82;;;14172:17;;;14153:1;14142:13;14109:82;;;14113:3;;;13662:545;;;:::o;14383:1352::-;14509:3;14503:10;14536:18;14528:6;14525:30;14522:56;;;14558:18;;:::i;:::-;14587:97;14677:6;14637:38;14669:4;14663:11;14637:38;:::i;:::-;14631:4;14587:97;:::i;:::-;14739:4;;14803:2;14792:14;;14820:1;14815:663;;;;15522:1;15539:6;15536:89;;;-1:-1:-1;15591:19:1;;;15585:26;15536:89;-1:-1:-1;;14340:1:1;14336:11;;;14332:24;14328:29;14318:40;14364:1;14360:11;;;14315:57;15638:81;;14785:944;;14815:663;13609:1;13602:14;;;13646:4;13633:18;;-1:-1:-1;;14851:20:1;;;14969:236;14983:7;14980:1;14977:14;14969:236;;;15072:19;;;15066:26;15051:42;;15164:27;;;;15132:1;15120:14;;;;14999:19;;14969:236;;;14973:3;15233:6;15224:7;15221:19;15218:201;;;15294:19;;;15288:26;-1:-1:-1;;15377:1:1;15373:14;;;15389:3;15369:24;15365:37;15361:42;15346:58;15331:74;;15218:201;-1:-1:-1;;;;;15465:1:1;15449:14;;;15445:22;15432:36;;-1:-1:-1;14383:1352:1:o;16090:1020::-;16266:3;16295:1;16328:6;16322:13;16358:36;16384:9;16358:36;:::i;:::-;16413:1;16430:18;;;16457:133;;;;16604:1;16599:356;;;;16423:532;;16457:133;-1:-1:-1;;16490:24:1;;16478:37;;16563:14;;16556:22;16544:35;;16535:45;;;-1:-1:-1;16457:133:1;;16599:356;16630:6;16627:1;16620:17;16660:4;16705:2;16702:1;16692:16;16730:1;16744:165;16758:6;16755:1;16752:13;16744:165;;;16836:14;;16823:11;;;16816:35;16879:16;;;;16773:10;;16744:165;;;16748:3;;;16938:6;16933:3;16929:16;16922:23;;16423:532;;;;;16986:6;16980:13;17002:68;17061:8;17056:3;17049:4;17041:6;17037:17;17002:68;:::i;:::-;17086:18;;16090:1020;-1:-1:-1;;;;16090:1020:1:o;17814:489::-;-1:-1:-1;;;;;18083:15:1;;;18065:34;;18135:15;;18130:2;18115:18;;18108:43;18182:2;18167:18;;18160:34;;;18230:3;18225:2;18210:18;;18203:31;;;18008:4;;18251:46;;18277:19;;18269:6;18251:46;:::i;:::-;18243:54;17814:489;-1:-1:-1;;;;;;17814:489:1:o;18308:249::-;18377:6;18430:2;18418:9;18409:7;18405:23;18401:32;18398:52;;;18446:1;18443;18436:12;18398:52;18478:9;18472:16;18497:30;18521:5;18497:30;:::i

Swarm Source

ipfs://0d11667aba1d5cb854594ef026606f6582c71c3b6c592c2e533496c00a790991

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.