ETH Price: $3,404.25 (+2.17%)

Token

M.U.G.S (M.U.G.S)
 

Overview

Max Total Supply

10,000 M.U.G.S

Holders

4,180

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 M.U.G.S
0x6120bbc42a36E996c9DA80dD7798Dc204b83e1c2
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
MUGS

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

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);
}

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

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);
}

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);
}


/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 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);
            }
        }
    }
}


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;
    }
}


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

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

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

    string private baseURI = "";

    // 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 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);

        _afterTokenTransfer(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);

        _afterTokenTransfer(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 from incorrect owner");
        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);

        _afterTokenTransfer(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 {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}


    function _setBaseURI(string memory baseURI_) internal {
        baseURI = baseURI_;
    }
}


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

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

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



/**
 * @title ERC721 Burnable Token
 * @dev ERC721 Token that can be irreversibly burned (destroyed).
 */
abstract contract ERC721Burnable is Context, ERC721 {
    /**
     * @dev Burns `tokenId`. See {ERC721-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved");
        _burn(tokenId);
    }
}

/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721Burnable, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @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` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * 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 override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

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

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
 library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

contract MUGS is Context, ERC721Enumerable, Ownable {

    using SafeMath for uint256;

    uint256 public MAX_PURCHASE = 10;

    uint256 public constant MAX_TOKENS = 10000;

    mapping (address => uint256) public minted;

    address public WHITELIST_SIGNER;

    bool public saleIsActive = false;

    constructor () ERC721("M.U.G.S", "M.U.G.S") {}

    /* function to change the max quantity to mint in one transaction */
    function changeMaxPurchase(uint256 max) public onlyOwner {
        MAX_PURCHASE = max;
    }

    function setWhiteListSigner(address signer) public onlyOwner {
        WHITELIST_SIGNER = signer;
    }

    function toggleSale() public onlyOwner {
        saleIsActive = !saleIsActive;
    }

    function reserve(uint256 numberOfTokens) public onlyOwner {     
        uint256 mintable = MAX_TOKENS.sub(totalSupply());
        require(saleIsActive == false, "Impossible reserve when sale is active");

        if (numberOfTokens > mintable) {
            numberOfTokens = mintable;
        }

        uint supply = totalSupply();
        for (uint i = 0; i < numberOfTokens; i++) {
            _safeMint(_msgSender(), supply + i);
        }
    }

    function preMint(uint256 numberOfTokens, uint max, bytes memory signature) public {
        uint256 mintable = MAX_TOKENS.sub(totalSupply());
        require(mintable != 0, "Sold out");
        
        if (numberOfTokens > mintable) {
            numberOfTokens = mintable;
        }

        bytes32 hash;
        require(WHITELIST_SIGNER != address(0), "Pre-Mint is not available yet");
        require(saleIsActive == false, "Impossible Pre-Mint when sale is active");   
        require(numberOfTokens <= MAX_PURCHASE, "Exceed the number of tokens able to mint");

        hash = keccak256(abi.encodePacked(_msgSender(), max));

        require(recover(hash,signature) == WHITELIST_SIGNER, "Invalid Signature");

        require(minted[_msgSender()].add(numberOfTokens) <= max, "Max mint reached");

        minted[_msgSender()] = minted[_msgSender()].add(numberOfTokens);

        uint supply = totalSupply();
        for(uint i = 0; i < numberOfTokens; i++) {
            _safeMint(_msgSender(), supply+i);
        }
    }

    function mint(uint256 numberOfTokens) public {
        uint256 mintable = MAX_TOKENS.sub(totalSupply());
        require(mintable != 0, "Sold out");
        
        if (numberOfTokens > mintable) {
            numberOfTokens = mintable;
        }

        if (minted[_msgSender()].add(numberOfTokens) > MAX_PURCHASE) {
            numberOfTokens = MAX_PURCHASE.sub(minted[_msgSender()]);
        }
        require(numberOfTokens != 0, "Max Purchase Reached");

        require(saleIsActive, "Sale must be active to mint");
        
        for(uint i = 0; i < numberOfTokens; i++) {
            _safeMint(_msgSender(), totalSupply()); 
        }
        minted[_msgSender()].add(numberOfTokens);
    }


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


    function recover(bytes32 _hash, bytes memory _signed) internal pure returns(address) {
        bytes32 r;
        bytes32 s;
        uint8 v;
        
        assembly {
            r:= mload(add(_signed,32))
            s:= mload(add(_signed,64))
            v:= and(mload(add(_signed,65)) ,255)
        }
        return ecrecover(_hash,v,r,s);
    } 
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_PURCHASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WHITELIST_SIGNER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"max","type":"uint256"}],"name":"changeMaxPurchase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"preMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"reserve","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":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"name":"setWhiteListSigner","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":[],"name":"toggleSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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"}]

608060405260405180602001604052806000815250600290805190602001906200002b929190620001ee565b50600a600c556000600e60146101000a81548160ff0219169083151502179055503480156200005957600080fd5b506040518060400160405280600781526020017f4d2e552e472e53000000000000000000000000000000000000000000000000008152506040518060400160405280600781526020017f4d2e552e472e53000000000000000000000000000000000000000000000000008152508160009080519060200190620000de929190620001ee565b508060019080519060200190620000f7929190620001ee565b5050506200011a6200010e6200012060201b60201c565b6200012860201b60201c565b62000303565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001fc906200029e565b90600052602060002090601f0160209004810192826200022057600085556200026c565b82601f106200023b57805160ff19168380011785556200026c565b828001600101855582156200026c579182015b828111156200026b5782518255916020019190600101906200024e565b5b5090506200027b91906200027f565b5090565b5b808211156200029a57600081600090555060010162000280565b5090565b60006002820490506001821680620002b757607f821691505b60208210811415620002ce57620002cd620002d4565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6148a280620003136000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c80637146bd081161010f578063a0712d68116100a2578063e985e9c511610071578063e985e9c51461058d578063eb8d2444146105bd578063f2fde38b146105db578063f47c84c5146105f7576101f0565b8063a0712d6814610509578063a22cb46514610525578063b88d4fde14610541578063c87b56dd1461055d576101f0565b8063819b25ba116100de578063819b25ba1461049557806384bdb6e0146104b15780638da5cb5b146104cd57806395d89b41146104eb576101f0565b80637146bd0814610447578063715018a6146104655780637d8966e41461046f5780637f6567f714610479576101f0565b8063417b94831161018757806355f804b31161015657806355f804b3146103af578063622973ca146103cb5780636352211e146103e757806370a0823114610417576101f0565b8063417b94831461032957806342842e0e1461034757806342966c68146103635780634f6ccce71461037f576101f0565b806318160ddd116101c357806318160ddd1461028f5780631e7269c5146102ad57806323b872dd146102dd5780632f745c59146102f9576101f0565b806301ffc9a7146101f557806306fdde0314610225578063081812fc14610243578063095ea7b314610273575b600080fd5b61020f600480360381019061020a9190613341565b610615565b60405161021c9190613fe3565b60405180910390f35b61022d61068f565b60405161023a9190614043565b60405180910390f35b61025d600480360381019061025891906133d4565b610721565b60405161026a9190613f7c565b60405180910390f35b61028d60048036038101906102889190613305565b6107a6565b005b6102976108be565b6040516102a491906143e5565b60405180910390f35b6102c760048036038101906102c2919061319a565b6108cb565b6040516102d491906143e5565b60405180910390f35b6102f760048036038101906102f291906131ff565b6108e3565b005b610313600480360381019061030e9190613305565b610943565b60405161032091906143e5565b60405180910390f35b6103316109e8565b60405161033e9190613f7c565b60405180910390f35b610361600480360381019061035c91906131ff565b610a0e565b005b61037d600480360381019061037891906133d4565b610a2e565b005b610399600480360381019061039491906133d4565b610a8a565b6040516103a691906143e5565b60405180910390f35b6103c960048036038101906103c49190613393565b610b21565b005b6103e560048036038101906103e091906133fd565b610ba9565b005b61040160048036038101906103fc91906133d4565b610f9f565b60405161040e9190613f7c565b60405180910390f35b610431600480360381019061042c919061319a565b611051565b60405161043e91906143e5565b60405180910390f35b61044f611109565b60405161045c91906143e5565b60405180910390f35b61046d61110f565b005b610477611197565b005b610493600480360381019061048e91906133d4565b61123f565b005b6104af60048036038101906104aa91906133d4565b6112c5565b005b6104cb60048036038101906104c6919061319a565b61140f565b005b6104d56114cf565b6040516104e29190613f7c565b60405180910390f35b6104f36114f9565b6040516105009190614043565b60405180910390f35b610523600480360381019061051e91906133d4565b61158b565b005b61053f600480360381019061053a91906132c9565b6117e3565b005b61055b6004803603810190610556919061324e565b6117f9565b005b610577600480360381019061057291906133d4565b61185b565b6040516105849190614043565b60405180910390f35b6105a760048036038101906105a291906131c3565b611985565b6040516105b49190613fe3565b60405180910390f35b6105c5611a19565b6040516105d29190613fe3565b60405180910390f35b6105f560048036038101906105f0919061319a565b611a2c565b005b6105ff611b24565b60405161060c91906143e5565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610688575061068782611b2a565b5b9050919050565b60606000805461069e9061465c565b80601f01602080910402602001604051908101604052809291908181526020018280546106ca9061465c565b80156107175780601f106106ec57610100808354040283529160200191610717565b820191906000526020600020905b8154815290600101906020018083116106fa57829003601f168201915b5050505050905090565b600061072c82611c0c565b61076b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076290614205565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107b182610f9f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610822576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610819906142a5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610841611c78565b73ffffffffffffffffffffffffffffffffffffffff161480610870575061086f8161086a611c78565b611985565b5b6108af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a690614185565b60405180910390fd5b6108b98383611c80565b505050565b6000600980549050905090565b600d6020528060005260406000206000915090505481565b6108f46108ee611c78565b82611d39565b610933576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092a90614325565b60405180910390fd5b61093e838383611e17565b505050565b600061094e83611051565b821061098f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098690614065565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610a29838383604051806020016040528060008152506117f9565b505050565b610a3f610a39611c78565b82611d39565b610a7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a75906143c5565b60405180910390fd5b610a878161207e565b50565b6000610a946108be565b8210610ad5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610acc90614365565b60405180910390fd5b60098281548110610b0f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610b29611c78565b73ffffffffffffffffffffffffffffffffffffffff16610b476114cf565b73ffffffffffffffffffffffffffffffffffffffff1614610b9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9490614265565b60405180910390fd5b610ba68161219b565b50565b6000610bc7610bb66108be565b6127106121b590919063ffffffff16565b90506000811415610c0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0490614345565b60405180910390fd5b80841115610c19578093505b60008073ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610cac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca3906142e5565b60405180910390fd5b60001515600e60149054906101000a900460ff16151514610d02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf9906143a5565b60405180910390fd5b600c54851115610d47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3e906142c5565b60405180910390fd5b610d4f611c78565b84604051602001610d61929190613f2c565b604051602081830303815290604052805190602001209050600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610dbc82856121cb565b73ffffffffffffffffffffffffffffffffffffffff1614610e12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0990614245565b60405180910390fd5b83610e6c86600d6000610e23611c78565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461224390919063ffffffff16565b1115610ead576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea490614305565b60405180910390fd5b610f0685600d6000610ebd611c78565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461224390919063ffffffff16565b600d6000610f12611c78565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000610f5a6108be565b905060005b86811015610f9657610f83610f72611c78565b8284610f7e91906144d4565b612259565b8080610f8e9061468e565b915050610f5f565b50505050505050565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611048576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103f906141c5565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b9906141a5565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600c5481565b611117611c78565b73ffffffffffffffffffffffffffffffffffffffff166111356114cf565b73ffffffffffffffffffffffffffffffffffffffff161461118b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118290614265565b60405180910390fd5b6111956000612277565b565b61119f611c78565b73ffffffffffffffffffffffffffffffffffffffff166111bd6114cf565b73ffffffffffffffffffffffffffffffffffffffff1614611213576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120a90614265565b60405180910390fd5b600e60149054906101000a900460ff1615600e60146101000a81548160ff021916908315150217905550565b611247611c78565b73ffffffffffffffffffffffffffffffffffffffff166112656114cf565b73ffffffffffffffffffffffffffffffffffffffff16146112bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b290614265565b60405180910390fd5b80600c8190555050565b6112cd611c78565b73ffffffffffffffffffffffffffffffffffffffff166112eb6114cf565b73ffffffffffffffffffffffffffffffffffffffff1614611341576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133890614265565b60405180910390fd5b600061135f61134e6108be565b6127106121b590919063ffffffff16565b905060001515600e60149054906101000a900460ff161515146113b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ae90614385565b60405180910390fd5b808211156113c3578091505b60006113cd6108be565b905060005b83811015611409576113f66113e5611c78565b82846113f191906144d4565b612259565b80806114019061468e565b9150506113d2565b50505050565b611417611c78565b73ffffffffffffffffffffffffffffffffffffffff166114356114cf565b73ffffffffffffffffffffffffffffffffffffffff161461148b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148290614265565b60405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546115089061465c565b80601f01602080910402602001604051908101604052809291908181526020018280546115349061465c565b80156115815780601f1061155657610100808354040283529160200191611581565b820191906000526020600020905b81548152906001019060200180831161156457829003601f168201915b5050505050905090565b60006115a96115986108be565b6127106121b590919063ffffffff16565b905060008114156115ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e690614345565b60405180910390fd5b808211156115fb578091505b600c5461165783600d600061160e611c78565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461224390919063ffffffff16565b11156116bb576116b8600d600061166c611c78565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600c546121b590919063ffffffff16565b91505b60008214156116ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f690614225565b60405180910390fd5b600e60149054906101000a900460ff1661174e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174590614145565b60405180910390fd5b60005b8281101561178457611771611764611c78565b61176c6108be565b612259565b808061177c9061468e565b915050611751565b506117de82600d6000611795611c78565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461224390919063ffffffff16565b505050565b6117f56117ee611c78565b838361233d565b5050565b61180a611804611c78565b83611d39565b611849576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184090614325565b60405180910390fd5b611855848484846124aa565b50505050565b606061186682611c0c565b6118a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189c90614285565b60405180910390fd5b6000600280546118b49061465c565b80601f01602080910402602001604051908101604052809291908181526020018280546118e09061465c565b801561192d5780601f106119025761010080835404028352916020019161192d565b820191906000526020600020905b81548152906001019060200180831161191057829003601f168201915b505050505090506000815111611952576040518060200160405280600081525061197d565b8061195c84612506565b60405160200161196d929190613f58565b6040516020818303038152906040525b915050919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600e60149054906101000a900460ff1681565b611a34611c78565b73ffffffffffffffffffffffffffffffffffffffff16611a526114cf565b73ffffffffffffffffffffffffffffffffffffffff1614611aa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9f90614265565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0f906140a5565b60405180910390fd5b611b2181612277565b50565b61271081565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611bf557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611c055750611c04826126b3565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611cf383610f9f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611d4482611c0c565b611d83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7a90614165565b60405180910390fd5b6000611d8e83610f9f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611dfd57508373ffffffffffffffffffffffffffffffffffffffff16611de584610721565b73ffffffffffffffffffffffffffffffffffffffff16145b80611e0e5750611e0d8185611985565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611e3782610f9f565b73ffffffffffffffffffffffffffffffffffffffff1614611e8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e84906140c5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611efd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef490614105565b60405180910390fd5b611f0883838361271d565b611f13600082611c80565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f63919061455b565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fba91906144d4565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612079838383612831565b505050565b600061208982610f9f565b90506120978160008461271d565b6120a2600083611c80565b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120f2919061455b565b925050819055506003600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461219781600084612831565b5050565b80600290805190602001906121b1929190612fbe565b5050565b600081836121c3919061455b565b905092915050565b600080600080602085015192506040850151915060ff60418601511690506001868285856040516000815260200160405260405161220c9493929190613ffe565b6020604051602081039080840390855afa15801561222e573d6000803e3d6000fd5b50505060206040510351935050505092915050565b6000818361225191906144d4565b905092915050565b612273828260405180602001604052806000815250612836565b5050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156123ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a390614125565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161249d9190613fe3565b60405180910390a3505050565b6124b5848484611e17565b6124c184848484612891565b612500576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f790614085565b60405180910390fd5b50505050565b6060600082141561254e576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506126ae565b600082905060005b600082146125805780806125699061468e565b915050600a82612579919061452a565b9150612556565b60008167ffffffffffffffff8111156125c2577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156125f45781602001600182028036833780820191505090505b5090505b600085146126a75760018261260d919061455b565b9150600a8561261c9190614705565b603061262891906144d4565b60f81b818381518110612664577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126a0919061452a565b94506125f8565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612728838383612a28565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561276b5761276681612a2d565b6127aa565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146127a9576127a88382612a76565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127ed576127e881612be3565b61282c565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461282b5761282a8282612d26565b5b5b505050565b505050565b6128408383612da5565b61284d6000848484612891565b61288c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288390614085565b60405180910390fd5b505050565b60006128b28473ffffffffffffffffffffffffffffffffffffffff16612f7f565b15612a1b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026128db611c78565b8786866040518563ffffffff1660e01b81526004016128fd9493929190613f97565b602060405180830381600087803b15801561291757600080fd5b505af192505050801561294857506040513d601f19601f82011682018060405250810190612945919061336a565b60015b6129cb573d8060008114612978576040519150601f19603f3d011682016040523d82523d6000602084013e61297d565b606091505b506000815114156129c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ba90614085565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612a20565b600190505b949350505050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612a8384611051565b612a8d919061455b565b9050600060086000848152602001908152602001600020549050818114612b72576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600980549050612bf7919061455b565b90506000600a6000848152602001908152602001600020549050600060098381548110612c4d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060098381548110612c95577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a6000858152602001908152602001600020600090556009805480612d0a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612d3183611051565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e0c906141e5565b60405180910390fd5b612e1e81611c0c565b15612e5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e55906140e5565b60405180910390fd5b612e6a6000838361271d565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612eba91906144d4565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612f7b60008383612831565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff16803b806020016040519081016040528181526000908060200190933c51119050919050565b828054612fca9061465c565b90600052602060002090601f016020900481019282612fec5760008555613033565b82601f1061300557805160ff1916838001178555613033565b82800160010185558215613033579182015b82811115613032578251825591602001919060010190613017565b5b5090506130409190613044565b5090565b5b8082111561305d576000816000905550600101613045565b5090565b600061307461306f84614431565b614400565b90508281526020810184848401111561308c57600080fd5b61309784828561461a565b509392505050565b60006130b26130ad84614461565b614400565b9050828152602081018484840111156130ca57600080fd5b6130d584828561461a565b509392505050565b6000813590506130ec81614810565b92915050565b60008135905061310181614827565b92915050565b6000813590506131168161483e565b92915050565b60008151905061312b8161483e565b92915050565b600082601f83011261314257600080fd5b8135613152848260208601613061565b91505092915050565b600082601f83011261316c57600080fd5b813561317c84826020860161309f565b91505092915050565b60008135905061319481614855565b92915050565b6000602082840312156131ac57600080fd5b60006131ba848285016130dd565b91505092915050565b600080604083850312156131d657600080fd5b60006131e4858286016130dd565b92505060206131f5858286016130dd565b9150509250929050565b60008060006060848603121561321457600080fd5b6000613222868287016130dd565b9350506020613233868287016130dd565b925050604061324486828701613185565b9150509250925092565b6000806000806080858703121561326457600080fd5b6000613272878288016130dd565b9450506020613283878288016130dd565b935050604061329487828801613185565b925050606085013567ffffffffffffffff8111156132b157600080fd5b6132bd87828801613131565b91505092959194509250565b600080604083850312156132dc57600080fd5b60006132ea858286016130dd565b92505060206132fb858286016130f2565b9150509250929050565b6000806040838503121561331857600080fd5b6000613326858286016130dd565b925050602061333785828601613185565b9150509250929050565b60006020828403121561335357600080fd5b600061336184828501613107565b91505092915050565b60006020828403121561337c57600080fd5b600061338a8482850161311c565b91505092915050565b6000602082840312156133a557600080fd5b600082013567ffffffffffffffff8111156133bf57600080fd5b6133cb8482850161315b565b91505092915050565b6000602082840312156133e657600080fd5b60006133f484828501613185565b91505092915050565b60008060006060848603121561341257600080fd5b600061342086828701613185565b935050602061343186828701613185565b925050604084013567ffffffffffffffff81111561344e57600080fd5b61345a86828701613131565b9150509250925092565b61346d8161458f565b82525050565b61348461347f8261458f565b6146d7565b82525050565b613493816145a1565b82525050565b6134a2816145ad565b82525050565b60006134b382614491565b6134bd81856144a7565b93506134cd818560208601614629565b6134d6816147f2565b840191505092915050565b60006134ec8261449c565b6134f681856144b8565b9350613506818560208601614629565b61350f816147f2565b840191505092915050565b60006135258261449c565b61352f81856144c9565b935061353f818560208601614629565b80840191505092915050565b6000613558602b836144b8565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b60006135be6032836144b8565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006136246026836144b8565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061368a6025836144b8565b91507f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008301527f6f776e65720000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006136f0601c836144b8565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006137306024836144b8565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006137966019836144b8565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006137d6601b836144b8565b91507f53616c65206d7573742062652061637469766520746f206d696e7400000000006000830152602082019050919050565b6000613816602c836144b8565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061387c6038836144b8565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006138e2602a836144b8565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006139486029836144b8565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006139ae6020836144b8565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006139ee602c836144b8565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613a546014836144b8565b91507f4d617820507572636861736520526561636865640000000000000000000000006000830152602082019050919050565b6000613a946011836144b8565b91507f496e76616c6964205369676e61747572650000000000000000000000000000006000830152602082019050919050565b6000613ad46020836144b8565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613b14602f836144b8565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613b7a6021836144b8565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613be06028836144b8565b91507f45786365656420746865206e756d626572206f6620746f6b656e732061626c6560008301527f20746f206d696e740000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c46601d836144b8565b91507f5072652d4d696e74206973206e6f7420617661696c61626c65207965740000006000830152602082019050919050565b6000613c866010836144b8565b91507f4d6178206d696e742072656163686564000000000000000000000000000000006000830152602082019050919050565b6000613cc66031836144b8565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613d2c6008836144b8565b91507f536f6c64206f75740000000000000000000000000000000000000000000000006000830152602082019050919050565b6000613d6c602c836144b8565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000613dd26026836144b8565b91507f496d706f737369626c652072657365727665207768656e2073616c652069732060008301527f61637469766500000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e386027836144b8565b91507f496d706f737369626c65205072652d4d696e74207768656e2073616c6520697360008301527f20616374697665000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e9e6030836144b8565b91507f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f766564000000000000000000000000000000006020830152604082019050919050565b613f0081614603565b82525050565b613f17613f1282614603565b6146fb565b82525050565b613f268161460d565b82525050565b6000613f388285613473565b601482019150613f488284613f06565b6020820191508190509392505050565b6000613f64828561351a565b9150613f70828461351a565b91508190509392505050565b6000602082019050613f916000830184613464565b92915050565b6000608082019050613fac6000830187613464565b613fb96020830186613464565b613fc66040830185613ef7565b8181036060830152613fd881846134a8565b905095945050505050565b6000602082019050613ff8600083018461348a565b92915050565b60006080820190506140136000830187613499565b6140206020830186613f1d565b61402d6040830185613499565b61403a6060830184613499565b95945050505050565b6000602082019050818103600083015261405d81846134e1565b905092915050565b6000602082019050818103600083015261407e8161354b565b9050919050565b6000602082019050818103600083015261409e816135b1565b9050919050565b600060208201905081810360008301526140be81613617565b9050919050565b600060208201905081810360008301526140de8161367d565b9050919050565b600060208201905081810360008301526140fe816136e3565b9050919050565b6000602082019050818103600083015261411e81613723565b9050919050565b6000602082019050818103600083015261413e81613789565b9050919050565b6000602082019050818103600083015261415e816137c9565b9050919050565b6000602082019050818103600083015261417e81613809565b9050919050565b6000602082019050818103600083015261419e8161386f565b9050919050565b600060208201905081810360008301526141be816138d5565b9050919050565b600060208201905081810360008301526141de8161393b565b9050919050565b600060208201905081810360008301526141fe816139a1565b9050919050565b6000602082019050818103600083015261421e816139e1565b9050919050565b6000602082019050818103600083015261423e81613a47565b9050919050565b6000602082019050818103600083015261425e81613a87565b9050919050565b6000602082019050818103600083015261427e81613ac7565b9050919050565b6000602082019050818103600083015261429e81613b07565b9050919050565b600060208201905081810360008301526142be81613b6d565b9050919050565b600060208201905081810360008301526142de81613bd3565b9050919050565b600060208201905081810360008301526142fe81613c39565b9050919050565b6000602082019050818103600083015261431e81613c79565b9050919050565b6000602082019050818103600083015261433e81613cb9565b9050919050565b6000602082019050818103600083015261435e81613d1f565b9050919050565b6000602082019050818103600083015261437e81613d5f565b9050919050565b6000602082019050818103600083015261439e81613dc5565b9050919050565b600060208201905081810360008301526143be81613e2b565b9050919050565b600060208201905081810360008301526143de81613e91565b9050919050565b60006020820190506143fa6000830184613ef7565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614427576144266147c3565b5b8060405250919050565b600067ffffffffffffffff82111561444c5761444b6147c3565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561447c5761447b6147c3565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006144df82614603565b91506144ea83614603565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561451f5761451e614736565b5b828201905092915050565b600061453582614603565b915061454083614603565b9250826145505761454f614765565b5b828204905092915050565b600061456682614603565b915061457183614603565b92508282101561458457614583614736565b5b828203905092915050565b600061459a826145e3565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561464757808201518184015260208101905061462c565b83811115614656576000848401525b50505050565b6000600282049050600182168061467457607f821691505b6020821081141561468857614687614794565b5b50919050565b600061469982614603565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156146cc576146cb614736565b5b600182019050919050565b60006146e2826146e9565b9050919050565b60006146f482614803565b9050919050565b6000819050919050565b600061471082614603565b915061471b83614603565b92508261472b5761472a614765565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b6148198161458f565b811461482457600080fd5b50565b614830816145a1565b811461483b57600080fd5b50565b614847816145b7565b811461485257600080fd5b50565b61485e81614603565b811461486957600080fd5b5056fea26469706673582212207aba85ee7f964462275f3db7ad1ba13b200ec833149624d407296dfce1d2499f64736f6c63430008000033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101f05760003560e01c80637146bd081161010f578063a0712d68116100a2578063e985e9c511610071578063e985e9c51461058d578063eb8d2444146105bd578063f2fde38b146105db578063f47c84c5146105f7576101f0565b8063a0712d6814610509578063a22cb46514610525578063b88d4fde14610541578063c87b56dd1461055d576101f0565b8063819b25ba116100de578063819b25ba1461049557806384bdb6e0146104b15780638da5cb5b146104cd57806395d89b41146104eb576101f0565b80637146bd0814610447578063715018a6146104655780637d8966e41461046f5780637f6567f714610479576101f0565b8063417b94831161018757806355f804b31161015657806355f804b3146103af578063622973ca146103cb5780636352211e146103e757806370a0823114610417576101f0565b8063417b94831461032957806342842e0e1461034757806342966c68146103635780634f6ccce71461037f576101f0565b806318160ddd116101c357806318160ddd1461028f5780631e7269c5146102ad57806323b872dd146102dd5780632f745c59146102f9576101f0565b806301ffc9a7146101f557806306fdde0314610225578063081812fc14610243578063095ea7b314610273575b600080fd5b61020f600480360381019061020a9190613341565b610615565b60405161021c9190613fe3565b60405180910390f35b61022d61068f565b60405161023a9190614043565b60405180910390f35b61025d600480360381019061025891906133d4565b610721565b60405161026a9190613f7c565b60405180910390f35b61028d60048036038101906102889190613305565b6107a6565b005b6102976108be565b6040516102a491906143e5565b60405180910390f35b6102c760048036038101906102c2919061319a565b6108cb565b6040516102d491906143e5565b60405180910390f35b6102f760048036038101906102f291906131ff565b6108e3565b005b610313600480360381019061030e9190613305565b610943565b60405161032091906143e5565b60405180910390f35b6103316109e8565b60405161033e9190613f7c565b60405180910390f35b610361600480360381019061035c91906131ff565b610a0e565b005b61037d600480360381019061037891906133d4565b610a2e565b005b610399600480360381019061039491906133d4565b610a8a565b6040516103a691906143e5565b60405180910390f35b6103c960048036038101906103c49190613393565b610b21565b005b6103e560048036038101906103e091906133fd565b610ba9565b005b61040160048036038101906103fc91906133d4565b610f9f565b60405161040e9190613f7c565b60405180910390f35b610431600480360381019061042c919061319a565b611051565b60405161043e91906143e5565b60405180910390f35b61044f611109565b60405161045c91906143e5565b60405180910390f35b61046d61110f565b005b610477611197565b005b610493600480360381019061048e91906133d4565b61123f565b005b6104af60048036038101906104aa91906133d4565b6112c5565b005b6104cb60048036038101906104c6919061319a565b61140f565b005b6104d56114cf565b6040516104e29190613f7c565b60405180910390f35b6104f36114f9565b6040516105009190614043565b60405180910390f35b610523600480360381019061051e91906133d4565b61158b565b005b61053f600480360381019061053a91906132c9565b6117e3565b005b61055b6004803603810190610556919061324e565b6117f9565b005b610577600480360381019061057291906133d4565b61185b565b6040516105849190614043565b60405180910390f35b6105a760048036038101906105a291906131c3565b611985565b6040516105b49190613fe3565b60405180910390f35b6105c5611a19565b6040516105d29190613fe3565b60405180910390f35b6105f560048036038101906105f0919061319a565b611a2c565b005b6105ff611b24565b60405161060c91906143e5565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610688575061068782611b2a565b5b9050919050565b60606000805461069e9061465c565b80601f01602080910402602001604051908101604052809291908181526020018280546106ca9061465c565b80156107175780601f106106ec57610100808354040283529160200191610717565b820191906000526020600020905b8154815290600101906020018083116106fa57829003601f168201915b5050505050905090565b600061072c82611c0c565b61076b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076290614205565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107b182610f9f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610822576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610819906142a5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610841611c78565b73ffffffffffffffffffffffffffffffffffffffff161480610870575061086f8161086a611c78565b611985565b5b6108af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a690614185565b60405180910390fd5b6108b98383611c80565b505050565b6000600980549050905090565b600d6020528060005260406000206000915090505481565b6108f46108ee611c78565b82611d39565b610933576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092a90614325565b60405180910390fd5b61093e838383611e17565b505050565b600061094e83611051565b821061098f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098690614065565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610a29838383604051806020016040528060008152506117f9565b505050565b610a3f610a39611c78565b82611d39565b610a7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a75906143c5565b60405180910390fd5b610a878161207e565b50565b6000610a946108be565b8210610ad5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610acc90614365565b60405180910390fd5b60098281548110610b0f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610b29611c78565b73ffffffffffffffffffffffffffffffffffffffff16610b476114cf565b73ffffffffffffffffffffffffffffffffffffffff1614610b9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9490614265565b60405180910390fd5b610ba68161219b565b50565b6000610bc7610bb66108be565b6127106121b590919063ffffffff16565b90506000811415610c0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0490614345565b60405180910390fd5b80841115610c19578093505b60008073ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610cac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca3906142e5565b60405180910390fd5b60001515600e60149054906101000a900460ff16151514610d02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf9906143a5565b60405180910390fd5b600c54851115610d47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3e906142c5565b60405180910390fd5b610d4f611c78565b84604051602001610d61929190613f2c565b604051602081830303815290604052805190602001209050600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610dbc82856121cb565b73ffffffffffffffffffffffffffffffffffffffff1614610e12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0990614245565b60405180910390fd5b83610e6c86600d6000610e23611c78565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461224390919063ffffffff16565b1115610ead576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea490614305565b60405180910390fd5b610f0685600d6000610ebd611c78565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461224390919063ffffffff16565b600d6000610f12611c78565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000610f5a6108be565b905060005b86811015610f9657610f83610f72611c78565b8284610f7e91906144d4565b612259565b8080610f8e9061468e565b915050610f5f565b50505050505050565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611048576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103f906141c5565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b9906141a5565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600c5481565b611117611c78565b73ffffffffffffffffffffffffffffffffffffffff166111356114cf565b73ffffffffffffffffffffffffffffffffffffffff161461118b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118290614265565b60405180910390fd5b6111956000612277565b565b61119f611c78565b73ffffffffffffffffffffffffffffffffffffffff166111bd6114cf565b73ffffffffffffffffffffffffffffffffffffffff1614611213576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120a90614265565b60405180910390fd5b600e60149054906101000a900460ff1615600e60146101000a81548160ff021916908315150217905550565b611247611c78565b73ffffffffffffffffffffffffffffffffffffffff166112656114cf565b73ffffffffffffffffffffffffffffffffffffffff16146112bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b290614265565b60405180910390fd5b80600c8190555050565b6112cd611c78565b73ffffffffffffffffffffffffffffffffffffffff166112eb6114cf565b73ffffffffffffffffffffffffffffffffffffffff1614611341576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133890614265565b60405180910390fd5b600061135f61134e6108be565b6127106121b590919063ffffffff16565b905060001515600e60149054906101000a900460ff161515146113b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ae90614385565b60405180910390fd5b808211156113c3578091505b60006113cd6108be565b905060005b83811015611409576113f66113e5611c78565b82846113f191906144d4565b612259565b80806114019061468e565b9150506113d2565b50505050565b611417611c78565b73ffffffffffffffffffffffffffffffffffffffff166114356114cf565b73ffffffffffffffffffffffffffffffffffffffff161461148b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148290614265565b60405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546115089061465c565b80601f01602080910402602001604051908101604052809291908181526020018280546115349061465c565b80156115815780601f1061155657610100808354040283529160200191611581565b820191906000526020600020905b81548152906001019060200180831161156457829003601f168201915b5050505050905090565b60006115a96115986108be565b6127106121b590919063ffffffff16565b905060008114156115ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e690614345565b60405180910390fd5b808211156115fb578091505b600c5461165783600d600061160e611c78565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461224390919063ffffffff16565b11156116bb576116b8600d600061166c611c78565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600c546121b590919063ffffffff16565b91505b60008214156116ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f690614225565b60405180910390fd5b600e60149054906101000a900460ff1661174e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174590614145565b60405180910390fd5b60005b8281101561178457611771611764611c78565b61176c6108be565b612259565b808061177c9061468e565b915050611751565b506117de82600d6000611795611c78565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461224390919063ffffffff16565b505050565b6117f56117ee611c78565b838361233d565b5050565b61180a611804611c78565b83611d39565b611849576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184090614325565b60405180910390fd5b611855848484846124aa565b50505050565b606061186682611c0c565b6118a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189c90614285565b60405180910390fd5b6000600280546118b49061465c565b80601f01602080910402602001604051908101604052809291908181526020018280546118e09061465c565b801561192d5780601f106119025761010080835404028352916020019161192d565b820191906000526020600020905b81548152906001019060200180831161191057829003601f168201915b505050505090506000815111611952576040518060200160405280600081525061197d565b8061195c84612506565b60405160200161196d929190613f58565b6040516020818303038152906040525b915050919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600e60149054906101000a900460ff1681565b611a34611c78565b73ffffffffffffffffffffffffffffffffffffffff16611a526114cf565b73ffffffffffffffffffffffffffffffffffffffff1614611aa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9f90614265565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0f906140a5565b60405180910390fd5b611b2181612277565b50565b61271081565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611bf557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611c055750611c04826126b3565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611cf383610f9f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611d4482611c0c565b611d83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7a90614165565b60405180910390fd5b6000611d8e83610f9f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611dfd57508373ffffffffffffffffffffffffffffffffffffffff16611de584610721565b73ffffffffffffffffffffffffffffffffffffffff16145b80611e0e5750611e0d8185611985565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611e3782610f9f565b73ffffffffffffffffffffffffffffffffffffffff1614611e8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e84906140c5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611efd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef490614105565b60405180910390fd5b611f0883838361271d565b611f13600082611c80565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f63919061455b565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fba91906144d4565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612079838383612831565b505050565b600061208982610f9f565b90506120978160008461271d565b6120a2600083611c80565b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120f2919061455b565b925050819055506003600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461219781600084612831565b5050565b80600290805190602001906121b1929190612fbe565b5050565b600081836121c3919061455b565b905092915050565b600080600080602085015192506040850151915060ff60418601511690506001868285856040516000815260200160405260405161220c9493929190613ffe565b6020604051602081039080840390855afa15801561222e573d6000803e3d6000fd5b50505060206040510351935050505092915050565b6000818361225191906144d4565b905092915050565b612273828260405180602001604052806000815250612836565b5050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156123ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a390614125565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161249d9190613fe3565b60405180910390a3505050565b6124b5848484611e17565b6124c184848484612891565b612500576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f790614085565b60405180910390fd5b50505050565b6060600082141561254e576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506126ae565b600082905060005b600082146125805780806125699061468e565b915050600a82612579919061452a565b9150612556565b60008167ffffffffffffffff8111156125c2577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156125f45781602001600182028036833780820191505090505b5090505b600085146126a75760018261260d919061455b565b9150600a8561261c9190614705565b603061262891906144d4565b60f81b818381518110612664577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126a0919061452a565b94506125f8565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612728838383612a28565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561276b5761276681612a2d565b6127aa565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146127a9576127a88382612a76565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127ed576127e881612be3565b61282c565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461282b5761282a8282612d26565b5b5b505050565b505050565b6128408383612da5565b61284d6000848484612891565b61288c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288390614085565b60405180910390fd5b505050565b60006128b28473ffffffffffffffffffffffffffffffffffffffff16612f7f565b15612a1b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026128db611c78565b8786866040518563ffffffff1660e01b81526004016128fd9493929190613f97565b602060405180830381600087803b15801561291757600080fd5b505af192505050801561294857506040513d601f19601f82011682018060405250810190612945919061336a565b60015b6129cb573d8060008114612978576040519150601f19603f3d011682016040523d82523d6000602084013e61297d565b606091505b506000815114156129c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ba90614085565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612a20565b600190505b949350505050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612a8384611051565b612a8d919061455b565b9050600060086000848152602001908152602001600020549050818114612b72576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600980549050612bf7919061455b565b90506000600a6000848152602001908152602001600020549050600060098381548110612c4d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060098381548110612c95577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a6000858152602001908152602001600020600090556009805480612d0a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612d3183611051565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e0c906141e5565b60405180910390fd5b612e1e81611c0c565b15612e5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e55906140e5565b60405180910390fd5b612e6a6000838361271d565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612eba91906144d4565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612f7b60008383612831565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff16803b806020016040519081016040528181526000908060200190933c51119050919050565b828054612fca9061465c565b90600052602060002090601f016020900481019282612fec5760008555613033565b82601f1061300557805160ff1916838001178555613033565b82800160010185558215613033579182015b82811115613032578251825591602001919060010190613017565b5b5090506130409190613044565b5090565b5b8082111561305d576000816000905550600101613045565b5090565b600061307461306f84614431565b614400565b90508281526020810184848401111561308c57600080fd5b61309784828561461a565b509392505050565b60006130b26130ad84614461565b614400565b9050828152602081018484840111156130ca57600080fd5b6130d584828561461a565b509392505050565b6000813590506130ec81614810565b92915050565b60008135905061310181614827565b92915050565b6000813590506131168161483e565b92915050565b60008151905061312b8161483e565b92915050565b600082601f83011261314257600080fd5b8135613152848260208601613061565b91505092915050565b600082601f83011261316c57600080fd5b813561317c84826020860161309f565b91505092915050565b60008135905061319481614855565b92915050565b6000602082840312156131ac57600080fd5b60006131ba848285016130dd565b91505092915050565b600080604083850312156131d657600080fd5b60006131e4858286016130dd565b92505060206131f5858286016130dd565b9150509250929050565b60008060006060848603121561321457600080fd5b6000613222868287016130dd565b9350506020613233868287016130dd565b925050604061324486828701613185565b9150509250925092565b6000806000806080858703121561326457600080fd5b6000613272878288016130dd565b9450506020613283878288016130dd565b935050604061329487828801613185565b925050606085013567ffffffffffffffff8111156132b157600080fd5b6132bd87828801613131565b91505092959194509250565b600080604083850312156132dc57600080fd5b60006132ea858286016130dd565b92505060206132fb858286016130f2565b9150509250929050565b6000806040838503121561331857600080fd5b6000613326858286016130dd565b925050602061333785828601613185565b9150509250929050565b60006020828403121561335357600080fd5b600061336184828501613107565b91505092915050565b60006020828403121561337c57600080fd5b600061338a8482850161311c565b91505092915050565b6000602082840312156133a557600080fd5b600082013567ffffffffffffffff8111156133bf57600080fd5b6133cb8482850161315b565b91505092915050565b6000602082840312156133e657600080fd5b60006133f484828501613185565b91505092915050565b60008060006060848603121561341257600080fd5b600061342086828701613185565b935050602061343186828701613185565b925050604084013567ffffffffffffffff81111561344e57600080fd5b61345a86828701613131565b9150509250925092565b61346d8161458f565b82525050565b61348461347f8261458f565b6146d7565b82525050565b613493816145a1565b82525050565b6134a2816145ad565b82525050565b60006134b382614491565b6134bd81856144a7565b93506134cd818560208601614629565b6134d6816147f2565b840191505092915050565b60006134ec8261449c565b6134f681856144b8565b9350613506818560208601614629565b61350f816147f2565b840191505092915050565b60006135258261449c565b61352f81856144c9565b935061353f818560208601614629565b80840191505092915050565b6000613558602b836144b8565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b60006135be6032836144b8565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006136246026836144b8565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061368a6025836144b8565b91507f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008301527f6f776e65720000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006136f0601c836144b8565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006137306024836144b8565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006137966019836144b8565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006137d6601b836144b8565b91507f53616c65206d7573742062652061637469766520746f206d696e7400000000006000830152602082019050919050565b6000613816602c836144b8565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061387c6038836144b8565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006138e2602a836144b8565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006139486029836144b8565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006139ae6020836144b8565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006139ee602c836144b8565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613a546014836144b8565b91507f4d617820507572636861736520526561636865640000000000000000000000006000830152602082019050919050565b6000613a946011836144b8565b91507f496e76616c6964205369676e61747572650000000000000000000000000000006000830152602082019050919050565b6000613ad46020836144b8565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613b14602f836144b8565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613b7a6021836144b8565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613be06028836144b8565b91507f45786365656420746865206e756d626572206f6620746f6b656e732061626c6560008301527f20746f206d696e740000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c46601d836144b8565b91507f5072652d4d696e74206973206e6f7420617661696c61626c65207965740000006000830152602082019050919050565b6000613c866010836144b8565b91507f4d6178206d696e742072656163686564000000000000000000000000000000006000830152602082019050919050565b6000613cc66031836144b8565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613d2c6008836144b8565b91507f536f6c64206f75740000000000000000000000000000000000000000000000006000830152602082019050919050565b6000613d6c602c836144b8565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000613dd26026836144b8565b91507f496d706f737369626c652072657365727665207768656e2073616c652069732060008301527f61637469766500000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e386027836144b8565b91507f496d706f737369626c65205072652d4d696e74207768656e2073616c6520697360008301527f20616374697665000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e9e6030836144b8565b91507f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f766564000000000000000000000000000000006020830152604082019050919050565b613f0081614603565b82525050565b613f17613f1282614603565b6146fb565b82525050565b613f268161460d565b82525050565b6000613f388285613473565b601482019150613f488284613f06565b6020820191508190509392505050565b6000613f64828561351a565b9150613f70828461351a565b91508190509392505050565b6000602082019050613f916000830184613464565b92915050565b6000608082019050613fac6000830187613464565b613fb96020830186613464565b613fc66040830185613ef7565b8181036060830152613fd881846134a8565b905095945050505050565b6000602082019050613ff8600083018461348a565b92915050565b60006080820190506140136000830187613499565b6140206020830186613f1d565b61402d6040830185613499565b61403a6060830184613499565b95945050505050565b6000602082019050818103600083015261405d81846134e1565b905092915050565b6000602082019050818103600083015261407e8161354b565b9050919050565b6000602082019050818103600083015261409e816135b1565b9050919050565b600060208201905081810360008301526140be81613617565b9050919050565b600060208201905081810360008301526140de8161367d565b9050919050565b600060208201905081810360008301526140fe816136e3565b9050919050565b6000602082019050818103600083015261411e81613723565b9050919050565b6000602082019050818103600083015261413e81613789565b9050919050565b6000602082019050818103600083015261415e816137c9565b9050919050565b6000602082019050818103600083015261417e81613809565b9050919050565b6000602082019050818103600083015261419e8161386f565b9050919050565b600060208201905081810360008301526141be816138d5565b9050919050565b600060208201905081810360008301526141de8161393b565b9050919050565b600060208201905081810360008301526141fe816139a1565b9050919050565b6000602082019050818103600083015261421e816139e1565b9050919050565b6000602082019050818103600083015261423e81613a47565b9050919050565b6000602082019050818103600083015261425e81613a87565b9050919050565b6000602082019050818103600083015261427e81613ac7565b9050919050565b6000602082019050818103600083015261429e81613b07565b9050919050565b600060208201905081810360008301526142be81613b6d565b9050919050565b600060208201905081810360008301526142de81613bd3565b9050919050565b600060208201905081810360008301526142fe81613c39565b9050919050565b6000602082019050818103600083015261431e81613c79565b9050919050565b6000602082019050818103600083015261433e81613cb9565b9050919050565b6000602082019050818103600083015261435e81613d1f565b9050919050565b6000602082019050818103600083015261437e81613d5f565b9050919050565b6000602082019050818103600083015261439e81613dc5565b9050919050565b600060208201905081810360008301526143be81613e2b565b9050919050565b600060208201905081810360008301526143de81613e91565b9050919050565b60006020820190506143fa6000830184613ef7565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614427576144266147c3565b5b8060405250919050565b600067ffffffffffffffff82111561444c5761444b6147c3565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561447c5761447b6147c3565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006144df82614603565b91506144ea83614603565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561451f5761451e614736565b5b828201905092915050565b600061453582614603565b915061454083614603565b9250826145505761454f614765565b5b828204905092915050565b600061456682614603565b915061457183614603565b92508282101561458457614583614736565b5b828203905092915050565b600061459a826145e3565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561464757808201518184015260208101905061462c565b83811115614656576000848401525b50505050565b6000600282049050600182168061467457607f821691505b6020821081141561468857614687614794565b5b50919050565b600061469982614603565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156146cc576146cb614736565b5b600182019050919050565b60006146e2826146e9565b9050919050565b60006146f482614803565b9050919050565b6000819050919050565b600061471082614603565b915061471b83614603565b92508261472b5761472a614765565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b6148198161458f565b811461482457600080fd5b50565b614830816145a1565b811461483b57600080fd5b50565b614847816145b7565b811461485257600080fd5b50565b61485e81614603565b811461486957600080fd5b5056fea26469706673582212207aba85ee7f964462275f3db7ad1ba13b200ec833149624d407296dfce1d2499f64736f6c63430008000033

Deployed Bytecode Sourcemap

50333:3495:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35088:224;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20861:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22078:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21601:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35728:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50521:42;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22828:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35396:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50572:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23238:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34014:245;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35918:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53353:99;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51560:1054;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20555:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20285:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50429:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42806:103;;;:::i;:::-;;50996:86;;;:::i;:::-;;50781:94;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51090:462;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50883:105;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42155:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21030:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52622:721;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22371:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23494:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21205:334;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22597:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50612:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43064:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50470:42;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35088:224;35190:4;35229:35;35214:50;;;:11;:50;;;;:90;;;;35268:36;35292:11;35268:23;:36::i;:::-;35214:90;35207:97;;35088:224;;;:::o;20861:100::-;20915:13;20948:5;20941:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20861:100;:::o;22078:221::-;22154:7;22182:16;22190:7;22182;:16::i;:::-;22174:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22267:15;:24;22283:7;22267:24;;;;;;;;;;;;;;;;;;;;;22260:31;;22078:221;;;:::o;21601:411::-;21682:13;21698:23;21713:7;21698:14;:23::i;:::-;21682:39;;21746:5;21740:11;;:2;:11;;;;21732:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;21840:5;21824:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;21849:37;21866:5;21873:12;:10;:12::i;:::-;21849:16;:37::i;:::-;21824:62;21802:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;21983:21;21992:2;21996:7;21983:8;:21::i;:::-;21601:411;;;:::o;35728:113::-;35789:7;35816:10;:17;;;;35809:24;;35728:113;:::o;50521:42::-;;;;;;;;;;;;;;;;;:::o;22828:339::-;23023:41;23042:12;:10;:12::i;:::-;23056:7;23023:18;:41::i;:::-;23015:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;23131:28;23141:4;23147:2;23151:7;23131:9;:28::i;:::-;22828:339;;;:::o;35396:256::-;35493:7;35529:23;35546:5;35529:16;:23::i;:::-;35521:5;:31;35513:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;35618:12;:19;35631:5;35618:19;;;;;;;;;;;;;;;:26;35638:5;35618:26;;;;;;;;;;;;35611:33;;35396:256;;;;:::o;50572:31::-;;;;;;;;;;;;;:::o;23238:185::-;23376:39;23393:4;23399:2;23403:7;23376:39;;;;;;;;;;;;:16;:39::i;:::-;23238:185;;;:::o;34014:245::-;34132:41;34151:12;:10;:12::i;:::-;34165:7;34132:18;:41::i;:::-;34124:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;34237:14;34243:7;34237:5;:14::i;:::-;34014:245;:::o;35918:233::-;35993:7;36029:30;:28;:30::i;:::-;36021:5;:38;36013:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;36126:10;36137:5;36126:17;;;;;;;;;;;;;;;;;;;;;;;;36119:24;;35918:233;;;:::o;53353:99::-;42386:12;:10;:12::i;:::-;42375:23;;:7;:5;:7::i;:::-;:23;;;42367:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53424:20:::1;53436:7;53424:11;:20::i;:::-;53353:99:::0;:::o;51560:1054::-;51653:16;51672:29;51687:13;:11;:13::i;:::-;50507:5;51672:14;;:29;;;;:::i;:::-;51653:48;;51732:1;51720:8;:13;;51712:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;51788:8;51771:14;:25;51767:83;;;51830:8;51813:25;;51767:83;51862:12;51921:1;51893:30;;:16;;;;;;;;;;;:30;;;;51885:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;51992:5;51976:21;;:12;;;;;;;;;;;:21;;;51968:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;52081:12;;52063:14;:30;;52055:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;52185:12;:10;:12::i;:::-;52199:3;52168:35;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52158:46;;;;;;52151:53;;52252:16;;;;;;;;;;;52225:43;;:23;52233:4;52238:9;52225:7;:23::i;:::-;:43;;;52217:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;52355:3;52311:40;52336:14;52311:6;:20;52318:12;:10;:12::i;:::-;52311:20;;;;;;;;;;;;;;;;:24;;:40;;;;:::i;:::-;:47;;52303:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;52415:40;52440:14;52415:6;:20;52422:12;:10;:12::i;:::-;52415:20;;;;;;;;;;;;;;;;:24;;:40;;;;:::i;:::-;52392:6;:20;52399:12;:10;:12::i;:::-;52392:20;;;;;;;;;;;;;;;:63;;;;52468:11;52482:13;:11;:13::i;:::-;52468:27;;52510:6;52506:101;52526:14;52522:1;:18;52506:101;;;52562:33;52572:12;:10;:12::i;:::-;52593:1;52586:6;:8;;;;:::i;:::-;52562:9;:33::i;:::-;52542:3;;;;;:::i;:::-;;;;52506:101;;;;51560:1054;;;;;;:::o;20555:239::-;20627:7;20647:13;20663:7;:16;20671:7;20663:16;;;;;;;;;;;;;;;;;;;;;20647:32;;20715:1;20698:19;;:5;:19;;;;20690:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;20781:5;20774:12;;;20555:239;;;:::o;20285:208::-;20357:7;20402:1;20385:19;;:5;:19;;;;20377:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;20469:9;:16;20479:5;20469:16;;;;;;;;;;;;;;;;20462:23;;20285:208;;;:::o;50429:32::-;;;;:::o;42806:103::-;42386:12;:10;:12::i;:::-;42375:23;;:7;:5;:7::i;:::-;:23;;;42367:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42871:30:::1;42898:1;42871:18;:30::i;:::-;42806:103::o:0;50996:86::-;42386:12;:10;:12::i;:::-;42375:23;;:7;:5;:7::i;:::-;:23;;;42367:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51062:12:::1;;;;;;;;;;;51061:13;51046:12;;:28;;;;;;;;;;;;;;;;;;50996:86::o:0;50781:94::-;42386:12;:10;:12::i;:::-;42375:23;;:7;:5;:7::i;:::-;:23;;;42367:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50864:3:::1;50849:12;:18;;;;50781:94:::0;:::o;51090:462::-;42386:12;:10;:12::i;:::-;42375:23;;:7;:5;:7::i;:::-;:23;;;42367:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51164:16:::1;51183:29;51198:13;:11;:13::i;:::-;50507:5;51183:14;;:29;;;;:::i;:::-;51164:48;;51247:5;51231:21;;:12;;;;;;;;;;;:21;;;51223:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;51329:8;51312:14;:25;51308:83;;;51371:8;51354:25;;51308:83;51403:11;51417:13;:11;:13::i;:::-;51403:27;;51446:6;51441:104;51462:14;51458:1;:18;51441:104;;;51498:35;51508:12;:10;:12::i;:::-;51531:1;51522:6;:10;;;;:::i;:::-;51498:9;:35::i;:::-;51478:3;;;;;:::i;:::-;;;;51441:104;;;;42446:1;;51090:462:::0;:::o;50883:105::-;42386:12;:10;:12::i;:::-;42375:23;;:7;:5;:7::i;:::-;:23;;;42367:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50974:6:::1;50955:16;;:25;;;;;;;;;;;;;;;;;;50883:105:::0;:::o;42155:87::-;42201:7;42228:6;;;;;;;;;;;42221:13;;42155:87;:::o;21030:104::-;21086:13;21119:7;21112:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21030:104;:::o;52622:721::-;52678:16;52697:29;52712:13;:11;:13::i;:::-;50507:5;52697:14;;:29;;;;:::i;:::-;52678:48;;52757:1;52745:8;:13;;52737:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;52813:8;52796:14;:25;52792:83;;;52855:8;52838:25;;52792:83;52934:12;;52891:40;52916:14;52891:6;:20;52898:12;:10;:12::i;:::-;52891:20;;;;;;;;;;;;;;;;:24;;:40;;;;:::i;:::-;:55;52887:143;;;52980:38;52997:6;:20;53004:12;:10;:12::i;:::-;52997:20;;;;;;;;;;;;;;;;52980:12;;:16;;:38;;;;:::i;:::-;52963:55;;52887:143;53066:1;53048:14;:19;;53040:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;53113:12;;;;;;;;;;;53105:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;53182:6;53178:107;53198:14;53194:1;:18;53178:107;;;53234:38;53244:12;:10;:12::i;:::-;53258:13;:11;:13::i;:::-;53234:9;:38::i;:::-;53214:3;;;;;:::i;:::-;;;;53178:107;;;;53295:40;53320:14;53295:6;:20;53302:12;:10;:12::i;:::-;53295:20;;;;;;;;;;;;;;;;:24;;:40;;;;:::i;:::-;;52622:721;;:::o;22371:155::-;22466:52;22485:12;:10;:12::i;:::-;22499:8;22509;22466:18;:52::i;:::-;22371:155;;:::o;23494:328::-;23669:41;23688:12;:10;:12::i;:::-;23702:7;23669:18;:41::i;:::-;23661:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;23775:39;23789:4;23795:2;23799:7;23808:5;23775:13;:39::i;:::-;23494:328;;;;:::o;21205:334::-;21278:13;21312:16;21320:7;21312;:16::i;:::-;21304:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;21393:22;21418:7;21393:32;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21468:1;21449:8;21443:22;:26;:88;;;;;;;;;;;;;;;;;21496:8;21506:18;:7;:16;:18::i;:::-;21479:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;21443:88;21436:95;;;21205:334;;;:::o;22597:164::-;22694:4;22718:18;:25;22737:5;22718:25;;;;;;;;;;;;;;;:35;22744:8;22718:35;;;;;;;;;;;;;;;;;;;;;;;;;22711:42;;22597:164;;;;:::o;50612:32::-;;;;;;;;;;;;;:::o;43064:201::-;42386:12;:10;:12::i;:::-;42375:23;;:7;:5;:7::i;:::-;:23;;;42367:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43173:1:::1;43153:22;;:8;:22;;;;43145:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;43229:28;43248:8;43229:18;:28::i;:::-;43064:201:::0;:::o;50470:42::-;50507:5;50470:42;:::o;19916:305::-;20018:4;20070:25;20055:40;;;:11;:40;;;;:105;;;;20127:33;20112:48;;;:11;:48;;;;20055:105;:158;;;;20177:36;20201:11;20177:23;:36::i;:::-;20055:158;20035:178;;19916:305;;;:::o;25332:127::-;25397:4;25449:1;25421:30;;:7;:16;25429:7;25421:16;;;;;;;;;;;;;;;;;;;;;:30;;;;25414:37;;25332:127;;;:::o;15590:98::-;15643:7;15670:10;15663:17;;15590:98;:::o;29478:174::-;29580:2;29553:15;:24;29569:7;29553:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;29636:7;29632:2;29598:46;;29607:23;29622:7;29607:14;:23::i;:::-;29598:46;;;;;;;;;;;;29478:174;;:::o;25626:348::-;25719:4;25744:16;25752:7;25744;:16::i;:::-;25736:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25820:13;25836:23;25851:7;25836:14;:23::i;:::-;25820:39;;25889:5;25878:16;;:7;:16;;;:51;;;;25922:7;25898:31;;:20;25910:7;25898:11;:20::i;:::-;:31;;;25878:51;:87;;;;25933:32;25950:5;25957:7;25933:16;:32::i;:::-;25878:87;25870:96;;;25626:348;;;;:::o;28735:625::-;28894:4;28867:31;;:23;28882:7;28867:14;:23::i;:::-;:31;;;28859:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;28973:1;28959:16;;:2;:16;;;;28951:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;29029:39;29050:4;29056:2;29060:7;29029:20;:39::i;:::-;29133:29;29150:1;29154:7;29133:8;:29::i;:::-;29194:1;29175:9;:15;29185:4;29175:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;29223:1;29206:9;:13;29216:2;29206:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29254:2;29235:7;:16;29243:7;29235:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29293:7;29289:2;29274:27;;29283:4;29274:27;;;;;;;;;;;;29314:38;29334:4;29340:2;29344:7;29314:19;:38::i;:::-;28735:625;;;:::o;27978:420::-;28038:13;28054:23;28069:7;28054:14;:23::i;:::-;28038:39;;28090:48;28111:5;28126:1;28130:7;28090:20;:48::i;:::-;28179:29;28196:1;28200:7;28179:8;:29::i;:::-;28241:1;28221:9;:16;28231:5;28221:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;28260:7;:16;28268:7;28260:16;;;;;;;;;;;;28253:23;;;;;;;;;;;28322:7;28318:1;28294:36;;28303:5;28294:36;;;;;;;;;;;;28343:47;28363:5;28378:1;28382:7;28343:19;:47::i;:::-;27978:420;;:::o;32691:91::-;32766:8;32756:7;:18;;;;;;;;;;;;:::i;:::-;;32691:91;:::o;46549:98::-;46607:7;46638:1;46634;:5;;;;:::i;:::-;46627:12;;46549:98;;;;:::o;53462:362::-;53538:7;53558:9;53578;53598:7;53672:2;53664:7;53660:15;53654:22;53650:26;;53712:2;53704:7;53700:15;53694:22;53690:26;;53762:3;53756:2;53748:7;53744:15;53738:22;53734:32;53730:36;;53794:22;53804:5;53810:1;53812;53814;53794:22;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53787:29;;;;;53462:362;;;;:::o;46168:98::-;46226:7;46257:1;46253;:5;;;;:::i;:::-;46246:12;;46168:98;;;;:::o;26316:110::-;26392:26;26402:2;26406:7;26392:26;;;;;;;;;;;;:9;:26::i;:::-;26316:110;;:::o;43425:191::-;43499:16;43518:6;;;;;;;;;;;43499:25;;43544:8;43535:6;;:17;;;;;;;;;;;;;;;;;;43599:8;43568:40;;43589:8;43568:40;;;;;;;;;;;;43425:191;;:::o;29794:315::-;29949:8;29940:17;;:5;:17;;;;29932:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;30036:8;29998:18;:25;30017:5;29998:25;;;;;;;;;;;;;;;:35;30024:8;29998:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;30082:8;30060:41;;30075:5;30060:41;;;30092:8;30060:41;;;;;;:::i;:::-;;;;;;;;29794:315;;;:::o;24704:::-;24861:28;24871:4;24877:2;24881:7;24861:9;:28::i;:::-;24908:48;24931:4;24937:2;24941:7;24950:5;24908:22;:48::i;:::-;24900:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;24704:315;;;;:::o;16032:723::-;16088:13;16318:1;16309:5;:10;16305:53;;;16336:10;;;;;;;;;;;;;;;;;;;;;16305:53;16368:12;16383:5;16368:20;;16399:14;16424:78;16439:1;16431:4;:9;16424:78;;16457:8;;;;;:::i;:::-;;;;16488:2;16480:10;;;;;:::i;:::-;;;16424:78;;;16512:19;16544:6;16534:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16512:39;;16562:154;16578:1;16569:5;:10;16562:154;;16606:1;16596:11;;;;;:::i;:::-;;;16673:2;16665:5;:10;;;;:::i;:::-;16652:2;:24;;;;:::i;:::-;16639:39;;16622:6;16629;16622:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;16702:2;16693:11;;;;;:::i;:::-;;;16562:154;;;16740:6;16726:21;;;;;16032:723;;;;:::o;18489:157::-;18574:4;18613:25;18598:40;;;:11;:40;;;;18591:47;;18489:157;;;:::o;36764:589::-;36908:45;36935:4;36941:2;36945:7;36908:26;:45::i;:::-;36986:1;36970:18;;:4;:18;;;36966:187;;;37005:40;37037:7;37005:31;:40::i;:::-;36966:187;;;37075:2;37067:10;;:4;:10;;;37063:90;;37094:47;37127:4;37133:7;37094:32;:47::i;:::-;37063:90;36966:187;37181:1;37167:16;;:2;:16;;;37163:183;;;37200:45;37237:7;37200:36;:45::i;:::-;37163:183;;;37273:4;37267:10;;:2;:10;;;37263:83;;37294:40;37322:2;37326:7;37294:27;:40::i;:::-;37263:83;37163:183;36764:589;;;:::o;32556:125::-;;;;:::o;26653:321::-;26783:18;26789:2;26793:7;26783:5;:18::i;:::-;26834:54;26865:1;26869:2;26873:7;26882:5;26834:22;:54::i;:::-;26812:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;26653:321;;;:::o;30674:799::-;30829:4;30850:15;:2;:13;;;:15::i;:::-;30846:620;;;30902:2;30886:36;;;30923:12;:10;:12::i;:::-;30937:4;30943:7;30952:5;30886:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;30882:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31145:1;31128:6;:13;:18;31124:272;;;31171:60;;;;;;;;;;:::i;:::-;;;;;;;;31124:272;31346:6;31340:13;31331:6;31327:2;31323:15;31316:38;30882:529;31019:41;;;31009:51;;;:6;:51;;;;31002:58;;;;;30846:620;31450:4;31443:11;;30674:799;;;;;;;:::o;32045:126::-;;;;:::o;38076:164::-;38180:10;:17;;;;38153:15;:24;38169:7;38153:24;;;;;;;;;;;:44;;;;38208:10;38224:7;38208:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38076:164;:::o;38867:988::-;39133:22;39183:1;39158:22;39175:4;39158:16;:22::i;:::-;:26;;;;:::i;:::-;39133:51;;39195:18;39216:17;:26;39234:7;39216:26;;;;;;;;;;;;39195:47;;39363:14;39349:10;:28;39345:328;;39394:19;39416:12;:18;39429:4;39416:18;;;;;;;;;;;;;;;:34;39435:14;39416:34;;;;;;;;;;;;39394:56;;39500:11;39467:12;:18;39480:4;39467:18;;;;;;;;;;;;;;;:30;39486:10;39467:30;;;;;;;;;;;:44;;;;39617:10;39584:17;:30;39602:11;39584:30;;;;;;;;;;;:43;;;;39345:328;;39769:17;:26;39787:7;39769:26;;;;;;;;;;;39762:33;;;39813:12;:18;39826:4;39813:18;;;;;;;;;;;;;;;:34;39832:14;39813:34;;;;;;;;;;;39806:41;;;38867:988;;;;:::o;40150:1079::-;40403:22;40448:1;40428:10;:17;;;;:21;;;;:::i;:::-;40403:46;;40460:18;40481:15;:24;40497:7;40481:24;;;;;;;;;;;;40460:45;;40832:19;40854:10;40865:14;40854:26;;;;;;;;;;;;;;;;;;;;;;;;40832:48;;40918:11;40893:10;40904;40893:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;41029:10;40998:15;:28;41014:11;40998:28;;;;;;;;;;;:41;;;;41170:15;:24;41186:7;41170:24;;;;;;;;;;;41163:31;;;41205:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40150:1079;;;;:::o;37654:221::-;37739:14;37756:20;37773:2;37756:16;:20::i;:::-;37739:37;;37814:7;37787:12;:16;37800:2;37787:16;;;;;;;;;;;;;;;:24;37804:6;37787:24;;;;;;;;;;;:34;;;;37861:6;37832:17;:26;37850:7;37832:26;;;;;;;;;;;:35;;;;37654:221;;;:::o;27310:439::-;27404:1;27390:16;;:2;:16;;;;27382:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;27463:16;27471:7;27463;:16::i;:::-;27462:17;27454:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;27525:45;27554:1;27558:2;27562:7;27525:20;:45::i;:::-;27600:1;27583:9;:13;27593:2;27583:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;27631:2;27612:7;:16;27620:7;27612:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;27676:7;27672:2;27651:33;;27668:1;27651:33;;;;;;;;;;;;27697:44;27725:1;27729:2;27733:7;27697:19;:44::i;:::-;27310:439;;:::o;7751:326::-;7811:4;8068:1;8046:7;:12;;;;;;;;;;;;;;;;;;;;;;;;;:19;:23;8039:30;;7751:326;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:133::-;;931:6;918:20;909:29;;947:30;971:5;947:30;:::i;:::-;899:84;;;;:::o;989:137::-;;1072:6;1059:20;1050:29;;1088:32;1114:5;1088:32;:::i;:::-;1040:86;;;;:::o;1132:141::-;;1219:6;1213:13;1204:22;;1235:32;1261:5;1235:32;:::i;:::-;1194:79;;;;:::o;1292:271::-;;1396:3;1389:4;1381:6;1377:17;1373:27;1363:2;;1414:1;1411;1404:12;1363:2;1454:6;1441:20;1479:78;1553:3;1545:6;1538:4;1530:6;1526:17;1479:78;:::i;:::-;1470:87;;1353:210;;;;;:::o;1583:273::-;;1688:3;1681:4;1673:6;1669:17;1665:27;1655:2;;1706:1;1703;1696:12;1655:2;1746:6;1733:20;1771:79;1846:3;1838:6;1831:4;1823:6;1819:17;1771:79;:::i;:::-;1762:88;;1645:211;;;;;:::o;1862:139::-;;1946:6;1933:20;1924:29;;1962:33;1989:5;1962:33;:::i;:::-;1914:87;;;;:::o;2007:262::-;;2115:2;2103:9;2094:7;2090:23;2086:32;2083:2;;;2131:1;2128;2121:12;2083:2;2174:1;2199:53;2244:7;2235:6;2224:9;2220:22;2199:53;:::i;:::-;2189:63;;2145:117;2073:196;;;;:::o;2275:407::-;;;2400:2;2388:9;2379:7;2375:23;2371:32;2368:2;;;2416:1;2413;2406:12;2368:2;2459:1;2484:53;2529:7;2520:6;2509:9;2505:22;2484:53;:::i;:::-;2474:63;;2430:117;2586:2;2612:53;2657:7;2648:6;2637:9;2633:22;2612:53;:::i;:::-;2602:63;;2557:118;2358:324;;;;;:::o;2688:552::-;;;;2830:2;2818:9;2809:7;2805:23;2801:32;2798:2;;;2846:1;2843;2836:12;2798:2;2889:1;2914:53;2959:7;2950:6;2939:9;2935:22;2914:53;:::i;:::-;2904:63;;2860:117;3016:2;3042:53;3087:7;3078:6;3067:9;3063:22;3042:53;:::i;:::-;3032:63;;2987:118;3144:2;3170:53;3215:7;3206:6;3195:9;3191:22;3170:53;:::i;:::-;3160:63;;3115:118;2788:452;;;;;:::o;3246:809::-;;;;;3414:3;3402:9;3393:7;3389:23;3385:33;3382:2;;;3431:1;3428;3421:12;3382:2;3474:1;3499:53;3544:7;3535:6;3524:9;3520:22;3499:53;:::i;:::-;3489:63;;3445:117;3601:2;3627:53;3672:7;3663:6;3652:9;3648:22;3627:53;:::i;:::-;3617:63;;3572:118;3729:2;3755:53;3800:7;3791:6;3780:9;3776:22;3755:53;:::i;:::-;3745:63;;3700:118;3885:2;3874:9;3870:18;3857:32;3916:18;3908:6;3905:30;3902:2;;;3948:1;3945;3938:12;3902:2;3976:62;4030:7;4021:6;4010:9;4006:22;3976:62;:::i;:::-;3966:72;;3828:220;3372:683;;;;;;;:::o;4061:401::-;;;4183:2;4171:9;4162:7;4158:23;4154:32;4151:2;;;4199:1;4196;4189:12;4151:2;4242:1;4267:53;4312:7;4303:6;4292:9;4288:22;4267:53;:::i;:::-;4257:63;;4213:117;4369:2;4395:50;4437:7;4428:6;4417:9;4413:22;4395:50;:::i;:::-;4385:60;;4340:115;4141:321;;;;;:::o;4468:407::-;;;4593:2;4581:9;4572:7;4568:23;4564:32;4561:2;;;4609:1;4606;4599:12;4561:2;4652:1;4677:53;4722:7;4713:6;4702:9;4698:22;4677:53;:::i;:::-;4667:63;;4623:117;4779:2;4805:53;4850:7;4841:6;4830:9;4826:22;4805:53;:::i;:::-;4795:63;;4750:118;4551:324;;;;;:::o;4881:260::-;;4988:2;4976:9;4967:7;4963:23;4959:32;4956:2;;;5004:1;5001;4994:12;4956:2;5047:1;5072:52;5116:7;5107:6;5096:9;5092:22;5072:52;:::i;:::-;5062:62;;5018:116;4946:195;;;;:::o;5147:282::-;;5265:2;5253:9;5244:7;5240:23;5236:32;5233:2;;;5281:1;5278;5271:12;5233:2;5324:1;5349:63;5404:7;5395:6;5384:9;5380:22;5349:63;:::i;:::-;5339:73;;5295:127;5223:206;;;;:::o;5435:375::-;;5553:2;5541:9;5532:7;5528:23;5524:32;5521:2;;;5569:1;5566;5559:12;5521:2;5640:1;5629:9;5625:17;5612:31;5670:18;5662:6;5659:30;5656:2;;;5702:1;5699;5692:12;5656:2;5730:63;5785:7;5776:6;5765:9;5761:22;5730:63;:::i;:::-;5720:73;;5583:220;5511:299;;;;:::o;5816:262::-;;5924:2;5912:9;5903:7;5899:23;5895:32;5892:2;;;5940:1;5937;5930:12;5892:2;5983:1;6008:53;6053:7;6044:6;6033:9;6029:22;6008:53;:::i;:::-;5998:63;;5954:117;5882:196;;;;:::o;6084:663::-;;;;6235:2;6223:9;6214:7;6210:23;6206:32;6203:2;;;6251:1;6248;6241:12;6203:2;6294:1;6319:53;6364:7;6355:6;6344:9;6340:22;6319:53;:::i;:::-;6309:63;;6265:117;6421:2;6447:53;6492:7;6483:6;6472:9;6468:22;6447:53;:::i;:::-;6437:63;;6392:118;6577:2;6566:9;6562:18;6549:32;6608:18;6600:6;6597:30;6594:2;;;6640:1;6637;6630:12;6594:2;6668:62;6722:7;6713:6;6702:9;6698:22;6668:62;:::i;:::-;6658:72;;6520:220;6193:554;;;;;:::o;6753:118::-;6840:24;6858:5;6840:24;:::i;:::-;6835:3;6828:37;6818:53;;:::o;6877:157::-;6982:45;7002:24;7020:5;7002:24;:::i;:::-;6982:45;:::i;:::-;6977:3;6970:58;6960:74;;:::o;7040:109::-;7121:21;7136:5;7121:21;:::i;:::-;7116:3;7109:34;7099:50;;:::o;7155:118::-;7242:24;7260:5;7242:24;:::i;:::-;7237:3;7230:37;7220:53;;:::o;7279:360::-;;7393:38;7425:5;7393:38;:::i;:::-;7447:70;7510:6;7505:3;7447:70;:::i;:::-;7440:77;;7526:52;7571:6;7566:3;7559:4;7552:5;7548:16;7526:52;:::i;:::-;7603:29;7625:6;7603:29;:::i;:::-;7598:3;7594:39;7587:46;;7369:270;;;;;:::o;7645:364::-;;7761:39;7794:5;7761:39;:::i;:::-;7816:71;7880:6;7875:3;7816:71;:::i;:::-;7809:78;;7896:52;7941:6;7936:3;7929:4;7922:5;7918:16;7896:52;:::i;:::-;7973:29;7995:6;7973:29;:::i;:::-;7968:3;7964:39;7957:46;;7737:272;;;;;:::o;8015:377::-;;8149:39;8182:5;8149:39;:::i;:::-;8204:89;8286:6;8281:3;8204:89;:::i;:::-;8197:96;;8302:52;8347:6;8342:3;8335:4;8328:5;8324:16;8302:52;:::i;:::-;8379:6;8374:3;8370:16;8363:23;;8125:267;;;;;:::o;8398:375::-;;8561:67;8625:2;8620:3;8561:67;:::i;:::-;8554:74;;8658:34;8654:1;8649:3;8645:11;8638:55;8724:13;8719:2;8714:3;8710:12;8703:35;8764:2;8759:3;8755:12;8748:19;;8544:229;;;:::o;8779:382::-;;8942:67;9006:2;9001:3;8942:67;:::i;:::-;8935:74;;9039:34;9035:1;9030:3;9026:11;9019:55;9105:20;9100:2;9095:3;9091:12;9084:42;9152:2;9147:3;9143:12;9136:19;;8925:236;;;:::o;9167:370::-;;9330:67;9394:2;9389:3;9330:67;:::i;:::-;9323:74;;9427:34;9423:1;9418:3;9414:11;9407:55;9493:8;9488:2;9483:3;9479:12;9472:30;9528:2;9523:3;9519:12;9512:19;;9313:224;;;:::o;9543:369::-;;9706:67;9770:2;9765:3;9706:67;:::i;:::-;9699:74;;9803:34;9799:1;9794:3;9790:11;9783:55;9869:7;9864:2;9859:3;9855:12;9848:29;9903:2;9898:3;9894:12;9887:19;;9689:223;;;:::o;9918:326::-;;10081:67;10145:2;10140:3;10081:67;:::i;:::-;10074:74;;10178:30;10174:1;10169:3;10165:11;10158:51;10235:2;10230:3;10226:12;10219:19;;10064:180;;;:::o;10250:368::-;;10413:67;10477:2;10472:3;10413:67;:::i;:::-;10406:74;;10510:34;10506:1;10501:3;10497:11;10490:55;10576:6;10571:2;10566:3;10562:12;10555:28;10609:2;10604:3;10600:12;10593:19;;10396:222;;;:::o;10624:323::-;;10787:67;10851:2;10846:3;10787:67;:::i;:::-;10780:74;;10884:27;10880:1;10875:3;10871:11;10864:48;10938:2;10933:3;10929:12;10922:19;;10770:177;;;:::o;10953:325::-;;11116:67;11180:2;11175:3;11116:67;:::i;:::-;11109:74;;11213:29;11209:1;11204:3;11200:11;11193:50;11269:2;11264:3;11260:12;11253:19;;11099:179;;;:::o;11284:376::-;;11447:67;11511:2;11506:3;11447:67;:::i;:::-;11440:74;;11544:34;11540:1;11535:3;11531:11;11524:55;11610:14;11605:2;11600:3;11596:12;11589:36;11651:2;11646:3;11642:12;11635:19;;11430:230;;;:::o;11666:388::-;;11829:67;11893:2;11888:3;11829:67;:::i;:::-;11822:74;;11926:34;11922:1;11917:3;11913:11;11906:55;11992:26;11987:2;11982:3;11978:12;11971:48;12045:2;12040:3;12036:12;12029:19;;11812:242;;;:::o;12060:374::-;;12223:67;12287:2;12282:3;12223:67;:::i;:::-;12216:74;;12320:34;12316:1;12311:3;12307:11;12300:55;12386:12;12381:2;12376:3;12372:12;12365:34;12425:2;12420:3;12416:12;12409:19;;12206:228;;;:::o;12440:373::-;;12603:67;12667:2;12662:3;12603:67;:::i;:::-;12596:74;;12700:34;12696:1;12691:3;12687:11;12680:55;12766:11;12761:2;12756:3;12752:12;12745:33;12804:2;12799:3;12795:12;12788:19;;12586:227;;;:::o;12819:330::-;;12982:67;13046:2;13041:3;12982:67;:::i;:::-;12975:74;;13079:34;13075:1;13070:3;13066:11;13059:55;13140:2;13135:3;13131:12;13124:19;;12965:184;;;:::o;13155:376::-;;13318:67;13382:2;13377:3;13318:67;:::i;:::-;13311:74;;13415:34;13411:1;13406:3;13402:11;13395:55;13481:14;13476:2;13471:3;13467:12;13460:36;13522:2;13517:3;13513:12;13506:19;;13301:230;;;:::o;13537:318::-;;13700:67;13764:2;13759:3;13700:67;:::i;:::-;13693:74;;13797:22;13793:1;13788:3;13784:11;13777:43;13846:2;13841:3;13837:12;13830:19;;13683:172;;;:::o;13861:315::-;;14024:67;14088:2;14083:3;14024:67;:::i;:::-;14017:74;;14121:19;14117:1;14112:3;14108:11;14101:40;14167:2;14162:3;14158:12;14151:19;;14007:169;;;:::o;14182:330::-;;14345:67;14409:2;14404:3;14345:67;:::i;:::-;14338:74;;14442:34;14438:1;14433:3;14429:11;14422:55;14503:2;14498:3;14494:12;14487:19;;14328:184;;;:::o;14518:379::-;;14681:67;14745:2;14740:3;14681:67;:::i;:::-;14674:74;;14778:34;14774:1;14769:3;14765:11;14758:55;14844:17;14839:2;14834:3;14830:12;14823:39;14888:2;14883:3;14879:12;14872:19;;14664:233;;;:::o;14903:365::-;;15066:67;15130:2;15125:3;15066:67;:::i;:::-;15059:74;;15163:34;15159:1;15154:3;15150:11;15143:55;15229:3;15224:2;15219:3;15215:12;15208:25;15259:2;15254:3;15250:12;15243:19;;15049:219;;;:::o;15274:372::-;;15437:67;15501:2;15496:3;15437:67;:::i;:::-;15430:74;;15534:34;15530:1;15525:3;15521:11;15514:55;15600:10;15595:2;15590:3;15586:12;15579:32;15637:2;15632:3;15628:12;15621:19;;15420:226;;;:::o;15652:327::-;;15815:67;15879:2;15874:3;15815:67;:::i;:::-;15808:74;;15912:31;15908:1;15903:3;15899:11;15892:52;15970:2;15965:3;15961:12;15954:19;;15798:181;;;:::o;15985:314::-;;16148:67;16212:2;16207:3;16148:67;:::i;:::-;16141:74;;16245:18;16241:1;16236:3;16232:11;16225:39;16290:2;16285:3;16281:12;16274:19;;16131:168;;;:::o;16305:381::-;;16468:67;16532:2;16527:3;16468:67;:::i;:::-;16461:74;;16565:34;16561:1;16556:3;16552:11;16545:55;16631:19;16626:2;16621:3;16617:12;16610:41;16677:2;16672:3;16668:12;16661:19;;16451:235;;;:::o;16692:305::-;;16855:66;16919:1;16914:3;16855:66;:::i;:::-;16848:73;;16951:10;16947:1;16942:3;16938:11;16931:31;16988:2;16983:3;16979:12;16972:19;;16838:159;;;:::o;17003:376::-;;17166:67;17230:2;17225:3;17166:67;:::i;:::-;17159:74;;17263:34;17259:1;17254:3;17250:11;17243:55;17329:14;17324:2;17319:3;17315:12;17308:36;17370:2;17365:3;17361:12;17354:19;;17149:230;;;:::o;17385:370::-;;17548:67;17612:2;17607:3;17548:67;:::i;:::-;17541:74;;17645:34;17641:1;17636:3;17632:11;17625:55;17711:8;17706:2;17701:3;17697:12;17690:30;17746:2;17741:3;17737:12;17730:19;;17531:224;;;:::o;17761:371::-;;17924:67;17988:2;17983:3;17924:67;:::i;:::-;17917:74;;18021:34;18017:1;18012:3;18008:11;18001:55;18087:9;18082:2;18077:3;18073:12;18066:31;18123:2;18118:3;18114:12;18107:19;;17907:225;;;:::o;18138:380::-;;18301:67;18365:2;18360:3;18301:67;:::i;:::-;18294:74;;18398:34;18394:1;18389:3;18385:11;18378:55;18464:18;18459:2;18454:3;18450:12;18443:40;18509:2;18504:3;18500:12;18493:19;;18284:234;;;:::o;18524:118::-;18611:24;18629:5;18611:24;:::i;:::-;18606:3;18599:37;18589:53;;:::o;18648:157::-;18753:45;18773:24;18791:5;18773:24;:::i;:::-;18753:45;:::i;:::-;18748:3;18741:58;18731:74;;:::o;18811:112::-;18894:22;18910:5;18894:22;:::i;:::-;18889:3;18882:35;18872:51;;:::o;18929:397::-;;19084:75;19155:3;19146:6;19084:75;:::i;:::-;19184:2;19179:3;19175:12;19168:19;;19197:75;19268:3;19259:6;19197:75;:::i;:::-;19297:2;19292:3;19288:12;19281:19;;19317:3;19310:10;;19073:253;;;;;:::o;19332:435::-;;19534:95;19625:3;19616:6;19534:95;:::i;:::-;19527:102;;19646:95;19737:3;19728:6;19646:95;:::i;:::-;19639:102;;19758:3;19751:10;;19516:251;;;;;:::o;19773:222::-;;19904:2;19893:9;19889:18;19881:26;;19917:71;19985:1;19974:9;19970:17;19961:6;19917:71;:::i;:::-;19871:124;;;;:::o;20001:640::-;;20234:3;20223:9;20219:19;20211:27;;20248:71;20316:1;20305:9;20301:17;20292:6;20248:71;:::i;:::-;20329:72;20397:2;20386:9;20382:18;20373:6;20329:72;:::i;:::-;20411;20479:2;20468:9;20464:18;20455:6;20411:72;:::i;:::-;20530:9;20524:4;20520:20;20515:2;20504:9;20500:18;20493:48;20558:76;20629:4;20620:6;20558:76;:::i;:::-;20550:84;;20201:440;;;;;;;:::o;20647:210::-;;20772:2;20761:9;20757:18;20749:26;;20785:65;20847:1;20836:9;20832:17;20823:6;20785:65;:::i;:::-;20739:118;;;;:::o;20863:545::-;;21074:3;21063:9;21059:19;21051:27;;21088:71;21156:1;21145:9;21141:17;21132:6;21088:71;:::i;:::-;21169:68;21233:2;21222:9;21218:18;21209:6;21169:68;:::i;:::-;21247:72;21315:2;21304:9;21300:18;21291:6;21247:72;:::i;:::-;21329;21397:2;21386:9;21382:18;21373:6;21329:72;:::i;:::-;21041:367;;;;;;;:::o;21414:313::-;;21565:2;21554:9;21550:18;21542:26;;21614:9;21608:4;21604:20;21600:1;21589:9;21585:17;21578:47;21642:78;21715:4;21706:6;21642:78;:::i;:::-;21634:86;;21532:195;;;;:::o;21733:419::-;;21937:2;21926:9;21922:18;21914:26;;21986:9;21980:4;21976:20;21972:1;21961:9;21957:17;21950:47;22014:131;22140:4;22014:131;:::i;:::-;22006:139;;21904:248;;;:::o;22158:419::-;;22362:2;22351:9;22347:18;22339:26;;22411:9;22405:4;22401:20;22397:1;22386:9;22382:17;22375:47;22439:131;22565:4;22439:131;:::i;:::-;22431:139;;22329:248;;;:::o;22583:419::-;;22787:2;22776:9;22772:18;22764:26;;22836:9;22830:4;22826:20;22822:1;22811:9;22807:17;22800:47;22864:131;22990:4;22864:131;:::i;:::-;22856:139;;22754:248;;;:::o;23008:419::-;;23212:2;23201:9;23197:18;23189:26;;23261:9;23255:4;23251:20;23247:1;23236:9;23232:17;23225:47;23289:131;23415:4;23289:131;:::i;:::-;23281:139;;23179:248;;;:::o;23433:419::-;;23637:2;23626:9;23622:18;23614:26;;23686:9;23680:4;23676:20;23672:1;23661:9;23657:17;23650:47;23714:131;23840:4;23714:131;:::i;:::-;23706:139;;23604:248;;;:::o;23858:419::-;;24062:2;24051:9;24047:18;24039:26;;24111:9;24105:4;24101:20;24097:1;24086:9;24082:17;24075:47;24139:131;24265:4;24139:131;:::i;:::-;24131:139;;24029:248;;;:::o;24283:419::-;;24487:2;24476:9;24472:18;24464:26;;24536:9;24530:4;24526:20;24522:1;24511:9;24507:17;24500:47;24564:131;24690:4;24564:131;:::i;:::-;24556:139;;24454:248;;;:::o;24708:419::-;;24912:2;24901:9;24897:18;24889:26;;24961:9;24955:4;24951:20;24947:1;24936:9;24932:17;24925:47;24989:131;25115:4;24989:131;:::i;:::-;24981:139;;24879:248;;;:::o;25133:419::-;;25337:2;25326:9;25322:18;25314:26;;25386:9;25380:4;25376:20;25372:1;25361:9;25357:17;25350:47;25414:131;25540:4;25414:131;:::i;:::-;25406:139;;25304:248;;;:::o;25558:419::-;;25762:2;25751:9;25747:18;25739:26;;25811:9;25805:4;25801:20;25797:1;25786:9;25782:17;25775:47;25839:131;25965:4;25839:131;:::i;:::-;25831:139;;25729:248;;;:::o;25983:419::-;;26187:2;26176:9;26172:18;26164:26;;26236:9;26230:4;26226:20;26222:1;26211:9;26207:17;26200:47;26264:131;26390:4;26264:131;:::i;:::-;26256:139;;26154:248;;;:::o;26408:419::-;;26612:2;26601:9;26597:18;26589:26;;26661:9;26655:4;26651:20;26647:1;26636:9;26632:17;26625:47;26689:131;26815:4;26689:131;:::i;:::-;26681:139;;26579:248;;;:::o;26833:419::-;;27037:2;27026:9;27022:18;27014:26;;27086:9;27080:4;27076:20;27072:1;27061:9;27057:17;27050:47;27114:131;27240:4;27114:131;:::i;:::-;27106:139;;27004:248;;;:::o;27258:419::-;;27462:2;27451:9;27447:18;27439:26;;27511:9;27505:4;27501:20;27497:1;27486:9;27482:17;27475:47;27539:131;27665:4;27539:131;:::i;:::-;27531:139;;27429:248;;;:::o;27683:419::-;;27887:2;27876:9;27872:18;27864:26;;27936:9;27930:4;27926:20;27922:1;27911:9;27907:17;27900:47;27964:131;28090:4;27964:131;:::i;:::-;27956:139;;27854:248;;;:::o;28108:419::-;;28312:2;28301:9;28297:18;28289:26;;28361:9;28355:4;28351:20;28347:1;28336:9;28332:17;28325:47;28389:131;28515:4;28389:131;:::i;:::-;28381:139;;28279:248;;;:::o;28533:419::-;;28737:2;28726:9;28722:18;28714:26;;28786:9;28780:4;28776:20;28772:1;28761:9;28757:17;28750:47;28814:131;28940:4;28814:131;:::i;:::-;28806:139;;28704:248;;;:::o;28958:419::-;;29162:2;29151:9;29147:18;29139:26;;29211:9;29205:4;29201:20;29197:1;29186:9;29182:17;29175:47;29239:131;29365:4;29239:131;:::i;:::-;29231:139;;29129:248;;;:::o;29383:419::-;;29587:2;29576:9;29572:18;29564:26;;29636:9;29630:4;29626:20;29622:1;29611:9;29607:17;29600:47;29664:131;29790:4;29664:131;:::i;:::-;29656:139;;29554:248;;;:::o;29808:419::-;;30012:2;30001:9;29997:18;29989:26;;30061:9;30055:4;30051:20;30047:1;30036:9;30032:17;30025:47;30089:131;30215:4;30089:131;:::i;:::-;30081:139;;29979:248;;;:::o;30233:419::-;;30437:2;30426:9;30422:18;30414:26;;30486:9;30480:4;30476:20;30472:1;30461:9;30457:17;30450:47;30514:131;30640:4;30514:131;:::i;:::-;30506:139;;30404:248;;;:::o;30658:419::-;;30862:2;30851:9;30847:18;30839:26;;30911:9;30905:4;30901:20;30897:1;30886:9;30882:17;30875:47;30939:131;31065:4;30939:131;:::i;:::-;30931:139;;30829:248;;;:::o;31083:419::-;;31287:2;31276:9;31272:18;31264:26;;31336:9;31330:4;31326:20;31322:1;31311:9;31307:17;31300:47;31364:131;31490:4;31364:131;:::i;:::-;31356:139;;31254:248;;;:::o;31508:419::-;;31712:2;31701:9;31697:18;31689:26;;31761:9;31755:4;31751:20;31747:1;31736:9;31732:17;31725:47;31789:131;31915:4;31789:131;:::i;:::-;31781:139;;31679:248;;;:::o;31933:419::-;;32137:2;32126:9;32122:18;32114:26;;32186:9;32180:4;32176:20;32172:1;32161:9;32157:17;32150:47;32214:131;32340:4;32214:131;:::i;:::-;32206:139;;32104:248;;;:::o;32358:419::-;;32562:2;32551:9;32547:18;32539:26;;32611:9;32605:4;32601:20;32597:1;32586:9;32582:17;32575:47;32639:131;32765:4;32639:131;:::i;:::-;32631:139;;32529:248;;;:::o;32783:419::-;;32987:2;32976:9;32972:18;32964:26;;33036:9;33030:4;33026:20;33022:1;33011:9;33007:17;33000:47;33064:131;33190:4;33064:131;:::i;:::-;33056:139;;32954:248;;;:::o;33208:419::-;;33412:2;33401:9;33397:18;33389:26;;33461:9;33455:4;33451:20;33447:1;33436:9;33432:17;33425:47;33489:131;33615:4;33489:131;:::i;:::-;33481:139;;33379:248;;;:::o;33633:222::-;;33764:2;33753:9;33749:18;33741:26;;33777:71;33845:1;33834:9;33830:17;33821:6;33777:71;:::i;:::-;33731:124;;;;:::o;33861:283::-;;33927:2;33921:9;33911:19;;33969:4;33961:6;33957:17;34076:6;34064:10;34061:22;34040:18;34028:10;34025:34;34022:62;34019:2;;;34087:18;;:::i;:::-;34019:2;34127:10;34123:2;34116:22;33901:243;;;;:::o;34150:331::-;;34301:18;34293:6;34290:30;34287:2;;;34323:18;;:::i;:::-;34287:2;34408:4;34404:9;34397:4;34389:6;34385:17;34381:33;34373:41;;34469:4;34463;34459:15;34451:23;;34216:265;;;:::o;34487:332::-;;34639:18;34631:6;34628:30;34625:2;;;34661:18;;:::i;:::-;34625:2;34746:4;34742:9;34735:4;34727:6;34723:17;34719:33;34711:41;;34807:4;34801;34797:15;34789:23;;34554:265;;;:::o;34825:98::-;;34910:5;34904:12;34894:22;;34883:40;;;:::o;34929:99::-;;35015:5;35009:12;34999:22;;34988:40;;;:::o;35034:168::-;;35151:6;35146:3;35139:19;35191:4;35186:3;35182:14;35167:29;;35129:73;;;;:::o;35208:169::-;;35326:6;35321:3;35314:19;35366:4;35361:3;35357:14;35342:29;;35304:73;;;;:::o;35383:148::-;;35522:3;35507:18;;35497:34;;;;:::o;35537:305::-;;35596:20;35614:1;35596:20;:::i;:::-;35591:25;;35630:20;35648:1;35630:20;:::i;:::-;35625:25;;35784:1;35716:66;35712:74;35709:1;35706:81;35703:2;;;35790:18;;:::i;:::-;35703:2;35834:1;35831;35827:9;35820:16;;35581:261;;;;:::o;35848:185::-;;35905:20;35923:1;35905:20;:::i;:::-;35900:25;;35939:20;35957:1;35939:20;:::i;:::-;35934:25;;35978:1;35968:2;;35983:18;;:::i;:::-;35968:2;36025:1;36022;36018:9;36013:14;;35890:143;;;;:::o;36039:191::-;;36099:20;36117:1;36099:20;:::i;:::-;36094:25;;36133:20;36151:1;36133:20;:::i;:::-;36128:25;;36172:1;36169;36166:8;36163:2;;;36177:18;;:::i;:::-;36163:2;36222:1;36219;36215:9;36207:17;;36084:146;;;;:::o;36236:96::-;;36302:24;36320:5;36302:24;:::i;:::-;36291:35;;36281:51;;;:::o;36338:90::-;;36415:5;36408:13;36401:21;36390:32;;36380:48;;;:::o;36434:77::-;;36500:5;36489:16;;36479:32;;;:::o;36517:149::-;;36593:66;36586:5;36582:78;36571:89;;36561:105;;;:::o;36672:126::-;;36749:42;36742:5;36738:54;36727:65;;36717:81;;;:::o;36804:77::-;;36870:5;36859:16;;36849:32;;;:::o;36887:86::-;;36962:4;36955:5;36951:16;36940:27;;36930:43;;;:::o;36979:154::-;37063:6;37058:3;37053;37040:30;37125:1;37116:6;37111:3;37107:16;37100:27;37030:103;;;:::o;37139:307::-;37207:1;37217:113;37231:6;37228:1;37225:13;37217:113;;;37316:1;37311:3;37307:11;37301:18;37297:1;37292:3;37288:11;37281:39;37253:2;37250:1;37246:10;37241:15;;37217:113;;;37348:6;37345:1;37342:13;37339:2;;;37428:1;37419:6;37414:3;37410:16;37403:27;37339:2;37188:258;;;;:::o;37452:320::-;;37533:1;37527:4;37523:12;37513:22;;37580:1;37574:4;37570:12;37601:18;37591:2;;37657:4;37649:6;37645:17;37635:27;;37591:2;37719;37711:6;37708:14;37688:18;37685:38;37682:2;;;37738:18;;:::i;:::-;37682:2;37503:269;;;;:::o;37778:233::-;;37840:24;37858:5;37840:24;:::i;:::-;37831:33;;37886:66;37879:5;37876:77;37873:2;;;37956:18;;:::i;:::-;37873:2;38003:1;37996:5;37992:13;37985:20;;37821:190;;;:::o;38017:100::-;;38085:26;38105:5;38085:26;:::i;:::-;38074:37;;38064:53;;;:::o;38123:94::-;;38191:20;38205:5;38191:20;:::i;:::-;38180:31;;38170:47;;;:::o;38223:79::-;;38291:5;38280:16;;38270:32;;;:::o;38308:176::-;;38357:20;38375:1;38357:20;:::i;:::-;38352:25;;38391:20;38409:1;38391:20;:::i;:::-;38386:25;;38430:1;38420:2;;38435:18;;:::i;:::-;38420:2;38476:1;38473;38469:9;38464:14;;38342:142;;;;:::o;38490:180::-;38538:77;38535:1;38528:88;38635:4;38632:1;38625:15;38659:4;38656:1;38649:15;38676:180;38724:77;38721:1;38714:88;38821:4;38818:1;38811:15;38845:4;38842:1;38835:15;38862:180;38910:77;38907:1;38900:88;39007:4;39004:1;38997:15;39031:4;39028:1;39021:15;39048:180;39096:77;39093:1;39086:88;39193:4;39190:1;39183:15;39217:4;39214:1;39207:15;39234:102;;39326:2;39322:7;39317:2;39310:5;39306:14;39302:28;39292:38;;39282:54;;;:::o;39342:94::-;;39423:5;39419:2;39415:14;39394:35;;39384:52;;;:::o;39442:122::-;39515:24;39533:5;39515:24;:::i;:::-;39508:5;39505:35;39495:2;;39554:1;39551;39544:12;39495:2;39485:79;:::o;39570:116::-;39640:21;39655:5;39640:21;:::i;:::-;39633:5;39630:32;39620:2;;39676:1;39673;39666:12;39620:2;39610:76;:::o;39692:120::-;39764:23;39781:5;39764:23;:::i;:::-;39757:5;39754:34;39744:2;;39802:1;39799;39792:12;39744:2;39734:78;:::o;39818:122::-;39891:24;39909:5;39891:24;:::i;:::-;39884:5;39881:35;39871:2;;39930:1;39927;39920:12;39871:2;39861:79;:::o

Swarm Source

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