ETH Price: $3,188.16 (+1.67%)

Token

DystoApez (DYSTO)
 

Overview

Max Total Supply

4,444 DYSTO

Holders

1,316

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
5 DYSTO
0xcf0eba0da4b6ef189b745566ca877169b7babde0
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

4444 Genesis Dysto Apez living on the Ethereum blockchain. $SCRAP is king in this dystopian universe with one goal in mind. Metaverse domination.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
DystoApez

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 10000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-12-29
*/

// File: IScrapToken.sol


/*
  _____   _____ _____ ___   _   ___ ___ ____
 |   \ \ / / __|_   _/ _ \ /_\ | _ \ __|_  /
 | |) \ V /\__ \ | || (_) / _ \|  _/ _| / /
 |___/ |_| |___/ |_| \___/_/ \_\_| |___/___|

*/

pragma solidity ^0.8.7;

interface IScrapToken {

    function updateReward(address _from, address _to, uint256 _tokenId) external;

    function getClaimableReward(address _account) external view returns(uint256);

    function claimReward() external;
}
// File: @openzeppelin/contracts/utils/Address.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/access/Ownable.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/security/Pausable.sol


// OpenZeppelin Contracts v4.4.1 (security/Pausable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/utils/cryptography/ECDSA.sol


// OpenZeppelin Contracts v4.4.1 (utils/cryptography/ECDSA.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

        return (signer, RecoverError.NoError);
    }

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/ERC721.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual 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) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_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 {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _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 {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

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

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

// File: DystoApez.sol


/*

  _____   _____ _____ ___   _   ___ ___ ____
 |   \ \ / / __|_   _/ _ \ /_\ | _ \ __|_  /
 | |) \ V /\__ \ | || (_) / _ \|  _/ _| / /
 |___/ |_| |___/ |_| \___/_/ \_\_| |___/___|


*/

pragma solidity ^0.8.7;







contract DystoApez is ERC721, Ownable, Pausable {
    using Strings for uint256;
    uint256 public constant MAX_SUPPLY = 4444;
    uint256 public constant MINT_PRICE = 0.06 ether;
    uint256 public constant MINT_PRICE_PUBLIC = 0.07 ether;
    uint256 public constant MAX_MINT_PER_TX = 5;
    uint256 constant public LEGENDARY_SUPPLY = 10;

    mapping(bytes32 => bool) private _usedHashes;

    bool public saleStarted = false;
    bool public preSaleStarted = false;
    bool public lock = false;
    address private _signerAddress;
    uint256 public totalSupply = 0;
    IScrapToken public scrapToken;

    string public prefixURI;
    string public commonURI;

    mapping(uint256 => string) public tokenURIs;

    constructor() ERC721("DystoApez", "DYSTO") { }

    function mintLegendary() external onlyOwner {
        require(totalSupply == 0, "MINT_ALREADY_STARTED");
        for (uint256 i = 1; i <= LEGENDARY_SUPPLY; i++) {
            _safeMint(msg.sender, totalSupply + i);
        }
        totalSupply += LEGENDARY_SUPPLY;
    }

    function mintAdmin(uint256 _count, address _account) external onlyOwner {
        require(totalSupply + _count <= MAX_SUPPLY, "MAX_SUPPLY_REACHED");
        require(totalSupply >= LEGENDARY_SUPPLY, "LEGENDARY_NOT_MINTED");
        for (uint256 i = 1; i <= _count; i++) {
            _safeMint(_account, totalSupply + i);
        }
        totalSupply += _count;
    }

    function mintWhitelist(
        uint256 _count,
        uint256 _maxCount,
        bytes memory _sig)
        external
        payable
    {
        require(preSaleStarted, "MINT_NOT_STARTED");
        require(_count > 0 && _count <= _maxCount, "COUNT_INVALID");
        require(totalSupply + _count <= MAX_SUPPLY, "MAX_SUPPLY_REACHED");
        require(totalSupply >= LEGENDARY_SUPPLY, "LEGENDARY_NOT_MINTED");
        require(msg.value == (_count * MINT_PRICE), "INVALID_ETH_SENT");

        bytes32 hash = keccak256(abi.encode(_msgSender(), _maxCount));
        require(!_usedHashes[hash], "HASH_ALREADY_USED");
        require(_matchSigner(hash, _sig), "INVALID_SIGNER");

        _usedHashes[hash] = true;
        for (uint256 i = 1; i <= _count; i++) {
            _safeMint(msg.sender, totalSupply + i);
        }
        totalSupply += _count;
    }

    function _matchSigner(bytes32 _hash, bytes memory _signature) private view returns(bool) {
        return _signerAddress == ECDSA.recover(ECDSA.toEthSignedMessageHash(_hash), _signature);
    }

    function isWhiteList(
        address _sender,
        uint256 _maxCount,
        bytes calldata _sig
    ) public view returns(bool) {
        bytes32 _hash = keccak256(abi.encode(_sender, _maxCount));
        if (!_matchSigner(_hash, _sig)) {
            return false;
        }
        if (_usedHashes[_hash]) {
            return false;
        }
        return true;
    }


    // Public Mint
    function mint(uint256 _count) public payable {
        require(saleStarted, "MINT_NOT_STARTED");
        require(_count > 0 && _count <= MAX_MINT_PER_TX, "COUNT_INVALID");
        require(totalSupply >= LEGENDARY_SUPPLY, "LEGENDARY_NOT_MINTED");
        require(totalSupply + _count <= MAX_SUPPLY, "MAX_SUPPLY_REACHED");
        require(msg.value == (_count * MINT_PRICE_PUBLIC), "INVALID_ETH_SENT");

        for (uint256 i = 1; i <= _count; i++) {
            _safeMint(msg.sender, totalSupply + i);
        }
        totalSupply += _count;
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        if (bytes(tokenURIs[tokenId]).length != 0) {
            return tokenURIs[tokenId];
        }
        if (bytes(commonURI).length != 0) {
            return commonURI;
        }
        return string(abi.encodePacked(prefixURI, tokenId.toString()));
    }

    // ** Admin Fuctions ** //
    function withdraw(address payable _to) external onlyOwner {
        require(_to != address(0), "WITHDRAW_ADDRESS_ZERO");
        require(address(this).balance > 0, "EMPTY_BALANCE");
        _to.transfer(address(this).balance);
    }

    function setSaleStarted(bool _hasStarted) external onlyOwner {
        require(saleStarted != _hasStarted, "SALE_STARTED_ALREADY_SET");
        saleStarted = _hasStarted;
    }

    function setPreSaleStarted(bool _hasStarted) external onlyOwner {
        require(preSaleStarted != _hasStarted, "SALE_STARTED_ALREADY_SET");
        preSaleStarted = _hasStarted;
    }

    function setSignerAddress(address _signer) external onlyOwner {
        require(_signer != address(0), "SIGNER_ADDRESS_ZERO");
        _signerAddress = _signer;
    }

    function lockBaseURI() external onlyOwner {
        require(!lock, "ALREADY_LOCKED");
        lock = true;
    }

    function setPrefixURI(string calldata _uri) external onlyOwner {
        require(!lock, "ALREADY_LOCKED");
        prefixURI = _uri;
        commonURI = '';
    }

    function setCommonURI(string calldata _uri) external onlyOwner {
        require(!lock, "ALREADY_LOCKED");
        commonURI = _uri;
        prefixURI = '';
    }

    function setTokenURI(string calldata _uri, uint256 _tokenId) external onlyOwner {
        require(!lock, "ALREADY_LOCKED");
        tokenURIs[_tokenId] = _uri;
    }

    function setScrapToken(address _token) external onlyOwner {
        require(_token != address(scrapToken), "TOKEN_ALREADY_SET");
        require(_token != address(0), "TOKEN_ADDRESS_ZERO");
        scrapToken = IScrapToken(_token);
    }


    function pause() external onlyOwner {
        require(!paused(), "ALREADY_PAUSED");
        _pause();
    }

    function unpause() external onlyOwner {
        require(paused(), "ALREADY_UNPAUSED");
        _unpause();
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) override internal virtual {
        require(!paused(), "TRANSFER_PAUSED");
        scrapToken.updateReward(from, to, tokenId);
        super._beforeTokenTransfer(from, to, tokenId);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"LEGENDARY_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_MINT_PER_TX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PRICE_PUBLIC","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"commonURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"address","name":"_sender","type":"address"},{"internalType":"uint256","name":"_maxCount","type":"uint256"},{"internalType":"bytes","name":"_sig","type":"bytes"}],"name":"isWhiteList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lock","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"},{"internalType":"address","name":"_account","type":"address"}],"name":"mintAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintLegendary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"},{"internalType":"uint256","name":"_maxCount","type":"uint256"},{"internalType":"bytes","name":"_sig","type":"bytes"}],"name":"mintWhitelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preSaleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"prefixURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"scrapToken","outputs":[{"internalType":"contract IScrapToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setCommonURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_hasStarted","type":"bool"}],"name":"setPreSaleStarted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setPrefixURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_hasStarted","type":"bool"}],"name":"setSaleStarted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"setScrapToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_signer","type":"address"}],"name":"setSignerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"setTokenURI","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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenURIs","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":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_to","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526008805462ffffff1916905560006009553480156200002257600080fd5b506040805180820182526009815268223cb9ba37a0b832bd60b91b602080830191825283518085019094526005845264445953544f60d81b90840152815191929162000071916000916200010d565b508051620000879060019060208401906200010d565b505050620000a46200009e620000b760201b60201c565b620000bb565b6006805460ff60a01b19169055620001f0565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200011b90620001b3565b90600052602060002090601f0160209004810192826200013f57600085556200018a565b82601f106200015a57805160ff19168380011785556200018a565b828001600101855582156200018a579182015b828111156200018a5782518255916020019190600101906200016d565b50620001989291506200019c565b5090565b5b808211156200019857600081556001016200019d565b600181811c90821680620001c857607f821691505b60208210811415620001ea57634e487b7160e01b600052602260045260246000fd5b50919050565b613f8d80620002006000396000f3fe6080604052600436106102fd5760003560e01c8063715018a61161018f578063a854ffba116100e1578063c87b56dd1161008a578063e985e9c511610064578063e985e9c514610802578063f2fde38b1461084b578063f83d08ba1461086b57600080fd5b8063c87b56dd146107a2578063e4f407cc146107c2578063e59ee014146107e257600080fd5b8063c002d23d116100bb578063c002d23d1461074c578063c1a3919414610767578063c3151fed1461078757600080fd5b8063a854ffba146106ec578063b2c94ee61461070c578063b88d4fde1461072c57600080fd5b80638ecad72111610143578063a0712d681161011d578063a0712d68146106a4578063a0c54078146106b7578063a22cb465146106cc57600080fd5b80638ecad7211461065a57806395d89b411461066f5780639d034fe91461068457600080fd5b80638a03dd7a116101745780638a03dd7a146106125780638d40fb4e146106275780638da5cb5b1461063c57600080fd5b8063715018a6146105e85780638456cb59146105fd57600080fd5b806342842e0e116102535780635c975abb116101fc5780636ab65915116101d65780636ab65915146105935780636c8b703f146105a857806370a08231146105c857600080fd5b80635c975abb146105245780636352211e14610554578063690cf0d11461057457600080fd5b806353df5c7c1161022d57806353df5c7c146104d557806355fc9893146104ea5780635c474f9e1461050a57600080fd5b806342842e0e1461048257806343774ebd146104a257806351cff8d9146104b557600080fd5b806309a3beef116102b55780632aa148fd1161028f5780632aa148fd1461043757806332cb6b0c146104575780633f4ba83a1461046d57600080fd5b806309a3beef146103d357806318160ddd146103f357806323b872dd1461041757600080fd5b806306fdde03116102e657806306fdde0314610359578063081812fc1461037b578063095ea7b3146103b357600080fd5b806301ffc9a714610302578063046dc16614610337575b600080fd5b34801561030e57600080fd5b5061032261031d3660046139f3565b61088b565b60405190151581526020015b60405180910390f35b34801561034357600080fd5b50610357610352366004613811565b610970565b005b34801561036557600080fd5b5061036e610a66565b60405161032e9190613cc9565b34801561038757600080fd5b5061039b610396366004613abb565b610af8565b6040516001600160a01b03909116815260200161032e565b3480156103bf57600080fd5b506103576103ce366004613950565b610b9e565b3480156103df57600080fd5b506103576103ee366004613a6f565b610cd0565b3480156103ff57600080fd5b5061040960095481565b60405190815260200161032e565b34801561042357600080fd5b5061035761043236600461386e565b610da2565b34801561044357600080fd5b50600a5461039b906001600160a01b031681565b34801561046357600080fd5b5061040961115c81565b34801561047957600080fd5b50610357610e29565b34801561048e57600080fd5b5061035761049d36600461386e565b610ef7565b6103576104b0366004613af9565b610f12565b3480156104c157600080fd5b506103576104d0366004613811565b61126a565b3480156104e157600080fd5b506103576113a3565b3480156104f657600080fd5b50610357610505366004613a2d565b611485565b34801561051657600080fd5b506008546103229060ff1681565b34801561053057600080fd5b5060065474010000000000000000000000000000000000000000900460ff16610322565b34801561056057600080fd5b5061039b61056f366004613abb565b611563565b34801561058057600080fd5b5060085461032290610100900460ff1681565b34801561059f57600080fd5b50610409600a81565b3480156105b457600080fd5b5061036e6105c3366004613abb565b6115ee565b3480156105d457600080fd5b506104096105e3366004613811565b611688565b3480156105f457600080fd5b50610357611722565b34801561060957600080fd5b50610357611786565b34801561061e57600080fd5b50610357611853565b34801561063357600080fd5b5061036e611947565b34801561064857600080fd5b506006546001600160a01b031661039b565b34801561066657600080fd5b50610409600581565b34801561067b57600080fd5b5061036e611954565b34801561069057600080fd5b5061035761069f366004613ad4565b611963565b6103576106b2366004613abb565b611ab9565b3480156106c357600080fd5b5061036e611cc2565b3480156106d857600080fd5b506103576106e736600461391b565b611ccf565b3480156106f857600080fd5b506103576107073660046139d8565b611cda565b34801561071857600080fd5b50610357610727366004613a2d565b611dbe565b34801561073857600080fd5b506103576107473660046138af565b611e9c565b34801561075857600080fd5b5061040966d529ae9e86000081565b34801561077357600080fd5b50610357610782366004613811565b611f24565b34801561079357600080fd5b5061040966f8b0a10e47000081565b3480156107ae57600080fd5b5061036e6107bd366004613abb565b61206c565b3480156107ce57600080fd5b506103226107dd36600461397c565b61220a565b3480156107ee57600080fd5b506103576107fd3660046139d8565b6122c0565b34801561080e57600080fd5b5061032261081d366004613835565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561085757600080fd5b50610357610866366004613811565b6123b0565b34801561087757600080fd5b506008546103229062010000900460ff1681565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061091e57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061096a57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6006546001600160a01b031633146109cf5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6001600160a01b038116610a255760405162461bcd60e51b815260206004820152601360248201527f5349474e45525f414444524553535f5a45524f0000000000000000000000000060448201526064016109c6565b600880546001600160a01b039092166301000000027fffffffffffffffffff0000000000000000000000000000000000000000ffffff909216919091179055565b606060008054610a7590613d88565b80601f0160208091040260200160405190810160405280929190818152602001828054610aa190613d88565b8015610aee5780601f10610ac357610100808354040283529160200191610aee565b820191906000526020600020905b815481529060010190602001808311610ad157829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610b825760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084016109c6565b506000908152600460205260409020546001600160a01b031690565b6000610ba982611563565b9050806001600160a01b0316836001600160a01b03161415610c335760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084016109c6565b336001600160a01b0382161480610c4f5750610c4f813361081d565b610cc15760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016109c6565b610ccb8383612492565b505050565b6006546001600160a01b03163314610d2a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109c6565b60085462010000900460ff1615610d835760405162461bcd60e51b815260206004820152600e60248201527f414c52454144595f4c4f434b454400000000000000000000000000000000000060448201526064016109c6565b6000818152600d60205260409020610d9c9084846135e4565b50505050565b610dac3382612518565b610e1e5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016109c6565b610ccb83838361261c565b6006546001600160a01b03163314610e835760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109c6565b60065474010000000000000000000000000000000000000000900460ff16610eed5760405162461bcd60e51b815260206004820152601060248201527f414c52454144595f554e5041555345440000000000000000000000000000000060448201526064016109c6565b610ef561280c565b565b610ccb83838360405180602001604052806000815250611e9c565b600854610100900460ff16610f695760405162461bcd60e51b815260206004820152601060248201527f4d494e545f4e4f545f535441525445440000000000000000000000000000000060448201526064016109c6565b600083118015610f795750818311155b610fc55760405162461bcd60e51b815260206004820152600d60248201527f434f554e545f494e56414c49440000000000000000000000000000000000000060448201526064016109c6565b61115c83600954610fd69190613cdc565b11156110245760405162461bcd60e51b815260206004820152601260248201527f4d41585f535550504c595f52454143484544000000000000000000000000000060448201526064016109c6565b600a60095410156110775760405162461bcd60e51b815260206004820152601460248201527f4c4547454e444152595f4e4f545f4d494e54454400000000000000000000000060448201526064016109c6565b61108866d529ae9e86000084613d08565b34146110d65760405162461bcd60e51b815260206004820152601060248201527f494e56414c49445f4554485f53454e540000000000000000000000000000000060448201526064016109c6565b600033604080516001600160a01b0390921660208301528101849052606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152600790935291205490915060ff161561118b5760405162461bcd60e51b815260206004820152601160248201527f484153485f414c52454144595f5553454400000000000000000000000000000060448201526064016109c6565b61119581836128de565b6111e15760405162461bcd60e51b815260206004820152600e60248201527f494e56414c49445f5349474e455200000000000000000000000000000000000060448201526064016109c6565b600081815260076020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091555b84811161124c5761123a33826009546112359190613cdc565b612960565b8061124481613ddc565b91505061121c565b50836009600082825461125f9190613cdc565b909155505050505050565b6006546001600160a01b031633146112c45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109c6565b6001600160a01b03811661131a5760405162461bcd60e51b815260206004820152601560248201527f57495448445241575f414444524553535f5a45524f000000000000000000000060448201526064016109c6565b6000471161136a5760405162461bcd60e51b815260206004820152600d60248201527f454d5054595f42414c414e43450000000000000000000000000000000000000060448201526064016109c6565b6040516001600160a01b038216904780156108fc02916000818181858888f1935050505015801561139f573d6000803e3d6000fd5b5050565b6006546001600160a01b031633146113fd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109c6565b60085462010000900460ff16156114565760405162461bcd60e51b815260206004820152600e60248201527f414c52454144595f4c4f434b454400000000000000000000000000000000000060448201526064016109c6565b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff1662010000179055565b6006546001600160a01b031633146114df5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109c6565b60085462010000900460ff16156115385760405162461bcd60e51b815260206004820152600e60248201527f414c52454144595f4c4f434b454400000000000000000000000000000000000060448201526064016109c6565b611544600c83836135e4565b50604080516020810191829052600090819052610ccb91600b91613686565b6000818152600260205260408120546001600160a01b03168061096a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e000000000000000000000000000000000000000000000060648201526084016109c6565b600d602052600090815260409020805461160790613d88565b80601f016020809104026020016040519081016040528092919081815260200182805461163390613d88565b80156116805780601f1061165557610100808354040283529160200191611680565b820191906000526020600020905b81548152906001019060200180831161166357829003601f168201915b505050505081565b60006001600160a01b0382166117065760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f20616464726573730000000000000000000000000000000000000000000060648201526084016109c6565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b0316331461177c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109c6565b610ef5600061297a565b6006546001600160a01b031633146117e05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109c6565b60065474010000000000000000000000000000000000000000900460ff161561184b5760405162461bcd60e51b815260206004820152600e60248201527f414c52454144595f50415553454400000000000000000000000000000000000060448201526064016109c6565b610ef56129e4565b6006546001600160a01b031633146118ad5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109c6565b600954156118fd5760405162461bcd60e51b815260206004820152601460248201527f4d494e545f414c52454144595f5354415254454400000000000000000000000060448201526064016109c6565b60015b600a811161192c5761191a33826009546112359190613cdc565b8061192481613ddc565b915050611900565b50600a600960008282546119409190613cdc565b9091555050565b600c805461160790613d88565b606060018054610a7590613d88565b6006546001600160a01b031633146119bd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109c6565b61115c826009546119ce9190613cdc565b1115611a1c5760405162461bcd60e51b815260206004820152601260248201527f4d41585f535550504c595f52454143484544000000000000000000000000000060448201526064016109c6565b600a6009541015611a6f5760405162461bcd60e51b815260206004820152601460248201527f4c4547454e444152595f4e4f545f4d494e54454400000000000000000000000060448201526064016109c6565b60015b828111611a9d57611a8b82826009546112359190613cdc565b80611a9581613ddc565b915050611a72565b508160096000828254611ab09190613cdc565b90915550505050565b60085460ff16611b0b5760405162461bcd60e51b815260206004820152601060248201527f4d494e545f4e4f545f535441525445440000000000000000000000000000000060448201526064016109c6565b600081118015611b1c575060058111155b611b685760405162461bcd60e51b815260206004820152600d60248201527f434f554e545f494e56414c49440000000000000000000000000000000000000060448201526064016109c6565b600a6009541015611bbb5760405162461bcd60e51b815260206004820152601460248201527f4c4547454e444152595f4e4f545f4d494e54454400000000000000000000000060448201526064016109c6565b61115c81600954611bcc9190613cdc565b1115611c1a5760405162461bcd60e51b815260206004820152601260248201527f4d41585f535550504c595f52454143484544000000000000000000000000000060448201526064016109c6565b611c2b66f8b0a10e47000082613d08565b3414611c795760405162461bcd60e51b815260206004820152601060248201527f494e56414c49445f4554485f53454e540000000000000000000000000000000060448201526064016109c6565b60015b818111611ca757611c9533826009546112359190613cdc565b80611c9f81613ddc565b915050611c7c565b508060096000828254611cba9190613cdc565b909155505050565b600b805461160790613d88565b61139f338383612ab6565b6006546001600160a01b03163314611d345760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109c6565b60085460ff1615158115151415611d8d5760405162461bcd60e51b815260206004820152601860248201527f53414c455f535441525445445f414c52454144595f534554000000000000000060448201526064016109c6565b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b6006546001600160a01b03163314611e185760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109c6565b60085462010000900460ff1615611e715760405162461bcd60e51b815260206004820152600e60248201527f414c52454144595f4c4f434b454400000000000000000000000000000000000060448201526064016109c6565b611e7d600b83836135e4565b50604080516020810191829052600090819052610ccb91600c91613686565b611ea63383612518565b611f185760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016109c6565b610d9c84848484612ba3565b6006546001600160a01b03163314611f7e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109c6565b600a546001600160a01b0382811691161415611fdc5760405162461bcd60e51b815260206004820152601160248201527f544f4b454e5f414c52454144595f53455400000000000000000000000000000060448201526064016109c6565b6001600160a01b0381166120325760405162461bcd60e51b815260206004820152601260248201527f544f4b454e5f414444524553535f5a45524f000000000000000000000000000060448201526064016109c6565b600a80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6000818152600260205260409020546060906001600160a01b03166120f95760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e000000000000000000000000000000000060648201526084016109c6565b6000828152600d60205260409020805461211290613d88565b1590506121b7576000828152600d60205260409020805461213290613d88565b80601f016020809104026020016040519081016040528092919081815260200182805461215e90613d88565b80156121ab5780601f10612180576101008083540402835291602001916121ab565b820191906000526020600020905b81548152906001019060200180831161218e57829003601f168201915b50505050509050919050565b600c80546121c490613d88565b1590506121d857600c805461213290613d88565b600b6121e383612c2c565b6040516020016121f4929190613baf565b6040516020818303038152906040529050919050565b604080516001600160a01b038616602082015290810184905260009081906060016040516020818303038152906040528051906020012090506122838185858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506128de92505050565b6122915760009150506122b8565b60008181526007602052604090205460ff16156122b25760009150506122b8565b60019150505b949350505050565b6006546001600160a01b0316331461231a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109c6565b60085460ff61010090910416151581151514156123795760405162461bcd60e51b815260206004820152601860248201527f53414c455f535441525445445f414c52454144595f534554000000000000000060448201526064016109c6565b60088054911515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909216919091179055565b6006546001600160a01b0316331461240a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109c6565b6001600160a01b0381166124865760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016109c6565b61248f8161297a565b50565b600081815260046020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03841690811790915581906124df82611563565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166125a25760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084016109c6565b60006125ad83611563565b9050806001600160a01b0316846001600160a01b031614806125e85750836001600160a01b03166125dd84610af8565b6001600160a01b0316145b806122b857506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff166122b8565b826001600160a01b031661262f82611563565b6001600160a01b0316146126ab5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e000000000000000000000000000000000000000000000060648201526084016109c6565b6001600160a01b0382166127265760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016109c6565b612731838383612d5e565b61273c600082612492565b6001600160a01b0383166000908152600360205260408120805460019290612765908490613d45565b90915550506001600160a01b0382166000908152600360205260408120805460019290612793908490613cdc565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60065474010000000000000000000000000000000000000000900460ff166128765760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f742070617573656400000000000000000000000060448201526064016109c6565b600680547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600061294061293a846040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b83612e55565b600854630100000090046001600160a01b03908116911614905092915050565b61139f828260405180602001604052806000815250612e79565b600680546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60065474010000000000000000000000000000000000000000900460ff1615612a4f5760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a207061757365640000000000000000000000000000000060448201526064016109c6565b600680547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586128c13390565b816001600160a01b0316836001600160a01b03161415612b185760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016109c6565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612bae84848461261c565b612bba84848484612f02565b610d9c5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016109c6565b606081612c6c57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612c965780612c8081613ddc565b9150612c8f9050600a83613cf4565b9150612c70565b60008167ffffffffffffffff811115612cb157612cb1613ee5565b6040519080825280601f01601f191660200182016040528015612cdb576020820181803683370190505b5090505b84156122b857612cf0600183613d45565b9150612cfd600a86613e15565b612d08906030613cdc565b60f81b818381518110612d1d57612d1d613eb6565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612d57600a86613cf4565b9450612cdf565b60065474010000000000000000000000000000000000000000900460ff1615612dc95760405162461bcd60e51b815260206004820152600f60248201527f5452414e534645525f504155534544000000000000000000000000000000000060448201526064016109c6565b600a546040517f2c8e8dfa0000000000000000000000000000000000000000000000000000000081526001600160a01b03858116600483015284811660248301526044820184905290911690632c8e8dfa90606401600060405180830381600087803b158015612e3857600080fd5b505af1158015612e4c573d6000803e3d6000fd5b50505050505050565b6000806000612e6485856130ca565b91509150612e718161313a565b509392505050565b612e83838361332b565b612e906000848484612f02565b610ccb5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016109c6565b60006001600160a01b0384163b156130c2576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a0290612f5f903390899088908890600401613c8d565b602060405180830381600087803b158015612f7957600080fd5b505af1925050508015612fc7575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252612fc491810190613a10565b60015b613077573d808015612ff5576040519150601f19603f3d011682016040523d82523d6000602084013e612ffa565b606091505b50805161306f5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016109c6565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a02000000000000000000000000000000000000000000000000000000001490506122b8565b5060016122b8565b6000808251604114156131015760208301516040840151606085015160001a6130f587828585613491565b94509450505050613133565b82516040141561312b576020830151604084015161312086838361359c565b935093505050613133565b506000905060025b9250929050565b600081600481111561314e5761314e613e87565b14156131575750565b600181600481111561316b5761316b613e87565b14156131b95760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016109c6565b60028160048111156131cd576131cd613e87565b141561321b5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016109c6565b600381600481111561322f5761322f613e87565b14156132a35760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016109c6565b60048160048111156132b7576132b7613e87565b141561248f5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016109c6565b6001600160a01b0382166133815760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016109c6565b6000818152600260205260409020546001600160a01b0316156133e65760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016109c6565b6133f260008383612d5e565b6001600160a01b038216600090815260036020526040812080546001929061341b908490613cdc565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156134c85750600090506003613593565b8460ff16601b141580156134e057508460ff16601c14155b156134f15750600090506004613593565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015613545573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001519150506001600160a01b03811661358c57600060019250925050613593565b9150600090505b94509492505050565b6000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831660ff84901c601b016135d687828885613491565b935093505050935093915050565b8280546135f090613d88565b90600052602060002090601f0160209004810192826136125760008555613676565b82601f10613649578280017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00823516178555613676565b82800160010185558215613676579182015b8281111561367657823582559160200191906001019061365b565b506136829291506136fa565b5090565b82805461369290613d88565b90600052602060002090601f0160209004810192826136b45760008555613676565b82601f106136cd57805160ff1916838001178555613676565b82800160010185558215613676579182015b828111156136765782518255916020019190600101906136df565b5b8082111561368257600081556001016136fb565b8035801515811461371f57600080fd5b919050565b60008083601f84011261373657600080fd5b50813567ffffffffffffffff81111561374e57600080fd5b60208301915083602082850101111561313357600080fd5b600082601f83011261377757600080fd5b813567ffffffffffffffff8082111561379257613792613ee5565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156137d8576137d8613ee5565b816040528381528660208588010111156137f157600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561382357600080fd5b813561382e81613f14565b9392505050565b6000806040838503121561384857600080fd5b823561385381613f14565b9150602083013561386381613f14565b809150509250929050565b60008060006060848603121561388357600080fd5b833561388e81613f14565b9250602084013561389e81613f14565b929592945050506040919091013590565b600080600080608085870312156138c557600080fd5b84356138d081613f14565b935060208501356138e081613f14565b925060408501359150606085013567ffffffffffffffff81111561390357600080fd5b61390f87828801613766565b91505092959194509250565b6000806040838503121561392e57600080fd5b823561393981613f14565b91506139476020840161370f565b90509250929050565b6000806040838503121561396357600080fd5b823561396e81613f14565b946020939093013593505050565b6000806000806060858703121561399257600080fd5b843561399d81613f14565b935060208501359250604085013567ffffffffffffffff8111156139c057600080fd5b6139cc87828801613724565b95989497509550505050565b6000602082840312156139ea57600080fd5b61382e8261370f565b600060208284031215613a0557600080fd5b813561382e81613f29565b600060208284031215613a2257600080fd5b815161382e81613f29565b60008060208385031215613a4057600080fd5b823567ffffffffffffffff811115613a5757600080fd5b613a6385828601613724565b90969095509350505050565b600080600060408486031215613a8457600080fd5b833567ffffffffffffffff811115613a9b57600080fd5b613aa786828701613724565b909790965060209590950135949350505050565b600060208284031215613acd57600080fd5b5035919050565b60008060408385031215613ae757600080fd5b82359150602083013561386381613f14565b600080600060608486031215613b0e57600080fd5b8335925060208401359150604084013567ffffffffffffffff811115613b3357600080fd5b613b3f86828701613766565b9150509250925092565b60008151808452613b61816020860160208601613d5c565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60008151613ba5818560208601613d5c565b9290920192915050565b600080845481600182811c915080831680613bcb57607f831692505b6020808410821415613c04577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b818015613c185760018114613c4757613c74565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00861689528489019650613c74565b60008b81526020902060005b86811015613c6c5781548b820152908501908301613c53565b505084890196505b505050505050613c848185613b93565b95945050505050565b60006001600160a01b03808716835280861660208401525083604083015260806060830152613cbf6080830184613b49565b9695505050505050565b60208152600061382e6020830184613b49565b60008219821115613cef57613cef613e29565b500190565b600082613d0357613d03613e58565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613d4057613d40613e29565b500290565b600082821015613d5757613d57613e29565b500390565b60005b83811015613d77578181015183820152602001613d5f565b83811115610d9c5750506000910152565b600181811c90821680613d9c57607f821691505b60208210811415613dd6577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613e0e57613e0e613e29565b5060010190565b600082613e2457613e24613e58565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6001600160a01b038116811461248f57600080fd5b7fffffffff000000000000000000000000000000000000000000000000000000008116811461248f57600080fdfea264697066735822122049fde380ae5136f4917fa7a7d01e3ba15e0d6c5a4a904d72d95b66a27d57c59464736f6c63430008070033

Deployed Bytecode

0x6080604052600436106102fd5760003560e01c8063715018a61161018f578063a854ffba116100e1578063c87b56dd1161008a578063e985e9c511610064578063e985e9c514610802578063f2fde38b1461084b578063f83d08ba1461086b57600080fd5b8063c87b56dd146107a2578063e4f407cc146107c2578063e59ee014146107e257600080fd5b8063c002d23d116100bb578063c002d23d1461074c578063c1a3919414610767578063c3151fed1461078757600080fd5b8063a854ffba146106ec578063b2c94ee61461070c578063b88d4fde1461072c57600080fd5b80638ecad72111610143578063a0712d681161011d578063a0712d68146106a4578063a0c54078146106b7578063a22cb465146106cc57600080fd5b80638ecad7211461065a57806395d89b411461066f5780639d034fe91461068457600080fd5b80638a03dd7a116101745780638a03dd7a146106125780638d40fb4e146106275780638da5cb5b1461063c57600080fd5b8063715018a6146105e85780638456cb59146105fd57600080fd5b806342842e0e116102535780635c975abb116101fc5780636ab65915116101d65780636ab65915146105935780636c8b703f146105a857806370a08231146105c857600080fd5b80635c975abb146105245780636352211e14610554578063690cf0d11461057457600080fd5b806353df5c7c1161022d57806353df5c7c146104d557806355fc9893146104ea5780635c474f9e1461050a57600080fd5b806342842e0e1461048257806343774ebd146104a257806351cff8d9146104b557600080fd5b806309a3beef116102b55780632aa148fd1161028f5780632aa148fd1461043757806332cb6b0c146104575780633f4ba83a1461046d57600080fd5b806309a3beef146103d357806318160ddd146103f357806323b872dd1461041757600080fd5b806306fdde03116102e657806306fdde0314610359578063081812fc1461037b578063095ea7b3146103b357600080fd5b806301ffc9a714610302578063046dc16614610337575b600080fd5b34801561030e57600080fd5b5061032261031d3660046139f3565b61088b565b60405190151581526020015b60405180910390f35b34801561034357600080fd5b50610357610352366004613811565b610970565b005b34801561036557600080fd5b5061036e610a66565b60405161032e9190613cc9565b34801561038757600080fd5b5061039b610396366004613abb565b610af8565b6040516001600160a01b03909116815260200161032e565b3480156103bf57600080fd5b506103576103ce366004613950565b610b9e565b3480156103df57600080fd5b506103576103ee366004613a6f565b610cd0565b3480156103ff57600080fd5b5061040960095481565b60405190815260200161032e565b34801561042357600080fd5b5061035761043236600461386e565b610da2565b34801561044357600080fd5b50600a5461039b906001600160a01b031681565b34801561046357600080fd5b5061040961115c81565b34801561047957600080fd5b50610357610e29565b34801561048e57600080fd5b5061035761049d36600461386e565b610ef7565b6103576104b0366004613af9565b610f12565b3480156104c157600080fd5b506103576104d0366004613811565b61126a565b3480156104e157600080fd5b506103576113a3565b3480156104f657600080fd5b50610357610505366004613a2d565b611485565b34801561051657600080fd5b506008546103229060ff1681565b34801561053057600080fd5b5060065474010000000000000000000000000000000000000000900460ff16610322565b34801561056057600080fd5b5061039b61056f366004613abb565b611563565b34801561058057600080fd5b5060085461032290610100900460ff1681565b34801561059f57600080fd5b50610409600a81565b3480156105b457600080fd5b5061036e6105c3366004613abb565b6115ee565b3480156105d457600080fd5b506104096105e3366004613811565b611688565b3480156105f457600080fd5b50610357611722565b34801561060957600080fd5b50610357611786565b34801561061e57600080fd5b50610357611853565b34801561063357600080fd5b5061036e611947565b34801561064857600080fd5b506006546001600160a01b031661039b565b34801561066657600080fd5b50610409600581565b34801561067b57600080fd5b5061036e611954565b34801561069057600080fd5b5061035761069f366004613ad4565b611963565b6103576106b2366004613abb565b611ab9565b3480156106c357600080fd5b5061036e611cc2565b3480156106d857600080fd5b506103576106e736600461391b565b611ccf565b3480156106f857600080fd5b506103576107073660046139d8565b611cda565b34801561071857600080fd5b50610357610727366004613a2d565b611dbe565b34801561073857600080fd5b506103576107473660046138af565b611e9c565b34801561075857600080fd5b5061040966d529ae9e86000081565b34801561077357600080fd5b50610357610782366004613811565b611f24565b34801561079357600080fd5b5061040966f8b0a10e47000081565b3480156107ae57600080fd5b5061036e6107bd366004613abb565b61206c565b3480156107ce57600080fd5b506103226107dd36600461397c565b61220a565b3480156107ee57600080fd5b506103576107fd3660046139d8565b6122c0565b34801561080e57600080fd5b5061032261081d366004613835565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561085757600080fd5b50610357610866366004613811565b6123b0565b34801561087757600080fd5b506008546103229062010000900460ff1681565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061091e57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061096a57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6006546001600160a01b031633146109cf5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6001600160a01b038116610a255760405162461bcd60e51b815260206004820152601360248201527f5349474e45525f414444524553535f5a45524f0000000000000000000000000060448201526064016109c6565b600880546001600160a01b039092166301000000027fffffffffffffffffff0000000000000000000000000000000000000000ffffff909216919091179055565b606060008054610a7590613d88565b80601f0160208091040260200160405190810160405280929190818152602001828054610aa190613d88565b8015610aee5780601f10610ac357610100808354040283529160200191610aee565b820191906000526020600020905b815481529060010190602001808311610ad157829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610b825760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084016109c6565b506000908152600460205260409020546001600160a01b031690565b6000610ba982611563565b9050806001600160a01b0316836001600160a01b03161415610c335760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084016109c6565b336001600160a01b0382161480610c4f5750610c4f813361081d565b610cc15760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016109c6565b610ccb8383612492565b505050565b6006546001600160a01b03163314610d2a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109c6565b60085462010000900460ff1615610d835760405162461bcd60e51b815260206004820152600e60248201527f414c52454144595f4c4f434b454400000000000000000000000000000000000060448201526064016109c6565b6000818152600d60205260409020610d9c9084846135e4565b50505050565b610dac3382612518565b610e1e5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016109c6565b610ccb83838361261c565b6006546001600160a01b03163314610e835760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109c6565b60065474010000000000000000000000000000000000000000900460ff16610eed5760405162461bcd60e51b815260206004820152601060248201527f414c52454144595f554e5041555345440000000000000000000000000000000060448201526064016109c6565b610ef561280c565b565b610ccb83838360405180602001604052806000815250611e9c565b600854610100900460ff16610f695760405162461bcd60e51b815260206004820152601060248201527f4d494e545f4e4f545f535441525445440000000000000000000000000000000060448201526064016109c6565b600083118015610f795750818311155b610fc55760405162461bcd60e51b815260206004820152600d60248201527f434f554e545f494e56414c49440000000000000000000000000000000000000060448201526064016109c6565b61115c83600954610fd69190613cdc565b11156110245760405162461bcd60e51b815260206004820152601260248201527f4d41585f535550504c595f52454143484544000000000000000000000000000060448201526064016109c6565b600a60095410156110775760405162461bcd60e51b815260206004820152601460248201527f4c4547454e444152595f4e4f545f4d494e54454400000000000000000000000060448201526064016109c6565b61108866d529ae9e86000084613d08565b34146110d65760405162461bcd60e51b815260206004820152601060248201527f494e56414c49445f4554485f53454e540000000000000000000000000000000060448201526064016109c6565b600033604080516001600160a01b0390921660208301528101849052606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152600790935291205490915060ff161561118b5760405162461bcd60e51b815260206004820152601160248201527f484153485f414c52454144595f5553454400000000000000000000000000000060448201526064016109c6565b61119581836128de565b6111e15760405162461bcd60e51b815260206004820152600e60248201527f494e56414c49445f5349474e455200000000000000000000000000000000000060448201526064016109c6565b600081815260076020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091555b84811161124c5761123a33826009546112359190613cdc565b612960565b8061124481613ddc565b91505061121c565b50836009600082825461125f9190613cdc565b909155505050505050565b6006546001600160a01b031633146112c45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109c6565b6001600160a01b03811661131a5760405162461bcd60e51b815260206004820152601560248201527f57495448445241575f414444524553535f5a45524f000000000000000000000060448201526064016109c6565b6000471161136a5760405162461bcd60e51b815260206004820152600d60248201527f454d5054595f42414c414e43450000000000000000000000000000000000000060448201526064016109c6565b6040516001600160a01b038216904780156108fc02916000818181858888f1935050505015801561139f573d6000803e3d6000fd5b5050565b6006546001600160a01b031633146113fd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109c6565b60085462010000900460ff16156114565760405162461bcd60e51b815260206004820152600e60248201527f414c52454144595f4c4f434b454400000000000000000000000000000000000060448201526064016109c6565b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff1662010000179055565b6006546001600160a01b031633146114df5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109c6565b60085462010000900460ff16156115385760405162461bcd60e51b815260206004820152600e60248201527f414c52454144595f4c4f434b454400000000000000000000000000000000000060448201526064016109c6565b611544600c83836135e4565b50604080516020810191829052600090819052610ccb91600b91613686565b6000818152600260205260408120546001600160a01b03168061096a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e000000000000000000000000000000000000000000000060648201526084016109c6565b600d602052600090815260409020805461160790613d88565b80601f016020809104026020016040519081016040528092919081815260200182805461163390613d88565b80156116805780601f1061165557610100808354040283529160200191611680565b820191906000526020600020905b81548152906001019060200180831161166357829003601f168201915b505050505081565b60006001600160a01b0382166117065760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f20616464726573730000000000000000000000000000000000000000000060648201526084016109c6565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b0316331461177c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109c6565b610ef5600061297a565b6006546001600160a01b031633146117e05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109c6565b60065474010000000000000000000000000000000000000000900460ff161561184b5760405162461bcd60e51b815260206004820152600e60248201527f414c52454144595f50415553454400000000000000000000000000000000000060448201526064016109c6565b610ef56129e4565b6006546001600160a01b031633146118ad5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109c6565b600954156118fd5760405162461bcd60e51b815260206004820152601460248201527f4d494e545f414c52454144595f5354415254454400000000000000000000000060448201526064016109c6565b60015b600a811161192c5761191a33826009546112359190613cdc565b8061192481613ddc565b915050611900565b50600a600960008282546119409190613cdc565b9091555050565b600c805461160790613d88565b606060018054610a7590613d88565b6006546001600160a01b031633146119bd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109c6565b61115c826009546119ce9190613cdc565b1115611a1c5760405162461bcd60e51b815260206004820152601260248201527f4d41585f535550504c595f52454143484544000000000000000000000000000060448201526064016109c6565b600a6009541015611a6f5760405162461bcd60e51b815260206004820152601460248201527f4c4547454e444152595f4e4f545f4d494e54454400000000000000000000000060448201526064016109c6565b60015b828111611a9d57611a8b82826009546112359190613cdc565b80611a9581613ddc565b915050611a72565b508160096000828254611ab09190613cdc565b90915550505050565b60085460ff16611b0b5760405162461bcd60e51b815260206004820152601060248201527f4d494e545f4e4f545f535441525445440000000000000000000000000000000060448201526064016109c6565b600081118015611b1c575060058111155b611b685760405162461bcd60e51b815260206004820152600d60248201527f434f554e545f494e56414c49440000000000000000000000000000000000000060448201526064016109c6565b600a6009541015611bbb5760405162461bcd60e51b815260206004820152601460248201527f4c4547454e444152595f4e4f545f4d494e54454400000000000000000000000060448201526064016109c6565b61115c81600954611bcc9190613cdc565b1115611c1a5760405162461bcd60e51b815260206004820152601260248201527f4d41585f535550504c595f52454143484544000000000000000000000000000060448201526064016109c6565b611c2b66f8b0a10e47000082613d08565b3414611c795760405162461bcd60e51b815260206004820152601060248201527f494e56414c49445f4554485f53454e540000000000000000000000000000000060448201526064016109c6565b60015b818111611ca757611c9533826009546112359190613cdc565b80611c9f81613ddc565b915050611c7c565b508060096000828254611cba9190613cdc565b909155505050565b600b805461160790613d88565b61139f338383612ab6565b6006546001600160a01b03163314611d345760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109c6565b60085460ff1615158115151415611d8d5760405162461bcd60e51b815260206004820152601860248201527f53414c455f535441525445445f414c52454144595f534554000000000000000060448201526064016109c6565b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b6006546001600160a01b03163314611e185760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109c6565b60085462010000900460ff1615611e715760405162461bcd60e51b815260206004820152600e60248201527f414c52454144595f4c4f434b454400000000000000000000000000000000000060448201526064016109c6565b611e7d600b83836135e4565b50604080516020810191829052600090819052610ccb91600c91613686565b611ea63383612518565b611f185760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016109c6565b610d9c84848484612ba3565b6006546001600160a01b03163314611f7e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109c6565b600a546001600160a01b0382811691161415611fdc5760405162461bcd60e51b815260206004820152601160248201527f544f4b454e5f414c52454144595f53455400000000000000000000000000000060448201526064016109c6565b6001600160a01b0381166120325760405162461bcd60e51b815260206004820152601260248201527f544f4b454e5f414444524553535f5a45524f000000000000000000000000000060448201526064016109c6565b600a80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6000818152600260205260409020546060906001600160a01b03166120f95760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e000000000000000000000000000000000060648201526084016109c6565b6000828152600d60205260409020805461211290613d88565b1590506121b7576000828152600d60205260409020805461213290613d88565b80601f016020809104026020016040519081016040528092919081815260200182805461215e90613d88565b80156121ab5780601f10612180576101008083540402835291602001916121ab565b820191906000526020600020905b81548152906001019060200180831161218e57829003601f168201915b50505050509050919050565b600c80546121c490613d88565b1590506121d857600c805461213290613d88565b600b6121e383612c2c565b6040516020016121f4929190613baf565b6040516020818303038152906040529050919050565b604080516001600160a01b038616602082015290810184905260009081906060016040516020818303038152906040528051906020012090506122838185858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506128de92505050565b6122915760009150506122b8565b60008181526007602052604090205460ff16156122b25760009150506122b8565b60019150505b949350505050565b6006546001600160a01b0316331461231a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109c6565b60085460ff61010090910416151581151514156123795760405162461bcd60e51b815260206004820152601860248201527f53414c455f535441525445445f414c52454144595f534554000000000000000060448201526064016109c6565b60088054911515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909216919091179055565b6006546001600160a01b0316331461240a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109c6565b6001600160a01b0381166124865760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016109c6565b61248f8161297a565b50565b600081815260046020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03841690811790915581906124df82611563565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166125a25760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084016109c6565b60006125ad83611563565b9050806001600160a01b0316846001600160a01b031614806125e85750836001600160a01b03166125dd84610af8565b6001600160a01b0316145b806122b857506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff166122b8565b826001600160a01b031661262f82611563565b6001600160a01b0316146126ab5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e000000000000000000000000000000000000000000000060648201526084016109c6565b6001600160a01b0382166127265760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016109c6565b612731838383612d5e565b61273c600082612492565b6001600160a01b0383166000908152600360205260408120805460019290612765908490613d45565b90915550506001600160a01b0382166000908152600360205260408120805460019290612793908490613cdc565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60065474010000000000000000000000000000000000000000900460ff166128765760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f742070617573656400000000000000000000000060448201526064016109c6565b600680547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600061294061293a846040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b83612e55565b600854630100000090046001600160a01b03908116911614905092915050565b61139f828260405180602001604052806000815250612e79565b600680546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60065474010000000000000000000000000000000000000000900460ff1615612a4f5760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a207061757365640000000000000000000000000000000060448201526064016109c6565b600680547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586128c13390565b816001600160a01b0316836001600160a01b03161415612b185760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016109c6565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612bae84848461261c565b612bba84848484612f02565b610d9c5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016109c6565b606081612c6c57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612c965780612c8081613ddc565b9150612c8f9050600a83613cf4565b9150612c70565b60008167ffffffffffffffff811115612cb157612cb1613ee5565b6040519080825280601f01601f191660200182016040528015612cdb576020820181803683370190505b5090505b84156122b857612cf0600183613d45565b9150612cfd600a86613e15565b612d08906030613cdc565b60f81b818381518110612d1d57612d1d613eb6565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612d57600a86613cf4565b9450612cdf565b60065474010000000000000000000000000000000000000000900460ff1615612dc95760405162461bcd60e51b815260206004820152600f60248201527f5452414e534645525f504155534544000000000000000000000000000000000060448201526064016109c6565b600a546040517f2c8e8dfa0000000000000000000000000000000000000000000000000000000081526001600160a01b03858116600483015284811660248301526044820184905290911690632c8e8dfa90606401600060405180830381600087803b158015612e3857600080fd5b505af1158015612e4c573d6000803e3d6000fd5b50505050505050565b6000806000612e6485856130ca565b91509150612e718161313a565b509392505050565b612e83838361332b565b612e906000848484612f02565b610ccb5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016109c6565b60006001600160a01b0384163b156130c2576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a0290612f5f903390899088908890600401613c8d565b602060405180830381600087803b158015612f7957600080fd5b505af1925050508015612fc7575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252612fc491810190613a10565b60015b613077573d808015612ff5576040519150601f19603f3d011682016040523d82523d6000602084013e612ffa565b606091505b50805161306f5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016109c6565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a02000000000000000000000000000000000000000000000000000000001490506122b8565b5060016122b8565b6000808251604114156131015760208301516040840151606085015160001a6130f587828585613491565b94509450505050613133565b82516040141561312b576020830151604084015161312086838361359c565b935093505050613133565b506000905060025b9250929050565b600081600481111561314e5761314e613e87565b14156131575750565b600181600481111561316b5761316b613e87565b14156131b95760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016109c6565b60028160048111156131cd576131cd613e87565b141561321b5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016109c6565b600381600481111561322f5761322f613e87565b14156132a35760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016109c6565b60048160048111156132b7576132b7613e87565b141561248f5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016109c6565b6001600160a01b0382166133815760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016109c6565b6000818152600260205260409020546001600160a01b0316156133e65760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016109c6565b6133f260008383612d5e565b6001600160a01b038216600090815260036020526040812080546001929061341b908490613cdc565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156134c85750600090506003613593565b8460ff16601b141580156134e057508460ff16601c14155b156134f15750600090506004613593565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015613545573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001519150506001600160a01b03811661358c57600060019250925050613593565b9150600090505b94509492505050565b6000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831660ff84901c601b016135d687828885613491565b935093505050935093915050565b8280546135f090613d88565b90600052602060002090601f0160209004810192826136125760008555613676565b82601f10613649578280017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00823516178555613676565b82800160010185558215613676579182015b8281111561367657823582559160200191906001019061365b565b506136829291506136fa565b5090565b82805461369290613d88565b90600052602060002090601f0160209004810192826136b45760008555613676565b82601f106136cd57805160ff1916838001178555613676565b82800160010185558215613676579182015b828111156136765782518255916020019190600101906136df565b5b8082111561368257600081556001016136fb565b8035801515811461371f57600080fd5b919050565b60008083601f84011261373657600080fd5b50813567ffffffffffffffff81111561374e57600080fd5b60208301915083602082850101111561313357600080fd5b600082601f83011261377757600080fd5b813567ffffffffffffffff8082111561379257613792613ee5565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156137d8576137d8613ee5565b816040528381528660208588010111156137f157600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561382357600080fd5b813561382e81613f14565b9392505050565b6000806040838503121561384857600080fd5b823561385381613f14565b9150602083013561386381613f14565b809150509250929050565b60008060006060848603121561388357600080fd5b833561388e81613f14565b9250602084013561389e81613f14565b929592945050506040919091013590565b600080600080608085870312156138c557600080fd5b84356138d081613f14565b935060208501356138e081613f14565b925060408501359150606085013567ffffffffffffffff81111561390357600080fd5b61390f87828801613766565b91505092959194509250565b6000806040838503121561392e57600080fd5b823561393981613f14565b91506139476020840161370f565b90509250929050565b6000806040838503121561396357600080fd5b823561396e81613f14565b946020939093013593505050565b6000806000806060858703121561399257600080fd5b843561399d81613f14565b935060208501359250604085013567ffffffffffffffff8111156139c057600080fd5b6139cc87828801613724565b95989497509550505050565b6000602082840312156139ea57600080fd5b61382e8261370f565b600060208284031215613a0557600080fd5b813561382e81613f29565b600060208284031215613a2257600080fd5b815161382e81613f29565b60008060208385031215613a4057600080fd5b823567ffffffffffffffff811115613a5757600080fd5b613a6385828601613724565b90969095509350505050565b600080600060408486031215613a8457600080fd5b833567ffffffffffffffff811115613a9b57600080fd5b613aa786828701613724565b909790965060209590950135949350505050565b600060208284031215613acd57600080fd5b5035919050565b60008060408385031215613ae757600080fd5b82359150602083013561386381613f14565b600080600060608486031215613b0e57600080fd5b8335925060208401359150604084013567ffffffffffffffff811115613b3357600080fd5b613b3f86828701613766565b9150509250925092565b60008151808452613b61816020860160208601613d5c565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60008151613ba5818560208601613d5c565b9290920192915050565b600080845481600182811c915080831680613bcb57607f831692505b6020808410821415613c04577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b818015613c185760018114613c4757613c74565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00861689528489019650613c74565b60008b81526020902060005b86811015613c6c5781548b820152908501908301613c53565b505084890196505b505050505050613c848185613b93565b95945050505050565b60006001600160a01b03808716835280861660208401525083604083015260806060830152613cbf6080830184613b49565b9695505050505050565b60208152600061382e6020830184613b49565b60008219821115613cef57613cef613e29565b500190565b600082613d0357613d03613e58565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613d4057613d40613e29565b500290565b600082821015613d5757613d57613e29565b500390565b60005b83811015613d77578181015183820152602001613d5f565b83811115610d9c5750506000910152565b600181811c90821680613d9c57607f821691505b60208210811415613dd6577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613e0e57613e0e613e29565b5060010190565b600082613e2457613e24613e58565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6001600160a01b038116811461248f57600080fd5b7fffffffff000000000000000000000000000000000000000000000000000000008116811461248f57600080fdfea264697066735822122049fde380ae5136f4917fa7a7d01e3ba15e0d6c5a4a904d72d95b66a27d57c59464736f6c63430008070033

Deployed Bytecode Sourcemap

48822:6273:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36116:305;;;;;;;;;;-1:-1:-1;36116:305:0;;;;;:::i;:::-;;:::i;:::-;;;10966:14:1;;10959:22;10941:41;;10929:2;10914:18;36116:305:0;;;;;;;;53478:169;;;;;;;;;;-1:-1:-1;53478:169:0;;;;;:::i;:::-;;:::i;:::-;;37061:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;38620:221::-;;;;;;;;;;-1:-1:-1;38620:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;9513:55:1;;;9495:74;;9483:2;9468:18;38620:221:0;9349:226:1;38143:411:0;;;;;;;;;;-1:-1:-1;38143:411:0;;;;;:::i;:::-;;:::i;54126:168::-;;;;;;;;;;-1:-1:-1;54126:168:0;;;;;:::i;:::-;;:::i;49376:30::-;;;;;;;;;;;;;;;;;;;26837:25:1;;;26825:2;26810:18;49376:30:0;26691:177:1;39370:339:0;;;;;;;;;;-1:-1:-1;39370:339:0;;;;;:::i;:::-;;:::i;49413:29::-;;;;;;;;;;-1:-1:-1;49413:29:0;;;;-1:-1:-1;;;;;49413:29:0;;;48909:41;;;;;;;;;;;;48946:4;48909:41;;54671:115;;;;;;;;;;;;;:::i;39780:185::-;;;;;;;;;;-1:-1:-1;39780:185:0;;;;;:::i;:::-;;:::i;50286:879::-;;;;;;:::i;:::-;;:::i;52851:236::-;;;;;;;;;;-1:-1:-1;52851:236:0;;;;;:::i;:::-;;:::i;53655:115::-;;;;;;;;;;;;;:::i;53952:166::-;;;;;;;;;;-1:-1:-1;53952:166:0;;;;;:::i;:::-;;:::i;49229:31::-;;;;;;;;;;-1:-1:-1;49229:31:0;;;;;;;;21848:86;;;;;;;;;;-1:-1:-1;21919:7:0;;;;;;;21848:86;;36755:239;;;;;;;;;;-1:-1:-1;36755:239:0;;;;;:::i;:::-;;:::i;49267:34::-;;;;;;;;;;-1:-1:-1;49267:34:0;;;;;;;;;;;49122:45;;;;;;;;;;;;49165:2;49122:45;;49513:43;;;;;;;;;;-1:-1:-1;49513:43:0;;;;;:::i;:::-;;:::i;36485:208::-;;;;;;;;;;-1:-1:-1;36485:208:0;;;;;:::i;:::-;;:::i;19899:103::-;;;;;;;;;;;;;:::i;54553:110::-;;;;;;;;;;;;;:::i;49619:277::-;;;;;;;;;;;;;:::i;49481:23::-;;;;;;;;;;;;;:::i;19248:87::-;;;;;;;;;;-1:-1:-1;19321:6:0;;-1:-1:-1;;;;;19321:6:0;19248:87;;49072:43;;;;;;;;;;;;49114:1;49072:43;;37230:104;;;;;;;;;;;;;:::i;49904:374::-;;;;;;;;;;-1:-1:-1;49904:374:0;;;;;:::i;:::-;;:::i;51796:559::-;;;;;;:::i;:::-;;:::i;49451:23::-;;;;;;;;;;;;;:::i;38913:155::-;;;;;;;;;;-1:-1:-1;38913:155:0;;;;;:::i;:::-;;:::i;53095:179::-;;;;;;;;;;-1:-1:-1;53095:179:0;;;;;:::i;:::-;;:::i;53778:166::-;;;;;;;;;;-1:-1:-1;53778:166:0;;;;;:::i;:::-;;:::i;40036:328::-;;;;;;;;;;-1:-1:-1;40036:328:0;;;;;:::i;:::-;;:::i;48957:47::-;;;;;;;;;;;;48994:10;48957:47;;54302:241;;;;;;;;;;-1:-1:-1;54302:241:0;;;;;:::i;:::-;;:::i;49011:54::-;;;;;;;;;;;;49055:10;49011:54;;52363:448;;;;;;;;;;-1:-1:-1;52363:448:0;;;;;:::i;:::-;;:::i;51376:390::-;;;;;;;;;;-1:-1:-1;51376:390:0;;;;;:::i;:::-;;:::i;53282:188::-;;;;;;;;;;-1:-1:-1;53282:188:0;;;;;:::i;:::-;;:::i;39139:164::-;;;;;;;;;;-1:-1:-1;39139:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;39260:25:0;;;39236:4;39260:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;39139:164;20157:201;;;;;;;;;;-1:-1:-1;20157:201:0;;;;;:::i;:::-;;:::i;49308:24::-;;;;;;;;;;-1:-1:-1;49308:24:0;;;;;;;;;;;36116:305;36218:4;36255:40;;;36270:25;36255:40;;:105;;-1:-1:-1;36312:48:0;;;36327:33;36312:48;36255:105;:158;;;-1:-1:-1;11578:25:0;11563:40;;;;36377:36;36235:178;36116:305;-1:-1:-1;;36116:305:0:o;53478:169::-;19321:6;;-1:-1:-1;;;;;19321:6:0;18052:10;19468:23;19460:68;;;;-1:-1:-1;;;19460:68:0;;22821:2:1;19460:68:0;;;22803:21:1;;;22840:18;;;22833:30;22899:34;22879:18;;;22872:62;22951:18;;19460:68:0;;;;;;;;;-1:-1:-1;;;;;53559:21:0;::::1;53551:53;;;::::0;-1:-1:-1;;;53551:53:0;;17507:2:1;53551:53:0::1;::::0;::::1;17489:21:1::0;17546:2;17526:18;;;17519:30;17585:21;17565:18;;;17558:49;17624:18;;53551:53:0::1;17305:343:1::0;53551:53:0::1;53615:14;:24:::0;;-1:-1:-1;;;;;53615:24:0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;53478:169::o;37061:100::-;37115:13;37148:5;37141:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37061:100;:::o;38620:221::-;38696:7;41963:16;;;:7;:16;;;;;;-1:-1:-1;;;;;41963:16:0;38716:73;;;;-1:-1:-1;;;38716:73:0;;22064:2:1;38716:73:0;;;22046:21:1;22103:2;22083:18;;;22076:30;22142:34;22122:18;;;22115:62;22213:14;22193:18;;;22186:42;22245:19;;38716:73:0;21862:408:1;38716:73:0;-1:-1:-1;38809:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;38809:24:0;;38620:221::o;38143:411::-;38224:13;38240:23;38255:7;38240:14;:23::i;:::-;38224:39;;38288:5;-1:-1:-1;;;;;38282:11:0;:2;-1:-1:-1;;;;;38282:11:0;;;38274:57;;;;-1:-1:-1;;;38274:57:0;;24008:2:1;38274:57:0;;;23990:21:1;24047:2;24027:18;;;24020:30;24086:34;24066:18;;;24059:62;24157:3;24137:18;;;24130:31;24178:19;;38274:57:0;23806:397:1;38274:57:0;18052:10;-1:-1:-1;;;;;38366:21:0;;;;:62;;-1:-1:-1;38391:37:0;38408:5;18052:10;39139:164;:::i;38391:37::-;38344:168;;;;-1:-1:-1;;;38344:168:0;;19362:2:1;38344:168:0;;;19344:21:1;19401:2;19381:18;;;19374:30;19440:34;19420:18;;;19413:62;19511:26;19491:18;;;19484:54;19555:19;;38344:168:0;19160:420:1;38344:168:0;38525:21;38534:2;38538:7;38525:8;:21::i;:::-;38213:341;38143:411;;:::o;54126:168::-;19321:6;;-1:-1:-1;;;;;19321:6:0;18052:10;19468:23;19460:68;;;;-1:-1:-1;;;19460:68:0;;22821:2:1;19460:68:0;;;22803:21:1;;;22840:18;;;22833:30;22899:34;22879:18;;;22872:62;22951:18;;19460:68:0;22619:356:1;19460:68:0;54226:4:::1;::::0;;;::::1;;;54225:5;54217:32;;;::::0;-1:-1:-1;;;54217:32:0;;20957:2:1;54217:32:0::1;::::0;::::1;20939:21:1::0;20996:2;20976:18;;;20969:30;21035:16;21015:18;;;21008:44;21069:18;;54217:32:0::1;20755:338:1::0;54217:32:0::1;54260:19;::::0;;;:9:::1;:19;::::0;;;;:26:::1;::::0;54282:4;;54260:26:::1;:::i;:::-;;54126:168:::0;;;:::o;39370:339::-;39565:41;18052:10;39598:7;39565:18;:41::i;:::-;39557:103;;;;-1:-1:-1;;;39557:103:0;;24753:2:1;39557:103:0;;;24735:21:1;24792:2;24772:18;;;24765:30;24831:34;24811:18;;;24804:62;24902:19;24882:18;;;24875:47;24939:19;;39557:103:0;24551:413:1;39557:103:0;39673:28;39683:4;39689:2;39693:7;39673:9;:28::i;54671:115::-;19321:6;;-1:-1:-1;;;;;19321:6:0;18052:10;19468:23;19460:68;;;;-1:-1:-1;;;19460:68:0;;22821:2:1;19460:68:0;;;22803:21:1;;;22840:18;;;22833:30;22899:34;22879:18;;;22872:62;22951:18;;19460:68:0;22619:356:1;19460:68:0;21919:7;;;;;;;54720:37:::1;;;::::0;-1:-1:-1;;;54720:37:0;;13126:2:1;54720:37:0::1;::::0;::::1;13108:21:1::0;13165:2;13145:18;;;13138:30;13204:18;13184;;;13177:46;13240:18;;54720:37:0::1;12924:340:1::0;54720:37:0::1;54768:10;:8;:10::i;:::-;54671:115::o:0;39780:185::-;39918:39;39935:4;39941:2;39945:7;39918:39;;;;;;;;;;;;:16;:39::i;50286:879::-;50450:14;;;;;;;50442:43;;;;-1:-1:-1;;;50442:43:0;;15006:2:1;50442:43:0;;;14988:21:1;15045:2;15025:18;;;15018:30;15084:18;15064;;;15057:46;15120:18;;50442:43:0;14804:340:1;50442:43:0;50513:1;50504:6;:10;:33;;;;;50528:9;50518:6;:19;;50504:33;50496:59;;;;-1:-1:-1;;;50496:59:0;;25859:2:1;50496:59:0;;;25841:21:1;25898:2;25878:18;;;25871:30;25937:15;25917:18;;;25910:43;25970:18;;50496:59:0;25657:337:1;50496:59:0;48946:4;50588:6;50574:11;;:20;;;;:::i;:::-;:34;;50566:65;;;;-1:-1:-1;;;50566:65:0;;26201:2:1;50566:65:0;;;26183:21:1;26240:2;26220:18;;;26213:30;26279:20;26259:18;;;26252:48;26317:18;;50566:65:0;25999:342:1;50566:65:0;49165:2;50650:11;;:31;;50642:64;;;;-1:-1:-1;;;50642:64:0;;20608:2:1;50642:64:0;;;20590:21:1;20647:2;20627:18;;;20620:30;20686:22;20666:18;;;20659:50;20726:18;;50642:64:0;20406:344:1;50642:64:0;50739:19;48994:10;50739:6;:19;:::i;:::-;50725:9;:34;50717:63;;;;-1:-1:-1;;;50717:63:0;;26548:2:1;50717:63:0;;;26530:21:1;26587:2;26567:18;;;26560:30;26626:18;26606;;;26599:46;26662:18;;50717:63:0;26346:340:1;50717:63:0;50793:12;18052:10;50818:35;;;-1:-1:-1;;;;;10691:55:1;;;50818:35:0;;;10673:74:1;10763:18;;10756:34;;;10646:18;;50818:35:0;;;;;;;;;;;;;50808:46;;50818:35;50808:46;;;;50874:17;;;;:11;:17;;;;;;50808:46;;-1:-1:-1;50874:17:0;;50873:18;50865:48;;;;-1:-1:-1;;;50865:48:0;;18671:2:1;50865:48:0;;;18653:21:1;18710:2;18690:18;;;18683:30;18749:19;18729:18;;;18722:47;18786:18;;50865:48:0;18469:341:1;50865:48:0;50932:24;50945:4;50951;50932:12;:24::i;:::-;50924:51;;;;-1:-1:-1;;;50924:51:0;;24410:2:1;50924:51:0;;;24392:21:1;24449:2;24429:18;;;24422:30;24488:16;24468:18;;;24461:44;24522:18;;50924:51:0;24208:338:1;50924:51:0;50988:17;;;;:11;:17;;;;;:24;;;;51008:4;50988:24;;;;;;51023:103;51048:6;51043:1;:11;51023:103;;51076:38;51086:10;51112:1;51098:11;;:15;;;;:::i;:::-;51076:9;:38::i;:::-;51056:3;;;;:::i;:::-;;;;51023:103;;;;51151:6;51136:11;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;50286:879:0:o;52851:236::-;19321:6;;-1:-1:-1;;;;;19321:6:0;18052:10;19468:23;19460:68;;;;-1:-1:-1;;;19460:68:0;;22821:2:1;19460:68:0;;;22803:21:1;;;22840:18;;;22833:30;22899:34;22879:18;;;22872:62;22951:18;;19460:68:0;22619:356:1;19460:68:0;-1:-1:-1;;;;;52928:17:0;::::1;52920:51;;;::::0;-1:-1:-1;;;52920:51:0;;17157:2:1;52920:51:0::1;::::0;::::1;17139:21:1::0;17196:2;17176:18;;;17169:30;17235:23;17215:18;;;17208:51;17276:18;;52920:51:0::1;16955:345:1::0;52920:51:0::1;53014:1;52990:21;:25;52982:51;;;::::0;-1:-1:-1;;;52982:51:0;;25171:2:1;52982:51:0::1;::::0;::::1;25153:21:1::0;25210:2;25190:18;;;25183:30;25249:15;25229:18;;;25222:43;25282:18;;52982:51:0::1;24969:337:1::0;52982:51:0::1;53044:35;::::0;-1:-1:-1;;;;;53044:12:0;::::1;::::0;53057:21:::1;53044:35:::0;::::1;;;::::0;::::1;::::0;;;53057:21;53044:12;:35;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;52851:236:::0;:::o;53655:115::-;19321:6;;-1:-1:-1;;;;;19321:6:0;18052:10;19468:23;19460:68;;;;-1:-1:-1;;;19460:68:0;;22821:2:1;19460:68:0;;;22803:21:1;;;22840:18;;;22833:30;22899:34;22879:18;;;22872:62;22951:18;;19460:68:0;22619:356:1;19460:68:0;53717:4:::1;::::0;;;::::1;;;53716:5;53708:32;;;::::0;-1:-1:-1;;;53708:32:0;;20957:2:1;53708:32:0::1;::::0;::::1;20939:21:1::0;20996:2;20976:18;;;20969:30;21035:16;21015:18;;;21008:44;21069:18;;53708:32:0::1;20755:338:1::0;53708:32:0::1;53751:4;:11:::0;;;::::1;::::0;::::1;::::0;;53655:115::o;53952:166::-;19321:6;;-1:-1:-1;;;;;19321:6:0;18052:10;19468:23;19460:68;;;;-1:-1:-1;;;19460:68:0;;22821:2:1;19460:68:0;;;22803:21:1;;;22840:18;;;22833:30;22899:34;22879:18;;;22872:62;22951:18;;19460:68:0;22619:356:1;19460:68:0;54035:4:::1;::::0;;;::::1;;;54034:5;54026:32;;;::::0;-1:-1:-1;;;54026:32:0;;20957:2:1;54026:32:0::1;::::0;::::1;20939:21:1::0;20996:2;20976:18;;;20969:30;21035:16;21015:18;;;21008:44;21069:18;;54026:32:0::1;20755:338:1::0;54026:32:0::1;54069:16;:9;54081:4:::0;;54069:16:::1;:::i;:::-;-1:-1:-1::0;54096:14:0::1;::::0;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;54096:14:0;;;;::::1;::::0;:9:::1;::::0;:14:::1;:::i;36755:239::-:0;36827:7;36863:16;;;:7;:16;;;;;;-1:-1:-1;;;;;36863:16:0;36898:19;36890:73;;;;-1:-1:-1;;;36890:73:0;;20198:2:1;36890:73:0;;;20180:21:1;20237:2;20217:18;;;20210:30;20276:34;20256:18;;;20249:62;20347:11;20327:18;;;20320:39;20376:19;;36890:73:0;19996:405:1;49513:43:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;36485:208::-;36557:7;-1:-1:-1;;;;;36585:19:0;;36577:74;;;;-1:-1:-1;;;36577:74:0;;19787:2:1;36577:74:0;;;19769:21:1;19826:2;19806:18;;;19799:30;19865:34;19845:18;;;19838:62;19936:12;19916:18;;;19909:40;19966:19;;36577:74:0;19585:406:1;36577:74:0;-1:-1:-1;;;;;;36669:16:0;;;;;:9;:16;;;;;;;36485:208::o;19899:103::-;19321:6;;-1:-1:-1;;;;;19321:6:0;18052:10;19468:23;19460:68;;;;-1:-1:-1;;;19460:68:0;;22821:2:1;19460:68:0;;;22803:21:1;;;22840:18;;;22833:30;22899:34;22879:18;;;22872:62;22951:18;;19460:68:0;22619:356:1;19460:68:0;19964:30:::1;19991:1;19964:18;:30::i;54553:110::-:0;19321:6;;-1:-1:-1;;;;;19321:6:0;18052:10;19468:23;19460:68;;;;-1:-1:-1;;;19460:68:0;;22821:2:1;19460:68:0;;;22803:21:1;;;22840:18;;;22833:30;22899:34;22879:18;;;22872:62;22951:18;;19460:68:0;22619:356:1;19460:68:0;21919:7;;;;;;;54608:9:::1;54600:36;;;::::0;-1:-1:-1;;;54600:36:0;;15708:2:1;54600:36:0::1;::::0;::::1;15690:21:1::0;15747:2;15727:18;;;15720:30;15786:16;15766:18;;;15759:44;15820:18;;54600:36:0::1;15506:338:1::0;54600:36:0::1;54647:8;:6;:8::i;49619:277::-:0;19321:6;;-1:-1:-1;;;;;19321:6:0;18052:10;19468:23;19460:68;;;;-1:-1:-1;;;19460:68:0;;22821:2:1;19460:68:0;;;22803:21:1;;;22840:18;;;22833:30;22899:34;22879:18;;;22872:62;22951:18;;19460:68:0;22619:356:1;19460:68:0;49682:11:::1;::::0;:16;49674:49:::1;;;::::0;-1:-1:-1;;;49674:49:0;;12777:2:1;49674:49:0::1;::::0;::::1;12759:21:1::0;12816:2;12796:18;;;12789:30;12855:22;12835:18;;;12828:50;12895:18;;49674:49:0::1;12575:344:1::0;49674:49:0::1;49751:1;49734:113;49165:2;49754:1;:21;49734:113;;49797:38;49807:10;49833:1;49819:11;;:15;;;;:::i;49797:38::-;49777:3:::0;::::1;::::0;::::1;:::i;:::-;;;;49734:113;;;;49165:2;49857:11;;:31;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;49619:277:0:o;49481:23::-;;;;;;;:::i;37230:104::-;37286:13;37319:7;37312:14;;;;;:::i;49904:374::-;19321:6;;-1:-1:-1;;;;;19321:6:0;18052:10;19468:23;19460:68;;;;-1:-1:-1;;;19460:68:0;;22821:2:1;19460:68:0;;;22803:21:1;;;22840:18;;;22833:30;22899:34;22879:18;;;22872:62;22951:18;;19460:68:0;22619:356:1;19460:68:0;48946:4:::1;50009:6;49995:11;;:20;;;;:::i;:::-;:34;;49987:65;;;::::0;-1:-1:-1;;;49987:65:0;;26201:2:1;49987:65:0::1;::::0;::::1;26183:21:1::0;26240:2;26220:18;;;26213:30;26279:20;26259:18;;;26252:48;26317:18;;49987:65:0::1;25999:342:1::0;49987:65:0::1;49165:2;50071:11;;:31;;50063:64;;;::::0;-1:-1:-1;;;50063:64:0;;20608:2:1;50063:64:0::1;::::0;::::1;20590:21:1::0;20647:2;20627:18;;;20620:30;20686:22;20666:18;;;20659:50;20726:18;;50063:64:0::1;20406:344:1::0;50063:64:0::1;50155:1;50138:101;50163:6;50158:1;:11;50138:101;;50191:36;50201:8;50225:1;50211:11;;:15;;;;:::i;50191:36::-;50171:3:::0;::::1;::::0;::::1;:::i;:::-;;;;50138:101;;;;50264:6;50249:11;;:21;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;49904:374:0:o;51796:559::-;51860:11;;;;51852:40;;;;-1:-1:-1;;;51852:40:0;;15006:2:1;51852:40:0;;;14988:21:1;15045:2;15025:18;;;15018:30;15084:18;15064;;;15057:46;15120:18;;51852:40:0;14804:340:1;51852:40:0;51920:1;51911:6;:10;:39;;;;;49114:1;51925:6;:25;;51911:39;51903:65;;;;-1:-1:-1;;;51903:65:0;;25859:2:1;51903:65:0;;;25841:21:1;25898:2;25878:18;;;25871:30;25937:15;25917:18;;;25910:43;25970:18;;51903:65:0;25657:337:1;51903:65:0;49165:2;51987:11;;:31;;51979:64;;;;-1:-1:-1;;;51979:64:0;;20608:2:1;51979:64:0;;;20590:21:1;20647:2;20627:18;;;20620:30;20686:22;20666:18;;;20659:50;20726:18;;51979:64:0;20406:344:1;51979:64:0;48946:4;52076:6;52062:11;;:20;;;;:::i;:::-;:34;;52054:65;;;;-1:-1:-1;;;52054:65:0;;26201:2:1;52054:65:0;;;26183:21:1;26240:2;26220:18;;;26213:30;26279:20;26259:18;;;26252:48;26317:18;;52054:65:0;25999:342:1;52054:65:0;52152:26;49055:10;52152:6;:26;:::i;:::-;52138:9;:41;52130:70;;;;-1:-1:-1;;;52130:70:0;;26548:2:1;52130:70:0;;;26530:21:1;26587:2;26567:18;;;26560:30;26626:18;26606;;;26599:46;26662:18;;52130:70:0;26346:340:1;52130:70:0;52230:1;52213:103;52238:6;52233:1;:11;52213:103;;52266:38;52276:10;52302:1;52288:11;;:15;;;;:::i;52266:38::-;52246:3;;;;:::i;:::-;;;;52213:103;;;;52341:6;52326:11;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;;51796:559:0:o;49451:23::-;;;;;;;:::i;38913:155::-;39008:52;18052:10;39041:8;39051;39008:18;:52::i;53095:179::-;19321:6;;-1:-1:-1;;;;;19321:6:0;18052:10;19468:23;19460:68;;;;-1:-1:-1;;;19460:68:0;;22821:2:1;19460:68:0;;;22803:21:1;;;22840:18;;;22833:30;22899:34;22879:18;;;22872:62;22951:18;;19460:68:0;22619:356:1;19460:68:0;53175:11:::1;::::0;::::1;;:26;;::::0;::::1;;;;53167:63;;;::::0;-1:-1:-1;;;53167:63:0;;12424:2:1;53167:63:0::1;::::0;::::1;12406:21:1::0;12463:2;12443:18;;;12436:30;12502:26;12482:18;;;12475:54;12546:18;;53167:63:0::1;12222:348:1::0;53167:63:0::1;53241:11;:25:::0;;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;53095:179::o;53778:166::-;19321:6;;-1:-1:-1;;;;;19321:6:0;18052:10;19468:23;19460:68;;;;-1:-1:-1;;;19460:68:0;;22821:2:1;19460:68:0;;;22803:21:1;;;22840:18;;;22833:30;22899:34;22879:18;;;22872:62;22951:18;;19460:68:0;22619:356:1;19460:68:0;53861:4:::1;::::0;;;::::1;;;53860:5;53852:32;;;::::0;-1:-1:-1;;;53852:32:0;;20957:2:1;53852:32:0::1;::::0;::::1;20939:21:1::0;20996:2;20976:18;;;20969:30;21035:16;21015:18;;;21008:44;21069:18;;53852:32:0::1;20755:338:1::0;53852:32:0::1;53895:16;:9;53907:4:::0;;53895:16:::1;:::i;:::-;-1:-1:-1::0;53922:14:0::1;::::0;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;53922:14:0;;;;::::1;::::0;:9:::1;::::0;:14:::1;:::i;40036:328::-:0;40211:41;18052:10;40244:7;40211:18;:41::i;:::-;40203:103;;;;-1:-1:-1;;;40203:103:0;;24753:2:1;40203:103:0;;;24735:21:1;24792:2;24772:18;;;24765:30;24831:34;24811:18;;;24804:62;24902:19;24882:18;;;24875:47;24939:19;;40203:103:0;24551:413:1;40203:103:0;40317:39;40331:4;40337:2;40341:7;40350:5;40317:13;:39::i;54302:241::-;19321:6;;-1:-1:-1;;;;;19321:6:0;18052:10;19468:23;19460:68;;;;-1:-1:-1;;;19460:68:0;;22821:2:1;19460:68:0;;;22803:21:1;;;22840:18;;;22833:30;22899:34;22879:18;;;22872:62;22951:18;;19460:68:0;22619:356:1;19460:68:0;54397:10:::1;::::0;-1:-1:-1;;;;;54379:29:0;;::::1;54397:10:::0;::::1;54379:29;;54371:59;;;::::0;-1:-1:-1;;;54371:59:0;;25513:2:1;54371:59:0::1;::::0;::::1;25495:21:1::0;25552:2;25532:18;;;25525:30;25591:19;25571:18;;;25564:47;25628:18;;54371:59:0::1;25311:341:1::0;54371:59:0::1;-1:-1:-1::0;;;;;54449:20:0;::::1;54441:51;;;::::0;-1:-1:-1;;;54441:51:0;;16051:2:1;54441:51:0::1;::::0;::::1;16033:21:1::0;16090:2;16070:18;;;16063:30;16129:20;16109:18;;;16102:48;16167:18;;54441:51:0::1;15849:342:1::0;54441:51:0::1;54503:10;:32:::0;;;::::1;-1:-1:-1::0;;;;;54503:32:0;;;::::1;::::0;;;::::1;::::0;;54302:241::o;52363:448::-;41939:4;41963:16;;;:7;:16;;;;;;52436:13;;-1:-1:-1;;;;;41963:16:0;52462:76;;;;-1:-1:-1;;;52462:76:0;;23592:2:1;52462:76:0;;;23574:21:1;23631:2;23611:18;;;23604:30;23670:34;23650:18;;;23643:62;23741:17;23721:18;;;23714:45;23776:19;;52462:76:0;23390:411:1;52462:76:0;52559:18;;;;:9;:18;;;;;52553:32;;;;;:::i;:::-;:37;;-1:-1:-1;52549:95:0;;52614:18;;;;:9;:18;;;;;52607:25;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52363:448;;;:::o;52549:95::-;52664:9;52658:23;;;;;:::i;:::-;:28;;-1:-1:-1;52654:77:0;;52710:9;52703:16;;;;;:::i;52654:77::-;52772:9;52783:18;:7;:16;:18::i;:::-;52755:47;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52741:62;;52363:448;;;:::o;51376:390::-;51551:30;;;-1:-1:-1;;;;;10691:55:1;;51551:30:0;;;10673:74:1;10763:18;;;10756:34;;;51508:4:0;;;;10646:18:1;;51551:30:0;;;;;;;;;;;;51541:41;;;;;;51525:57;;51598:25;51611:5;51618:4;;51598:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51598:12:0;;-1:-1:-1;;;51598:25:0:i;:::-;51593:71;;51647:5;51640:12;;;;;51593:71;51678:18;;;;:11;:18;;;;;;;;51674:63;;;51720:5;51713:12;;;;;51674:63;51754:4;51747:11;;;51376:390;;;;;;;:::o;53282:188::-;19321:6;;-1:-1:-1;;;;;19321:6:0;18052:10;19468:23;19460:68;;;;-1:-1:-1;;;19460:68:0;;22821:2:1;19460:68:0;;;22803:21:1;;;22840:18;;;22833:30;22899:34;22879:18;;;22872:62;22951:18;;19460:68:0;22619:356:1;19460:68:0;53365:14:::1;::::0;::::1;;::::0;;::::1;;:29;;::::0;::::1;;;;53357:66;;;::::0;-1:-1:-1;;;53357:66:0;;12424:2:1;53357:66:0::1;::::0;::::1;12406:21:1::0;12463:2;12443:18;;;12436:30;12502:26;12482:18;;;12475:54;12546:18;;53357:66:0::1;12222:348:1::0;53357:66:0::1;53434:14;:28:::0;;;::::1;;;;::::0;;;::::1;::::0;;;::::1;::::0;;53282:188::o;20157:201::-;19321:6;;-1:-1:-1;;;;;19321:6:0;18052:10;19468:23;19460:68;;;;-1:-1:-1;;;19460:68:0;;22821:2:1;19460:68:0;;;22803:21:1;;;22840:18;;;22833:30;22899:34;22879:18;;;22872:62;22951:18;;19460:68:0;22619:356:1;19460:68:0;-1:-1:-1;;;;;20246:22:0;::::1;20238:73;;;::::0;-1:-1:-1;;;20238:73:0;;14599:2:1;20238:73:0::1;::::0;::::1;14581:21:1::0;14638:2;14618:18;;;14611:30;14677:34;14657:18;;;14650:62;14748:8;14728:18;;;14721:36;14774:19;;20238:73:0::1;14397:402:1::0;20238:73:0::1;20322:28;20341:8;20322:18;:28::i;:::-;20157:201:::0;:::o;45856:174::-;45931:24;;;;:15;:24;;;;;:29;;;;-1:-1:-1;;;;;45931:29:0;;;;;;;;:24;;45985:23;45931:24;45985:14;:23::i;:::-;-1:-1:-1;;;;;45976:46:0;;;;;;;;;;;45856:174;;:::o;42168:348::-;42261:4;41963:16;;;:7;:16;;;;;;-1:-1:-1;;;;;41963:16:0;42278:73;;;;-1:-1:-1;;;42278:73:0;;18258:2:1;42278:73:0;;;18240:21:1;18297:2;18277:18;;;18270:30;18336:34;18316:18;;;18309:62;18407:14;18387:18;;;18380:42;18439:19;;42278:73:0;18056:408:1;42278:73:0;42362:13;42378:23;42393:7;42378:14;:23::i;:::-;42362:39;;42431:5;-1:-1:-1;;;;;42420:16:0;:7;-1:-1:-1;;;;;42420:16:0;;:51;;;;42464:7;-1:-1:-1;;;;;42440:31:0;:20;42452:7;42440:11;:20::i;:::-;-1:-1:-1;;;;;42440:31:0;;42420:51;:87;;;-1:-1:-1;;;;;;39260:25:0;;;39236:4;39260:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;42475:32;39139:164;45160:578;45319:4;-1:-1:-1;;;;;45292:31:0;:23;45307:7;45292:14;:23::i;:::-;-1:-1:-1;;;;;45292:31:0;;45284:85;;;;-1:-1:-1;;;45284:85:0;;23182:2:1;45284:85:0;;;23164:21:1;23221:2;23201:18;;;23194:30;23260:34;23240:18;;;23233:62;23331:11;23311:18;;;23304:39;23360:19;;45284:85:0;22980:405:1;45284:85:0;-1:-1:-1;;;;;45388:16:0;;45380:65;;;;-1:-1:-1;;;45380:65:0;;16398:2:1;45380:65:0;;;16380:21:1;16437:2;16417:18;;;16410:30;16476:34;16456:18;;;16449:62;16547:6;16527:18;;;16520:34;16571:19;;45380:65:0;16196:400:1;45380:65:0;45458:39;45479:4;45485:2;45489:7;45458:20;:39::i;:::-;45562:29;45579:1;45583:7;45562:8;:29::i;:::-;-1:-1:-1;;;;;45604:15:0;;;;;;:9;:15;;;;;:20;;45623:1;;45604:15;:20;;45623:1;;45604:20;:::i;:::-;;;;-1:-1:-1;;;;;;;45635:13:0;;;;;;:9;:13;;;;;:18;;45652:1;;45635:13;:18;;45652:1;;45635:18;:::i;:::-;;;;-1:-1:-1;;45664:16:0;;;;:7;:16;;;;;;:21;;;;-1:-1:-1;;;;;45664:21:0;;;;;;;;;45703:27;;45664:16;;45703:27;;;;;;;45160:578;;;:::o;22907:120::-;21919:7;;;;;;;22443:41;;;;-1:-1:-1;;;22443:41:0;;13471:2:1;22443:41:0;;;13453:21:1;13510:2;13490:18;;;13483:30;13549:22;13529:18;;;13522:50;13589:18;;22443:41:0;13269:344:1;22443:41:0;22966:7:::1;:15:::0;;;::::1;::::0;;22997:22:::1;18052:10:::0;23006:12:::1;22997:22;::::0;-1:-1:-1;;;;;9513:55:1;;;9495:74;;9483:2;9468:18;22997:22:0::1;;;;;;;22907:120::o:0;51173:195::-;51256:4;51298:62;51312:35;51341:5;33611:58;;9206:66:1;33611:58:0;;;9194:79:1;9289:12;;;9282:28;;;33478:7:0;;9326:12:1;;33611:58:0;;;;;;;;;;;;33601:69;;;;;;33594:76;;33409:269;;;;51312:35;51349:10;51298:13;:62::i;:::-;51280:14;;;;;-1:-1:-1;;;;;51280:14:0;;;:80;;;;-1:-1:-1;51173:195:0;;;;:::o;42858:110::-;42934:26;42944:2;42948:7;42934:26;;;;;;;;;;;;:9;:26::i;20518:191::-;20611:6;;;-1:-1:-1;;;;;20628:17:0;;;;;;;;;;;20661:40;;20611:6;;;20628:17;20611:6;;20661:40;;20592:16;;20661:40;20581:128;20518:191;:::o;22648:118::-;21919:7;;;;;;;22173:9;22165:38;;;;-1:-1:-1;;;22165:38:0;;19017:2:1;22165:38:0;;;18999:21:1;19056:2;19036:18;;;19029:30;19095:18;19075;;;19068:46;19131:18;;22165:38:0;18815:340:1;22165:38:0;22708:7:::1;:14:::0;;;::::1;::::0;::::1;::::0;;22738:20:::1;22745:12;18052:10:::0;;17972:98;46172:315;46327:8;-1:-1:-1;;;;;46318:17:0;:5;-1:-1:-1;;;;;46318:17:0;;;46310:55;;;;-1:-1:-1;;;46310:55:0;;16803:2:1;46310:55:0;;;16785:21:1;16842:2;16822:18;;;16815:30;16881:27;16861:18;;;16854:55;16926:18;;46310:55:0;16601:349:1;46310:55:0;-1:-1:-1;;;;;46376:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;;;;;;;;;;;;46438:41;;10941::1;;;46438::0;;10914:18:1;46438:41:0;;;;;;;46172:315;;;:::o;41246:::-;41403:28;41413:4;41419:2;41423:7;41403:9;:28::i;:::-;41450:48;41473:4;41479:2;41483:7;41492:5;41450:22;:48::i;:::-;41442:111;;;;-1:-1:-1;;;41442:111:0;;14180:2:1;41442:111:0;;;14162:21:1;14219:2;14199:18;;;14192:30;14258:34;14238:18;;;14231:62;14329:20;14309:18;;;14302:48;14367:19;;41442:111:0;13978:414:1;23399:723:0;23455:13;23676:10;23672:53;;-1:-1:-1;;23703:10:0;;;;;;;;;;;;;;;;;;23399:723::o;23672:53::-;23750:5;23735:12;23791:78;23798:9;;23791:78;;23824:8;;;;:::i;:::-;;-1:-1:-1;23847:10:0;;-1:-1:-1;23855:2:0;23847:10;;:::i;:::-;;;23791:78;;;23879:19;23911:6;23901:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23901:17:0;;23879:39;;23929:154;23936:10;;23929:154;;23963:11;23973:1;23963:11;;:::i;:::-;;-1:-1:-1;24032:10:0;24040:2;24032:5;:10;:::i;:::-;24019:24;;:2;:24;:::i;:::-;24006:39;;23989:6;23996;23989:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;24060:11:0;24069:2;24060:11;;:::i;:::-;;;23929:154;;54794:298;21919:7;;;;;;;54946:9;54938:37;;;;-1:-1:-1;;;54938:37:0;;22477:2:1;54938:37:0;;;22459:21:1;22516:2;22496:18;;;22489:30;22555:17;22535:18;;;22528:45;22590:18;;54938:37:0;22275:339:1;54938:37:0;54986:10;;:42;;;;;-1:-1:-1;;;;;9861:15:1;;;54986:42:0;;;9843:34:1;9913:15;;;9893:18;;;9886:43;9945:18;;;9938:34;;;54986:10:0;;;;:23;;9755:18:1;;54986:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38213:341;38143:411;;:::o;29560:231::-;29638:7;29659:17;29678:18;29700:27;29711:4;29717:9;29700:10;:27::i;:::-;29658:69;;;;29738:18;29750:5;29738:11;:18::i;:::-;-1:-1:-1;29774:9:0;29560:231;-1:-1:-1;;;29560:231:0:o;43195:321::-;43325:18;43331:2;43335:7;43325:5;:18::i;:::-;43376:54;43407:1;43411:2;43415:7;43424:5;43376:22;:54::i;:::-;43354:154;;;;-1:-1:-1;;;43354:154:0;;14180:2:1;43354:154:0;;;14162:21:1;14219:2;14199:18;;;14192:30;14258:34;14238:18;;;14231:62;14329:20;14309:18;;;14302:48;14367:19;;43354:154:0;13978:414:1;47052:799:0;47207:4;-1:-1:-1;;;;;47228:13:0;;1633:20;1681:8;47224:620;;47264:72;;;;;-1:-1:-1;;;;;47264:36:0;;;;;:72;;18052:10;;47315:4;;47321:7;;47330:5;;47264:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47264:72:0;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;47260:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47506:13:0;;47502:272;;47549:60;;-1:-1:-1;;;47549:60:0;;14180:2:1;47549:60:0;;;14162:21:1;14219:2;14199:18;;;14192:30;14258:34;14238:18;;;14231:62;14329:20;14309:18;;;14302:48;14367:19;;47549:60:0;13978:414:1;47502:272:0;47724:6;47718:13;47709:6;47705:2;47701:15;47694:38;47260:529;47387:51;;47397:41;47387:51;;-1:-1:-1;47380:58:0;;47224:620;-1:-1:-1;47828:4:0;47821:11;;27450:1308;27531:7;27540:12;27765:9;:16;27785:2;27765:22;27761:990;;;28061:4;28046:20;;28040:27;28111:4;28096:20;;28090:27;28169:4;28154:20;;28148:27;27804:9;28140:36;28212:25;28223:4;28140:36;28040:27;28090;28212:10;:25::i;:::-;28205:32;;;;;;;;;27761:990;28259:9;:16;28279:2;28259:22;28255:496;;;28534:4;28519:20;;28513:27;28585:4;28570:20;;28564:27;28627:23;28638:4;28513:27;28564;28627:10;:23::i;:::-;28620:30;;;;;;;;28255:496;-1:-1:-1;28699:1:0;;-1:-1:-1;28703:35:0;28255:496;27450:1308;;;;;:::o;25721:643::-;25799:20;25790:5;:29;;;;;;;;:::i;:::-;;25786:571;;;25721:643;:::o;25786:571::-;25897:29;25888:5;:38;;;;;;;;:::i;:::-;;25884:473;;;25943:34;;-1:-1:-1;;;25943:34:0;;12071:2:1;25943:34:0;;;12053:21:1;12110:2;12090:18;;;12083:30;12149:26;12129:18;;;12122:54;12193:18;;25943:34:0;11869:348:1;25884:473:0;26008:35;25999:5;:44;;;;;;;;:::i;:::-;;25995:362;;;26060:41;;-1:-1:-1;;;26060:41:0;;13820:2:1;26060:41:0;;;13802:21:1;13859:2;13839:18;;;13832:30;13898:33;13878:18;;;13871:61;13949:18;;26060:41:0;13618:355:1;25995:362:0;26132:30;26123:5;:39;;;;;;;;:::i;:::-;;26119:238;;;26179:44;;-1:-1:-1;;;26179:44:0;;17855:2:1;26179:44:0;;;17837:21:1;17894:2;17874:18;;;17867:30;17933:34;17913:18;;;17906:62;18004:4;17984:18;;;17977:32;18026:19;;26179:44:0;17653:398:1;26119:238:0;26254:30;26245:5;:39;;;;;;;;:::i;:::-;;26241:116;;;26301:44;;-1:-1:-1;;;26301:44:0;;21300:2:1;26301:44:0;;;21282:21:1;21339:2;21319:18;;;21312:30;21378:34;21358:18;;;21351:62;21449:4;21429:18;;;21422:32;21471:19;;26301:44:0;21098:398:1;43852:382:0;-1:-1:-1;;;;;43932:16:0;;43924:61;;;;-1:-1:-1;;;43924:61:0;;21703:2:1;43924:61:0;;;21685:21:1;;;21722:18;;;21715:30;21781:34;21761:18;;;21754:62;21833:18;;43924:61:0;21501:356:1;43924:61:0;41939:4;41963:16;;;:7;:16;;;;;;-1:-1:-1;;;;;41963:16:0;:30;43996:58;;;;-1:-1:-1;;;43996:58:0;;15351:2:1;43996:58:0;;;15333:21:1;15390:2;15370:18;;;15363:30;15429;15409:18;;;15402:58;15477:18;;43996:58:0;15149:352:1;43996:58:0;44067:45;44096:1;44100:2;44104:7;44067:20;:45::i;:::-;-1:-1:-1;;;;;44125:13:0;;;;;;:9;:13;;;;;:18;;44142:1;;44125:13;:18;;44142:1;;44125:18;:::i;:::-;;;;-1:-1:-1;;44154:16:0;;;;:7;:16;;;;;;:21;;;;-1:-1:-1;;;;;44154:21:0;;;;;;;;44193:33;;44154:16;;;44193:33;;44154:16;;44193:33;43852:382;;:::o;31059:1632::-;31190:7;;32124:66;32111:79;;32107:163;;;-1:-1:-1;32223:1:0;;-1:-1:-1;32227:30:0;32207:51;;32107:163;32284:1;:7;;32289:2;32284:7;;:18;;;;;32295:1;:7;;32300:2;32295:7;;32284:18;32280:102;;;-1:-1:-1;32335:1:0;;-1:-1:-1;32339:30:0;32319:51;;32280:102;32496:24;;;32479:14;32496:24;;;;;;;;;11220:25:1;;;11293:4;11281:17;;11261:18;;;11254:45;;;;11315:18;;;11308:34;;;11358:18;;;11351:34;;;32496:24:0;;11192:19:1;;32496:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;32496:24:0;;;;;;-1:-1:-1;;;;;;;32535:20:0;;32531:103;;32588:1;32592:29;32572:50;;;;;;;32531:103;32654:6;-1:-1:-1;32662:20:0;;-1:-1:-1;31059:1632:0;;;;;;;;:::o;30054:391::-;30168:7;;30277:66;30269:75;;30371:3;30367:12;;;30381:2;30363:21;30412:25;30423:4;30363:21;30432:1;30269:75;30412:10;:25::i;:::-;30405:32;;;;;;30054:391;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:160:1;79:20;;135:13;;128:21;118:32;;108:60;;164:1;161;154:12;108:60;14:160;;;:::o;179:347::-;230:8;240:6;294:3;287:4;279:6;275:17;271:27;261:55;;312:1;309;302:12;261:55;-1:-1:-1;335:20:1;;378:18;367:30;;364:50;;;410:1;407;400:12;364:50;447:4;439:6;435:17;423:29;;499:3;492:4;483:6;475;471:19;467:30;464:39;461:59;;;516:1;513;506:12;531:777;573:5;626:3;619:4;611:6;607:17;603:27;593:55;;644:1;641;634:12;593:55;680:6;667:20;706:18;743:2;739;736:10;733:36;;;749:18;;:::i;:::-;883:2;877:9;945:4;937:13;;788:66;933:22;;;957:2;929:31;925:40;913:53;;;981:18;;;1001:22;;;978:46;975:72;;;1027:18;;:::i;:::-;1067:10;1063:2;1056:22;1102:2;1094:6;1087:18;1148:3;1141:4;1136:2;1128:6;1124:15;1120:26;1117:35;1114:55;;;1165:1;1162;1155:12;1114:55;1229:2;1222:4;1214:6;1210:17;1203:4;1195:6;1191:17;1178:54;1276:1;1269:4;1264:2;1256:6;1252:15;1248:26;1241:37;1296:6;1287:15;;;;;;531:777;;;;:::o;1313:247::-;1372:6;1425:2;1413:9;1404:7;1400:23;1396:32;1393:52;;;1441:1;1438;1431:12;1393:52;1480:9;1467:23;1499:31;1524:5;1499:31;:::i;:::-;1549:5;1313:247;-1:-1:-1;;;1313:247:1:o;1825:388::-;1893:6;1901;1954:2;1942:9;1933:7;1929:23;1925:32;1922:52;;;1970:1;1967;1960:12;1922:52;2009:9;1996:23;2028:31;2053:5;2028:31;:::i;:::-;2078:5;-1:-1:-1;2135:2:1;2120:18;;2107:32;2148:33;2107:32;2148:33;:::i;:::-;2200:7;2190:17;;;1825:388;;;;;:::o;2218:456::-;2295:6;2303;2311;2364:2;2352:9;2343:7;2339:23;2335:32;2332:52;;;2380:1;2377;2370:12;2332:52;2419:9;2406:23;2438:31;2463:5;2438:31;:::i;:::-;2488:5;-1:-1:-1;2545:2:1;2530:18;;2517:32;2558:33;2517:32;2558:33;:::i;:::-;2218:456;;2610:7;;-1:-1:-1;;;2664:2:1;2649:18;;;;2636:32;;2218:456::o;2679:665::-;2774:6;2782;2790;2798;2851:3;2839:9;2830:7;2826:23;2822:33;2819:53;;;2868:1;2865;2858:12;2819:53;2907:9;2894:23;2926:31;2951:5;2926:31;:::i;:::-;2976:5;-1:-1:-1;3033:2:1;3018:18;;3005:32;3046:33;3005:32;3046:33;:::i;:::-;3098:7;-1:-1:-1;3152:2:1;3137:18;;3124:32;;-1:-1:-1;3207:2:1;3192:18;;3179:32;3234:18;3223:30;;3220:50;;;3266:1;3263;3256:12;3220:50;3289:49;3330:7;3321:6;3310:9;3306:22;3289:49;:::i;:::-;3279:59;;;2679:665;;;;;;;:::o;3349:315::-;3414:6;3422;3475:2;3463:9;3454:7;3450:23;3446:32;3443:52;;;3491:1;3488;3481:12;3443:52;3530:9;3517:23;3549:31;3574:5;3549:31;:::i;:::-;3599:5;-1:-1:-1;3623:35:1;3654:2;3639:18;;3623:35;:::i;:::-;3613:45;;3349:315;;;;;:::o;3669:::-;3737:6;3745;3798:2;3786:9;3777:7;3773:23;3769:32;3766:52;;;3814:1;3811;3804:12;3766:52;3853:9;3840:23;3872:31;3897:5;3872:31;:::i;:::-;3922:5;3974:2;3959:18;;;;3946:32;;-1:-1:-1;;;3669:315:1:o;3989:612::-;4077:6;4085;4093;4101;4154:2;4142:9;4133:7;4129:23;4125:32;4122:52;;;4170:1;4167;4160:12;4122:52;4209:9;4196:23;4228:31;4253:5;4228:31;:::i;:::-;4278:5;-1:-1:-1;4330:2:1;4315:18;;4302:32;;-1:-1:-1;4385:2:1;4370:18;;4357:32;4412:18;4401:30;;4398:50;;;4444:1;4441;4434:12;4398:50;4483:58;4533:7;4524:6;4513:9;4509:22;4483:58;:::i;:::-;3989:612;;;;-1:-1:-1;4560:8:1;-1:-1:-1;;;;3989:612:1:o;4606:180::-;4662:6;4715:2;4703:9;4694:7;4690:23;4686:32;4683:52;;;4731:1;4728;4721:12;4683:52;4754:26;4770:9;4754:26;:::i;4791:245::-;4849:6;4902:2;4890:9;4881:7;4877:23;4873:32;4870:52;;;4918:1;4915;4908:12;4870:52;4957:9;4944:23;4976:30;5000:5;4976:30;:::i;5041:249::-;5110:6;5163:2;5151:9;5142:7;5138:23;5134:32;5131:52;;;5179:1;5176;5169:12;5131:52;5211:9;5205:16;5230:30;5254:5;5230:30;:::i;5295:410::-;5366:6;5374;5427:2;5415:9;5406:7;5402:23;5398:32;5395:52;;;5443:1;5440;5433:12;5395:52;5483:9;5470:23;5516:18;5508:6;5505:30;5502:50;;;5548:1;5545;5538:12;5502:50;5587:58;5637:7;5628:6;5617:9;5613:22;5587:58;:::i;:::-;5664:8;;5561:84;;-1:-1:-1;5295:410:1;-1:-1:-1;;;;5295:410:1:o;5710:478::-;5790:6;5798;5806;5859:2;5847:9;5838:7;5834:23;5830:32;5827:52;;;5875:1;5872;5865:12;5827:52;5915:9;5902:23;5948:18;5940:6;5937:30;5934:50;;;5980:1;5977;5970:12;5934:50;6019:58;6069:7;6060:6;6049:9;6045:22;6019:58;:::i;:::-;6096:8;;5993:84;;-1:-1:-1;6178:2:1;6163:18;;;;6150:32;;5710:478;-1:-1:-1;;;;5710:478:1:o;6193:180::-;6252:6;6305:2;6293:9;6284:7;6280:23;6276:32;6273:52;;;6321:1;6318;6311:12;6273:52;-1:-1:-1;6344:23:1;;6193:180;-1:-1:-1;6193:180:1:o;6378:315::-;6446:6;6454;6507:2;6495:9;6486:7;6482:23;6478:32;6475:52;;;6523:1;6520;6513:12;6475:52;6559:9;6546:23;6536:33;;6619:2;6608:9;6604:18;6591:32;6632:31;6657:5;6632:31;:::i;6698:456::-;6784:6;6792;6800;6853:2;6841:9;6832:7;6828:23;6824:32;6821:52;;;6869:1;6866;6859:12;6821:52;6905:9;6892:23;6882:33;;6962:2;6951:9;6947:18;6934:32;6924:42;;7017:2;7006:9;7002:18;6989:32;7044:18;7036:6;7033:30;7030:50;;;7076:1;7073;7066:12;7030:50;7099:49;7140:7;7131:6;7120:9;7116:22;7099:49;:::i;:::-;7089:59;;;6698:456;;;;;:::o;7159:316::-;7200:3;7238:5;7232:12;7265:6;7260:3;7253:19;7281:63;7337:6;7330:4;7325:3;7321:14;7314:4;7307:5;7303:16;7281:63;:::i;:::-;7389:2;7377:15;7394:66;7373:88;7364:98;;;;7464:4;7360:109;;7159:316;-1:-1:-1;;7159:316:1:o;7480:185::-;7522:3;7560:5;7554:12;7575:52;7620:6;7615:3;7608:4;7601:5;7597:16;7575:52;:::i;:::-;7643:16;;;;;7480:185;-1:-1:-1;;7480:185:1:o;7670:1289::-;7846:3;7875:1;7908:6;7902:13;7938:3;7960:1;7988:9;7984:2;7980:18;7970:28;;8048:2;8037:9;8033:18;8070;8060:61;;8114:4;8106:6;8102:17;8092:27;;8060:61;8140:2;8188;8180:6;8177:14;8157:18;8154:38;8151:222;;;8227:77;8222:3;8215:90;8328:4;8325:1;8318:15;8358:4;8353:3;8346:17;8151:222;8389:18;8416:162;;;;8592:1;8587:320;;;;8382:525;;8416:162;8464:66;8453:9;8449:82;8444:3;8437:95;8561:6;8556:3;8552:16;8545:23;;8416:162;;8587:320;26946:1;26939:14;;;26983:4;26970:18;;8682:1;8696:165;8710:6;8707:1;8704:13;8696:165;;;8788:14;;8775:11;;;8768:35;8831:16;;;;8725:10;;8696:165;;;8700:3;;8890:6;8885:3;8881:16;8874:23;;8382:525;;;;;;;8923:30;8949:3;8941:6;8923:30;:::i;:::-;8916:37;7670:1289;-1:-1:-1;;;;;7670:1289:1:o;9983:511::-;10177:4;-1:-1:-1;;;;;10287:2:1;10279:6;10275:15;10264:9;10257:34;10339:2;10331:6;10327:15;10322:2;10311:9;10307:18;10300:43;;10379:6;10374:2;10363:9;10359:18;10352:34;10422:3;10417:2;10406:9;10402:18;10395:31;10443:45;10483:3;10472:9;10468:19;10460:6;10443:45;:::i;:::-;10435:53;9983:511;-1:-1:-1;;;;;;9983:511:1:o;11645:219::-;11794:2;11783:9;11776:21;11757:4;11814:44;11854:2;11843:9;11839:18;11831:6;11814:44;:::i;26999:128::-;27039:3;27070:1;27066:6;27063:1;27060:13;27057:39;;;27076:18;;:::i;:::-;-1:-1:-1;27112:9:1;;26999:128::o;27132:120::-;27172:1;27198;27188:35;;27203:18;;:::i;:::-;-1:-1:-1;27237:9:1;;27132:120::o;27257:228::-;27297:7;27423:1;27355:66;27351:74;27348:1;27345:81;27340:1;27333:9;27326:17;27322:105;27319:131;;;27430:18;;:::i;:::-;-1:-1:-1;27470:9:1;;27257:228::o;27490:125::-;27530:4;27558:1;27555;27552:8;27549:34;;;27563:18;;:::i;:::-;-1:-1:-1;27600:9:1;;27490:125::o;27620:258::-;27692:1;27702:113;27716:6;27713:1;27710:13;27702:113;;;27792:11;;;27786:18;27773:11;;;27766:39;27738:2;27731:10;27702:113;;;27833:6;27830:1;27827:13;27824:48;;;-1:-1:-1;;27868:1:1;27850:16;;27843:27;27620:258::o;27883:437::-;27962:1;27958:12;;;;28005;;;28026:61;;28080:4;28072:6;28068:17;28058:27;;28026:61;28133:2;28125:6;28122:14;28102:18;28099:38;28096:218;;;28170:77;28167:1;28160:88;28271:4;28268:1;28261:15;28299:4;28296:1;28289:15;28096:218;;27883:437;;;:::o;28325:195::-;28364:3;28395:66;28388:5;28385:77;28382:103;;;28465:18;;:::i;:::-;-1:-1:-1;28512:1:1;28501:13;;28325:195::o;28525:112::-;28557:1;28583;28573:35;;28588:18;;:::i;:::-;-1:-1:-1;28622:9:1;;28525:112::o;28642:184::-;28694:77;28691:1;28684:88;28791:4;28788:1;28781:15;28815:4;28812:1;28805:15;28831:184;28883:77;28880:1;28873:88;28980:4;28977:1;28970:15;29004:4;29001:1;28994:15;29020:184;29072:77;29069:1;29062:88;29169:4;29166:1;29159:15;29193:4;29190:1;29183:15;29209:184;29261:77;29258:1;29251:88;29358:4;29355:1;29348:15;29382:4;29379:1;29372:15;29398:184;29450:77;29447:1;29440:88;29547:4;29544:1;29537:15;29571:4;29568:1;29561:15;29587:154;-1:-1:-1;;;;;29666:5:1;29662:54;29655:5;29652:65;29642:93;;29731:1;29728;29721:12;29746:177;29831:66;29824:5;29820:78;29813:5;29810:89;29800:117;;29913:1;29910;29903:12

Swarm Source

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