ETH Price: $2,661.57 (+8.12%)
 

Overview

Max Total Supply

6,250 DB

Holders

1,114

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 DB
0xe258b4e5b6903969beadc935ff2b9ef4619bf73c
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

MINTING NOW!! https://www.dankbotsnft.fun/ DANKBOTS IS AN NFT PROJECT CONSISTING OF 6,250 MINIMALIST BOTS THAT MERGE THE PFP COMMUNITY WITH THE DIGITAL FINE ART COMMUNITY.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
DankBots

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-04-10
*/

// SPDX-License-Identifier: MIT

/**
 ____    _    _   _ _  ______   ___ _____ ____  
|  _ \  / \  | \ | | |/ / __ ) / _ \_   _/ ___| 
| | | |/ _ \ |  \| | ' /|  _ \| | | || | \___ \ 
| |_| / ___ \| |\  | . \| |_) | |_| || |  ___) |
|____/_/   \_\_| \_|_|\_\____/ \___/ |_| |____/ 
                                                                                              
*/

pragma solidity ^0.8.0;
/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` fo
r some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */

library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}


// File: @openzeppelin/contracts/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/IERC721.sol
/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

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

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

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

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

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

    /**
     * @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/IERC721Receiver.sol
/**
 * @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/IERC721Metadata.sol
/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {

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

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

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

// File: @openzeppelin/contracts/utils/Address.sol

/**
 * @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;
        // solhint-disable-next-line no-inline-assembly
        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");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private 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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/utils/Context.sol
/*
 * @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) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

/**
 * @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: @openzeppelin/contracts/utils/Strings.sol
/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant alphabet = "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] = alphabet[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

}

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

// File: contracts/DankBots.sol
// Creator: Chiru Labs

pragma solidity ^0.8.4;

error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

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

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

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

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        _addressData[owner].aux = aux;
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr && curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return _ownershipOf(tokenId).addr;
    }

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

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

        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

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

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (safe && to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex != end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex != end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

    /**
     * @dev This is equivalent to _burn(tokenId, false)
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            AddressData storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

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

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

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}



contract DankBots is ERC721A, Ownable {
	using Strings for uint256;

	address public withdrawal_address = 0x405874F1Ce5778d5FFDf66f7aba14DA446564B6a;
	string baseURI = "";
	string public notRevealedUri = "";
	string public baseExtension = ".json";

	uint256 public cost = 0.08 ether;		// mint cost
	uint256 public maxSupply = 7777;		// max supply
	uint256 public maxMintAmount = 10;		// max amount anyone can mint
	uint256 public maxFreeMintAmount = 1;		// max amount free mint can mint
	bool public paused = true;			// paused at release
	bool public revealed = false;			// reveal images at purchase

	uint256 public whitelistCost = 0.06 ether;	// whitelist mint cost
	bool public whitelistPaused = true;		// paused at release
	bytes32 public whitelistRoot = "";		// merkle root for whitelist
	mapping( address => bool ) public whitelistClaimed;

	bool public freePaused = true;			// paused at release
	bytes32 public freeRoot = "";			// merkle root for free whitelist
	mapping( address => bool ) public freeClaimed;

	string _name = "DANKBOTS";
	string _symbol = "DB";

	constructor() ERC721A(_name, _symbol) {
	}

	// set mint cost
	function setCost(uint256 _newCost ) public onlyOwner {
		cost = _newCost;
	}

	// whitelist functions
	// set whitelist mint cost
	function setWhitelistCost(uint256 _newCost ) public onlyOwner {
		whitelistCost = _newCost;
	}

	// whitelistPaused functions
	function pauseWhitelist(bool _state) public onlyOwner {
		whitelistPaused = _state;
	}

	// set whitelistRoot
	function setWhitelistRoot( bytes32 _newWhitelistRoot ) 
	public 
	onlyOwner {
		whitelistRoot = _newWhitelistRoot;
	}

	// free mint functions
	// freePaused functions
	function pauseFree(bool _state) 
	public 
	onlyOwner {
		freePaused = _state;
	}

	// set freeRoot
	function setFreeRoot( bytes32 _newFreeRoot ) 
	public 
	onlyOwner {
		freeRoot = _newFreeRoot;
	}

	// internal
	function _baseURI() 
	internal 
	view 
	virtual 
	override 
	returns (string memory) {
		return baseURI;
	}

	// public
	// minting functions
	function mint(uint256 _mintAmount) 
	public 
	payable {
		require(!paused, "Cannot mint while paused" );
		require(_mintAmount > 0);
		require(totalSupply() + _mintAmount <= maxSupply);

		if (msg.sender != owner()) {
			require(_mintAmount + _numberMinted( msg.sender ) <= maxMintAmount, "Exceeds max mint amount" );
			require(msg.value >= cost * _mintAmount);
		}

		_safeMint(msg.sender, _mintAmount);
	}

	function isWhitelisted( bytes32[] calldata _merkleProof, bytes32 _address ) 
	public 
	view
	returns ( bool )
	{
		return MerkleProof.verify( _merkleProof, whitelistRoot, _address );
	}

	function mintWhitelist( bytes32[] calldata _merkleProof, uint256 _mintAmount) 
	public 
	payable {
		require(!whitelistPaused, "Cannot mint while whitelist is paused" );
		require(_mintAmount > 0);
		require(totalSupply() + _mintAmount <= maxSupply);
		require( ! whitelistClaimed[ msg.sender ], "Address has already claimed whitelist!" );

		if (msg.sender != owner()) {
			require(_mintAmount + _numberMinted( msg.sender ) <= maxMintAmount, "Exceeds max mint amount" );
			bytes32 leaf = keccak256( abi.encodePacked( msg.sender ) );
			require( MerkleProof.verify( _merkleProof, whitelistRoot, leaf ), "Invalid proof" );
			require(msg.value >= whitelistCost * _mintAmount);
		}

		_safeMint(msg.sender, _mintAmount);
	}

	function isFreelisted( bytes32[] calldata _merkleProof, bytes32 _address ) 
	public 
	view
	returns ( bool )
	{
		return MerkleProof.verify( _merkleProof, freeRoot, _address );
	}

	function mintFree( bytes32[] calldata _merkleProof, uint256 _mintAmount) 
	public 
	payable {
		require(!freePaused, "Cannot mint while free mint list is paused" );
		require(_mintAmount > 0);
		require(totalSupply() + _mintAmount <= maxSupply);
		require( ! freeClaimed[ msg.sender ], "Address has already claimed freelist!" );

		if (msg.sender != owner()) {
			require(_mintAmount + _numberMinted( msg.sender ) <= maxMintAmount, "Exceeds max free mint amount" );
			bytes32 leaf = keccak256( abi.encodePacked( msg.sender ) );
			require( MerkleProof.verify( _merkleProof, freeRoot, leaf ), "Invalid proof" );
			require( msg.value >= whitelistCost * ( _mintAmount - maxFreeMintAmount ) );
		}

		_safeMint(msg.sender, _mintAmount);
	}

	function tokenURI(uint256 tokenId)
	public
	view
	virtual
	override
	returns (string memory)
	{
		require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

		if(revealed == false) {
			return notRevealedUri;
		}

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

	//only owner
	function reveal() 
	public 
	onlyOwner {
		revealed = true;
	}

	function setmaxMintAmount(uint256 _newmaxMintAmount) 
	public 
	onlyOwner {
		maxMintAmount = _newmaxMintAmount;
	}

	function setMaxSupply(uint256 _newmaxSupply) 
	public 
	onlyOwner {
		maxSupply = _newmaxSupply;
	}

	function setNotRevealedURI(string memory _notRevealedURI) 
	public 
	onlyOwner {
		notRevealedUri = _notRevealedURI;
	}

	function setBaseURI(string memory _newBaseURI) 
	public 
	onlyOwner {
		baseURI = _newBaseURI;
	}

	function setBaseExtension(string memory _newBaseExtension) 
	public 
	onlyOwner {
		baseExtension = _newBaseExtension;
	}

	function pause(bool _state) 
	public 
	onlyOwner {
		paused = _state;
	}

	function setWithdrawalAddress( address _newAddress ) 
	public 
	onlyOwner {
		withdrawal_address = _newAddress;
	}

	function withdraw() 
	public 
	payable 
	onlyOwner {
		//(bool os, ) = payable(owner()).call{value: address(this).balance}("");
		(bool os, ) = payable( withdrawal_address ).call{value: address(this).balance}("");
		require(os);
	}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"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":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"freeClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freePaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"bytes32","name":"_address","type":"bytes32"}],"name":"isFreelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"bytes32","name":"_address","type":"bytes32"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxFreeMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mintFree","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mintWhitelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pauseFree","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pauseWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_newFreeRoot","type":"bytes32"}],"name":"setFreeRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newmaxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setWhitelistCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_newWhitelistRoot","type":"bytes32"}],"name":"setWhitelistRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newAddress","type":"address"}],"name":"setWithdrawalAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newmaxMintAmount","type":"uint256"}],"name":"setmaxMintAmount","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":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdrawal_address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

600980546001600160a01b03191673405874f1ce5778d5ffdf66f7aba14da446564b6a17905560a06040819052600060808190526200004191600a9162000314565b506040805160208101918290526000908190526200006291600b9162000314565b5060408051808201909152600580825264173539b7b760d91b60209092019182526200009191600c9162000314565b5067011c37937e080000600d55611e61600e55600a600f55600160108190556011805461ffff19168217905566d529ae9e8600006012556013805460ff199081168317909155600060148190556016805490921690921790556017556040805180820190915260088082526744414e4b424f545360c01b60209092019182526200011e9160199162000314565b5060408051808201909152600280825261222160f11b60209092019182526200014a91601a9162000314565b503480156200015857600080fd5b50601980546200016890620003ba565b80601f01602080910402602001604051908101604052809291908181526020018280546200019690620003ba565b8015620001e75780601f10620001bb57610100808354040283529160200191620001e7565b820191906000526020600020905b815481529060010190602001808311620001c957829003601f168201915b5050505050601a8054620001fb90620003ba565b80601f01602080910402602001604051908101604052809291908181526020018280546200022990620003ba565b80156200027a5780601f106200024e576101008083540402835291602001916200027a565b820191906000526020600020905b8154815290600101906020018083116200025c57829003601f168201915b505084516200029493506002925060208601915062000314565b508051620002aa90600390602084019062000314565b50506000805550620002bc33620002c2565b620003f7565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200032290620003ba565b90600052602060002090601f01602090048101928262000346576000855562000391565b82601f106200036157805160ff191683800117855562000391565b8280016001018555821562000391579182015b828111156200039157825182559160200191906001019062000374565b506200039f929150620003a3565b5090565b5b808211156200039f5760008155600101620003a4565b600181811c90821680620003cf57607f821691505b60208210811415620003f157634e487b7160e01b600052602260045260246000fd5b50919050565b6128db80620004076000396000f3fe60806040526004361061031a5760003560e01c80636f8b44b0116101ab578063c6682862116100f7578063e7b99ec711610095578063f2fde38b1161006f578063f2fde38b146108ef578063f5aa406d1461090f578063f9fa49c41461092f578063fcbf20c11461094f57600080fd5b8063e7b99ec714610870578063e985e9c514610886578063f2c4ce1e146108cf57600080fd5b8063d49479eb116100d1578063d49479eb146107ea578063d5abeb011461080a578063da3ef23f14610820578063db4bec441461084057600080fd5b8063c66828621461079b578063c87b56dd146107b0578063cdc79552146107d057600080fd5b806395d89b4111610164578063a22cb4651161013e578063a22cb46514610733578063a475b5dd14610753578063a6d612f914610768578063b88d4fde1461077b57600080fd5b806395d89b41146106f55780639d3d41de1461070a578063a0712d681461072057600080fd5b80636f8b44b01461064257806370a0823114610662578063715018a6146106825780637397727a146106975780637f00c7a6146106b75780638da5cb5b146106d757600080fd5b80633ccfd60b1161026a57806355f804b31161022357806361e61a25116101fd57806361e61a25146105d55780636352211e146105ef57806366cb24a51461060f5780636f12cdfd1461062f57600080fd5b806355f804b31461056b5780635c975abb1461058b57806361c0b6a0146105a557600080fd5b80633ccfd60b146104ce57806342842e0e146104d657806344a0d68a146104f6578063488caa73146105165780634df34e7814610536578063518302271461054c57600080fd5b806310a44f89116102d757806321b8092e116102b157806321b8092e14610462578063239c70ae1461048257806323b872dd14610498578063386bfc98146104b857600080fd5b806310a44f891461040557806313faede61461042557806318160ddd1461044957600080fd5b806301ffc9a71461031f57806302329a291461035457806306fdde0314610376578063081812fc14610398578063081c8c44146103d0578063095ea7b3146103e5575b600080fd5b34801561032b57600080fd5b5061033f61033a366004612565565b61096f565b60405190151581526020015b60405180910390f35b34801561036057600080fd5b5061037461036f366004612533565b6109c1565b005b34801561038257600080fd5b5061038b610a07565b60405161034b919061270d565b3480156103a457600080fd5b506103b86103b336600461254d565b610a99565b6040516001600160a01b03909116815260200161034b565b3480156103dc57600080fd5b5061038b610add565b3480156103f157600080fd5b506103746104003660046124c1565b610b6b565b34801561041157600080fd5b5061037461042036600461254d565b610bf9565b34801561043157600080fd5b5061043b600d5481565b60405190815260200161034b565b34801561045557600080fd5b506001546000540361043b565b34801561046e57600080fd5b5061037461047d366004612399565b610c28565b34801561048e57600080fd5b5061043b600f5481565b3480156104a457600080fd5b506103746104b33660046123e5565b610c74565b3480156104c457600080fd5b5061043b60145481565b610374610c7f565b3480156104e257600080fd5b506103746104f13660046123e5565b610d0c565b34801561050257600080fd5b5061037461051136600461254d565b610d27565b34801561052257600080fd5b506009546103b8906001600160a01b031681565b34801561054257600080fd5b5061043b60175481565b34801561055857600080fd5b5060115461033f90610100900460ff1681565b34801561057757600080fd5b5061037461058636600461259d565b610d56565b34801561059757600080fd5b5060115461033f9060ff1681565b3480156105b157600080fd5b5061033f6105c0366004612399565b60186020526000908152604090205460ff1681565b3480156105e157600080fd5b5060135461033f9060ff1681565b3480156105fb57600080fd5b506103b861060a36600461254d565b610d97565b34801561061b57600080fd5b5061037461062a366004612533565b610da9565b61037461063d3660046124ea565b610de6565b34801561064e57600080fd5b5061037461065d36600461254d565b61104b565b34801561066e57600080fd5b5061043b61067d366004612399565b61107a565b34801561068e57600080fd5b506103746110c8565b3480156106a357600080fd5b5061033f6106b23660046124ea565b6110fe565b3480156106c357600080fd5b506103746106d236600461254d565b611149565b3480156106e357600080fd5b506008546001600160a01b03166103b8565b34801561070157600080fd5b5061038b611178565b34801561071657600080fd5b5061043b60105481565b61037461072e36600461254d565b611187565b34801561073f57600080fd5b5061037461074e366004612498565b6112a1565b34801561075f57600080fd5b50610374611337565b6103746107763660046124ea565b611372565b34801561078757600080fd5b50610374610796366004612420565b6115a9565b3480156107a757600080fd5b5061038b6115fa565b3480156107bc57600080fd5b5061038b6107cb36600461254d565b611607565b3480156107dc57600080fd5b5060165461033f9060ff1681565b3480156107f657600080fd5b5061037461080536600461254d565b611776565b34801561081657600080fd5b5061043b600e5481565b34801561082c57600080fd5b5061037461083b36600461259d565b6117a5565b34801561084c57600080fd5b5061033f61085b366004612399565b60156020526000908152604090205460ff1681565b34801561087c57600080fd5b5061043b60125481565b34801561089257600080fd5b5061033f6108a13660046123b3565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b3480156108db57600080fd5b506103746108ea36600461259d565b6117e2565b3480156108fb57600080fd5b5061037461090a366004612399565b61181f565b34801561091b57600080fd5b5061037461092a36600461254d565b6118b7565b34801561093b57600080fd5b5061037461094a366004612533565b6118e6565b34801561095b57600080fd5b5061033f61096a3660046124ea565b611923565b60006001600160e01b031982166380ac58cd60e01b14806109a057506001600160e01b03198216635b5e139f60e01b145b806109bb57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6008546001600160a01b031633146109f45760405162461bcd60e51b81526004016109eb90612720565b60405180910390fd5b6011805460ff1916911515919091179055565b606060028054610a16906127e3565b80601f0160208091040260200160405190810160405280929190818152602001828054610a42906127e3565b8015610a8f5780601f10610a6457610100808354040283529160200191610a8f565b820191906000526020600020905b815481529060010190602001808311610a7257829003601f168201915b5050505050905090565b6000610aa482611966565b610ac1576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600b8054610aea906127e3565b80601f0160208091040260200160405190810160405280929190818152602001828054610b16906127e3565b8015610b635780601f10610b3857610100808354040283529160200191610b63565b820191906000526020600020905b815481529060010190602001808311610b4657829003601f168201915b505050505081565b6000610b7682610d97565b9050806001600160a01b0316836001600160a01b03161415610bab5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610bcb5750610bc981336108a1565b155b15610be9576040516367d9dca160e11b815260040160405180910390fd5b610bf4838383611991565b505050565b6008546001600160a01b03163314610c235760405162461bcd60e51b81526004016109eb90612720565b601755565b6008546001600160a01b03163314610c525760405162461bcd60e51b81526004016109eb90612720565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b610bf48383836119ed565b6008546001600160a01b03163314610ca95760405162461bcd60e51b81526004016109eb90612720565b6009546040516000916001600160a01b03169047908381818185875af1925050503d8060008114610cf6576040519150601f19603f3d011682016040523d82523d6000602084013e610cfb565b606091505b5050905080610d0957600080fd5b50565b610bf4838383604051806020016040528060008152506115a9565b6008546001600160a01b03163314610d515760405162461bcd60e51b81526004016109eb90612720565b600d55565b6008546001600160a01b03163314610d805760405162461bcd60e51b81526004016109eb90612720565b8051610d9390600a906020840190612216565b5050565b6000610da282611bdb565b5192915050565b6008546001600160a01b03163314610dd35760405162461bcd60e51b81526004016109eb90612720565b6013805460ff1916911515919091179055565b60165460ff1615610e4c5760405162461bcd60e51b815260206004820152602a60248201527f43616e6e6f74206d696e74207768696c652066726565206d696e74206c697374604482015269081a5cc81c185d5cd95960b21b60648201526084016109eb565b60008111610e5957600080fd5b600e5481610e6a6001546000540390565b610e749190612755565b1115610e7f57600080fd5b3360009081526018602052604090205460ff1615610eed5760405162461bcd60e51b815260206004820152602560248201527f416464726573732068617320616c726561647920636c61696d656420667265656044820152646c6973742160d81b60648201526084016109eb565b6008546001600160a01b0316331461104157600f54610f0b33611cf5565b610f159083612755565b1115610f635760405162461bcd60e51b815260206004820152601c60248201527f45786365656473206d61782066726565206d696e7420616d6f756e740000000060448201526064016109eb565b6040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050610fdd848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506017549150849050611d20565b6110195760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210383937b7b360991b60448201526064016109eb565b60105461102690836127a0565b6012546110339190612781565b34101561103f57600080fd5b505b610bf43382611d36565b6008546001600160a01b031633146110755760405162461bcd60e51b81526004016109eb90612720565b600e55565b60006001600160a01b0382166110a3576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b031633146110f25760405162461bcd60e51b81526004016109eb90612720565b6110fc6000611d50565b565b6000611141848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506014549150859050611d20565b949350505050565b6008546001600160a01b031633146111735760405162461bcd60e51b81526004016109eb90612720565b600f55565b606060038054610a16906127e3565b60115460ff16156111da5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f74206d696e74207768696c6520706175736564000000000000000060448201526064016109eb565b600081116111e757600080fd5b600e54816111f86001546000540390565b6112029190612755565b111561120d57600080fd5b6008546001600160a01b0316331461129757600f5461122b33611cf5565b6112359083612755565b111561127d5760405162461bcd60e51b8152602060048201526017602482015276115e18d959591cc81b585e081b5a5b9d08185b5bdd5b9d604a1b60448201526064016109eb565b80600d5461128b9190612781565b34101561129757600080fd5b610d093382611d36565b6001600160a01b0382163314156112cb5760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6008546001600160a01b031633146113615760405162461bcd60e51b81526004016109eb90612720565b6011805461ff001916610100179055565b60135460ff16156113d35760405162461bcd60e51b815260206004820152602560248201527f43616e6e6f74206d696e74207768696c652077686974656c6973742069732070604482015264185d5cd95960da1b60648201526084016109eb565b600081116113e057600080fd5b600e54816113f16001546000540390565b6113fb9190612755565b111561140657600080fd5b3360009081526015602052604090205460ff16156114755760405162461bcd60e51b815260206004820152602660248201527f416464726573732068617320616c726561647920636c61696d65642077686974604482015265656c6973742160d01b60648201526084016109eb565b6008546001600160a01b0316331461104157600f5461149333611cf5565b61149d9083612755565b11156114e55760405162461bcd60e51b8152602060048201526017602482015276115e18d959591cc81b585e081b5a5b9d08185b5bdd5b9d604a1b60448201526064016109eb565b6040516bffffffffffffffffffffffff193360601b16602082015260009060340160405160208183030381529060405280519060200120905061155f848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506014549150849050611d20565b61159b5760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210383937b7b360991b60448201526064016109eb565b816012546110339190612781565b6115b48484846119ed565b6001600160a01b0383163b151580156115d657506115d484848484611da2565b155b156115f4576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b600c8054610aea906127e3565b606061161282611966565b6116765760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016109eb565b601154610100900460ff1661171757600b8054611692906127e3565b80601f01602080910402602001604051908101604052809291908181526020018280546116be906127e3565b801561170b5780601f106116e05761010080835404028352916020019161170b565b820191906000526020600020905b8154815290600101906020018083116116ee57829003601f168201915b50505050509050919050565b6000611721611e99565b90506000815111611741576040518060200160405280600081525061176f565b8061174b84611ea8565b600c60405160200161175f9392919061260e565b6040516020818303038152906040525b9392505050565b6008546001600160a01b031633146117a05760405162461bcd60e51b81526004016109eb90612720565b601255565b6008546001600160a01b031633146117cf5760405162461bcd60e51b81526004016109eb90612720565b8051610d9390600c906020840190612216565b6008546001600160a01b0316331461180c5760405162461bcd60e51b81526004016109eb90612720565b8051610d9390600b906020840190612216565b6008546001600160a01b031633146118495760405162461bcd60e51b81526004016109eb90612720565b6001600160a01b0381166118ae5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109eb565b610d0981611d50565b6008546001600160a01b031633146118e15760405162461bcd60e51b81526004016109eb90612720565b601455565b6008546001600160a01b031633146119105760405162461bcd60e51b81526004016109eb90612720565b6016805460ff1916911515919091179055565b6000611141848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506017549150859050611d20565b60008054821080156109bb575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006119f882611bdb565b9050836001600160a01b031681600001516001600160a01b031614611a2f5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480611a4d5750611a4d85336108a1565b80611a68575033611a5d84610a99565b6001600160a01b0316145b905080611a8857604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416611aaf57604051633a954ecd60e21b815260040160405180910390fd5b611abb60008487611991565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116611b8f576000548214611b8f57805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b604080516060810182526000808252602082018190529181019190915281600054811015611cdc57600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16151591810182905290611cda5780516001600160a01b031615611c71579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215611cd5579392505050565b611c71565b505b604051636f96cda160e11b815260040160405180910390fd5b6001600160a01b0316600090815260056020526040902054600160401b90046001600160401b031690565b600082611d2d8584611fc1565b14949350505050565b610d93828260405180602001604052806000815250612043565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611dd79033908990889088906004016126d0565b602060405180830381600087803b158015611df157600080fd5b505af1925050508015611e21575060408051601f3d908101601f19168201909252611e1e91810190612581565b60015b611e7c573d808015611e4f576040519150601f19603f3d011682016040523d82523d6000602084013e611e54565b606091505b508051611e74576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6060600a8054610a16906127e3565b606081611ecc5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611ef65780611ee08161281e565b9150611eef9050600a8361276d565b9150611ed0565b6000816001600160401b03811115611f1e57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611f48576020820181803683370190505b5090505b841561114157611f5d6001836127a0565b9150611f6a600a86612839565b611f75906030612755565b60f81b818381518110611f9857634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611fba600a8661276d565b9450611f4c565b600081815b845181101561203b576000858281518110611ff157634e487b7160e01b600052603260045260246000fd5b602002602001015190508083116120175760008381526020829052604090209250612028565b600081815260208490526040902092505b50806120338161281e565b915050611fc6565b509392505050565b610bf483838360016000546001600160a01b03851661207457604051622e076360e81b815260040160405180910390fd5b836120925760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168c018116918217600160401b67ffffffffffffffff1990941690921783900481168c01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b42909216919091021790558080850183801561213e57506001600160a01b0387163b15155b156121c7575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a461218f6000888480600101955088611da2565b6121ac576040516368d2bf6b60e11b815260040160405180910390fd5b808214156121445782600054146121c257600080fd5b61220d565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808214156121c8575b50600055611bd4565b828054612222906127e3565b90600052602060002090601f016020900481019282612244576000855561228a565b82601f1061225d57805160ff191683800117855561228a565b8280016001018555821561228a579182015b8281111561228a57825182559160200191906001019061226f565b5061229692915061229a565b5090565b5b80821115612296576000815560010161229b565b60006001600160401b03808411156122c9576122c9612879565b604051601f8501601f19908116603f011681019082821181831017156122f1576122f1612879565b8160405280935085815286868601111561230a57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461233b57600080fd5b919050565b60008083601f840112612351578081fd5b5081356001600160401b03811115612367578182fd5b6020830191508360208260051b850101111561238257600080fd5b9250929050565b8035801515811461233b57600080fd5b6000602082840312156123aa578081fd5b61176f82612324565b600080604083850312156123c5578081fd5b6123ce83612324565b91506123dc60208401612324565b90509250929050565b6000806000606084860312156123f9578081fd5b61240284612324565b925061241060208501612324565b9150604084013590509250925092565b60008060008060808587031215612435578081fd5b61243e85612324565b935061244c60208601612324565b92506040850135915060608501356001600160401b0381111561246d578182fd5b8501601f8101871361247d578182fd5b61248c878235602084016122af565b91505092959194509250565b600080604083850312156124aa578182fd5b6124b383612324565b91506123dc60208401612389565b600080604083850312156124d3578182fd5b6124dc83612324565b946020939093013593505050565b6000806000604084860312156124fe578283fd5b83356001600160401b03811115612513578384fd5b61251f86828701612340565b909790965060209590950135949350505050565b600060208284031215612544578081fd5b61176f82612389565b60006020828403121561255e578081fd5b5035919050565b600060208284031215612576578081fd5b813561176f8161288f565b600060208284031215612592578081fd5b815161176f8161288f565b6000602082840312156125ae578081fd5b81356001600160401b038111156125c3578182fd5b8201601f810184136125d3578182fd5b611141848235602084016122af565b600081518084526125fa8160208601602086016127b7565b601f01601f19169290920160200192915050565b6000845160206126218285838a016127b7565b8551918401916126348184848a016127b7565b85549201918390600181811c908083168061265057607f831692505b85831081141561266e57634e487b7160e01b88526022600452602488fd5b8080156126825760018114612693576126bf565b60ff198516885283880195506126bf565b60008b815260209020895b858110156126b75781548a82015290840190880161269e565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612703908301846125e2565b9695505050505050565b60208152600061176f60208301846125e2565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600082198211156127685761276861284d565b500190565b60008261277c5761277c612863565b500490565b600081600019048311821515161561279b5761279b61284d565b500290565b6000828210156127b2576127b261284d565b500390565b60005b838110156127d25781810151838201526020016127ba565b838111156115f45750506000910152565b600181811c908216806127f757607f821691505b6020821081141561281857634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156128325761283261284d565b5060010190565b60008261284857612848612863565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610d0957600080fdfea2646970667358221220824076b5decb6da33faa92f36721d6213dbded3155c32b2788221a906ea198b064736f6c63430008040033

Deployed Bytecode

0x60806040526004361061031a5760003560e01c80636f8b44b0116101ab578063c6682862116100f7578063e7b99ec711610095578063f2fde38b1161006f578063f2fde38b146108ef578063f5aa406d1461090f578063f9fa49c41461092f578063fcbf20c11461094f57600080fd5b8063e7b99ec714610870578063e985e9c514610886578063f2c4ce1e146108cf57600080fd5b8063d49479eb116100d1578063d49479eb146107ea578063d5abeb011461080a578063da3ef23f14610820578063db4bec441461084057600080fd5b8063c66828621461079b578063c87b56dd146107b0578063cdc79552146107d057600080fd5b806395d89b4111610164578063a22cb4651161013e578063a22cb46514610733578063a475b5dd14610753578063a6d612f914610768578063b88d4fde1461077b57600080fd5b806395d89b41146106f55780639d3d41de1461070a578063a0712d681461072057600080fd5b80636f8b44b01461064257806370a0823114610662578063715018a6146106825780637397727a146106975780637f00c7a6146106b75780638da5cb5b146106d757600080fd5b80633ccfd60b1161026a57806355f804b31161022357806361e61a25116101fd57806361e61a25146105d55780636352211e146105ef57806366cb24a51461060f5780636f12cdfd1461062f57600080fd5b806355f804b31461056b5780635c975abb1461058b57806361c0b6a0146105a557600080fd5b80633ccfd60b146104ce57806342842e0e146104d657806344a0d68a146104f6578063488caa73146105165780634df34e7814610536578063518302271461054c57600080fd5b806310a44f89116102d757806321b8092e116102b157806321b8092e14610462578063239c70ae1461048257806323b872dd14610498578063386bfc98146104b857600080fd5b806310a44f891461040557806313faede61461042557806318160ddd1461044957600080fd5b806301ffc9a71461031f57806302329a291461035457806306fdde0314610376578063081812fc14610398578063081c8c44146103d0578063095ea7b3146103e5575b600080fd5b34801561032b57600080fd5b5061033f61033a366004612565565b61096f565b60405190151581526020015b60405180910390f35b34801561036057600080fd5b5061037461036f366004612533565b6109c1565b005b34801561038257600080fd5b5061038b610a07565b60405161034b919061270d565b3480156103a457600080fd5b506103b86103b336600461254d565b610a99565b6040516001600160a01b03909116815260200161034b565b3480156103dc57600080fd5b5061038b610add565b3480156103f157600080fd5b506103746104003660046124c1565b610b6b565b34801561041157600080fd5b5061037461042036600461254d565b610bf9565b34801561043157600080fd5b5061043b600d5481565b60405190815260200161034b565b34801561045557600080fd5b506001546000540361043b565b34801561046e57600080fd5b5061037461047d366004612399565b610c28565b34801561048e57600080fd5b5061043b600f5481565b3480156104a457600080fd5b506103746104b33660046123e5565b610c74565b3480156104c457600080fd5b5061043b60145481565b610374610c7f565b3480156104e257600080fd5b506103746104f13660046123e5565b610d0c565b34801561050257600080fd5b5061037461051136600461254d565b610d27565b34801561052257600080fd5b506009546103b8906001600160a01b031681565b34801561054257600080fd5b5061043b60175481565b34801561055857600080fd5b5060115461033f90610100900460ff1681565b34801561057757600080fd5b5061037461058636600461259d565b610d56565b34801561059757600080fd5b5060115461033f9060ff1681565b3480156105b157600080fd5b5061033f6105c0366004612399565b60186020526000908152604090205460ff1681565b3480156105e157600080fd5b5060135461033f9060ff1681565b3480156105fb57600080fd5b506103b861060a36600461254d565b610d97565b34801561061b57600080fd5b5061037461062a366004612533565b610da9565b61037461063d3660046124ea565b610de6565b34801561064e57600080fd5b5061037461065d36600461254d565b61104b565b34801561066e57600080fd5b5061043b61067d366004612399565b61107a565b34801561068e57600080fd5b506103746110c8565b3480156106a357600080fd5b5061033f6106b23660046124ea565b6110fe565b3480156106c357600080fd5b506103746106d236600461254d565b611149565b3480156106e357600080fd5b506008546001600160a01b03166103b8565b34801561070157600080fd5b5061038b611178565b34801561071657600080fd5b5061043b60105481565b61037461072e36600461254d565b611187565b34801561073f57600080fd5b5061037461074e366004612498565b6112a1565b34801561075f57600080fd5b50610374611337565b6103746107763660046124ea565b611372565b34801561078757600080fd5b50610374610796366004612420565b6115a9565b3480156107a757600080fd5b5061038b6115fa565b3480156107bc57600080fd5b5061038b6107cb36600461254d565b611607565b3480156107dc57600080fd5b5060165461033f9060ff1681565b3480156107f657600080fd5b5061037461080536600461254d565b611776565b34801561081657600080fd5b5061043b600e5481565b34801561082c57600080fd5b5061037461083b36600461259d565b6117a5565b34801561084c57600080fd5b5061033f61085b366004612399565b60156020526000908152604090205460ff1681565b34801561087c57600080fd5b5061043b60125481565b34801561089257600080fd5b5061033f6108a13660046123b3565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b3480156108db57600080fd5b506103746108ea36600461259d565b6117e2565b3480156108fb57600080fd5b5061037461090a366004612399565b61181f565b34801561091b57600080fd5b5061037461092a36600461254d565b6118b7565b34801561093b57600080fd5b5061037461094a366004612533565b6118e6565b34801561095b57600080fd5b5061033f61096a3660046124ea565b611923565b60006001600160e01b031982166380ac58cd60e01b14806109a057506001600160e01b03198216635b5e139f60e01b145b806109bb57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6008546001600160a01b031633146109f45760405162461bcd60e51b81526004016109eb90612720565b60405180910390fd5b6011805460ff1916911515919091179055565b606060028054610a16906127e3565b80601f0160208091040260200160405190810160405280929190818152602001828054610a42906127e3565b8015610a8f5780601f10610a6457610100808354040283529160200191610a8f565b820191906000526020600020905b815481529060010190602001808311610a7257829003601f168201915b5050505050905090565b6000610aa482611966565b610ac1576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600b8054610aea906127e3565b80601f0160208091040260200160405190810160405280929190818152602001828054610b16906127e3565b8015610b635780601f10610b3857610100808354040283529160200191610b63565b820191906000526020600020905b815481529060010190602001808311610b4657829003601f168201915b505050505081565b6000610b7682610d97565b9050806001600160a01b0316836001600160a01b03161415610bab5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610bcb5750610bc981336108a1565b155b15610be9576040516367d9dca160e11b815260040160405180910390fd5b610bf4838383611991565b505050565b6008546001600160a01b03163314610c235760405162461bcd60e51b81526004016109eb90612720565b601755565b6008546001600160a01b03163314610c525760405162461bcd60e51b81526004016109eb90612720565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b610bf48383836119ed565b6008546001600160a01b03163314610ca95760405162461bcd60e51b81526004016109eb90612720565b6009546040516000916001600160a01b03169047908381818185875af1925050503d8060008114610cf6576040519150601f19603f3d011682016040523d82523d6000602084013e610cfb565b606091505b5050905080610d0957600080fd5b50565b610bf4838383604051806020016040528060008152506115a9565b6008546001600160a01b03163314610d515760405162461bcd60e51b81526004016109eb90612720565b600d55565b6008546001600160a01b03163314610d805760405162461bcd60e51b81526004016109eb90612720565b8051610d9390600a906020840190612216565b5050565b6000610da282611bdb565b5192915050565b6008546001600160a01b03163314610dd35760405162461bcd60e51b81526004016109eb90612720565b6013805460ff1916911515919091179055565b60165460ff1615610e4c5760405162461bcd60e51b815260206004820152602a60248201527f43616e6e6f74206d696e74207768696c652066726565206d696e74206c697374604482015269081a5cc81c185d5cd95960b21b60648201526084016109eb565b60008111610e5957600080fd5b600e5481610e6a6001546000540390565b610e749190612755565b1115610e7f57600080fd5b3360009081526018602052604090205460ff1615610eed5760405162461bcd60e51b815260206004820152602560248201527f416464726573732068617320616c726561647920636c61696d656420667265656044820152646c6973742160d81b60648201526084016109eb565b6008546001600160a01b0316331461104157600f54610f0b33611cf5565b610f159083612755565b1115610f635760405162461bcd60e51b815260206004820152601c60248201527f45786365656473206d61782066726565206d696e7420616d6f756e740000000060448201526064016109eb565b6040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050610fdd848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506017549150849050611d20565b6110195760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210383937b7b360991b60448201526064016109eb565b60105461102690836127a0565b6012546110339190612781565b34101561103f57600080fd5b505b610bf43382611d36565b6008546001600160a01b031633146110755760405162461bcd60e51b81526004016109eb90612720565b600e55565b60006001600160a01b0382166110a3576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b031633146110f25760405162461bcd60e51b81526004016109eb90612720565b6110fc6000611d50565b565b6000611141848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506014549150859050611d20565b949350505050565b6008546001600160a01b031633146111735760405162461bcd60e51b81526004016109eb90612720565b600f55565b606060038054610a16906127e3565b60115460ff16156111da5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f74206d696e74207768696c6520706175736564000000000000000060448201526064016109eb565b600081116111e757600080fd5b600e54816111f86001546000540390565b6112029190612755565b111561120d57600080fd5b6008546001600160a01b0316331461129757600f5461122b33611cf5565b6112359083612755565b111561127d5760405162461bcd60e51b8152602060048201526017602482015276115e18d959591cc81b585e081b5a5b9d08185b5bdd5b9d604a1b60448201526064016109eb565b80600d5461128b9190612781565b34101561129757600080fd5b610d093382611d36565b6001600160a01b0382163314156112cb5760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6008546001600160a01b031633146113615760405162461bcd60e51b81526004016109eb90612720565b6011805461ff001916610100179055565b60135460ff16156113d35760405162461bcd60e51b815260206004820152602560248201527f43616e6e6f74206d696e74207768696c652077686974656c6973742069732070604482015264185d5cd95960da1b60648201526084016109eb565b600081116113e057600080fd5b600e54816113f16001546000540390565b6113fb9190612755565b111561140657600080fd5b3360009081526015602052604090205460ff16156114755760405162461bcd60e51b815260206004820152602660248201527f416464726573732068617320616c726561647920636c61696d65642077686974604482015265656c6973742160d01b60648201526084016109eb565b6008546001600160a01b0316331461104157600f5461149333611cf5565b61149d9083612755565b11156114e55760405162461bcd60e51b8152602060048201526017602482015276115e18d959591cc81b585e081b5a5b9d08185b5bdd5b9d604a1b60448201526064016109eb565b6040516bffffffffffffffffffffffff193360601b16602082015260009060340160405160208183030381529060405280519060200120905061155f848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506014549150849050611d20565b61159b5760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210383937b7b360991b60448201526064016109eb565b816012546110339190612781565b6115b48484846119ed565b6001600160a01b0383163b151580156115d657506115d484848484611da2565b155b156115f4576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b600c8054610aea906127e3565b606061161282611966565b6116765760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016109eb565b601154610100900460ff1661171757600b8054611692906127e3565b80601f01602080910402602001604051908101604052809291908181526020018280546116be906127e3565b801561170b5780601f106116e05761010080835404028352916020019161170b565b820191906000526020600020905b8154815290600101906020018083116116ee57829003601f168201915b50505050509050919050565b6000611721611e99565b90506000815111611741576040518060200160405280600081525061176f565b8061174b84611ea8565b600c60405160200161175f9392919061260e565b6040516020818303038152906040525b9392505050565b6008546001600160a01b031633146117a05760405162461bcd60e51b81526004016109eb90612720565b601255565b6008546001600160a01b031633146117cf5760405162461bcd60e51b81526004016109eb90612720565b8051610d9390600c906020840190612216565b6008546001600160a01b0316331461180c5760405162461bcd60e51b81526004016109eb90612720565b8051610d9390600b906020840190612216565b6008546001600160a01b031633146118495760405162461bcd60e51b81526004016109eb90612720565b6001600160a01b0381166118ae5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109eb565b610d0981611d50565b6008546001600160a01b031633146118e15760405162461bcd60e51b81526004016109eb90612720565b601455565b6008546001600160a01b031633146119105760405162461bcd60e51b81526004016109eb90612720565b6016805460ff1916911515919091179055565b6000611141848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506017549150859050611d20565b60008054821080156109bb575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006119f882611bdb565b9050836001600160a01b031681600001516001600160a01b031614611a2f5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480611a4d5750611a4d85336108a1565b80611a68575033611a5d84610a99565b6001600160a01b0316145b905080611a8857604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416611aaf57604051633a954ecd60e21b815260040160405180910390fd5b611abb60008487611991565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116611b8f576000548214611b8f57805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b604080516060810182526000808252602082018190529181019190915281600054811015611cdc57600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16151591810182905290611cda5780516001600160a01b031615611c71579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215611cd5579392505050565b611c71565b505b604051636f96cda160e11b815260040160405180910390fd5b6001600160a01b0316600090815260056020526040902054600160401b90046001600160401b031690565b600082611d2d8584611fc1565b14949350505050565b610d93828260405180602001604052806000815250612043565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611dd79033908990889088906004016126d0565b602060405180830381600087803b158015611df157600080fd5b505af1925050508015611e21575060408051601f3d908101601f19168201909252611e1e91810190612581565b60015b611e7c573d808015611e4f576040519150601f19603f3d011682016040523d82523d6000602084013e611e54565b606091505b508051611e74576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6060600a8054610a16906127e3565b606081611ecc5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611ef65780611ee08161281e565b9150611eef9050600a8361276d565b9150611ed0565b6000816001600160401b03811115611f1e57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611f48576020820181803683370190505b5090505b841561114157611f5d6001836127a0565b9150611f6a600a86612839565b611f75906030612755565b60f81b818381518110611f9857634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611fba600a8661276d565b9450611f4c565b600081815b845181101561203b576000858281518110611ff157634e487b7160e01b600052603260045260246000fd5b602002602001015190508083116120175760008381526020829052604090209250612028565b600081815260208490526040902092505b50806120338161281e565b915050611fc6565b509392505050565b610bf483838360016000546001600160a01b03851661207457604051622e076360e81b815260040160405180910390fd5b836120925760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168c018116918217600160401b67ffffffffffffffff1990941690921783900481168c01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b42909216919091021790558080850183801561213e57506001600160a01b0387163b15155b156121c7575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a461218f6000888480600101955088611da2565b6121ac576040516368d2bf6b60e11b815260040160405180910390fd5b808214156121445782600054146121c257600080fd5b61220d565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808214156121c8575b50600055611bd4565b828054612222906127e3565b90600052602060002090601f016020900481019282612244576000855561228a565b82601f1061225d57805160ff191683800117855561228a565b8280016001018555821561228a579182015b8281111561228a57825182559160200191906001019061226f565b5061229692915061229a565b5090565b5b80821115612296576000815560010161229b565b60006001600160401b03808411156122c9576122c9612879565b604051601f8501601f19908116603f011681019082821181831017156122f1576122f1612879565b8160405280935085815286868601111561230a57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461233b57600080fd5b919050565b60008083601f840112612351578081fd5b5081356001600160401b03811115612367578182fd5b6020830191508360208260051b850101111561238257600080fd5b9250929050565b8035801515811461233b57600080fd5b6000602082840312156123aa578081fd5b61176f82612324565b600080604083850312156123c5578081fd5b6123ce83612324565b91506123dc60208401612324565b90509250929050565b6000806000606084860312156123f9578081fd5b61240284612324565b925061241060208501612324565b9150604084013590509250925092565b60008060008060808587031215612435578081fd5b61243e85612324565b935061244c60208601612324565b92506040850135915060608501356001600160401b0381111561246d578182fd5b8501601f8101871361247d578182fd5b61248c878235602084016122af565b91505092959194509250565b600080604083850312156124aa578182fd5b6124b383612324565b91506123dc60208401612389565b600080604083850312156124d3578182fd5b6124dc83612324565b946020939093013593505050565b6000806000604084860312156124fe578283fd5b83356001600160401b03811115612513578384fd5b61251f86828701612340565b909790965060209590950135949350505050565b600060208284031215612544578081fd5b61176f82612389565b60006020828403121561255e578081fd5b5035919050565b600060208284031215612576578081fd5b813561176f8161288f565b600060208284031215612592578081fd5b815161176f8161288f565b6000602082840312156125ae578081fd5b81356001600160401b038111156125c3578182fd5b8201601f810184136125d3578182fd5b611141848235602084016122af565b600081518084526125fa8160208601602086016127b7565b601f01601f19169290920160200192915050565b6000845160206126218285838a016127b7565b8551918401916126348184848a016127b7565b85549201918390600181811c908083168061265057607f831692505b85831081141561266e57634e487b7160e01b88526022600452602488fd5b8080156126825760018114612693576126bf565b60ff198516885283880195506126bf565b60008b815260209020895b858110156126b75781548a82015290840190880161269e565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612703908301846125e2565b9695505050505050565b60208152600061176f60208301846125e2565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600082198211156127685761276861284d565b500190565b60008261277c5761277c612863565b500490565b600081600019048311821515161561279b5761279b61284d565b500290565b6000828210156127b2576127b261284d565b500390565b60005b838110156127d25781810151838201526020016127ba565b838111156115f45750506000910152565b600181811c908216806127f757607f821691505b6020821081141561281857634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156128325761283261284d565b5060010190565b60008261284857612848612863565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610d0957600080fdfea2646970667358221220824076b5decb6da33faa92f36721d6213dbded3155c32b2788221a906ea198b064736f6c63430008040033

Deployed Bytecode Sourcemap

46301:5985:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28539:305;;;;;;;;;;-1:-1:-1;28539:305:0;;;;;:::i;:::-;;:::i;:::-;;;9209:14:1;;9202:22;9184:41;;9172:2;9157:18;28539:305:0;;;;;;;;51841:76;;;;;;;;;;-1:-1:-1;51841:76:0;;;;;:::i;:::-;;:::i;:::-;;31652:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;33155:204::-;;;;;;;;;;-1:-1:-1;33155:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;8507:32:1;;;8489:51;;8477:2;8462:18;33155:204:0;8444:102:1;46479:33:0;;;;;;;;;;;;;:::i;32718:371::-;;;;;;;;;;-1:-1:-1;32718:371:0;;;;;:::i;:::-;;:::i;48136:101::-;;;;;;;;;;-1:-1:-1;48136:101:0;;;;;:::i;:::-;;:::i;46559:32::-;;;;;;;;;;;;;;;;;;;9382:25:1;;;9370:2;9355:18;46559:32:0;9337:76:1;27788:303:0;;;;;;;;;;-1:-1:-1;28042:12:0;;27832:7;28026:13;:28;27788:303;;51922:118;;;;;;;;;;-1:-1:-1;51922:118:0;;;;;:::i;:::-;;:::i;46659:33::-;;;;;;;;;;;;;;;;34020:170;;;;;;;;;;-1:-1:-1;34020:170:0;;;;;:::i;:::-;;:::i;47046:33::-;;;;;;;;;;;;;;;;52045:238;;;:::i;34261:185::-;;;;;;;;;;-1:-1:-1;34261:185:0;;;;;:::i;:::-;;:::i;47467:78::-;;;;;;;;;;-1:-1:-1;47467:78:0;;;;;:::i;:::-;;:::i;46374:::-;;;;;;;;;;-1:-1:-1;46374:78:0;;;;-1:-1:-1;;;;;46374:78:0;;;47225:28;;;;;;;;;;;;;;;;46853;;;;;;;;;;-1:-1:-1;46853:28:0;;;;;;;;;;;51605:101;;;;;;;;;;-1:-1:-1;51605:101:0;;;;;:::i;:::-;;:::i;46801:25::-;;;;;;;;;;-1:-1:-1;46801:25:0;;;;;;;;47293:45;;;;;;;;;;-1:-1:-1;47293:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;46986:34;;;;;;;;;;-1:-1:-1;46986:34:0;;;;;;;;31460:125;;;;;;;;;;-1:-1:-1;31460:125:0;;;;;:::i;:::-;;:::i;47736:88::-;;;;;;;;;;-1:-1:-1;47736:88:0;;;;;:::i;:::-;;:::i;49965:753::-;;;;;;:::i;:::-;;:::i;51369:103::-;;;;;;;;;;-1:-1:-1;51369:103:0;;;;;:::i;:::-;;:::i;28908:206::-;;;;;;;;;;-1:-1:-1;28908:206:0;;;;;:::i;:::-;;:::i;20519:103::-;;;;;;;;;;;;;:::i;48836:191::-;;;;;;;;;;-1:-1:-1;48836:191:0;;;;;:::i;:::-;;:::i;51245:119::-;;;;;;;;;;-1:-1:-1;51245:119:0;;;;;:::i;:::-;;:::i;19868:87::-;;;;;;;;;;-1:-1:-1;19941:6:0;;-1:-1:-1;;;;;19941:6:0;19868:87;;31821:104;;;;;;;;;;;;;:::i;46727:36::-;;;;;;;;;;;;;;;;48410:421;;;;;;:::i;:::-;;:::i;33431:287::-;;;;;;;;;;-1:-1:-1;33431:287:0;;;;;:::i;:::-;;:::i;51174:66::-;;;;;;;;;;;;;:::i;49032:738::-;;;;;;:::i;:::-;;:::i;34517:369::-;;;;;;;;;;-1:-1:-1;34517:369:0;;;;;:::i;:::-;;:::i;46516:37::-;;;;;;;;;;;;;:::i;50723:431::-;;;;;;;;;;-1:-1:-1;50723:431:0;;;;;:::i;:::-;;:::i;47169:29::-;;;;;;;;;;-1:-1:-1;47169:29:0;;;;;;;;47604:96;;;;;;;;;;-1:-1:-1;47604:96:0;;;;;:::i;:::-;;:::i;46609:31::-;;;;;;;;;;;;;;;;51711:125;;;;;;;;;;-1:-1:-1;51711:125:0;;;;;:::i;:::-;;:::i;47113:50::-;;;;;;;;;;-1:-1:-1;47113:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;46918:41;;;;;;;;;;;;;;;;33789:164;;;;;;;;;;-1:-1:-1;33789:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;33910:25:0;;;33886:4;33910:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;33789:164;51477:123;;;;;;;;;;-1:-1:-1;51477:123:0;;;;;:::i;:::-;;:::i;20777:201::-;;;;;;;;;;-1:-1:-1;20777:201:0;;;;;:::i;:::-;;:::i;47852:121::-;;;;;;;;;;-1:-1:-1;47852:121:0;;;;;:::i;:::-;;:::i;48029:84::-;;;;;;;;;;-1:-1:-1;48029:84:0;;;;;:::i;:::-;;:::i;49775:185::-;;;;;;;;;;-1:-1:-1;49775:185:0;;;;;:::i;:::-;;:::i;28539:305::-;28641:4;-1:-1:-1;;;;;;28678:40:0;;-1:-1:-1;;;28678:40:0;;:105;;-1:-1:-1;;;;;;;28735:48:0;;-1:-1:-1;;;28735:48:0;28678:105;:158;;;-1:-1:-1;;;;;;;;;;24239:40:0;;;28800:36;28658:178;28539:305;-1:-1:-1;;28539:305:0:o;51841:76::-;19941:6;;-1:-1:-1;;;;;19941:6:0;18681:10;20088:23;20080:68;;;;-1:-1:-1;;;20080:68:0;;;;;;;:::i;:::-;;;;;;;;;51897:6:::1;:15:::0;;-1:-1:-1;;51897:15:0::1;::::0;::::1;;::::0;;;::::1;::::0;;51841:76::o;31652:100::-;31706:13;31739:5;31732:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31652:100;:::o;33155:204::-;33223:7;33248:16;33256:7;33248;:16::i;:::-;33243:64;;33273:34;;-1:-1:-1;;;33273:34:0;;;;;;;;;;;33243:64;-1:-1:-1;33327:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;33327:24:0;;33155:204::o;46479:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32718:371::-;32791:13;32807:24;32823:7;32807:15;:24::i;:::-;32791:40;;32852:5;-1:-1:-1;;;;;32846:11:0;:2;-1:-1:-1;;;;;32846:11:0;;32842:48;;;32866:24;;-1:-1:-1;;;32866:24:0;;;;;;;;;;;32842:48;18681:10;-1:-1:-1;;;;;32907:21:0;;;;;;:63;;-1:-1:-1;32933:37:0;32950:5;18681:10;33789:164;:::i;32933:37::-;32932:38;32907:63;32903:138;;;32994:35;;-1:-1:-1;;;32994:35:0;;;;;;;;;;;32903:138;33053:28;33062:2;33066:7;33075:5;33053:8;:28::i;:::-;32718:371;;;:::o;48136:101::-;19941:6;;-1:-1:-1;;;;;19941:6:0;18681:10;20088:23;20080:68;;;;-1:-1:-1;;;20080:68:0;;;;;;;:::i;:::-;48209:8:::1;:23:::0;48136:101::o;51922:118::-;19941:6;;-1:-1:-1;;;;;19941:6:0;18681:10;20088:23;20080:68;;;;-1:-1:-1;;;20080:68:0;;;;;;;:::i;:::-;52003:18:::1;:32:::0;;-1:-1:-1;;;;;;52003:32:0::1;-1:-1:-1::0;;;;;52003:32:0;;;::::1;::::0;;;::::1;::::0;;51922:118::o;34020:170::-;34154:28;34164:4;34170:2;34174:7;34154:9;:28::i;52045:238::-;19941:6;;-1:-1:-1;;;;;19941:6:0;18681:10;20088:23;20080:68;;;;-1:-1:-1;;;20080:68:0;;;;;;;:::i;:::-;52203:18:::1;::::0;52194:68:::1;::::0;52181:7:::1;::::0;-1:-1:-1;;;;;52203:18:0::1;::::0;52236:21:::1;::::0;52181:7;52194:68;52181:7;52194:68;52236:21;52203:18;52194:68:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52180:82;;;52275:2;52267:11;;;::::0;::::1;;20159:1;52045:238::o:0;34261:185::-;34399:39;34416:4;34422:2;34426:7;34399:39;;;;;;;;;;;;:16;:39::i;47467:78::-;19941:6;;-1:-1:-1;;;;;19941:6:0;18681:10;20088:23;20080:68;;;;-1:-1:-1;;;20080:68:0;;;;;;;:::i;:::-;47525:4:::1;:15:::0;47467:78::o;51605:101::-;19941:6;;-1:-1:-1;;;;;19941:6:0;18681:10;20088:23;20080:68;;;;-1:-1:-1;;;20080:68:0;;;;;;;:::i;:::-;51680:21;;::::1;::::0;:7:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;:::-;;51605:101:::0;:::o;31460:125::-;31524:7;31551:21;31564:7;31551:12;:21::i;:::-;:26;;31460:125;-1:-1:-1;;31460:125:0:o;47736:88::-;19941:6;;-1:-1:-1;;;;;19941:6:0;18681:10;20088:23;20080:68;;;;-1:-1:-1;;;20080:68:0;;;;;;;:::i;:::-;47795:15:::1;:24:::0;;-1:-1:-1;;47795:24:0::1;::::0;::::1;;::::0;;;::::1;::::0;;47736:88::o;49965:753::-;50073:10;;;;50072:11;50064:67;;;;-1:-1:-1;;;50064:67:0;;9844:2:1;50064:67:0;;;9826:21:1;9883:2;9863:18;;;9856:30;9922:34;9902:18;;;9895:62;-1:-1:-1;;;9973:18:1;;;9966:40;10023:19;;50064:67:0;9816:232:1;50064:67:0;50158:1;50144:11;:15;50136:24;;;;;;50204:9;;50189:11;50173:13;28042:12;;27832:7;28026:13;:28;;27788:303;50173:13;:27;;;;:::i;:::-;:40;;50165:49;;;;;;50243:10;50230:25;;;;:11;:25;;;;;;;;50228:27;50219:79;;;;-1:-1:-1;;;50219:79:0;;13656:2:1;50219:79:0;;;13638:21:1;13695:2;13675:18;;;13668:30;13734:34;13714:18;;;13707:62;-1:-1:-1;;;13785:18:1;;;13778:35;13830:19;;50219:79:0;13628:227:1;50219:79:0;19941:6;;-1:-1:-1;;;;;19941:6:0;50309:10;:21;50305:368;;50391:13;;50360:27;50375:10;50360:13;:27::i;:::-;50346:41;;:11;:41;:::i;:::-;:58;;50338:100;;;;-1:-1:-1;;;50338:100:0;;11015:2:1;50338:100:0;;;10997:21:1;11054:2;11034:18;;;11027:30;11093;11073:18;;;11066:58;11141:18;;50338:100:0;10987:178:1;50338:100:0;50470:30;;-1:-1:-1;;50488:10:0;6512:2:1;6508:15;6504:53;50470:30:0;;;6492:66:1;50444:12:0;;6574::1;;50470:30:0;;;;;;;;;;;;50459:43;;;;;;50444:58;;50517:50;50537:12;;50517:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;50551:8:0;;;-1:-1:-1;50561:4:0;;-1:-1:-1;50517:18:0;:50::i;:::-;50508:78;;;;-1:-1:-1;;;50508:78:0;;12149:2:1;50508:78:0;;;12131:21:1;12188:2;12168:18;;;12161:30;-1:-1:-1;;;12207:18:1;;;12200:43;12260:18;;50508:78:0;12121:163:1;50508:78:0;50646:17;;50632:31;;:11;:31;:::i;:::-;50614:13;;:51;;;;:::i;:::-;50601:9;:64;;50592:75;;;;;;50305:368;;50679:34;50689:10;50701:11;50679:9;:34::i;51369:103::-;19941:6;;-1:-1:-1;;;;;19941:6:0;18681:10;20088:23;20080:68;;;;-1:-1:-1;;;20080:68:0;;;;;;;:::i;:::-;51442:9:::1;:25:::0;51369:103::o;28908:206::-;28972:7;-1:-1:-1;;;;;28996:19:0;;28992:60;;29024:28;;-1:-1:-1;;;29024:28:0;;;;;;;;;;;28992:60;-1:-1:-1;;;;;;29078:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;29078:27:0;;28908:206::o;20519:103::-;19941:6;;-1:-1:-1;;;;;19941:6:0;18681:10;20088:23;20080:68;;;;-1:-1:-1;;;20080:68:0;;;;;;;:::i;:::-;20584:30:::1;20611:1;20584:18;:30::i;:::-;20519:103::o:0;48836:191::-;48942:4;48963:59;48983:12;;48963:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;48997:13:0;;;-1:-1:-1;49012:8:0;;-1:-1:-1;48963:18:0;:59::i;:::-;48956:66;48836:191;-1:-1:-1;;;;48836:191:0:o;51245:119::-;19941:6;;-1:-1:-1;;;;;19941:6:0;18681:10;20088:23;20080:68;;;;-1:-1:-1;;;20080:68:0;;;;;;;:::i;:::-;51326:13:::1;:33:::0;51245:119::o;31821:104::-;31877:13;31910:7;31903:14;;;;;:::i;48410:421::-;48480:6;;;;48479:7;48471:45;;;;-1:-1:-1;;;48471:45:0;;10662:2:1;48471:45:0;;;10644:21:1;10701:2;10681:18;;;10674:30;10740:26;10720:18;;;10713:54;10784:18;;48471:45:0;10634:174:1;48471:45:0;48543:1;48529:11;:15;48521:24;;;;;;48589:9;;48574:11;48558:13;28042:12;;27832:7;28026:13;:28;;27788:303;48558:13;:27;;;;:::i;:::-;:40;;48550:49;;;;;;19941:6;;-1:-1:-1;;;;;19941:6:0;48610:10;:21;48606:180;;48692:13;;48661:27;48676:10;48661:13;:27::i;:::-;48647:41;;:11;:41;:::i;:::-;:58;;48639:95;;;;-1:-1:-1;;;48639:95:0;;12897:2:1;48639:95:0;;;12879:21:1;12936:2;12916:18;;;12909:30;-1:-1:-1;;;12955:18:1;;;12948:53;13018:18;;48639:95:0;12869:173:1;48639:95:0;48768:11;48761:4;;:18;;;;:::i;:::-;48748:9;:31;;48740:40;;;;;;48792:34;48802:10;48814:11;48792:9;:34::i;33431:287::-;-1:-1:-1;;;;;33530:24:0;;18681:10;33530:24;33526:54;;;33563:17;;-1:-1:-1;;;33563:17:0;;;;;;;;;;;33526:54;18681:10;33593:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;33593:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;33593:53:0;;;;;;;;;;33662:48;;9184:41:1;;;33593:42:0;;18681:10;33662:48;;9157:18:1;33662:48:0;;;;;;;33431:287;;:::o;51174:66::-;19941:6;;-1:-1:-1;;;;;19941:6:0;18681:10;20088:23;20080:68;;;;-1:-1:-1;;;20080:68:0;;;;;;;:::i;:::-;51220:8:::1;:15:::0;;-1:-1:-1;;51220:15:0::1;;;::::0;;51174:66::o;49032:738::-;49145:15;;;;49144:16;49136:67;;;;-1:-1:-1;;;49136:67:0;;12491:2:1;49136:67:0;;;12473:21:1;12530:2;12510:18;;;12503:30;12569:34;12549:18;;;12542:62;-1:-1:-1;;;12620:18:1;;;12613:35;12665:19;;49136:67:0;12463:227:1;49136:67:0;49230:1;49216:11;:15;49208:24;;;;;;49276:9;;49261:11;49245:13;28042:12;;27832:7;28026:13;:28;;27788:303;49245:13;:27;;;;:::i;:::-;:40;;49237:49;;;;;;49320:10;49302:30;;;;:16;:30;;;;;;;;49300:32;49291:85;;;;-1:-1:-1;;;49291:85:0;;13249:2:1;49291:85:0;;;13231:21:1;13288:2;13268:18;;;13261:30;13327:34;13307:18;;;13300:62;-1:-1:-1;;;13378:18:1;;;13371:36;13424:19;;49291:85:0;13221:228:1;49291:85:0;19941:6;;-1:-1:-1;;;;;19941:6:0;49387:10;:21;49383:342;;49469:13;;49438:27;49453:10;49438:13;:27::i;:::-;49424:41;;:11;:41;:::i;:::-;:58;;49416:95;;;;-1:-1:-1;;;49416:95:0;;12897:2:1;49416:95:0;;;12879:21:1;12936:2;12916:18;;;12909:30;-1:-1:-1;;;12955:18:1;;;12948:53;13018:18;;49416:95:0;12869:173:1;49416:95:0;49543:30;;-1:-1:-1;;49561:10:0;6512:2:1;6508:15;6504:53;49543:30:0;;;6492:66:1;49517:12:0;;6574::1;;49543:30:0;;;;;;;;;;;;49532:43;;;;;;49517:58;;49590:55;49610:12;;49590:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;49624:13:0;;;-1:-1:-1;49639:4:0;;-1:-1:-1;49590:18:0;:55::i;:::-;49581:83;;;;-1:-1:-1;;;49581:83:0;;12149:2:1;49581:83:0;;;12131:21:1;12188:2;12168:18;;;12161:30;-1:-1:-1;;;12207:18:1;;;12200:43;12260:18;;49581:83:0;12121:163:1;49581:83:0;49707:11;49691:13;;:27;;;;:::i;34517:369::-;34684:28;34694:4;34700:2;34704:7;34684:9;:28::i;:::-;-1:-1:-1;;;;;34727:13:0;;11118:20;11157:8;;34727:76;;;;;34747:56;34778:4;34784:2;34788:7;34797:5;34747:30;:56::i;:::-;34746:57;34727:76;34723:156;;;34827:40;;-1:-1:-1;;;34827:40:0;;;;;;;;;;;34723:156;34517:369;;;;:::o;46516:37::-;;;;;;;:::i;50723:431::-;50806:13;50837:16;50845:7;50837;:16::i;:::-;50828:77;;;;-1:-1:-1;;;50828:77:0;;11733:2:1;50828:77:0;;;11715:21:1;11772:2;11752:18;;;11745:30;11811:34;11791:18;;;11784:62;-1:-1:-1;;;11862:18:1;;;11855:45;11917:19;;50828:77:0;11705:237:1;50828:77:0;50915:8;;;;;;;50912:55;;50947:14;50940:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50723:431;;;:::o;50912:55::-;50973:28;51004:10;:8;:10::i;:::-;50973:41;;51057:1;51032:14;51026:28;:32;:123;;;;;;;;;;;;;;;;;51089:14;51105:18;:7;:16;:18::i;:::-;51125:13;51072:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51026:123;51019:130;50723:431;-1:-1:-1;;;50723:431:0:o;47604:96::-;19941:6;;-1:-1:-1;;;;;19941:6:0;18681:10;20088:23;20080:68;;;;-1:-1:-1;;;20080:68:0;;;;;;;:::i;:::-;47671:13:::1;:24:::0;47604:96::o;51711:125::-;19941:6;;-1:-1:-1;;;;;19941:6:0;18681:10;20088:23;20080:68;;;;-1:-1:-1;;;20080:68:0;;;;;;;:::i;:::-;51798:33;;::::1;::::0;:13:::1;::::0;:33:::1;::::0;::::1;::::0;::::1;:::i;51477:123::-:0;19941:6;;-1:-1:-1;;;;;19941:6:0;18681:10;20088:23;20080:68;;;;-1:-1:-1;;;20080:68:0;;;;;;;:::i;:::-;51563:32;;::::1;::::0;:14:::1;::::0;:32:::1;::::0;::::1;::::0;::::1;:::i;20777:201::-:0;19941:6;;-1:-1:-1;;;;;19941:6:0;18681:10;20088:23;20080:68;;;;-1:-1:-1;;;20080:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;20866:22:0;::::1;20858:73;;;::::0;-1:-1:-1;;;20858:73:0;;10255:2:1;20858:73:0::1;::::0;::::1;10237:21:1::0;10294:2;10274:18;;;10267:30;10333:34;10313:18;;;10306:62;-1:-1:-1;;;10384:18:1;;;10377:36;10430:19;;20858:73:0::1;10227:228:1::0;20858:73:0::1;20942:28;20961:8;20942:18;:28::i;47852:121::-:0;19941:6;;-1:-1:-1;;;;;19941:6:0;18681:10;20088:23;20080:68;;;;-1:-1:-1;;;20080:68:0;;;;;;;:::i;:::-;47935:13:::1;:33:::0;47852:121::o;48029:84::-;19941:6;;-1:-1:-1;;;;;19941:6:0;18681:10;20088:23;20080:68;;;;-1:-1:-1;;;20080:68:0;;;;;;;:::i;:::-;48089:10:::1;:19:::0;;-1:-1:-1;;48089:19:0::1;::::0;::::1;;::::0;;;::::1;::::0;;48029:84::o;49775:185::-;49880:4;49901:54;49921:12;;49901:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;49935:8:0;;;-1:-1:-1;49945:8:0;;-1:-1:-1;49901:18:0;:54::i;35141:187::-;35198:4;35262:13;;35252:7;:23;35222:98;;;;-1:-1:-1;;35293:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;35293:27:0;;;;35292:28;;35141:187::o;43311:196::-;43426:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;43426:29:0;-1:-1:-1;;;;;43426:29:0;;;;;;;;;43471:28;;43426:24;;43471:28;;;;;;;43311:196;;;:::o;38254:2130::-;38369:35;38407:21;38420:7;38407:12;:21::i;:::-;38369:59;;38467:4;-1:-1:-1;;;;;38445:26:0;:13;:18;;;-1:-1:-1;;;;;38445:26:0;;38441:67;;38480:28;;-1:-1:-1;;;38480:28:0;;;;;;;;;;;38441:67;38521:22;18681:10;-1:-1:-1;;;;;38547:20:0;;;;:73;;-1:-1:-1;38584:36:0;38601:4;18681:10;33789:164;:::i;38584:36::-;38547:126;;;-1:-1:-1;18681:10:0;38637:20;38649:7;38637:11;:20::i;:::-;-1:-1:-1;;;;;38637:36:0;;38547:126;38521:153;;38692:17;38687:66;;38718:35;;-1:-1:-1;;;38718:35:0;;;;;;;;;;;38687:66;-1:-1:-1;;;;;38768:16:0;;38764:52;;38793:23;;-1:-1:-1;;;38793:23:0;;;;;;;;;;;38764:52;38937:35;38954:1;38958:7;38967:4;38937:8;:35::i;:::-;-1:-1:-1;;;;;39268:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;39268:31:0;;;-1:-1:-1;;;;;39268:31:0;;;-1:-1:-1;;39268:31:0;;;;;;;39314:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;39314:29:0;;;;;;;;;;;39394:20;;;:11;:20;;;;;;39429:18;;-1:-1:-1;;;;;;39462:49:0;;;;-1:-1:-1;;;39495:15:0;39462:49;;;;;;;;;;39785:11;;39845:24;;;;;39888:13;;39394:20;;39845:24;;39888:13;39884:384;;40098:13;;40083:11;:28;40079:174;;40136:20;;40205:28;;;;-1:-1:-1;;;;;40179:54:0;-1:-1:-1;;;40179:54:0;-1:-1:-1;;;;;;40179:54:0;;;-1:-1:-1;;;;;40136:20:0;;40179:54;;;;40079:174;38254:2130;;;40315:7;40311:2;-1:-1:-1;;;;;40296:27:0;40305:4;-1:-1:-1;;;;;40296:27:0;;;;;;;;;;;40334:42;38254:2130;;;;;:::o;30289:1109::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;30400:7:0;30483:13;;30476:4;:20;30445:886;;;30517:31;30551:17;;;:11;:17;;;;;;;;;30517:51;;;;;;;;;-1:-1:-1;;;;;30517:51:0;;;;-1:-1:-1;;;30517:51:0;;-1:-1:-1;;;;;30517:51:0;;;;;;;;-1:-1:-1;;;30517:51:0;;;;;;;;;;;;;;30587:729;;30637:14;;-1:-1:-1;;;;;30637:28:0;;30633:101;;30701:9;30289:1109;-1:-1:-1;;;30289:1109:0:o;30633:101::-;-1:-1:-1;;;31076:6:0;31121:17;;;;:11;:17;;;;;;;;;31109:29;;;;;;;;;-1:-1:-1;;;;;31109:29:0;;;;;-1:-1:-1;;;31109:29:0;;-1:-1:-1;;;;;31109:29:0;;;;;;;;-1:-1:-1;;;31109:29:0;;;;;;;;;;;;;31169:28;31165:109;;31237:9;30289:1109;-1:-1:-1;;;30289:1109:0:o;31165:109::-;31036:261;;;30445:886;;31359:31;;-1:-1:-1;;;31359:31:0;;;;;;;;;;;29196:137;-1:-1:-1;;;;;29292:19:0;29257:7;29292:19;;;:12;:19;;;;;:32;-1:-1:-1;;;29292:32:0;;-1:-1:-1;;;;;29292:32:0;;29196:137::o;1453:190::-;1578:4;1631;1602:25;1615:5;1622:4;1602:12;:25::i;:::-;:33;;1453:190;-1:-1:-1;;;;1453:190:0:o;35336:104::-;35405:27;35415:2;35419:8;35405:27;;;;;;;;;;;;:9;:27::i;21138:191::-;21231:6;;;-1:-1:-1;;;;;21248:17:0;;;-1:-1:-1;;;;;;21248:17:0;;;;;;;21281:40;;21231:6;;;21248:17;21231:6;;21281:40;;21212:16;;21281:40;21138:191;;:::o;43999:667::-;44183:72;;-1:-1:-1;;;44183:72:0;;44162:4;;-1:-1:-1;;;;;44183:36:0;;;;;:72;;18681:10;;44234:4;;44240:7;;44249:5;;44183:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44183:72:0;;;;;;;;-1:-1:-1;;44183:72:0;;;;;;;;;;;;:::i;:::-;;;44179:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44417:13:0;;44413:235;;44463:40;;-1:-1:-1;;;44463:40:0;;;;;;;;;;;44413:235;44606:6;44600:13;44591:6;44587:2;44583:15;44576:38;44179:480;-1:-1:-1;;;;;;44302:55:0;-1:-1:-1;;;44302:55:0;;-1:-1:-1;43999:667:0;;;;;;:::o;48256:114::-;48331:13;48358:7;48351:14;;;;;:::i;21610:723::-;21666:13;21887:10;21883:53;;-1:-1:-1;;21914:10:0;;;;;;;;;;;;-1:-1:-1;;;21914:10:0;;;;;21610:723::o;21883:53::-;21961:5;21946:12;22002:78;22009:9;;22002:78;;22035:8;;;;:::i;:::-;;-1:-1:-1;22058:10:0;;-1:-1:-1;22066:2:0;22058:10;;:::i;:::-;;;22002:78;;;22090:19;22122:6;-1:-1:-1;;;;;22112:17:0;;;;;-1:-1:-1;;;22112:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22112:17:0;;22090:39;;22140:154;22147:10;;22140:154;;22174:11;22184:1;22174:11;;:::i;:::-;;-1:-1:-1;22243:10:0;22251:2;22243:5;:10;:::i;:::-;22230:24;;:2;:24;:::i;:::-;22217:39;;22200:6;22207;22200:14;;;;;;-1:-1:-1;;;22200:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;22200:56:0;;;;;;;;-1:-1:-1;22271:11:0;22280:2;22271:11;;:::i;:::-;;;22140:154;;2004:675;2087:7;2130:4;2087:7;2145:497;2169:5;:12;2165:1;:16;2145:497;;;2203:20;2226:5;2232:1;2226:8;;;;;;-1:-1:-1;;;2226:8:0;;;;;;;;;;;;;;;2203:31;;2269:12;2253;:28;2249:382;;2755:13;2805:15;;;2841:4;2834:15;;;2888:4;2872:21;;2381:57;;2249:382;;;2755:13;2805:15;;;2841:4;2834:15;;;2888:4;2872:21;;2558:57;;2249:382;-1:-1:-1;2183:3:0;;;;:::i;:::-;;;;2145:497;;;-1:-1:-1;2659:12:0;2004:675;-1:-1:-1;;;2004:675:0:o;35803:163::-;35926:32;35932:2;35936:8;35946:5;35953:4;36364:20;36387:13;-1:-1:-1;;;;;36415:16:0;;36411:48;;36440:19;;-1:-1:-1;;;36440:19:0;;;;;;;;;;;36411:48;36474:13;36470:44;;36496:18;;-1:-1:-1;;;36496:18:0;;;;;;;;;;;36470:44;-1:-1:-1;;;;;36865:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;36924:49:0;;-1:-1:-1;;;;;36865:44:0;;;;;;;36924:49;;;-1:-1:-1;;;;;36865:44:0;;;;;;36924:49;;;;;;;;;;;;;;;;36990:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;37040:66:0;;;;-1:-1:-1;;;37090:15:0;37040:66;;;;;;;;;;36990:25;37187:23;;;37231:4;:23;;;;-1:-1:-1;;;;;;37239:13:0;;11118:20;11157:8;;37239:15;37227:641;;;37275:314;37306:38;;37331:12;;-1:-1:-1;;;;;37306:38:0;;;37323:1;;37306:38;;37323:1;;37306:38;37372:69;37411:1;37415:2;37419:14;;;;;;37435:5;37372:30;:69::i;:::-;37367:174;;37477:40;;-1:-1:-1;;;37477:40:0;;;;;;;;;;;37367:174;37584:3;37568:12;:19;;37275:314;;37670:12;37653:13;;:29;37649:43;;37684:8;;;37649:43;37227:641;;;37733:120;37764:40;;37789:14;;;;;-1:-1:-1;;;;;37764:40:0;;;37781:1;;37764:40;;37781:1;;37764:40;37848:3;37832:12;:19;;37733:120;;37227:641;-1:-1:-1;37882:13:0;:28;37932:60;34517:369;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;78:5;-1:-1:-1;;;;;149:2:1;141:6;138:14;135:2;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:2;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:2;;;532:1;529;522:12;491:2;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;88:557;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:2;;813:1;810;803:12;747:2;699:124;;;:::o;828:391::-;891:8;901:6;955:3;948:4;940:6;936:17;932:27;922:2;;978:6;970;963:22;922:2;-1:-1:-1;1006:20:1;;-1:-1:-1;;;;;1038:30:1;;1035:2;;;1088:8;1078;1071:26;1035:2;1132:4;1124:6;1120:17;1108:29;;1192:3;1185:4;1175:6;1172:1;1168:14;1160:6;1156:27;1152:38;1149:47;1146:2;;;1209:1;1206;1199:12;1146:2;912:307;;;;;:::o;1224:160::-;1289:20;;1345:13;;1338:21;1328:32;;1318:2;;1374:1;1371;1364:12;1389:196;1448:6;1501:2;1489:9;1480:7;1476:23;1472:32;1469:2;;;1522:6;1514;1507:22;1469:2;1550:29;1569:9;1550:29;:::i;1590:270::-;1658:6;1666;1719:2;1707:9;1698:7;1694:23;1690:32;1687:2;;;1740:6;1732;1725:22;1687:2;1768:29;1787:9;1768:29;:::i;:::-;1758:39;;1816:38;1850:2;1839:9;1835:18;1816:38;:::i;:::-;1806:48;;1677:183;;;;;:::o;1865:338::-;1942:6;1950;1958;2011:2;1999:9;1990:7;1986:23;1982:32;1979:2;;;2032:6;2024;2017:22;1979:2;2060:29;2079:9;2060:29;:::i;:::-;2050:39;;2108:38;2142:2;2131:9;2127:18;2108:38;:::i;:::-;2098:48;;2193:2;2182:9;2178:18;2165:32;2155:42;;1969:234;;;;;:::o;2208:696::-;2303:6;2311;2319;2327;2380:3;2368:9;2359:7;2355:23;2351:33;2348:2;;;2402:6;2394;2387:22;2348:2;2430:29;2449:9;2430:29;:::i;:::-;2420:39;;2478:38;2512:2;2501:9;2497:18;2478:38;:::i;:::-;2468:48;;2563:2;2552:9;2548:18;2535:32;2525:42;;2618:2;2607:9;2603:18;2590:32;-1:-1:-1;;;;;2637:6:1;2634:30;2631:2;;;2682:6;2674;2667:22;2631:2;2710:22;;2763:4;2755:13;;2751:27;-1:-1:-1;2741:2:1;;2797:6;2789;2782:22;2741:2;2825:73;2890:7;2885:2;2872:16;2867:2;2863;2859:11;2825:73;:::i;:::-;2815:83;;;2338:566;;;;;;;:::o;2909:264::-;2974:6;2982;3035:2;3023:9;3014:7;3010:23;3006:32;3003:2;;;3056:6;3048;3041:22;3003:2;3084:29;3103:9;3084:29;:::i;:::-;3074:39;;3132:35;3163:2;3152:9;3148:18;3132:35;:::i;3178:264::-;3246:6;3254;3307:2;3295:9;3286:7;3282:23;3278:32;3275:2;;;3328:6;3320;3313:22;3275:2;3356:29;3375:9;3356:29;:::i;:::-;3346:39;3432:2;3417:18;;;;3404:32;;-1:-1:-1;;;3265:177:1:o;3447:525::-;3542:6;3550;3558;3611:2;3599:9;3590:7;3586:23;3582:32;3579:2;;;3632:6;3624;3617:22;3579:2;3677:9;3664:23;-1:-1:-1;;;;;3702:6:1;3699:30;3696:2;;;3747:6;3739;3732:22;3696:2;3791:70;3853:7;3844:6;3833:9;3829:22;3791:70;:::i;:::-;3880:8;;3765:96;;-1:-1:-1;3962:2:1;3947:18;;;;3934:32;;3569:403;-1:-1:-1;;;;3569:403:1:o;4507:190::-;4563:6;4616:2;4604:9;4595:7;4591:23;4587:32;4584:2;;;4637:6;4629;4622:22;4584:2;4665:26;4681:9;4665:26;:::i;4702:190::-;4761:6;4814:2;4802:9;4793:7;4789:23;4785:32;4782:2;;;4835:6;4827;4820:22;4782:2;-1:-1:-1;4863:23:1;;4772:120;-1:-1:-1;4772:120:1:o;4897:255::-;4955:6;5008:2;4996:9;4987:7;4983:23;4979:32;4976:2;;;5029:6;5021;5014:22;4976:2;5073:9;5060:23;5092:30;5116:5;5092:30;:::i;5157:259::-;5226:6;5279:2;5267:9;5258:7;5254:23;5250:32;5247:2;;;5300:6;5292;5285:22;5247:2;5337:9;5331:16;5356:30;5380:5;5356:30;:::i;5421:480::-;5490:6;5543:2;5531:9;5522:7;5518:23;5514:32;5511:2;;;5564:6;5556;5549:22;5511:2;5609:9;5596:23;-1:-1:-1;;;;;5634:6:1;5631:30;5628:2;;;5679:6;5671;5664:22;5628:2;5707:22;;5760:4;5752:13;;5748:27;-1:-1:-1;5738:2:1;;5794:6;5786;5779:22;5738:2;5822:73;5887:7;5882:2;5869:16;5864:2;5860;5856:11;5822:73;:::i;6101:257::-;6142:3;6180:5;6174:12;6207:6;6202:3;6195:19;6223:63;6279:6;6272:4;6267:3;6263:14;6256:4;6249:5;6245:16;6223:63;:::i;:::-;6340:2;6319:15;-1:-1:-1;;6315:29:1;6306:39;;;;6347:4;6302:50;;6150:208;-1:-1:-1;;6150:208:1:o;6597:1531::-;6821:3;6859:6;6853:13;6885:4;6898:51;6942:6;6937:3;6932:2;6924:6;6920:15;6898:51;:::i;:::-;7012:13;;6971:16;;;;7034:55;7012:13;6971:16;7056:15;;;7034:55;:::i;:::-;7180:13;;7111:20;;;7151:3;;7240:1;7262:18;;;;7315;;;;7342:2;;7420:4;7410:8;7406:19;7394:31;;7342:2;7483;7473:8;7470:16;7450:18;7447:40;7444:2;;;-1:-1:-1;;;7510:33:1;;7566:4;7563:1;7556:15;7596:4;7517:3;7584:17;7444:2;7627:18;7654:110;;;;7778:1;7773:330;;;;7620:483;;7654:110;-1:-1:-1;;7689:24:1;;7675:39;;7734:20;;;;-1:-1:-1;7654:110:1;;7773:330;14089:4;14108:17;;;14158:4;14142:21;;7868:3;7884:169;7898:8;7895:1;7892:15;7884:169;;;7980:14;;7965:13;;;7958:37;8023:16;;;;7915:10;;7884:169;;;7888:3;;8084:8;8077:5;8073:20;8066:27;;7620:483;-1:-1:-1;8119:3:1;;6829:1299;-1:-1:-1;;;;;;;;;;;6829:1299:1:o;8551:488::-;-1:-1:-1;;;;;8820:15:1;;;8802:34;;8872:15;;8867:2;8852:18;;8845:43;8919:2;8904:18;;8897:34;;;8967:3;8962:2;8947:18;;8940:31;;;8745:4;;8988:45;;9013:19;;9005:6;8988:45;:::i;:::-;8980:53;8754:285;-1:-1:-1;;;;;;8754:285:1:o;9418:219::-;9567:2;9556:9;9549:21;9530:4;9587:44;9627:2;9616:9;9612:18;9604:6;9587:44;:::i;11170:356::-;11372:2;11354:21;;;11391:18;;;11384:30;11450:34;11445:2;11430:18;;11423:62;11517:2;11502:18;;11344:182::o;14174:128::-;14214:3;14245:1;14241:6;14238:1;14235:13;14232:2;;;14251:18;;:::i;:::-;-1:-1:-1;14287:9:1;;14222:80::o;14307:120::-;14347:1;14373;14363:2;;14378:18;;:::i;:::-;-1:-1:-1;14412:9:1;;14353:74::o;14432:168::-;14472:7;14538:1;14534;14530:6;14526:14;14523:1;14520:21;14515:1;14508:9;14501:17;14497:45;14494:2;;;14545:18;;:::i;:::-;-1:-1:-1;14585:9:1;;14484:116::o;14605:125::-;14645:4;14673:1;14670;14667:8;14664:2;;;14678:18;;:::i;:::-;-1:-1:-1;14715:9:1;;14654:76::o;14735:258::-;14807:1;14817:113;14831:6;14828:1;14825:13;14817:113;;;14907:11;;;14901:18;14888:11;;;14881:39;14853:2;14846:10;14817:113;;;14948:6;14945:1;14942:13;14939:2;;;-1:-1:-1;;14983:1:1;14965:16;;14958:27;14788:205::o;14998:380::-;15077:1;15073:12;;;;15120;;;15141:2;;15195:4;15187:6;15183:17;15173:27;;15141:2;15248;15240:6;15237:14;15217:18;15214:38;15211:2;;;15294:10;15289:3;15285:20;15282:1;15275:31;15329:4;15326:1;15319:15;15357:4;15354:1;15347:15;15211:2;;15053:325;;;:::o;15383:135::-;15422:3;-1:-1:-1;;15443:17:1;;15440:2;;;15463:18;;:::i;:::-;-1:-1:-1;15510:1:1;15499:13;;15430:88::o;15523:112::-;15555:1;15581;15571:2;;15586:18;;:::i;:::-;-1:-1:-1;15620:9:1;;15561:74::o;15640:127::-;15701:10;15696:3;15692:20;15689:1;15682:31;15732:4;15729:1;15722:15;15756:4;15753:1;15746:15;15772:127;15833:10;15828:3;15824:20;15821:1;15814:31;15864:4;15861:1;15854:15;15888:4;15885:1;15878:15;15904:127;15965:10;15960:3;15956:20;15953:1;15946:31;15996:4;15993:1;15986:15;16020:4;16017:1;16010:15;16036:131;-1:-1:-1;;;;;;16110:32:1;;16100:43;;16090:2;;16157:1;16154;16147:12

Swarm Source

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