ETH Price: $2,454.07 (-1.89%)

Token

PoodleDunks (PDNK)
 

Overview

Max Total Supply

2,000 PDNK

Holders

559

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 PDNK
0x4707b4b1ea91cd6a7e9159adcca5890b45b3d1cd
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
PoodleDunks

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
Yes with 400 runs

Other Settings:
default evmVersion, BSD-3-Clause license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: BSD-3-Clause

// File @openzeppelin/contracts/utils/[email protected]
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

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 @openzeppelin/contracts/utils/[email protected]

// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

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 @openzeppelin/contracts/access/[email protected]

// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @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 onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


// File contracts/Blimpie/Delegated.sol

pragma solidity ^0.8.0;

/***********************
* @author: squeebo_nft *
************************/

contract Delegated is Ownable{
  mapping(address => bool) internal _delegates;

  constructor(){
    _delegates[owner()] = true;
  }

  modifier onlyDelegates {
    require(_delegates[msg.sender], "Invalid delegate" );
    _;
  }

  //onlyOwner
  function isDelegate( address addr ) external view onlyOwner returns ( bool ){
    return _delegates[addr];
  }

  function setDelegate( address addr, bool isDelegate_ ) external onlyOwner{
    _delegates[addr] = isDelegate_;
  }

  function transferOwnership(address newOwner) public virtual override onlyOwner {
    _delegates[newOwner] = true;
    super.transferOwnership( newOwner );
  }
}


// File @openzeppelin/contracts/utils/cryptography/[email protected]
// OpenZeppelin Contracts v4.4.1 (utils/cryptography/ECDSA.sol)

pragma solidity ^0.8.0;

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s;
        uint8 v;
        assembly {
            s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
            v := add(shr(255, vs), 27)
        }
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ├╖ 2 + 1, and for v in (302): v Γêê {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}


// File contracts/Blimpie/Signed.sol

pragma solidity ^0.8.0;
contract Signed is Delegated{
  using Strings for uint256;
  using ECDSA for bytes32;

  string private _secret;
  address private _signer;


  function setSecret( string calldata secret ) external onlyOwner{
    _secret = secret;
  }

  function setSigner( address signer ) external onlyOwner{
    _signer = signer;
  }


  function createHash( string memory data ) internal view returns ( bytes32 ){
    return keccak256( abi.encodePacked( address(this), msg.sender, data, _secret ) );
  }

  function getSigner( bytes32 hash, bytes memory signature ) internal pure returns( address ){
    return hash.toEthSignedMessageHash().recover( signature );
  }

  function isAuthorizedSigner( address extracted ) internal view virtual returns( bool ){
    return extracted == _signer;
  }

  function verifySignature( string memory data, bytes calldata signature ) internal view {
    address extracted = getSigner( createHash( data ), signature );
    require( isAuthorizedSigner( extracted ), "Signature verification failed" );
  }


}


// File contracts/Blimpie/IERC721Batch.sol

pragma solidity ^0.8.0;

interface IERC721Batch {
  function isOwnerOf( address account, uint[] calldata tokenIds ) external view returns( bool );
  function transferBatch( address from, address to, uint[] calldata tokenIds, bytes calldata data ) external;
  function walletOfOwner( address account ) external view returns( uint[] memory );
}


// File @openzeppelin/contracts/utils/introspection/[email protected]
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

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 @openzeppelin/contracts/token/ERC721/[email protected]
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

/**
 * @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;

    /**
     * @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;

    /**
     * @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;
}


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}


// File @openzeppelin/contracts/token/ERC721/[email protected]
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

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 @openzeppelin/contracts/token/ERC721/extensions/[email protected]
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

/**
 * @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 @openzeppelin/contracts/utils/[email protected]
// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)

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 @openzeppelin/contracts/utils/introspection/[email protected]
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

/**
 * @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 contracts/PoodleDunks/PD721.sol

pragma solidity ^0.8.0;

/****************************************
 * @author: squeebo_nft                 *
 * @team:   GoldenX                     *
 ****************************************
 *   Blimpie-ERC721 provides low-gas    *
 *           mints + transfers          *
 ****************************************/

abstract contract PD721 is Context, Delegated, ERC165, IERC721, IERC721Metadata {
    using Address for address;

    string private _name;
    string private _symbol;
    address[] internal _owners;

    mapping(uint => address) internal _tokenApprovals;
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    constructor(string memory name_, string memory symbol_)
        Delegated(){
        _name = name_;
        _symbol = symbol_;
    }

    //public
    function name() external view override returns (string memory) {
        return _name;
    }

    function balanceOf(address owner) public view override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");

        uint count;
        for( uint i; i < _owners.length; ++i ){
            if( owner == _owners[i] )
                ++count;
        }
        return count;
    }

    function ownerOf(uint tokenId) public view override returns (address) {
        require(_exists(tokenId), "ERC721: query for nonexistent token");
        return _owners[tokenId];
    }

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

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

    function approve(address to, uint tokenId) external override {
        address owner = 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);
    }

    function getApproved(uint tokenId) public view override returns (address) {
        require(_exists(tokenId), "ERC721: query for nonexistent token");
        return _tokenApprovals[tokenId];
    }

    function isApprovedForAll(address owner, address operator) public view override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    function setApprovalForAll(address operator, bool approved) external override {
        require(operator != _msgSender(), "ERC721: approve to caller");
        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

    function transferFrom(
        address from,
        address to,
        uint tokenId
    ) external override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _transfer(from, to, tokenId);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint tokenId
    ) external override {
        safeTransferFrom(from, to, tokenId, "");
    }

    function safeTransferFrom(
        address from,
        address to,
        uint tokenId,
        bytes memory _data
    ) public override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }


    //internal
    function _approve(address to, uint tokenId) internal {
        _tokenApprovals[tokenId] = to;
        emit Approval(ownerOf(tokenId), to, tokenId);
    }

    function _checkOnERC721Received(
        address from,
        address to,
        uint 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;
        }
    }

    function _exists(uint tokenId) internal view returns (bool) {
        return tokenId < _owners.length && _owners[tokenId] != address(0);
    }

    function _isApprovedOrOwner(address spender, uint tokenId) internal view returns (bool) {
        require(_exists(tokenId), "ERC721: query for nonexistent token");
        address owner = ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    function _mint(address to, uint tokenId) internal virtual;

    function _safeTransfer(
        address from,
        address to,
        uint tokenId,
        bytes memory _data
    ) internal {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    function _transfer(
        address from,
        address to,
        uint tokenId
    ) internal {
        require(ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }
}


// File contracts/PoodleDunks/PD721Enumerable.sol

pragma solidity ^0.8.0;


/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract PD721Enumerable is PD721, IERC721Enumerable {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, PD721) returns (bool) {
        return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view override returns (uint256 tokenId) {
        uint count;
        for( uint i; i < _owners.length; ++i ){
            if( owner == _owners[i] ){
                if( count == index )
                    return i;
                else
                    ++count;
            }
        }

        require(false, "ERC721Enumerable: owner index out of bounds");
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) external view override returns (uint256) {
        require(index < _owners.length, "ERC721: query for nonexistent token");
        return index;
    }
}


// File contracts/PoodleDunks/PD721Batch.sol

pragma solidity ^0.8.0;

/****************************************
 * @author: squeebo_nft                 *
 * @team:   GoldenX                     *
 ****************************************/


abstract contract PD721Batch is PD721Enumerable, IERC721Batch {
  function isOwnerOf( address account, uint[] calldata tokenIds ) external view override returns( bool ){
    for(uint i; i < tokenIds.length; ++i ){
      if( _owners[ tokenIds[i] ] != account )
        return false;
    }

    return true;
  }

  function transferBatch( address from, address to, uint[] calldata tokenIds, bytes calldata data ) external override{
    for(uint i; i < tokenIds.length; ++i ){
      safeTransferFrom( from, to, tokenIds[i], data );
    }
  }

  function walletOfOwner( address account ) public view override returns( uint[] memory ){
    uint quantity = balanceOf( account );

    uint count;
    uint[] memory wallet = new uint[]( quantity );
    for( uint i; i < _owners.length; ++i ){
      if( account == _owners[i] ){
        wallet[ count++ ] = i;
        if( count == quantity )
          break;
      }
    }
    return wallet;
  }
}


// File contracts/PoodleDunks/PoodleDunks.sol

pragma solidity ^0.8.0;

/****************************************
 * @author: GoldenX                     *
 ****************************************
 *   Blimpie-ERC721 provides low-gas    *
 *           mints + transfers          *
 ****************************************/



contract PoodleDunks is PD721Batch, Signed {
  using Strings for uint;

  uint public MAX_CLAIM  = 2000;
  uint public MAX_ORDER  = 20;
  uint public MAX_SUPPLY = 10000;
  uint public PRICE      = 0.04 ether;

  bool public isFreesaleActive = false;
  bool public isPresaleActive = false;
  bool public isVerified = true;
  bool public isMainsaleActive = false;
  uint public totalClaimed;

  string private _baseTokenURI = '';
  string private _tokenURISuffix = '';
  mapping(address => uint) private _claimed;
  address private a1 = 0xB7edf3Cbb58ecb74BdE6298294c7AAb339F3cE4a;

  constructor()
    PD721("PoodleDunks", "PDNK"){
  }


  //safety first
  fallback() external payable {}

  receive() external payable {}

  function withdraw() external onlyOwner{
    require( address(this).balance > 0 );
    require( payable(a1).send( address(this).balance ) );
  }


  //view
  function getTokensByOwner(address owner) external view returns(uint256[] memory) {
    return walletOfOwner(owner);
  }

  function tokenURI(uint tokenId) external view override returns (string memory) {
    require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
    return string(abi.encodePacked(_baseTokenURI, tokenId.toString(), _tokenURISuffix));
  }


  //nonpayable 
  function claim( uint quantity, bytes calldata signature ) external {
    require( isFreesaleActive, "Claim is not active" );
    require( _claimed[ msg.sender ] < quantity, "No claims available" );
    quantity -= _claimed[ msg.sender ];

    uint supply = totalSupply();
    require( quantity + supply <= MAX_SUPPLY );

    totalClaimed += quantity;
    require( totalClaimed <= MAX_CLAIM, "No claim supply available" );

    if( isVerified )
      verifySignature( quantity.toString(), signature );

    unchecked {
      _claimed[ msg.sender ] += quantity;
      for(uint i; i < quantity; i++){
        _mint( msg.sender, supply++ );
      }
    }
  }


  //payable
  function mint( uint quantity, bytes calldata signature ) external payable {
    require( quantity <= MAX_ORDER,         "Order too big"             );
    require( msg.value >= PRICE * quantity, "Ether sent is not correct" );

    uint256 supply = totalSupply();
    require( supply + quantity <= MAX_SUPPLY, "Mint/order exceeds supply" );

    if( isMainsaleActive ){
      //ok
    }
    else if( isPresaleActive ){
      if( isVerified )
        verifySignature( quantity.toString(), signature );
    }
    else{
      revert( "Sale is not active" );
    }

    unchecked {
      for(uint i; i < quantity; i++){
        _mint( msg.sender, supply++ );
      }
    }
  }

  function changeWithdrawalAddress(address newAddress) external onlyOwner {
    require(a1 != newAddress, "New value matches old value");
    a1 = newAddress;
  }


  //onlyDelegates
  function mintTo(uint[] calldata quantity, address[] calldata recipient) external payable onlyDelegates{
    require(quantity.length == recipient.length, "Must provide equal quantities and recipients" );

    uint totalQuantity;
    uint supply = totalSupply();
    for(uint i; i < quantity.length; i++){
      totalQuantity += quantity[i];
    }
    require( supply + totalQuantity <= MAX_SUPPLY, "Mint/order exceeds supply" );

    unchecked {
      for(uint i = 0; i < recipient.length; i++){
        for(uint j = 0; j < quantity[i]; j++){
          _mint( recipient[i], supply++ );
        }
      }
    }
  }

  function setActive(bool isFreesaleActive_, bool isPresaleActive_, bool isMainsaleActive_, bool isVerified_) external onlyDelegates{
    if( isFreesaleActive != isFreesaleActive_ )
      isFreesaleActive = isFreesaleActive_;
    
    if( isPresaleActive != isPresaleActive_ )
      isPresaleActive = isPresaleActive_;

    if( isMainsaleActive != isMainsaleActive_ )
      isMainsaleActive = isMainsaleActive_;

    if( isVerified != isVerified_ )
      isVerified = isVerified_;
  }

  function setBaseURI(string calldata _newBaseURI, string calldata _newSuffix) external onlyDelegates{
    _baseTokenURI = _newBaseURI;
    _tokenURISuffix = _newSuffix;
  }

  function setMax(uint maxClaim, uint maxOrder, uint maxSupply) external onlyDelegates{
    require( maxSupply >= totalSupply(), "Specified supply is lower than current balance" );
    if( MAX_CLAIM != maxClaim )
      MAX_CLAIM = maxClaim;
    
    if( MAX_ORDER != maxOrder )
      MAX_ORDER = maxOrder;

    if( MAX_SUPPLY != maxSupply )
      MAX_SUPPLY = maxSupply;
  }

  function setPrice(uint price) external onlyDelegates{
    if( PRICE != price )
      PRICE = price;
  }


  //internal
  function _mint(address to, uint256 tokenId) internal override {
    _owners.push(to);
    emit Transfer(address(0), to, tokenId);
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"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"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"MAX_CLAIM","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_ORDER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"changeWithdrawalAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","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"}],"name":"getTokensByOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"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":[{"internalType":"address","name":"addr","type":"address"}],"name":"isDelegate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isFreesaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isMainsaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"isOwnerOf","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPresaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isVerified","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"quantity","type":"uint256[]"},{"internalType":"address[]","name":"recipient","type":"address[]"}],"name":"mintTo","outputs":[],"stateMutability":"payable","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":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isFreesaleActive_","type":"bool"},{"internalType":"bool","name":"isPresaleActive_","type":"bool"},{"internalType":"bool","name":"isMainsaleActive_","type":"bool"},{"internalType":"bool","name":"isVerified_","type":"bool"}],"name":"setActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"},{"internalType":"string","name":"_newSuffix","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"isDelegate_","type":"bool"}],"name":"setDelegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxClaim","type":"uint256"},{"internalType":"uint256","name":"maxOrder","type":"uint256"},{"internalType":"uint256","name":"maxSupply","type":"uint256"}],"name":"setMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"secret","type":"string"}],"name":"setSecret","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"name":"setSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"transferBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6107d06009556014600a55612710600b55668e1bc9bf040000600c55600d805463ffffffff19166201000017905560a06040819052600060808190526200004991600f91620001c3565b506040805160208101918290526000908190526200006a91601091620001c3565b50601280546001600160a01b03191673b7edf3cbb58ecb74bde6298294c7aab339f3ce4a1790553480156200009e57600080fd5b506040518060400160405280600b81526020016a506f6f646c6544756e6b7360a81b8152506040518060400160405280600481526020016350444e4b60e01b815250620000fa620000f46200016f60201b60201c565b62000173565b6001806000620001126000546001600160a01b031690565b6001600160a01b03168152602080820192909252604001600020805460ff1916921515929092179091558251620001509160029190850190620001c3565b50805162000166906003906020840190620001c3565b505050620002a6565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054620001d19062000269565b90600052602060002090601f016020900481019282620001f5576000855562000240565b82601f106200021057805160ff191683800117855562000240565b8280016001018555821562000240579182015b828111156200024057825182559160200191906001019062000223565b506200024e92915062000252565b5090565b5b808211156200024e576000815560010162000253565b600181811c908216806200027e57607f821691505b60208210811415620002a057634e487b7160e01b600052602260045260246000fd5b50919050565b61329280620002b66000396000f3fe60806040526004361061029f5760003560e01c80636790a9de1161016a57806395d89b41116100d5578063d54ad2a111610084578063e985e9c511610061578063e985e9c5146107b2578063f2fde38b146107fb578063fe0efa161461081b57005b8063d54ad2a114610776578063db7fd4081461078c578063e966d5121461079f57005b8063b534a5c4116100b2578063b534a5c414610716578063b88d4fde14610736578063c87b56dd1461075657005b806395d89b41146106c75780639a56302c146106dc578063a22cb465146106f657005b80637ed6c926116101315780638d859f3e1161010e5780638d859f3e146106735780638da5cb5b1461068957806391b7f5ed146106a757005b80637ed6c926146106125780637f75c3151461063257806380007e831461065357005b80636790a9de1461057d5780636c19e7831461059d5780636f609852146105bd57806370a08231146105dd578063715018a6146105fd57005b806338926b6d1161020a5780634a994eef116101d157806350c5a00c116101ae57806350c5a00c1461052857806360d938dc1461053e5780636352211e1461055d57005b80634a994eef146104c85780634d44660c146104e85780634f6ccce71461050857005b806338926b6d146104265780633ccfd60b1461044657806340398d671461045b57806342842e0e14610488578063438b6300146104a857005b8063095ea7b31161026657806323b872dd1161024357806323b872dd146103d05780632f745c59146103f057806332cb6b0c1461041057005b8063095ea7b31461037b57806318160ddd1461039b5780631f4e2a53146103b057005b806301b65b71146102a857806301ffc9a7146102d157806306fdde03146103015780630777962714610323578063081812fc1461034357005b366102a657005b005b3480156102b457600080fd5b506102be60095481565b6040519081526020015b60405180910390f35b3480156102dd57600080fd5b506102f16102ec366004612955565b61083b565b60405190151581526020016102c8565b34801561030d57600080fd5b50610316610866565b6040516102c891906129ca565b34801561032f57600080fd5b506102f161033e3660046129f4565b6108f8565b34801561034f57600080fd5b5061036361035e366004612a0f565b610969565b6040516001600160a01b0390911681526020016102c8565b34801561038757600080fd5b506102a6610396366004612a28565b6109ac565b3480156103a757600080fd5b506004546102be565b3480156103bc57600080fd5b506102a66103cb3660046129f4565b610ac2565b3480156103dc57600080fd5b506102a66103eb366004612a52565b610b8a565b3480156103fc57600080fd5b506102be61040b366004612a28565b610c05565b34801561041c57600080fd5b506102be600b5481565b34801561043257600080fd5b506102a6610441366004612ad0565b610cd1565b34801561045257600080fd5b506102a6610e8f565b34801561046757600080fd5b5061047b6104763660046129f4565b610f17565b6040516102c89190612b1c565b34801561049457600080fd5b506102a66104a3366004612a52565b610f22565b3480156104b457600080fd5b5061047b6104c33660046129f4565b610f3d565b3480156104d457600080fd5b506102a66104e3366004612b70565b611023565b3480156104f457600080fd5b506102f1610503366004612be8565b611096565b34801561051457600080fd5b506102be610523366004612a0f565b611118565b34801561053457600080fd5b506102be600a5481565b34801561054a57600080fd5b50600d546102f190610100900460ff1681565b34801561056957600080fd5b50610363610578366004612a0f565b611140565b34801561058957600080fd5b506102a6610598366004612c2e565b611195565b3480156105a957600080fd5b506102a66105b83660046129f4565b611200565b3480156105c957600080fd5b506102a66105d8366004612c9a565b61126a565b3480156105e957600080fd5b506102be6105f83660046129f4565b611353565b34801561060957600080fd5b506102a6611421565b34801561061e57600080fd5b506102a661062d366004612cc6565b611473565b34801561063e57600080fd5b50600d546102f1906301000000900460ff1681565b34801561065f57600080fd5b50600d546102f19062010000900460ff1681565b34801561067f57600080fd5b506102be600c5481565b34801561069557600080fd5b506000546001600160a01b0316610363565b3480156106b357600080fd5b506102a66106c2366004612a0f565b6114c7565b3480156106d357600080fd5b5061031661152b565b3480156106e857600080fd5b50600d546102f19060ff1681565b34801561070257600080fd5b506102a6610711366004612b70565b61153a565b34801561072257600080fd5b506102a6610731366004612d08565b6115ff565b34801561074257600080fd5b506102a6610751366004612daf565b61167d565b34801561076257600080fd5b50610316610771366004612a0f565b6116ff565b34801561078257600080fd5b506102be600e5481565b6102a661079a366004612ad0565b6117a3565b6102a66107ad366004612e8b565b61195f565b3480156107be57600080fd5b506102f16107cd366004612eeb565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561080757600080fd5b506102a66108163660046129f4565b611b35565b34801561082757600080fd5b506102a6610836366004612f15565b611bac565b60006001600160e01b0319821663780e9d6360e01b1480610860575061086082611cab565b92915050565b60606002805461087590612f69565b80601f01602080910402602001604051908101604052809291908181526020018280546108a190612f69565b80156108ee5780601f106108c3576101008083540402835291602001916108ee565b820191906000526020600020905b8154815290600101906020018083116108d157829003601f168201915b5050505050905090565b600080546001600160a01b031633146109465760405162461bcd60e51b8152602060048201819052602482015260008051602061323d83398151915260448201526064015b60405180910390fd5b506001600160a01b03811660009081526001602052604090205460ff165b919050565b600061097482611cfb565b6109905760405162461bcd60e51b815260040161093d90612fa4565b506000908152600560205260409020546001600160a01b031690565b60006109b782611140565b9050806001600160a01b0316836001600160a01b03161415610a255760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161093d565b336001600160a01b0382161480610a415750610a4181336107cd565b610ab35760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161093d565b610abd8383611d45565b505050565b6000546001600160a01b03163314610b0a5760405162461bcd60e51b8152602060048201819052602482015260008051602061323d833981519152604482015260640161093d565b6012546001600160a01b0382811691161415610b685760405162461bcd60e51b815260206004820152601b60248201527f4e65772076616c7565206d617463686573206f6c642076616c75650000000000604482015260640161093d565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b610b943382611db3565b610bfa5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6044820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606482015260840161093d565b610abd838383611e58565b60008060005b600454811015610c745760048181548110610c2857610c28612fe7565b6000918252602090912001546001600160a01b0386811691161415610c645783821415610c585791506108609050565b610c6182613013565b91505b610c6d81613013565b9050610c0b565b5060405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161093d565b600d5460ff16610d235760405162461bcd60e51b815260206004820152601360248201527f436c61696d206973206e6f742061637469766500000000000000000000000000604482015260640161093d565b336000908152601160205260409020548311610d815760405162461bcd60e51b815260206004820152601360248201527f4e6f20636c61696d7320617661696c61626c6500000000000000000000000000604482015260640161093d565b33600090815260116020526040902054610d9b908461302e565b92506000610da860045490565b600b54909150610db88286613045565b1115610dc357600080fd5b83600e6000828254610dd59190613045565b9091555050600954600e541115610e2e5760405162461bcd60e51b815260206004820152601960248201527f4e6f20636c61696d20737570706c7920617661696c61626c6500000000000000604482015260640161093d565b600d5462010000900460ff1615610e5257610e52610e4b85611fae565b84846120c4565b3360009081526011602052604081208054860190555b84811015610e8857610e803383806001019450612174565b600101610e68565b5050505050565b6000546001600160a01b03163314610ed75760405162461bcd60e51b8152602060048201819052602482015260008051602061323d833981519152604482015260640161093d565b60004711610ee457600080fd5b6012546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050610f1557600080fd5b565b606061086082610f3d565b610abd8383836040518060200160405280600081525061167d565b60606000610f4a83611353565b90506000808267ffffffffffffffff811115610f6857610f68612d99565b604051908082528060200260200182016040528015610f91578160200160208202803683370190505b50905060005b60045481101561101a5760048181548110610fb457610fb4612fe7565b6000918252602090912001546001600160a01b038781169116141561100a57808284610fdf81613013565b955081518110610ff157610ff1612fe7565b6020026020010181815250508383141561100a5761101a565b61101381613013565b9050610f97565b50949350505050565b6000546001600160a01b0316331461106b5760405162461bcd60e51b8152602060048201819052602482015260008051602061323d833981519152604482015260640161093d565b6001600160a01b03919091166000908152600160205260409020805460ff1916911515919091179055565b6000805b8281101561110b57846001600160a01b031660048585848181106110c0576110c0612fe7565b90506020020135815481106110d7576110d7612fe7565b6000918252602090912001546001600160a01b0316146110fb576000915050611111565b61110481613013565b905061109a565b50600190505b9392505050565b600454600090821061113c5760405162461bcd60e51b815260040161093d90612fa4565b5090565b600061114b82611cfb565b6111675760405162461bcd60e51b815260040161093d90612fa4565b6004828154811061117a5761117a612fe7565b6000918252602090912001546001600160a01b031692915050565b3360009081526001602052604090205460ff166111e75760405162461bcd60e51b815260206004820152601060248201526f496e76616c69642064656c656761746560801b604482015260640161093d565b6111f3600f85856128af565b50610e88601083836128af565b6000546001600160a01b031633146112485760405162461bcd60e51b8152602060048201819052602482015260008051602061323d833981519152604482015260640161093d565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526001602052604090205460ff166112bc5760405162461bcd60e51b815260206004820152601060248201526f496e76616c69642064656c656761746560801b604482015260640161093d565b6004548110156113255760405162461bcd60e51b815260206004820152602e60248201527f53706563696669656420737570706c79206973206c6f776572207468616e206360448201526d757272656e742062616c616e636560901b606482015260840161093d565b82600954146113345760098390555b81600a541461134357600a8290555b80600b5414610abd57600b555050565b60006001600160a01b0382166113be5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161093d565b6000805b60045481101561141a57600481815481106113df576113df612fe7565b6000918252602090912001546001600160a01b038581169116141561140a5761140782613013565b91505b61141381613013565b90506113c2565b5092915050565b6000546001600160a01b031633146114695760405162461bcd60e51b8152602060048201819052602482015260008051602061323d833981519152604482015260640161093d565b610f1560006121f0565b6000546001600160a01b031633146114bb5760405162461bcd60e51b8152602060048201819052602482015260008051602061323d833981519152604482015260640161093d565b610abd600783836128af565b3360009081526001602052604090205460ff166115195760405162461bcd60e51b815260206004820152601060248201526f496e76616c69642064656c656761746560801b604482015260640161093d565b80600c541461152857600c8190555b50565b60606003805461087590612f69565b6001600160a01b0382163314156115935760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161093d565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60005b8381101561167457611664878787878581811061162157611621612fe7565b9050602002013586868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061167d92505050565b61166d81613013565b9050611602565b50505050505050565b6116873383611db3565b6116ed5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6044820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606482015260840161093d565b6116f984848484612240565b50505050565b606061170a82611cfb565b61176e5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161093d565b600f61177983611fae565b601060405160200161178d939291906130f7565b6040516020818303038152906040529050919050565b600a548311156117e55760405162461bcd60e51b815260206004820152600d60248201526c4f7264657220746f6f2062696760981b604482015260640161093d565b82600c546117f3919061312a565b3410156118425760405162461bcd60e51b815260206004820152601960248201527f45746865722073656e74206973206e6f7420636f727265637400000000000000604482015260640161093d565b600061184d60045490565b600b5490915061185d8583613045565b11156118ab5760405162461bcd60e51b815260206004820152601960248201527f4d696e742f6f72646572206578636565647320737570706c7900000000000000604482015260640161093d565b600d546301000000900460ff16156118c25761193c565b600d54610100900460ff16156118f457600d5462010000900460ff16156118ef576118ef610e4b85611fae565b61193c565b60405162461bcd60e51b815260206004820152601260248201527f53616c65206973206e6f74206163746976650000000000000000000000000000604482015260640161093d565b60005b84811015610e88576119573383806001019450612174565b60010161193f565b3360009081526001602052604090205460ff166119b15760405162461bcd60e51b815260206004820152601060248201526f496e76616c69642064656c656761746560801b604482015260640161093d565b828114611a155760405162461bcd60e51b815260206004820152602c60248201527f4d7573742070726f7669646520657175616c207175616e74697469657320616e60448201526b6420726563697069656e747360a01b606482015260840161093d565b600080611a2160045490565b905060005b85811015611a6657868682818110611a4057611a40612fe7565b9050602002013583611a529190613045565b925080611a5e81613013565b915050611a26565b50600b54611a748383613045565b1115611ac25760405162461bcd60e51b815260206004820152601960248201527f4d696e742f6f72646572206578636565647320737570706c7900000000000000604482015260640161093d565b60005b838110156116745760005b878783818110611ae257611ae2612fe7565b90506020020135811015611b2c57611b24868684818110611b0557611b05612fe7565b9050602002016020810190611b1a91906129f4565b6001850194612174565b600101611ad0565b50600101611ac5565b6000546001600160a01b03163314611b7d5760405162461bcd60e51b8152602060048201819052602482015260008051602061323d833981519152604482015260640161093d565b6001600160a01b0381166000908152600160208190526040909120805460ff19169091179055611528816122be565b3360009081526001602052604090205460ff16611bfe5760405162461bcd60e51b815260206004820152601060248201526f496e76616c69642064656c656761746560801b604482015260640161093d565b600d5460ff16151584151514611c1d57600d805460ff19168515151790555b600d5460ff61010090910416151583151514611c4757600d805461ff001916610100851515021790555b600d5460ff630100000090910416151582151514611c7757600d805463ff00000019166301000000841515021790555b600d5460ff62010000909104161515811515146116f957600d8054821515620100000262ff00001990911617905550505050565b60006001600160e01b031982166380ac58cd60e01b1480611cdc57506001600160e01b03198216635b5e139f60e01b145b8061086057506301ffc9a760e01b6001600160e01b0319831614610860565b60045460009082108015610860575060006001600160a01b031660048381548110611d2857611d28612fe7565b6000918252602090912001546001600160a01b0316141592915050565b600081815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611d7a82611140565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611dbe82611cfb565b611dda5760405162461bcd60e51b815260040161093d90612fa4565b6000611de583611140565b9050806001600160a01b0316846001600160a01b03161480611e205750836001600160a01b0316611e1584610969565b6001600160a01b0316145b80611e5057506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611e6b82611140565b6001600160a01b031614611ed35760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161093d565b6001600160a01b038216611f355760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161093d565b611f40600082611d45565b8160048281548110611f5457611f54612fe7565b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b606081611fd25750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611ffc5780611fe681613013565b9150611ff59050600a8361315f565b9150611fd6565b60008167ffffffffffffffff81111561201757612017612d99565b6040519080825280601f01601f191660200182016040528015612041576020820181803683370190505b5090505b8415611e505761205660018361302e565b9150612063600a86613173565b61206e906030613045565b60f81b81838151811061208357612083612fe7565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506120bd600a8661315f565b9450612045565b600061210e6120d285612374565b84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506123ab92505050565b9050612128816008546001600160a01b0391821691161490565b6116f95760405162461bcd60e51b815260206004820152601d60248201527f5369676e617475726520766572696669636174696f6e206661696c6564000000604482015260640161093d565b6004805460018101825560009182527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b0319166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61224b848484611e58565b612257848484846123c0565b6116f95760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606482015260840161093d565b6000546001600160a01b031633146123065760405162461bcd60e51b8152602060048201819052602482015260008051602061323d833981519152604482015260640161093d565b6001600160a01b03811661236b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161093d565b611528816121f0565b6000303383600760405160200161238e9493929190613187565b604051602081830303815290604052805190602001209050919050565b6000611111826123ba85612509565b90612544565b60006001600160a01b0384163b156124fe57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906124049033908990889088906004016131cd565b6020604051808303816000875af192505050801561243f575060408051601f3d908101601f1916820190925261243c91810190613209565b60015b6124e4573d80801561246d576040519150601f19603f3d011682016040523d82523d6000602084013e612472565b606091505b5080516124dc5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606482015260840161093d565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611e50565b506001949350505050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c0161238e565b60008060006125538585612568565b91509150612560816125d8565b509392505050565b60008082516041141561259f5760208301516040840151606085015160001a61259387828585612793565b945094505050506125d1565b8251604014156125c957602083015160408401516125be868383612880565b9350935050506125d1565b506000905060025b9250929050565b60008160048111156125ec576125ec613226565b14156125f55750565b600181600481111561260957612609613226565b14156126575760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161093d565b600281600481111561266b5761266b613226565b14156126b95760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161093d565b60038160048111156126cd576126cd613226565b14156127265760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161093d565b600481600481111561273a5761273a613226565b14156115285760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840161093d565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156127ca5750600090506003612877565b8460ff16601b141580156127e257508460ff16601c14155b156127f35750600090506004612877565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612847573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661287057600060019250925050612877565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b016128a187828885612793565b935093505050935093915050565b8280546128bb90612f69565b90600052602060002090601f0160209004810192826128dd5760008555612923565b82601f106128f65782800160ff19823516178555612923565b82800160010185558215612923579182015b82811115612923578235825591602001919060010190612908565b5061113c9291505b8082111561113c576000815560010161292b565b6001600160e01b03198116811461152857600080fd5b60006020828403121561296757600080fd5b81356111118161293f565b60005b8381101561298d578181015183820152602001612975565b838111156116f95750506000910152565b600081518084526129b6816020860160208601612972565b601f01601f19169290920160200192915050565b602081526000611111602083018461299e565b80356001600160a01b038116811461096457600080fd5b600060208284031215612a0657600080fd5b611111826129dd565b600060208284031215612a2157600080fd5b5035919050565b60008060408385031215612a3b57600080fd5b612a44836129dd565b946020939093013593505050565b600080600060608486031215612a6757600080fd5b612a70846129dd565b9250612a7e602085016129dd565b9150604084013590509250925092565b60008083601f840112612aa057600080fd5b50813567ffffffffffffffff811115612ab857600080fd5b6020830191508360208285010111156125d157600080fd5b600080600060408486031215612ae557600080fd5b83359250602084013567ffffffffffffffff811115612b0357600080fd5b612b0f86828701612a8e565b9497909650939450505050565b6020808252825182820181905260009190848201906040850190845b81811015612b5457835183529284019291840191600101612b38565b50909695505050505050565b8035801515811461096457600080fd5b60008060408385031215612b8357600080fd5b612b8c836129dd565b9150612b9a60208401612b60565b90509250929050565b60008083601f840112612bb557600080fd5b50813567ffffffffffffffff811115612bcd57600080fd5b6020830191508360208260051b85010111156125d157600080fd5b600080600060408486031215612bfd57600080fd5b612c06846129dd565b9250602084013567ffffffffffffffff811115612c2257600080fd5b612b0f86828701612ba3565b60008060008060408587031215612c4457600080fd5b843567ffffffffffffffff80821115612c5c57600080fd5b612c6888838901612a8e565b90965094506020870135915080821115612c8157600080fd5b50612c8e87828801612a8e565b95989497509550505050565b600080600060608486031215612caf57600080fd5b505081359360208301359350604090920135919050565b60008060208385031215612cd957600080fd5b823567ffffffffffffffff811115612cf057600080fd5b612cfc85828601612a8e565b90969095509350505050565b60008060008060008060808789031215612d2157600080fd5b612d2a876129dd565b9550612d38602088016129dd565b9450604087013567ffffffffffffffff80821115612d5557600080fd5b612d618a838b01612ba3565b90965094506060890135915080821115612d7a57600080fd5b50612d8789828a01612a8e565b979a9699509497509295939492505050565b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215612dc557600080fd5b612dce856129dd565b9350612ddc602086016129dd565b925060408501359150606085013567ffffffffffffffff80821115612e0057600080fd5b818701915087601f830112612e1457600080fd5b813581811115612e2657612e26612d99565b604051601f8201601f19908116603f01168101908382118183101715612e4e57612e4e612d99565b816040528281528a6020848701011115612e6757600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060008060408587031215612ea157600080fd5b843567ffffffffffffffff80821115612eb957600080fd5b612ec588838901612ba3565b90965094506020870135915080821115612ede57600080fd5b50612c8e87828801612ba3565b60008060408385031215612efe57600080fd5b612f07836129dd565b9150612b9a602084016129dd565b60008060008060808587031215612f2b57600080fd5b612f3485612b60565b9350612f4260208601612b60565b9250612f5060408601612b60565b9150612f5e60608601612b60565b905092959194509250565b600181811c90821680612f7d57607f821691505b60208210811415612f9e57634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526023908201527f4552433732313a20717565727920666f72206e6f6e6578697374656e7420746f60408201526235b2b760e91b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060001982141561302757613027612ffd565b5060010190565b60008282101561304057613040612ffd565b500390565b6000821982111561305857613058612ffd565b500190565b8054600090600181811c908083168061307757607f831692505b602080841082141561309957634e487b7160e01b600052602260045260246000fd5b8180156130ad57600181146130be576130eb565b60ff198616895284890196506130eb565b60008881526020902060005b868110156130e35781548b8201529085019083016130ca565b505084890196505b50505050505092915050565b6000613103828661305d565b8451613113818360208901612972565b61311f8183018661305d565b979650505050505050565b600081600019048311821515161561314457613144612ffd565b500290565b634e487b7160e01b600052601260045260246000fd5b60008261316e5761316e613149565b500490565b60008261318257613182613149565b500690565b60006bffffffffffffffffffffffff19808760601b168352808660601b1660148401525083516131be816028850160208801612972565b61311f6028828501018561305d565b60006001600160a01b038087168352808616602084015250836040830152608060608301526131ff608083018461299e565b9695505050505050565b60006020828403121561321b57600080fd5b81516111118161293f565b634e487b7160e01b600052602160045260246000fdfe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a2646970667358221220b2b51b694e4c38614dd066ccc0a280f42d7c44d3b0ed9d613ba481e38738db5564736f6c634300080b0033

Deployed Bytecode

0x60806040526004361061029f5760003560e01c80636790a9de1161016a57806395d89b41116100d5578063d54ad2a111610084578063e985e9c511610061578063e985e9c5146107b2578063f2fde38b146107fb578063fe0efa161461081b57005b8063d54ad2a114610776578063db7fd4081461078c578063e966d5121461079f57005b8063b534a5c4116100b2578063b534a5c414610716578063b88d4fde14610736578063c87b56dd1461075657005b806395d89b41146106c75780639a56302c146106dc578063a22cb465146106f657005b80637ed6c926116101315780638d859f3e1161010e5780638d859f3e146106735780638da5cb5b1461068957806391b7f5ed146106a757005b80637ed6c926146106125780637f75c3151461063257806380007e831461065357005b80636790a9de1461057d5780636c19e7831461059d5780636f609852146105bd57806370a08231146105dd578063715018a6146105fd57005b806338926b6d1161020a5780634a994eef116101d157806350c5a00c116101ae57806350c5a00c1461052857806360d938dc1461053e5780636352211e1461055d57005b80634a994eef146104c85780634d44660c146104e85780634f6ccce71461050857005b806338926b6d146104265780633ccfd60b1461044657806340398d671461045b57806342842e0e14610488578063438b6300146104a857005b8063095ea7b31161026657806323b872dd1161024357806323b872dd146103d05780632f745c59146103f057806332cb6b0c1461041057005b8063095ea7b31461037b57806318160ddd1461039b5780631f4e2a53146103b057005b806301b65b71146102a857806301ffc9a7146102d157806306fdde03146103015780630777962714610323578063081812fc1461034357005b366102a657005b005b3480156102b457600080fd5b506102be60095481565b6040519081526020015b60405180910390f35b3480156102dd57600080fd5b506102f16102ec366004612955565b61083b565b60405190151581526020016102c8565b34801561030d57600080fd5b50610316610866565b6040516102c891906129ca565b34801561032f57600080fd5b506102f161033e3660046129f4565b6108f8565b34801561034f57600080fd5b5061036361035e366004612a0f565b610969565b6040516001600160a01b0390911681526020016102c8565b34801561038757600080fd5b506102a6610396366004612a28565b6109ac565b3480156103a757600080fd5b506004546102be565b3480156103bc57600080fd5b506102a66103cb3660046129f4565b610ac2565b3480156103dc57600080fd5b506102a66103eb366004612a52565b610b8a565b3480156103fc57600080fd5b506102be61040b366004612a28565b610c05565b34801561041c57600080fd5b506102be600b5481565b34801561043257600080fd5b506102a6610441366004612ad0565b610cd1565b34801561045257600080fd5b506102a6610e8f565b34801561046757600080fd5b5061047b6104763660046129f4565b610f17565b6040516102c89190612b1c565b34801561049457600080fd5b506102a66104a3366004612a52565b610f22565b3480156104b457600080fd5b5061047b6104c33660046129f4565b610f3d565b3480156104d457600080fd5b506102a66104e3366004612b70565b611023565b3480156104f457600080fd5b506102f1610503366004612be8565b611096565b34801561051457600080fd5b506102be610523366004612a0f565b611118565b34801561053457600080fd5b506102be600a5481565b34801561054a57600080fd5b50600d546102f190610100900460ff1681565b34801561056957600080fd5b50610363610578366004612a0f565b611140565b34801561058957600080fd5b506102a6610598366004612c2e565b611195565b3480156105a957600080fd5b506102a66105b83660046129f4565b611200565b3480156105c957600080fd5b506102a66105d8366004612c9a565b61126a565b3480156105e957600080fd5b506102be6105f83660046129f4565b611353565b34801561060957600080fd5b506102a6611421565b34801561061e57600080fd5b506102a661062d366004612cc6565b611473565b34801561063e57600080fd5b50600d546102f1906301000000900460ff1681565b34801561065f57600080fd5b50600d546102f19062010000900460ff1681565b34801561067f57600080fd5b506102be600c5481565b34801561069557600080fd5b506000546001600160a01b0316610363565b3480156106b357600080fd5b506102a66106c2366004612a0f565b6114c7565b3480156106d357600080fd5b5061031661152b565b3480156106e857600080fd5b50600d546102f19060ff1681565b34801561070257600080fd5b506102a6610711366004612b70565b61153a565b34801561072257600080fd5b506102a6610731366004612d08565b6115ff565b34801561074257600080fd5b506102a6610751366004612daf565b61167d565b34801561076257600080fd5b50610316610771366004612a0f565b6116ff565b34801561078257600080fd5b506102be600e5481565b6102a661079a366004612ad0565b6117a3565b6102a66107ad366004612e8b565b61195f565b3480156107be57600080fd5b506102f16107cd366004612eeb565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561080757600080fd5b506102a66108163660046129f4565b611b35565b34801561082757600080fd5b506102a6610836366004612f15565b611bac565b60006001600160e01b0319821663780e9d6360e01b1480610860575061086082611cab565b92915050565b60606002805461087590612f69565b80601f01602080910402602001604051908101604052809291908181526020018280546108a190612f69565b80156108ee5780601f106108c3576101008083540402835291602001916108ee565b820191906000526020600020905b8154815290600101906020018083116108d157829003601f168201915b5050505050905090565b600080546001600160a01b031633146109465760405162461bcd60e51b8152602060048201819052602482015260008051602061323d83398151915260448201526064015b60405180910390fd5b506001600160a01b03811660009081526001602052604090205460ff165b919050565b600061097482611cfb565b6109905760405162461bcd60e51b815260040161093d90612fa4565b506000908152600560205260409020546001600160a01b031690565b60006109b782611140565b9050806001600160a01b0316836001600160a01b03161415610a255760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161093d565b336001600160a01b0382161480610a415750610a4181336107cd565b610ab35760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161093d565b610abd8383611d45565b505050565b6000546001600160a01b03163314610b0a5760405162461bcd60e51b8152602060048201819052602482015260008051602061323d833981519152604482015260640161093d565b6012546001600160a01b0382811691161415610b685760405162461bcd60e51b815260206004820152601b60248201527f4e65772076616c7565206d617463686573206f6c642076616c75650000000000604482015260640161093d565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b610b943382611db3565b610bfa5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6044820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606482015260840161093d565b610abd838383611e58565b60008060005b600454811015610c745760048181548110610c2857610c28612fe7565b6000918252602090912001546001600160a01b0386811691161415610c645783821415610c585791506108609050565b610c6182613013565b91505b610c6d81613013565b9050610c0b565b5060405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161093d565b600d5460ff16610d235760405162461bcd60e51b815260206004820152601360248201527f436c61696d206973206e6f742061637469766500000000000000000000000000604482015260640161093d565b336000908152601160205260409020548311610d815760405162461bcd60e51b815260206004820152601360248201527f4e6f20636c61696d7320617661696c61626c6500000000000000000000000000604482015260640161093d565b33600090815260116020526040902054610d9b908461302e565b92506000610da860045490565b600b54909150610db88286613045565b1115610dc357600080fd5b83600e6000828254610dd59190613045565b9091555050600954600e541115610e2e5760405162461bcd60e51b815260206004820152601960248201527f4e6f20636c61696d20737570706c7920617661696c61626c6500000000000000604482015260640161093d565b600d5462010000900460ff1615610e5257610e52610e4b85611fae565b84846120c4565b3360009081526011602052604081208054860190555b84811015610e8857610e803383806001019450612174565b600101610e68565b5050505050565b6000546001600160a01b03163314610ed75760405162461bcd60e51b8152602060048201819052602482015260008051602061323d833981519152604482015260640161093d565b60004711610ee457600080fd5b6012546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050610f1557600080fd5b565b606061086082610f3d565b610abd8383836040518060200160405280600081525061167d565b60606000610f4a83611353565b90506000808267ffffffffffffffff811115610f6857610f68612d99565b604051908082528060200260200182016040528015610f91578160200160208202803683370190505b50905060005b60045481101561101a5760048181548110610fb457610fb4612fe7565b6000918252602090912001546001600160a01b038781169116141561100a57808284610fdf81613013565b955081518110610ff157610ff1612fe7565b6020026020010181815250508383141561100a5761101a565b61101381613013565b9050610f97565b50949350505050565b6000546001600160a01b0316331461106b5760405162461bcd60e51b8152602060048201819052602482015260008051602061323d833981519152604482015260640161093d565b6001600160a01b03919091166000908152600160205260409020805460ff1916911515919091179055565b6000805b8281101561110b57846001600160a01b031660048585848181106110c0576110c0612fe7565b90506020020135815481106110d7576110d7612fe7565b6000918252602090912001546001600160a01b0316146110fb576000915050611111565b61110481613013565b905061109a565b50600190505b9392505050565b600454600090821061113c5760405162461bcd60e51b815260040161093d90612fa4565b5090565b600061114b82611cfb565b6111675760405162461bcd60e51b815260040161093d90612fa4565b6004828154811061117a5761117a612fe7565b6000918252602090912001546001600160a01b031692915050565b3360009081526001602052604090205460ff166111e75760405162461bcd60e51b815260206004820152601060248201526f496e76616c69642064656c656761746560801b604482015260640161093d565b6111f3600f85856128af565b50610e88601083836128af565b6000546001600160a01b031633146112485760405162461bcd60e51b8152602060048201819052602482015260008051602061323d833981519152604482015260640161093d565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526001602052604090205460ff166112bc5760405162461bcd60e51b815260206004820152601060248201526f496e76616c69642064656c656761746560801b604482015260640161093d565b6004548110156113255760405162461bcd60e51b815260206004820152602e60248201527f53706563696669656420737570706c79206973206c6f776572207468616e206360448201526d757272656e742062616c616e636560901b606482015260840161093d565b82600954146113345760098390555b81600a541461134357600a8290555b80600b5414610abd57600b555050565b60006001600160a01b0382166113be5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161093d565b6000805b60045481101561141a57600481815481106113df576113df612fe7565b6000918252602090912001546001600160a01b038581169116141561140a5761140782613013565b91505b61141381613013565b90506113c2565b5092915050565b6000546001600160a01b031633146114695760405162461bcd60e51b8152602060048201819052602482015260008051602061323d833981519152604482015260640161093d565b610f1560006121f0565b6000546001600160a01b031633146114bb5760405162461bcd60e51b8152602060048201819052602482015260008051602061323d833981519152604482015260640161093d565b610abd600783836128af565b3360009081526001602052604090205460ff166115195760405162461bcd60e51b815260206004820152601060248201526f496e76616c69642064656c656761746560801b604482015260640161093d565b80600c541461152857600c8190555b50565b60606003805461087590612f69565b6001600160a01b0382163314156115935760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161093d565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60005b8381101561167457611664878787878581811061162157611621612fe7565b9050602002013586868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061167d92505050565b61166d81613013565b9050611602565b50505050505050565b6116873383611db3565b6116ed5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6044820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606482015260840161093d565b6116f984848484612240565b50505050565b606061170a82611cfb565b61176e5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161093d565b600f61177983611fae565b601060405160200161178d939291906130f7565b6040516020818303038152906040529050919050565b600a548311156117e55760405162461bcd60e51b815260206004820152600d60248201526c4f7264657220746f6f2062696760981b604482015260640161093d565b82600c546117f3919061312a565b3410156118425760405162461bcd60e51b815260206004820152601960248201527f45746865722073656e74206973206e6f7420636f727265637400000000000000604482015260640161093d565b600061184d60045490565b600b5490915061185d8583613045565b11156118ab5760405162461bcd60e51b815260206004820152601960248201527f4d696e742f6f72646572206578636565647320737570706c7900000000000000604482015260640161093d565b600d546301000000900460ff16156118c25761193c565b600d54610100900460ff16156118f457600d5462010000900460ff16156118ef576118ef610e4b85611fae565b61193c565b60405162461bcd60e51b815260206004820152601260248201527f53616c65206973206e6f74206163746976650000000000000000000000000000604482015260640161093d565b60005b84811015610e88576119573383806001019450612174565b60010161193f565b3360009081526001602052604090205460ff166119b15760405162461bcd60e51b815260206004820152601060248201526f496e76616c69642064656c656761746560801b604482015260640161093d565b828114611a155760405162461bcd60e51b815260206004820152602c60248201527f4d7573742070726f7669646520657175616c207175616e74697469657320616e60448201526b6420726563697069656e747360a01b606482015260840161093d565b600080611a2160045490565b905060005b85811015611a6657868682818110611a4057611a40612fe7565b9050602002013583611a529190613045565b925080611a5e81613013565b915050611a26565b50600b54611a748383613045565b1115611ac25760405162461bcd60e51b815260206004820152601960248201527f4d696e742f6f72646572206578636565647320737570706c7900000000000000604482015260640161093d565b60005b838110156116745760005b878783818110611ae257611ae2612fe7565b90506020020135811015611b2c57611b24868684818110611b0557611b05612fe7565b9050602002016020810190611b1a91906129f4565b6001850194612174565b600101611ad0565b50600101611ac5565b6000546001600160a01b03163314611b7d5760405162461bcd60e51b8152602060048201819052602482015260008051602061323d833981519152604482015260640161093d565b6001600160a01b0381166000908152600160208190526040909120805460ff19169091179055611528816122be565b3360009081526001602052604090205460ff16611bfe5760405162461bcd60e51b815260206004820152601060248201526f496e76616c69642064656c656761746560801b604482015260640161093d565b600d5460ff16151584151514611c1d57600d805460ff19168515151790555b600d5460ff61010090910416151583151514611c4757600d805461ff001916610100851515021790555b600d5460ff630100000090910416151582151514611c7757600d805463ff00000019166301000000841515021790555b600d5460ff62010000909104161515811515146116f957600d8054821515620100000262ff00001990911617905550505050565b60006001600160e01b031982166380ac58cd60e01b1480611cdc57506001600160e01b03198216635b5e139f60e01b145b8061086057506301ffc9a760e01b6001600160e01b0319831614610860565b60045460009082108015610860575060006001600160a01b031660048381548110611d2857611d28612fe7565b6000918252602090912001546001600160a01b0316141592915050565b600081815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611d7a82611140565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611dbe82611cfb565b611dda5760405162461bcd60e51b815260040161093d90612fa4565b6000611de583611140565b9050806001600160a01b0316846001600160a01b03161480611e205750836001600160a01b0316611e1584610969565b6001600160a01b0316145b80611e5057506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611e6b82611140565b6001600160a01b031614611ed35760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161093d565b6001600160a01b038216611f355760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161093d565b611f40600082611d45565b8160048281548110611f5457611f54612fe7565b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b606081611fd25750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611ffc5780611fe681613013565b9150611ff59050600a8361315f565b9150611fd6565b60008167ffffffffffffffff81111561201757612017612d99565b6040519080825280601f01601f191660200182016040528015612041576020820181803683370190505b5090505b8415611e505761205660018361302e565b9150612063600a86613173565b61206e906030613045565b60f81b81838151811061208357612083612fe7565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506120bd600a8661315f565b9450612045565b600061210e6120d285612374565b84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506123ab92505050565b9050612128816008546001600160a01b0391821691161490565b6116f95760405162461bcd60e51b815260206004820152601d60248201527f5369676e617475726520766572696669636174696f6e206661696c6564000000604482015260640161093d565b6004805460018101825560009182527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b0319166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61224b848484611e58565b612257848484846123c0565b6116f95760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606482015260840161093d565b6000546001600160a01b031633146123065760405162461bcd60e51b8152602060048201819052602482015260008051602061323d833981519152604482015260640161093d565b6001600160a01b03811661236b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161093d565b611528816121f0565b6000303383600760405160200161238e9493929190613187565b604051602081830303815290604052805190602001209050919050565b6000611111826123ba85612509565b90612544565b60006001600160a01b0384163b156124fe57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906124049033908990889088906004016131cd565b6020604051808303816000875af192505050801561243f575060408051601f3d908101601f1916820190925261243c91810190613209565b60015b6124e4573d80801561246d576040519150601f19603f3d011682016040523d82523d6000602084013e612472565b606091505b5080516124dc5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606482015260840161093d565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611e50565b506001949350505050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c0161238e565b60008060006125538585612568565b91509150612560816125d8565b509392505050565b60008082516041141561259f5760208301516040840151606085015160001a61259387828585612793565b945094505050506125d1565b8251604014156125c957602083015160408401516125be868383612880565b9350935050506125d1565b506000905060025b9250929050565b60008160048111156125ec576125ec613226565b14156125f55750565b600181600481111561260957612609613226565b14156126575760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161093d565b600281600481111561266b5761266b613226565b14156126b95760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161093d565b60038160048111156126cd576126cd613226565b14156127265760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161093d565b600481600481111561273a5761273a613226565b14156115285760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840161093d565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156127ca5750600090506003612877565b8460ff16601b141580156127e257508460ff16601c14155b156127f35750600090506004612877565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612847573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661287057600060019250925050612877565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b016128a187828885612793565b935093505050935093915050565b8280546128bb90612f69565b90600052602060002090601f0160209004810192826128dd5760008555612923565b82601f106128f65782800160ff19823516178555612923565b82800160010185558215612923579182015b82811115612923578235825591602001919060010190612908565b5061113c9291505b8082111561113c576000815560010161292b565b6001600160e01b03198116811461152857600080fd5b60006020828403121561296757600080fd5b81356111118161293f565b60005b8381101561298d578181015183820152602001612975565b838111156116f95750506000910152565b600081518084526129b6816020860160208601612972565b601f01601f19169290920160200192915050565b602081526000611111602083018461299e565b80356001600160a01b038116811461096457600080fd5b600060208284031215612a0657600080fd5b611111826129dd565b600060208284031215612a2157600080fd5b5035919050565b60008060408385031215612a3b57600080fd5b612a44836129dd565b946020939093013593505050565b600080600060608486031215612a6757600080fd5b612a70846129dd565b9250612a7e602085016129dd565b9150604084013590509250925092565b60008083601f840112612aa057600080fd5b50813567ffffffffffffffff811115612ab857600080fd5b6020830191508360208285010111156125d157600080fd5b600080600060408486031215612ae557600080fd5b83359250602084013567ffffffffffffffff811115612b0357600080fd5b612b0f86828701612a8e565b9497909650939450505050565b6020808252825182820181905260009190848201906040850190845b81811015612b5457835183529284019291840191600101612b38565b50909695505050505050565b8035801515811461096457600080fd5b60008060408385031215612b8357600080fd5b612b8c836129dd565b9150612b9a60208401612b60565b90509250929050565b60008083601f840112612bb557600080fd5b50813567ffffffffffffffff811115612bcd57600080fd5b6020830191508360208260051b85010111156125d157600080fd5b600080600060408486031215612bfd57600080fd5b612c06846129dd565b9250602084013567ffffffffffffffff811115612c2257600080fd5b612b0f86828701612ba3565b60008060008060408587031215612c4457600080fd5b843567ffffffffffffffff80821115612c5c57600080fd5b612c6888838901612a8e565b90965094506020870135915080821115612c8157600080fd5b50612c8e87828801612a8e565b95989497509550505050565b600080600060608486031215612caf57600080fd5b505081359360208301359350604090920135919050565b60008060208385031215612cd957600080fd5b823567ffffffffffffffff811115612cf057600080fd5b612cfc85828601612a8e565b90969095509350505050565b60008060008060008060808789031215612d2157600080fd5b612d2a876129dd565b9550612d38602088016129dd565b9450604087013567ffffffffffffffff80821115612d5557600080fd5b612d618a838b01612ba3565b90965094506060890135915080821115612d7a57600080fd5b50612d8789828a01612a8e565b979a9699509497509295939492505050565b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215612dc557600080fd5b612dce856129dd565b9350612ddc602086016129dd565b925060408501359150606085013567ffffffffffffffff80821115612e0057600080fd5b818701915087601f830112612e1457600080fd5b813581811115612e2657612e26612d99565b604051601f8201601f19908116603f01168101908382118183101715612e4e57612e4e612d99565b816040528281528a6020848701011115612e6757600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060008060408587031215612ea157600080fd5b843567ffffffffffffffff80821115612eb957600080fd5b612ec588838901612ba3565b90965094506020870135915080821115612ede57600080fd5b50612c8e87828801612ba3565b60008060408385031215612efe57600080fd5b612f07836129dd565b9150612b9a602084016129dd565b60008060008060808587031215612f2b57600080fd5b612f3485612b60565b9350612f4260208601612b60565b9250612f5060408601612b60565b9150612f5e60608601612b60565b905092959194509250565b600181811c90821680612f7d57607f821691505b60208210811415612f9e57634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526023908201527f4552433732313a20717565727920666f72206e6f6e6578697374656e7420746f60408201526235b2b760e91b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060001982141561302757613027612ffd565b5060010190565b60008282101561304057613040612ffd565b500390565b6000821982111561305857613058612ffd565b500190565b8054600090600181811c908083168061307757607f831692505b602080841082141561309957634e487b7160e01b600052602260045260246000fd5b8180156130ad57600181146130be576130eb565b60ff198616895284890196506130eb565b60008881526020902060005b868110156130e35781548b8201529085019083016130ca565b505084890196505b50505050505092915050565b6000613103828661305d565b8451613113818360208901612972565b61311f8183018661305d565b979650505050505050565b600081600019048311821515161561314457613144612ffd565b500290565b634e487b7160e01b600052601260045260246000fd5b60008261316e5761316e613149565b500490565b60008261318257613182613149565b500690565b60006bffffffffffffffffffffffff19808760601b168352808660601b1660148401525083516131be816028850160208801612972565b61311f6028828501018561305d565b60006001600160a01b038087168352808616602084015250836040830152608060608301526131ff608083018461299e565b9695505050505050565b60006020828403121561321b57600080fd5b81516111118161293f565b634e487b7160e01b600052602160045260246000fdfe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a2646970667358221220b2b51b694e4c38614dd066ccc0a280f42d7c44d3b0ed9d613ba481e38738db5564736f6c634300080b0033

Deployed Bytecode Sourcemap

44784:4880:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44861:29;;;;;;;;;;;;;;;;;;;160:25:1;;;148:2;133:18;44861:29:0;;;;;;;;42009:223;;;;;;;;;;-1:-1:-1;42009:223:0;;;;;:::i;:::-;;:::i;:::-;;;747:14:1;;740:22;722:41;;710:2;695:18;42009:223:0;582:187:1;36314:94:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;6016:112::-;;;;;;;;;;-1:-1:-1;6016:112:0;;;;;:::i;:::-;;:::i;37778:199::-;;;;;;;;;;-1:-1:-1;37778:199:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2266:55:1;;;2248:74;;2236:2;2221:18;37778:199:0;2102:226:1;37375:395:0;;;;;;;;;;-1:-1:-1;37375:395:0;;;;;:::i;:::-;;:::i;42839:102::-;;;;;;;;;;-1:-1:-1;42919:7:0;:14;42839:102;;47504:163;;;;;;;;;;-1:-1:-1;47504:163:0;;;;;:::i;:::-;;:::i;38444:328::-;;;;;;;;;;-1:-1:-1;38444:328:0;;;;;:::i;:::-;;:::i;42316:447::-;;;;;;;;;;-1:-1:-1;42316:447:0;;;;;:::i;:::-;;:::i;44927:30::-;;;;;;;;;;;;;;;;46109:674;;;;;;;;;;-1:-1:-1;46109:674:0;;;;;:::i;:::-;;:::i;45535:146::-;;;;;;;;;;;;;:::i;45699:121::-;;;;;;;;;;-1:-1:-1;45699:121:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;38780:176::-;;;;;;;;;;-1:-1:-1;38780:176:0;;;;;:::i;:::-;;:::i;44027:407::-;;;;;;;;;;-1:-1:-1;44027:407:0;;;;;:::i;:::-;;:::i;6134:116::-;;;;;;;;;;-1:-1:-1;6134:116:0;;;;;:::i;:::-;;:::i;43536:250::-;;;;;;;;;;-1:-1:-1;43536:250:0;;;;;:::i;:::-;;:::i;43018:190::-;;;;;;;;;;-1:-1:-1;43018:190:0;;;;;:::i;:::-;;:::i;44895:27::-;;;;;;;;;;;;;;;;45045:35;;;;;;;;;;-1:-1:-1;45045:35:0;;;;;;;;;;;36761:187;;;;;;;;;;-1:-1:-1;36761:187:0;;;;;:::i;:::-;;:::i;48829:174::-;;;;;;;;;;-1:-1:-1;48829:174:0;;;;;:::i;:::-;;:::i;16316:84::-;;;;;;;;;;-1:-1:-1;16316:84:0;;;;;:::i;:::-;;:::i;49009:382::-;;;;;;;;;;-1:-1:-1;49009:382:0;;;;;:::i;:::-;;:::i;36416:337::-;;;;;;;;;;-1:-1:-1;36416:337:0;;;;;:::i;:::-;;:::i;4786:103::-;;;;;;;;;;;;;:::i;16218:92::-;;;;;;;;;;-1:-1:-1;16218:92:0;;;;;:::i;:::-;;:::i;45119:36::-;;;;;;;;;;-1:-1:-1;45119:36:0;;;;;;;;;;;45085:29;;;;;;;;;;-1:-1:-1;45085:29:0;;;;;;;;;;;44962:35;;;;;;;;;;;;;;;;4135:87;;;;;;;;;;-1:-1:-1;4181:7:0;4208:6;-1:-1:-1;;;;;4208:6:0;4135:87;;49397:106;;;;;;;;;;-1:-1:-1;49397:106:0;;;;;:::i;:::-;;:::i;37269:98::-;;;;;;;;;;;;;:::i;45004:36::-;;;;;;;;;;-1:-1:-1;45004:36:0;;;;;;;;38149:287;;;;;;;;;;-1:-1:-1;38149:287:0;;;;;:::i;:::-;;:::i;43792:229::-;;;;;;;;;;-1:-1:-1;43792:229:0;;;;;:::i;:::-;;:::i;38964:317::-;;;;;;;;;;-1:-1:-1;38964:317:0;;;;;:::i;:::-;;:::i;45826:258::-;;;;;;;;;;-1:-1:-1;45826:258:0;;;;;:::i;:::-;;:::i;45160:24::-;;;;;;;;;;;;;;;;46804:694;;;;;;:::i;:::-;;:::i;47694:629::-;;;;;;:::i;:::-;;:::i;37985:156::-;;;;;;;;;;-1:-1:-1;37985:156:0;;;;;:::i;:::-;-1:-1:-1;;;;;38098:25:0;;;38074:4;38098:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;37985:156;6256:161;;;;;;;;;;-1:-1:-1;6256:161:0;;;;;:::i;:::-;;:::i;48329:494::-;;;;;;;;;;-1:-1:-1;48329:494:0;;;;;:::i;:::-;;:::i;42009:223::-;42110:4;-1:-1:-1;;;;;;42134:50:0;;-1:-1:-1;;;42134:50:0;;:90;;;42188:36;42212:11;42188:23;:36::i;:::-;42127:97;42009:223;-1:-1:-1;;42009:223:0:o;36314:94::-;36362:13;36395:5;36388:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36314:94;:::o;6016:112::-;6086:4;4208:6;;-1:-1:-1;;;;;4208:6:0;2935:10;4355:23;4347:68;;;;-1:-1:-1;;;4347:68:0;;11362:2:1;4347:68:0;;;11344:21:1;;;11381:18;;;11374:30;-1:-1:-1;;;;;;;;;;;11420:18:1;;;11413:62;11492:18;;4347:68:0;;;;;;;;;-1:-1:-1;;;;;;6106:16:0;::::1;;::::0;;;:10:::1;:16;::::0;;;;;::::1;;4426:1;6016:112:::0;;;:::o;37778:199::-;37843:7;37871:16;37879:7;37871;:16::i;:::-;37863:64;;;;-1:-1:-1;;;37863:64:0;;;;;;;:::i;:::-;-1:-1:-1;37945:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;37945:24:0;;37778:199::o;37375:395::-;37447:13;37463:16;37471:7;37463;:16::i;:::-;37447:32;;37504:5;-1:-1:-1;;;;;37498:11:0;:2;-1:-1:-1;;;;;37498:11:0;;;37490:57;;;;-1:-1:-1;;;37490:57:0;;12127:2:1;37490:57:0;;;12109:21:1;12166:2;12146:18;;;12139:30;12205:34;12185:18;;;12178:62;-1:-1:-1;;;12256:18:1;;;12249:31;12297:19;;37490:57:0;11925:397:1;37490:57:0;2935:10;-1:-1:-1;;;;;37582:21:0;;;;:62;;-1:-1:-1;37607:37:0;37624:5;2935:10;37985:156;:::i;37607:37::-;37560:168;;;;-1:-1:-1;;;37560:168:0;;12529:2:1;37560:168:0;;;12511:21:1;12568:2;12548:18;;;12541:30;12607:34;12587:18;;;12580:62;12678:26;12658:18;;;12651:54;12722:19;;37560:168:0;12327:420:1;37560:168:0;37741:21;37750:2;37754:7;37741:8;:21::i;:::-;37436:334;37375:395;;:::o;47504:163::-;4181:7;4208:6;-1:-1:-1;;;;;4208:6:0;2935:10;4355:23;4347:68;;;;-1:-1:-1;;;4347:68:0;;11362:2:1;4347:68:0;;;11344:21:1;;;11381:18;;;11374:30;-1:-1:-1;;;;;;;;;;;11420:18:1;;;11413:62;11492:18;;4347:68:0;11160:356:1;4347:68:0;47591:2:::1;::::0;-1:-1:-1;;;;;47591:16:0;;::::1;:2:::0;::::1;:16;;47583:56;;;::::0;-1:-1:-1;;;47583:56:0;;12954:2:1;47583:56:0::1;::::0;::::1;12936:21:1::0;12993:2;12973:18;;;12966:30;13032:29;13012:18;;;13005:57;13079:18;;47583:56:0::1;12752:351:1::0;47583:56:0::1;47646:2;:15:::0;;-1:-1:-1;;;;;;47646:15:0::1;-1:-1:-1::0;;;;;47646:15:0;;;::::1;::::0;;;::::1;::::0;;47504:163::o;38444:328::-;38630:41;2935:10;38663:7;38630:18;:41::i;:::-;38622:103;;;;-1:-1:-1;;;38622:103:0;;13310:2:1;38622:103:0;;;13292:21:1;13349:2;13329:18;;;13322:30;13388:34;13368:18;;;13361:62;-1:-1:-1;;;13439:18:1;;;13432:47;13496:19;;38622:103:0;13108:413:1;38622:103:0;38736:28;38746:4;38752:2;38756:7;38736:9;:28::i;42316:447::-;42407:15;42435:10;42461:6;42456:226;42473:7;:14;42469:18;;42456:226;;;42522:7;42530:1;42522:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;42513:19:0;;;42522:10;;42513:19;42509:162;;;42566:5;42557;:14;42553:102;;;42602:1;-1:-1:-1;42595:8:0;;-1:-1:-1;42595:8:0;42553:102;42648:7;;;:::i;:::-;;;42553:102;42489:3;;;:::i;:::-;;;42456:226;;;-1:-1:-1;42694:61:0;;-1:-1:-1;;;42694:61:0;;14132:2:1;42694:61:0;;;14114:21:1;14171:2;14151:18;;;14144:30;14210:34;14190:18;;;14183:62;-1:-1:-1;;;14261:18:1;;;14254:41;14312:19;;42694:61:0;13930:407:1;46109:674:0;46192:16;;;;46183:50;;;;-1:-1:-1;;;46183:50:0;;14544:2:1;46183:50:0;;;14526:21:1;14583:2;14563:18;;;14556:30;14622:21;14602:18;;;14595:49;14661:18;;46183:50:0;14342:343:1;46183:50:0;46259:10;46249:22;;;;:8;:22;;;;;;:33;-1:-1:-1;46240:67:0;;;;-1:-1:-1;;;46240:67:0;;14892:2:1;46240:67:0;;;14874:21:1;14931:2;14911:18;;;14904:30;14970:21;14950:18;;;14943:49;15009:18;;46240:67:0;14690:343:1;46240:67:0;46336:10;46326:22;;;;:8;:22;;;;;;46314:34;;;;:::i;:::-;;;46357:11;46371:13;42919:7;:14;;42839:102;46371:13;46421:10;;46357:27;;-1:-1:-1;46400:17:0;46357:27;46400:8;:17;:::i;:::-;:31;;46391:42;;;;;;46458:8;46442:12;;:24;;;;;;;:::i;:::-;;;;-1:-1:-1;;46498:9:0;;46482:12;;:25;;46473:65;;;;-1:-1:-1;;;46473:65:0;;15503:2:1;46473:65:0;;;15485:21:1;15542:2;15522:18;;;15515:30;15581:27;15561:18;;;15554:55;15626:18;;46473:65:0;15301:349:1;46473:65:0;46551:10;;;;;;;46547:73;;;46571:49;46588:19;:8;:17;:19::i;:::-;46609:9;;46571:15;:49::i;:::-;46658:10;46648:22;;;;:8;:22;;;;;:34;;;;;;46691:80;46707:8;46703:1;:12;46691:80;;;46732:29;46739:10;46751:8;;;;;;46732:5;:29::i;:::-;46717:3;;46691:80;;;;46176:607;46109:674;;;:::o;45535:146::-;4181:7;4208:6;-1:-1:-1;;;;;4208:6:0;2935:10;4355:23;4347:68;;;;-1:-1:-1;;;4347:68:0;;11362:2:1;4347:68:0;;;11344:21:1;;;11381:18;;;11374:30;-1:-1:-1;;;;;;;;;;;11420:18:1;;;11413:62;11492:18;;4347:68:0;11160:356:1;4347:68:0;45613:1:::1;45589:21;:25;45580:36;;;::::0;::::1;;45640:2;::::0;45632:41:::1;::::0;-1:-1:-1;;;;;45640:2:0;;::::1;::::0;45650:21:::1;45632:41:::0;::::1;;;::::0;45640:2:::1;45632:41:::0;45640:2;45632:41;45650:21;45640:2;45632:41;::::1;;;;;;45623:52;;;::::0;::::1;;45535:146::o:0;45699:121::-;45762:16;45794:20;45808:5;45794:13;:20::i;38780:176::-;38909:39;38926:4;38932:2;38936:7;38909:39;;;;;;;;;;;;:16;:39::i;44027:407::-;44099:13;44121;44137:20;44148:7;44137:9;:20::i;:::-;44121:36;;44166:10;44183:20;44218:8;44206:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44206:22:0;;44183:45;;44240:6;44235:174;44252:7;:14;44248:18;;44235:174;;;44297:7;44305:1;44297:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;44286:21:0;;;44297:10;;44286:21;44282:120;;;44340:1;44320:6;44328:7;;;;:::i;:::-;;;44320:17;;;;;;;;:::i;:::-;;;;;;:21;;;;;44365:8;44356:5;:17;44352:40;;;44387:5;;44352:40;44268:3;;;:::i;:::-;;;44235:174;;;-1:-1:-1;44422:6:0;44027:407;-1:-1:-1;;;;44027:407:0:o;6134:116::-;4181:7;4208:6;-1:-1:-1;;;;;4208:6:0;2935:10;4355:23;4347:68;;;;-1:-1:-1;;;4347:68:0;;11362:2:1;4347:68:0;;;11344:21:1;;;11381:18;;;11374:30;-1:-1:-1;;;;;;;;;;;11420:18:1;;;11413:62;11492:18;;4347:68:0;11160:356:1;4347:68:0;-1:-1:-1;;;;;6214:16:0;;;::::1;;::::0;;;:10:::1;:16;::::0;;;;:30;;-1:-1:-1;;6214:30:0::1;::::0;::::1;;::::0;;;::::1;::::0;;6134:116::o;43536:250::-;43632:4;43649:6;43645:116;43657:19;;;43645:116;;;43722:7;-1:-1:-1;;;;;43696:33:0;:7;43705:8;;43714:1;43705:11;;;;;;;:::i;:::-;;;;;;;43696:22;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;43696:22:0;:33;43692:61;;43748:5;43741:12;;;;;43692:61;43678:3;;;:::i;:::-;;;43645:116;;;;43776:4;43769:11;;43536:250;;;;;;:::o;43018:190::-;43123:7;:14;43087:7;;43115:22;;43107:70;;;;-1:-1:-1;;;43107:70:0;;;;;;;:::i;:::-;-1:-1:-1;43195:5:0;43018:190::o;36761:187::-;36822:7;36850:16;36858:7;36850;:16::i;:::-;36842:64;;;;-1:-1:-1;;;36842:64:0;;;;;;;:::i;:::-;36924:7;36932;36924:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;36924:16:0;;36761:187;-1:-1:-1;;36761:187:0:o;48829:174::-;5948:10;5937:22;;;;:10;:22;;;;;;;;5929:52;;;;-1:-1:-1;;;5929:52:0;;15857:2:1;5929:52:0;;;15839:21:1;15896:2;15876:18;;;15869:30;-1:-1:-1;;;15915:18:1;;;15908:46;15971:18;;5929:52:0;15655:340:1;5929:52:0;48935:27:::1;:13;48951:11:::0;;48935:27:::1;:::i;:::-;-1:-1:-1::0;48969:28:0::1;:15;48987:10:::0;;48969:28:::1;:::i;16316:84::-:0;4181:7;4208:6;-1:-1:-1;;;;;4208:6:0;2935:10;4355:23;4347:68;;;;-1:-1:-1;;;4347:68:0;;11362:2:1;4347:68:0;;;11344:21:1;;;11381:18;;;11374:30;-1:-1:-1;;;;;;;;;;;11420:18:1;;;11413:62;11492:18;;4347:68:0;11160:356:1;4347:68:0;16378:7:::1;:16:::0;;-1:-1:-1;;;;;;16378:16:0::1;-1:-1:-1::0;;;;;16378:16:0;;;::::1;::::0;;;::::1;::::0;;16316:84::o;49009:382::-;5948:10;5937:22;;;;:10;:22;;;;;;;;5929:52;;;;-1:-1:-1;;;5929:52:0;;15857:2:1;5929:52:0;;;15839:21:1;15896:2;15876:18;;;15869:30;-1:-1:-1;;;15915:18:1;;;15908:46;15971:18;;5929:52:0;15655:340:1;5929:52:0;42919:7;:14;49109:9:::1;:26;;49100:87;;;::::0;-1:-1:-1;;;49100:87:0;;16202:2:1;49100:87:0::1;::::0;::::1;16184:21:1::0;16241:2;16221:18;;;16214:30;16280:34;16260:18;;;16253:62;-1:-1:-1;;;16331:18:1;;;16324:44;16385:19;;49100:87:0::1;16000:410:1::0;49100:87:0::1;49211:8;49198:9;;:21;49194:55;;49229:9;:20:::0;;;49194:55:::1;49279:8;49266:9;;:21;49262:55;;49297:9;:20:::0;;;49262:55:::1;49344:9;49330:10;;:23;49326:59;;49363:10;:22:::0;-1:-1:-1;;49009:382:0:o;36416:337::-;36480:7;-1:-1:-1;;;;;36508:19:0;;36500:74;;;;-1:-1:-1;;;36500:74:0;;16617:2:1;36500:74:0;;;16599:21:1;16656:2;16636:18;;;16629:30;16695:34;16675:18;;;16668:62;-1:-1:-1;;;16746:18:1;;;16739:40;16796:19;;36500:74:0;16415:406:1;36500:74:0;36587:10;36613:6;36608:115;36625:7;:14;36621:18;;36608:115;;;36674:7;36682:1;36674:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;36665:19:0;;;36674:10;;36665:19;36661:50;;;36704:7;;;:::i;:::-;;;36661:50;36641:3;;;:::i;:::-;;;36608:115;;;-1:-1:-1;36740:5:0;36416:337;-1:-1:-1;;36416:337:0:o;4786:103::-;4181:7;4208:6;-1:-1:-1;;;;;4208:6:0;2935:10;4355:23;4347:68;;;;-1:-1:-1;;;4347:68:0;;11362:2:1;4347:68:0;;;11344:21:1;;;11381:18;;;11374:30;-1:-1:-1;;;;;;;;;;;11420:18:1;;;11413:62;11492:18;;4347:68:0;11160:356:1;4347:68:0;4851:30:::1;4878:1;4851:18;:30::i;16218:92::-:0;4181:7;4208:6;-1:-1:-1;;;;;4208:6:0;2935:10;4355:23;4347:68;;;;-1:-1:-1;;;4347:68:0;;11362:2:1;4347:68:0;;;11344:21:1;;;11381:18;;;11374:30;-1:-1:-1;;;;;;;;;;;11420:18:1;;;11413:62;11492:18;;4347:68:0;11160:356:1;4347:68:0;16288:16:::1;:7;16298:6:::0;;16288:16:::1;:::i;49397:106::-:0;5948:10;5937:22;;;;:10;:22;;;;;;;;5929:52;;;;-1:-1:-1;;;5929:52:0;;15857:2:1;5929:52:0;;;15839:21:1;15896:2;15876:18;;;15869:30;-1:-1:-1;;;15915:18:1;;;15908:46;15971:18;;5929:52:0;15655:340:1;5929:52:0;49469:5:::1;49460;;:14;49456:41;;49484:5;:13:::0;;;49456:41:::1;49397:106:::0;:::o;37269:98::-;37319:13;37352:7;37345:14;;;;;:::i;38149:287::-;-1:-1:-1;;;;;38246:24:0;;2935:10;38246:24;;38238:62;;;;-1:-1:-1;;;38238:62:0;;17028:2:1;38238:62:0;;;17010:21:1;17067:2;17047:18;;;17040:30;17106:27;17086:18;;;17079:55;17151:18;;38238:62:0;16826:349:1;38238:62:0;2935:10;38311:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;38311:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;38311:53:0;;;;;;;;;;38380:48;;722:41:1;;;38311:42:0;;2935:10;38380:48;;695:18:1;38380:48:0;;;;;;;38149:287;;:::o;43792:229::-;43918:6;43914:102;43926:19;;;43914:102;;;43961:47;43979:4;43985:2;43989:8;;43998:1;43989:11;;;;;;;:::i;:::-;;;;;;;44002:4;;43961:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43961:16:0;;-1:-1:-1;;;43961:47:0:i;:::-;43947:3;;;:::i;:::-;;;43914:102;;;;43792:229;;;;;;:::o;38964:317::-;39128:41;2935:10;39161:7;39128:18;:41::i;:::-;39120:103;;;;-1:-1:-1;;;39120:103:0;;13310:2:1;39120:103:0;;;13292:21:1;13349:2;13329:18;;;13322:30;13388:34;13368:18;;;13361:62;-1:-1:-1;;;13439:18:1;;;13432:47;13496:19;;39120:103:0;13108:413:1;39120:103:0;39234:39;39248:4;39254:2;39258:7;39267:5;39234:13;:39::i;:::-;38964:317;;;;:::o;45826:258::-;45890:13;45920:16;45928:7;45920;:16::i;:::-;45912:76;;;;-1:-1:-1;;;45912:76:0;;17382:2:1;45912:76:0;;;17364:21:1;17421:2;17401:18;;;17394:30;17460:34;17440:18;;;17433:62;-1:-1:-1;;;17511:18:1;;;17504:45;17566:19;;45912:76:0;17180:411:1;45912:76:0;46026:13;46041:18;:7;:16;:18::i;:::-;46061:15;46009:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45995:83;;45826:258;;;:::o;46804:694::-;46906:9;;46894:8;:21;;46885:69;;;;-1:-1:-1;;;46885:69:0;;19363:2:1;46885:69:0;;;19345:21:1;19402:2;19382:18;;;19375:30;-1:-1:-1;;;19421:18:1;;;19414:43;19474:18;;46885:69:0;19161:337:1;46885:69:0;46991:8;46983:5;;:16;;;;:::i;:::-;46970:9;:29;;46961:69;;;;-1:-1:-1;;;46961:69:0;;19878:2:1;46961:69:0;;;19860:21:1;19917:2;19897:18;;;19890:30;19956:27;19936:18;;;19929:55;20001:18;;46961:69:0;19676:349:1;46961:69:0;47039:14;47056:13;42919:7;:14;;42839:102;47056:13;47106:10;;47039:30;;-1:-1:-1;47085:17:0;47094:8;47039:30;47085:17;:::i;:::-;:31;;47076:71;;;;-1:-1:-1;;;47076:71:0;;20232:2:1;47076:71:0;;;20214:21:1;20271:2;20251:18;;;20244:30;20310:27;20290:18;;;20283:55;20355:18;;47076:71:0;20030:349:1;47076:71:0;47160:16;;;;;;;47156:223;;;;;;47213:15;;;;;;;47209:170;;;47243:10;;;;;;;47239:75;;;47265:49;47282:19;:8;:17;:19::i;47265:49::-;47209:170;;;47341:30;;-1:-1:-1;;;47341:30:0;;20586:2:1;47341:30:0;;;20568:21:1;20625:2;20605:18;;;20598:30;20664:20;20644:18;;;20637:48;20702:18;;47341:30:0;20384:342:1;47209:170:0;47410:6;47406:80;47422:8;47418:1;:12;47406:80;;;47447:29;47454:10;47466:8;;;;;;47447:5;:29::i;:::-;47432:3;;47406:80;;47694:629;5948:10;5937:22;;;;:10;:22;;;;;;;;5929:52;;;;-1:-1:-1;;;5929:52:0;;15857:2:1;5929:52:0;;;15839:21:1;15896:2;15876:18;;;15869:30;-1:-1:-1;;;15915:18:1;;;15908:46;15971:18;;5929:52:0;15655:340:1;5929:52:0;47811:35;;::::1;47803:93;;;::::0;-1:-1:-1;;;47803:93:0;;20933:2:1;47803:93:0::1;::::0;::::1;20915:21:1::0;20972:2;20952:18;;;20945:30;21011:34;20991:18;;;20984:62;-1:-1:-1;;;21062:18:1;;;21055:42;21114:19;;47803:93:0::1;20731:408:1::0;47803:93:0::1;47905:18;47930:11:::0;47944:13:::1;42919:7:::0;:14;;42839:102;47944:13:::1;47930:27;;47968:6;47964:82;47976:19:::0;;::::1;47964:82;;;48027:8;;48036:1;48027:11;;;;;;;:::i;:::-;;;;;;;48010:28;;;;;:::i;:::-;::::0;-1:-1:-1;47997:3:0;::::1;::::0;::::1;:::i;:::-;;;;47964:82;;;-1:-1:-1::0;48087:10:0::1;::::0;48061:22:::1;48070:13:::0;48061:6;:22:::1;:::i;:::-;:36;;48052:76;;;::::0;-1:-1:-1;;;48052:76:0;;20232:2:1;48052:76:0::1;::::0;::::1;20214:21:1::0;20271:2;20251:18;;;20244:30;20310:27;20290:18;;;20283:55;20355:18;;48052:76:0::1;20030:349:1::0;48052:76:0::1;48160:6;48156:155;48172:20:::0;;::::1;48156:155;;;48213:6;48209:93;48229:8;;48238:1;48229:11;;;;;;;:::i;:::-;;;;;;;48225:1;:15;48209:93;;;48259:31;48266:9;;48276:1;48266:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;48280:8;::::0;::::1;::::0;48259:5:::1;:31::i;:::-;48242:3;;48209:93;;;-1:-1:-1::0;48194:3:0::1;;48156:155;;6256:161:::0;4181:7;4208:6;-1:-1:-1;;;;;4208:6:0;2935:10;4355:23;4347:68;;;;-1:-1:-1;;;4347:68:0;;11362:2:1;4347:68:0;;;11344:21:1;;;11381:18;;;11374:30;-1:-1:-1;;;;;;;;;;;11420:18:1;;;11413:62;11492:18;;4347:68:0;11160:356:1;4347:68:0;-1:-1:-1;;;;;6342:20:0;::::1;;::::0;;;6365:4:::1;6342:20;::::0;;;;;;;:27;;-1:-1:-1;;6342:27:0::1;::::0;;::::1;::::0;;6376:35:::1;6353:8:::0;6376:23:::1;:35::i;48329:494::-:0;5948:10;5937:22;;;;:10;:22;;;;;;;;5929:52;;;;-1:-1:-1;;;5929:52:0;;15857:2:1;5929:52:0;;;15839:21:1;15896:2;15876:18;;;15869:30;-1:-1:-1;;;15915:18:1;;;15908:46;15971:18;;5929:52:0;15655:340:1;5929:52:0;48470:16:::1;::::0;::::1;;:37;;::::0;::::1;;;48466:87;;48517:16;:36:::0;;-1:-1:-1;;48517:36:0::1;::::0;::::1;;;::::0;;48466:87:::1;48570:15;::::0;::::1;;::::0;;::::1;;:35;;::::0;::::1;;;48566:83;;48615:15;:34:::0;;-1:-1:-1;;48615:34:0::1;;::::0;::::1;;;;::::0;;48566:83:::1;48662:16;::::0;::::1;::::0;;;::::1;;:37;;::::0;::::1;;;48658:87;;48709:16;:36:::0;;-1:-1:-1;;48709:36:0::1;::::0;;::::1;;;;::::0;;48658:87:::1;48758:10;::::0;::::1;::::0;;;::::1;;:25;;::::0;::::1;;;48754:63;;48793:10;:24:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;48793:24:0;;::::1;;::::0;;48329:494;;;;:::o;36956:305::-;37058:4;-1:-1:-1;;;;;;37095:40:0;;-1:-1:-1;;;37095:40:0;;:105;;-1:-1:-1;;;;;;;37152:48:0;;-1:-1:-1;;;37152:48:0;37095:105;:158;;;-1:-1:-1;;;;;;;;;;35377:40:0;;;37217:36;35268:157;40275:144;40363:7;:14;40329:4;;40353:24;;:58;;;;;40409:1;-1:-1:-1;;;;;40381:30:0;:7;40389;40381:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;40381:16:0;:30;;40346:65;40275:144;-1:-1:-1;;40275:144:0:o;39307:156::-;39371:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;39371:29:0;-1:-1:-1;;;;;39371:29:0;;;;;;;;:24;;39425:16;39371:24;39425:7;:16::i;:::-;-1:-1:-1;;;;;39416:39:0;;;;;;;;;;;39307:156;;:::o;40427:321::-;40509:4;40534:16;40542:7;40534;:16::i;:::-;40526:64;;;;-1:-1:-1;;;40526:64:0;;;;;;;:::i;:::-;40601:13;40617:16;40625:7;40617;:16::i;:::-;40601:32;;40663:5;-1:-1:-1;;;;;40652:16:0;:7;-1:-1:-1;;;;;40652:16:0;;:51;;;;40696:7;-1:-1:-1;;;;;40672:31:0;:20;40684:7;40672:11;:20::i;:::-;-1:-1:-1;;;;;40672:31:0;;40652:51;:87;;;-1:-1:-1;;;;;;38098:25:0;;;38074:4;38098:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;40707:32;40644:96;40427:321;-1:-1:-1;;;;40427:321:0:o;41134:446::-;41275:4;-1:-1:-1;;;;;41255:24:0;:16;41263:7;41255;:16::i;:::-;-1:-1:-1;;;;;41255:24:0;;41247:78;;;;-1:-1:-1;;;41247:78:0;;21346:2:1;41247:78:0;;;21328:21:1;21385:2;21365:18;;;21358:30;21424:34;21404:18;;;21397:62;-1:-1:-1;;;21475:18:1;;;21468:39;21524:19;;41247:78:0;21144:405:1;41247:78:0;-1:-1:-1;;;;;41344:16:0;;41336:65;;;;-1:-1:-1;;;41336:65:0;;21756:2:1;41336:65:0;;;21738:21:1;21795:2;21775:18;;;21768:30;21834:34;21814:18;;;21807:62;-1:-1:-1;;;21885:18:1;;;21878:34;21929:19;;41336:65:0;21554:400:1;41336:65:0;41466:29;41483:1;41487:7;41466:8;:29::i;:::-;41525:2;41506:7;41514;41506:16;;;;;;;;:::i;:::-;;;;;;;;;:21;;-1:-1:-1;;;;;;41506:21:0;-1:-1:-1;;;;;41506:21:0;;;;;;41545:27;;41564:7;;41545:27;;;;;;;;;;41506:16;41545:27;41134:446;;;:::o;411:723::-;467:13;688:10;684:53;;-1:-1:-1;;715:10:0;;;;;;;;;;;;-1:-1:-1;;;715:10:0;;;;;411:723::o;684:53::-;762:5;747:12;803:78;810:9;;803:78;;836:8;;;;:::i;:::-;;-1:-1:-1;859:10:0;;-1:-1:-1;867:2:0;859:10;;:::i;:::-;;;803:78;;;891:19;923:6;913:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;913:17:0;;891:39;;941:154;948:10;;941:154;;975:11;985:1;975:11;;:::i;:::-;;-1:-1:-1;1044:10:0;1052:2;1044:5;:10;:::i;:::-;1031:24;;:2;:24;:::i;:::-;1018:39;;1001:6;1008;1001:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;1072:11:0;1081:2;1072:11;;:::i;:::-;;;941:154;;16881:244;16975:17;16995:42;17006:18;17018:4;17006:10;:18::i;:::-;17026:9;;16995:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16995:9:0;;-1:-1:-1;;;16995:42:0:i;:::-;16975:62;;17053:31;17073:9;16862:7;;-1:-1:-1;;;;;16849:20:0;;;16862:7;;16849:20;;16749:126;17053:31;17044:75;;;;-1:-1:-1;;;17044:75:0;;22535:2:1;17044:75:0;;;22517:21:1;22574:2;22554:18;;;22547:30;22613:31;22593:18;;;22586:59;22662:18;;17044:75:0;22333:353:1;49525:136:0;49594:7;:16;;;;;;;-1:-1:-1;49594:16:0;;;;;;;-1:-1:-1;;;;;;49594:16:0;-1:-1:-1;;;;;49594:16:0;;;;;;;;49622:33;;49647:7;;-1:-1:-1;49622:33:0;;-1:-1:-1;;49622:33:0;49525:136;;:::o;5405:191::-;5479:16;5498:6;;-1:-1:-1;;;;;5515:17:0;;;-1:-1:-1;;;;;;5515:17:0;;;;;;5548:40;;5498:6;;;;;;;5548:40;;5479:16;5548:40;5468:128;5405:191;:::o;40822:304::-;40968:28;40978:4;40984:2;40988:7;40968:9;:28::i;:::-;41015:48;41038:4;41044:2;41048:7;41057:5;41015:22;:48::i;:::-;41007:111;;;;-1:-1:-1;;;41007:111:0;;22893:2:1;41007:111:0;;;22875:21:1;22932:2;22912:18;;;22905:30;22971:34;22951:18;;;22944:62;-1:-1:-1;;;23022:18:1;;;23015:48;23080:19;;41007:111:0;22691:414:1;5044:201:0;4181:7;4208:6;-1:-1:-1;;;;;4208:6:0;2935:10;4355:23;4347:68;;;;-1:-1:-1;;;4347:68:0;;11362:2:1;4347:68:0;;;11344:21:1;;;11381:18;;;11374:30;-1:-1:-1;;;;;;;;;;;11420:18:1;;;11413:62;11492:18;;4347:68:0;11160:356:1;4347:68:0;-1:-1:-1;;;;;5133:22:0;::::1;5125:73;;;::::0;-1:-1:-1;;;5125:73:0;;23312:2:1;5125:73:0::1;::::0;::::1;23294:21:1::0;23351:2;23331:18;;;23324:30;23390:34;23370:18;;;23363:62;-1:-1:-1;;;23441:18:1;;;23434:36;23487:19;;5125:73:0::1;23110:402:1::0;5125:73:0::1;5209:28;5228:8;5209:18;:28::i;16408:168::-:0;16474:7;16534:4;16541:10;16553:4;16559:7;16508:60;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;16497:73;;;;;;16490:80;;16408:168;;;:::o;16582:161::-;16664:7;16687:50;16726:9;16687:29;:4;:27;:29::i;:::-;:37;;:50::i;39471:796::-;39623:4;-1:-1:-1;;;;;39644:13:0;;27393:20;27441:8;39640:620;;39680:72;;-1:-1:-1;;;39680:72:0;;-1:-1:-1;;;;;39680:36:0;;;;;:72;;2935:10;;39731:4;;39737:7;;39746:5;;39680:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39680:72:0;;;;;;;;-1:-1:-1;;39680:72:0;;;;;;;;;;;;:::i;:::-;;;39676:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39922:13:0;;39918:272;;39965:60;;-1:-1:-1;;;39965:60:0;;22893:2:1;39965:60:0;;;22875:21:1;22932:2;22912:18;;;22905:30;22971:34;22951:18;;;22944:62;-1:-1:-1;;;23022:18:1;;;23015:48;23080:19;;39965:60:0;22691:414:1;39918:272:0;40140:6;40134:13;40125:6;40121:2;40117:15;40110:38;39676:529;-1:-1:-1;;;;;;39803:51:0;-1:-1:-1;;;39803:51:0;;-1:-1:-1;39796:58:0;;39640:620;-1:-1:-1;40244:4:0;39471:796;;;;;;:::o;14684:269::-;14886:58;;25116:66:1;14886:58:0;;;25104:79:1;25199:12;;;25192:28;;;14753:7:0;;25236:12:1;;14886:58:0;24874:380:1;10828:231:0;10906:7;10927:17;10946:18;10968:27;10979:4;10985:9;10968:10;:27::i;:::-;10926:69;;;;11006:18;11018:5;11006:11;:18::i;:::-;-1:-1:-1;11042:9:0;10828:231;-1:-1:-1;;;10828:231:0:o;8718:1308::-;8799:7;8808:12;9033:9;:16;9053:2;9033:22;9029:990;;;9329:4;9314:20;;9308:27;9379:4;9364:20;;9358:27;9437:4;9422:20;;9416:27;9072:9;9408:36;9480:25;9491:4;9408:36;9308:27;9358;9480:10;:25::i;:::-;9473:32;;;;;;;;;9029:990;9527:9;:16;9547:2;9527:22;9523:496;;;9802:4;9787:20;;9781:27;9853:4;9838:20;;9832:27;9895:23;9906:4;9781:27;9832;9895:10;:23::i;:::-;9888:30;;;;;;;;9523:496;-1:-1:-1;9967:1:0;;-1:-1:-1;9971:35:0;9523:496;8718:1308;;;;;:::o;6989:643::-;7067:20;7058:5;:29;;;;;;;;:::i;:::-;;7054:571;;;6989:643;:::o;7054:571::-;7165:29;7156:5;:38;;;;;;;;:::i;:::-;;7152:473;;;7211:34;;-1:-1:-1;;;7211:34:0;;25593:2:1;7211:34:0;;;25575:21:1;25632:2;25612:18;;;25605:30;25671:26;25651:18;;;25644:54;25715:18;;7211:34:0;25391:348:1;7152:473:0;7276:35;7267:5;:44;;;;;;;;:::i;:::-;;7263:362;;;7328:41;;-1:-1:-1;;;7328:41:0;;25946:2:1;7328:41:0;;;25928:21:1;25985:2;25965:18;;;25958:30;26024:33;26004:18;;;25997:61;26075:18;;7328:41:0;25744:355:1;7263:362:0;7400:30;7391:5;:39;;;;;;;;:::i;:::-;;7387:238;;;7447:44;;-1:-1:-1;;;7447:44:0;;26306:2:1;7447:44:0;;;26288:21:1;26345:2;26325:18;;;26318:30;26384:34;26364:18;;;26357:62;-1:-1:-1;;;26435:18:1;;;26428:32;26477:19;;7447:44:0;26104:398:1;7387:238:0;7522:30;7513:5;:39;;;;;;;;:::i;:::-;;7509:116;;;7569:44;;-1:-1:-1;;;7569:44:0;;26709:2:1;7569:44:0;;;26691:21:1;26748:2;26728:18;;;26721:30;26787:34;26767:18;;;26760:62;-1:-1:-1;;;26838:18:1;;;26831:32;26880:19;;7569:44:0;26507:398:1;12327:1639:0;12458:7;;13399:66;13386:79;;13382:163;;;-1:-1:-1;13498:1:0;;-1:-1:-1;13502:30:0;13482:51;;13382:163;13559:1;:7;;13564:2;13559:7;;:18;;;;;13570:1;:7;;13575:2;13570:7;;13559:18;13555:102;;;-1:-1:-1;13610:1:0;;-1:-1:-1;13614:30:0;13594:51;;13555:102;13771:24;;;13754:14;13771:24;;;;;;;;;27137:25:1;;;27210:4;27198:17;;27178:18;;;27171:45;;;;27232:18;;;27225:34;;;27275:18;;;27268:34;;;13771:24:0;;27109:19:1;;13771:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;13771:24:0;;-1:-1:-1;;13771:24:0;;;-1:-1:-1;;;;;;;13810:20:0;;13806:103;;13863:1;13867:29;13847:50;;;;;;;13806:103;13929:6;-1:-1:-1;13937:20:0;;-1:-1:-1;12327:1639:0;;;;;;;;:::o;11322:391::-;11436:7;;-1:-1:-1;;;;;11537:75:0;;11639:3;11635:12;;;11649:2;11631:21;11680:25;11691:4;11631:21;11700:1;11537:75;11680:10;:25::i;:::-;11673:32;;;;;;11322:391;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;196:131:1;-1:-1:-1;;;;;;270:32:1;;260:43;;250:71;;317:1;314;307:12;332:245;390:6;443:2;431:9;422:7;418:23;414:32;411:52;;;459:1;456;449:12;411:52;498:9;485:23;517:30;541:5;517:30;:::i;774:258::-;846:1;856:113;870:6;867:1;864:13;856:113;;;946:11;;;940:18;927:11;;;920:39;892:2;885:10;856:113;;;987:6;984:1;981:13;978:48;;;-1:-1:-1;;1022:1:1;1004:16;;997:27;774:258::o;1037:::-;1079:3;1117:5;1111:12;1144:6;1139:3;1132:19;1160:63;1216:6;1209:4;1204:3;1200:14;1193:4;1186:5;1182:16;1160:63;:::i;:::-;1277:2;1256:15;-1:-1:-1;;1252:29:1;1243:39;;;;1284:4;1239:50;;1037:258;-1:-1:-1;;1037:258:1:o;1300:220::-;1449:2;1438:9;1431:21;1412:4;1469:45;1510:2;1499:9;1495:18;1487:6;1469:45;:::i;1525:196::-;1593:20;;-1:-1:-1;;;;;1642:54:1;;1632:65;;1622:93;;1711:1;1708;1701:12;1726:186;1785:6;1838:2;1826:9;1817:7;1813:23;1809:32;1806:52;;;1854:1;1851;1844:12;1806:52;1877:29;1896:9;1877:29;:::i;1917:180::-;1976:6;2029:2;2017:9;2008:7;2004:23;2000:32;1997:52;;;2045:1;2042;2035:12;1997:52;-1:-1:-1;2068:23:1;;1917:180;-1:-1:-1;1917:180:1:o;2333:254::-;2401:6;2409;2462:2;2450:9;2441:7;2437:23;2433:32;2430:52;;;2478:1;2475;2468:12;2430:52;2501:29;2520:9;2501:29;:::i;:::-;2491:39;2577:2;2562:18;;;;2549:32;;-1:-1:-1;;;2333:254:1:o;2592:328::-;2669:6;2677;2685;2738:2;2726:9;2717:7;2713:23;2709:32;2706:52;;;2754:1;2751;2744:12;2706:52;2777:29;2796:9;2777:29;:::i;:::-;2767:39;;2825:38;2859:2;2848:9;2844:18;2825:38;:::i;:::-;2815:48;;2910:2;2899:9;2895:18;2882:32;2872:42;;2592:328;;;;;:::o;2925:347::-;2976:8;2986:6;3040:3;3033:4;3025:6;3021:17;3017:27;3007:55;;3058:1;3055;3048:12;3007:55;-1:-1:-1;3081:20:1;;3124:18;3113:30;;3110:50;;;3156:1;3153;3146:12;3110:50;3193:4;3185:6;3181:17;3169:29;;3245:3;3238:4;3229:6;3221;3217:19;3213:30;3210:39;3207:59;;;3262:1;3259;3252:12;3277:477;3356:6;3364;3372;3425:2;3413:9;3404:7;3400:23;3396:32;3393:52;;;3441:1;3438;3431:12;3393:52;3477:9;3464:23;3454:33;;3538:2;3527:9;3523:18;3510:32;3565:18;3557:6;3554:30;3551:50;;;3597:1;3594;3587:12;3551:50;3636:58;3686:7;3677:6;3666:9;3662:22;3636:58;:::i;:::-;3277:477;;3713:8;;-1:-1:-1;3610:84:1;;-1:-1:-1;;;;3277:477:1:o;3759:632::-;3930:2;3982:21;;;4052:13;;3955:18;;;4074:22;;;3901:4;;3930:2;4153:15;;;;4127:2;4112:18;;;3901:4;4196:169;4210:6;4207:1;4204:13;4196:169;;;4271:13;;4259:26;;4340:15;;;;4305:12;;;;4232:1;4225:9;4196:169;;;-1:-1:-1;4382:3:1;;3759:632;-1:-1:-1;;;;;;3759:632:1:o;4396:160::-;4461:20;;4517:13;;4510:21;4500:32;;4490:60;;4546:1;4543;4536:12;4561:254;4626:6;4634;4687:2;4675:9;4666:7;4662:23;4658:32;4655:52;;;4703:1;4700;4693:12;4655:52;4726:29;4745:9;4726:29;:::i;:::-;4716:39;;4774:35;4805:2;4794:9;4790:18;4774:35;:::i;:::-;4764:45;;4561:254;;;;;:::o;4820:367::-;4883:8;4893:6;4947:3;4940:4;4932:6;4928:17;4924:27;4914:55;;4965:1;4962;4955:12;4914:55;-1:-1:-1;4988:20:1;;5031:18;5020:30;;5017:50;;;5063:1;5060;5053:12;5017:50;5100:4;5092:6;5088:17;5076:29;;5160:3;5153:4;5143:6;5140:1;5136:14;5128:6;5124:27;5120:38;5117:47;5114:67;;;5177:1;5174;5167:12;5192:511;5287:6;5295;5303;5356:2;5344:9;5335:7;5331:23;5327:32;5324:52;;;5372:1;5369;5362:12;5324:52;5395:29;5414:9;5395:29;:::i;:::-;5385:39;;5475:2;5464:9;5460:18;5447:32;5502:18;5494:6;5491:30;5488:50;;;5534:1;5531;5524:12;5488:50;5573:70;5635:7;5626:6;5615:9;5611:22;5573:70;:::i;5708:719::-;5800:6;5808;5816;5824;5877:2;5865:9;5856:7;5852:23;5848:32;5845:52;;;5893:1;5890;5883:12;5845:52;5933:9;5920:23;5962:18;6003:2;5995:6;5992:14;5989:34;;;6019:1;6016;6009:12;5989:34;6058:58;6108:7;6099:6;6088:9;6084:22;6058:58;:::i;:::-;6135:8;;-1:-1:-1;6032:84:1;-1:-1:-1;6223:2:1;6208:18;;6195:32;;-1:-1:-1;6239:16:1;;;6236:36;;;6268:1;6265;6258:12;6236:36;;6307:60;6359:7;6348:8;6337:9;6333:24;6307:60;:::i;:::-;5708:719;;;;-1:-1:-1;6386:8:1;-1:-1:-1;;;;5708:719:1:o;6432:316::-;6509:6;6517;6525;6578:2;6566:9;6557:7;6553:23;6549:32;6546:52;;;6594:1;6591;6584:12;6546:52;-1:-1:-1;;6617:23:1;;;6687:2;6672:18;;6659:32;;-1:-1:-1;6738:2:1;6723:18;;;6710:32;;6432:316;-1:-1:-1;6432:316:1:o;6753:410::-;6824:6;6832;6885:2;6873:9;6864:7;6860:23;6856:32;6853:52;;;6901:1;6898;6891:12;6853:52;6941:9;6928:23;6974:18;6966:6;6963:30;6960:50;;;7006:1;7003;6996:12;6960:50;7045:58;7095:7;7086:6;7075:9;7071:22;7045:58;:::i;:::-;7122:8;;7019:84;;-1:-1:-1;6753:410:1;-1:-1:-1;;;;6753:410:1:o;7168:894::-;7292:6;7300;7308;7316;7324;7332;7385:3;7373:9;7364:7;7360:23;7356:33;7353:53;;;7402:1;7399;7392:12;7353:53;7425:29;7444:9;7425:29;:::i;:::-;7415:39;;7473:38;7507:2;7496:9;7492:18;7473:38;:::i;:::-;7463:48;;7562:2;7551:9;7547:18;7534:32;7585:18;7626:2;7618:6;7615:14;7612:34;;;7642:1;7639;7632:12;7612:34;7681:70;7743:7;7734:6;7723:9;7719:22;7681:70;:::i;:::-;7770:8;;-1:-1:-1;7655:96:1;-1:-1:-1;7858:2:1;7843:18;;7830:32;;-1:-1:-1;7874:16:1;;;7871:36;;;7903:1;7900;7893:12;7871:36;;7942:60;7994:7;7983:8;7972:9;7968:24;7942:60;:::i;:::-;7168:894;;;;-1:-1:-1;7168:894:1;;-1:-1:-1;7168:894:1;;8021:8;;7168:894;-1:-1:-1;;;7168:894:1:o;8067:127::-;8128:10;8123:3;8119:20;8116:1;8109:31;8159:4;8156:1;8149:15;8183:4;8180:1;8173:15;8199:1138;8294:6;8302;8310;8318;8371:3;8359:9;8350:7;8346:23;8342:33;8339:53;;;8388:1;8385;8378:12;8339:53;8411:29;8430:9;8411:29;:::i;:::-;8401:39;;8459:38;8493:2;8482:9;8478:18;8459:38;:::i;:::-;8449:48;;8544:2;8533:9;8529:18;8516:32;8506:42;;8599:2;8588:9;8584:18;8571:32;8622:18;8663:2;8655:6;8652:14;8649:34;;;8679:1;8676;8669:12;8649:34;8717:6;8706:9;8702:22;8692:32;;8762:7;8755:4;8751:2;8747:13;8743:27;8733:55;;8784:1;8781;8774:12;8733:55;8820:2;8807:16;8842:2;8838;8835:10;8832:36;;;8848:18;;:::i;:::-;8923:2;8917:9;8891:2;8977:13;;-1:-1:-1;;8973:22:1;;;8997:2;8969:31;8965:40;8953:53;;;9021:18;;;9041:22;;;9018:46;9015:72;;;9067:18;;:::i;:::-;9107:10;9103:2;9096:22;9142:2;9134:6;9127:18;9182:7;9177:2;9172;9168;9164:11;9160:20;9157:33;9154:53;;;9203:1;9200;9193:12;9154:53;9259:2;9254;9250;9246:11;9241:2;9233:6;9229:15;9216:46;9304:1;9299:2;9294;9286:6;9282:15;9278:24;9271:35;9325:6;9315:16;;;;;;;8199:1138;;;;;;;:::o;9342:773::-;9464:6;9472;9480;9488;9541:2;9529:9;9520:7;9516:23;9512:32;9509:52;;;9557:1;9554;9547:12;9509:52;9597:9;9584:23;9626:18;9667:2;9659:6;9656:14;9653:34;;;9683:1;9680;9673:12;9653:34;9722:70;9784:7;9775:6;9764:9;9760:22;9722:70;:::i;:::-;9811:8;;-1:-1:-1;9696:96:1;-1:-1:-1;9899:2:1;9884:18;;9871:32;;-1:-1:-1;9915:16:1;;;9912:36;;;9944:1;9941;9934:12;9912:36;;9983:72;10047:7;10036:8;10025:9;10021:24;9983:72;:::i;10120:260::-;10188:6;10196;10249:2;10237:9;10228:7;10224:23;10220:32;10217:52;;;10265:1;10262;10255:12;10217:52;10288:29;10307:9;10288:29;:::i;:::-;10278:39;;10336:38;10370:2;10359:9;10355:18;10336:38;:::i;10385:385::-;10459:6;10467;10475;10483;10536:3;10524:9;10515:7;10511:23;10507:33;10504:53;;;10553:1;10550;10543:12;10504:53;10576:26;10592:9;10576:26;:::i;:::-;10566:36;;10621:35;10652:2;10641:9;10637:18;10621:35;:::i;:::-;10611:45;;10675:35;10706:2;10695:9;10691:18;10675:35;:::i;:::-;10665:45;;10729:35;10760:2;10749:9;10745:18;10729:35;:::i;:::-;10719:45;;10385:385;;;;;;;:::o;10775:380::-;10854:1;10850:12;;;;10897;;;10918:61;;10972:4;10964:6;10960:17;10950:27;;10918:61;11025:2;11017:6;11014:14;10994:18;10991:38;10988:161;;;11071:10;11066:3;11062:20;11059:1;11052:31;11106:4;11103:1;11096:15;11134:4;11131:1;11124:15;10988:161;;10775:380;;;:::o;11521:399::-;11723:2;11705:21;;;11762:2;11742:18;;;11735:30;11801:34;11796:2;11781:18;;11774:62;-1:-1:-1;;;11867:2:1;11852:18;;11845:33;11910:3;11895:19;;11521:399::o;13526:127::-;13587:10;13582:3;13578:20;13575:1;13568:31;13618:4;13615:1;13608:15;13642:4;13639:1;13632:15;13658:127;13719:10;13714:3;13710:20;13707:1;13700:31;13750:4;13747:1;13740:15;13774:4;13771:1;13764:15;13790:135;13829:3;-1:-1:-1;;13850:17:1;;13847:43;;;13870:18;;:::i;:::-;-1:-1:-1;13917:1:1;13906:13;;13790:135::o;15038:125::-;15078:4;15106:1;15103;15100:8;15097:34;;;15111:18;;:::i;:::-;-1:-1:-1;15148:9:1;;15038:125::o;15168:128::-;15208:3;15239:1;15235:6;15232:1;15229:13;15226:39;;;15245:18;;:::i;:::-;-1:-1:-1;15281:9:1;;15168:128::o;17722:973::-;17807:12;;17772:3;;17862:1;17882:18;;;;17935;;;;17962:61;;18016:4;18008:6;18004:17;17994:27;;17962:61;18042:2;18090;18082:6;18079:14;18059:18;18056:38;18053:161;;;18136:10;18131:3;18127:20;18124:1;18117:31;18171:4;18168:1;18161:15;18199:4;18196:1;18189:15;18053:161;18230:18;18257:104;;;;18375:1;18370:319;;;;18223:466;;18257:104;-1:-1:-1;;18290:24:1;;18278:37;;18335:16;;;;-1:-1:-1;18257:104:1;;18370:319;17669:1;17662:14;;;17706:4;17693:18;;18464:1;18478:165;18492:6;18489:1;18486:13;18478:165;;;18570:14;;18557:11;;;18550:35;18613:16;;;;18507:10;;18478:165;;;18482:3;;18672:6;18667:3;18663:16;18656:23;;18223:466;;;;;;;17722:973;;;;:::o;18700:456::-;18921:3;18949:38;18983:3;18975:6;18949:38;:::i;:::-;19016:6;19010:13;19032:52;19077:6;19073:2;19066:4;19058:6;19054:17;19032:52;:::i;:::-;19100:50;19142:6;19138:2;19134:15;19126:6;19100:50;:::i;:::-;19093:57;18700:456;-1:-1:-1;;;;;;;18700:456:1:o;19503:168::-;19543:7;19609:1;19605;19601:6;19597:14;19594:1;19591:21;19586:1;19579:9;19572:17;19568:45;19565:71;;;19616:18;;:::i;:::-;-1:-1:-1;19656:9:1;;19503:168::o;21959:127::-;22020:10;22015:3;22011:20;22008:1;22001:31;22051:4;22048:1;22041:15;22075:4;22072:1;22065:15;22091:120;22131:1;22157;22147:35;;22162:18;;:::i;:::-;-1:-1:-1;22196:9:1;;22091:120::o;22216:112::-;22248:1;22274;22264:35;;22279:18;;:::i;:::-;-1:-1:-1;22313:9:1;;22216:112::o;23517:581::-;23749:3;23781:26;23777:31;23850:2;23841:6;23837:2;23833:15;23829:24;23824:3;23817:37;23905:2;23896:6;23892:2;23888:15;23884:24;23879:2;23874:3;23870:12;23863:46;;23938:6;23932:13;23954:62;24009:6;24004:2;23999:3;23995:12;23988:4;23980:6;23976:17;23954:62;:::i;:::-;24032:60;24088:2;24079:6;24074:3;24070:16;24066:25;24058:6;24032:60;:::i;24103:512::-;24297:4;-1:-1:-1;;;;;24407:2:1;24399:6;24395:15;24384:9;24377:34;24459:2;24451:6;24447:15;24442:2;24431:9;24427:18;24420:43;;24499:6;24494:2;24483:9;24479:18;24472:34;24542:3;24537:2;24526:9;24522:18;24515:31;24563:46;24604:3;24593:9;24589:19;24581:6;24563:46;:::i;:::-;24555:54;24103:512;-1:-1:-1;;;;;;24103:512:1:o;24620:249::-;24689:6;24742:2;24730:9;24721:7;24717:23;24713:32;24710:52;;;24758:1;24755;24748:12;24710:52;24790:9;24784:16;24809:30;24833:5;24809:30;:::i;25259:127::-;25320:10;25315:3;25311:20;25308:1;25301:31;25351:4;25348:1;25341:15;25375:4;25372:1;25365:15

Swarm Source

ipfs://b2b51b694e4c38614dd066ccc0a280f42d7c44d3b0ed9d613ba481e38738db55
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.