ETH Price: $2,525.56 (+0.27%)
Gas: 0.7 Gwei

Token

World of Music (WOM)
 

Overview

Max Total Supply

8,888 WOM

Holders

267

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 WOM
0x986a0f1c33b06716a1acea82a761d36ac0866dd2
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

A members’ club of #musicaddicts. A web3 collaborative Music Studio & a unique experience for life inside the best musical festivals in the world with the [Magical Ticket](https://opensea.io/collection/magical-ticket)

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
wom

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 1 of 13: 54nft_erc721_v2.sol
// SPDX-License-Identifier: MIT

//   .----------------.  .----------------.  .----------------. 
//  | .--------------. || .--------------. || .--------------. |
//  | | _____  _____ | || |     ____     | || | ____    ____ | |
//  | ||_   _||_   _|| || |   .'    `.   | || ||_   \  /   _|| |
//  | |  | | /\ | |  | || |  /  .--.  \  | || |  |   \/   |  | |
//  | |  | |/  \| |  | || |  | |    | |  | || |  | |\  /| |  | |
//  | |  |   /\   |  | || |  \  `--'  /  | || | _| |_\/_| |_ | |
//  | |  |__/  \__|  | || |   `.____.'   | || ||_____||_____|| |
//  | |              | || |              | || |              | |
//  | '--------------' || '--------------' || '--------------' |
//   '----------------'  '----------------'  '----------------' 

pragma solidity ^0.8.0;

import "./basicERC20.sol";
import "./ERC721URIStorage.sol";
import "./verifySignature.sol";

contract wom is ERC721URIStorage, VerifySignature {
    
    address moderator;
    address creator;

    uint256 public modFirstRoyalties = 200; //it's cuz has 2 decimal = 2.00
    uint256 public modRoyalties      = 200;
    uint256 public creRoyalties      = 200;
    
    uint256 public cost       = 0.001 ether;
    uint256 public maxSupply  = 0;
    uint256 public supply     = 0;

    uint256 public drop       = 0;

    uint256 public lastNonce  = 0;

    uint256 public modTime    = 7 days;

    uint8   public version    = 3;
    
    mapping(uint256 => uint8) internal usedNonce;
    mapping(uint256 => uint256) internal lastTransact;
    
    event nftMinted(address to, uint256 count, address payToken, uint256 payAmount, uint256[] tokenIds);

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

    constructor(string memory name, string memory symbol, address setCreator, address setModerator, uint256 setModFirstRoyalties, uint256 setModRoyalties, uint256 setCreRoyalties , uint256 setCost, uint256 setMaxSuplly, uint256 limitDrop) ERC721(name, symbol) {
        moderator           = setModerator;
        modFirstRoyalties   = setModFirstRoyalties;
        modRoyalties        = setModRoyalties;
        creRoyalties        = setCreRoyalties;
        creator             = setCreator;
        cost                = setCost;
        maxSupply           = setMaxSuplly;
        drop                = limitDrop;
    }
    
    function modifModRoyalties(uint256 royalties) public onlyModerator {
        modRoyalties = royalties;
    }
    
    function modifCreRoyalties(uint256 royalties) public onlyCreator {
        creRoyalties = royalties;
    }
    
    function modifCost(uint256 setCost) public onlyCreator {
        cost = setCost;
    }
    
    function _setBaseURI(string memory _uri) public onlyModerator {
        _baseURIstr = _uri;
    }

    function calcShares(address tokenOwner, uint256 amount) private view returns(uint256 [] memory) {
        
        uint256 svalue = amount;
        uint256[] memory shares = new uint256[](3);

        if(amount < 10000){
            svalue = svalue * 10000;
        }

        if(tokenOwner == creator){
           
            shares[0] = svalue / 10000 * (10000 - modFirstRoyalties); //creator share
            shares[1] = svalue - shares[0]; //moderator share
            //shares[1] = svalue / 10000 * modFirstRoyalties; //moderator share

            if(amount < 10000){
                shares[0] = shares[0] / 10000;
                shares[1] = amount - shares[0];
                //shares[1] = shares[1] / 10000;
            }

            return shares;  

        } else {
            
            uint256 totShares = creRoyalties + modRoyalties;
            
            uint256 shareable =  svalue / 10000 * totShares;
            
            shares[0] = shareable / totShares * creRoyalties; //creator share
            shares[1] = shareable / totShares * modRoyalties; //moderator share
            
            shares[2] = amount - shareable; // seller share

            if(amount < 10000){
                shares[0] = shares[0] / 10000;
                shares[1] = shares[1] / 10000;
                shares[2] = shares[2] / 10000;
            }

            return shares; 
            
        }
    }
    
    function distribShares(address tokenOwner, address payToken, uint256 amount) internal {
        //require(msg.value >= cost, "Amount send not enough");

        if(amount > 0){

            uint256[] memory _shares = calcShares(tokenOwner, amount);
            
            if(payToken == address(0)){
                
                if(tokenOwner != creator && _shares[2] > 0){
                    //payable(tokenOwner).transfer(shares[2]);
                    require(payable(tokenOwner).send(_shares[2]));
                }
                if(_shares[0] > 0){
                    //payable(creator).transfer( _shares[0]);
                    require(payable(creator).send(_shares[0]));
                }
                if(_shares[1] > 0){
                    //payable(moderator).transfer(_shares[1]);
                    require(payable(moderator).send(_shares[1]));
                }
                
            } else {

                ERC20 t = ERC20(payToken);
                
                require(t.transferFrom(msg.sender, address(this), amount));
                                
                if(tokenOwner != creator  && _shares[2] > 0){
                    require(t.transfer(tokenOwner, _shares[2]));
                }
                if(_shares[0] > 0){
                    require(t.transfer(creator, _shares[0]));
                }
                if(_shares[1] > 0){
                    require(t.transfer(moderator, _shares[1]));
                }
                
            }

        }

    }
    
    function mintToken(address reciver, string[] memory tokenURI, uint256[] memory optionalId, address payToken,
                        uint256 payAmount, uint256 nonce, bytes memory data)
        public
        payable
        returns (uint256[] memory)
    {
        
        uint256 count = tokenURI.length;
        uint256[] memory tokenIds = new uint256[](count);

        if(maxSupply != 0){
            require(supply + (count - 1) < maxSupply, "Max supply reached");
        }

        if(msg.value > 0 && payToken == address(0)){
            payAmount = msg.value;
        }

        if(msg.sender != moderator && msg.sender != creator){
            lognonce(nonce);
            require(verifyMint(moderator, reciver, payToken, payAmount, tokenURI, optionalId, nonce, data), "Not allowed");
           
        }

        if(drop > 0){
            require(supply <= drop -1, "Drop limit");
        }

        distribShares(creator, payToken, payAmount);

        for (uint256 i = 0; i < count; i++) {
            
            supply += 1;

            uint256 tmpid = supply; // supply as item id

            if( optionalId[i] > 0 ){                
                tmpid = optionalId[i];
            }

            if(_exists(tmpid) == false){
                tokenIds[i] = tmpid;
                _mint(reciver, tmpid); 
                _setTokenURI(tmpid, tokenURI[i]);
                lastTransact[tmpid]=block.timestamp;
            } else {
                revert("TokenId Used");
            }

        }

        emit nftMinted(reciver, count, payToken, payAmount, tokenIds);
        return tokenIds;

    }

    function buy(
        address from,
        uint256 tokenid,
        address reciver,
        address payToken,
        uint256 payAmount,
        uint256 nonce,
        bytes memory data
    ) public payable {

        if(msg.value > 0 && payToken == address(0)){
            payAmount = msg.value;
        }

        if(msg.sender != moderator){
            lognonce(nonce);
            require(verifyBuy(moderator, from, tokenid, reciver, payToken, payAmount, nonce, data), "Not allowed");
        }

        distribShares(from, payToken, payAmount);

        _transfer(from, reciver, tokenid);

        lastTransact[tokenid]=block.timestamp;

    }
    
    function transferFrom(
        address from,
        address to,
        uint256 tokenid
    ) public payable virtual override {

        ifAllOk(tokenid);
        
        distribShares(ownerOf(tokenid), address(0), msg.value);
        
        _transfer(from, to, tokenid);

        lastTransact[tokenid] = block.timestamp;

    }
    
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }
    
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenid,
        bytes memory _data
    ) public payable virtual override {

        ifAllOk(tokenid);
        
        distribShares(from, address(0), msg.value);

        _safeTransfer(from, to, tokenid, _data);

        lastTransact[tokenid]=block.timestamp;
        
    }

    function burn(uint256 tokenid) public virtual {
        ifAllOk(tokenid);
        _burn(tokenid);
    }

    // function ownerOf(uint256 tokenId) public view virtual override returns (address) {
    //     address owner = _owners[tokenId];
    //     return owner;
    // }

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

    function approveSpendERC20(address token, address spender, uint256 value)
        public onlyModerator returns (bool)
    {
        ERC20 t = ERC20(token);
        return t.approve(spender, value);
    }
    
    function withdraw() public payable onlyModerator {
        require(payable(msg.sender).send(address(this).balance));
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return creator;
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyCreator {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = creator;
        creator = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }

    function setDrop(uint256 amount) public onlyModerator {
        require(amount >= supply && amount <= maxSupply,"Wrong Amount");
        drop = amount;
    }

    modifier onlyCreator {
        require(msg.sender == creator, "Only owner function");
        _;
    }
    
    modifier onlyModerator {
        require(msg.sender == moderator, "Only Moderator Function");
        _;
    }
    function ifAprovedOrOwner(uint256 tokenid) private view {
        require(_isApprovedOrOwner(_msgSender(), tokenid), "ERC721: caller is not owner nor approved");
    }

    function ifcanModerate(uint256 tokenid) private view {
        require(lastTransact[tokenid] + modTime > block.timestamp, "Moderation time over");
    }

    function ifAllOk(uint256 tokenid) internal view {
        if(msg.sender != moderator ){
            ifAprovedOrOwner(tokenid);
            //require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved");
        } else {
            ifcanModerate(tokenid);
            //require(lastTransact[tokenId] + modTime > block.timestamp, "Moderation time over");
        }
    }

    function lognonce(uint256 nonce) internal {
        require(usedNonce[nonce] != 1, "Nonce already Used");
        if(nonce > lastNonce){
            lastNonce = nonce;
        }
        usedNonce[nonce] = 1;
    }
    
}

File 2 of 13: Address.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 3 of 13: basicERC20.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

abstract contract ERC20Basic {
  function totalSupply() public virtual view returns (uint256);
  function balanceOf(address who) public virtual view returns (uint256);
  function transfer(address to, uint256 value) public virtual returns (bool);
  event Transfer(address indexed from, address indexed to, uint256 value);
}

abstract contract ERC20 is ERC20Basic {
  function allowance(address owner, address spender)
    public virtual view returns (uint256);

  function transferFrom(address from, address to, uint256 value)
    public virtual returns (bool);

  function approve(address spender, uint256 value) public virtual returns (bool);
  event Approval(
    address indexed owner,
    address indexed spender,
    uint256 value
  );
}

File 4 of 13: Context.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

File 5 of 13: ERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

File 6 of 13: ERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";
import "./IERC721Metadata.sol";
import "./Address.sol";
import "./Context.sol";
import "./Strings.sol";
import "./ERC165.sol";
import "./IERC721Receiver.sol";

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
abstract contract ERC721 is Context, ERC165, IERC721 {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    string internal _baseURIstr = "https://ipfs.io/ipfs/";

    // Mapping from token ID to owner address
    mapping(uint256 => address) internal _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

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

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

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return _baseURIstr;
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

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


    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

File 7 of 13: ERC721URIStorage.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC721.sol";

/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token");

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual override {
        super._burn(tokenId);

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}

File 8 of 13: IERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

File 9 of 13: IERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external payable;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external payable;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external payable;
}

File 10 of 13: IERC721Metadata.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

File 11 of 13: IERC721Receiver.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

File 12 of 13: Strings.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

File 13 of 13: verifySignature.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.3;

/* Signature Verification

How to Sign and Verify
# Signing
1. Create message to sign
2. Hash the message
3. Sign the hash (off chain, keep your private key secret)

# Verify
1. Recreate hash from the original message
2. Recover signer from signature and hash
3. Compare recovered signer to claimed signer
*/

contract VerifySignature {
    /* 1. Unlock MetaMask account
    ethereum.enable()
    */

    /* 2. Get message hash to sign
    getMessageHash(
        0x14723A09ACff6D2A60DcdF7aA4AFf308FDDC160C,
        123,
        "coffee and donuts",
        1
    )
    

    hash = "0xcf36ac4f97dc10d91fc2cbb20d718e94a8cbfe0f82eaedc6a4aa38946fb797cd"
    */
    
    function getBuyMessageHash(
        address from,
        uint256 tokenid,
        address reciver,
        address payToken,
        uint256 payAmount,
        uint256 _nonce
    ) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked(from, tokenid, reciver, payToken, payAmount, _nonce));
    }
    
    function getMintMessageHash(
        address _reciver,
        address _payToken,
        uint256 _value,
        string[] memory _tokenURI,
        uint256[] memory optionalId,
        uint256 _nonce
    ) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked(_reciver, _payToken, _value, abi.encode(_tokenURI), optionalId, _nonce));
    }

    /* 3. Sign message hash
    # using browser
    account = "copy paste account of signer here"
    ethereum.request({ method: "personal_sign", params: [account, hash]}).then(console.log)

    # using web3
    web3.personal.sign(hash, web3.eth.defaultAccount, console.log)

    Signature will be different for different accounts
    0x993dab3dd91f5c6dc28e17439be475478f5635c92a56e17e82349d3fb2f166196f466c0b4e0c146f285204f0dcb13e5ae67bc33f4b888ec32dfe0a063e8f3f781b
    */
    function getEthSignedMessageHash(bytes32 _messageHash)
        internal
        pure
        returns (bytes32)
    {
        /*
        Signature is produced by signing a keccak256 hash with the following format:
        "\x19Ethereum Signed Message\n" + len(msg) + msg
        */
        return
            keccak256(
                abi.encodePacked("\x19Ethereum Signed Message:\n32", _messageHash)
            );
    }

    /* 4. Verify signature
    signer = 0xB273216C05A8c0D4F0a4Dd0d7Bae1D2EfFE636dd
    to = 0x14723A09ACff6D2A60DcdF7aA4AFf308FDDC160C
    amount = 123
    message = "coffee and donuts"
    nonce = 1
    signature =
        0x993dab3dd91f5c6dc28e17439be475478f5635c92a56e17e82349d3fb2f166196f466c0b4e0c146f285204f0dcb13e5ae67bc33f4b888ec32dfe0a063e8f3f781b
    */
    function verifyBuy(
        address _signer,
        address from,
        uint256 tokenid,
        address reciver,
        address payToken,
        uint256 payAmount,
        uint256 _nonce,
        bytes memory signature
    ) internal pure returns (bool) {
        bytes32 messageHash = getBuyMessageHash(from, tokenid, reciver, payToken, payAmount, _nonce);
        bytes32 ethSignedMessageHash = getEthSignedMessageHash(messageHash);
        return recoverSigner(ethSignedMessageHash, signature) == _signer;
    }
    
    function verifyMint(
        address _signer,
        address _reciver,
        address _payToken,
        uint256 _value,
        string[] memory tokenURI,
        uint256[] memory optionalId,
        uint256 _nonce,
        bytes memory signature
    ) internal pure returns (bool) {
        bytes32 messageHash = getMintMessageHash(_reciver, _payToken, _value, tokenURI, optionalId, _nonce);
        bytes32 ethSignedMessageHash = getEthSignedMessageHash(messageHash);
        return recoverSigner(ethSignedMessageHash, signature) == _signer;
    }

    function recoverSigner(bytes32 _ethSignedMessageHash, bytes memory _signature)
        internal
        pure
        returns (address)
    {
        (bytes32 r, bytes32 s, uint8 v) = splitSignature(_signature);

        return ecrecover(_ethSignedMessageHash, v, r, s);
    }

    function splitSignature(bytes memory sig)
        internal
        pure
        returns (
            bytes32 r,
            bytes32 s,
            uint8 v
        )
    {
        require(sig.length == 65, "invalid signature length");

        assembly {
            /*
            First 32 bytes stores the length of the signature

            add(sig, 32) = pointer of sig + 32
            effectively, skips first 32 bytes of signature

            mload(p) loads next 32 bytes starting at the memory address p into memory
            */

            // first 32 bytes, after the length prefix
            r := mload(add(sig, 32))
            // second 32 bytes
            s := mload(add(sig, 64))
            // final byte (first byte of the next 32 bytes)
            v := byte(0, mload(add(sig, 96)))
        }

        // implicitly return (r, s, v)
    }
    
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"address","name":"setCreator","type":"address"},{"internalType":"address","name":"setModerator","type":"address"},{"internalType":"uint256","name":"setModFirstRoyalties","type":"uint256"},{"internalType":"uint256","name":"setModRoyalties","type":"uint256"},{"internalType":"uint256","name":"setCreRoyalties","type":"uint256"},{"internalType":"uint256","name":"setCost","type":"uint256"},{"internalType":"uint256","name":"setMaxSuplly","type":"uint256"},{"internalType":"uint256","name":"limitDrop","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"count","type":"uint256"},{"indexed":false,"internalType":"address","name":"payToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"payAmount","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"nftMinted","type":"event"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"_setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approveSpendERC20","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenid","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"tokenid","type":"uint256"},{"internalType":"address","name":"reciver","type":"address"},{"internalType":"address","name":"payToken","type":"address"},{"internalType":"uint256","name":"payAmount","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"buy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"creRoyalties","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"drop","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"reciver","type":"address"},{"internalType":"string[]","name":"tokenURI","type":"string[]"},{"internalType":"uint256[]","name":"optionalId","type":"uint256[]"},{"internalType":"address","name":"payToken","type":"address"},{"internalType":"uint256","name":"payAmount","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"mintToken","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"modFirstRoyalties","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"modRoyalties","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"modTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"setCost","type":"uint256"}],"name":"modifCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"royalties","type":"uint256"}],"name":"modifCreRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"royalties","type":"uint256"}],"name":"modifModRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setDrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenid","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60c0604052601560808190527f68747470733a2f2f697066732e696f2f697066732f000000000000000000000060a09081526200004091600291906200013e565b5060c8600a819055600b819055600c5566038d7ea4c68000600d556000600e819055600f819055601081905560115562093a806012556013805460ff191660031790553480156200009057600080fd5b50604051620036a2380380620036a2833981016040819052620000b391620002b8565b89518a908a90620000cc9060009060208501906200013e565b508051620000e29060019060208401906200013e565b5050600880546001600160a01b03998a166001600160a01b031991821617909155600a9790975550600b94909455600c9290925560098054969095169590931694909417909255600d55600e9190915560105550620003d69050565b8280546200014c9062000383565b90600052602060002090601f016020900481019282620001705760008555620001bb565b82601f106200018b57805160ff1916838001178555620001bb565b82800160010185558215620001bb579182015b82811115620001bb5782518255916020019190600101906200019e565b50620001c9929150620001cd565b5090565b5b80821115620001c95760008155600101620001ce565b80516001600160a01b0381168114620001fc57600080fd5b919050565b600082601f8301126200021357600080fd5b81516001600160401b0380821115620002305762000230620003c0565b604051601f8301601f19908116603f011681019082821181831017156200025b576200025b620003c0565b816040528381526020925086838588010111156200027857600080fd5b600091505b838210156200029c57858201830151818301840152908201906200027d565b83821115620002ae5760008385830101525b9695505050505050565b6000806000806000806000806000806101408b8d031215620002d957600080fd5b8a516001600160401b0380821115620002f157600080fd5b620002ff8e838f0162000201565b9b5060208d01519150808211156200031657600080fd5b50620003258d828e0162000201565b9950506200033660408c01620001e4565b97506200034660608c01620001e4565b965060808b0151955060a08b0151945060c08b0151935060e08b015192506101008b015191506101208b015190509295989b9194979a5092959850565b600181811c908216806200039857607f821691505b60208210811415620003ba57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b6132bc80620003e66000396000f3fe60806040526004361061020f5760003560e01c806358b2971a11610118578063b88d4fde116100a0578063e985e9c51161006f578063e985e9c514610595578063f2fde38b146105b5578063f751cd8f146105d5578063f8321b95146105eb578063f98fc0c51461060b57600080fd5b8063b88d4fde1461052c578063c87b56dd1461053f578063ca889d801461055f578063d5abeb011461057f57600080fd5b80637e681223116100e75780637e681223146104a35780638da5cb5b146104c357806395d89b41146104e15780639f379330146104f6578063a22cb4651461050c57600080fd5b806358b2971a1461042d5780636352211e1461044d57806366aca6381461046d57806370a082311461048357600080fd5b806323b872dd1161019b57806342842e0e1161016a57806342842e0e146103a257806342966c68146103b557806352631ab4146103d557806352cfc8c3146103eb57806354fd4d501461040157600080fd5b806323b872dd14610347578063245eddd21461035a57806331b5b9071461037a5780633ccfd60b1461039a57600080fd5b8063081812fc116101e2578063081812fc146102a4578063095ea7b3146102dc57806313faede6146102fc57806318160ddd1461031257806323ad1dac1461032757600080fd5b806301ffc9a714610214578063047fc9aa14610249578063062e8e901461026d57806306fdde0314610282575b600080fd5b34801561022057600080fd5b5061023461022f366004612d62565b610621565b60405190151581526020015b60405180910390f35b34801561025557600080fd5b5061025f600f5481565b604051908152602001610240565b61028061027b366004612cb9565b610673565b005b34801561028e57600080fd5b50610297610738565b6040516102409190612ff4565b3480156102b057600080fd5b506102c46102bf366004612dd1565b6107ca565b6040516001600160a01b039091168152602001610240565b3480156102e857600080fd5b506102806102f7366004612c8f565b610852565b34801561030857600080fd5b5061025f600d5481565b34801561031e57600080fd5b50600e5461025f565b34801561033357600080fd5b50610280610342366004612dd1565b610968565b610280610355366004612a76565b6109e6565b34801561036657600080fd5b50610280610375366004612dd1565b610a23565b34801561038657600080fd5b50610280610395366004612d9c565b610a52565b610280610a93565b6102806103b0366004612a76565b610ae3565b3480156103c157600080fd5b506102806103d0366004612dd1565b610afe565b3480156103e157600080fd5b5061025f60115481565b3480156103f757600080fd5b5061025f60125481565b34801561040d57600080fd5b5060135461041b9060ff1681565b60405160ff9091168152602001610240565b34801561043957600080fd5b50610280610448366004612dd1565b610b13565b34801561045957600080fd5b506102c4610468366004612dd1565b610b42565b34801561047957600080fd5b5061025f600c5481565b34801561048f57600080fd5b5061025f61049e366004612a28565b610bb9565b3480156104af57600080fd5b506102346104be366004612a76565b610c40565b3480156104cf57600080fd5b506009546001600160a01b03166102c4565b3480156104ed57600080fd5b50610297610cfb565b34801561050257600080fd5b5061025f600b5481565b34801561051857600080fd5b50610280610527366004612c58565b610d0a565b61028061053a366004612ab2565b610dcf565b34801561054b57600080fd5b5061029761055a366004612dd1565b610e06565b34801561056b57600080fd5b5061028061057a366004612dd1565b610f70565b34801561058b57600080fd5b5061025f600e5481565b3480156105a157600080fd5b506102346105b0366004612a43565b610f9f565b3480156105c157600080fd5b506102806105d0366004612a28565b610fcd565b3480156105e157600080fd5b5061025f60105481565b6105fe6105f9366004612b1a565b611065565b6040516102409190612fe1565b34801561061757600080fd5b5061025f600a5481565b60006001600160e01b031982166380ac58cd60e01b148061065257506001600160e01b03198216635b5e139f60e01b145b8061066d57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60003411801561068a57506001600160a01b038416155b15610693573492505b6008546001600160a01b03163314610709576106ae8261139c565b6008546106ca906001600160a01b03168888888888888861141e565b6107095760405162461bcd60e51b815260206004820152600b60248201526a139bdd08185b1b1bddd95960aa1b60448201526064015b60405180910390fd5b6107148785856114b9565b61071f8786886119a5565b5050506000928352505060156020526040902042905550565b606060008054610747906131a0565b80601f0160208091040260200160405190810160405280929190818152602001828054610773906131a0565b80156107c05780601f10610795576101008083540402835291602001916107c0565b820191906000526020600020905b8154815290600101906020018083116107a357829003601f168201915b5050505050905090565b60006107d582611b45565b6108365760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610700565b506000908152600560205260409020546001600160a01b031690565b600061085d82610b42565b9050806001600160a01b0316836001600160a01b031614156108cb5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610700565b336001600160a01b03821614806108e757506108e78133610f9f565b6109595760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610700565b6109638383611b62565b505050565b6008546001600160a01b031633146109925760405162461bcd60e51b815260040161070090613086565b600f5481101580156109a65750600e548111155b6109e15760405162461bcd60e51b815260206004820152600c60248201526b15dc9bdb99c8105b5bdd5b9d60a21b6044820152606401610700565b601055565b6109ef81611bd0565b610a036109fb82610b42565b6000346114b9565b610a0e8383836119a5565b60009081526015602052604090204290555050565b6009546001600160a01b03163314610a4d5760405162461bcd60e51b815260040161070090613059565b600c55565b6008546001600160a01b03163314610a7c5760405162461bcd60e51b815260040161070090613086565b8051610a8f90600290602084019061285b565b5050565b6008546001600160a01b03163314610abd5760405162461bcd60e51b815260040161070090613086565b60405133904780156108fc02916000818181858888f19350505050610ae157600080fd5b565b61096383838360405180602001604052806000815250610dcf565b610b0781611bd0565b610b1081611bf4565b50565b6008546001600160a01b03163314610b3d5760405162461bcd60e51b815260040161070090613086565b600b55565b6000818152600360205260408120546001600160a01b03168061066d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610700565b60006001600160a01b038216610c245760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610700565b506001600160a01b031660009081526004602052604090205490565b6008546000906001600160a01b03163314610c6d5760405162461bcd60e51b815260040161070090613086565b60405163095ea7b360e01b81526001600160a01b0384811660048301526024820184905285919082169063095ea7b390604401602060405180830381600087803b158015610cba57600080fd5b505af1158015610cce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf29190612d45565b95945050505050565b606060018054610747906131a0565b6001600160a01b038216331415610d635760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610700565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610dd882611bd0565b610de4846000346114b9565b610df084848484611c34565b5060009081526015602052604090204290555050565b6060610e1182611b45565b610e775760405162461bcd60e51b815260206004820152603160248201527f45524337323155524953746f726167653a2055524920717565727920666f72206044820152703737b732bc34b9ba32b73a103a37b5b2b760791b6064820152608401610700565b60008281526007602052604081208054610e90906131a0565b80601f0160208091040260200160405190810160405280929190818152602001828054610ebc906131a0565b8015610f095780601f10610ede57610100808354040283529160200191610f09565b820191906000526020600020905b815481529060010190602001808311610eec57829003601f168201915b505050505090506000610f1a611c67565b9050805160001415610f2d575092915050565b815115610f5f578082604051602001610f47929190612ece565b60405160208183030381529060405292505050919050565b610f6884611c76565b949350505050565b6009546001600160a01b03163314610f9a5760405162461bcd60e51b815260040161070090613059565b600d55565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b6009546001600160a01b03163314610ff75760405162461bcd60e51b815260040161070090613059565b6001600160a01b03811661105c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610700565b610b1081611d41565b855160609060008167ffffffffffffffff8111156110855761108561324c565b6040519080825280602002602001820160405280156110ae578160200160208202803683370190505b509050600e5460001461111857600e546110c960018461315d565b600f546110d69190613112565b106111185760405162461bcd60e51b815260206004820152601260248201527113585e081cdd5c1c1b1e481c995858da195960721b6044820152606401610700565b60003411801561112f57506001600160a01b038716155b15611138573495505b6008546001600160a01b0316331480159061115e57506009546001600160a01b03163314155b156111c25761116c8561139c565b600854611188906001600160a01b03168b89898d8d8b8b611d93565b6111c25760405162461bcd60e51b815260206004820152600b60248201526a139bdd08185b1b1bddd95960aa1b6044820152606401610700565b601054156112175760016010546111d9919061315d565b600f5411156112175760405162461bcd60e51b815260206004820152600a602482015269111c9bdc081b1a5b5a5d60b21b6044820152606401610700565b60095461122e906001600160a01b031688886114b9565b60005b8281101561134f576001600f600082825461124c9190613112565b9091555050600f5489516000908b908490811061126b5761126b613236565b602002602001015111156112965789828151811061128b5761128b613236565b602002602001015190505b61129f81611b45565b61130557808383815181106112b6576112b6613236565b6020026020010181815250506112cc8c82611da4565b6112ef818c84815181106112e2576112e2613236565b6020026020010151611ed7565b600081815260156020526040902042905561133c565b60405162461bcd60e51b815260206004820152600c60248201526b151bdad95b925908155cd95960a21b6044820152606401610700565b5080611347816131db565b915050611231565b507f2ad7ca0d3c2e5ecc29a9466186263310753b53fbb5a0f710be5fb496c8e120828a83898985604051611387959493929190612f3a565b60405180910390a19998505050505050505050565b60008181526014602052604090205460ff16600114156113f35760405162461bcd60e51b8152602060048201526012602482015271139bdb98d948185b1c9958591e48155cd95960721b6044820152606401610700565b6011548111156114035760118190555b6000908152601460205260409020805460ff19166001179055565b60008061142f898989898989611f62565b9050600061148a826040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b90508a6001600160a01b03166114a08286611fd0565b6001600160a01b0316149b9a5050505050505050505050565b80156109635760006114cb848361204f565b90506001600160a01b038316611652576009546001600160a01b03858116911614801590611513575060008160028151811061150957611509613236565b6020026020010151115b1561156357836001600160a01b03166108fc8260028151811061153857611538613236565b60200260200101519081150290604051600060405180830381858888f1935050505061156357600080fd5b60008160008151811061157857611578613236565b602002602001015111156115d75760095481516001600160a01b03909116906108fc9083906000906115ac576115ac613236565b60200260200101519081150290604051600060405180830381858888f193505050506115d757600080fd5b6000816001815181106115ec576115ec613236565b6020026020010151111561164d5760085481516001600160a01b03909116906108fc908390600190811061162257611622613236565b60200260200101519081150290604051600060405180830381858888f1935050505061164d57600080fd5b61199f565b6040516323b872dd60e01b81523360048201523060248201526044810183905283906001600160a01b038216906323b872dd90606401602060405180830381600087803b1580156116a257600080fd5b505af11580156116b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116da9190612d45565b6116e357600080fd5b6009546001600160a01b0386811691161480159061171b575060008260028151811061171157611711613236565b6020026020010151115b156117d757806001600160a01b031663a9059cbb868460028151811061174357611743613236565b60200260200101516040518363ffffffff1660e01b815260040161177c9291906001600160a01b03929092168252602082015260400190565b602060405180830381600087803b15801561179657600080fd5b505af11580156117aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ce9190612d45565b6117d757600080fd5b6000826000815181106117ec576117ec613236565b602002602001015111156118b95760095482516001600160a01b038084169263a9059cbb92911690859060009061182557611825613236565b60200260200101516040518363ffffffff1660e01b815260040161185e9291906001600160a01b03929092168252602082015260400190565b602060405180830381600087803b15801561187857600080fd5b505af115801561188c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118b09190612d45565b6118b957600080fd5b6000826001815181106118ce576118ce613236565b6020026020010151111561199d5760085482516001600160a01b038084169263a9059cbb929116908590600190811061190957611909613236565b60200260200101516040518363ffffffff1660e01b81526004016119429291906001600160a01b03929092168252602082015260400190565b602060405180830381600087803b15801561195c57600080fd5b505af1158015611970573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119949190612d45565b61199d57600080fd5b505b50505050565b826001600160a01b03166119b882610b42565b6001600160a01b031614611a205760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610700565b6001600160a01b038216611a825760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610700565b611a8d600082611b62565b6001600160a01b0383166000908152600460205260408120805460019290611ab690849061315d565b90915550506001600160a01b0382166000908152600460205260408120805460019290611ae4908490613112565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000908152600360205260409020546001600160a01b0316151590565b600081815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611b9782610b42565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6008546001600160a01b03163314611beb57610b108161237d565b610b10816123e4565b611bfd81612445565b60008181526007602052604090208054611c16906131a0565b159050610b10576000818152600760205260408120610b10916128df565b611c3f8484846119a5565b611c4b848484846124e0565b61199f5760405162461bcd60e51b815260040161070090613007565b606060028054610747906131a0565b6060611c8182611b45565b611ce55760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610700565b6000611cef611c67565b90506000815111611d0f5760405180602001604052806000815250611d3a565b80611d19846125ed565b604051602001611d2a929190612ece565b6040516020818303038152906040525b9392505050565b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008061142f8989898989896126eb565b6001600160a01b038216611dfa5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610700565b611e0381611b45565b15611e505760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610700565b6001600160a01b0382166000908152600460205260408120805460019290611e79908490613112565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b611ee082611b45565b611f435760405162461bcd60e51b815260206004820152602e60248201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60448201526d32bc34b9ba32b73a103a37b5b2b760911b6064820152608401610700565b600082815260076020908152604090912082516109639284019061285b565b6040516bffffffffffffffffffffffff19606088811b821660208401526034830188905286811b8216605484015285901b166068820152607c8101839052609c810182905260009060bc015b6040516020818303038152906040528051906020012090509695505050505050565b600080600080611fdf85612725565b6040805160008152602081018083528b905260ff8316918101919091526060810184905260808101839052929550909350915060019060a0016020604051602081039080840390855afa15801561203a573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b60408051600380825260808201909252606091839160009160208201858036833701905050905061271084101561208f5761208c8261271061313e565b91505b6009546001600160a01b03868116911614156121ce57600a546120b49061271061315d565b6120c06127108461312a565b6120ca919061313e565b816000815181106120dd576120dd613236565b602002602001018181525050806000815181106120fc576120fc613236565b60200260200101518261210f919061315d565b8160018151811061212257612122613236565b6020026020010181815250506127108410156121c5576127108160008151811061214e5761214e613236565b6020026020010151612160919061312a565b8160008151811061217357612173613236565b6020026020010181815250508060008151811061219257612192613236565b6020026020010151846121a5919061315d565b816001815181106121b8576121b8613236565b6020026020010181815250505b915061066d9050565b6000600b54600c546121e09190613112565b90506000816121f16127108661312a565b6121fb919061313e565b600c5490915061220b838361312a565b612215919061313e565b8360008151811061222857612228613236565b6020908102919091010152600b54612240838361312a565b61224a919061313e565b8360018151811061225d5761225d613236565b6020908102919091010152612272818761315d565b8360028151811061228557612285613236565b60200260200101818152505061271086101561237157612710836000815181106122b1576122b1613236565b60200260200101516122c3919061312a565b836000815181106122d6576122d6613236565b602002602001018181525050612710836001815181106122f8576122f8613236565b602002602001015161230a919061312a565b8360018151811061231d5761231d613236565b6020026020010181815250506127108360028151811061233f5761233f613236565b6020026020010151612351919061312a565b8360028151811061236457612364613236565b6020026020010181815250505b8294505050505061066d565b6123873382612799565b610b105760405162461bcd60e51b815260206004820152602860248201527f4552433732313a2063616c6c6572206973206e6f74206f776e6572206e6f7220604482015267185c1c1c9bdd995960c21b6064820152608401610700565b601254600082815260156020526040902054429161240191613112565b11610b105760405162461bcd60e51b815260206004820152601460248201527326b7b232b930ba34b7b7103a34b6b29037bb32b960611b6044820152606401610700565b600061245082610b42565b905061245d600083611b62565b6001600160a01b038116600090815260046020526040812080546001929061248690849061315d565b909155505060008281526003602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b60006001600160a01b0384163b156125e257604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612524903390899088908890600401612efd565b602060405180830381600087803b15801561253e57600080fd5b505af192505050801561256e575060408051601f3d908101601f1916820190925261256b91810190612d7f565b60015b6125c8573d80801561259c576040519150601f19603f3d011682016040523d82523d6000602084013e6125a1565b606091505b5080516125c05760405162461bcd60e51b815260040161070090613007565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610f68565b506001949350505050565b6060816126115750506040805180820190915260018152600360fc1b602082015290565b8160005b811561263b5780612625816131db565b91506126349050600a8361312a565b9150612615565b60008167ffffffffffffffff8111156126565761265661324c565b6040519080825280601f01601f191660200182016040528015612680576020820181803683370190505b5090505b8415610f685761269560018361315d565b91506126a2600a866131f6565b6126ad906030613112565b60f81b8183815181106126c2576126c2613236565b60200101906001600160f81b031916908160001a9053506126e4600a8661312a565b9450612684565b6000868686866040516020016127019190612f7f565b60408051601f1981840301815290829052611fae9493929188908890602001612e51565b6000806000835160411461277b5760405162461bcd60e51b815260206004820152601860248201527f696e76616c6964207369676e6174757265206c656e67746800000000000000006044820152606401610700565b50505060208101516040820151606090920151909260009190911a90565b60006127a482611b45565b6128055760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610700565b600061281083610b42565b9050806001600160a01b0316846001600160a01b0316148061284b5750836001600160a01b0316612840846107ca565b6001600160a01b0316145b80610f685750610f688185610f9f565b828054612867906131a0565b90600052602060002090601f01602090048101928261288957600085556128cf565b82601f106128a257805160ff19168380011785556128cf565b828001600101855582156128cf579182015b828111156128cf5782518255916020019190600101906128b4565b506128db929150612915565b5090565b5080546128eb906131a0565b6000825580601f106128fb575050565b601f016020900490600052602060002090810190610b1091905b5b808211156128db5760008155600101612916565b80356001600160a01b038116811461294157600080fd5b919050565b600082601f83011261295757600080fd5b8135602061296c612967836130ee565b6130bd565b80838252828201915082860187848660051b890101111561298c57600080fd5b60005b858110156129ab5781358452928401929084019060010161298f565b5090979650505050505050565b600082601f8301126129c957600080fd5b813567ffffffffffffffff8111156129e3576129e361324c565b6129f6601f8201601f19166020016130bd565b818152846020838601011115612a0b57600080fd5b816020850160208301376000918101602001919091529392505050565b600060208284031215612a3a57600080fd5b611d3a8261292a565b60008060408385031215612a5657600080fd5b612a5f8361292a565b9150612a6d6020840161292a565b90509250929050565b600080600060608486031215612a8b57600080fd5b612a948461292a565b9250612aa26020850161292a565b9150604084013590509250925092565b60008060008060808587031215612ac857600080fd5b612ad18561292a565b9350612adf6020860161292a565b925060408501359150606085013567ffffffffffffffff811115612b0257600080fd5b612b0e878288016129b8565b91505092959194509250565b600080600080600080600060e0888a031215612b3557600080fd5b612b3e8861292a565b965067ffffffffffffffff8060208a01351115612b5a57600080fd5b602089013589018a601f820112612b7057600080fd5b612b7d61296782356130ee565b8082358252602082019150602083018d6020853560051b8601011115612ba257600080fd5b60005b8435811015612be1578582351115612bbc57600080fd5b612bcc8f602084358801016129b8565b84526020938401939190910190600101612ba5565b50508099505050508060408a01351115612bfa57600080fd5b612c0a8a60408b01358b01612946565b9550612c1860608a0161292a565b94506080890135935060a089013592508060c08a01351115612c3957600080fd5b50612c4a8960c08a01358a016129b8565b905092959891949750929550565b60008060408385031215612c6b57600080fd5b612c748361292a565b91506020830135612c8481613262565b809150509250929050565b60008060408385031215612ca257600080fd5b612cab8361292a565b946020939093013593505050565b600080600080600080600060e0888a031215612cd457600080fd5b612cdd8861292a565b965060208801359550612cf26040890161292a565b9450612d006060890161292a565b93506080880135925060a0880135915060c088013567ffffffffffffffff811115612d2a57600080fd5b612d368a828b016129b8565b91505092959891949750929550565b600060208284031215612d5757600080fd5b8151611d3a81613262565b600060208284031215612d7457600080fd5b8135611d3a81613270565b600060208284031215612d9157600080fd5b8151611d3a81613270565b600060208284031215612dae57600080fd5b813567ffffffffffffffff811115612dc557600080fd5b610f68848285016129b8565b600060208284031215612de357600080fd5b5035919050565b600081518084526020808501945080840160005b83811015612e1a57815187529582019590820190600101612dfe565b509495945050505050565b60008151808452612e3d816020860160208601613174565b601f01601f19169290920160200192915050565b60006bffffffffffffffffffffffff19808960601b168352808860601b1660148401525085602883015284516020612e8f8260488601838a01613174565b85519184016048019181870160005b82811015612eba57815185529383019390830190600101612e9e565b505050938152909201979650505050505050565b60008351612ee0818460208801613174565b835190830190612ef4818360208801613174565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612f3090830184612e25565b9695505050505050565b6001600160a01b03868116825260208201869052841660408201526060810183905260a060808201819052600090612f7490830184612dea565b979650505050505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015612fd457603f19888603018452612fc2858351612e25565b94509285019290850190600101612fa6565b5092979650505050505050565b602081526000611d3a6020830184612dea565b602081526000611d3a6020830184612e25565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526013908201527227b7363c9037bbb732b910333ab731ba34b7b760691b604082015260600190565b60208082526017908201527f4f6e6c79204d6f64657261746f722046756e6374696f6e000000000000000000604082015260600190565b604051601f8201601f1916810167ffffffffffffffff811182821017156130e6576130e661324c565b604052919050565b600067ffffffffffffffff8211156131085761310861324c565b5060051b60200190565b600082198211156131255761312561320a565b500190565b60008261313957613139613220565b500490565b60008160001904831182151516156131585761315861320a565b500290565b60008282101561316f5761316f61320a565b500390565b60005b8381101561318f578181015183820152602001613177565b8381111561199f5750506000910152565b600181811c908216806131b457607f821691505b602082108114156131d557634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156131ef576131ef61320a565b5060010190565b60008261320557613205613220565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b8015158114610b1057600080fd5b6001600160e01b031981168114610b1057600080fdfea2646970667358221220b0f747eca571f172a5d8432459fccdd9dfa96a2200f117cb84a5128a26a6e1e864736f6c63430008070033000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001800000000000000000000000001f7290c912b10eb2a4b958dadb5fe32e8e6d9f92000000000000000000000000355e175199064947ca73118f5969703d395c6d0600000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000001f4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022b800000000000000000000000000000000000000000000000000000000000003e8000000000000000000000000000000000000000000000000000000000000000e576f726c64206f66204d757369630000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003574f4d0000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061020f5760003560e01c806358b2971a11610118578063b88d4fde116100a0578063e985e9c51161006f578063e985e9c514610595578063f2fde38b146105b5578063f751cd8f146105d5578063f8321b95146105eb578063f98fc0c51461060b57600080fd5b8063b88d4fde1461052c578063c87b56dd1461053f578063ca889d801461055f578063d5abeb011461057f57600080fd5b80637e681223116100e75780637e681223146104a35780638da5cb5b146104c357806395d89b41146104e15780639f379330146104f6578063a22cb4651461050c57600080fd5b806358b2971a1461042d5780636352211e1461044d57806366aca6381461046d57806370a082311461048357600080fd5b806323b872dd1161019b57806342842e0e1161016a57806342842e0e146103a257806342966c68146103b557806352631ab4146103d557806352cfc8c3146103eb57806354fd4d501461040157600080fd5b806323b872dd14610347578063245eddd21461035a57806331b5b9071461037a5780633ccfd60b1461039a57600080fd5b8063081812fc116101e2578063081812fc146102a4578063095ea7b3146102dc57806313faede6146102fc57806318160ddd1461031257806323ad1dac1461032757600080fd5b806301ffc9a714610214578063047fc9aa14610249578063062e8e901461026d57806306fdde0314610282575b600080fd5b34801561022057600080fd5b5061023461022f366004612d62565b610621565b60405190151581526020015b60405180910390f35b34801561025557600080fd5b5061025f600f5481565b604051908152602001610240565b61028061027b366004612cb9565b610673565b005b34801561028e57600080fd5b50610297610738565b6040516102409190612ff4565b3480156102b057600080fd5b506102c46102bf366004612dd1565b6107ca565b6040516001600160a01b039091168152602001610240565b3480156102e857600080fd5b506102806102f7366004612c8f565b610852565b34801561030857600080fd5b5061025f600d5481565b34801561031e57600080fd5b50600e5461025f565b34801561033357600080fd5b50610280610342366004612dd1565b610968565b610280610355366004612a76565b6109e6565b34801561036657600080fd5b50610280610375366004612dd1565b610a23565b34801561038657600080fd5b50610280610395366004612d9c565b610a52565b610280610a93565b6102806103b0366004612a76565b610ae3565b3480156103c157600080fd5b506102806103d0366004612dd1565b610afe565b3480156103e157600080fd5b5061025f60115481565b3480156103f757600080fd5b5061025f60125481565b34801561040d57600080fd5b5060135461041b9060ff1681565b60405160ff9091168152602001610240565b34801561043957600080fd5b50610280610448366004612dd1565b610b13565b34801561045957600080fd5b506102c4610468366004612dd1565b610b42565b34801561047957600080fd5b5061025f600c5481565b34801561048f57600080fd5b5061025f61049e366004612a28565b610bb9565b3480156104af57600080fd5b506102346104be366004612a76565b610c40565b3480156104cf57600080fd5b506009546001600160a01b03166102c4565b3480156104ed57600080fd5b50610297610cfb565b34801561050257600080fd5b5061025f600b5481565b34801561051857600080fd5b50610280610527366004612c58565b610d0a565b61028061053a366004612ab2565b610dcf565b34801561054b57600080fd5b5061029761055a366004612dd1565b610e06565b34801561056b57600080fd5b5061028061057a366004612dd1565b610f70565b34801561058b57600080fd5b5061025f600e5481565b3480156105a157600080fd5b506102346105b0366004612a43565b610f9f565b3480156105c157600080fd5b506102806105d0366004612a28565b610fcd565b3480156105e157600080fd5b5061025f60105481565b6105fe6105f9366004612b1a565b611065565b6040516102409190612fe1565b34801561061757600080fd5b5061025f600a5481565b60006001600160e01b031982166380ac58cd60e01b148061065257506001600160e01b03198216635b5e139f60e01b145b8061066d57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60003411801561068a57506001600160a01b038416155b15610693573492505b6008546001600160a01b03163314610709576106ae8261139c565b6008546106ca906001600160a01b03168888888888888861141e565b6107095760405162461bcd60e51b815260206004820152600b60248201526a139bdd08185b1b1bddd95960aa1b60448201526064015b60405180910390fd5b6107148785856114b9565b61071f8786886119a5565b5050506000928352505060156020526040902042905550565b606060008054610747906131a0565b80601f0160208091040260200160405190810160405280929190818152602001828054610773906131a0565b80156107c05780601f10610795576101008083540402835291602001916107c0565b820191906000526020600020905b8154815290600101906020018083116107a357829003601f168201915b5050505050905090565b60006107d582611b45565b6108365760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610700565b506000908152600560205260409020546001600160a01b031690565b600061085d82610b42565b9050806001600160a01b0316836001600160a01b031614156108cb5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610700565b336001600160a01b03821614806108e757506108e78133610f9f565b6109595760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610700565b6109638383611b62565b505050565b6008546001600160a01b031633146109925760405162461bcd60e51b815260040161070090613086565b600f5481101580156109a65750600e548111155b6109e15760405162461bcd60e51b815260206004820152600c60248201526b15dc9bdb99c8105b5bdd5b9d60a21b6044820152606401610700565b601055565b6109ef81611bd0565b610a036109fb82610b42565b6000346114b9565b610a0e8383836119a5565b60009081526015602052604090204290555050565b6009546001600160a01b03163314610a4d5760405162461bcd60e51b815260040161070090613059565b600c55565b6008546001600160a01b03163314610a7c5760405162461bcd60e51b815260040161070090613086565b8051610a8f90600290602084019061285b565b5050565b6008546001600160a01b03163314610abd5760405162461bcd60e51b815260040161070090613086565b60405133904780156108fc02916000818181858888f19350505050610ae157600080fd5b565b61096383838360405180602001604052806000815250610dcf565b610b0781611bd0565b610b1081611bf4565b50565b6008546001600160a01b03163314610b3d5760405162461bcd60e51b815260040161070090613086565b600b55565b6000818152600360205260408120546001600160a01b03168061066d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610700565b60006001600160a01b038216610c245760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610700565b506001600160a01b031660009081526004602052604090205490565b6008546000906001600160a01b03163314610c6d5760405162461bcd60e51b815260040161070090613086565b60405163095ea7b360e01b81526001600160a01b0384811660048301526024820184905285919082169063095ea7b390604401602060405180830381600087803b158015610cba57600080fd5b505af1158015610cce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf29190612d45565b95945050505050565b606060018054610747906131a0565b6001600160a01b038216331415610d635760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610700565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610dd882611bd0565b610de4846000346114b9565b610df084848484611c34565b5060009081526015602052604090204290555050565b6060610e1182611b45565b610e775760405162461bcd60e51b815260206004820152603160248201527f45524337323155524953746f726167653a2055524920717565727920666f72206044820152703737b732bc34b9ba32b73a103a37b5b2b760791b6064820152608401610700565b60008281526007602052604081208054610e90906131a0565b80601f0160208091040260200160405190810160405280929190818152602001828054610ebc906131a0565b8015610f095780601f10610ede57610100808354040283529160200191610f09565b820191906000526020600020905b815481529060010190602001808311610eec57829003601f168201915b505050505090506000610f1a611c67565b9050805160001415610f2d575092915050565b815115610f5f578082604051602001610f47929190612ece565b60405160208183030381529060405292505050919050565b610f6884611c76565b949350505050565b6009546001600160a01b03163314610f9a5760405162461bcd60e51b815260040161070090613059565b600d55565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b6009546001600160a01b03163314610ff75760405162461bcd60e51b815260040161070090613059565b6001600160a01b03811661105c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610700565b610b1081611d41565b855160609060008167ffffffffffffffff8111156110855761108561324c565b6040519080825280602002602001820160405280156110ae578160200160208202803683370190505b509050600e5460001461111857600e546110c960018461315d565b600f546110d69190613112565b106111185760405162461bcd60e51b815260206004820152601260248201527113585e081cdd5c1c1b1e481c995858da195960721b6044820152606401610700565b60003411801561112f57506001600160a01b038716155b15611138573495505b6008546001600160a01b0316331480159061115e57506009546001600160a01b03163314155b156111c25761116c8561139c565b600854611188906001600160a01b03168b89898d8d8b8b611d93565b6111c25760405162461bcd60e51b815260206004820152600b60248201526a139bdd08185b1b1bddd95960aa1b6044820152606401610700565b601054156112175760016010546111d9919061315d565b600f5411156112175760405162461bcd60e51b815260206004820152600a602482015269111c9bdc081b1a5b5a5d60b21b6044820152606401610700565b60095461122e906001600160a01b031688886114b9565b60005b8281101561134f576001600f600082825461124c9190613112565b9091555050600f5489516000908b908490811061126b5761126b613236565b602002602001015111156112965789828151811061128b5761128b613236565b602002602001015190505b61129f81611b45565b61130557808383815181106112b6576112b6613236565b6020026020010181815250506112cc8c82611da4565b6112ef818c84815181106112e2576112e2613236565b6020026020010151611ed7565b600081815260156020526040902042905561133c565b60405162461bcd60e51b815260206004820152600c60248201526b151bdad95b925908155cd95960a21b6044820152606401610700565b5080611347816131db565b915050611231565b507f2ad7ca0d3c2e5ecc29a9466186263310753b53fbb5a0f710be5fb496c8e120828a83898985604051611387959493929190612f3a565b60405180910390a19998505050505050505050565b60008181526014602052604090205460ff16600114156113f35760405162461bcd60e51b8152602060048201526012602482015271139bdb98d948185b1c9958591e48155cd95960721b6044820152606401610700565b6011548111156114035760118190555b6000908152601460205260409020805460ff19166001179055565b60008061142f898989898989611f62565b9050600061148a826040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b90508a6001600160a01b03166114a08286611fd0565b6001600160a01b0316149b9a5050505050505050505050565b80156109635760006114cb848361204f565b90506001600160a01b038316611652576009546001600160a01b03858116911614801590611513575060008160028151811061150957611509613236565b6020026020010151115b1561156357836001600160a01b03166108fc8260028151811061153857611538613236565b60200260200101519081150290604051600060405180830381858888f1935050505061156357600080fd5b60008160008151811061157857611578613236565b602002602001015111156115d75760095481516001600160a01b03909116906108fc9083906000906115ac576115ac613236565b60200260200101519081150290604051600060405180830381858888f193505050506115d757600080fd5b6000816001815181106115ec576115ec613236565b6020026020010151111561164d5760085481516001600160a01b03909116906108fc908390600190811061162257611622613236565b60200260200101519081150290604051600060405180830381858888f1935050505061164d57600080fd5b61199f565b6040516323b872dd60e01b81523360048201523060248201526044810183905283906001600160a01b038216906323b872dd90606401602060405180830381600087803b1580156116a257600080fd5b505af11580156116b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116da9190612d45565b6116e357600080fd5b6009546001600160a01b0386811691161480159061171b575060008260028151811061171157611711613236565b6020026020010151115b156117d757806001600160a01b031663a9059cbb868460028151811061174357611743613236565b60200260200101516040518363ffffffff1660e01b815260040161177c9291906001600160a01b03929092168252602082015260400190565b602060405180830381600087803b15801561179657600080fd5b505af11580156117aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ce9190612d45565b6117d757600080fd5b6000826000815181106117ec576117ec613236565b602002602001015111156118b95760095482516001600160a01b038084169263a9059cbb92911690859060009061182557611825613236565b60200260200101516040518363ffffffff1660e01b815260040161185e9291906001600160a01b03929092168252602082015260400190565b602060405180830381600087803b15801561187857600080fd5b505af115801561188c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118b09190612d45565b6118b957600080fd5b6000826001815181106118ce576118ce613236565b6020026020010151111561199d5760085482516001600160a01b038084169263a9059cbb929116908590600190811061190957611909613236565b60200260200101516040518363ffffffff1660e01b81526004016119429291906001600160a01b03929092168252602082015260400190565b602060405180830381600087803b15801561195c57600080fd5b505af1158015611970573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119949190612d45565b61199d57600080fd5b505b50505050565b826001600160a01b03166119b882610b42565b6001600160a01b031614611a205760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610700565b6001600160a01b038216611a825760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610700565b611a8d600082611b62565b6001600160a01b0383166000908152600460205260408120805460019290611ab690849061315d565b90915550506001600160a01b0382166000908152600460205260408120805460019290611ae4908490613112565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000908152600360205260409020546001600160a01b0316151590565b600081815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611b9782610b42565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6008546001600160a01b03163314611beb57610b108161237d565b610b10816123e4565b611bfd81612445565b60008181526007602052604090208054611c16906131a0565b159050610b10576000818152600760205260408120610b10916128df565b611c3f8484846119a5565b611c4b848484846124e0565b61199f5760405162461bcd60e51b815260040161070090613007565b606060028054610747906131a0565b6060611c8182611b45565b611ce55760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610700565b6000611cef611c67565b90506000815111611d0f5760405180602001604052806000815250611d3a565b80611d19846125ed565b604051602001611d2a929190612ece565b6040516020818303038152906040525b9392505050565b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008061142f8989898989896126eb565b6001600160a01b038216611dfa5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610700565b611e0381611b45565b15611e505760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610700565b6001600160a01b0382166000908152600460205260408120805460019290611e79908490613112565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b611ee082611b45565b611f435760405162461bcd60e51b815260206004820152602e60248201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60448201526d32bc34b9ba32b73a103a37b5b2b760911b6064820152608401610700565b600082815260076020908152604090912082516109639284019061285b565b6040516bffffffffffffffffffffffff19606088811b821660208401526034830188905286811b8216605484015285901b166068820152607c8101839052609c810182905260009060bc015b6040516020818303038152906040528051906020012090509695505050505050565b600080600080611fdf85612725565b6040805160008152602081018083528b905260ff8316918101919091526060810184905260808101839052929550909350915060019060a0016020604051602081039080840390855afa15801561203a573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b60408051600380825260808201909252606091839160009160208201858036833701905050905061271084101561208f5761208c8261271061313e565b91505b6009546001600160a01b03868116911614156121ce57600a546120b49061271061315d565b6120c06127108461312a565b6120ca919061313e565b816000815181106120dd576120dd613236565b602002602001018181525050806000815181106120fc576120fc613236565b60200260200101518261210f919061315d565b8160018151811061212257612122613236565b6020026020010181815250506127108410156121c5576127108160008151811061214e5761214e613236565b6020026020010151612160919061312a565b8160008151811061217357612173613236565b6020026020010181815250508060008151811061219257612192613236565b6020026020010151846121a5919061315d565b816001815181106121b8576121b8613236565b6020026020010181815250505b915061066d9050565b6000600b54600c546121e09190613112565b90506000816121f16127108661312a565b6121fb919061313e565b600c5490915061220b838361312a565b612215919061313e565b8360008151811061222857612228613236565b6020908102919091010152600b54612240838361312a565b61224a919061313e565b8360018151811061225d5761225d613236565b6020908102919091010152612272818761315d565b8360028151811061228557612285613236565b60200260200101818152505061271086101561237157612710836000815181106122b1576122b1613236565b60200260200101516122c3919061312a565b836000815181106122d6576122d6613236565b602002602001018181525050612710836001815181106122f8576122f8613236565b602002602001015161230a919061312a565b8360018151811061231d5761231d613236565b6020026020010181815250506127108360028151811061233f5761233f613236565b6020026020010151612351919061312a565b8360028151811061236457612364613236565b6020026020010181815250505b8294505050505061066d565b6123873382612799565b610b105760405162461bcd60e51b815260206004820152602860248201527f4552433732313a2063616c6c6572206973206e6f74206f776e6572206e6f7220604482015267185c1c1c9bdd995960c21b6064820152608401610700565b601254600082815260156020526040902054429161240191613112565b11610b105760405162461bcd60e51b815260206004820152601460248201527326b7b232b930ba34b7b7103a34b6b29037bb32b960611b6044820152606401610700565b600061245082610b42565b905061245d600083611b62565b6001600160a01b038116600090815260046020526040812080546001929061248690849061315d565b909155505060008281526003602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b60006001600160a01b0384163b156125e257604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612524903390899088908890600401612efd565b602060405180830381600087803b15801561253e57600080fd5b505af192505050801561256e575060408051601f3d908101601f1916820190925261256b91810190612d7f565b60015b6125c8573d80801561259c576040519150601f19603f3d011682016040523d82523d6000602084013e6125a1565b606091505b5080516125c05760405162461bcd60e51b815260040161070090613007565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610f68565b506001949350505050565b6060816126115750506040805180820190915260018152600360fc1b602082015290565b8160005b811561263b5780612625816131db565b91506126349050600a8361312a565b9150612615565b60008167ffffffffffffffff8111156126565761265661324c565b6040519080825280601f01601f191660200182016040528015612680576020820181803683370190505b5090505b8415610f685761269560018361315d565b91506126a2600a866131f6565b6126ad906030613112565b60f81b8183815181106126c2576126c2613236565b60200101906001600160f81b031916908160001a9053506126e4600a8661312a565b9450612684565b6000868686866040516020016127019190612f7f565b60408051601f1981840301815290829052611fae9493929188908890602001612e51565b6000806000835160411461277b5760405162461bcd60e51b815260206004820152601860248201527f696e76616c6964207369676e6174757265206c656e67746800000000000000006044820152606401610700565b50505060208101516040820151606090920151909260009190911a90565b60006127a482611b45565b6128055760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610700565b600061281083610b42565b9050806001600160a01b0316846001600160a01b0316148061284b5750836001600160a01b0316612840846107ca565b6001600160a01b0316145b80610f685750610f688185610f9f565b828054612867906131a0565b90600052602060002090601f01602090048101928261288957600085556128cf565b82601f106128a257805160ff19168380011785556128cf565b828001600101855582156128cf579182015b828111156128cf5782518255916020019190600101906128b4565b506128db929150612915565b5090565b5080546128eb906131a0565b6000825580601f106128fb575050565b601f016020900490600052602060002090810190610b1091905b5b808211156128db5760008155600101612916565b80356001600160a01b038116811461294157600080fd5b919050565b600082601f83011261295757600080fd5b8135602061296c612967836130ee565b6130bd565b80838252828201915082860187848660051b890101111561298c57600080fd5b60005b858110156129ab5781358452928401929084019060010161298f565b5090979650505050505050565b600082601f8301126129c957600080fd5b813567ffffffffffffffff8111156129e3576129e361324c565b6129f6601f8201601f19166020016130bd565b818152846020838601011115612a0b57600080fd5b816020850160208301376000918101602001919091529392505050565b600060208284031215612a3a57600080fd5b611d3a8261292a565b60008060408385031215612a5657600080fd5b612a5f8361292a565b9150612a6d6020840161292a565b90509250929050565b600080600060608486031215612a8b57600080fd5b612a948461292a565b9250612aa26020850161292a565b9150604084013590509250925092565b60008060008060808587031215612ac857600080fd5b612ad18561292a565b9350612adf6020860161292a565b925060408501359150606085013567ffffffffffffffff811115612b0257600080fd5b612b0e878288016129b8565b91505092959194509250565b600080600080600080600060e0888a031215612b3557600080fd5b612b3e8861292a565b965067ffffffffffffffff8060208a01351115612b5a57600080fd5b602089013589018a601f820112612b7057600080fd5b612b7d61296782356130ee565b8082358252602082019150602083018d6020853560051b8601011115612ba257600080fd5b60005b8435811015612be1578582351115612bbc57600080fd5b612bcc8f602084358801016129b8565b84526020938401939190910190600101612ba5565b50508099505050508060408a01351115612bfa57600080fd5b612c0a8a60408b01358b01612946565b9550612c1860608a0161292a565b94506080890135935060a089013592508060c08a01351115612c3957600080fd5b50612c4a8960c08a01358a016129b8565b905092959891949750929550565b60008060408385031215612c6b57600080fd5b612c748361292a565b91506020830135612c8481613262565b809150509250929050565b60008060408385031215612ca257600080fd5b612cab8361292a565b946020939093013593505050565b600080600080600080600060e0888a031215612cd457600080fd5b612cdd8861292a565b965060208801359550612cf26040890161292a565b9450612d006060890161292a565b93506080880135925060a0880135915060c088013567ffffffffffffffff811115612d2a57600080fd5b612d368a828b016129b8565b91505092959891949750929550565b600060208284031215612d5757600080fd5b8151611d3a81613262565b600060208284031215612d7457600080fd5b8135611d3a81613270565b600060208284031215612d9157600080fd5b8151611d3a81613270565b600060208284031215612dae57600080fd5b813567ffffffffffffffff811115612dc557600080fd5b610f68848285016129b8565b600060208284031215612de357600080fd5b5035919050565b600081518084526020808501945080840160005b83811015612e1a57815187529582019590820190600101612dfe565b509495945050505050565b60008151808452612e3d816020860160208601613174565b601f01601f19169290920160200192915050565b60006bffffffffffffffffffffffff19808960601b168352808860601b1660148401525085602883015284516020612e8f8260488601838a01613174565b85519184016048019181870160005b82811015612eba57815185529383019390830190600101612e9e565b505050938152909201979650505050505050565b60008351612ee0818460208801613174565b835190830190612ef4818360208801613174565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612f3090830184612e25565b9695505050505050565b6001600160a01b03868116825260208201869052841660408201526060810183905260a060808201819052600090612f7490830184612dea565b979650505050505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015612fd457603f19888603018452612fc2858351612e25565b94509285019290850190600101612fa6565b5092979650505050505050565b602081526000611d3a6020830184612dea565b602081526000611d3a6020830184612e25565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526013908201527227b7363c9037bbb732b910333ab731ba34b7b760691b604082015260600190565b60208082526017908201527f4f6e6c79204d6f64657261746f722046756e6374696f6e000000000000000000604082015260600190565b604051601f8201601f1916810167ffffffffffffffff811182821017156130e6576130e661324c565b604052919050565b600067ffffffffffffffff8211156131085761310861324c565b5060051b60200190565b600082198211156131255761312561320a565b500190565b60008261313957613139613220565b500490565b60008160001904831182151516156131585761315861320a565b500290565b60008282101561316f5761316f61320a565b500390565b60005b8381101561318f578181015183820152602001613177565b8381111561199f5750506000910152565b600181811c908216806131b457607f821691505b602082108114156131d557634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156131ef576131ef61320a565b5060010190565b60008261320557613205613220565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b8015158114610b1057600080fd5b6001600160e01b031981168114610b1057600080fdfea2646970667358221220b0f747eca571f172a5d8432459fccdd9dfa96a2200f117cb84a5128a26a6e1e864736f6c63430008070033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001800000000000000000000000001f7290c912b10eb2a4b958dadb5fe32e8e6d9f92000000000000000000000000355e175199064947ca73118f5969703d395c6d0600000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000001f4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022b800000000000000000000000000000000000000000000000000000000000003e8000000000000000000000000000000000000000000000000000000000000000e576f726c64206f66204d757369630000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003574f4d0000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): World of Music
Arg [1] : symbol (string): WOM
Arg [2] : setCreator (address): 0x1f7290c912B10EB2a4b958DaDB5FE32E8E6d9F92
Arg [3] : setModerator (address): 0x355e175199064947Ca73118f5969703D395c6d06
Arg [4] : setModFirstRoyalties (uint256): 200
Arg [5] : setModRoyalties (uint256): 200
Arg [6] : setCreRoyalties (uint256): 500
Arg [7] : setCost (uint256): 0
Arg [8] : setMaxSuplly (uint256): 8888
Arg [9] : limitDrop (uint256): 1000

-----Encoded View---------------
14 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [2] : 0000000000000000000000001f7290c912b10eb2a4b958dadb5fe32e8e6d9f92
Arg [3] : 000000000000000000000000355e175199064947ca73118f5969703d395c6d06
Arg [4] : 00000000000000000000000000000000000000000000000000000000000000c8
Arg [5] : 00000000000000000000000000000000000000000000000000000000000000c8
Arg [6] : 00000000000000000000000000000000000000000000000000000000000001f4
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [8] : 00000000000000000000000000000000000000000000000000000000000022b8
Arg [9] : 00000000000000000000000000000000000000000000000000000000000003e8
Arg [10] : 000000000000000000000000000000000000000000000000000000000000000e
Arg [11] : 576f726c64206f66204d75736963000000000000000000000000000000000000
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [13] : 574f4d0000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

887:11177:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1536:305:4;;;;;;;;;;-1:-1:-1;1536:305:4;;;;;:::i;:::-;;:::i;:::-;;;13519:14:13;;13512:22;13494:41;;13482:2;13467:18;1536:305:4;;;;;;;;1253:29:0;;;;;;;;;;;;;;;;;;;24621:25:13;;;24609:2;24594:18;1253:29:0;24475:177:13;7592:677:0;;;;;;:::i;:::-;;:::i;:::-;;2481:91:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;4022:221::-;;;;;;;;;;-1:-1:-1;4022:221:4;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;10476:32:13;;;10458:51;;10446:2;10431:18;4022:221:4;10312:203:13;3545:411:4;;;;;;;;;;-1:-1:-1;3545:411:4;;;;;:::i;:::-;;:::i;1171:39:0:-;;;;;;;;;;;;;;;;9517:88;;;;;;;;;;-1:-1:-1;9588:9:0;;9517:88;;10666:160;;;;;;;;;;-1:-1:-1;10666:160:0;;;;;:::i;:::-;;:::i;8281:346::-;;;;;;:::i;:::-;;:::i;2527:108::-;;;;;;;;;;-1:-1:-1;2527:108:0;;;;;:::i;:::-;;:::i;2747:99::-;;;;;;;;;;-1:-1:-1;2747:99:0;;;;;:::i;:::-;;:::i;9833:124::-;;;:::i;8639:193::-;;;;;;:::i;:::-;;:::i;9228:106::-;;;;;;;;;;-1:-1:-1;9228:106:0;;;;;:::i;:::-;;:::i;1329:29::-;;;;;;;;;;;;;;;;1367:34;;;;;;;;;;;;;;;;1410:29;;;;;;;;;;-1:-1:-1;1410:29:0;;;;;;;;;;;24829:4:13;24817:17;;;24799:36;;24787:2;24772:18;1410:29:0;24657:184:13;2405:110:0;;;;;;;;;;-1:-1:-1;2405:110:0;;;;;:::i;:::-;;:::i;2175:239:4:-;;;;;;;;;;-1:-1:-1;2175:239:4;;;;;:::i;:::-;;:::i;1120:38:0:-;;;;;;;;;;;;;;;;1905:208:4;;;;;;;;;;-1:-1:-1;1905:208:4;;;;;:::i;:::-;;:::i;9613::0:-;;;;;;;;;;-1:-1:-1;9613:208:0;;;;;:::i;:::-;;:::i;10038:88::-;;;;;;;;;;-1:-1:-1;10111:7:0;;-1:-1:-1;;;;;10111:7:0;10038:88;;2641:95:4;;;;;;;;;;;;;:::i;1075:38:0:-;;;;;;;;;;;;;;;;4315:295:4;;;;;;;;;;-1:-1:-1;4315:295:4;;;;;:::i;:::-;;:::i;8844:376:0:-;;;;;;:::i;:::-;;:::i;404:679:5:-;;;;;;;;;;-1:-1:-1;404:679:5;;;;;:::i;:::-;;:::i;2647:88:0:-;;;;;;;;;;-1:-1:-1;2647:88:0;;;;;:::i;:::-;;:::i;1217:29::-;;;;;;;;;;;;;;;;4681:164:4;;;;;;;;;;-1:-1:-1;4681:164:4;;;;;:::i;:::-;;:::i;10281:194:0:-;;;;;;;;;;-1:-1:-1;10281:194:0;;;;;:::i;:::-;;:::i;1291:29::-;;;;;;;;;;;;;;;;5909:1675;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;998:38::-;;;;;;;;;;;;;;;;1536:305:4;1638:4;-1:-1:-1;;;;;;1675:40:4;;-1:-1:-1;;;1675:40:4;;:105;;-1:-1:-1;;;;;;;1732:48:4;;-1:-1:-1;;;1732:48:4;1675:105;:158;;;-1:-1:-1;;;;;;;;;;896:40:3;;;1797:36:4;1655:178;1536:305;-1:-1:-1;;1536:305:4:o;7592:677:0:-;7837:1;7825:9;:13;:39;;;;-1:-1:-1;;;;;;7842:22:0;;;7825:39;7822:91;;;7892:9;7880:21;;7822:91;7942:9;;-1:-1:-1;;;;;7942:9:0;7928:10;:23;7925:186;;7967:15;7976:5;7967:8;:15::i;:::-;8015:9;;8005:78;;-1:-1:-1;;;;;8015:9:0;8026:4;8032:7;8041;8050:8;8060:9;8071:5;8078:4;8005:9;:78::i;:::-;7997:102;;;;-1:-1:-1;;;7997:102:0;;21362:2:13;7997:102:0;;;21344:21:13;21401:2;21381:18;;;21374:30;-1:-1:-1;;;21420:18:13;;;21413:41;21471:18;;7997:102:0;;;;;;;;;8123:40;8137:4;8143:8;8153:9;8123:13;:40::i;:::-;8176:33;8186:4;8192:7;8201;8176:9;:33::i;:::-;-1:-1:-1;;;8222:21:0;;;;-1:-1:-1;;8222:12:0;:21;;;;;8244:15;8222:37;;-1:-1:-1;7592:677:0:o;2481:91:4:-;2526:13;2559:5;2552:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2481:91;:::o;4022:221::-;4098:7;4126:16;4134:7;4126;:16::i;:::-;4118:73;;;;-1:-1:-1;;;4118:73:4;;20949:2:13;4118:73:4;;;20931:21:13;20988:2;20968:18;;;20961:30;21027:34;21007:18;;;21000:62;-1:-1:-1;;;21078:18:13;;;21071:42;21130:19;;4118:73:4;20747:408:13;4118:73:4;-1:-1:-1;4211:24:4;;;;:15;:24;;;;;;-1:-1:-1;;;;;4211:24:4;;4022:221::o;3545:411::-;3626:13;3642:23;3657:7;3642:14;:23::i;:::-;3626:39;;3690:5;-1:-1:-1;;;;;3684:11:4;:2;-1:-1:-1;;;;;3684:11:4;;;3676:57;;;;-1:-1:-1;;;3676:57:4;;22528:2:13;3676:57:4;;;22510:21:13;22567:2;22547:18;;;22540:30;22606:34;22586:18;;;22579:62;-1:-1:-1;;;22657:18:13;;;22650:31;22698:19;;3676:57:4;22326:397:13;3676:57:4;682:10:2;-1:-1:-1;;;;;3768:21:4;;;;:62;;-1:-1:-1;3793:37:4;3810:5;682:10:2;4681:164:4;:::i;3793:37::-;3746:168;;;;-1:-1:-1;;;3746:168:4;;17418:2:13;3746:168:4;;;17400:21:13;17457:2;17437:18;;;17430:30;17496:34;17476:18;;;17469:62;17567:26;17547:18;;;17540:54;17611:19;;3746:168:4;17216:420:13;3746:168:4;3927:21;3936:2;3940:7;3927:8;:21::i;:::-;3615:341;3545:411;;:::o;10666:160:0:-;11007:9;;-1:-1:-1;;;;;11007:9:0;10993:10;:23;10985:59;;;;-1:-1:-1;;;10985:59:0;;;;;;;:::i;:::-;10749:6:::1;;10739;:16;;:39;;;;;10769:9;;10759:6;:19;;10739:39;10731:63;;;::::0;-1:-1:-1;;;10731:63:0;;19420:2:13;10731:63:0::1;::::0;::::1;19402:21:13::0;19459:2;19439:18;;;19432:30;-1:-1:-1;;;19478:18:13;;;19471:42;19530:18;;10731:63:0::1;19218:336:13::0;10731:63:0::1;10805:4;:13:::0;10666:160::o;8281:346::-;8425:16;8433:7;8425;:16::i;:::-;8462:54;8476:16;8484:7;8476;:16::i;:::-;8502:1;8506:9;8462:13;:54::i;:::-;8537:28;8547:4;8553:2;8557:7;8537:9;:28::i;:::-;8578:21;;;;:12;:21;;;;;8602:15;8578:39;;-1:-1:-1;;8281:346:0:o;2527:108::-;10888:7;;-1:-1:-1;;;;;10888:7:0;10874:10;:21;10866:53;;;;-1:-1:-1;;;10866:53:0;;;;;;;:::i;:::-;2603:12:::1;:24:::0;2527:108::o;2747:99::-;11007:9;;-1:-1:-1;;;;;11007:9:0;10993:10;:23;10985:59;;;;-1:-1:-1;;;10985:59:0;;;;;;;:::i;:::-;2820:18;;::::1;::::0;:11:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;:::-;;2747:99:::0;:::o;9833:124::-;11007:9;;-1:-1:-1;;;;;11007:9:0;10993:10;:23;10985:59;;;;-1:-1:-1;;;10985:59:0;;;;;;;:::i;:::-;9901:47:::1;::::0;9909:10:::1;::::0;9926:21:::1;9901:47:::0;::::1;;;::::0;::::1;::::0;;;9926:21;9909:10;9901:47;::::1;;;;;;9893:56;;;::::0;::::1;;9833:124::o:0;8639:193::-;8785:39;8802:4;8808:2;8812:7;8785:39;;;;;;;;;;;;:16;:39::i;9228:106::-;9285:16;9293:7;9285;:16::i;:::-;9312:14;9318:7;9312:5;:14::i;:::-;9228:106;:::o;2405:110::-;11007:9;;-1:-1:-1;;;;;11007:9:0;10993:10;:23;10985:59;;;;-1:-1:-1;;;10985:59:0;;;;;;;:::i;:::-;2483:12:::1;:24:::0;2405:110::o;2175:239:4:-;2247:7;2283:16;;;:7;:16;;;;;;-1:-1:-1;;;;;2283:16:4;2318:19;2310:73;;;;-1:-1:-1;;;2310:73:4;;18595:2:13;2310:73:4;;;18577:21:13;18634:2;18614:18;;;18607:30;18673:34;18653:18;;;18646:62;-1:-1:-1;;;18724:18:13;;;18717:39;18773:19;;2310:73:4;18393:405:13;1905:208:4;1977:7;-1:-1:-1;;;;;2005:19:4;;1997:74;;;;-1:-1:-1;;;1997:74:4;;18184:2:13;1997:74:4;;;18166:21:13;18223:2;18203:18;;;18196:30;18262:34;18242:18;;;18235:62;-1:-1:-1;;;18313:18:13;;;18306:40;18363:19;;1997:74:4;17982:406:13;1997:74:4;-1:-1:-1;;;;;;2089:16:4;;;;;:9;:16;;;;;;;1905:208::o;9613::0:-;11007:9;;9726:4;;-1:-1:-1;;;;;11007:9:0;10993:10;:23;10985:59;;;;-1:-1:-1;;;10985:59:0;;;;;;;:::i;:::-;9788:25:::1;::::0;-1:-1:-1;;;9788:25:0;;-1:-1:-1;;;;;11585:32:13;;;9788:25:0::1;::::0;::::1;11567:51:13::0;11634:18;;;11627:34;;;9764:5:0;;9788:9;;::::1;::::0;::::1;::::0;11540:18:13;;9788:25:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9781:32:::0;9613:208;-1:-1:-1;;;;;9613:208:0:o;2641:95:4:-;2688:13;2721:7;2714:14;;;;;:::i;4315:295::-;-1:-1:-1;;;;;4418:24:4;;682:10:2;4418:24:4;;4410:62;;;;-1:-1:-1;;;4410:62:4;;16312:2:13;4410:62:4;;;16294:21:13;16351:2;16331:18;;;16324:30;16390:27;16370:18;;;16363:55;16435:18;;4410:62:4;16110:349:13;4410:62:4;682:10:2;4485:32:4;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;4485:42:4;;;;;;;;;;;;:53;;-1:-1:-1;;4485:53:4;;;;;;;;;;4554:48;;13494:41:13;;;4485:42:4;;682:10:2;4554:48:4;;13467:18:13;4554:48:4;;;;;;;4315:295;;:::o;8844:376:0:-;9021:16;9029:7;9021;:16::i;:::-;9058:42;9072:4;9086:1;9090:9;9058:13;:42::i;:::-;9113:39;9127:4;9133:2;9137:7;9146:5;9113:13;:39::i;:::-;-1:-1:-1;9165:21:0;;;;:12;:21;;;;;9187:15;9165:37;;-1:-1:-1;;8844:376:0:o;404:679:5:-;477:13;511:16;519:7;511;:16::i;:::-;503:78;;;;-1:-1:-1;;;503:78:5;;20122:2:13;503:78:5;;;20104:21:13;20161:2;20141:18;;;20134:30;20200:34;20180:18;;;20173:62;-1:-1:-1;;;20251:18:13;;;20244:47;20308:19;;503:78:5;19920:413:13;503:78:5;594:23;620:19;;;:10;:19;;;;;594:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;650:18;671:10;:8;:10::i;:::-;650:31;;763:4;757:18;779:1;757:23;753:72;;;-1:-1:-1;804:9:5;404:679;-1:-1:-1;;404:679:5:o;753:72::-;929:23;;:27;925:108;;1004:4;1010:9;987:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;973:48;;;;404:679;;;:::o;925:108::-;1052:23;1067:7;1052:14;:23::i;:::-;1045:30;404:679;-1:-1:-1;;;;404:679:5:o;2647:88:0:-;10888:7;;-1:-1:-1;;;;;10888:7:0;10874:10;:21;10866:53;;;;-1:-1:-1;;;10866:53:0;;;;;;;:::i;:::-;2713:4:::1;:14:::0;2647:88::o;4681:164:4:-;-1:-1:-1;;;;;4802:25:4;;;4778:4;4802:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;4681:164::o;10281:194:0:-;10888:7;;-1:-1:-1;;;;;10888:7:0;10874:10;:21;10866:53;;;;-1:-1:-1;;;10866:53:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;10372:22:0;::::1;10364:73;;;::::0;-1:-1:-1;;;10364:73:0;;14794:2:13;10364:73:0::1;::::0;::::1;14776:21:13::0;14833:2;14813:18;;;14806:30;14872:34;14852:18;;;14845:62;-1:-1:-1;;;14923:18:13;;;14916:36;14969:19;;10364:73:0::1;14592:402:13::0;10364:73:0::1;10448:19;10458:8;10448:9;:19::i;5909:1675::-:0;6207:15;;6147:16;;6191:13;6207:15;6261:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6261:20:0;;6233:48;;6297:9;;6310:1;6297:14;6294:108;;6358:9;;6345;6353:1;6345:5;:9;:::i;:::-;6335:6;;:20;;;;:::i;:::-;:32;6327:63;;;;-1:-1:-1;;;6327:63:0;;23625:2:13;6327:63:0;;;23607:21:13;23664:2;23644:18;;;23637:30;-1:-1:-1;;;23683:18:13;;;23676:48;23741:18;;6327:63:0;23423:342:13;6327:63:0;6429:1;6417:9;:13;:39;;;;-1:-1:-1;;;;;;6434:22:0;;;6417:39;6414:91;;;6484:9;6472:21;;6414:91;6534:9;;-1:-1:-1;;;;;6534:9:0;6520:10;:23;;;;:48;;-1:-1:-1;6561:7:0;;-1:-1:-1;;;;;6561:7:0;6547:10;:21;;6520:48;6517:232;;;6584:15;6593:5;6584:8;:15::i;:::-;6633:9;;6622:86;;-1:-1:-1;;;;;6633:9:0;6644:7;6653:8;6663:9;6674:8;6684:10;6696:5;6703:4;6622:10;:86::i;:::-;6614:110;;;;-1:-1:-1;;;6614:110:0;;21362:2:13;6614:110:0;;;21344:21:13;21401:2;21381:18;;;21374:30;-1:-1:-1;;;21420:18:13;;;21413:41;21471:18;;6614:110:0;21160:335:13;6614:110:0;6764:4;;:8;6761:79;;6812:1;6806:4;;:7;;;;:::i;:::-;6796:6;;:17;;6788:40;;;;-1:-1:-1;;;6788:40:0;;17079:2:13;6788:40:0;;;17061:21:13;17118:2;17098:18;;;17091:30;-1:-1:-1;;;17137:18:13;;;17130:40;17187:18;;6788:40:0;16877:334:13;6788:40:0;6866:7;;6852:43;;-1:-1:-1;;;;;6866:7:0;6875:8;6885:9;6852:13;:43::i;:::-;6913:9;6908:567;6932:5;6928:1;:9;6908:567;;;6983:1;6973:6;;:11;;;;;;;:::i;:::-;;;;-1:-1:-1;;7017:6:0;;7065:13;;7001;;7065:10;;7076:1;;7065:13;;;;;;:::i;:::-;;;;;;;:17;7061:95;;;7127:10;7138:1;7127:13;;;;;;;;:::i;:::-;;;;;;;7119:21;;7061:95;7175:14;7183:5;7175:7;:14::i;:::-;7172:290;;7232:5;7218:8;7227:1;7218:11;;;;;;;;:::i;:::-;;;;;;:19;;;;;7256:21;7262:7;7271:5;7256;:21::i;:::-;7297:32;7310:5;7317:8;7326:1;7317:11;;;;;;;;:::i;:::-;;;;;;;7297:12;:32::i;:::-;7348:19;;;;:12;:19;;;;;7368:15;7348:35;;7172:290;;;7424:22;;-1:-1:-1;;;7424:22:0;;17843:2:13;7424:22:0;;;17825:21:13;17882:2;17862:18;;;17855:30;-1:-1:-1;;;17901:18:13;;;17894:42;17953:18;;7424:22:0;17641:336:13;7172:290:0;-1:-1:-1;6939:3:0;;;;:::i;:::-;;;;6908:567;;;;7492:56;7502:7;7511:5;7518:8;7528:9;7539:8;7492:56;;;;;;;;;;:::i;:::-;;;;;;;;7566:8;5909:1675;-1:-1:-1;;;;;;;;;5909:1675:0:o;11836:219::-;11897:16;;;;:9;:16;;;;;;;;;:21;;11889:52;;;;-1:-1:-1;;;11889:52:0;;22930:2:13;11889:52:0;;;22912:21:13;22969:2;22949:18;;;22942:30;-1:-1:-1;;;22988:18:13;;;22981:48;23046:18;;11889:52:0;22728:342:13;11889:52:0;11963:9;;11955:5;:17;11952:65;;;11988:9;:17;;;11952:65;12027:16;;;;:9;:16;;;;;:20;;-1:-1:-1;;12027:20:0;12046:1;12027:20;;;11836:219::o;2779:533:12:-;3042:4;3059:19;3081:70;3099:4;3105:7;3114;3123:8;3133:9;3144:6;3081:17;:70::i;:::-;3059:92;;3162:28;3193:36;3217:11;2309:66;;10169::13;2309::12;;;10157:79:13;10252:12;;;10245:28;;;2068:7:12;;10289:12:13;;2309:66:12;;;;;;;;;;;;2281:109;;;;;;2261:129;;1963:435;;;;3193:36;3162:67;;3297:7;-1:-1:-1;;;;;3247:57:12;:46;3261:20;3283:9;3247:13;:46::i;:::-;-1:-1:-1;;;;;3247:57:12;;;2779:533;-1:-1:-1;;;;;;;;;;;2779:533:12:o;4329:1568:0:-;4496:10;;4493:1395;;4524:24;4551:30;4562:10;4574:6;4551:10;:30::i;:::-;4524:57;-1:-1:-1;;;;;;4613:22:0;;4610:1265;;4690:7;;-1:-1:-1;;;;;4676:21:0;;;4690:7;;4676:21;;;;:39;;;4714:1;4701:7;4709:1;4701:10;;;;;;;;:::i;:::-;;;;;;;:14;4676:39;4673:195;;;4819:10;-1:-1:-1;;;;;4811:24:0;:36;4836:7;4844:1;4836:10;;;;;;;;:::i;:::-;;;;;;;4811:36;;;;;;;;;;;;;;;;;;;;;;;4803:45;;;;;;4902:1;4889:7;4897:1;4889:10;;;;;;;;:::i;:::-;;;;;;;:14;4886:166;;;5006:7;;5020:10;;-1:-1:-1;;;;;5006:7:0;;;;4998:33;;5020:7;;5006;;5020:10;;;;:::i;:::-;;;;;;;4998:33;;;;;;;;;;;;;;;;;;;;;;;4990:42;;;;;;5086:1;5073:7;5081:1;5073:10;;;;;;;;:::i;:::-;;;;;;;:14;5070:169;;;5191:9;;5207:10;;-1:-1:-1;;;;;5191:9:0;;;;5183:35;;5207:7;;5191:9;;5207:10;;;;;;:::i;:::-;;;;;;;5183:35;;;;;;;;;;;;;;;;;;;;;;;5175:44;;;;;;4610:1265;;;5369:49;;-1:-1:-1;;;5369:49:0;;5384:10;5369:49;;;10760:34:13;5404:4:0;10810:18:13;;;10803:43;10862:18;;;10855:34;;;5315:8:0;;-1:-1:-1;;;;;5369:14:0;;;;;10695:18:13;;5369:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5361:58;;;;;;5489:7;;-1:-1:-1;;;;;5475:21:0;;;5489:7;;5475:21;;;;:40;;;5514:1;5501:7;5509:1;5501:10;;;;;;;;:::i;:::-;;;;;;;:14;5475:40;5472:130;;;5547:1;-1:-1:-1;;;;;5547:10:0;;5558;5570:7;5578:1;5570:10;;;;;;;;:::i;:::-;;;;;;;5547:34;;;;;;;;;;;;;;;-1:-1:-1;;;;;11585:32:13;;;;11567:51;;11649:2;11634:18;;11627:34;11555:2;11540:18;;11393:274;5547:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5539:43;;;;;;5636:1;5623:7;5631:1;5623:10;;;;;;;;:::i;:::-;;;;;;;:14;5620:101;;;5680:7;;5689:10;;-1:-1:-1;;;;;5669:10:0;;;;;;5680:7;;;5689;;5680;;5689:10;;;;:::i;:::-;;;;;;;5669:31;;;;;;;;;;;;;;;-1:-1:-1;;;;;11585:32:13;;;;11567:51;;11649:2;11634:18;;11627:34;11555:2;11540:18;;11393:274;5669:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5661:40;;;;;;5755:1;5742:7;5750:1;5742:10;;;;;;;;:::i;:::-;;;;;;;:14;5739:103;;;5799:9;;5810:10;;-1:-1:-1;;;;;5788:10:0;;;;;;5799:9;;;5810:7;;5799:9;;5810:10;;;;;;:::i;:::-;;;;;;;5788:33;;;;;;;;;;;;;;;-1:-1:-1;;;;;11585:32:13;;;;11567:51;;11649:2;11634:18;;11627:34;11555:2;11540:18;;11393:274;5788:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5780:42;;;;;;5278:597;4610:1265;4507:1381;4329:1568;;;:::o;9643:578:4:-;9802:4;-1:-1:-1;;;;;9775:31:4;:23;9790:7;9775:14;:23::i;:::-;-1:-1:-1;;;;;9775:31:4;;9767:85;;;;-1:-1:-1;;;9767:85:4;;21702:2:13;9767:85:4;;;21684:21:13;21741:2;21721:18;;;21714:30;21780:34;21760:18;;;21753:62;-1:-1:-1;;;21831:18:13;;;21824:39;21880:19;;9767:85:4;21500:405:13;9767:85:4;-1:-1:-1;;;;;9871:16:4;;9863:65;;;;-1:-1:-1;;;9863:65:4;;15907:2:13;9863:65:4;;;15889:21:13;15946:2;15926:18;;;15919:30;15985:34;15965:18;;;15958:62;-1:-1:-1;;;16036:18:13;;;16029:34;16080:19;;9863:65:4;15705:400:13;9863:65:4;10045:29;10062:1;10066:7;10045:8;:29::i;:::-;-1:-1:-1;;;;;10087:15:4;;;;;;:9;:15;;;;;:20;;10106:1;;10087:15;:20;;10106:1;;10087:20;:::i;:::-;;;;-1:-1:-1;;;;;;;10118:13:4;;;;;;:9;:13;;;;;:18;;10135:1;;10118:13;:18;;10135:1;;10118:18;:::i;:::-;;;;-1:-1:-1;;10147:16:4;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;10147:21:4;-1:-1:-1;;;;;10147:21:4;;;;;;;;;10186:27;;10147:16;;10186:27;;;;;;;9643:578;;;:::o;6357:127::-;6422:4;6446:16;;;:7;:16;;;;;;-1:-1:-1;;;;;6446:16:4;:30;;;6357:127::o;10339:174::-;10414:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;10414:29:4;-1:-1:-1;;;;;10414:29:4;;;;;;;;:24;;10468:23;10414:24;10468:14;:23::i;:::-;-1:-1:-1;;;;;10459:46:4;;;;;;;;;;;10339:174;;:::o;11409:419:0:-;11485:9;;-1:-1:-1;;;;;11485:9:0;11471:10;:23;11468:353;;11511:25;11528:7;11511:16;:25::i;11468:353::-;11688:22;11702:7;11688:13;:22::i;1685:206:5:-;1754:20;1766:7;1754:11;:20::i;:::-;1797:19;;;;:10;:19;;;;;1791:33;;;;;:::i;:::-;:38;;-1:-1:-1;1787:97:5;;1853:19;;;;:10;:19;;;;;1846:26;;;:::i;5729:315:4:-;5886:28;5896:4;5902:2;5906:7;5886:9;:28::i;:::-;5933:48;5956:4;5962:2;5966:7;5975:5;5933:22;:48::i;:::-;5925:111;;;;-1:-1:-1;;;5925:111:4;;;;;;;:::i;3380:103::-;3431:13;3464:11;3457:18;;;;;:::i;2807:325::-;2871:13;2905:16;2913:7;2905;:16::i;:::-;2897:76;;;;-1:-1:-1;;;2897:76:4;;22112:2:13;2897:76:4;;;22094:21:13;22151:2;22131:18;;;22124:30;22190:34;22170:18;;;22163:62;-1:-1:-1;;;22241:18:13;;;22234:45;22296:19;;2897:76:4;21910:411:13;2897:76:4;2986:21;3010:10;:8;:10::i;:::-;2986:34;;3062:1;3044:7;3038:21;:25;:86;;;;;;;;;;;;;;;;;3090:7;3099:18;:7;:16;:18::i;:::-;3073:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3038:86;3031:93;2807:325;-1:-1:-1;;;2807:325:4:o;10483:175:0:-;10558:7;;;-1:-1:-1;;;;;10576:18:0;;;-1:-1:-1;;;;;;10576:18:0;;;;;;;10610:40;;10558:7;;;10576:18;10558:7;;10610:40;;10539:16;;10610:40;10528:130;10483:175;:::o;3324:564:12:-;3611:4;3628:19;3650:77;3669:8;3679:9;3690:6;3698:8;3708:10;3720:6;3650:18;:77::i;8335:382:4:-;-1:-1:-1;;;;;8415:16:4;;8407:61;;;;-1:-1:-1;;;8407:61:4;;19761:2:13;8407:61:4;;;19743:21:13;;;19780:18;;;19773:30;19839:34;19819:18;;;19812:62;19891:18;;8407:61:4;19559:356:13;8407:61:4;8488:16;8496:7;8488;:16::i;:::-;8487:17;8479:58;;;;-1:-1:-1;;;8479:58:4;;15201:2:13;8479:58:4;;;15183:21:13;15240:2;15220:18;;;15213:30;15279;15259:18;;;15252:58;15327:18;;8479:58:4;14999:352:13;8479:58:4;-1:-1:-1;;;;;8608:13:4;;;;;;:9;:13;;;;;:18;;8625:1;;8608:13;:18;;8625:1;;8608:18;:::i;:::-;;;;-1:-1:-1;;8637:16:4;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;8637:21:4;-1:-1:-1;;;;;8637:21:4;;;;;;;;8676:33;;8637:16;;;8676:33;;8637:16;;8676:33;8335:382;;:::o;1239:217:5:-;1339:16;1347:7;1339;:16::i;:::-;1331:75;;;;-1:-1:-1;;;1331:75:5;;19005:2:13;1331:75:5;;;18987:21:13;19044:2;19024:18;;;19017:30;19083:34;19063:18;;;19056:62;-1:-1:-1;;;19134:18:13;;;19127:44;19188:19;;1331:75:5;18803:410:13;1331:75:5;1417:19;;;;:10;:19;;;;;;;;:31;;;;;;;;:::i;759:327:12:-;1008:69;;-1:-1:-1;;9173:2:13;9169:15;;;9165:24;;1008:69:12;;;9153:37:13;9206:12;;;9199:28;;;9261:15;;;9257:24;;9243:12;;;9236:46;9316:15;;;9312:24;9298:12;;;9291:46;9353:12;;;9346:28;;;9390:13;;;9383:29;;;971:7:12;;9428:13:13;;1008:69:12;;;;;;;;;;;;;998:80;;;;;;991:87;;759:327;;;;;;;;:::o;3896:283::-;4025:7;4051:9;4062;4073:7;4084:26;4099:10;4084:14;:26::i;:::-;4130:41;;;;;;;;;;;;13773:25:13;;;13846:4;13834:17;;13814:18;;;13807:45;;;;13868:18;;;13861:34;;;13911:18;;;13904:34;;;4050:60:12;;-1:-1:-1;4050:60:12;;-1:-1:-1;4050:60:12;-1:-1:-1;4130:41:12;;13745:19:13;;4130:41:12;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4130:41:12;;-1:-1:-1;;4130:41:12;;;3896:283;-1:-1:-1;;;;;;;3896:283:12:o;2854:1463:0:-;3031:16;;;3045:1;3031:16;;;;;;;;;2931:17;;2988:6;;2971:14;;3031:16;;;2931:17;;3031:16;;;;;-1:-1:-1;3031:16:0;3005:42;;3072:5;3063:6;:14;3060:68;;;3102:14;:6;3111:5;3102:14;:::i;:::-;3093:23;;3060:68;3157:7;;-1:-1:-1;;;;;3143:21:0;;;3157:7;;3143:21;3140:1170;;;3231:17;;3223:25;;:5;:25;:::i;:::-;3205:14;3214:5;3205:6;:14;:::i;:::-;:44;;;;:::i;:::-;3193:6;3200:1;3193:9;;;;;;;;:::i;:::-;;;;;;:56;;;;;3301:6;3308:1;3301:9;;;;;;;;:::i;:::-;;;;;;;3292:6;:18;;;;:::i;:::-;3280:6;3287:1;3280:9;;;;;;;;:::i;:::-;;;;;;:30;;;;;3438:5;3429:6;:14;3426:181;;;3487:5;3475:6;3482:1;3475:9;;;;;;;;:::i;:::-;;;;;;;:17;;;;:::i;:::-;3463:6;3470:1;3463:9;;;;;;;;:::i;:::-;;;;;;:29;;;;;3532:6;3539:1;3532:9;;;;;;;;:::i;:::-;;;;;;;3523:6;:18;;;;:::i;:::-;3511:6;3518:1;3511:9;;;;;;;;:::i;:::-;;;;;;:30;;;;;3426:181;3630:6;-1:-1:-1;3623:13:0;;-1:-1:-1;3623:13:0;3140:1170;3687:17;3722:12;;3707;;:27;;;;:::i;:::-;3687:47;-1:-1:-1;3763:17:0;3687:47;3784:14;3793:5;3784:6;:14;:::i;:::-;:26;;;;:::i;:::-;3875:12;;3763:47;;-1:-1:-1;3851:21:0;3863:9;3763:47;3851:21;:::i;:::-;:36;;;;:::i;:::-;3839:6;3846:1;3839:9;;;;;;;;:::i;:::-;;;;;;;;;;:48;3954:12;;3930:21;3942:9;3930;:21;:::i;:::-;:36;;;;:::i;:::-;3918:6;3925:1;3918:9;;;;;;;;:::i;:::-;;;;;;;;;;:48;4025:18;4034:9;4025:6;:18;:::i;:::-;4013:6;4020:1;4013:9;;;;;;;;:::i;:::-;;;;;;:30;;;;;4088:5;4079:6;:14;4076:178;;;4137:5;4125:6;4132:1;4125:9;;;;;;;;:::i;:::-;;;;;;;:17;;;;:::i;:::-;4113:6;4120:1;4113:9;;;;;;;;:::i;:::-;;;;;;:29;;;;;4185:5;4173:6;4180:1;4173:9;;;;;;;;:::i;:::-;;;;;;;:17;;;;:::i;:::-;4161:6;4168:1;4161:9;;;;;;;;:::i;:::-;;;;;;:29;;;;;4233:5;4221:6;4228:1;4221:9;;;;;;;;:::i;:::-;;;;;;;:17;;;;:::i;:::-;4209:6;4216:1;4209:9;;;;;;;;:::i;:::-;;;;;;:29;;;;;4076:178;4277:6;4270:13;;;;;;;;11070:169;11145:41;682:10:2;11178:7:0;11145:18;:41::i;:::-;11137:94;;;;-1:-1:-1;;;11137:94:0;;20540:2:13;11137:94:0;;;20522:21:13;20579:2;20559:18;;;20552:30;20618:34;20598:18;;;20591:62;-1:-1:-1;;;20669:18:13;;;20662:38;20717:19;;11137:94:0;20338:404:13;11247:154:0;11343:7;;11319:21;;;;:12;:21;;;;;;11353:15;;11319:31;;;:::i;:::-;:49;11311:82;;;;-1:-1:-1;;;11311:82:0;;15558:2:13;11311:82:0;;;15540:21:13;15597:2;15577:18;;;15570:30;-1:-1:-1;;;15616:18:13;;;15609:50;15676:18;;11311:82:0;15356:344:13;8946:360:4;9006:13;9022:23;9037:7;9022:14;:23::i;:::-;9006:39;;9147:29;9164:1;9168:7;9147:8;:29::i;:::-;-1:-1:-1;;;;;9189:16:4;;;;;;:9;:16;;;;;:21;;9209:1;;9189:16;:21;;9209:1;;9189:21;:::i;:::-;;;;-1:-1:-1;;9228:16:4;;;;:7;:16;;;;;;9221:23;;-1:-1:-1;;;;;;9221:23:4;;;9262:36;9236:7;;9228:16;-1:-1:-1;;;;;9262:36:4;;;;;9228:16;;9262:36;8995:311;8946:360;:::o;11078:799::-;11233:4;-1:-1:-1;;;;;11254:13:4;;1066:20:1;1114:8;11250:620:4;;11290:72;;-1:-1:-1;;;11290:72:4;;-1:-1:-1;;;;;11290:36:4;;;;;:72;;682:10:2;;11341:4:4;;11347:7;;11356:5;;11290:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11290:72:4;;;;;;;;-1:-1:-1;;11290:72:4;;;;;;;;;;;;:::i;:::-;;;11286:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11532:13:4;;11528:272;;11575:60;;-1:-1:-1;;;11575:60:4;;;;;;;:::i;11528:272::-;11750:6;11744:13;11735:6;11731:2;11727:15;11720:38;11286:529;-1:-1:-1;;;;;;11413:51:4;-1:-1:-1;;;11413:51:4;;-1:-1:-1;11406:58:4;;11250:620;-1:-1:-1;11854:4:4;11078:799;;;;;;:::o;288:723:10:-;344:13;565:10;561:53;;-1:-1:-1;;592:10:10;;;;;;;;;;;;-1:-1:-1;;;592:10:10;;;;;288:723::o;561:53::-;639:5;624:12;680:78;687:9;;680:78;;713:8;;;;:::i;:::-;;-1:-1:-1;736:10:10;;-1:-1:-1;744:2:10;736:10;;:::i;:::-;;;680:78;;;768:19;800:6;790:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;790:17:10;;768:39;;818:154;825:10;;818:154;;852:11;862:1;852:11;;:::i;:::-;;-1:-1:-1;921:10:10;929:2;921:5;:10;:::i;:::-;908:24;;:2;:24;:::i;:::-;895:39;;878:6;885;878:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;878:56:10;;;;;;;;-1:-1:-1;949:11:10;958:2;949:11;;:::i;:::-;;;818:154;;1098:371:12;1335:7;1389:8;1399:9;1410:6;1429:9;1418:21;;;;;;;;:::i;:::-;;;;-1:-1:-1;;1418:21:12;;;;;;;;;;1372:88;;;;;1441:10;;1453:6;;1418:21;1372:88;;:::i;4187:893::-;4293:9;4317;4341:7;4384:3;:10;4398:2;4384:16;4376:53;;;;-1:-1:-1;;;4376:53:12;;24324:2:13;4376:53:12;;;24306:21:13;24363:2;24343:18;;;24336:30;24402:26;24382:18;;;24375:54;24446:18;;4376:53:12;24122:348:13;4376:53:12;-1:-1:-1;;;4838:2:12;4829:12;;4823:19;4908:2;4899:12;;4893:19;5015:2;5006:12;;;5000:19;4823;;4997:1;4992:28;;;;;4187:893::o;6651:348:4:-;6744:4;6769:16;6777:7;6769;:16::i;:::-;6761:73;;;;-1:-1:-1;;;6761:73:4;;16666:2:13;6761:73:4;;;16648:21:13;16705:2;16685:18;;;16678:30;16744:34;16724:18;;;16717:62;-1:-1:-1;;;16795:18:13;;;16788:42;16847:19;;6761:73:4;16464:408:13;6761:73:4;6845:13;6861:23;6876:7;6861:14;:23::i;:::-;6845:39;;6914:5;-1:-1:-1;;;;;6903:16:4;:7;-1:-1:-1;;;;;6903:16:4;;:51;;;;6947:7;-1:-1:-1;;;;;6923:31:4;:20;6935:7;6923:11;:20::i;:::-;-1:-1:-1;;;;;6923:31:4;;6903:51;:87;;;;6958:32;6975:5;6982:7;6958:16;:32::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:173:13;82:20;;-1:-1:-1;;;;;131:31:13;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:672::-;246:5;299:3;292:4;284:6;280:17;276:27;266:55;;317:1;314;307:12;266:55;353:6;340:20;379:4;403:59;419:42;458:2;419:42;:::i;:::-;403:59;:::i;:::-;484:3;508:2;503:3;496:15;536:2;531:3;527:12;520:19;;571:2;563:6;559:15;623:3;618:2;612;609:1;605:10;597:6;593:23;589:32;586:41;583:61;;;640:1;637;630:12;583:61;662:1;672:163;686:2;683:1;680:9;672:163;;;743:17;;731:30;;781:12;;;;813;;;;704:1;697:9;672:163;;;-1:-1:-1;853:5:13;;192:672;-1:-1:-1;;;;;;;192:672:13:o;869:530::-;911:5;964:3;957:4;949:6;945:17;941:27;931:55;;982:1;979;972:12;931:55;1018:6;1005:20;1044:18;1040:2;1037:26;1034:52;;;1066:18;;:::i;:::-;1110:55;1153:2;1134:13;;-1:-1:-1;;1130:27:13;1159:4;1126:38;1110:55;:::i;:::-;1190:2;1181:7;1174:19;1236:3;1229:4;1224:2;1216:6;1212:15;1208:26;1205:35;1202:55;;;1253:1;1250;1243:12;1202:55;1318:2;1311:4;1303:6;1299:17;1292:4;1283:7;1279:18;1266:55;1366:1;1341:16;;;1359:4;1337:27;1330:38;;;;1345:7;869:530;-1:-1:-1;;;869:530:13:o;1404:186::-;1463:6;1516:2;1504:9;1495:7;1491:23;1487:32;1484:52;;;1532:1;1529;1522:12;1484:52;1555:29;1574:9;1555:29;:::i;1595:260::-;1663:6;1671;1724:2;1712:9;1703:7;1699:23;1695:32;1692:52;;;1740:1;1737;1730:12;1692:52;1763:29;1782:9;1763:29;:::i;:::-;1753:39;;1811:38;1845:2;1834:9;1830:18;1811:38;:::i;:::-;1801:48;;1595:260;;;;;:::o;1860:328::-;1937:6;1945;1953;2006:2;1994:9;1985:7;1981:23;1977:32;1974:52;;;2022:1;2019;2012:12;1974:52;2045:29;2064:9;2045:29;:::i;:::-;2035:39;;2093:38;2127:2;2116:9;2112:18;2093:38;:::i;:::-;2083:48;;2178:2;2167:9;2163:18;2150:32;2140:42;;1860:328;;;;;:::o;2193:537::-;2288:6;2296;2304;2312;2365:3;2353:9;2344:7;2340:23;2336:33;2333:53;;;2382:1;2379;2372:12;2333:53;2405:29;2424:9;2405:29;:::i;:::-;2395:39;;2453:38;2487:2;2476:9;2472:18;2453:38;:::i;:::-;2443:48;;2538:2;2527:9;2523:18;2510:32;2500:42;;2593:2;2582:9;2578:18;2565:32;2620:18;2612:6;2609:30;2606:50;;;2652:1;2649;2642:12;2606:50;2675:49;2716:7;2707:6;2696:9;2692:22;2675:49;:::i;:::-;2665:59;;;2193:537;;;;;;;:::o;2735:1727::-;2917:6;2925;2933;2941;2949;2957;2965;3018:3;3006:9;2997:7;2993:23;2989:33;2986:53;;;3035:1;3032;3025:12;2986:53;3058:29;3077:9;3058:29;:::i;:::-;3048:39;;3106:18;3173:2;3167;3156:9;3152:18;3139:32;3136:40;3133:60;;;3189:1;3186;3179:12;3133:60;3255:2;3244:9;3240:18;3227:32;3216:9;3212:48;3298:7;3291:4;3287:2;3283:13;3279:27;3269:55;;3320:1;3317;3310:12;3269:55;3344:73;3360:56;3412:2;3399:16;3360:56;:::i;3344:73::-;3439:3;3476:2;3463:16;3458:3;3451:29;3505:2;3500:3;3496:12;3489:19;;3536:2;3532;3528:11;3598:7;3593:2;3586;3573:16;3570:1;3566:24;3562:2;3558:33;3554:42;3551:55;3548:75;;;3619:1;3616;3609:12;3548:75;3641:1;3651:280;3678:2;3665:16;3662:1;3659:23;3651:280;;;3749:2;3743:3;3730:17;3727:25;3724:45;;;3765:1;3762;3755:12;3724:45;3794:62;3848:7;3843:2;3836:3;3823:17;3819:2;3815:26;3811:35;3794:62;:::i;:::-;3782:75;;3886:2;3877:12;;;;3909;;;;;3697:1;3690:9;3651:280;;;3655:3;;3950:5;3940:15;;;;;4004:2;3998;3987:9;3983:18;3970:32;3967:40;3964:60;;;4020:1;4017;4010:12;3964:60;4043:87;4122:7;4115:2;4104:9;4100:18;4087:32;4076:9;4072:48;4043:87;:::i;:::-;4033:97;;4149:38;4183:2;4172:9;4168:18;4149:38;:::i;:::-;4139:48;;4234:3;4223:9;4219:19;4206:33;4196:43;;4286:3;4275:9;4271:19;4258:33;4248:43;;4341:2;4334:3;4323:9;4319:19;4306:33;4303:41;4300:61;;;4357:1;4354;4347:12;4300:61;;4380:76;4448:7;4440:3;4429:9;4425:19;4412:33;4401:9;4397:49;4380:76;:::i;:::-;4370:86;;2735:1727;;;;;;;;;;:::o;4467:315::-;4532:6;4540;4593:2;4581:9;4572:7;4568:23;4564:32;4561:52;;;4609:1;4606;4599:12;4561:52;4632:29;4651:9;4632:29;:::i;:::-;4622:39;;4711:2;4700:9;4696:18;4683:32;4724:28;4746:5;4724:28;:::i;:::-;4771:5;4761:15;;;4467:315;;;;;:::o;4787:254::-;4855:6;4863;4916:2;4904:9;4895:7;4891:23;4887:32;4884:52;;;4932:1;4929;4922:12;4884:52;4955:29;4974:9;4955:29;:::i;:::-;4945:39;5031:2;5016:18;;;;5003:32;;-1:-1:-1;;;4787:254:13:o;5046:750::-;5168:6;5176;5184;5192;5200;5208;5216;5269:3;5257:9;5248:7;5244:23;5240:33;5237:53;;;5286:1;5283;5276:12;5237:53;5309:29;5328:9;5309:29;:::i;:::-;5299:39;;5385:2;5374:9;5370:18;5357:32;5347:42;;5408:38;5442:2;5431:9;5427:18;5408:38;:::i;:::-;5398:48;;5465:38;5499:2;5488:9;5484:18;5465:38;:::i;:::-;5455:48;;5550:3;5539:9;5535:19;5522:33;5512:43;;5602:3;5591:9;5587:19;5574:33;5564:43;;5658:3;5647:9;5643:19;5630:33;5686:18;5678:6;5675:30;5672:50;;;5718:1;5715;5708:12;5672:50;5741:49;5782:7;5773:6;5762:9;5758:22;5741:49;:::i;:::-;5731:59;;;5046:750;;;;;;;;;;:::o;5801:245::-;5868:6;5921:2;5909:9;5900:7;5896:23;5892:32;5889:52;;;5937:1;5934;5927:12;5889:52;5969:9;5963:16;5988:28;6010:5;5988:28;:::i;6051:245::-;6109:6;6162:2;6150:9;6141:7;6137:23;6133:32;6130:52;;;6178:1;6175;6168:12;6130:52;6217:9;6204:23;6236:30;6260:5;6236:30;:::i;6301:249::-;6370:6;6423:2;6411:9;6402:7;6398:23;6394:32;6391:52;;;6439:1;6436;6429:12;6391:52;6471:9;6465:16;6490:30;6514:5;6490:30;:::i;6555:321::-;6624:6;6677:2;6665:9;6656:7;6652:23;6648:32;6645:52;;;6693:1;6690;6683:12;6645:52;6733:9;6720:23;6766:18;6758:6;6755:30;6752:50;;;6798:1;6795;6788:12;6752:50;6821:49;6862:7;6853:6;6842:9;6838:22;6821:49;:::i;6881:180::-;6940:6;6993:2;6981:9;6972:7;6968:23;6964:32;6961:52;;;7009:1;7006;6999:12;6961:52;-1:-1:-1;7032:23:13;;6881:180;-1:-1:-1;6881:180:13:o;7066:435::-;7119:3;7157:5;7151:12;7184:6;7179:3;7172:19;7210:4;7239:2;7234:3;7230:12;7223:19;;7276:2;7269:5;7265:14;7297:1;7307:169;7321:6;7318:1;7315:13;7307:169;;;7382:13;;7370:26;;7416:12;;;;7451:15;;;;7343:1;7336:9;7307:169;;;-1:-1:-1;7492:3:13;;7066:435;-1:-1:-1;;;;;7066:435:13:o;7506:257::-;7547:3;7585:5;7579:12;7612:6;7607:3;7600:19;7628:63;7684:6;7677:4;7672:3;7668:14;7661:4;7654:5;7650:16;7628:63;:::i;:::-;7745:2;7724:15;-1:-1:-1;;7720:29:13;7711:39;;;;7752:4;7707:50;;7506:257;-1:-1:-1;;7506:257:13:o;7768:1061::-;8087:3;8119:26;8115:31;8188:2;8179:6;8175:2;8171:15;8167:24;8162:3;8155:37;8243:2;8234:6;8230:2;8226:15;8222:24;8217:2;8212:3;8208:12;8201:46;;8277:6;8272:2;8267:3;8263:12;8256:28;8313:6;8307:13;8339:4;8352:60;8405:6;8400:2;8395:3;8391:12;8386:2;8378:6;8374:15;8352:60;:::i;:::-;8484:13;;8438:16;;;8456:2;8434:25;;8543:15;;;8576:1;8586:177;8600:8;8597:1;8594:15;8586:177;;;8665:13;;8651:28;;8701:14;;;;8738:15;;;;8624:1;8617:9;8586:177;;;-1:-1:-1;;;8772:21:13;;;8809:14;;;;;-1:-1:-1;;;;;;;7768:1061:13:o;9452:470::-;9631:3;9669:6;9663:13;9685:53;9731:6;9726:3;9719:4;9711:6;9707:17;9685:53;:::i;:::-;9801:13;;9760:16;;;;9823:57;9801:13;9760:16;9857:4;9845:17;;9823:57;:::i;:::-;9896:20;;9452:470;-1:-1:-1;;;;9452:470:13:o;10900:488::-;-1:-1:-1;;;;;11169:15:13;;;11151:34;;11221:15;;11216:2;11201:18;;11194:43;11268:2;11253:18;;11246:34;;;11316:3;11311:2;11296:18;;11289:31;;;11094:4;;11337:45;;11362:19;;11354:6;11337:45;:::i;:::-;11329:53;10900:488;-1:-1:-1;;;;;;10900:488:13:o;11672:604::-;-1:-1:-1;;;;;12001:15:13;;;11983:34;;12048:2;12033:18;;12026:34;;;12096:15;;12091:2;12076:18;;12069:43;12143:2;12128:18;;12121:34;;;11963:3;12186;12171:19;;12164:32;;;11926:4;;12213:57;;12250:19;;12242:6;12213:57;:::i;:::-;12205:65;11672:604;-1:-1:-1;;;;;;;11672:604:13:o;12281:802::-;12443:4;12472:2;12512;12501:9;12497:18;12542:2;12531:9;12524:21;12565:6;12600;12594:13;12631:6;12623;12616:22;12669:2;12658:9;12654:18;12647:25;;12731:2;12721:6;12718:1;12714:14;12703:9;12699:30;12695:39;12681:53;;12769:2;12761:6;12757:15;12790:1;12800:254;12814:6;12811:1;12808:13;12800:254;;;12907:2;12903:7;12891:9;12883:6;12879:22;12875:36;12870:3;12863:49;12935:39;12967:6;12958;12952:13;12935:39;:::i;:::-;12925:49;-1:-1:-1;13032:12:13;;;;12997:15;;;;12836:1;12829:9;12800:254;;;-1:-1:-1;13071:6:13;;12281:802;-1:-1:-1;;;;;;;12281:802:13:o;13088:261::-;13267:2;13256:9;13249:21;13230:4;13287:56;13339:2;13328:9;13324:18;13316:6;13287:56;:::i;13949:219::-;14098:2;14087:9;14080:21;14061:4;14118:44;14158:2;14147:9;14143:18;14135:6;14118:44;:::i;14173:414::-;14375:2;14357:21;;;14414:2;14394:18;;;14387:30;14453:34;14448:2;14433:18;;14426:62;-1:-1:-1;;;14519:2:13;14504:18;;14497:48;14577:3;14562:19;;14173:414::o;23075:343::-;23277:2;23259:21;;;23316:2;23296:18;;;23289:30;-1:-1:-1;;;23350:2:13;23335:18;;23328:49;23409:2;23394:18;;23075:343::o;23770:347::-;23972:2;23954:21;;;24011:2;23991:18;;;23984:30;24050:25;24045:2;24030:18;;24023:53;24108:2;24093:18;;23770:347::o;24846:275::-;24917:2;24911:9;24982:2;24963:13;;-1:-1:-1;;24959:27:13;24947:40;;25017:18;25002:34;;25038:22;;;24999:62;24996:88;;;25064:18;;:::i;:::-;25100:2;25093:22;24846:275;;-1:-1:-1;24846:275:13:o;25126:182::-;25185:4;25218:18;25210:6;25207:30;25204:56;;;25240:18;;:::i;:::-;-1:-1:-1;25285:1:13;25281:14;25297:4;25277:25;;25126:182::o;25313:128::-;25353:3;25384:1;25380:6;25377:1;25374:13;25371:39;;;25390:18;;:::i;:::-;-1:-1:-1;25426:9:13;;25313:128::o;25446:120::-;25486:1;25512;25502:35;;25517:18;;:::i;:::-;-1:-1:-1;25551:9:13;;25446:120::o;25571:168::-;25611:7;25677:1;25673;25669:6;25665:14;25662:1;25659:21;25654:1;25647:9;25640:17;25636:45;25633:71;;;25684:18;;:::i;:::-;-1:-1:-1;25724:9:13;;25571:168::o;25744:125::-;25784:4;25812:1;25809;25806:8;25803:34;;;25817:18;;:::i;:::-;-1:-1:-1;25854:9:13;;25744:125::o;25874:258::-;25946:1;25956:113;25970:6;25967:1;25964:13;25956:113;;;26046:11;;;26040:18;26027:11;;;26020:39;25992:2;25985:10;25956:113;;;26087:6;26084:1;26081:13;26078:48;;;-1:-1:-1;;26122:1:13;26104:16;;26097:27;25874:258::o;26137:380::-;26216:1;26212:12;;;;26259;;;26280:61;;26334:4;26326:6;26322:17;26312:27;;26280:61;26387:2;26379:6;26376:14;26356:18;26353:38;26350:161;;;26433:10;26428:3;26424:20;26421:1;26414:31;26468:4;26465:1;26458:15;26496:4;26493:1;26486:15;26350:161;;26137:380;;;:::o;26522:135::-;26561:3;-1:-1:-1;;26582:17:13;;26579:43;;;26602:18;;:::i;:::-;-1:-1:-1;26649:1:13;26638:13;;26522:135::o;26662:112::-;26694:1;26720;26710:35;;26725:18;;:::i;:::-;-1:-1:-1;26759:9:13;;26662:112::o;26779:127::-;26840:10;26835:3;26831:20;26828:1;26821:31;26871:4;26868:1;26861:15;26895:4;26892:1;26885:15;26911:127;26972:10;26967:3;26963:20;26960:1;26953:31;27003:4;27000:1;26993:15;27027:4;27024:1;27017:15;27043:127;27104:10;27099:3;27095:20;27092:1;27085:31;27135:4;27132:1;27125:15;27159:4;27156:1;27149:15;27175:127;27236:10;27231:3;27227:20;27224:1;27217:31;27267:4;27264:1;27257:15;27291:4;27288:1;27281:15;27307:118;27393:5;27386:13;27379:21;27372:5;27369:32;27359:60;;27415:1;27412;27405:12;27430:131;-1:-1:-1;;;;;;27504:32:13;;27494:43;;27484:71;;27551:1;27548;27541:12

Swarm Source

ipfs://b0f747eca571f172a5d8432459fccdd9dfa96a2200f117cb84a5128a26a6e1e8
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.