ETH Price: $2,500.86 (-0.62%)

Token

Undead Doodles (UDD)
 

Overview

Max Total Supply

1,515 UDD

Holders

532

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 UDD
0xe0c72af26cfc8e7e3c08cdad6c62486fcee136e9
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:
UndeadDoodle

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 12 of 12: UndeadDoodle.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.2;

import './ERC721.sol';
import './ERC721Enumerable.sol';

contract UndeadDoodle is ERC721, ERC721Enumerable {
	uint256 constant FREE_SUPPLY = 1000;
	uint256 constant MAX_SUPPLY = 4000;

	address immutable owner;

	uint256 id = 0;

	constructor() ERC721('Undead Doodles', 'UDD') {
		owner = msg.sender;
	}

	function _baseURI() internal pure override returns (string memory) {
		return 'https://undeaddoodles.com/tokens/';
	}

	function mint(uint256 _amount) external payable {
		require(_amount > 0 && _amount < 20, 'Amount must be between 0 and 20 tokens.');
		require(id < MAX_SUPPLY, 'All tokens have been minted.');
		require(id < FREE_SUPPLY || msg.value > 0, 'All free tokens have been minted.');

		payable(owner).transfer(msg.value);

		for (uint256 i = 0; i < _amount; i++) {
			_safeMint(msg.sender, id);
			id++;
		}
	}

	// The following overrides required.

	function _beforeTokenTransfer(
		address from,
		address to,
		uint256 tokenId
	) internal override(ERC721, ERC721Enumerable) {
		super._beforeTokenTransfer(from, to, tokenId);
	}

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

File 1 of 12: Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 2 of 12: Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

File 3 of 12: ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

File 4 of 12: ERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./IERC721Metadata.sol";
import "./Address.sol";
import "./Context.sol";
import "./Strings.sol";
import "./ERC165.sol";

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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

File 5 of 12: ERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./IERC721Enumerable.sol";

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 6 of 12: IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

File 7 of 12: IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

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

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

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

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

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

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

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

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

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

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

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

File 8 of 12: IERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";

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

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

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

File 9 of 12: IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";

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

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

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

File 10 of 12: IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

File 11 of 12: Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a06040526000600a553480156200001657600080fd5b506040518060400160405280600e81526020017f556e6465616420446f6f646c65730000000000000000000000000000000000008152506040518060400160405280600381526020017f554444000000000000000000000000000000000000000000000000000000000081525081600090805190602001906200009b929190620000f4565b508060019080519060200190620000b4929190620000f4565b5050503373ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b8152505062000209565b8280546200010290620001a4565b90600052602060002090601f01602090048101928262000126576000855562000172565b82601f106200014157805160ff191683800117855562000172565b8280016001018555821562000172579182015b828111156200017157825182559160200191906001019062000154565b5b50905062000181919062000185565b5090565b5b80821115620001a057600081600090555060010162000186565b5090565b60006002820490506001821680620001bd57607f821691505b60208210811415620001d457620001d3620001da565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60805160601c6132ff620002286000396000610b1d01526132ff6000f3fe6080604052600436106100fe5760003560e01c80634f6ccce711610095578063a0712d6811610064578063a0712d681461036d578063a22cb46514610389578063b88d4fde146103b2578063c87b56dd146103db578063e985e9c514610418576100fe565b80634f6ccce71461028b5780636352211e146102c857806370a082311461030557806395d89b4114610342576100fe565b806318160ddd116100d157806318160ddd146101d157806323b872dd146101fc5780632f745c591461022557806342842e0e14610262576100fe565b806301ffc9a71461010357806306fdde0314610140578063081812fc1461016b578063095ea7b3146101a8575b600080fd5b34801561010f57600080fd5b5061012a600480360381019061012591906121ae565b610455565b6040516101379190612629565b60405180910390f35b34801561014c57600080fd5b50610155610467565b6040516101629190612644565b60405180910390f35b34801561017757600080fd5b50610192600480360381019061018d9190612208565b6104f9565b60405161019f91906125c2565b60405180910390f35b3480156101b457600080fd5b506101cf60048036038101906101ca919061216e565b61057e565b005b3480156101dd57600080fd5b506101e6610696565b6040516101f391906128c6565b60405180910390f35b34801561020857600080fd5b50610223600480360381019061021e9190612058565b6106a3565b005b34801561023157600080fd5b5061024c6004803603810190610247919061216e565b610703565b60405161025991906128c6565b60405180910390f35b34801561026e57600080fd5b5061028960048036038101906102849190612058565b6107a8565b005b34801561029757600080fd5b506102b260048036038101906102ad9190612208565b6107c8565b6040516102bf91906128c6565b60405180910390f35b3480156102d457600080fd5b506102ef60048036038101906102ea9190612208565b610839565b6040516102fc91906125c2565b60405180910390f35b34801561031157600080fd5b5061032c60048036038101906103279190611feb565b6108eb565b60405161033991906128c6565b60405180910390f35b34801561034e57600080fd5b506103576109a3565b6040516103649190612644565b60405180910390f35b61038760048036038101906103829190612208565b610a35565b005b34801561039557600080fd5b506103b060048036038101906103ab919061212e565b610bc8565b005b3480156103be57600080fd5b506103d960048036038101906103d491906120ab565b610bde565b005b3480156103e757600080fd5b5061040260048036038101906103fd9190612208565b610c40565b60405161040f9190612644565b60405180910390f35b34801561042457600080fd5b5061043f600480360381019061043a9190612018565b610ce7565b60405161044c9190612629565b60405180910390f35b600061046082610d7b565b9050919050565b60606000805461047690612aeb565b80601f01602080910402602001604051908101604052809291908181526020018280546104a290612aeb565b80156104ef5780601f106104c4576101008083540402835291602001916104ef565b820191906000526020600020905b8154815290600101906020018083116104d257829003601f168201915b5050505050905090565b600061050482610df5565b610543576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161053a90612806565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061058982610839565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156105fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105f190612866565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610619610e61565b73ffffffffffffffffffffffffffffffffffffffff161480610648575061064781610642610e61565b610ce7565b5b610687576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067e90612786565b60405180910390fd5b6106918383610e69565b505050565b6000600880549050905090565b6106b46106ae610e61565b82610f22565b6106f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106ea90612886565b60405180910390fd5b6106fe838383611000565b505050565b600061070e836108eb565b821061074f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074690612686565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6107c383838360405180602001604052806000815250610bde565b505050565b60006107d2610696565b8210610813576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080a906128a6565b60405180910390fd5b6008828154811061082757610826612c84565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156108e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d9906127c6565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561095c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610953906127a6565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600180546109b290612aeb565b80601f01602080910402602001604051908101604052809291908181526020018280546109de90612aeb565b8015610a2b5780601f10610a0057610100808354040283529160200191610a2b565b820191906000526020600020905b815481529060010190602001808311610a0e57829003601f168201915b5050505050905090565b600081118015610a455750601481105b610a84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7b90612706565b60405180910390fd5b610fa0600a5410610aca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac1906126e6565b60405180910390fd5b6103e8600a541080610adc5750600034115b610b1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1290612666565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015610b81573d6000803e3d6000fd5b5060005b81811015610bc457610b9933600a5461125c565b600a6000815480929190610bac90612b4e565b91905055508080610bbc90612b4e565b915050610b85565b5050565b610bda610bd3610e61565b838361127a565b5050565b610bef610be9610e61565b83610f22565b610c2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2590612886565b60405180910390fd5b610c3a848484846113e7565b50505050565b6060610c4b82610df5565b610c8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8190612846565b60405180910390fd5b6000610c94611443565b90506000815111610cb45760405180602001604052806000815250610cdf565b80610cbe84611463565b604051602001610ccf92919061259e565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610dee5750610ded826115c4565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610edc83610839565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000610f2d82610df5565b610f6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6390612766565b60405180910390fd5b6000610f7783610839565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610fe657508373ffffffffffffffffffffffffffffffffffffffff16610fce846104f9565b73ffffffffffffffffffffffffffffffffffffffff16145b80610ff75750610ff68185610ce7565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661102082610839565b73ffffffffffffffffffffffffffffffffffffffff1614611076576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106d90612826565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110dd90612726565b60405180910390fd5b6110f18383836116a6565b6110fc600082610e69565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461114c9190612a01565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111a3919061297a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6112768282604051806020016040528060008152506116b6565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156112e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e090612746565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113da9190612629565b60405180910390a3505050565b6113f2848484611000565b6113fe84848484611711565b61143d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611434906126a6565b60405180910390fd5b50505050565b60606040518060600160405280602181526020016132a960219139905090565b606060008214156114ab576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506115bf565b600082905060005b600082146114dd5780806114c690612b4e565b915050600a826114d691906129d0565b91506114b3565b60008167ffffffffffffffff8111156114f9576114f8612cb3565b5b6040519080825280601f01601f19166020018201604052801561152b5781602001600182028036833780820191505090505b5090505b600085146115b8576001826115449190612a01565b9150600a856115539190612b97565b603061155f919061297a565b60f81b81838151811061157557611574612c84565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856115b191906129d0565b945061152f565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061168f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061169f575061169e826118a8565b5b9050919050565b6116b1838383611912565b505050565b6116c08383611a26565b6116cd6000848484611711565b61170c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611703906126a6565b60405180910390fd5b505050565b60006117328473ffffffffffffffffffffffffffffffffffffffff16611bf4565b1561189b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261175b610e61565b8786866040518563ffffffff1660e01b815260040161177d94939291906125dd565b602060405180830381600087803b15801561179757600080fd5b505af19250505080156117c857506040513d601f19601f820116820180604052508101906117c591906121db565b60015b61184b573d80600081146117f8576040519150601f19603f3d011682016040523d82523d6000602084013e6117fd565b606091505b50600081511415611843576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183a906126a6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506118a0565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61191d838383611c07565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156119605761195b81611c0c565b61199f565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461199e5761199d8382611c55565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119e2576119dd81611dc2565b611a21565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611a2057611a1f8282611e93565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8d906127e6565b60405180910390fd5b611a9f81610df5565b15611adf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad6906126c6565b60405180910390fd5b611aeb600083836116a6565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b3b919061297a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001611c62846108eb565b611c6c9190612a01565b9050600060076000848152602001908152602001600020549050818114611d51576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050611dd69190612a01565b9050600060096000848152602001908152602001600020549050600060088381548110611e0657611e05612c84565b5b906000526020600020015490508060088381548110611e2857611e27612c84565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480611e7757611e76612c55565b5b6001900381819060005260206000200160009055905550505050565b6000611e9e836108eb565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6000611f25611f2084612906565b6128e1565b905082815260208101848484011115611f4157611f40612ce7565b5b611f4c848285612aa9565b509392505050565b600081359050611f638161324c565b92915050565b600081359050611f7881613263565b92915050565b600081359050611f8d8161327a565b92915050565b600081519050611fa28161327a565b92915050565b600082601f830112611fbd57611fbc612ce2565b5b8135611fcd848260208601611f12565b91505092915050565b600081359050611fe581613291565b92915050565b60006020828403121561200157612000612cf1565b5b600061200f84828501611f54565b91505092915050565b6000806040838503121561202f5761202e612cf1565b5b600061203d85828601611f54565b925050602061204e85828601611f54565b9150509250929050565b60008060006060848603121561207157612070612cf1565b5b600061207f86828701611f54565b935050602061209086828701611f54565b92505060406120a186828701611fd6565b9150509250925092565b600080600080608085870312156120c5576120c4612cf1565b5b60006120d387828801611f54565b94505060206120e487828801611f54565b93505060406120f587828801611fd6565b925050606085013567ffffffffffffffff81111561211657612115612cec565b5b61212287828801611fa8565b91505092959194509250565b6000806040838503121561214557612144612cf1565b5b600061215385828601611f54565b925050602061216485828601611f69565b9150509250929050565b6000806040838503121561218557612184612cf1565b5b600061219385828601611f54565b92505060206121a485828601611fd6565b9150509250929050565b6000602082840312156121c4576121c3612cf1565b5b60006121d284828501611f7e565b91505092915050565b6000602082840312156121f1576121f0612cf1565b5b60006121ff84828501611f93565b91505092915050565b60006020828403121561221e5761221d612cf1565b5b600061222c84828501611fd6565b91505092915050565b61223e81612a35565b82525050565b61224d81612a47565b82525050565b600061225e82612937565b612268818561294d565b9350612278818560208601612ab8565b61228181612cf6565b840191505092915050565b600061229782612942565b6122a1818561295e565b93506122b1818560208601612ab8565b6122ba81612cf6565b840191505092915050565b60006122d082612942565b6122da818561296f565b93506122ea818560208601612ab8565b80840191505092915050565b600061230360218361295e565b915061230e82612d07565b604082019050919050565b6000612326602b8361295e565b915061233182612d56565b604082019050919050565b600061234960328361295e565b915061235482612da5565b604082019050919050565b600061236c601c8361295e565b915061237782612df4565b602082019050919050565b600061238f601c8361295e565b915061239a82612e1d565b602082019050919050565b60006123b260278361295e565b91506123bd82612e46565b604082019050919050565b60006123d560248361295e565b91506123e082612e95565b604082019050919050565b60006123f860198361295e565b915061240382612ee4565b602082019050919050565b600061241b602c8361295e565b915061242682612f0d565b604082019050919050565b600061243e60388361295e565b915061244982612f5c565b604082019050919050565b6000612461602a8361295e565b915061246c82612fab565b604082019050919050565b600061248460298361295e565b915061248f82612ffa565b604082019050919050565b60006124a760208361295e565b91506124b282613049565b602082019050919050565b60006124ca602c8361295e565b91506124d582613072565b604082019050919050565b60006124ed60298361295e565b91506124f8826130c1565b604082019050919050565b6000612510602f8361295e565b915061251b82613110565b604082019050919050565b600061253360218361295e565b915061253e8261315f565b604082019050919050565b600061255660318361295e565b9150612561826131ae565b604082019050919050565b6000612579602c8361295e565b9150612584826131fd565b604082019050919050565b61259881612a9f565b82525050565b60006125aa82856122c5565b91506125b682846122c5565b91508190509392505050565b60006020820190506125d76000830184612235565b92915050565b60006080820190506125f26000830187612235565b6125ff6020830186612235565b61260c604083018561258f565b818103606083015261261e8184612253565b905095945050505050565b600060208201905061263e6000830184612244565b92915050565b6000602082019050818103600083015261265e818461228c565b905092915050565b6000602082019050818103600083015261267f816122f6565b9050919050565b6000602082019050818103600083015261269f81612319565b9050919050565b600060208201905081810360008301526126bf8161233c565b9050919050565b600060208201905081810360008301526126df8161235f565b9050919050565b600060208201905081810360008301526126ff81612382565b9050919050565b6000602082019050818103600083015261271f816123a5565b9050919050565b6000602082019050818103600083015261273f816123c8565b9050919050565b6000602082019050818103600083015261275f816123eb565b9050919050565b6000602082019050818103600083015261277f8161240e565b9050919050565b6000602082019050818103600083015261279f81612431565b9050919050565b600060208201905081810360008301526127bf81612454565b9050919050565b600060208201905081810360008301526127df81612477565b9050919050565b600060208201905081810360008301526127ff8161249a565b9050919050565b6000602082019050818103600083015261281f816124bd565b9050919050565b6000602082019050818103600083015261283f816124e0565b9050919050565b6000602082019050818103600083015261285f81612503565b9050919050565b6000602082019050818103600083015261287f81612526565b9050919050565b6000602082019050818103600083015261289f81612549565b9050919050565b600060208201905081810360008301526128bf8161256c565b9050919050565b60006020820190506128db600083018461258f565b92915050565b60006128eb6128fc565b90506128f78282612b1d565b919050565b6000604051905090565b600067ffffffffffffffff82111561292157612920612cb3565b5b61292a82612cf6565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061298582612a9f565b915061299083612a9f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156129c5576129c4612bc8565b5b828201905092915050565b60006129db82612a9f565b91506129e683612a9f565b9250826129f6576129f5612bf7565b5b828204905092915050565b6000612a0c82612a9f565b9150612a1783612a9f565b925082821015612a2a57612a29612bc8565b5b828203905092915050565b6000612a4082612a7f565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612ad6578082015181840152602081019050612abb565b83811115612ae5576000848401525b50505050565b60006002820490506001821680612b0357607f821691505b60208210811415612b1757612b16612c26565b5b50919050565b612b2682612cf6565b810181811067ffffffffffffffff82111715612b4557612b44612cb3565b5b80604052505050565b6000612b5982612a9f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612b8c57612b8b612bc8565b5b600182019050919050565b6000612ba282612a9f565b9150612bad83612a9f565b925082612bbd57612bbc612bf7565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f416c6c206672656520746f6b656e732068617665206265656e206d696e74656460008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f416c6c20746f6b656e732068617665206265656e206d696e7465642e00000000600082015250565b7f416d6f756e74206d757374206265206265747765656e203020616e642032302060008201527f746f6b656e732e00000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b61325581612a35565b811461326057600080fd5b50565b61326c81612a47565b811461327757600080fd5b50565b61328381612a53565b811461328e57600080fd5b50565b61329a81612a9f565b81146132a557600080fd5b5056fe68747470733a2f2f756e64656164646f6f646c65732e636f6d2f746f6b656e732fa2646970667358221220a90bb3fc6a9547a918225951d60e58ee0eabf38e9a5a139af5def9cf5706a11e64736f6c63430008070033

Deployed Bytecode

0x6080604052600436106100fe5760003560e01c80634f6ccce711610095578063a0712d6811610064578063a0712d681461036d578063a22cb46514610389578063b88d4fde146103b2578063c87b56dd146103db578063e985e9c514610418576100fe565b80634f6ccce71461028b5780636352211e146102c857806370a082311461030557806395d89b4114610342576100fe565b806318160ddd116100d157806318160ddd146101d157806323b872dd146101fc5780632f745c591461022557806342842e0e14610262576100fe565b806301ffc9a71461010357806306fdde0314610140578063081812fc1461016b578063095ea7b3146101a8575b600080fd5b34801561010f57600080fd5b5061012a600480360381019061012591906121ae565b610455565b6040516101379190612629565b60405180910390f35b34801561014c57600080fd5b50610155610467565b6040516101629190612644565b60405180910390f35b34801561017757600080fd5b50610192600480360381019061018d9190612208565b6104f9565b60405161019f91906125c2565b60405180910390f35b3480156101b457600080fd5b506101cf60048036038101906101ca919061216e565b61057e565b005b3480156101dd57600080fd5b506101e6610696565b6040516101f391906128c6565b60405180910390f35b34801561020857600080fd5b50610223600480360381019061021e9190612058565b6106a3565b005b34801561023157600080fd5b5061024c6004803603810190610247919061216e565b610703565b60405161025991906128c6565b60405180910390f35b34801561026e57600080fd5b5061028960048036038101906102849190612058565b6107a8565b005b34801561029757600080fd5b506102b260048036038101906102ad9190612208565b6107c8565b6040516102bf91906128c6565b60405180910390f35b3480156102d457600080fd5b506102ef60048036038101906102ea9190612208565b610839565b6040516102fc91906125c2565b60405180910390f35b34801561031157600080fd5b5061032c60048036038101906103279190611feb565b6108eb565b60405161033991906128c6565b60405180910390f35b34801561034e57600080fd5b506103576109a3565b6040516103649190612644565b60405180910390f35b61038760048036038101906103829190612208565b610a35565b005b34801561039557600080fd5b506103b060048036038101906103ab919061212e565b610bc8565b005b3480156103be57600080fd5b506103d960048036038101906103d491906120ab565b610bde565b005b3480156103e757600080fd5b5061040260048036038101906103fd9190612208565b610c40565b60405161040f9190612644565b60405180910390f35b34801561042457600080fd5b5061043f600480360381019061043a9190612018565b610ce7565b60405161044c9190612629565b60405180910390f35b600061046082610d7b565b9050919050565b60606000805461047690612aeb565b80601f01602080910402602001604051908101604052809291908181526020018280546104a290612aeb565b80156104ef5780601f106104c4576101008083540402835291602001916104ef565b820191906000526020600020905b8154815290600101906020018083116104d257829003601f168201915b5050505050905090565b600061050482610df5565b610543576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161053a90612806565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061058982610839565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156105fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105f190612866565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610619610e61565b73ffffffffffffffffffffffffffffffffffffffff161480610648575061064781610642610e61565b610ce7565b5b610687576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067e90612786565b60405180910390fd5b6106918383610e69565b505050565b6000600880549050905090565b6106b46106ae610e61565b82610f22565b6106f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106ea90612886565b60405180910390fd5b6106fe838383611000565b505050565b600061070e836108eb565b821061074f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074690612686565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6107c383838360405180602001604052806000815250610bde565b505050565b60006107d2610696565b8210610813576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080a906128a6565b60405180910390fd5b6008828154811061082757610826612c84565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156108e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d9906127c6565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561095c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610953906127a6565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600180546109b290612aeb565b80601f01602080910402602001604051908101604052809291908181526020018280546109de90612aeb565b8015610a2b5780601f10610a0057610100808354040283529160200191610a2b565b820191906000526020600020905b815481529060010190602001808311610a0e57829003601f168201915b5050505050905090565b600081118015610a455750601481105b610a84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7b90612706565b60405180910390fd5b610fa0600a5410610aca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac1906126e6565b60405180910390fd5b6103e8600a541080610adc5750600034115b610b1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1290612666565b60405180910390fd5b7f0000000000000000000000006de102dafe252dab158eebac2bd2819d562d692973ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015610b81573d6000803e3d6000fd5b5060005b81811015610bc457610b9933600a5461125c565b600a6000815480929190610bac90612b4e565b91905055508080610bbc90612b4e565b915050610b85565b5050565b610bda610bd3610e61565b838361127a565b5050565b610bef610be9610e61565b83610f22565b610c2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2590612886565b60405180910390fd5b610c3a848484846113e7565b50505050565b6060610c4b82610df5565b610c8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8190612846565b60405180910390fd5b6000610c94611443565b90506000815111610cb45760405180602001604052806000815250610cdf565b80610cbe84611463565b604051602001610ccf92919061259e565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610dee5750610ded826115c4565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610edc83610839565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000610f2d82610df5565b610f6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6390612766565b60405180910390fd5b6000610f7783610839565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610fe657508373ffffffffffffffffffffffffffffffffffffffff16610fce846104f9565b73ffffffffffffffffffffffffffffffffffffffff16145b80610ff75750610ff68185610ce7565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661102082610839565b73ffffffffffffffffffffffffffffffffffffffff1614611076576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106d90612826565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110dd90612726565b60405180910390fd5b6110f18383836116a6565b6110fc600082610e69565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461114c9190612a01565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111a3919061297a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6112768282604051806020016040528060008152506116b6565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156112e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e090612746565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113da9190612629565b60405180910390a3505050565b6113f2848484611000565b6113fe84848484611711565b61143d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611434906126a6565b60405180910390fd5b50505050565b60606040518060600160405280602181526020016132a960219139905090565b606060008214156114ab576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506115bf565b600082905060005b600082146114dd5780806114c690612b4e565b915050600a826114d691906129d0565b91506114b3565b60008167ffffffffffffffff8111156114f9576114f8612cb3565b5b6040519080825280601f01601f19166020018201604052801561152b5781602001600182028036833780820191505090505b5090505b600085146115b8576001826115449190612a01565b9150600a856115539190612b97565b603061155f919061297a565b60f81b81838151811061157557611574612c84565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856115b191906129d0565b945061152f565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061168f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061169f575061169e826118a8565b5b9050919050565b6116b1838383611912565b505050565b6116c08383611a26565b6116cd6000848484611711565b61170c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611703906126a6565b60405180910390fd5b505050565b60006117328473ffffffffffffffffffffffffffffffffffffffff16611bf4565b1561189b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261175b610e61565b8786866040518563ffffffff1660e01b815260040161177d94939291906125dd565b602060405180830381600087803b15801561179757600080fd5b505af19250505080156117c857506040513d601f19601f820116820180604052508101906117c591906121db565b60015b61184b573d80600081146117f8576040519150601f19603f3d011682016040523d82523d6000602084013e6117fd565b606091505b50600081511415611843576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183a906126a6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506118a0565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61191d838383611c07565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156119605761195b81611c0c565b61199f565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461199e5761199d8382611c55565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119e2576119dd81611dc2565b611a21565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611a2057611a1f8282611e93565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8d906127e6565b60405180910390fd5b611a9f81610df5565b15611adf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad6906126c6565b60405180910390fd5b611aeb600083836116a6565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b3b919061297a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001611c62846108eb565b611c6c9190612a01565b9050600060076000848152602001908152602001600020549050818114611d51576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050611dd69190612a01565b9050600060096000848152602001908152602001600020549050600060088381548110611e0657611e05612c84565b5b906000526020600020015490508060088381548110611e2857611e27612c84565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480611e7757611e76612c55565b5b6001900381819060005260206000200160009055905550505050565b6000611e9e836108eb565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6000611f25611f2084612906565b6128e1565b905082815260208101848484011115611f4157611f40612ce7565b5b611f4c848285612aa9565b509392505050565b600081359050611f638161324c565b92915050565b600081359050611f7881613263565b92915050565b600081359050611f8d8161327a565b92915050565b600081519050611fa28161327a565b92915050565b600082601f830112611fbd57611fbc612ce2565b5b8135611fcd848260208601611f12565b91505092915050565b600081359050611fe581613291565b92915050565b60006020828403121561200157612000612cf1565b5b600061200f84828501611f54565b91505092915050565b6000806040838503121561202f5761202e612cf1565b5b600061203d85828601611f54565b925050602061204e85828601611f54565b9150509250929050565b60008060006060848603121561207157612070612cf1565b5b600061207f86828701611f54565b935050602061209086828701611f54565b92505060406120a186828701611fd6565b9150509250925092565b600080600080608085870312156120c5576120c4612cf1565b5b60006120d387828801611f54565b94505060206120e487828801611f54565b93505060406120f587828801611fd6565b925050606085013567ffffffffffffffff81111561211657612115612cec565b5b61212287828801611fa8565b91505092959194509250565b6000806040838503121561214557612144612cf1565b5b600061215385828601611f54565b925050602061216485828601611f69565b9150509250929050565b6000806040838503121561218557612184612cf1565b5b600061219385828601611f54565b92505060206121a485828601611fd6565b9150509250929050565b6000602082840312156121c4576121c3612cf1565b5b60006121d284828501611f7e565b91505092915050565b6000602082840312156121f1576121f0612cf1565b5b60006121ff84828501611f93565b91505092915050565b60006020828403121561221e5761221d612cf1565b5b600061222c84828501611fd6565b91505092915050565b61223e81612a35565b82525050565b61224d81612a47565b82525050565b600061225e82612937565b612268818561294d565b9350612278818560208601612ab8565b61228181612cf6565b840191505092915050565b600061229782612942565b6122a1818561295e565b93506122b1818560208601612ab8565b6122ba81612cf6565b840191505092915050565b60006122d082612942565b6122da818561296f565b93506122ea818560208601612ab8565b80840191505092915050565b600061230360218361295e565b915061230e82612d07565b604082019050919050565b6000612326602b8361295e565b915061233182612d56565b604082019050919050565b600061234960328361295e565b915061235482612da5565b604082019050919050565b600061236c601c8361295e565b915061237782612df4565b602082019050919050565b600061238f601c8361295e565b915061239a82612e1d565b602082019050919050565b60006123b260278361295e565b91506123bd82612e46565b604082019050919050565b60006123d560248361295e565b91506123e082612e95565b604082019050919050565b60006123f860198361295e565b915061240382612ee4565b602082019050919050565b600061241b602c8361295e565b915061242682612f0d565b604082019050919050565b600061243e60388361295e565b915061244982612f5c565b604082019050919050565b6000612461602a8361295e565b915061246c82612fab565b604082019050919050565b600061248460298361295e565b915061248f82612ffa565b604082019050919050565b60006124a760208361295e565b91506124b282613049565b602082019050919050565b60006124ca602c8361295e565b91506124d582613072565b604082019050919050565b60006124ed60298361295e565b91506124f8826130c1565b604082019050919050565b6000612510602f8361295e565b915061251b82613110565b604082019050919050565b600061253360218361295e565b915061253e8261315f565b604082019050919050565b600061255660318361295e565b9150612561826131ae565b604082019050919050565b6000612579602c8361295e565b9150612584826131fd565b604082019050919050565b61259881612a9f565b82525050565b60006125aa82856122c5565b91506125b682846122c5565b91508190509392505050565b60006020820190506125d76000830184612235565b92915050565b60006080820190506125f26000830187612235565b6125ff6020830186612235565b61260c604083018561258f565b818103606083015261261e8184612253565b905095945050505050565b600060208201905061263e6000830184612244565b92915050565b6000602082019050818103600083015261265e818461228c565b905092915050565b6000602082019050818103600083015261267f816122f6565b9050919050565b6000602082019050818103600083015261269f81612319565b9050919050565b600060208201905081810360008301526126bf8161233c565b9050919050565b600060208201905081810360008301526126df8161235f565b9050919050565b600060208201905081810360008301526126ff81612382565b9050919050565b6000602082019050818103600083015261271f816123a5565b9050919050565b6000602082019050818103600083015261273f816123c8565b9050919050565b6000602082019050818103600083015261275f816123eb565b9050919050565b6000602082019050818103600083015261277f8161240e565b9050919050565b6000602082019050818103600083015261279f81612431565b9050919050565b600060208201905081810360008301526127bf81612454565b9050919050565b600060208201905081810360008301526127df81612477565b9050919050565b600060208201905081810360008301526127ff8161249a565b9050919050565b6000602082019050818103600083015261281f816124bd565b9050919050565b6000602082019050818103600083015261283f816124e0565b9050919050565b6000602082019050818103600083015261285f81612503565b9050919050565b6000602082019050818103600083015261287f81612526565b9050919050565b6000602082019050818103600083015261289f81612549565b9050919050565b600060208201905081810360008301526128bf8161256c565b9050919050565b60006020820190506128db600083018461258f565b92915050565b60006128eb6128fc565b90506128f78282612b1d565b919050565b6000604051905090565b600067ffffffffffffffff82111561292157612920612cb3565b5b61292a82612cf6565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061298582612a9f565b915061299083612a9f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156129c5576129c4612bc8565b5b828201905092915050565b60006129db82612a9f565b91506129e683612a9f565b9250826129f6576129f5612bf7565b5b828204905092915050565b6000612a0c82612a9f565b9150612a1783612a9f565b925082821015612a2a57612a29612bc8565b5b828203905092915050565b6000612a4082612a7f565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612ad6578082015181840152602081019050612abb565b83811115612ae5576000848401525b50505050565b60006002820490506001821680612b0357607f821691505b60208210811415612b1757612b16612c26565b5b50919050565b612b2682612cf6565b810181811067ffffffffffffffff82111715612b4557612b44612cb3565b5b80604052505050565b6000612b5982612a9f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612b8c57612b8b612bc8565b5b600182019050919050565b6000612ba282612a9f565b9150612bad83612a9f565b925082612bbd57612bbc612bf7565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f416c6c206672656520746f6b656e732068617665206265656e206d696e74656460008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f416c6c20746f6b656e732068617665206265656e206d696e7465642e00000000600082015250565b7f416d6f756e74206d757374206265206265747765656e203020616e642032302060008201527f746f6b656e732e00000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b61325581612a35565b811461326057600080fd5b50565b61326c81612a47565b811461327757600080fd5b50565b61328381612a53565b811461328e57600080fd5b50565b61329a81612a9f565b81146132a557600080fd5b5056fe68747470733a2f2f756e64656164646f6f646c65732e636f6d2f746f6b656e732fa2646970667358221220a90bb3fc6a9547a918225951d60e58ee0eabf38e9a5a139af5def9cf5706a11e64736f6c63430008070033

Deployed Bytecode Sourcemap

114:1167:11:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1110:169;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2408:98:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3919:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3457:401;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1614:111:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4646:330:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1290:253:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5042:179:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1797:230:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2111:235:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1849:205;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2570:102;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;483:403:11;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4203:153:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5287:320;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2738:329;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4422:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1110:169:11;1221:4;1239:36;1263:11;1239:23;:36::i;:::-;1232:43;;1110:169;;;:::o;2408:98:3:-;2462:13;2494:5;2487:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2408:98;:::o;3919:217::-;3995:7;4022:16;4030:7;4022;:16::i;:::-;4014:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4105:15;:24;4121:7;4105:24;;;;;;;;;;;;;;;;;;;;;4098:31;;3919:217;;;:::o;3457:401::-;3537:13;3553:23;3568:7;3553:14;:23::i;:::-;3537:39;;3600:5;3594:11;;:2;:11;;;;3586:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3691:5;3675:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3700:37;3717:5;3724:12;:10;:12::i;:::-;3700:16;:37::i;:::-;3675:62;3654:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;3830:21;3839:2;3843:7;3830:8;:21::i;:::-;3527:331;3457:401;;:::o;1614:111:4:-;1675:7;1701:10;:17;;;;1694:24;;1614:111;:::o;4646:330:3:-;4835:41;4854:12;:10;:12::i;:::-;4868:7;4835:18;:41::i;:::-;4827:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;4941:28;4951:4;4957:2;4961:7;4941:9;:28::i;:::-;4646:330;;;:::o;1290:253:4:-;1387:7;1422:23;1439:5;1422:16;:23::i;:::-;1414:5;:31;1406:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;1510:12;:19;1523:5;1510:19;;;;;;;;;;;;;;;:26;1530:5;1510:26;;;;;;;;;;;;1503:33;;1290:253;;;;:::o;5042:179:3:-;5175:39;5192:4;5198:2;5202:7;5175:39;;;;;;;;;;;;:16;:39::i;:::-;5042:179;;;:::o;1797:230:4:-;1872:7;1907:30;:28;:30::i;:::-;1899:5;:38;1891:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;2003:10;2014:5;2003:17;;;;;;;;:::i;:::-;;;;;;;;;;1996:24;;1797:230;;;:::o;2111:235:3:-;2183:7;2202:13;2218:7;:16;2226:7;2218:16;;;;;;;;;;;;;;;;;;;;;2202:32;;2269:1;2252:19;;:5;:19;;;;2244:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2334:5;2327:12;;;2111:235;;;:::o;1849:205::-;1921:7;1965:1;1948:19;;:5;:19;;;;1940:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;2031:9;:16;2041:5;2031:16;;;;;;;;;;;;;;;;2024:23;;1849:205;;;:::o;2570:102::-;2626:13;2658:7;2651:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2570:102;:::o;483:403:11:-;553:1;543:7;:11;:27;;;;;568:2;558:7;:12;543:27;535:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;235:4;626:2;;:15;618:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;198:4;686:2;;:16;:33;;;;718:1;706:9;:13;686:33;678:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;770:5;762:23;;:34;786:9;762:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;806:9;801:82;825:7;821:1;:11;801:82;;;844:25;854:10;866:2;;844:9;:25::i;:::-;874:2;;:4;;;;;;;;;:::i;:::-;;;;;;834:3;;;;;:::i;:::-;;;;801:82;;;;483:403;:::o;4203:153:3:-;4297:52;4316:12;:10;:12::i;:::-;4330:8;4340;4297:18;:52::i;:::-;4203:153;;:::o;5287:320::-;5456:41;5475:12;:10;:12::i;:::-;5489:7;5456:18;:41::i;:::-;5448:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5561:39;5575:4;5581:2;5585:7;5594:5;5561:13;:39::i;:::-;5287:320;;;;:::o;2738:329::-;2811:13;2844:16;2852:7;2844;:16::i;:::-;2836:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;2923:21;2947:10;:8;:10::i;:::-;2923:34;;2998:1;2980:7;2974:21;:25;:86;;;;;;;;;;;;;;;;;3026:7;3035:18;:7;:16;:18::i;:::-;3009:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2974:86;2967:93;;;2738:329;;;:::o;4422:162::-;4519:4;4542:18;:25;4561:5;4542:25;;;;;;;;;;;;;;;:35;4568:8;4542:35;;;;;;;;;;;;;;;;;;;;;;;;;4535:42;;4422:162;;;;:::o;989:222:4:-;1091:4;1129:35;1114:50;;;:11;:50;;;;:90;;;;1168:36;1192:11;1168:23;:36::i;:::-;1114:90;1107:97;;989:222;;;:::o;7079:125:3:-;7144:4;7195:1;7167:30;;:7;:16;7175:7;7167:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7160:37;;7079:125;;;:::o;640:96:1:-;693:7;719:10;712:17;;640:96;:::o;10930:171:3:-;11031:2;11004:15;:24;11020:7;11004:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11086:7;11082:2;11048:46;;11057:23;11072:7;11057:14;:23::i;:::-;11048:46;;;;;;;;;;;;10930:171;;:::o;7362:344::-;7455:4;7479:16;7487:7;7479;:16::i;:::-;7471:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7554:13;7570:23;7585:7;7570:14;:23::i;:::-;7554:39;;7622:5;7611:16;;:7;:16;;;:51;;;;7655:7;7631:31;;:20;7643:7;7631:11;:20::i;:::-;:31;;;7611:51;:87;;;;7666:32;7683:5;7690:7;7666:16;:32::i;:::-;7611:87;7603:96;;;7362:344;;;;:::o;10259:560::-;10413:4;10386:31;;:23;10401:7;10386:14;:23::i;:::-;:31;;;10378:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;10495:1;10481:16;;:2;:16;;;;10473:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10549:39;10570:4;10576:2;10580:7;10549:20;:39::i;:::-;10650:29;10667:1;10671:7;10650:8;:29::i;:::-;10709:1;10690:9;:15;10700:4;10690:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;10737:1;10720:9;:13;10730:2;10720:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;10767:2;10748:7;:16;10756:7;10748:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;10804:7;10800:2;10785:27;;10794:4;10785:27;;;;;;;;;;;;10259:560;;;:::o;8036:108::-;8111:26;8121:2;8125:7;8111:26;;;;;;;;;;;;:9;:26::i;:::-;8036:108;;:::o;11236:307::-;11386:8;11377:17;;:5;:17;;;;11369:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;11472:8;11434:18;:25;11453:5;11434:25;;;;;;;;;;;;;;;:35;11460:8;11434:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;11517:8;11495:41;;11510:5;11495:41;;;11527:8;11495:41;;;;;;:::i;:::-;;;;;;;;11236:307;;;:::o;6469:::-;6620:28;6630:4;6636:2;6640:7;6620:9;:28::i;:::-;6666:48;6689:4;6695:2;6699:7;6708:5;6666:22;:48::i;:::-;6658:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6469:307;;;;:::o;363:117:11:-;415:13;434:42;;;;;;;;;;;;;;;;;;;363:117;:::o;328:703:10:-;384:13;610:1;601:5;:10;597:51;;;627:10;;;;;;;;;;;;;;;;;;;;;597:51;657:12;672:5;657:20;;687:14;711:75;726:1;718:4;:9;711:75;;743:8;;;;;:::i;:::-;;;;773:2;765:10;;;;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;795:39;;844:150;860:1;851:5;:10;844:150;;887:1;877:11;;;;;:::i;:::-;;;953:2;945:5;:10;;;;:::i;:::-;932:2;:24;;;;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;981:2;972:11;;;;;:::i;:::-;;;844:150;;;1017:6;1003:21;;;;;328:703;;;;:::o;1490:300:3:-;1592:4;1642:25;1627:40;;;:11;:40;;;;:104;;;;1698:33;1683:48;;;:11;:48;;;;1627:104;:156;;;;1747:36;1771:11;1747:23;:36::i;:::-;1627:156;1608:175;;1490:300;;;:::o;928:179:11:-;1058:45;1085:4;1091:2;1095:7;1058:26;:45::i;:::-;928:179;;;:::o;8365:311:3:-;8490:18;8496:2;8500:7;8490:5;:18::i;:::-;8539:54;8570:1;8574:2;8578:7;8587:5;8539:22;:54::i;:::-;8518:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;8365:311;;;:::o;12096:778::-;12246:4;12266:15;:2;:13;;;:15::i;:::-;12262:606;;;12317:2;12301:36;;;12338:12;:10;:12::i;:::-;12352:4;12358:7;12367:5;12301:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;12297:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12557:1;12540:6;:13;:18;12536:266;;;12582:60;;;;;;;;;;:::i;:::-;;;;;;;;12536:266;12754:6;12748:13;12739:6;12735:2;12731:15;12724:38;12297:519;12433:41;;;12423:51;;;:6;:51;;;;12416:58;;;;;12262:606;12853:4;12846:11;;12096:778;;;;;;;:::o;829:155:2:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;2623:572:4:-;2762:45;2789:4;2795:2;2799:7;2762:26;:45::i;:::-;2838:1;2822:18;;:4;:18;;;2818:183;;;2856:40;2888:7;2856:31;:40::i;:::-;2818:183;;;2925:2;2917:10;;:4;:10;;;2913:88;;2943:47;2976:4;2982:7;2943:32;:47::i;:::-;2913:88;2818:183;3028:1;3014:16;;:2;:16;;;3010:179;;;3046:45;3083:7;3046:36;:45::i;:::-;3010:179;;;3118:4;3112:10;;:2;:10;;;3108:81;;3138:40;3166:2;3170:7;3138:27;:40::i;:::-;3108:81;3010:179;2623:572;;;:::o;8998:372:3:-;9091:1;9077:16;;:2;:16;;;;9069:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9149:16;9157:7;9149;:16::i;:::-;9148:17;9140:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9209:45;9238:1;9242:2;9246:7;9209:20;:45::i;:::-;9282:1;9265:9;:13;9275:2;9265:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9312:2;9293:7;:16;9301:7;9293:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9355:7;9351:2;9330:33;;9347:1;9330:33;;;;;;;;;;;;8998:372;;:::o;771:377:0:-;831:4;1034:12;1099:7;1087:20;1079:28;;1140:1;1133:4;:8;1126:15;;;771:377;;;:::o;13430:122:3:-;;;;:::o;3901:161:4:-;4004:10;:17;;;;3977:15;:24;3993:7;3977:24;;;;;;;;;;;:44;;;;4031:10;4047:7;4031:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3901:161;:::o;4679:970::-;4941:22;4991:1;4966:22;4983:4;4966:16;:22::i;:::-;:26;;;;:::i;:::-;4941:51;;5002:18;5023:17;:26;5041:7;5023:26;;;;;;;;;;;;5002:47;;5167:14;5153:10;:28;5149:323;;5197:19;5219:12;:18;5232:4;5219:18;;;;;;;;;;;;;;;:34;5238:14;5219:34;;;;;;;;;;;;5197:56;;5301:11;5268:12;:18;5281:4;5268:18;;;;;;;;;;;;;;;:30;5287:10;5268:30;;;;;;;;;;;:44;;;;5417:10;5384:17;:30;5402:11;5384:30;;;;;;;;;;;:43;;;;5183:289;5149:323;5565:17;:26;5583:7;5565:26;;;;;;;;;;;5558:33;;;5608:12;:18;5621:4;5608:18;;;;;;;;;;;;;;;:34;5627:14;5608:34;;;;;;;;;;;5601:41;;;4760:889;;4679:970;;:::o;5937:1061::-;6186:22;6231:1;6211:10;:17;;;;:21;;;;:::i;:::-;6186:46;;6242:18;6263:15;:24;6279:7;6263:24;;;;;;;;;;;;6242:45;;6609:19;6631:10;6642:14;6631:26;;;;;;;;:::i;:::-;;;;;;;;;;6609:48;;6693:11;6668:10;6679;6668:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;6803:10;6772:15;:28;6788:11;6772:28;;;;;;;;;;;:41;;;;6941:15;:24;6957:7;6941:24;;;;;;;;;;;6934:31;;;6975:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;6008:990;;;5937:1061;:::o;3489:217::-;3573:14;3590:20;3607:2;3590:16;:20::i;:::-;3573:37;;3647:7;3620:12;:16;3633:2;3620:16;;;;;;;;;;;;;;;:24;3637:6;3620:24;;;;;;;;;;;:34;;;;3693:6;3664:17;:26;3682:7;3664:26;;;;;;;;;;;:35;;;;3563:143;3489:217;;:::o;7:410:12:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;568:133::-;611:5;649:6;636:20;627:29;;665:30;689:5;665:30;:::i;:::-;568:133;;;;:::o;707:137::-;752:5;790:6;777:20;768:29;;806:32;832:5;806:32;:::i;:::-;707:137;;;;:::o;850:141::-;906:5;937:6;931:13;922:22;;953:32;979:5;953:32;:::i;:::-;850:141;;;;:::o;1010:338::-;1065:5;1114:3;1107:4;1099:6;1095:17;1091:27;1081:122;;1122:79;;:::i;:::-;1081:122;1239:6;1226:20;1264:78;1338:3;1330:6;1323:4;1315:6;1311:17;1264:78;:::i;:::-;1255:87;;1071:277;1010:338;;;;:::o;1354:139::-;1400:5;1438:6;1425:20;1416:29;;1454:33;1481:5;1454:33;:::i;:::-;1354:139;;;;:::o;1499:329::-;1558:6;1607:2;1595:9;1586:7;1582:23;1578:32;1575:119;;;1613:79;;:::i;:::-;1575:119;1733:1;1758:53;1803:7;1794:6;1783:9;1779:22;1758:53;:::i;:::-;1748:63;;1704:117;1499:329;;;;:::o;1834:474::-;1902:6;1910;1959:2;1947:9;1938:7;1934:23;1930:32;1927:119;;;1965:79;;:::i;:::-;1927:119;2085:1;2110:53;2155:7;2146:6;2135:9;2131:22;2110:53;:::i;:::-;2100:63;;2056:117;2212:2;2238:53;2283:7;2274:6;2263:9;2259:22;2238:53;:::i;:::-;2228:63;;2183:118;1834:474;;;;;:::o;2314:619::-;2391:6;2399;2407;2456:2;2444:9;2435:7;2431:23;2427:32;2424:119;;;2462:79;;:::i;:::-;2424:119;2582:1;2607:53;2652:7;2643:6;2632:9;2628:22;2607:53;:::i;:::-;2597:63;;2553:117;2709:2;2735:53;2780:7;2771:6;2760:9;2756:22;2735:53;:::i;:::-;2725:63;;2680:118;2837:2;2863:53;2908:7;2899:6;2888:9;2884:22;2863:53;:::i;:::-;2853:63;;2808:118;2314:619;;;;;:::o;2939:943::-;3034:6;3042;3050;3058;3107:3;3095:9;3086:7;3082:23;3078:33;3075:120;;;3114:79;;:::i;:::-;3075:120;3234:1;3259:53;3304:7;3295:6;3284:9;3280:22;3259:53;:::i;:::-;3249:63;;3205:117;3361:2;3387:53;3432:7;3423:6;3412:9;3408:22;3387:53;:::i;:::-;3377:63;;3332:118;3489:2;3515:53;3560:7;3551:6;3540:9;3536:22;3515:53;:::i;:::-;3505:63;;3460:118;3645:2;3634:9;3630:18;3617:32;3676:18;3668:6;3665:30;3662:117;;;3698:79;;:::i;:::-;3662:117;3803:62;3857:7;3848:6;3837:9;3833:22;3803:62;:::i;:::-;3793:72;;3588:287;2939:943;;;;;;;:::o;3888:468::-;3953:6;3961;4010:2;3998:9;3989:7;3985:23;3981:32;3978:119;;;4016:79;;:::i;:::-;3978:119;4136:1;4161:53;4206:7;4197:6;4186:9;4182:22;4161:53;:::i;:::-;4151:63;;4107:117;4263:2;4289:50;4331:7;4322:6;4311:9;4307:22;4289:50;:::i;:::-;4279:60;;4234:115;3888:468;;;;;:::o;4362:474::-;4430:6;4438;4487:2;4475:9;4466:7;4462:23;4458:32;4455:119;;;4493:79;;:::i;:::-;4455:119;4613:1;4638:53;4683:7;4674:6;4663:9;4659:22;4638:53;:::i;:::-;4628:63;;4584:117;4740:2;4766:53;4811:7;4802:6;4791:9;4787:22;4766:53;:::i;:::-;4756:63;;4711:118;4362:474;;;;;:::o;4842:327::-;4900:6;4949:2;4937:9;4928:7;4924:23;4920:32;4917:119;;;4955:79;;:::i;:::-;4917:119;5075:1;5100:52;5144:7;5135:6;5124:9;5120:22;5100:52;:::i;:::-;5090:62;;5046:116;4842:327;;;;:::o;5175:349::-;5244:6;5293:2;5281:9;5272:7;5268:23;5264:32;5261:119;;;5299:79;;:::i;:::-;5261:119;5419:1;5444:63;5499:7;5490:6;5479:9;5475:22;5444:63;:::i;:::-;5434:73;;5390:127;5175:349;;;;:::o;5530:329::-;5589:6;5638:2;5626:9;5617:7;5613:23;5609:32;5606:119;;;5644:79;;:::i;:::-;5606:119;5764:1;5789:53;5834:7;5825:6;5814:9;5810:22;5789:53;:::i;:::-;5779:63;;5735:117;5530:329;;;;:::o;5865:118::-;5952:24;5970:5;5952:24;:::i;:::-;5947:3;5940:37;5865:118;;:::o;5989:109::-;6070:21;6085:5;6070:21;:::i;:::-;6065:3;6058:34;5989:109;;:::o;6104:360::-;6190:3;6218:38;6250:5;6218:38;:::i;:::-;6272:70;6335:6;6330:3;6272:70;:::i;:::-;6265:77;;6351:52;6396:6;6391:3;6384:4;6377:5;6373:16;6351:52;:::i;:::-;6428:29;6450:6;6428:29;:::i;:::-;6423:3;6419:39;6412:46;;6194:270;6104:360;;;;:::o;6470:364::-;6558:3;6586:39;6619:5;6586:39;:::i;:::-;6641:71;6705:6;6700:3;6641:71;:::i;:::-;6634:78;;6721:52;6766:6;6761:3;6754:4;6747:5;6743:16;6721:52;:::i;:::-;6798:29;6820:6;6798:29;:::i;:::-;6793:3;6789:39;6782:46;;6562:272;6470:364;;;;:::o;6840:377::-;6946:3;6974:39;7007:5;6974:39;:::i;:::-;7029:89;7111:6;7106:3;7029:89;:::i;:::-;7022:96;;7127:52;7172:6;7167:3;7160:4;7153:5;7149:16;7127:52;:::i;:::-;7204:6;7199:3;7195:16;7188:23;;6950:267;6840:377;;;;:::o;7223:366::-;7365:3;7386:67;7450:2;7445:3;7386:67;:::i;:::-;7379:74;;7462:93;7551:3;7462:93;:::i;:::-;7580:2;7575:3;7571:12;7564:19;;7223:366;;;:::o;7595:::-;7737:3;7758:67;7822:2;7817:3;7758:67;:::i;:::-;7751:74;;7834:93;7923:3;7834:93;:::i;:::-;7952:2;7947:3;7943:12;7936:19;;7595:366;;;:::o;7967:::-;8109:3;8130:67;8194:2;8189:3;8130:67;:::i;:::-;8123:74;;8206:93;8295:3;8206:93;:::i;:::-;8324:2;8319:3;8315:12;8308:19;;7967:366;;;:::o;8339:::-;8481:3;8502:67;8566:2;8561:3;8502:67;:::i;:::-;8495:74;;8578:93;8667:3;8578:93;:::i;:::-;8696:2;8691:3;8687:12;8680:19;;8339:366;;;:::o;8711:::-;8853:3;8874:67;8938:2;8933:3;8874:67;:::i;:::-;8867:74;;8950:93;9039:3;8950:93;:::i;:::-;9068:2;9063:3;9059:12;9052:19;;8711:366;;;:::o;9083:::-;9225:3;9246:67;9310:2;9305:3;9246:67;:::i;:::-;9239:74;;9322:93;9411:3;9322:93;:::i;:::-;9440:2;9435:3;9431:12;9424:19;;9083:366;;;:::o;9455:::-;9597:3;9618:67;9682:2;9677:3;9618:67;:::i;:::-;9611:74;;9694:93;9783:3;9694:93;:::i;:::-;9812:2;9807:3;9803:12;9796:19;;9455:366;;;:::o;9827:::-;9969:3;9990:67;10054:2;10049:3;9990:67;:::i;:::-;9983:74;;10066:93;10155:3;10066:93;:::i;:::-;10184:2;10179:3;10175:12;10168:19;;9827:366;;;:::o;10199:::-;10341:3;10362:67;10426:2;10421:3;10362:67;:::i;:::-;10355:74;;10438:93;10527:3;10438:93;:::i;:::-;10556:2;10551:3;10547:12;10540:19;;10199:366;;;:::o;10571:::-;10713:3;10734:67;10798:2;10793:3;10734:67;:::i;:::-;10727:74;;10810:93;10899:3;10810:93;:::i;:::-;10928:2;10923:3;10919:12;10912:19;;10571:366;;;:::o;10943:::-;11085:3;11106:67;11170:2;11165:3;11106:67;:::i;:::-;11099:74;;11182:93;11271:3;11182:93;:::i;:::-;11300:2;11295:3;11291:12;11284:19;;10943:366;;;:::o;11315:::-;11457:3;11478:67;11542:2;11537:3;11478:67;:::i;:::-;11471:74;;11554:93;11643:3;11554:93;:::i;:::-;11672:2;11667:3;11663:12;11656:19;;11315:366;;;:::o;11687:::-;11829:3;11850:67;11914:2;11909:3;11850:67;:::i;:::-;11843:74;;11926:93;12015:3;11926:93;:::i;:::-;12044:2;12039:3;12035:12;12028:19;;11687:366;;;:::o;12059:::-;12201:3;12222:67;12286:2;12281:3;12222:67;:::i;:::-;12215:74;;12298:93;12387:3;12298:93;:::i;:::-;12416:2;12411:3;12407:12;12400:19;;12059:366;;;:::o;12431:::-;12573:3;12594:67;12658:2;12653:3;12594:67;:::i;:::-;12587:74;;12670:93;12759:3;12670:93;:::i;:::-;12788:2;12783:3;12779:12;12772:19;;12431:366;;;:::o;12803:::-;12945:3;12966:67;13030:2;13025:3;12966:67;:::i;:::-;12959:74;;13042:93;13131:3;13042:93;:::i;:::-;13160:2;13155:3;13151:12;13144:19;;12803:366;;;:::o;13175:::-;13317:3;13338:67;13402:2;13397:3;13338:67;:::i;:::-;13331:74;;13414:93;13503:3;13414:93;:::i;:::-;13532:2;13527:3;13523:12;13516:19;;13175:366;;;:::o;13547:::-;13689:3;13710:67;13774:2;13769:3;13710:67;:::i;:::-;13703:74;;13786:93;13875:3;13786:93;:::i;:::-;13904:2;13899:3;13895:12;13888:19;;13547:366;;;:::o;13919:::-;14061:3;14082:67;14146:2;14141:3;14082:67;:::i;:::-;14075:74;;14158:93;14247:3;14158:93;:::i;:::-;14276:2;14271:3;14267:12;14260:19;;13919:366;;;:::o;14291:118::-;14378:24;14396:5;14378:24;:::i;:::-;14373:3;14366:37;14291:118;;:::o;14415:435::-;14595:3;14617:95;14708:3;14699:6;14617:95;:::i;:::-;14610:102;;14729:95;14820:3;14811:6;14729:95;:::i;:::-;14722:102;;14841:3;14834:10;;14415:435;;;;;:::o;14856:222::-;14949:4;14987:2;14976:9;14972:18;14964:26;;15000:71;15068:1;15057:9;15053:17;15044:6;15000:71;:::i;:::-;14856:222;;;;:::o;15084:640::-;15279:4;15317:3;15306:9;15302:19;15294:27;;15331:71;15399:1;15388:9;15384:17;15375:6;15331:71;:::i;:::-;15412:72;15480:2;15469:9;15465:18;15456:6;15412:72;:::i;:::-;15494;15562:2;15551:9;15547:18;15538:6;15494:72;:::i;:::-;15613:9;15607:4;15603:20;15598:2;15587:9;15583:18;15576:48;15641:76;15712:4;15703:6;15641:76;:::i;:::-;15633:84;;15084:640;;;;;;;:::o;15730:210::-;15817:4;15855:2;15844:9;15840:18;15832:26;;15868:65;15930:1;15919:9;15915:17;15906:6;15868:65;:::i;:::-;15730:210;;;;:::o;15946:313::-;16059:4;16097:2;16086:9;16082:18;16074:26;;16146:9;16140:4;16136:20;16132:1;16121:9;16117:17;16110:47;16174:78;16247:4;16238:6;16174:78;:::i;:::-;16166:86;;15946:313;;;;:::o;16265:419::-;16431:4;16469:2;16458:9;16454:18;16446:26;;16518:9;16512:4;16508:20;16504:1;16493:9;16489:17;16482:47;16546:131;16672:4;16546:131;:::i;:::-;16538:139;;16265:419;;;:::o;16690:::-;16856:4;16894:2;16883:9;16879:18;16871:26;;16943:9;16937:4;16933:20;16929:1;16918:9;16914:17;16907:47;16971:131;17097:4;16971:131;:::i;:::-;16963:139;;16690:419;;;:::o;17115:::-;17281:4;17319:2;17308:9;17304:18;17296:26;;17368:9;17362:4;17358:20;17354:1;17343:9;17339:17;17332:47;17396:131;17522:4;17396:131;:::i;:::-;17388:139;;17115:419;;;:::o;17540:::-;17706:4;17744:2;17733:9;17729:18;17721:26;;17793:9;17787:4;17783:20;17779:1;17768:9;17764:17;17757:47;17821:131;17947:4;17821:131;:::i;:::-;17813:139;;17540:419;;;:::o;17965:::-;18131:4;18169:2;18158:9;18154:18;18146:26;;18218:9;18212:4;18208:20;18204:1;18193:9;18189:17;18182:47;18246:131;18372:4;18246:131;:::i;:::-;18238:139;;17965:419;;;:::o;18390:::-;18556:4;18594:2;18583:9;18579:18;18571:26;;18643:9;18637:4;18633:20;18629:1;18618:9;18614:17;18607:47;18671:131;18797:4;18671:131;:::i;:::-;18663:139;;18390:419;;;:::o;18815:::-;18981:4;19019:2;19008:9;19004:18;18996:26;;19068:9;19062:4;19058:20;19054:1;19043:9;19039:17;19032:47;19096:131;19222:4;19096:131;:::i;:::-;19088:139;;18815:419;;;:::o;19240:::-;19406:4;19444:2;19433:9;19429:18;19421:26;;19493:9;19487:4;19483:20;19479:1;19468:9;19464:17;19457:47;19521:131;19647:4;19521:131;:::i;:::-;19513:139;;19240:419;;;:::o;19665:::-;19831:4;19869:2;19858:9;19854:18;19846:26;;19918:9;19912:4;19908:20;19904:1;19893:9;19889:17;19882:47;19946:131;20072:4;19946:131;:::i;:::-;19938:139;;19665:419;;;:::o;20090:::-;20256:4;20294:2;20283:9;20279:18;20271:26;;20343:9;20337:4;20333:20;20329:1;20318:9;20314:17;20307:47;20371:131;20497:4;20371:131;:::i;:::-;20363:139;;20090:419;;;:::o;20515:::-;20681:4;20719:2;20708:9;20704:18;20696:26;;20768:9;20762:4;20758:20;20754:1;20743:9;20739:17;20732:47;20796:131;20922:4;20796:131;:::i;:::-;20788:139;;20515:419;;;:::o;20940:::-;21106:4;21144:2;21133:9;21129:18;21121:26;;21193:9;21187:4;21183:20;21179:1;21168:9;21164:17;21157:47;21221:131;21347:4;21221:131;:::i;:::-;21213:139;;20940:419;;;:::o;21365:::-;21531:4;21569:2;21558:9;21554:18;21546:26;;21618:9;21612:4;21608:20;21604:1;21593:9;21589:17;21582:47;21646:131;21772:4;21646:131;:::i;:::-;21638:139;;21365:419;;;:::o;21790:::-;21956:4;21994:2;21983:9;21979:18;21971:26;;22043:9;22037:4;22033:20;22029:1;22018:9;22014:17;22007:47;22071:131;22197:4;22071:131;:::i;:::-;22063:139;;21790:419;;;:::o;22215:::-;22381:4;22419:2;22408:9;22404:18;22396:26;;22468:9;22462:4;22458:20;22454:1;22443:9;22439:17;22432:47;22496:131;22622:4;22496:131;:::i;:::-;22488:139;;22215:419;;;:::o;22640:::-;22806:4;22844:2;22833:9;22829:18;22821:26;;22893:9;22887:4;22883:20;22879:1;22868:9;22864:17;22857:47;22921:131;23047:4;22921:131;:::i;:::-;22913:139;;22640:419;;;:::o;23065:::-;23231:4;23269:2;23258:9;23254:18;23246:26;;23318:9;23312:4;23308:20;23304:1;23293:9;23289:17;23282:47;23346:131;23472:4;23346:131;:::i;:::-;23338:139;;23065:419;;;:::o;23490:::-;23656:4;23694:2;23683:9;23679:18;23671:26;;23743:9;23737:4;23733:20;23729:1;23718:9;23714:17;23707:47;23771:131;23897:4;23771:131;:::i;:::-;23763:139;;23490:419;;;:::o;23915:::-;24081:4;24119:2;24108:9;24104:18;24096:26;;24168:9;24162:4;24158:20;24154:1;24143:9;24139:17;24132:47;24196:131;24322:4;24196:131;:::i;:::-;24188:139;;23915:419;;;:::o;24340:222::-;24433:4;24471:2;24460:9;24456:18;24448:26;;24484:71;24552:1;24541:9;24537:17;24528:6;24484:71;:::i;:::-;24340:222;;;;:::o;24568:129::-;24602:6;24629:20;;:::i;:::-;24619:30;;24658:33;24686:4;24678:6;24658:33;:::i;:::-;24568:129;;;:::o;24703:75::-;24736:6;24769:2;24763:9;24753:19;;24703:75;:::o;24784:307::-;24845:4;24935:18;24927:6;24924:30;24921:56;;;24957:18;;:::i;:::-;24921:56;24995:29;25017:6;24995:29;:::i;:::-;24987:37;;25079:4;25073;25069:15;25061:23;;24784:307;;;:::o;25097:98::-;25148:6;25182:5;25176:12;25166:22;;25097:98;;;:::o;25201:99::-;25253:6;25287:5;25281:12;25271:22;;25201:99;;;:::o;25306:168::-;25389:11;25423:6;25418:3;25411:19;25463:4;25458:3;25454:14;25439:29;;25306:168;;;;:::o;25480:169::-;25564:11;25598:6;25593:3;25586:19;25638:4;25633:3;25629:14;25614:29;;25480:169;;;;:::o;25655:148::-;25757:11;25794:3;25779:18;;25655:148;;;;:::o;25809:305::-;25849:3;25868:20;25886:1;25868:20;:::i;:::-;25863:25;;25902:20;25920:1;25902:20;:::i;:::-;25897:25;;26056:1;25988:66;25984:74;25981:1;25978:81;25975:107;;;26062:18;;:::i;:::-;25975:107;26106:1;26103;26099:9;26092:16;;25809:305;;;;:::o;26120:185::-;26160:1;26177:20;26195:1;26177:20;:::i;:::-;26172:25;;26211:20;26229:1;26211:20;:::i;:::-;26206:25;;26250:1;26240:35;;26255:18;;:::i;:::-;26240:35;26297:1;26294;26290:9;26285:14;;26120:185;;;;:::o;26311:191::-;26351:4;26371:20;26389:1;26371:20;:::i;:::-;26366:25;;26405:20;26423:1;26405:20;:::i;:::-;26400:25;;26444:1;26441;26438:8;26435:34;;;26449:18;;:::i;:::-;26435:34;26494:1;26491;26487:9;26479:17;;26311:191;;;;:::o;26508:96::-;26545:7;26574:24;26592:5;26574:24;:::i;:::-;26563:35;;26508:96;;;:::o;26610:90::-;26644:7;26687:5;26680:13;26673:21;26662:32;;26610:90;;;:::o;26706:149::-;26742:7;26782:66;26775:5;26771:78;26760:89;;26706:149;;;:::o;26861:126::-;26898:7;26938:42;26931:5;26927:54;26916:65;;26861:126;;;:::o;26993:77::-;27030:7;27059:5;27048:16;;26993:77;;;:::o;27076:154::-;27160:6;27155:3;27150;27137:30;27222:1;27213:6;27208:3;27204:16;27197:27;27076:154;;;:::o;27236:307::-;27304:1;27314:113;27328:6;27325:1;27322:13;27314:113;;;27413:1;27408:3;27404:11;27398:18;27394:1;27389:3;27385:11;27378:39;27350:2;27347:1;27343:10;27338:15;;27314:113;;;27445:6;27442:1;27439:13;27436:101;;;27525:1;27516:6;27511:3;27507:16;27500:27;27436:101;27285:258;27236:307;;;:::o;27549:320::-;27593:6;27630:1;27624:4;27620:12;27610:22;;27677:1;27671:4;27667:12;27698:18;27688:81;;27754:4;27746:6;27742:17;27732:27;;27688:81;27816:2;27808:6;27805:14;27785:18;27782:38;27779:84;;;27835:18;;:::i;:::-;27779:84;27600:269;27549:320;;;:::o;27875:281::-;27958:27;27980:4;27958:27;:::i;:::-;27950:6;27946:40;28088:6;28076:10;28073:22;28052:18;28040:10;28037:34;28034:62;28031:88;;;28099:18;;:::i;:::-;28031:88;28139:10;28135:2;28128:22;27918:238;27875:281;;:::o;28162:233::-;28201:3;28224:24;28242:5;28224:24;:::i;:::-;28215:33;;28270:66;28263:5;28260:77;28257:103;;;28340:18;;:::i;:::-;28257:103;28387:1;28380:5;28376:13;28369:20;;28162:233;;;:::o;28401:176::-;28433:1;28450:20;28468:1;28450:20;:::i;:::-;28445:25;;28484:20;28502:1;28484:20;:::i;:::-;28479:25;;28523:1;28513:35;;28528:18;;:::i;:::-;28513:35;28569:1;28566;28562:9;28557:14;;28401:176;;;;:::o;28583:180::-;28631:77;28628:1;28621:88;28728:4;28725:1;28718:15;28752:4;28749:1;28742:15;28769:180;28817:77;28814:1;28807:88;28914:4;28911:1;28904:15;28938:4;28935:1;28928:15;28955:180;29003:77;29000:1;28993:88;29100:4;29097:1;29090:15;29124:4;29121:1;29114:15;29141:180;29189:77;29186:1;29179:88;29286:4;29283:1;29276:15;29310:4;29307:1;29300:15;29327:180;29375:77;29372:1;29365:88;29472:4;29469:1;29462:15;29496:4;29493:1;29486:15;29513:180;29561:77;29558:1;29551:88;29658:4;29655:1;29648:15;29682:4;29679:1;29672:15;29699:117;29808:1;29805;29798:12;29822:117;29931:1;29928;29921:12;29945:117;30054:1;30051;30044:12;30068:117;30177:1;30174;30167:12;30191:102;30232:6;30283:2;30279:7;30274:2;30267:5;30263:14;30259:28;30249:38;;30191:102;;;:::o;30299:220::-;30439:34;30435:1;30427:6;30423:14;30416:58;30508:3;30503:2;30495:6;30491:15;30484:28;30299:220;:::o;30525:230::-;30665:34;30661:1;30653:6;30649:14;30642:58;30734:13;30729:2;30721:6;30717:15;30710:38;30525:230;:::o;30761:237::-;30901:34;30897:1;30889:6;30885:14;30878:58;30970:20;30965:2;30957:6;30953:15;30946:45;30761:237;:::o;31004:178::-;31144:30;31140:1;31132:6;31128:14;31121:54;31004:178;:::o;31188:::-;31328:30;31324:1;31316:6;31312:14;31305:54;31188:178;:::o;31372:226::-;31512:34;31508:1;31500:6;31496:14;31489:58;31581:9;31576:2;31568:6;31564:15;31557:34;31372:226;:::o;31604:223::-;31744:34;31740:1;31732:6;31728:14;31721:58;31813:6;31808:2;31800:6;31796:15;31789:31;31604:223;:::o;31833:175::-;31973:27;31969:1;31961:6;31957:14;31950:51;31833:175;:::o;32014:231::-;32154:34;32150:1;32142:6;32138:14;32131:58;32223:14;32218:2;32210:6;32206:15;32199:39;32014:231;:::o;32251:243::-;32391:34;32387:1;32379:6;32375:14;32368:58;32460:26;32455:2;32447:6;32443:15;32436:51;32251:243;:::o;32500:229::-;32640:34;32636:1;32628:6;32624:14;32617:58;32709:12;32704:2;32696:6;32692:15;32685:37;32500:229;:::o;32735:228::-;32875:34;32871:1;32863:6;32859:14;32852:58;32944:11;32939:2;32931:6;32927:15;32920:36;32735:228;:::o;32969:182::-;33109:34;33105:1;33097:6;33093:14;33086:58;32969:182;:::o;33157:231::-;33297:34;33293:1;33285:6;33281:14;33274:58;33366:14;33361:2;33353:6;33349:15;33342:39;33157:231;:::o;33394:228::-;33534:34;33530:1;33522:6;33518:14;33511:58;33603:11;33598:2;33590:6;33586:15;33579:36;33394:228;:::o;33628:234::-;33768:34;33764:1;33756:6;33752:14;33745:58;33837:17;33832:2;33824:6;33820:15;33813:42;33628:234;:::o;33868:220::-;34008:34;34004:1;33996:6;33992:14;33985:58;34077:3;34072:2;34064:6;34060:15;34053:28;33868:220;:::o;34094:236::-;34234:34;34230:1;34222:6;34218:14;34211:58;34303:19;34298:2;34290:6;34286:15;34279:44;34094:236;:::o;34336:231::-;34476:34;34472:1;34464:6;34460:14;34453:58;34545:14;34540:2;34532:6;34528:15;34521:39;34336:231;:::o;34573:122::-;34646:24;34664:5;34646:24;:::i;:::-;34639:5;34636:35;34626:63;;34685:1;34682;34675:12;34626:63;34573:122;:::o;34701:116::-;34771:21;34786:5;34771:21;:::i;:::-;34764:5;34761:32;34751:60;;34807:1;34804;34797:12;34751:60;34701:116;:::o;34823:120::-;34895:23;34912:5;34895:23;:::i;:::-;34888:5;34885:34;34875:62;;34933:1;34930;34923:12;34875:62;34823:120;:::o;34949:122::-;35022:24;35040:5;35022:24;:::i;:::-;35015:5;35012:35;35002:63;;35061:1;35058;35051:12;35002:63;34949:122;:::o

Swarm Source

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