ETH Price: $3,275.01 (-4.05%)

Token

Self Portraits of Strangers (SPoS)
 

Overview

Max Total Supply

0 SPoS

Holders

45

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
uiethma.eth
Balance
5 SPoS
0x5470a0ad35a6066fdd1b47d18b6bb04bffb9f59a
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:
URIMinter

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 2021-08-05
*/

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



pragma solidity ^0.8.0;

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

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



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

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



pragma solidity ^0.8.0;


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

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

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

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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

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



pragma solidity ^0.8.0;

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

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

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



pragma solidity ^0.8.0;

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

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

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

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

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

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



pragma solidity ^0.8.0;


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

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



pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

    /**
     * @dev 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(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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

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



pragma solidity ^0.8.0;


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

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

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

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

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

        return super.tokenURI(tokenId);
    }

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

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

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

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



pragma solidity ^0.8.0;




/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    function hasRole(bytes32 role, address account) external view returns (bool);

    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    function grantRole(bytes32 role, address account) external;

    function revokeRole(bytes32 role, address account) external;

    function renounceRole(bytes32 role, address account) external;
}

/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{20}) is missing role (0x[0-9a-f]{32})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role, _msgSender());
        _;
    }

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

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{20}) is missing role (0x[0-9a-f]{32})$/
     */
    function _checkRole(bytes32 role, address account) internal view {
        if (!hasRole(role, account)) {
            revert(
                string(
                    abi.encodePacked(
                        "AccessControl: account ",
                        Strings.toHexString(uint160(account), 20),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view override returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        emit RoleAdminChanged(role, getRoleAdmin(role), adminRole);
        _roles[role].adminRole = adminRole;
    }

    function _grantRole(bytes32 role, address account) private {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    function _revokeRole(bytes32 role, address account) private {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}

// File: @openzeppelin/contracts/utils/structs/EnumerableSet.sol



pragma solidity ^0.8.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;
        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping(bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {
            // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            if (lastIndex != toDeleteIndex) {
                bytes32 lastvalue = set._values[lastIndex];

                // Move the last value to the index where the value to delete is
                set._values[toDeleteIndex] = lastvalue;
                // Update the index for the moved value
                set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex
            }

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        return set._values[index];
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }
}

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



pragma solidity ^0.8.0;



/**
 * @dev External interface of AccessControlEnumerable declared to support ERC165 detection.
 */
interface IAccessControlEnumerable {
    function getRoleMember(bytes32 role, uint256 index) external view returns (address);

    function getRoleMemberCount(bytes32 role) external view returns (uint256);
}

/**
 * @dev Extension of {AccessControl} that allows enumerating the members of each role.
 */
abstract contract AccessControlEnumerable is IAccessControlEnumerable, AccessControl {
    using EnumerableSet for EnumerableSet.AddressSet;

    mapping(bytes32 => EnumerableSet.AddressSet) private _roleMembers;

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

    /**
     * @dev Returns one of the accounts that have `role`. `index` must be a
     * value between 0 and {getRoleMemberCount}, non-inclusive.
     *
     * Role bearers are not sorted in any particular way, and their ordering may
     * change at any point.
     *
     * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure
     * you perform all queries on the same block. See the following
     * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]
     * for more information.
     */
    function getRoleMember(bytes32 role, uint256 index) public view override returns (address) {
        return _roleMembers[role].at(index);
    }

    /**
     * @dev Returns the number of accounts that have `role`. Can be used
     * together with {getRoleMember} to enumerate all bearers of a role.
     */
    function getRoleMemberCount(bytes32 role) public view override returns (uint256) {
        return _roleMembers[role].length();
    }

    /**
     * @dev Overload {grantRole} to track enumerable memberships
     */
    function grantRole(bytes32 role, address account) public virtual override {
        super.grantRole(role, account);
        _roleMembers[role].add(account);
    }

    /**
     * @dev Overload {revokeRole} to track enumerable memberships
     */
    function revokeRole(bytes32 role, address account) public virtual override {
        super.revokeRole(role, account);
        _roleMembers[role].remove(account);
    }

    /**
     * @dev Overload {renounceRole} to track enumerable memberships
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        super.renounceRole(role, account);
        _roleMembers[role].remove(account);
    }

    /**
     * @dev Overload {_setupRole} to track enumerable memberships
     */
    function _setupRole(bytes32 role, address account) internal virtual override {
        super._setupRole(role, account);
        _roleMembers[role].add(account);
    }
}

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



pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

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



pragma solidity ^0.8.0;


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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

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


// File: contracts/URIMinter.sol

// contracts/MyNFT.sol

pragma solidity ^0.8.0;




contract URIMinter is ERC721URIStorage, AccessControlEnumerable, Ownable{
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIdTracker;

    bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");

    constructor(string memory name, string memory ticker) ERC721(name, ticker) {
        _setupRole(MINTER_ROLE, _msgSender());
        _setupRole(DEFAULT_ADMIN_ROLE, _msgSender());
    }

    function mint(address to, string memory URI) public virtual {
        require(hasRole(MINTER_ROLE, _msgSender()), "URIMinter: must have minter role to mint");

        _mint(to, _tokenIdTracker.current());
        _setTokenURI(_tokenIdTracker.current(), URI);
        _tokenIdTracker.increment();
    }

    function supportsInterface(bytes4 interfaceId) public view virtual override(AccessControlEnumerable, ERC721) returns (bool) {
        return super.supportsInterface(interfaceId);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"ticker","type":"string"}],"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":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","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":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"string","name":"URI","type":"string"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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"}]

60806040523480156200001157600080fd5b50604051620047363803806200473683398181016040528101906200003791906200057a565b818181600090805190602001906200005192919062000458565b5080600190805190602001906200006a92919062000458565b5050506200008d62000081620000fa60201b60201c565b6200010260201b60201c565b620000ce7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6620000c2620000fa60201b60201c565b620001c860201b60201c565b620000f26000801b620000e6620000fa60201b60201c565b620001c860201b60201c565b50506200071e565b600033905090565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620001df82826200021060201b620011a41760201c565b6200020b81600860008581526020019081526020016000206200022660201b620011b21790919060201c565b505050565b6200022282826200025e60201b60201c565b5050565b600062000256836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6200035060201b60201c565b905092915050565b620002708282620003ca60201b60201c565b6200034c5760016007600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620002f1620000fa60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006200036483836200043560201b60201c565b620003bf578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050620003c4565b600090505b92915050565b60006007600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b82805462000466906200068a565b90600052602060002090601f0160209004810192826200048a5760008555620004d6565b82601f10620004a557805160ff1916838001178555620004d6565b82800160010185558215620004d6579182015b82811115620004d5578251825591602001919060010190620004b8565b5b509050620004e59190620004e9565b5090565b5b8082111562000504576000816000905550600101620004ea565b5090565b60006200051f620005198462000621565b620005ed565b9050828152602081018484840111156200053857600080fd5b6200054584828562000654565b509392505050565b600082601f8301126200055f57600080fd5b81516200057184826020860162000508565b91505092915050565b600080604083850312156200058e57600080fd5b600083015167ffffffffffffffff811115620005a957600080fd5b620005b7858286016200054d565b925050602083015167ffffffffffffffff811115620005d557600080fd5b620005e3858286016200054d565b9150509250929050565b6000604051905081810181811067ffffffffffffffff82111715620006175762000616620006ef565b5b8060405250919050565b600067ffffffffffffffff8211156200063f576200063e620006ef565b5b601f19601f8301169050602081019050919050565b60005b838110156200067457808201518184015260208101905062000657565b8381111562000684576000848401525b50505050565b60006002820490506001821680620006a357607f821691505b60208210811415620006ba57620006b9620006c0565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614008806200072e6000396000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c80639010d07c116100de578063c87b56dd11610097578063d539139311610071578063d5391393146104a5578063d547741f146104c3578063e985e9c5146104df578063f2fde38b1461050f5761018e565b8063c87b56dd14610429578063ca15c87314610459578063d0def521146104895761018e565b80639010d07c1461035557806391d148541461038557806395d89b41146103b5578063a217fddf146103d3578063a22cb465146103f1578063b88d4fde1461040d5761018e565b80632f2ff15d1161014b5780636352211e116101255780636352211e146102cd57806370a08231146102fd578063715018a61461032d5780638da5cb5b146103375761018e565b80632f2ff15d1461027957806336568abe1461029557806342842e0e146102b15761018e565b806301ffc9a71461019357806306fdde03146101c3578063081812fc146101e1578063095ea7b31461021157806323b872dd1461022d578063248a9ca314610249575b600080fd5b6101ad60048036038101906101a89190612dc1565b61052b565b6040516101ba9190613800565b60405180910390f35b6101cb61053d565b6040516101d89190613836565b60405180910390f35b6101fb60048036038101906101f69190612e13565b6105cf565b6040516102089190613799565b60405180910390f35b61022b60048036038101906102269190612ce4565b610654565b005b61024760048036038101906102429190612b8a565b61076c565b005b610263600480360381019061025e9190612d20565b6107cc565b604051610270919061381b565b60405180910390f35b610293600480360381019061028e9190612d49565b6107ec565b005b6102af60048036038101906102aa9190612d49565b610820565b005b6102cb60048036038101906102c69190612b8a565b610854565b005b6102e760048036038101906102e29190612e13565b610874565b6040516102f49190613799565b60405180910390f35b61031760048036038101906103129190612b25565b610926565b6040516103249190613af8565b60405180910390f35b6103356109de565b005b61033f610a66565b60405161034c9190613799565b60405180910390f35b61036f600480360381019061036a9190612d85565b610a90565b60405161037c9190613799565b60405180910390f35b61039f600480360381019061039a9190612d49565b610abf565b6040516103ac9190613800565b60405180910390f35b6103bd610b2a565b6040516103ca9190613836565b60405180910390f35b6103db610bbc565b6040516103e8919061381b565b60405180910390f35b61040b60048036038101906104069190612c54565b610bc3565b005b61042760048036038101906104229190612bd9565b610d44565b005b610443600480360381019061043e9190612e13565b610da6565b6040516104509190613836565b60405180910390f35b610473600480360381019061046e9190612d20565b610ef8565b6040516104809190613af8565b60405180910390f35b6104a3600480360381019061049e9190612c90565b610f1c565b005b6104ad610fc0565b6040516104ba919061381b565b60405180910390f35b6104dd60048036038101906104d89190612d49565b610fe4565b005b6104f960048036038101906104f49190612b4e565b611018565b6040516105069190613800565b60405180910390f35b61052960048036038101906105249190612b25565b6110ac565b005b6000610536826111e2565b9050919050565b60606000805461054c90613de6565b80601f016020809104026020016040519081016040528092919081815260200182805461057890613de6565b80156105c55780601f1061059a576101008083540402835291602001916105c5565b820191906000526020600020905b8154815290600101906020018083116105a857829003601f168201915b5050505050905090565b60006105da8261125c565b610619576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161061090613a18565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061065f82610874565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156106d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106c790613a98565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166106ef6112c8565b73ffffffffffffffffffffffffffffffffffffffff16148061071e575061071d816107186112c8565b611018565b5b61075d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075490613938565b60405180910390fd5b61076783836112d0565b505050565b61077d6107776112c8565b82611389565b6107bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b390613ab8565b60405180910390fd5b6107c7838383611467565b505050565b600060076000838152602001908152602001600020600101549050919050565b6107f682826116c3565b61081b81600860008581526020019081526020016000206111b290919063ffffffff16565b505050565b61082a82826116ec565b61084f816008600085815260200190815260200160002061176f90919063ffffffff16565b505050565b61086f83838360405180602001604052806000815250610d44565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561091d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091490613978565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610997576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098e90613958565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6109e66112c8565b73ffffffffffffffffffffffffffffffffffffffff16610a04610a66565b73ffffffffffffffffffffffffffffffffffffffff1614610a5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5190613a38565b60405180910390fd5b610a64600061179f565b565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000610ab7826008600086815260200190815260200160002061186590919063ffffffff16565b905092915050565b60006007600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060018054610b3990613de6565b80601f0160208091040260200160405190810160405280929190818152602001828054610b6590613de6565b8015610bb25780601f10610b8757610100808354040283529160200191610bb2565b820191906000526020600020905b815481529060010190602001808311610b9557829003601f168201915b5050505050905090565b6000801b81565b610bcb6112c8565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610c39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c30906138f8565b60405180910390fd5b8060056000610c466112c8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610cf36112c8565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610d389190613800565b60405180910390a35050565b610d55610d4f6112c8565b83611389565b610d94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8b90613ab8565b60405180910390fd5b610da08484848461187f565b50505050565b6060610db18261125c565b610df0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de7906139f8565b60405180910390fd5b6000600660008481526020019081526020016000208054610e1090613de6565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3c90613de6565b8015610e895780601f10610e5e57610100808354040283529160200191610e89565b820191906000526020600020905b815481529060010190602001808311610e6c57829003601f168201915b505050505090506000610e9a6118db565b9050600081511415610eb0578192505050610ef3565b600082511115610ee5578082604051602001610ecd92919061373b565b60405160208183030381529060405292505050610ef3565b610eee846118f2565b925050505b919050565b6000610f1560086000848152602001908152602001600020611999565b9050919050565b610f4d7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610f486112c8565b610abf565b610f8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f83906139b8565b60405180910390fd5b610f9f82610f9a600a6119ae565b6119bc565b610fb2610fac600a6119ae565b82611b8a565b610fbc600a611bfe565b5050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b610fee8282611c14565b611013816008600085815260200190815260200160002061176f90919063ffffffff16565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6110b46112c8565b73ffffffffffffffffffffffffffffffffffffffff166110d2610a66565b73ffffffffffffffffffffffffffffffffffffffff1614611128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111f90613a38565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611198576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118f90613898565b60405180910390fd5b6111a18161179f565b50565b6111ae8282611c3d565b5050565b60006111da836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611d1e565b905092915050565b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611255575061125482611d8e565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661134383610874565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006113948261125c565b6113d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ca90613918565b60405180910390fd5b60006113de83610874565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061144d57508373ffffffffffffffffffffffffffffffffffffffff16611435846105cf565b73ffffffffffffffffffffffffffffffffffffffff16145b8061145e575061145d8185611018565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661148782610874565b73ffffffffffffffffffffffffffffffffffffffff16146114dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d490613a58565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561154d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611544906138d8565b60405180910390fd5b611558838383611e08565b6115636000826112d0565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115b39190613cc8565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461160a9190613be7565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6116cc826107cc565b6116dd816116d86112c8565b611e0d565b6116e78383611c3d565b505050565b6116f46112c8565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611761576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175890613ad8565b60405180910390fd5b61176b8282611eaa565b5050565b6000611797836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611f8c565b905092915050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006118748360000183612112565b60001c905092915050565b61188a848484611467565b61189684848484612163565b6118d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118cc90613878565b60405180910390fd5b50505050565b606060405180602001604052806000815250905090565b60606118fd8261125c565b61193c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193390613a78565b60405180910390fd5b60006119466118db565b905060008151116119665760405180602001604052806000815250611991565b80611970846122fa565b60405160200161198192919061373b565b6040516020818303038152906040525b915050919050565b60006119a7826000016124a7565b9050919050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a23906139d8565b60405180910390fd5b611a358161125c565b15611a75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6c906138b8565b60405180910390fd5b611a8160008383611e08565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ad19190613be7565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b611b938261125c565b611bd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc990613998565b60405180910390fd5b80600660008481526020019081526020016000209080519060200190611bf9929190612934565b505050565b6001816000016000828254019250508190555050565b611c1d826107cc565b611c2e81611c296112c8565b611e0d565b611c388383611eaa565b505050565b611c478282610abf565b611d1a5760016007600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611cbf6112c8565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000611d2a83836124b8565b611d83578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050611d88565b600090505b92915050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611e015750611e00826124db565b5b9050919050565b505050565b611e178282610abf565b611ea657611e3c8173ffffffffffffffffffffffffffffffffffffffff1660146125bd565b611e4a8360001c60206125bd565b604051602001611e5b92919061375f565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9d9190613836565b60405180910390fd5b5050565b611eb48282610abf565b15611f885760006007600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611f2d6112c8565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b60008083600101600084815260200190815260200160002054905060008114612106576000600182611fbe9190613cc8565b9050600060018660000180549050611fd69190613cc8565b905081811461209157600086600001828154811061201d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080876000018481548110612067577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b856000018054806120cb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061210c565b60009150505b92915050565b6000826000018281548110612150577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905092915050565b60006121848473ffffffffffffffffffffffffffffffffffffffff166128b7565b156122ed578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026121ad6112c8565b8786866040518563ffffffff1660e01b81526004016121cf94939291906137b4565b602060405180830381600087803b1580156121e957600080fd5b505af192505050801561221a57506040513d601f19601f820116820180604052508101906122179190612dea565b60015b61229d573d806000811461224a576040519150601f19603f3d011682016040523d82523d6000602084013e61224f565b606091505b50600081511415612295576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228c90613878565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506122f2565b600190505b949350505050565b60606000821415612342576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506124a2565b600082905060005b6000821461237457808061235d90613e18565b915050600a8261236d9190613c3d565b915061234a565b60008167ffffffffffffffff8111156123b6577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156123e85781602001600182028036833780820191505090505b5090505b6000851461249b576001826124019190613cc8565b9150600a856124109190613e61565b603061241c9190613be7565b60f81b818381518110612458577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856124949190613c3d565b94506123ec565b8093505050505b919050565b600081600001805490509050919050565b600080836001016000848152602001908152602001600020541415905092915050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806125a657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806125b657506125b5826128ca565b5b9050919050565b6060600060028360026125d09190613c6e565b6125da9190613be7565b67ffffffffffffffff811115612619577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561264b5781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106126a9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612733577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026127739190613c6e565b61277d9190613be7565b90505b6001811115612869577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106127e5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b828281518110612822577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061286290613dbc565b9050612780565b50600084146128ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128a490613858565b60405180910390fd5b8091505092915050565b600080823b905060008111915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b82805461294090613de6565b90600052602060002090601f01602090048101928261296257600085556129a9565b82601f1061297b57805160ff19168380011785556129a9565b828001600101855582156129a9579182015b828111156129a857825182559160200191906001019061298d565b5b5090506129b691906129ba565b5090565b5b808211156129d35760008160009055506001016129bb565b5090565b60006129ea6129e584613b44565b613b13565b905082815260208101848484011115612a0257600080fd5b612a0d848285613d7a565b509392505050565b6000612a28612a2384613b74565b613b13565b905082815260208101848484011115612a4057600080fd5b612a4b848285613d7a565b509392505050565b600081359050612a6281613f5f565b92915050565b600081359050612a7781613f76565b92915050565b600081359050612a8c81613f8d565b92915050565b600081359050612aa181613fa4565b92915050565b600081519050612ab681613fa4565b92915050565b600082601f830112612acd57600080fd5b8135612add8482602086016129d7565b91505092915050565b600082601f830112612af757600080fd5b8135612b07848260208601612a15565b91505092915050565b600081359050612b1f81613fbb565b92915050565b600060208284031215612b3757600080fd5b6000612b4584828501612a53565b91505092915050565b60008060408385031215612b6157600080fd5b6000612b6f85828601612a53565b9250506020612b8085828601612a53565b9150509250929050565b600080600060608486031215612b9f57600080fd5b6000612bad86828701612a53565b9350506020612bbe86828701612a53565b9250506040612bcf86828701612b10565b9150509250925092565b60008060008060808587031215612bef57600080fd5b6000612bfd87828801612a53565b9450506020612c0e87828801612a53565b9350506040612c1f87828801612b10565b925050606085013567ffffffffffffffff811115612c3c57600080fd5b612c4887828801612abc565b91505092959194509250565b60008060408385031215612c6757600080fd5b6000612c7585828601612a53565b9250506020612c8685828601612a68565b9150509250929050565b60008060408385031215612ca357600080fd5b6000612cb185828601612a53565b925050602083013567ffffffffffffffff811115612cce57600080fd5b612cda85828601612ae6565b9150509250929050565b60008060408385031215612cf757600080fd5b6000612d0585828601612a53565b9250506020612d1685828601612b10565b9150509250929050565b600060208284031215612d3257600080fd5b6000612d4084828501612a7d565b91505092915050565b60008060408385031215612d5c57600080fd5b6000612d6a85828601612a7d565b9250506020612d7b85828601612a53565b9150509250929050565b60008060408385031215612d9857600080fd5b6000612da685828601612a7d565b9250506020612db785828601612b10565b9150509250929050565b600060208284031215612dd357600080fd5b6000612de184828501612a92565b91505092915050565b600060208284031215612dfc57600080fd5b6000612e0a84828501612aa7565b91505092915050565b600060208284031215612e2557600080fd5b6000612e3384828501612b10565b91505092915050565b612e4581613cfc565b82525050565b612e5481613d0e565b82525050565b612e6381613d1a565b82525050565b6000612e7482613ba4565b612e7e8185613bba565b9350612e8e818560208601613d89565b612e9781613f4e565b840191505092915050565b6000612ead82613baf565b612eb78185613bcb565b9350612ec7818560208601613d89565b612ed081613f4e565b840191505092915050565b6000612ee682613baf565b612ef08185613bdc565b9350612f00818560208601613d89565b80840191505092915050565b6000612f19602083613bcb565b91507f537472696e67733a20686578206c656e67746820696e73756666696369656e746000830152602082019050919050565b6000612f59603283613bcb565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000612fbf602683613bcb565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613025601c83613bcb565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613065602483613bcb565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006130cb601983613bcb565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b600061310b602c83613bcb565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613171603883613bcb565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006131d7602a83613bcb565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b600061323d602983613bcb565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006132a3602e83613bcb565b91507f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008301527f6578697374656e7420746f6b656e0000000000000000000000000000000000006020830152604082019050919050565b6000613309602883613bcb565b91507f5552494d696e7465723a206d7573742068617665206d696e74657220726f6c6560008301527f20746f206d696e740000000000000000000000000000000000000000000000006020830152604082019050919050565b600061336f602083613bcb565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006133af603183613bcb565b91507f45524337323155524953746f726167653a2055524920717565727920666f722060008301527f6e6f6e6578697374656e7420746f6b656e0000000000000000000000000000006020830152604082019050919050565b6000613415602c83613bcb565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061347b602083613bcb565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006134bb602983613bcb565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613521602f83613bcb565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613587602183613bcb565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006135ed603183613bcb565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613653601783613bdc565b91507f416363657373436f6e74726f6c3a206163636f756e74200000000000000000006000830152601782019050919050565b6000613693601183613bdc565b91507f206973206d697373696e6720726f6c65200000000000000000000000000000006000830152601182019050919050565b60006136d3602f83613bcb565b91507f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008301527f20726f6c657320666f722073656c6600000000000000000000000000000000006020830152604082019050919050565b61373581613d70565b82525050565b60006137478285612edb565b91506137538284612edb565b91508190509392505050565b600061376a82613646565b91506137768285612edb565b915061378182613686565b915061378d8284612edb565b91508190509392505050565b60006020820190506137ae6000830184612e3c565b92915050565b60006080820190506137c96000830187612e3c565b6137d66020830186612e3c565b6137e3604083018561372c565b81810360608301526137f58184612e69565b905095945050505050565b60006020820190506138156000830184612e4b565b92915050565b60006020820190506138306000830184612e5a565b92915050565b600060208201905081810360008301526138508184612ea2565b905092915050565b6000602082019050818103600083015261387181612f0c565b9050919050565b6000602082019050818103600083015261389181612f4c565b9050919050565b600060208201905081810360008301526138b181612fb2565b9050919050565b600060208201905081810360008301526138d181613018565b9050919050565b600060208201905081810360008301526138f181613058565b9050919050565b60006020820190508181036000830152613911816130be565b9050919050565b60006020820190508181036000830152613931816130fe565b9050919050565b6000602082019050818103600083015261395181613164565b9050919050565b60006020820190508181036000830152613971816131ca565b9050919050565b6000602082019050818103600083015261399181613230565b9050919050565b600060208201905081810360008301526139b181613296565b9050919050565b600060208201905081810360008301526139d1816132fc565b9050919050565b600060208201905081810360008301526139f181613362565b9050919050565b60006020820190508181036000830152613a11816133a2565b9050919050565b60006020820190508181036000830152613a3181613408565b9050919050565b60006020820190508181036000830152613a518161346e565b9050919050565b60006020820190508181036000830152613a71816134ae565b9050919050565b60006020820190508181036000830152613a9181613514565b9050919050565b60006020820190508181036000830152613ab18161357a565b9050919050565b60006020820190508181036000830152613ad1816135e0565b9050919050565b60006020820190508181036000830152613af1816136c6565b9050919050565b6000602082019050613b0d600083018461372c565b92915050565b6000604051905081810181811067ffffffffffffffff82111715613b3a57613b39613f1f565b5b8060405250919050565b600067ffffffffffffffff821115613b5f57613b5e613f1f565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115613b8f57613b8e613f1f565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613bf282613d70565b9150613bfd83613d70565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613c3257613c31613e92565b5b828201905092915050565b6000613c4882613d70565b9150613c5383613d70565b925082613c6357613c62613ec1565b5b828204905092915050565b6000613c7982613d70565b9150613c8483613d70565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613cbd57613cbc613e92565b5b828202905092915050565b6000613cd382613d70565b9150613cde83613d70565b925082821015613cf157613cf0613e92565b5b828203905092915050565b6000613d0782613d50565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613da7578082015181840152602081019050613d8c565b83811115613db6576000848401525b50505050565b6000613dc782613d70565b91506000821415613ddb57613dda613e92565b5b600182039050919050565b60006002820490506001821680613dfe57607f821691505b60208210811415613e1257613e11613ef0565b5b50919050565b6000613e2382613d70565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613e5657613e55613e92565b5b600182019050919050565b6000613e6c82613d70565b9150613e7783613d70565b925082613e8757613e86613ec1565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b613f6881613cfc565b8114613f7357600080fd5b50565b613f7f81613d0e565b8114613f8a57600080fd5b50565b613f9681613d1a565b8114613fa157600080fd5b50565b613fad81613d24565b8114613fb857600080fd5b50565b613fc481613d70565b8114613fcf57600080fd5b5056fea2646970667358221220886834f16fdaea9e25426b6a94d455ed35b540fb53fe3c2c71f79d287bac5d7764736f6c6343000800003300000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000001b53656c6620506f72747261697473206f6620537472616e676572730000000000000000000000000000000000000000000000000000000000000000000000000453506f5300000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061018e5760003560e01c80639010d07c116100de578063c87b56dd11610097578063d539139311610071578063d5391393146104a5578063d547741f146104c3578063e985e9c5146104df578063f2fde38b1461050f5761018e565b8063c87b56dd14610429578063ca15c87314610459578063d0def521146104895761018e565b80639010d07c1461035557806391d148541461038557806395d89b41146103b5578063a217fddf146103d3578063a22cb465146103f1578063b88d4fde1461040d5761018e565b80632f2ff15d1161014b5780636352211e116101255780636352211e146102cd57806370a08231146102fd578063715018a61461032d5780638da5cb5b146103375761018e565b80632f2ff15d1461027957806336568abe1461029557806342842e0e146102b15761018e565b806301ffc9a71461019357806306fdde03146101c3578063081812fc146101e1578063095ea7b31461021157806323b872dd1461022d578063248a9ca314610249575b600080fd5b6101ad60048036038101906101a89190612dc1565b61052b565b6040516101ba9190613800565b60405180910390f35b6101cb61053d565b6040516101d89190613836565b60405180910390f35b6101fb60048036038101906101f69190612e13565b6105cf565b6040516102089190613799565b60405180910390f35b61022b60048036038101906102269190612ce4565b610654565b005b61024760048036038101906102429190612b8a565b61076c565b005b610263600480360381019061025e9190612d20565b6107cc565b604051610270919061381b565b60405180910390f35b610293600480360381019061028e9190612d49565b6107ec565b005b6102af60048036038101906102aa9190612d49565b610820565b005b6102cb60048036038101906102c69190612b8a565b610854565b005b6102e760048036038101906102e29190612e13565b610874565b6040516102f49190613799565b60405180910390f35b61031760048036038101906103129190612b25565b610926565b6040516103249190613af8565b60405180910390f35b6103356109de565b005b61033f610a66565b60405161034c9190613799565b60405180910390f35b61036f600480360381019061036a9190612d85565b610a90565b60405161037c9190613799565b60405180910390f35b61039f600480360381019061039a9190612d49565b610abf565b6040516103ac9190613800565b60405180910390f35b6103bd610b2a565b6040516103ca9190613836565b60405180910390f35b6103db610bbc565b6040516103e8919061381b565b60405180910390f35b61040b60048036038101906104069190612c54565b610bc3565b005b61042760048036038101906104229190612bd9565b610d44565b005b610443600480360381019061043e9190612e13565b610da6565b6040516104509190613836565b60405180910390f35b610473600480360381019061046e9190612d20565b610ef8565b6040516104809190613af8565b60405180910390f35b6104a3600480360381019061049e9190612c90565b610f1c565b005b6104ad610fc0565b6040516104ba919061381b565b60405180910390f35b6104dd60048036038101906104d89190612d49565b610fe4565b005b6104f960048036038101906104f49190612b4e565b611018565b6040516105069190613800565b60405180910390f35b61052960048036038101906105249190612b25565b6110ac565b005b6000610536826111e2565b9050919050565b60606000805461054c90613de6565b80601f016020809104026020016040519081016040528092919081815260200182805461057890613de6565b80156105c55780601f1061059a576101008083540402835291602001916105c5565b820191906000526020600020905b8154815290600101906020018083116105a857829003601f168201915b5050505050905090565b60006105da8261125c565b610619576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161061090613a18565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061065f82610874565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156106d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106c790613a98565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166106ef6112c8565b73ffffffffffffffffffffffffffffffffffffffff16148061071e575061071d816107186112c8565b611018565b5b61075d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075490613938565b60405180910390fd5b61076783836112d0565b505050565b61077d6107776112c8565b82611389565b6107bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b390613ab8565b60405180910390fd5b6107c7838383611467565b505050565b600060076000838152602001908152602001600020600101549050919050565b6107f682826116c3565b61081b81600860008581526020019081526020016000206111b290919063ffffffff16565b505050565b61082a82826116ec565b61084f816008600085815260200190815260200160002061176f90919063ffffffff16565b505050565b61086f83838360405180602001604052806000815250610d44565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561091d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091490613978565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610997576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098e90613958565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6109e66112c8565b73ffffffffffffffffffffffffffffffffffffffff16610a04610a66565b73ffffffffffffffffffffffffffffffffffffffff1614610a5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5190613a38565b60405180910390fd5b610a64600061179f565b565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000610ab7826008600086815260200190815260200160002061186590919063ffffffff16565b905092915050565b60006007600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060018054610b3990613de6565b80601f0160208091040260200160405190810160405280929190818152602001828054610b6590613de6565b8015610bb25780601f10610b8757610100808354040283529160200191610bb2565b820191906000526020600020905b815481529060010190602001808311610b9557829003601f168201915b5050505050905090565b6000801b81565b610bcb6112c8565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610c39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c30906138f8565b60405180910390fd5b8060056000610c466112c8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610cf36112c8565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610d389190613800565b60405180910390a35050565b610d55610d4f6112c8565b83611389565b610d94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8b90613ab8565b60405180910390fd5b610da08484848461187f565b50505050565b6060610db18261125c565b610df0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de7906139f8565b60405180910390fd5b6000600660008481526020019081526020016000208054610e1090613de6565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3c90613de6565b8015610e895780601f10610e5e57610100808354040283529160200191610e89565b820191906000526020600020905b815481529060010190602001808311610e6c57829003601f168201915b505050505090506000610e9a6118db565b9050600081511415610eb0578192505050610ef3565b600082511115610ee5578082604051602001610ecd92919061373b565b60405160208183030381529060405292505050610ef3565b610eee846118f2565b925050505b919050565b6000610f1560086000848152602001908152602001600020611999565b9050919050565b610f4d7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610f486112c8565b610abf565b610f8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f83906139b8565b60405180910390fd5b610f9f82610f9a600a6119ae565b6119bc565b610fb2610fac600a6119ae565b82611b8a565b610fbc600a611bfe565b5050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b610fee8282611c14565b611013816008600085815260200190815260200160002061176f90919063ffffffff16565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6110b46112c8565b73ffffffffffffffffffffffffffffffffffffffff166110d2610a66565b73ffffffffffffffffffffffffffffffffffffffff1614611128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111f90613a38565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611198576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118f90613898565b60405180910390fd5b6111a18161179f565b50565b6111ae8282611c3d565b5050565b60006111da836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611d1e565b905092915050565b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611255575061125482611d8e565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661134383610874565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006113948261125c565b6113d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ca90613918565b60405180910390fd5b60006113de83610874565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061144d57508373ffffffffffffffffffffffffffffffffffffffff16611435846105cf565b73ffffffffffffffffffffffffffffffffffffffff16145b8061145e575061145d8185611018565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661148782610874565b73ffffffffffffffffffffffffffffffffffffffff16146114dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d490613a58565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561154d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611544906138d8565b60405180910390fd5b611558838383611e08565b6115636000826112d0565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115b39190613cc8565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461160a9190613be7565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6116cc826107cc565b6116dd816116d86112c8565b611e0d565b6116e78383611c3d565b505050565b6116f46112c8565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611761576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175890613ad8565b60405180910390fd5b61176b8282611eaa565b5050565b6000611797836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611f8c565b905092915050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006118748360000183612112565b60001c905092915050565b61188a848484611467565b61189684848484612163565b6118d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118cc90613878565b60405180910390fd5b50505050565b606060405180602001604052806000815250905090565b60606118fd8261125c565b61193c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193390613a78565b60405180910390fd5b60006119466118db565b905060008151116119665760405180602001604052806000815250611991565b80611970846122fa565b60405160200161198192919061373b565b6040516020818303038152906040525b915050919050565b60006119a7826000016124a7565b9050919050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a23906139d8565b60405180910390fd5b611a358161125c565b15611a75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6c906138b8565b60405180910390fd5b611a8160008383611e08565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ad19190613be7565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b611b938261125c565b611bd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc990613998565b60405180910390fd5b80600660008481526020019081526020016000209080519060200190611bf9929190612934565b505050565b6001816000016000828254019250508190555050565b611c1d826107cc565b611c2e81611c296112c8565b611e0d565b611c388383611eaa565b505050565b611c478282610abf565b611d1a5760016007600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611cbf6112c8565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000611d2a83836124b8565b611d83578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050611d88565b600090505b92915050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611e015750611e00826124db565b5b9050919050565b505050565b611e178282610abf565b611ea657611e3c8173ffffffffffffffffffffffffffffffffffffffff1660146125bd565b611e4a8360001c60206125bd565b604051602001611e5b92919061375f565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9d9190613836565b60405180910390fd5b5050565b611eb48282610abf565b15611f885760006007600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611f2d6112c8565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b60008083600101600084815260200190815260200160002054905060008114612106576000600182611fbe9190613cc8565b9050600060018660000180549050611fd69190613cc8565b905081811461209157600086600001828154811061201d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080876000018481548110612067577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b856000018054806120cb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061210c565b60009150505b92915050565b6000826000018281548110612150577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905092915050565b60006121848473ffffffffffffffffffffffffffffffffffffffff166128b7565b156122ed578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026121ad6112c8565b8786866040518563ffffffff1660e01b81526004016121cf94939291906137b4565b602060405180830381600087803b1580156121e957600080fd5b505af192505050801561221a57506040513d601f19601f820116820180604052508101906122179190612dea565b60015b61229d573d806000811461224a576040519150601f19603f3d011682016040523d82523d6000602084013e61224f565b606091505b50600081511415612295576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228c90613878565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506122f2565b600190505b949350505050565b60606000821415612342576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506124a2565b600082905060005b6000821461237457808061235d90613e18565b915050600a8261236d9190613c3d565b915061234a565b60008167ffffffffffffffff8111156123b6577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156123e85781602001600182028036833780820191505090505b5090505b6000851461249b576001826124019190613cc8565b9150600a856124109190613e61565b603061241c9190613be7565b60f81b818381518110612458577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856124949190613c3d565b94506123ec565b8093505050505b919050565b600081600001805490509050919050565b600080836001016000848152602001908152602001600020541415905092915050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806125a657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806125b657506125b5826128ca565b5b9050919050565b6060600060028360026125d09190613c6e565b6125da9190613be7565b67ffffffffffffffff811115612619577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561264b5781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106126a9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612733577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026127739190613c6e565b61277d9190613be7565b90505b6001811115612869577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106127e5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b828281518110612822577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061286290613dbc565b9050612780565b50600084146128ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128a490613858565b60405180910390fd5b8091505092915050565b600080823b905060008111915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b82805461294090613de6565b90600052602060002090601f01602090048101928261296257600085556129a9565b82601f1061297b57805160ff19168380011785556129a9565b828001600101855582156129a9579182015b828111156129a857825182559160200191906001019061298d565b5b5090506129b691906129ba565b5090565b5b808211156129d35760008160009055506001016129bb565b5090565b60006129ea6129e584613b44565b613b13565b905082815260208101848484011115612a0257600080fd5b612a0d848285613d7a565b509392505050565b6000612a28612a2384613b74565b613b13565b905082815260208101848484011115612a4057600080fd5b612a4b848285613d7a565b509392505050565b600081359050612a6281613f5f565b92915050565b600081359050612a7781613f76565b92915050565b600081359050612a8c81613f8d565b92915050565b600081359050612aa181613fa4565b92915050565b600081519050612ab681613fa4565b92915050565b600082601f830112612acd57600080fd5b8135612add8482602086016129d7565b91505092915050565b600082601f830112612af757600080fd5b8135612b07848260208601612a15565b91505092915050565b600081359050612b1f81613fbb565b92915050565b600060208284031215612b3757600080fd5b6000612b4584828501612a53565b91505092915050565b60008060408385031215612b6157600080fd5b6000612b6f85828601612a53565b9250506020612b8085828601612a53565b9150509250929050565b600080600060608486031215612b9f57600080fd5b6000612bad86828701612a53565b9350506020612bbe86828701612a53565b9250506040612bcf86828701612b10565b9150509250925092565b60008060008060808587031215612bef57600080fd5b6000612bfd87828801612a53565b9450506020612c0e87828801612a53565b9350506040612c1f87828801612b10565b925050606085013567ffffffffffffffff811115612c3c57600080fd5b612c4887828801612abc565b91505092959194509250565b60008060408385031215612c6757600080fd5b6000612c7585828601612a53565b9250506020612c8685828601612a68565b9150509250929050565b60008060408385031215612ca357600080fd5b6000612cb185828601612a53565b925050602083013567ffffffffffffffff811115612cce57600080fd5b612cda85828601612ae6565b9150509250929050565b60008060408385031215612cf757600080fd5b6000612d0585828601612a53565b9250506020612d1685828601612b10565b9150509250929050565b600060208284031215612d3257600080fd5b6000612d4084828501612a7d565b91505092915050565b60008060408385031215612d5c57600080fd5b6000612d6a85828601612a7d565b9250506020612d7b85828601612a53565b9150509250929050565b60008060408385031215612d9857600080fd5b6000612da685828601612a7d565b9250506020612db785828601612b10565b9150509250929050565b600060208284031215612dd357600080fd5b6000612de184828501612a92565b91505092915050565b600060208284031215612dfc57600080fd5b6000612e0a84828501612aa7565b91505092915050565b600060208284031215612e2557600080fd5b6000612e3384828501612b10565b91505092915050565b612e4581613cfc565b82525050565b612e5481613d0e565b82525050565b612e6381613d1a565b82525050565b6000612e7482613ba4565b612e7e8185613bba565b9350612e8e818560208601613d89565b612e9781613f4e565b840191505092915050565b6000612ead82613baf565b612eb78185613bcb565b9350612ec7818560208601613d89565b612ed081613f4e565b840191505092915050565b6000612ee682613baf565b612ef08185613bdc565b9350612f00818560208601613d89565b80840191505092915050565b6000612f19602083613bcb565b91507f537472696e67733a20686578206c656e67746820696e73756666696369656e746000830152602082019050919050565b6000612f59603283613bcb565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000612fbf602683613bcb565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613025601c83613bcb565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613065602483613bcb565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006130cb601983613bcb565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b600061310b602c83613bcb565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613171603883613bcb565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006131d7602a83613bcb565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b600061323d602983613bcb565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006132a3602e83613bcb565b91507f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008301527f6578697374656e7420746f6b656e0000000000000000000000000000000000006020830152604082019050919050565b6000613309602883613bcb565b91507f5552494d696e7465723a206d7573742068617665206d696e74657220726f6c6560008301527f20746f206d696e740000000000000000000000000000000000000000000000006020830152604082019050919050565b600061336f602083613bcb565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006133af603183613bcb565b91507f45524337323155524953746f726167653a2055524920717565727920666f722060008301527f6e6f6e6578697374656e7420746f6b656e0000000000000000000000000000006020830152604082019050919050565b6000613415602c83613bcb565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061347b602083613bcb565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006134bb602983613bcb565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613521602f83613bcb565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613587602183613bcb565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006135ed603183613bcb565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613653601783613bdc565b91507f416363657373436f6e74726f6c3a206163636f756e74200000000000000000006000830152601782019050919050565b6000613693601183613bdc565b91507f206973206d697373696e6720726f6c65200000000000000000000000000000006000830152601182019050919050565b60006136d3602f83613bcb565b91507f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008301527f20726f6c657320666f722073656c6600000000000000000000000000000000006020830152604082019050919050565b61373581613d70565b82525050565b60006137478285612edb565b91506137538284612edb565b91508190509392505050565b600061376a82613646565b91506137768285612edb565b915061378182613686565b915061378d8284612edb565b91508190509392505050565b60006020820190506137ae6000830184612e3c565b92915050565b60006080820190506137c96000830187612e3c565b6137d66020830186612e3c565b6137e3604083018561372c565b81810360608301526137f58184612e69565b905095945050505050565b60006020820190506138156000830184612e4b565b92915050565b60006020820190506138306000830184612e5a565b92915050565b600060208201905081810360008301526138508184612ea2565b905092915050565b6000602082019050818103600083015261387181612f0c565b9050919050565b6000602082019050818103600083015261389181612f4c565b9050919050565b600060208201905081810360008301526138b181612fb2565b9050919050565b600060208201905081810360008301526138d181613018565b9050919050565b600060208201905081810360008301526138f181613058565b9050919050565b60006020820190508181036000830152613911816130be565b9050919050565b60006020820190508181036000830152613931816130fe565b9050919050565b6000602082019050818103600083015261395181613164565b9050919050565b60006020820190508181036000830152613971816131ca565b9050919050565b6000602082019050818103600083015261399181613230565b9050919050565b600060208201905081810360008301526139b181613296565b9050919050565b600060208201905081810360008301526139d1816132fc565b9050919050565b600060208201905081810360008301526139f181613362565b9050919050565b60006020820190508181036000830152613a11816133a2565b9050919050565b60006020820190508181036000830152613a3181613408565b9050919050565b60006020820190508181036000830152613a518161346e565b9050919050565b60006020820190508181036000830152613a71816134ae565b9050919050565b60006020820190508181036000830152613a9181613514565b9050919050565b60006020820190508181036000830152613ab18161357a565b9050919050565b60006020820190508181036000830152613ad1816135e0565b9050919050565b60006020820190508181036000830152613af1816136c6565b9050919050565b6000602082019050613b0d600083018461372c565b92915050565b6000604051905081810181811067ffffffffffffffff82111715613b3a57613b39613f1f565b5b8060405250919050565b600067ffffffffffffffff821115613b5f57613b5e613f1f565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115613b8f57613b8e613f1f565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613bf282613d70565b9150613bfd83613d70565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613c3257613c31613e92565b5b828201905092915050565b6000613c4882613d70565b9150613c5383613d70565b925082613c6357613c62613ec1565b5b828204905092915050565b6000613c7982613d70565b9150613c8483613d70565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613cbd57613cbc613e92565b5b828202905092915050565b6000613cd382613d70565b9150613cde83613d70565b925082821015613cf157613cf0613e92565b5b828203905092915050565b6000613d0782613d50565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613da7578082015181840152602081019050613d8c565b83811115613db6576000848401525b50505050565b6000613dc782613d70565b91506000821415613ddb57613dda613e92565b5b600182039050919050565b60006002820490506001821680613dfe57607f821691505b60208210811415613e1257613e11613ef0565b5b50919050565b6000613e2382613d70565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613e5657613e55613e92565b5b600182019050919050565b6000613e6c82613d70565b9150613e7783613d70565b925082613e8757613e86613ec1565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b613f6881613cfc565b8114613f7357600080fd5b50565b613f7f81613d0e565b8114613f8a57600080fd5b50565b613f9681613d1a565b8114613fa157600080fd5b50565b613fad81613d24565b8114613fb857600080fd5b50565b613fc481613d70565b8114613fcf57600080fd5b5056fea2646970667358221220886834f16fdaea9e25426b6a94d455ed35b540fb53fe3c2c71f79d287bac5d7764736f6c63430008000033

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

00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000001b53656c6620506f72747261697473206f6620537472616e676572730000000000000000000000000000000000000000000000000000000000000000000000000453506f5300000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): Self Portraits of Strangers
Arg [1] : ticker (string): SPoS

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 000000000000000000000000000000000000000000000000000000000000001b
Arg [3] : 53656c6620506f72747261697473206f6620537472616e676572730000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [5] : 53506f5300000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

59621:940:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60372:186;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21372:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22931:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22454:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23821:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40005:123;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54870:165;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55393:174;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24231:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21066:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20796:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58895:94;;;:::i;:::-;;58244:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54325:145;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38890:139;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21541:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36868:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23224:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24487:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32984:679;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54644:134;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60056:308;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59791:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55128:170;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23590:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59144:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60372:186;60490:4;60514:36;60538:11;60514:23;:36::i;:::-;60507:43;;60372:186;;;:::o;21372:100::-;21426:13;21459:5;21452:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21372:100;:::o;22931:221::-;23007:7;23035:16;23043:7;23035;:16::i;:::-;23027:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23120:15;:24;23136:7;23120:24;;;;;;;;;;;;;;;;;;;;;23113:31;;22931:221;;;:::o;22454:411::-;22535:13;22551:23;22566:7;22551:14;:23::i;:::-;22535:39;;22599:5;22593:11;;:2;:11;;;;22585:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22693:5;22677:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22702:37;22719:5;22726:12;:10;:12::i;:::-;22702:16;:37::i;:::-;22677:62;22655:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;22836:21;22845:2;22849:7;22836:8;:21::i;:::-;22454:411;;;:::o;23821:339::-;24016:41;24035:12;:10;:12::i;:::-;24049:7;24016:18;:41::i;:::-;24008:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24124:28;24134:4;24140:2;24144:7;24124:9;:28::i;:::-;23821:339;;;:::o;40005:123::-;40071:7;40098:6;:12;40105:4;40098:12;;;;;;;;;;;:22;;;40091:29;;40005:123;;;:::o;54870:165::-;54955:30;54971:4;54977:7;54955:15;:30::i;:::-;54996:31;55019:7;54996:12;:18;55009:4;54996:18;;;;;;;;;;;:22;;:31;;;;:::i;:::-;;54870:165;;:::o;55393:174::-;55481:33;55500:4;55506:7;55481:18;:33::i;:::-;55525:34;55551:7;55525:12;:18;55538:4;55525:18;;;;;;;;;;;:25;;:34;;;;:::i;:::-;;55393:174;;:::o;24231:185::-;24369:39;24386:4;24392:2;24396:7;24369:39;;;;;;;;;;;;:16;:39::i;:::-;24231:185;;;:::o;21066:239::-;21138:7;21158:13;21174:7;:16;21182:7;21174:16;;;;;;;;;;;;;;;;;;;;;21158:32;;21226:1;21209:19;;:5;:19;;;;21201:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21292:5;21285:12;;;21066:239;;;:::o;20796:208::-;20868:7;20913:1;20896:19;;:5;:19;;;;20888:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;20980:9;:16;20990:5;20980:16;;;;;;;;;;;;;;;;20973:23;;20796:208;;;:::o;58895:94::-;58475:12;:10;:12::i;:::-;58464:23;;:7;:5;:7::i;:::-;:23;;;58456:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58960:21:::1;58978:1;58960:9;:21::i;:::-;58895:94::o:0;58244:87::-;58290:7;58317:6;;;;;;;;;;;58310:13;;58244:87;:::o;54325:145::-;54407:7;54434:28;54456:5;54434:12;:18;54447:4;54434:18;;;;;;;;;;;:21;;:28;;;;:::i;:::-;54427:35;;54325:145;;;;:::o;38890:139::-;38968:4;38992:6;:12;38999:4;38992:12;;;;;;;;;;;:20;;:29;39013:7;38992:29;;;;;;;;;;;;;;;;;;;;;;;;;38985:36;;38890:139;;;;:::o;21541:104::-;21597:13;21630:7;21623:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21541:104;:::o;36868:49::-;36913:4;36868:49;;;:::o;23224:295::-;23339:12;:10;:12::i;:::-;23327:24;;:8;:24;;;;23319:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23439:8;23394:18;:32;23413:12;:10;:12::i;:::-;23394:32;;;;;;;;;;;;;;;:42;23427:8;23394:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23492:8;23463:48;;23478:12;:10;:12::i;:::-;23463:48;;;23502:8;23463:48;;;;;;:::i;:::-;;;;;;;;23224:295;;:::o;24487:328::-;24662:41;24681:12;:10;:12::i;:::-;24695:7;24662:18;:41::i;:::-;24654:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24768:39;24782:4;24788:2;24792:7;24801:5;24768:13;:39::i;:::-;24487:328;;;;:::o;32984:679::-;33057:13;33091:16;33099:7;33091;:16::i;:::-;33083:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;33174:23;33200:10;:19;33211:7;33200:19;;;;;;;;;;;33174:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33230:18;33251:10;:8;:10::i;:::-;33230:31;;33359:1;33343:4;33337:18;:23;33333:72;;;33384:9;33377:16;;;;;;33333:72;33535:1;33515:9;33509:23;:27;33505:108;;;33584:4;33590:9;33567:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;33553:48;;;;;;33505:108;33632:23;33647:7;33632:14;:23::i;:::-;33625:30;;;;32984:679;;;;:::o;54644:134::-;54716:7;54743:27;:12;:18;54756:4;54743:18;;;;;;;;;;;:25;:27::i;:::-;54736:34;;54644:134;;;:::o;60056:308::-;60135:34;59829:24;60156:12;:10;:12::i;:::-;60135:7;:34::i;:::-;60127:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;60227:36;60233:2;60237:25;:15;:23;:25::i;:::-;60227:5;:36::i;:::-;60274:44;60287:25;:15;:23;:25::i;:::-;60314:3;60274:12;:44::i;:::-;60329:27;:15;:25;:27::i;:::-;60056:308;;:::o;59791:62::-;59829:24;59791:62;:::o;55128:170::-;55214:31;55231:4;55237:7;55214:16;:31::i;:::-;55256:34;55282:7;55256:12;:18;55269:4;55256:18;;;;;;;;;;;:25;;:34;;;;:::i;:::-;;55128:170;;:::o;23590:164::-;23687:4;23711:18;:25;23730:5;23711:25;;;;;;;;;;;;;;;:35;23737:8;23711:35;;;;;;;;;;;;;;;;;;;;;;;;;23704:42;;23590:164;;;;:::o;59144:192::-;58475:12;:10;:12::i;:::-;58464:23;;:7;:5;:7::i;:::-;:23;;;58456:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59253:1:::1;59233:22;;:8;:22;;;;59225:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;59309:19;59319:8;59309:9;:19::i;:::-;59144:192:::0;:::o;42239:112::-;42318:25;42329:4;42335:7;42318:10;:25::i;:::-;42239:112;;:::o;49627:152::-;49697:4;49721:50;49726:3;:10;;49762:5;49746:23;;49738:32;;49721:4;:50::i;:::-;49714:57;;49627:152;;;;:::o;53512:214::-;53597:4;53636:42;53621:57;;;:11;:57;;;;:97;;;;53682:36;53706:11;53682:23;:36::i;:::-;53621:97;53614:104;;53512:214;;;:::o;26325:127::-;26390:4;26442:1;26414:30;;:7;:16;26422:7;26414:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26407:37;;26325:127;;;:::o;15849:98::-;15902:7;15929:10;15922:17;;15849:98;:::o;30307:174::-;30409:2;30382:15;:24;30398:7;30382:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30465:7;30461:2;30427:46;;30436:23;30451:7;30436:14;:23::i;:::-;30427:46;;;;;;;;;;;;30307:174;;:::o;26619:348::-;26712:4;26737:16;26745:7;26737;:16::i;:::-;26729:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26813:13;26829:23;26844:7;26829:14;:23::i;:::-;26813:39;;26882:5;26871:16;;:7;:16;;;:51;;;;26915:7;26891:31;;:20;26903:7;26891:11;:20::i;:::-;:31;;;26871:51;:87;;;;26926:32;26943:5;26950:7;26926:16;:32::i;:::-;26871:87;26863:96;;;26619:348;;;;:::o;29611:578::-;29770:4;29743:31;;:23;29758:7;29743:14;:23::i;:::-;:31;;;29735:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;29853:1;29839:16;;:2;:16;;;;29831:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;29909:39;29930:4;29936:2;29940:7;29909:20;:39::i;:::-;30013:29;30030:1;30034:7;30013:8;:29::i;:::-;30074:1;30055:9;:15;30065:4;30055:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30103:1;30086:9;:13;30096:2;30086:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30134:2;30115:7;:16;30123:7;30115:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30173:7;30169:2;30154:27;;30163:4;30154:27;;;;;;;;;;;;29611:578;;;:::o;40390:147::-;40473:18;40486:4;40473:12;:18::i;:::-;38472:30;38483:4;38489:12;:10;:12::i;:::-;38472:10;:30::i;:::-;40504:25:::1;40515:4;40521:7;40504:10;:25::i;:::-;40390:147:::0;;;:::o;41438:218::-;41545:12;:10;:12::i;:::-;41534:23;;:7;:23;;;41526:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;41622:26;41634:4;41640:7;41622:11;:26::i;:::-;41438:218;;:::o;49955:158::-;50028:4;50052:53;50060:3;:10;;50096:5;50080:23;;50072:32;;50052:7;:53::i;:::-;50045:60;;49955:158;;;;:::o;59344:173::-;59400:16;59419:6;;;;;;;;;;;59400:25;;59445:8;59436:6;;:17;;;;;;;;;;;;;;;;;;59500:8;59469:40;;59490:8;59469:40;;;;;;;;;;;;59344:173;;:::o;50923:158::-;50997:7;51048:22;51052:3;:10;;51064:5;51048:3;:22::i;:::-;51040:31;;51017:56;;50923:158;;;;:::o;25697:315::-;25854:28;25864:4;25870:2;25874:7;25854:9;:28::i;:::-;25901:48;25924:4;25930:2;25934:7;25943:5;25901:22;:48::i;:::-;25893:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25697:315;;;;:::o;22298:94::-;22349:13;22375:9;;;;;;;;;;;;;;22298:94;:::o;21716:334::-;21789:13;21823:16;21831:7;21823;:16::i;:::-;21815:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;21904:21;21928:10;:8;:10::i;:::-;21904:34;;21980:1;21962:7;21956:21;:25;:86;;;;;;;;;;;;;;;;;22008:7;22017:18;:7;:16;:18::i;:::-;21991:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;21956:86;21949:93;;;21716:334;;;:::o;50452:117::-;50515:7;50542:19;50550:3;:10;;50542:7;:19::i;:::-;50535:26;;50452:117;;;:::o;56653:114::-;56718:7;56745;:14;;;56738:21;;56653:114;;;:::o;28303:382::-;28397:1;28383:16;;:2;:16;;;;28375:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28456:16;28464:7;28456;:16::i;:::-;28455:17;28447:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28518:45;28547:1;28551:2;28555:7;28518:20;:45::i;:::-;28593:1;28576:9;:13;28586:2;28576:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28624:2;28605:7;:16;28613:7;28605:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28669:7;28665:2;28644:33;;28661:1;28644:33;;;;;;;;;;;;28303:382;;:::o;33819:217::-;33919:16;33927:7;33919;:16::i;:::-;33911:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;34019:9;33997:10;:19;34008:7;33997:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;33819:217;;:::o;56775:127::-;56882:1;56864:7;:14;;;:19;;;;;;;;;;;56775:127;:::o;40782:149::-;40866:18;40879:4;40866:12;:18::i;:::-;38472:30;38483:4;38489:12;:10;:12::i;:::-;38472:10;:30::i;:::-;40897:26:::1;40909:4;40915:7;40897:11;:26::i;:::-;40782:149:::0;;;:::o;42686:229::-;42761:22;42769:4;42775:7;42761;:22::i;:::-;42756:152;;42832:4;42800:6;:12;42807:4;42800:12;;;;;;;;;;;:20;;:29;42821:7;42800:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;42883:12;:10;:12::i;:::-;42856:40;;42874:7;42856:40;;42868:4;42856:40;;;;;;;;;;42756:152;42686:229;;:::o;44879:414::-;44942:4;44964:21;44974:3;44979:5;44964:9;:21::i;:::-;44959:327;;45002:3;:11;;45019:5;45002:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45185:3;:11;;:18;;;;45163:3;:12;;:19;45176:5;45163:19;;;;;;;;;;;:40;;;;45225:4;45218:11;;;;44959:327;45269:5;45262:12;;44879:414;;;;;:::o;38594:204::-;38679:4;38718:32;38703:47;;;:11;:47;;;;:87;;;;38754:36;38778:11;38754:23;:36::i;:::-;38703:87;38696:94;;38594:204;;;:::o;32421:126::-;;;;:::o;39319:497::-;39400:22;39408:4;39414:7;39400;:22::i;:::-;39395:414;;39588:41;39616:7;39588:41;;39626:2;39588:19;:41::i;:::-;39702:38;39730:4;39722:13;;39737:2;39702:19;:38::i;:::-;39493:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;39439:358;;;;;;;;;;;:::i;:::-;;;;;;;;39395:414;39319:497;;:::o;42923:230::-;42998:22;43006:4;43012:7;42998;:22::i;:::-;42994:152;;;43069:5;43037:6;:12;43044:4;43037:12;;;;;;;;;;;:20;;:29;43058:7;43037:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;43121:12;:10;:12::i;:::-;43094:40;;43112:7;43094:40;;43106:4;43094:40;;;;;;;;;;42994:152;42923:230;;:::o;45469:1420::-;45535:4;45653:18;45674:3;:12;;:19;45687:5;45674:19;;;;;;;;;;;;45653:40;;45724:1;45710:10;:15;45706:1176;;46085:21;46122:1;46109:10;:14;;;;:::i;:::-;46085:38;;46138:17;46179:1;46158:3;:11;;:18;;;;:22;;;;:::i;:::-;46138:42;;46214:13;46201:9;:26;46197:405;;46248:17;46268:3;:11;;46280:9;46268:22;;;;;;;;;;;;;;;;;;;;;;;;46248:42;;46422:9;46393:3;:11;;46405:13;46393:26;;;;;;;;;;;;;;;;;;;;;;;:38;;;;46533:10;46507:3;:12;;:23;46520:9;46507:23;;;;;;;;;;;:36;;;;46197:405;;46683:3;:11;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46778:3;:12;;:19;46791:5;46778:19;;;;;;;;;;;46771:26;;;46821:4;46814:11;;;;;;;45706:1176;46865:5;46858:12;;;45469:1420;;;;;:::o;47653:120::-;47720:7;47747:3;:11;;47759:5;47747:18;;;;;;;;;;;;;;;;;;;;;;;;47740:25;;47653:120;;;;:::o;31046:803::-;31201:4;31222:15;:2;:13;;;:15::i;:::-;31218:624;;;31274:2;31258:36;;;31295:12;:10;:12::i;:::-;31309:4;31315:7;31324:5;31258:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31254:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31521:1;31504:6;:13;:18;31500:272;;;31547:60;;;;;;;;;;:::i;:::-;;;;;;;;31500:272;31722:6;31716:13;31707:6;31703:2;31699:15;31692:38;31254:533;31391:45;;;31381:55;;;:6;:55;;;;31374:62;;;;;31218:624;31826:4;31819:11;;31046:803;;;;;;;:::o;16374:723::-;16430:13;16660:1;16651:5;:10;16647:53;;;16678:10;;;;;;;;;;;;;;;;;;;;;16647:53;16710:12;16725:5;16710:20;;16741:14;16766:78;16781:1;16773:4;:9;16766:78;;16799:8;;;;;:::i;:::-;;;;16830:2;16822:10;;;;;:::i;:::-;;;16766:78;;;16854:19;16886:6;16876:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16854:39;;16904:154;16920:1;16911:5;:10;16904:154;;16948:1;16938:11;;;;;:::i;:::-;;;17015:2;17007:5;:10;;;;:::i;:::-;16994:2;:24;;;;:::i;:::-;16981:39;;16964:6;16971;16964:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;17044:2;17035:11;;;;;:::i;:::-;;;16904:154;;;17082:6;17068:21;;;;;16374:723;;;;:::o;47190:109::-;47246:7;47273:3;:11;;:18;;;;47266:25;;47190:109;;;:::o;46975:129::-;47048:4;47095:1;47072:3;:12;;:19;47085:5;47072:19;;;;;;;;;;;;:24;;47065:31;;46975:129;;;;:::o;20427:305::-;20529:4;20581:25;20566:40;;;:11;:40;;;;:105;;;;20638:33;20623:48;;;:11;:48;;;;20566:105;:158;;;;20688:36;20712:11;20688:23;:36::i;:::-;20566:158;20546:178;;20427:305;;;:::o;17675:451::-;17750:13;17776:19;17821:1;17812:6;17808:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;17798:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17776:47;;17834:15;:6;17841:1;17834:9;;;;;;;;;;;;;;;;;;;:15;;;;;;;;;;;17860;:6;17867:1;17860:9;;;;;;;;;;;;;;;;;;;:15;;;;;;;;;;;17891:9;17916:1;17907:6;17903:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;17891:26;;17886:135;17923:1;17919;:5;17886:135;;;17958:12;17979:3;17971:5;:11;17958:25;;;;;;;;;;;;;;;;;;17946:6;17953:1;17946:9;;;;;;;;;;;;;;;;;;;:37;;;;;;;;;;;18008:1;17998:11;;;;;17926:3;;;;:::i;:::-;;;17886:135;;;;18048:1;18039:5;:10;18031:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;18111:6;18097:21;;;17675:451;;;;:::o;8111:387::-;8171:4;8379:12;8446:7;8434:20;8426:28;;8489:1;8482:4;:8;8475:15;;;8111:387;;;:::o;18931:157::-;19016:4;19055:25;19040:40;;;:11;:40;;;;19033:47;;18931:157;;;:::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:139::-;;1073:6;1060:20;1051:29;;1089:33;1116:5;1089:33;:::i;:::-;1041:87;;;;:::o;1134:137::-;;1217:6;1204:20;1195:29;;1233:32;1259:5;1233:32;:::i;:::-;1185:86;;;;:::o;1277:141::-;;1364:6;1358:13;1349:22;;1380:32;1406:5;1380:32;:::i;:::-;1339:79;;;;:::o;1437:271::-;;1541:3;1534:4;1526:6;1522:17;1518:27;1508:2;;1559:1;1556;1549:12;1508:2;1599:6;1586:20;1624:78;1698:3;1690:6;1683:4;1675:6;1671:17;1624:78;:::i;:::-;1615:87;;1498:210;;;;;:::o;1728:273::-;;1833:3;1826:4;1818:6;1814:17;1810:27;1800:2;;1851:1;1848;1841:12;1800:2;1891:6;1878:20;1916:79;1991:3;1983:6;1976:4;1968:6;1964:17;1916:79;:::i;:::-;1907:88;;1790:211;;;;;:::o;2007:139::-;;2091:6;2078:20;2069:29;;2107:33;2134:5;2107:33;:::i;:::-;2059:87;;;;:::o;2152:262::-;;2260:2;2248:9;2239:7;2235:23;2231:32;2228:2;;;2276:1;2273;2266:12;2228:2;2319:1;2344:53;2389:7;2380:6;2369:9;2365:22;2344:53;:::i;:::-;2334:63;;2290:117;2218:196;;;;:::o;2420:407::-;;;2545:2;2533:9;2524:7;2520:23;2516:32;2513:2;;;2561:1;2558;2551:12;2513:2;2604:1;2629:53;2674:7;2665:6;2654:9;2650:22;2629:53;:::i;:::-;2619:63;;2575:117;2731:2;2757:53;2802:7;2793:6;2782:9;2778:22;2757:53;:::i;:::-;2747:63;;2702:118;2503:324;;;;;:::o;2833:552::-;;;;2975:2;2963:9;2954:7;2950:23;2946:32;2943:2;;;2991:1;2988;2981:12;2943:2;3034:1;3059:53;3104:7;3095:6;3084:9;3080:22;3059:53;:::i;:::-;3049:63;;3005:117;3161:2;3187:53;3232:7;3223:6;3212:9;3208:22;3187:53;:::i;:::-;3177:63;;3132:118;3289:2;3315:53;3360:7;3351:6;3340:9;3336:22;3315:53;:::i;:::-;3305:63;;3260:118;2933:452;;;;;:::o;3391:809::-;;;;;3559:3;3547:9;3538:7;3534:23;3530:33;3527:2;;;3576:1;3573;3566:12;3527:2;3619:1;3644:53;3689:7;3680:6;3669:9;3665:22;3644:53;:::i;:::-;3634:63;;3590:117;3746:2;3772:53;3817:7;3808:6;3797:9;3793:22;3772:53;:::i;:::-;3762:63;;3717:118;3874:2;3900:53;3945:7;3936:6;3925:9;3921:22;3900:53;:::i;:::-;3890:63;;3845:118;4030:2;4019:9;4015:18;4002:32;4061:18;4053:6;4050:30;4047:2;;;4093:1;4090;4083:12;4047:2;4121:62;4175:7;4166:6;4155:9;4151:22;4121:62;:::i;:::-;4111:72;;3973:220;3517:683;;;;;;;:::o;4206:401::-;;;4328:2;4316:9;4307:7;4303:23;4299:32;4296:2;;;4344:1;4341;4334:12;4296:2;4387:1;4412:53;4457:7;4448:6;4437:9;4433:22;4412:53;:::i;:::-;4402:63;;4358:117;4514:2;4540:50;4582:7;4573:6;4562:9;4558:22;4540:50;:::i;:::-;4530:60;;4485:115;4286:321;;;;;:::o;4613:520::-;;;4748:2;4736:9;4727:7;4723:23;4719:32;4716:2;;;4764:1;4761;4754:12;4716:2;4807:1;4832:53;4877:7;4868:6;4857:9;4853:22;4832:53;:::i;:::-;4822:63;;4778:117;4962:2;4951:9;4947:18;4934:32;4993:18;4985:6;4982:30;4979:2;;;5025:1;5022;5015:12;4979:2;5053:63;5108:7;5099:6;5088:9;5084:22;5053:63;:::i;:::-;5043:73;;4905:221;4706:427;;;;;:::o;5139:407::-;;;5264:2;5252:9;5243:7;5239:23;5235:32;5232:2;;;5280:1;5277;5270:12;5232:2;5323:1;5348:53;5393:7;5384:6;5373:9;5369:22;5348:53;:::i;:::-;5338:63;;5294:117;5450:2;5476:53;5521:7;5512:6;5501:9;5497:22;5476:53;:::i;:::-;5466:63;;5421:118;5222:324;;;;;:::o;5552:262::-;;5660:2;5648:9;5639:7;5635:23;5631:32;5628:2;;;5676:1;5673;5666:12;5628:2;5719:1;5744:53;5789:7;5780:6;5769:9;5765:22;5744:53;:::i;:::-;5734:63;;5690:117;5618:196;;;;:::o;5820:407::-;;;5945:2;5933:9;5924:7;5920:23;5916:32;5913:2;;;5961:1;5958;5951:12;5913:2;6004:1;6029:53;6074:7;6065:6;6054:9;6050:22;6029:53;:::i;:::-;6019:63;;5975:117;6131:2;6157:53;6202:7;6193:6;6182:9;6178:22;6157:53;:::i;:::-;6147:63;;6102:118;5903:324;;;;;:::o;6233:407::-;;;6358:2;6346:9;6337:7;6333:23;6329:32;6326:2;;;6374:1;6371;6364:12;6326:2;6417:1;6442:53;6487:7;6478:6;6467:9;6463:22;6442:53;:::i;:::-;6432:63;;6388:117;6544:2;6570:53;6615:7;6606:6;6595:9;6591:22;6570:53;:::i;:::-;6560:63;;6515:118;6316:324;;;;;:::o;6646:260::-;;6753:2;6741:9;6732:7;6728:23;6724:32;6721:2;;;6769:1;6766;6759:12;6721:2;6812:1;6837:52;6881:7;6872:6;6861:9;6857:22;6837:52;:::i;:::-;6827:62;;6783:116;6711:195;;;;:::o;6912:282::-;;7030:2;7018:9;7009:7;7005:23;7001:32;6998:2;;;7046:1;7043;7036:12;6998:2;7089:1;7114:63;7169:7;7160:6;7149:9;7145:22;7114:63;:::i;:::-;7104:73;;7060:127;6988:206;;;;:::o;7200:262::-;;7308:2;7296:9;7287:7;7283:23;7279:32;7276:2;;;7324:1;7321;7314:12;7276:2;7367:1;7392:53;7437:7;7428:6;7417:9;7413:22;7392:53;:::i;:::-;7382:63;;7338:117;7266:196;;;;:::o;7468:118::-;7555:24;7573:5;7555:24;:::i;:::-;7550:3;7543:37;7533:53;;:::o;7592:109::-;7673:21;7688:5;7673:21;:::i;:::-;7668:3;7661:34;7651:50;;:::o;7707:118::-;7794:24;7812:5;7794:24;:::i;:::-;7789:3;7782:37;7772:53;;:::o;7831:360::-;;7945:38;7977:5;7945:38;:::i;:::-;7999:70;8062:6;8057:3;7999:70;:::i;:::-;7992:77;;8078:52;8123:6;8118:3;8111:4;8104:5;8100:16;8078:52;:::i;:::-;8155:29;8177:6;8155:29;:::i;:::-;8150:3;8146:39;8139:46;;7921:270;;;;;:::o;8197:364::-;;8313:39;8346:5;8313:39;:::i;:::-;8368:71;8432:6;8427:3;8368:71;:::i;:::-;8361:78;;8448:52;8493:6;8488:3;8481:4;8474:5;8470:16;8448:52;:::i;:::-;8525:29;8547:6;8525:29;:::i;:::-;8520:3;8516:39;8509:46;;8289:272;;;;;:::o;8567:377::-;;8701:39;8734:5;8701:39;:::i;:::-;8756:89;8838:6;8833:3;8756:89;:::i;:::-;8749:96;;8854:52;8899:6;8894:3;8887:4;8880:5;8876:16;8854:52;:::i;:::-;8931:6;8926:3;8922:16;8915:23;;8677:267;;;;;:::o;8950:330::-;;9113:67;9177:2;9172:3;9113:67;:::i;:::-;9106:74;;9210:34;9206:1;9201:3;9197:11;9190:55;9271:2;9266:3;9262:12;9255:19;;9096:184;;;:::o;9286:382::-;;9449:67;9513:2;9508:3;9449:67;:::i;:::-;9442:74;;9546:34;9542:1;9537:3;9533:11;9526:55;9612:20;9607:2;9602:3;9598:12;9591:42;9659:2;9654:3;9650:12;9643:19;;9432:236;;;:::o;9674:370::-;;9837:67;9901:2;9896:3;9837:67;:::i;:::-;9830:74;;9934:34;9930:1;9925:3;9921:11;9914:55;10000:8;9995:2;9990:3;9986:12;9979:30;10035:2;10030:3;10026:12;10019:19;;9820:224;;;:::o;10050:326::-;;10213:67;10277:2;10272:3;10213:67;:::i;:::-;10206:74;;10310:30;10306:1;10301:3;10297:11;10290:51;10367:2;10362:3;10358:12;10351:19;;10196:180;;;:::o;10382:368::-;;10545:67;10609:2;10604:3;10545:67;:::i;:::-;10538:74;;10642:34;10638:1;10633:3;10629:11;10622:55;10708:6;10703:2;10698:3;10694:12;10687:28;10741:2;10736:3;10732:12;10725:19;;10528:222;;;:::o;10756:323::-;;10919:67;10983:2;10978:3;10919:67;:::i;:::-;10912:74;;11016:27;11012:1;11007:3;11003:11;10996:48;11070:2;11065:3;11061:12;11054:19;;10902:177;;;:::o;11085:376::-;;11248:67;11312:2;11307:3;11248:67;:::i;:::-;11241:74;;11345:34;11341:1;11336:3;11332:11;11325:55;11411:14;11406:2;11401:3;11397:12;11390:36;11452:2;11447:3;11443:12;11436:19;;11231:230;;;:::o;11467:388::-;;11630:67;11694:2;11689:3;11630:67;:::i;:::-;11623:74;;11727:34;11723:1;11718:3;11714:11;11707:55;11793:26;11788:2;11783:3;11779:12;11772:48;11846:2;11841:3;11837:12;11830:19;;11613:242;;;:::o;11861:374::-;;12024:67;12088:2;12083:3;12024:67;:::i;:::-;12017:74;;12121:34;12117:1;12112:3;12108:11;12101:55;12187:12;12182:2;12177:3;12173:12;12166:34;12226:2;12221:3;12217:12;12210:19;;12007:228;;;:::o;12241:373::-;;12404:67;12468:2;12463:3;12404:67;:::i;:::-;12397:74;;12501:34;12497:1;12492:3;12488:11;12481:55;12567:11;12562:2;12557:3;12553:12;12546:33;12605:2;12600:3;12596:12;12589:19;;12387:227;;;:::o;12620:378::-;;12783:67;12847:2;12842:3;12783:67;:::i;:::-;12776:74;;12880:34;12876:1;12871:3;12867:11;12860:55;12946:16;12941:2;12936:3;12932:12;12925:38;12989:2;12984:3;12980:12;12973:19;;12766:232;;;:::o;13004:372::-;;13167:67;13231:2;13226:3;13167:67;:::i;:::-;13160:74;;13264:34;13260:1;13255:3;13251:11;13244:55;13330:10;13325:2;13320:3;13316:12;13309:32;13367:2;13362:3;13358:12;13351:19;;13150:226;;;:::o;13382:330::-;;13545:67;13609:2;13604:3;13545:67;:::i;:::-;13538:74;;13642:34;13638:1;13633:3;13629:11;13622:55;13703:2;13698:3;13694:12;13687:19;;13528:184;;;:::o;13718:381::-;;13881:67;13945:2;13940:3;13881:67;:::i;:::-;13874:74;;13978:34;13974:1;13969:3;13965:11;13958:55;14044:19;14039:2;14034:3;14030:12;14023:41;14090:2;14085:3;14081:12;14074:19;;13864:235;;;:::o;14105:376::-;;14268:67;14332:2;14327:3;14268:67;:::i;:::-;14261:74;;14365:34;14361:1;14356:3;14352:11;14345:55;14431:14;14426:2;14421:3;14417:12;14410:36;14472:2;14467:3;14463:12;14456:19;;14251:230;;;:::o;14487:330::-;;14650:67;14714:2;14709:3;14650:67;:::i;:::-;14643:74;;14747:34;14743:1;14738:3;14734:11;14727:55;14808:2;14803:3;14799:12;14792:19;;14633:184;;;:::o;14823:373::-;;14986:67;15050:2;15045:3;14986:67;:::i;:::-;14979:74;;15083:34;15079:1;15074:3;15070:11;15063:55;15149:11;15144:2;15139:3;15135:12;15128:33;15187:2;15182:3;15178:12;15171:19;;14969:227;;;:::o;15202:379::-;;15365:67;15429:2;15424:3;15365:67;:::i;:::-;15358:74;;15462:34;15458:1;15453:3;15449:11;15442:55;15528:17;15523:2;15518:3;15514:12;15507:39;15572:2;15567:3;15563:12;15556:19;;15348:233;;;:::o;15587:365::-;;15750:67;15814:2;15809:3;15750:67;:::i;:::-;15743:74;;15847:34;15843:1;15838:3;15834:11;15827:55;15913:3;15908:2;15903:3;15899:12;15892:25;15943:2;15938:3;15934:12;15927:19;;15733:219;;;:::o;15958:381::-;;16121:67;16185:2;16180:3;16121:67;:::i;:::-;16114:74;;16218:34;16214:1;16209:3;16205:11;16198:55;16284:19;16279:2;16274:3;16270:12;16263:41;16330:2;16325:3;16321:12;16314:19;;16104:235;;;:::o;16345:357::-;;16526:85;16608:2;16603:3;16526:85;:::i;:::-;16519:92;;16641:25;16637:1;16632:3;16628:11;16621:46;16693:2;16688:3;16684:12;16677:19;;16509:193;;;:::o;16708:351::-;;16889:85;16971:2;16966:3;16889:85;:::i;:::-;16882:92;;17004:19;17000:1;16995:3;16991:11;16984:40;17050:2;17045:3;17041:12;17034:19;;16872:187;;;:::o;17065:379::-;;17228:67;17292:2;17287:3;17228:67;:::i;:::-;17221:74;;17325:34;17321:1;17316:3;17312:11;17305:55;17391:17;17386:2;17381:3;17377:12;17370:39;17435:2;17430:3;17426:12;17419:19;;17211:233;;;:::o;17450:118::-;17537:24;17555:5;17537:24;:::i;:::-;17532:3;17525:37;17515:53;;:::o;17574:435::-;;17776:95;17867:3;17858:6;17776:95;:::i;:::-;17769:102;;17888:95;17979:3;17970:6;17888:95;:::i;:::-;17881:102;;18000:3;17993:10;;17758:251;;;;;:::o;18015:967::-;;18419:148;18563:3;18419:148;:::i;:::-;18412:155;;18584:95;18675:3;18666:6;18584:95;:::i;:::-;18577:102;;18696:148;18840:3;18696:148;:::i;:::-;18689:155;;18861:95;18952:3;18943:6;18861:95;:::i;:::-;18854:102;;18973:3;18966:10;;18401:581;;;;;:::o;18988:222::-;;19119:2;19108:9;19104:18;19096:26;;19132:71;19200:1;19189:9;19185:17;19176:6;19132:71;:::i;:::-;19086:124;;;;:::o;19216:640::-;;19449:3;19438:9;19434:19;19426:27;;19463:71;19531:1;19520:9;19516:17;19507:6;19463:71;:::i;:::-;19544:72;19612:2;19601:9;19597:18;19588:6;19544:72;:::i;:::-;19626;19694:2;19683:9;19679:18;19670:6;19626:72;:::i;:::-;19745:9;19739:4;19735:20;19730:2;19719:9;19715:18;19708:48;19773:76;19844:4;19835:6;19773:76;:::i;:::-;19765:84;;19416:440;;;;;;;:::o;19862:210::-;;19987:2;19976:9;19972:18;19964:26;;20000:65;20062:1;20051:9;20047:17;20038:6;20000:65;:::i;:::-;19954:118;;;;:::o;20078:222::-;;20209:2;20198:9;20194:18;20186:26;;20222:71;20290:1;20279:9;20275:17;20266:6;20222:71;:::i;:::-;20176:124;;;;:::o;20306:313::-;;20457:2;20446:9;20442:18;20434:26;;20506:9;20500:4;20496:20;20492:1;20481:9;20477:17;20470:47;20534:78;20607:4;20598:6;20534:78;:::i;:::-;20526:86;;20424:195;;;;:::o;20625:419::-;;20829:2;20818:9;20814:18;20806:26;;20878:9;20872:4;20868:20;20864:1;20853:9;20849:17;20842:47;20906:131;21032:4;20906:131;:::i;:::-;20898:139;;20796:248;;;:::o;21050:419::-;;21254:2;21243:9;21239:18;21231:26;;21303:9;21297:4;21293:20;21289:1;21278:9;21274:17;21267:47;21331:131;21457:4;21331:131;:::i;:::-;21323:139;;21221:248;;;:::o;21475:419::-;;21679:2;21668:9;21664:18;21656:26;;21728:9;21722:4;21718:20;21714:1;21703:9;21699:17;21692:47;21756:131;21882:4;21756:131;:::i;:::-;21748:139;;21646:248;;;:::o;21900:419::-;;22104:2;22093:9;22089:18;22081:26;;22153:9;22147:4;22143:20;22139:1;22128:9;22124:17;22117:47;22181:131;22307:4;22181:131;:::i;:::-;22173:139;;22071:248;;;:::o;22325:419::-;;22529:2;22518:9;22514:18;22506:26;;22578:9;22572:4;22568:20;22564:1;22553:9;22549:17;22542:47;22606:131;22732:4;22606:131;:::i;:::-;22598:139;;22496:248;;;:::o;22750:419::-;;22954:2;22943:9;22939:18;22931:26;;23003:9;22997:4;22993:20;22989:1;22978:9;22974:17;22967:47;23031:131;23157:4;23031:131;:::i;:::-;23023:139;;22921:248;;;:::o;23175:419::-;;23379:2;23368:9;23364:18;23356:26;;23428:9;23422:4;23418:20;23414:1;23403:9;23399:17;23392:47;23456:131;23582:4;23456:131;:::i;:::-;23448:139;;23346:248;;;:::o;23600:419::-;;23804:2;23793:9;23789:18;23781:26;;23853:9;23847:4;23843:20;23839:1;23828:9;23824:17;23817:47;23881:131;24007:4;23881:131;:::i;:::-;23873:139;;23771:248;;;:::o;24025:419::-;;24229:2;24218:9;24214:18;24206:26;;24278:9;24272:4;24268:20;24264:1;24253:9;24249:17;24242:47;24306:131;24432:4;24306:131;:::i;:::-;24298:139;;24196:248;;;:::o;24450:419::-;;24654:2;24643:9;24639:18;24631:26;;24703:9;24697:4;24693:20;24689:1;24678:9;24674:17;24667:47;24731:131;24857:4;24731:131;:::i;:::-;24723:139;;24621:248;;;:::o;24875:419::-;;25079:2;25068:9;25064:18;25056:26;;25128:9;25122:4;25118:20;25114:1;25103:9;25099:17;25092:47;25156:131;25282:4;25156:131;:::i;:::-;25148:139;;25046:248;;;:::o;25300:419::-;;25504:2;25493:9;25489:18;25481:26;;25553:9;25547:4;25543:20;25539:1;25528:9;25524:17;25517:47;25581:131;25707:4;25581:131;:::i;:::-;25573:139;;25471:248;;;:::o;25725:419::-;;25929:2;25918:9;25914:18;25906:26;;25978:9;25972:4;25968:20;25964:1;25953:9;25949:17;25942:47;26006:131;26132:4;26006:131;:::i;:::-;25998:139;;25896:248;;;:::o;26150:419::-;;26354:2;26343:9;26339:18;26331:26;;26403:9;26397:4;26393:20;26389:1;26378:9;26374:17;26367:47;26431:131;26557:4;26431:131;:::i;:::-;26423:139;;26321:248;;;:::o;26575:419::-;;26779:2;26768:9;26764:18;26756:26;;26828:9;26822:4;26818:20;26814:1;26803:9;26799:17;26792:47;26856:131;26982:4;26856:131;:::i;:::-;26848:139;;26746:248;;;:::o;27000:419::-;;27204:2;27193:9;27189:18;27181:26;;27253:9;27247:4;27243:20;27239:1;27228:9;27224:17;27217:47;27281:131;27407:4;27281:131;:::i;:::-;27273:139;;27171:248;;;:::o;27425:419::-;;27629:2;27618:9;27614:18;27606:26;;27678:9;27672:4;27668:20;27664:1;27653:9;27649:17;27642:47;27706:131;27832:4;27706:131;:::i;:::-;27698:139;;27596:248;;;:::o;27850:419::-;;28054:2;28043:9;28039:18;28031:26;;28103:9;28097:4;28093:20;28089:1;28078:9;28074:17;28067:47;28131:131;28257:4;28131:131;:::i;:::-;28123:139;;28021:248;;;:::o;28275:419::-;;28479:2;28468:9;28464:18;28456:26;;28528:9;28522:4;28518:20;28514:1;28503:9;28499:17;28492:47;28556:131;28682:4;28556:131;:::i;:::-;28548:139;;28446:248;;;:::o;28700:419::-;;28904:2;28893:9;28889:18;28881:26;;28953:9;28947:4;28943:20;28939:1;28928:9;28924:17;28917:47;28981:131;29107:4;28981:131;:::i;:::-;28973:139;;28871:248;;;:::o;29125:419::-;;29329:2;29318:9;29314:18;29306:26;;29378:9;29372:4;29368:20;29364:1;29353:9;29349:17;29342:47;29406:131;29532:4;29406:131;:::i;:::-;29398:139;;29296:248;;;:::o;29550:222::-;;29681:2;29670:9;29666:18;29658:26;;29694:71;29762:1;29751:9;29747:17;29738:6;29694:71;:::i;:::-;29648:124;;;;:::o;29778:283::-;;29844:2;29838:9;29828:19;;29886:4;29878:6;29874:17;29993:6;29981:10;29978:22;29957:18;29945:10;29942:34;29939:62;29936:2;;;30004:18;;:::i;:::-;29936:2;30044:10;30040:2;30033:22;29818:243;;;;:::o;30067:331::-;;30218:18;30210:6;30207:30;30204:2;;;30240:18;;:::i;:::-;30204:2;30325:4;30321:9;30314:4;30306:6;30302:17;30298:33;30290:41;;30386:4;30380;30376:15;30368:23;;30133:265;;;:::o;30404:332::-;;30556:18;30548:6;30545:30;30542:2;;;30578:18;;:::i;:::-;30542:2;30663:4;30659:9;30652:4;30644:6;30640:17;30636:33;30628:41;;30724:4;30718;30714:15;30706:23;;30471:265;;;:::o;30742:98::-;;30827:5;30821:12;30811:22;;30800:40;;;:::o;30846:99::-;;30932:5;30926:12;30916:22;;30905:40;;;:::o;30951:168::-;;31068:6;31063:3;31056:19;31108:4;31103:3;31099:14;31084:29;;31046:73;;;;:::o;31125:169::-;;31243:6;31238:3;31231:19;31283:4;31278:3;31274:14;31259:29;;31221:73;;;;:::o;31300:148::-;;31439:3;31424:18;;31414:34;;;;:::o;31454:305::-;;31513:20;31531:1;31513:20;:::i;:::-;31508:25;;31547:20;31565:1;31547:20;:::i;:::-;31542:25;;31701:1;31633:66;31629:74;31626:1;31623:81;31620:2;;;31707:18;;:::i;:::-;31620:2;31751:1;31748;31744:9;31737:16;;31498:261;;;;:::o;31765:185::-;;31822:20;31840:1;31822:20;:::i;:::-;31817:25;;31856:20;31874:1;31856:20;:::i;:::-;31851:25;;31895:1;31885:2;;31900:18;;:::i;:::-;31885:2;31942:1;31939;31935:9;31930:14;;31807:143;;;;:::o;31956:348::-;;32019:20;32037:1;32019:20;:::i;:::-;32014:25;;32053:20;32071:1;32053:20;:::i;:::-;32048:25;;32241:1;32173:66;32169:74;32166:1;32163:81;32158:1;32151:9;32144:17;32140:105;32137:2;;;32248:18;;:::i;:::-;32137:2;32296:1;32293;32289:9;32278:20;;32004:300;;;;:::o;32310:191::-;;32370:20;32388:1;32370:20;:::i;:::-;32365:25;;32404:20;32422:1;32404:20;:::i;:::-;32399:25;;32443:1;32440;32437:8;32434:2;;;32448:18;;:::i;:::-;32434:2;32493:1;32490;32486:9;32478:17;;32355:146;;;;:::o;32507:96::-;;32573:24;32591:5;32573:24;:::i;:::-;32562:35;;32552:51;;;:::o;32609:90::-;;32686:5;32679:13;32672:21;32661:32;;32651:48;;;:::o;32705:77::-;;32771:5;32760:16;;32750:32;;;:::o;32788:149::-;;32864:66;32857:5;32853:78;32842:89;;32832:105;;;:::o;32943:126::-;;33020:42;33013:5;33009:54;32998:65;;32988:81;;;:::o;33075:77::-;;33141:5;33130:16;;33120:32;;;:::o;33158:154::-;33242:6;33237:3;33232;33219:30;33304:1;33295:6;33290:3;33286:16;33279:27;33209:103;;;:::o;33318:307::-;33386:1;33396:113;33410:6;33407:1;33404:13;33396:113;;;33495:1;33490:3;33486:11;33480:18;33476:1;33471:3;33467:11;33460:39;33432:2;33429:1;33425:10;33420:15;;33396:113;;;33527:6;33524:1;33521:13;33518:2;;;33607:1;33598:6;33593:3;33589:16;33582:27;33518:2;33367:258;;;;:::o;33631:171::-;;33693:24;33711:5;33693:24;:::i;:::-;33684:33;;33739:4;33732:5;33729:15;33726:2;;;33747:18;;:::i;:::-;33726:2;33794:1;33787:5;33783:13;33776:20;;33674:128;;;:::o;33808:320::-;;33889:1;33883:4;33879:12;33869:22;;33936:1;33930:4;33926:12;33957:18;33947:2;;34013:4;34005:6;34001:17;33991:27;;33947:2;34075;34067:6;34064:14;34044:18;34041:38;34038:2;;;34094:18;;:::i;:::-;34038:2;33859:269;;;;:::o;34134:233::-;;34196:24;34214:5;34196:24;:::i;:::-;34187:33;;34242:66;34235:5;34232:77;34229:2;;;34312:18;;:::i;:::-;34229:2;34359:1;34352:5;34348:13;34341:20;;34177:190;;;:::o;34373:176::-;;34422:20;34440:1;34422:20;:::i;:::-;34417:25;;34456:20;34474:1;34456:20;:::i;:::-;34451:25;;34495:1;34485:2;;34500:18;;:::i;:::-;34485:2;34541:1;34538;34534:9;34529:14;;34407:142;;;;:::o;34555:180::-;34603:77;34600:1;34593:88;34700:4;34697:1;34690:15;34724:4;34721:1;34714:15;34741:180;34789:77;34786:1;34779:88;34886:4;34883:1;34876:15;34910:4;34907:1;34900:15;34927:180;34975:77;34972:1;34965:88;35072:4;35069:1;35062:15;35096:4;35093:1;35086:15;35113:180;35161:77;35158:1;35151:88;35258:4;35255:1;35248:15;35282:4;35279:1;35272:15;35299:102;;35391:2;35387:7;35382:2;35375:5;35371:14;35367:28;35357:38;;35347:54;;;:::o;35407:122::-;35480:24;35498:5;35480:24;:::i;:::-;35473:5;35470:35;35460:2;;35519:1;35516;35509:12;35460:2;35450:79;:::o;35535:116::-;35605:21;35620:5;35605:21;:::i;:::-;35598:5;35595:32;35585:2;;35641:1;35638;35631:12;35585:2;35575:76;:::o;35657:122::-;35730:24;35748:5;35730:24;:::i;:::-;35723:5;35720:35;35710:2;;35769:1;35766;35759:12;35710:2;35700:79;:::o;35785:120::-;35857:23;35874:5;35857:23;:::i;:::-;35850:5;35847:34;35837:2;;35895:1;35892;35885:12;35837:2;35827:78;:::o;35911:122::-;35984:24;36002:5;35984:24;:::i;:::-;35977:5;35974:35;35964:2;;36023:1;36020;36013:12;35964:2;35954:79;:::o

Swarm Source

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