ETH Price: $3,124.32 (+1.93%)

Token

Probably Nothing (PN)
 

Overview

Max Total Supply

7,676 PN

Holders

3,957

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 PN
0x2d51c390bd975fb52cf1c4f78cb33f432cdc8c3d
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:
ProbablyNothing

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity Multiple files format)

File 14 of 16: ProbablyNothing.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;
import "./ERC721A.sol";
import "./Ownable.sol";
import "./ReentrancyGuard.sol";
import "./MerkleProof.sol";

contract ProbablyNothing is ERC721A, Ownable, ReentrancyGuard {
    string public baseURI;
    uint256 public maxSupply;
    bytes32 public merkleRoot;

    bool alOnly;
    bool mintOpen;

    mapping(address => bool) public hasMinted;
    mapping(address => uint256) public numOfMints;

    event minted(address minter, uint256 id);
    event burned(address from, address to, uint256 id);

    constructor(
        string memory name,
        string memory symbol,
        uint256 _maxSupply
    ) ERC721A(name, symbol, 100, _maxSupply) {
        maxSupply = _maxSupply;
        alOnly = true;
        mintOpen = false;
        baseURI = "https://ipfs.io/ipfs/QmcQj3Yi1PtytJJ9iepD3awgVLSNzTZB6YMLBFEdrz559F";
    }

    function mint(uint256 _amount, bytes32[] calldata _merkleProof) external nonReentrant {
        require(totalSupply() + _amount <= maxSupply, "Exceeds max supply");
        require(_amount + numOfMints[_msgSender()] <= 2, "Max two per wallet");
        require(mintOpen, "Minting is paused");

        numOfMints[_msgSender()] += _amount;

        if(isAllowListed(_msgSender(), _merkleProof) && !hasMinted[_msgSender()]) {
            if(numOfMints[_msgSender()] == 2){
                hasMinted[_msgSender()] = true;
            }
        } else {
            require(!alOnly, "Only allow listed addresses can mint");
        }

        _safeMint(_msgSender(), _amount);
        emit minted(_msgSender(), totalSupply());
    }

    function ownerMint(address _recipient, uint256 _amount) external onlyOwner {
        require(totalSupply() + _amount <= maxSupply, "Exceeds max supply");
        _safeMint(_recipient, _amount);
        emit minted(_recipient, totalSupply());
    }

    function isAllowListed(address _recipient, bytes32[] calldata _merkleProof) public view returns(bool) {
        bytes32 leaf = keccak256(abi.encodePacked(_recipient));
        bool isal = MerkleProof.verify(_merkleProof, merkleRoot, leaf);
        return isal;
    }

    function setRoot(bytes32 root) external onlyOwner {
        merkleRoot = root;
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        return baseURI;
    }

    function burn(uint256 tokenId) external {
        transferFrom(_msgSender(), address(0), tokenId);
        emit burned(_msgSender(), address(0), tokenId);
    }

    function changeURI(string memory _baseURI) external onlyOwner {
        baseURI = _baseURI;
    }

    function flipMintState() external onlyOwner {
        mintOpen = !mintOpen;
    }

    function flipALState() external onlyOwner {
        alOnly = !alOnly;
    }

    function withdraw() public onlyOwner {
        (bool success,) = owner().call{value: address(this).balance}("");
        require(success, "Transfer fail");
    }
}

File 1 of 16: Address.sol
// SPDX-License-Identifier: MIT

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;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

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

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

File 2 of 16: Context.sol
// SPDX-License-Identifier: MIT

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

File 3 of 16: ERC165.sol
// SPDX-License-Identifier: MIT

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 16: ERC721.sol
// SPDX-License-Identifier: MIT

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";
import "./Ownable.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.
     */
    string URI;
    function _baseURI() internal view virtual returns (string memory) {
        return URI;
    }

    /**
     * @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 16: ERC721A.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./IERC721Metadata.sol";
import "./IERC721Enumerable.sol";
import "./Address.sol";
//import "@openzeppelin/contracts/utils/Context.sol";
import "./Strings.sol";
import "./ERC165.sol";
import "./Ownable.sol";

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Assumes the number of issuable tokens (collection size) is capped and fits in a uint128.
 *
 * Does not support burning tokens to address(0).
 */
contract ERC721A is
  Context,
  ERC165,
  IERC721,
  IERC721Metadata,
  IERC721Enumerable
{
  using Address for address;
  using Strings for uint256;

  struct TokenOwnership {
    address addr;
    uint64 startTimestamp;
  }

  struct AddressData {
    uint128 balance;
    uint128 numberMinted;
  }

  uint256 private currentIndex = 0;

  uint256 internal immutable collectionSize;
  uint256 internal immutable maxBatchSize;

  // Token name
  string private _name;

  // Token symbol
  string private _symbol;

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

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

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

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

  /**
   * @dev
   * `maxBatchSize` refers to how much a minter can mint at a time.
   * `collectionSize_` refers to how many tokens are in the collection.
   */
  constructor(
    string memory name_,
    string memory symbol_,
    uint256 maxBatchSize_,
    uint256 collectionSize_
  ) {
    require(
      collectionSize_ > 0,
      "ERC721A: collection must have a nonzero supply"
    );
    require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero");
    _name = name_;
    _symbol = symbol_;
    maxBatchSize = maxBatchSize_;
    collectionSize = collectionSize_;
  }

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

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

  /**
   * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
   * This read function is O(collectionSize). If calling from a separate contract, be sure to test gas first.
   * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
   */
  function tokenOfOwnerByIndex(address owner, uint256 index)
    public
    view
    override
    returns (uint256)
  {
    require(index < balanceOf(owner), "ERC721A: owner index out of bounds");
    uint256 numMintedSoFar = totalSupply();
    uint256 tokenIdsIdx = 0;
    address currOwnershipAddr = address(0);
    for (uint256 i = 0; i < numMintedSoFar; i++) {
      TokenOwnership memory ownership = _ownerships[i];
      if (ownership.addr != address(0)) {
        currOwnershipAddr = ownership.addr;
      }
      if (currOwnershipAddr == owner) {
        if (tokenIdsIdx == index) {
          return i;
        }
        tokenIdsIdx++;
      }
    }
    revert("ERC721A: unable to get token of owner by index");
  }

  /**
   * @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 ||
      interfaceId == type(IERC721Enumerable).interfaceId ||
      super.supportsInterface(interfaceId);
  }

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

  function _numberMinted(address owner) internal view returns (uint256) {
    require(
      owner != address(0),
      "ERC721A: number minted query for the zero address"
    );
    return uint256(_addressData[owner].numberMinted);
  }

  function ownershipOf(uint256 tokenId)
    internal
    view
    returns (TokenOwnership memory)
  {
    require(_exists(tokenId), "ERC721A: owner query for nonexistent token");

    uint256 lowestTokenToCheck;
    if (tokenId >= maxBatchSize) {
      lowestTokenToCheck = tokenId - maxBatchSize + 1;
    }

    for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) {
      TokenOwnership memory ownership = _ownerships[curr];
      if (ownership.addr != address(0)) {
        return ownership;
      }
    }

    revert("ERC721A: unable to determine the owner of token");
  }

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

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

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

  /**
   * @dev See {IERC721Metadata-tokenURI}.
   */
  function tokenURI(uint256 tokenId)
    public
    view
    virtual
    override
    returns (string memory)
  {
    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.
   */
  string URI;
  function _baseURI() internal view virtual returns (string memory) {
    return URI;
  }

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

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

    _approve(to, tokenId, owner);
  }

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

    return _tokenApprovals[tokenId];
  }

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

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

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

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

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

  /**
   * @dev See {IERC721-safeTransferFrom}.
   */
  function safeTransferFrom(
    address from,
    address to,
    uint256 tokenId,
    bytes memory _data
  ) public override {
    _transfer(from, to, tokenId);
    require(
      _checkOnERC721Received(from, to, tokenId, _data),
      "ERC721A: 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`),
   */
  function _exists(uint256 tokenId) internal view returns (bool) {
    return tokenId < currentIndex;
  }

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

  /**
   * @dev Mints `quantity` tokens and transfers them to `to`.
   *
   * Requirements:
   *
   * - there must be `quantity` tokens remaining unminted in the total collection.
   * - `to` cannot be the zero address.
   * - `quantity` cannot be larger than the max batch size.
   *
   * Emits a {Transfer} event.
   */
  function _safeMint(
    address to,
    uint256 quantity,
    bytes memory _data
  ) internal {
    uint256 startTokenId = currentIndex;
    require(to != address(0), "ERC721A: mint to the zero address");
    // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering.
    require(!_exists(startTokenId), "ERC721A: token already minted");
    require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high");

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

    AddressData memory addressData = _addressData[to];
    _addressData[to] = AddressData(
      addressData.balance + uint128(quantity),
      addressData.numberMinted + uint128(quantity)
    );
    _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp));

    uint256 updatedIndex = startTokenId;

    for (uint256 i = 0; i < quantity; i++) {
      emit Transfer(address(0), to, updatedIndex);
      require(
        _checkOnERC721Received(address(0), to, updatedIndex, _data),
        "ERC721A: transfer to non ERC721Receiver implementer"
      );
      updatedIndex++;
    }

    currentIndex = updatedIndex;
    _afterTokenTransfers(address(0), to, startTokenId, quantity);
  }

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

    bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
      getApproved(tokenId) == _msgSender() ||
      isApprovedForAll(prevOwnership.addr, _msgSender()));

    require(
      isApprovedOrOwner,
      "ERC721A: transfer caller is not owner nor approved"
    );

    require(
      prevOwnership.addr == from,
      "ERC721A: transfer from incorrect owner"
    );
    //require(to != address(0), "ERC721A: transfer to the zero address");

    _beforeTokenTransfers(from, to, tokenId, 1);

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

    _addressData[from].balance -= 1;
    _addressData[to].balance += 1;
    _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp));

    // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
    // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
    uint256 nextTokenId = tokenId + 1;
    if (_ownerships[nextTokenId].addr == address(0)) {
      if (_exists(nextTokenId)) {
        _ownerships[nextTokenId] = TokenOwnership(
          prevOwnership.addr,
          prevOwnership.startTimestamp
        );
      }
    }

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

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

  uint256 public nextOwnerToExplicitlySet = 0;

  /**
   * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf().
   */
  function _setOwnersExplicit(uint256 quantity) internal {
    uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet;
    require(quantity > 0, "quantity must be nonzero");
    uint256 endIndex = oldNextOwnerToSet + quantity - 1;
    if (endIndex > collectionSize - 1) {
      endIndex = collectionSize - 1;
    }
    // We know if the last one in the group exists, all in the group exist, due to serial ordering.
    require(_exists(endIndex), "not enough minted yet for this cleanup");
    for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) {
      if (_ownerships[i].addr == address(0)) {
        TokenOwnership memory ownership = ownershipOf(i);
        _ownerships[i] = TokenOwnership(
          ownership.addr,
          ownership.startTimestamp
        );
      }
    }
    nextOwnerToExplicitlySet = endIndex + 1;
  }

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

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

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

File 6 of 16: 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 7 of 16: IERC165.sol
// SPDX-License-Identifier: MIT

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 8 of 16: IERC721.sol
// SPDX-License-Identifier: MIT

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 9 of 16: IERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (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);

    /**
     * @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 10 of 16: IERC721Metadata.sol
// SPDX-License-Identifier: MIT

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 11 of 16: IERC721Receiver.sol
// SPDX-License-Identifier: MIT

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 12 of 16: MerkleProof.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

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

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

File 13 of 16: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "./Context.sol";

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

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

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

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

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

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

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

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

File 15 of 16: ReentrancyGuard.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

File 16 of 16: Strings.sol
// SPDX-License-Identifier: MIT

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":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"burned","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"minted","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"changeURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipALState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipMintState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"hasMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"isAllowListed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numOfMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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":"bytes32","name":"root","type":"bytes32"}],"name":"setRoot","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"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c06040526000805560006008553480156200001a57600080fd5b5060405162004f6e38038062004f6e8339818101604052810190620000409190620003ca565b8282606483600081116200008b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200008290620004d4565b60405180910390fd5b60008211620000d1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000c890620004b2565b60405180910390fd5b8360019080519060200190620000e992919062000285565b5082600290805190602001906200010292919062000285565b508160a08181525050806080818152505050505050620001376200012b620001b760201b60201c565b620001bf60201b60201c565b6001600a8190555080600c819055506001600e60006101000a81548160ff0219169083151502179055506000600e60016101000a81548160ff02191690831515021790555060405180608001604052806043815260200162004f2b60439139600b9080519060200190620001ad92919062000285565b505050506200074d565b600033905090565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200029390620005a6565b90600052602060002090601f016020900481019282620002b7576000855562000303565b82601f10620002d257805160ff191683800117855562000303565b8280016001018555821562000303579182015b8281111562000302578251825591602001919060010190620002e5565b5b50905062000312919062000316565b5090565b5b808211156200033157600081600090555060010162000317565b5090565b60006200034c62000346846200051f565b620004f6565b9050828152602081018484840111156200036b576200036a62000675565b5b6200037884828562000570565b509392505050565b600082601f83011262000398576200039762000670565b5b8151620003aa84826020860162000335565b91505092915050565b600081519050620003c48162000733565b92915050565b600080600060608486031215620003e657620003e56200067f565b5b600084015167ffffffffffffffff8111156200040757620004066200067a565b5b620004158682870162000380565b935050602084015167ffffffffffffffff8111156200043957620004386200067a565b5b620004478682870162000380565b92505060406200045a86828701620003b3565b9150509250925092565b60006200047360278362000555565b9150620004808262000695565b604082019050919050565b60006200049a602e8362000555565b9150620004a782620006e4565b604082019050919050565b60006020820190508181036000830152620004cd8162000464565b9050919050565b60006020820190508181036000830152620004ef816200048b565b9050919050565b60006200050262000515565b9050620005108282620005dc565b919050565b6000604051905090565b600067ffffffffffffffff8211156200053d576200053c62000641565b5b620005488262000684565b9050602081019050919050565b600082825260208201905092915050565b6000819050919050565b60005b838110156200059057808201518184015260208101905062000573565b83811115620005a0576000848401525b50505050565b60006002820490506001821680620005bf57607f821691505b60208210811415620005d657620005d562000612565b5b50919050565b620005e78262000684565b810181811067ffffffffffffffff8211171562000609576200060862000641565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231413a206d61782062617463682073697a65206d7573742062652060008201527f6e6f6e7a65726f00000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060008201527f6e6f6e7a65726f20737570706c79000000000000000000000000000000000000602082015250565b6200073e8162000566565b81146200074a57600080fd5b50565b60805160a0516147ad6200077e600039600081816123d5015281816123fe01526128c50152600050506147ad6000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c8063677621691161011a578063b88d4fde116100ad578063d7224ba01161007c578063d7224ba0146105c5578063dab5f340146105e3578063e5e01c11146105ff578063e985e9c51461061b578063f2fde38b1461064b57610206565b8063b88d4fde1461053f578063ba41b0c61461055b578063c87b56dd14610577578063d5abeb01146105a757610206565b80638da5cb5b116100e95780638da5cb5b146104b757806395d89b41146104d5578063a22cb465146104f3578063b4cc927d1461050f57610206565b8063677621691461042f5780636c0360eb1461045f57806370a082311461047d578063715018a6146104ad57610206565b806338e21cce1161019d5780634674a23c1161016c5780634674a23c1461039f578063484b973c146103a95780634f6ccce7146103c557806359c74f29146103f55780636352211e146103ff57610206565b806338e21cce1461032d5780633ccfd60b1461035d57806342842e0e1461036757806342966c681461038357610206565b806318160ddd116101d957806318160ddd146102a557806323b872dd146102c35780632eb4a7ab146102df5780632f745c59146102fd57610206565b806301ffc9a71461020b57806306fdde031461023b578063081812fc14610259578063095ea7b314610289575b600080fd5b61022560048036038101906102209190613263565b610667565b60405161023291906138ba565b60405180910390f35b6102436107b1565b60405161025091906138f0565b60405180910390f35b610273600480360381019061026e9190613306565b610843565b60405161028091906137f3565b60405180910390f35b6102a3600480360381019061029e91906131f6565b6108c8565b005b6102ad6109e1565b6040516102ba9190613c12565b60405180910390f35b6102dd60048036038101906102d89190613080565b6109ea565b005b6102e76109fa565b6040516102f491906138d5565b60405180910390f35b610317600480360381019061031291906131f6565b610a00565b6040516103249190613c12565b60405180910390f35b61034760048036038101906103429190613013565b610bfe565b60405161035491906138ba565b60405180910390f35b610365610c1e565b005b610381600480360381019061037c9190613080565b610d50565b005b61039d60048036038101906103989190613306565b610d70565b005b6103a7610dc9565b005b6103c360048036038101906103be91906131f6565b610e71565b005b6103df60048036038101906103da9190613306565b610f92565b6040516103ec9190613c12565b60405180910390f35b6103fd610fe5565b005b61041960048036038101906104149190613306565b61108d565b60405161042691906137f3565b60405180910390f35b61044960048036038101906104449190613156565b6110a3565b60405161045691906138ba565b60405180910390f35b61046761112d565b60405161047491906138f0565b60405180910390f35b61049760048036038101906104929190613013565b6111bb565b6040516104a49190613c12565b60405180910390f35b6104b56112a4565b005b6104bf61132c565b6040516104cc91906137f3565b60405180910390f35b6104dd611356565b6040516104ea91906138f0565b60405180910390f35b61050d600480360381019061050891906131b6565b6113e8565b005b61052960048036038101906105249190613013565b611569565b6040516105369190613c12565b60405180910390f35b610559600480360381019061055491906130d3565b611581565b005b61057560048036038101906105709190613333565b6115dd565b005b610591600480360381019061058c9190613306565b6119a1565b60405161059e91906138f0565b60405180910390f35b6105af611a35565b6040516105bc9190613c12565b60405180910390f35b6105cd611a3b565b6040516105da9190613c12565b60405180910390f35b6105fd60048036038101906105f89190613236565b611a41565b005b610619600480360381019061061491906132bd565b611ac7565b005b61063560048036038101906106309190613040565b611b5d565b60405161064291906138ba565b60405180910390f35b61066560048036038101906106609190613013565b611bf1565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061073257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061079a57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107aa57506107a982611ce9565b5b9050919050565b6060600180546107c090613f01565b80601f01602080910402602001604051908101604052809291908181526020018280546107ec90613f01565b80156108395780601f1061080e57610100808354040283529160200191610839565b820191906000526020600020905b81548152906001019060200180831161081c57829003601f168201915b5050505050905090565b600061084e82611d53565b61088d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088490613bd2565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108d38261108d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610944576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093b90613ad2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610963611d60565b73ffffffffffffffffffffffffffffffffffffffff16148061099257506109918161098c611d60565b611b5d565b5b6109d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c8906139d2565b60405180910390fd5b6109dc838383611d68565b505050565b60008054905090565b6109f5838383611e1a565b505050565b600d5481565b6000610a0b836111bb565b8210610a4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4390613912565b60405180910390fd5b6000610a566109e1565b905060008060005b83811015610bbc576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610b5057806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ba85786841415610b99578195505050505050610bf8565b8380610ba490613f64565b9450505b508080610bb490613f64565b915050610a5e565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bef90613b72565b60405180910390fd5b92915050565b600f6020528060005260406000206000915054906101000a900460ff1681565b610c26611d60565b73ffffffffffffffffffffffffffffffffffffffff16610c4461132c565b73ffffffffffffffffffffffffffffffffffffffff1614610c9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9190613a52565b60405180910390fd5b6000610ca461132c565b73ffffffffffffffffffffffffffffffffffffffff1647604051610cc7906137de565b60006040518083038185875af1925050503d8060008114610d04576040519150601f19603f3d011682016040523d82523d6000602084013e610d09565b606091505b5050905080610d4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4490613932565b60405180910390fd5b50565b610d6b83838360405180602001604052806000815250611581565b505050565b610d83610d7b611d60565b6000836109ea565b7f4911fc0126af9455d0aa4a23d3cf11a705afa45b85f7721bf29a93ccbbf76a87610dac611d60565b600083604051610dbe9392919061380e565b60405180910390a150565b610dd1611d60565b73ffffffffffffffffffffffffffffffffffffffff16610def61132c565b73ffffffffffffffffffffffffffffffffffffffff1614610e45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3c90613a52565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b610e79611d60565b73ffffffffffffffffffffffffffffffffffffffff16610e9761132c565b73ffffffffffffffffffffffffffffffffffffffff1614610eed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee490613a52565b60405180910390fd5b600c5481610ef96109e1565b610f039190613d3d565b1115610f44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3b906139f2565b60405180910390fd5b610f4e8282612363565b7fb7656808f0e04b4af7a20f7ef1caa7669f0d781f1ca4cba31a3ba467880766c982610f786109e1565b604051610f86929190613891565b60405180910390a15050565b6000610f9c6109e1565b8210610fdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd490613992565b60405180910390fd5b819050919050565b610fed611d60565b73ffffffffffffffffffffffffffffffffffffffff1661100b61132c565b73ffffffffffffffffffffffffffffffffffffffff1614611061576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105890613a52565b60405180910390fd5b600e60019054906101000a900460ff1615600e60016101000a81548160ff021916908315150217905550565b600061109882612381565b600001519050919050565b600080846040516020016110b791906137c3565b604051602081830303815290604052805190602001209050600061111f858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600d5484612584565b905080925050509392505050565b600b805461113a90613f01565b80601f016020809104026020016040519081016040528092919081815260200182805461116690613f01565b80156111b35780601f10611188576101008083540402835291602001916111b3565b820191906000526020600020905b81548152906001019060200180831161119657829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561122c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122390613a12565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6112ac611d60565b73ffffffffffffffffffffffffffffffffffffffff166112ca61132c565b73ffffffffffffffffffffffffffffffffffffffff1614611320576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131790613a52565b60405180910390fd5b61132a600061259b565b565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606002805461136590613f01565b80601f016020809104026020016040519081016040528092919081815260200182805461139190613f01565b80156113de5780601f106113b3576101008083540402835291602001916113de565b820191906000526020600020905b8154815290600101906020018083116113c157829003601f168201915b5050505050905090565b6113f0611d60565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561145e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145590613a72565b60405180910390fd5b806006600061146b611d60565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611518611d60565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161155d91906138ba565b60405180910390a35050565b60106020528060005260406000206000915090505481565b61158c848484611e1a565b61159884848484612661565b6115d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ce90613b12565b60405180910390fd5b50505050565b6002600a541415611623576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161a90613b92565b60405180910390fd5b6002600a81905550600c54836116376109e1565b6116419190613d3d565b1115611682576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611679906139f2565b60405180910390fd5b600260106000611690611d60565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054846116d69190613d3d565b1115611717576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170e90613ab2565b60405180910390fd5b600e60019054906101000a900460ff16611766576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175d90613af2565b60405180910390fd5b8260106000611773611d60565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117bc9190613d3d565b925050819055506117d56117ce611d60565b83836110a3565b80156118325750600f60006117e8611d60565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156118eb57600260106000611845611d60565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414156118e6576001600f6000611894611d60565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b61193c565b600e60009054906101000a900460ff161561193b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611932906139b2565b60405180910390fd5b5b61194d611947611d60565b84612363565b7fb7656808f0e04b4af7a20f7ef1caa7669f0d781f1ca4cba31a3ba467880766c9611976611d60565b61197e6109e1565b60405161198c929190613891565b60405180910390a16001600a81905550505050565b6060600b80546119b090613f01565b80601f01602080910402602001604051908101604052809291908181526020018280546119dc90613f01565b8015611a295780601f106119fe57610100808354040283529160200191611a29565b820191906000526020600020905b815481529060010190602001808311611a0c57829003601f168201915b50505050509050919050565b600c5481565b60085481565b611a49611d60565b73ffffffffffffffffffffffffffffffffffffffff16611a6761132c565b73ffffffffffffffffffffffffffffffffffffffff1614611abd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab490613a52565b60405180910390fd5b80600d8190555050565b611acf611d60565b73ffffffffffffffffffffffffffffffffffffffff16611aed61132c565b73ffffffffffffffffffffffffffffffffffffffff1614611b43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3a90613a52565b60405180910390fd5b80600b9080519060200190611b59929190612d82565b5050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611bf9611d60565b73ffffffffffffffffffffffffffffffffffffffff16611c1761132c565b73ffffffffffffffffffffffffffffffffffffffff1614611c6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6490613a52565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611cdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd490613952565b60405180910390fd5b611ce68161259b565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611e2582612381565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611e4c611d60565b73ffffffffffffffffffffffffffffffffffffffff161480611ea85750611e71611d60565b73ffffffffffffffffffffffffffffffffffffffff16611e9084610843565b73ffffffffffffffffffffffffffffffffffffffff16145b80611ec45750611ec38260000151611ebe611d60565b611b5d565b5b905080611f06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611efd90613a92565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611f78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6f90613a32565b60405180910390fd5b611f8585858560016127f8565b611f956000848460000151611d68565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166120039190613d93565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166120a79190613cf7565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060006001846121ad9190613d3d565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156122f35761222381611d53565b156122f2576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461235b86868660016127fe565b505050505050565b61237d828260405180602001604052806000815250612804565b5050565b612389612e08565b61239282611d53565b6123d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c890613972565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000083106124355760017f0000000000000000000000000000000000000000000000000000000000000000846124289190613dc7565b6124329190613d3d565b90505b60008390505b818110612543576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461252f5780935050505061257f565b50808061253b90613ed7565b91505061243b565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257690613bb2565b60405180910390fd5b919050565b6000826125918584612ce3565b1490509392505050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006126828473ffffffffffffffffffffffffffffffffffffffff16612d58565b156127eb578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026126ab611d60565b8786866040518563ffffffff1660e01b81526004016126cd9493929190613845565b602060405180830381600087803b1580156126e757600080fd5b505af192505050801561271857506040513d601f19601f820116820180604052508101906127159190613290565b60015b61279b573d8060008114612748576040519150601f19603f3d011682016040523d82523d6000602084013e61274d565b606091505b50600081511415612793576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278a90613b12565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506127f0565b600190505b949350505050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561287a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287190613b52565b60405180910390fd5b61288381611d53565b156128c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ba90613b32565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000831115612926576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291d90613bf2565b60405180910390fd5b61293360008583866127f8565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506040518060400160405280858360000151612a309190613cf7565b6fffffffffffffffffffffffffffffffff168152602001858360200151612a579190613cf7565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b85811015612cc657818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c666000888488612661565b612ca5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9c90613b12565b60405180910390fd5b8180612cb090613f64565b9250508080612cbe90613f64565b915050612bf5565b5080600081905550612cdb60008785886127fe565b505050505050565b60008082905060005b8451811015612d4d576000858281518110612d0a57612d0961402f565b5b60200260200101519050808311612d2c57612d258382612d6b565b9250612d39565b612d368184612d6b565b92505b508080612d4590613f64565b915050612cec565b508091505092915050565b600080823b905060008111915050919050565b600082600052816020526040600020905092915050565b828054612d8e90613f01565b90600052602060002090601f016020900481019282612db05760008555612df7565b82601f10612dc957805160ff1916838001178555612df7565b82800160010185558215612df7579182015b82811115612df6578251825591602001919060010190612ddb565b5b509050612e049190612e42565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115612e5b576000816000905550600101612e43565b5090565b6000612e72612e6d84613c52565b613c2d565b905082815260208101848484011115612e8e57612e8d61409c565b5b612e99848285613e95565b509392505050565b6000612eb4612eaf84613c83565b613c2d565b905082815260208101848484011115612ed057612ecf61409c565b5b612edb848285613e95565b509392505050565b600081359050612ef281614704565b92915050565b60008083601f840112612f0e57612f0d614092565b5b8235905067ffffffffffffffff811115612f2b57612f2a61408d565b5b602083019150836020820283011115612f4757612f46614097565b5b9250929050565b600081359050612f5d8161471b565b92915050565b600081359050612f7281614732565b92915050565b600081359050612f8781614749565b92915050565b600081519050612f9c81614749565b92915050565b600082601f830112612fb757612fb6614092565b5b8135612fc7848260208601612e5f565b91505092915050565b600082601f830112612fe557612fe4614092565b5b8135612ff5848260208601612ea1565b91505092915050565b60008135905061300d81614760565b92915050565b600060208284031215613029576130286140a6565b5b600061303784828501612ee3565b91505092915050565b60008060408385031215613057576130566140a6565b5b600061306585828601612ee3565b925050602061307685828601612ee3565b9150509250929050565b600080600060608486031215613099576130986140a6565b5b60006130a786828701612ee3565b93505060206130b886828701612ee3565b92505060406130c986828701612ffe565b9150509250925092565b600080600080608085870312156130ed576130ec6140a6565b5b60006130fb87828801612ee3565b945050602061310c87828801612ee3565b935050604061311d87828801612ffe565b925050606085013567ffffffffffffffff81111561313e5761313d6140a1565b5b61314a87828801612fa2565b91505092959194509250565b60008060006040848603121561316f5761316e6140a6565b5b600061317d86828701612ee3565b935050602084013567ffffffffffffffff81111561319e5761319d6140a1565b5b6131aa86828701612ef8565b92509250509250925092565b600080604083850312156131cd576131cc6140a6565b5b60006131db85828601612ee3565b92505060206131ec85828601612f4e565b9150509250929050565b6000806040838503121561320d5761320c6140a6565b5b600061321b85828601612ee3565b925050602061322c85828601612ffe565b9150509250929050565b60006020828403121561324c5761324b6140a6565b5b600061325a84828501612f63565b91505092915050565b600060208284031215613279576132786140a6565b5b600061328784828501612f78565b91505092915050565b6000602082840312156132a6576132a56140a6565b5b60006132b484828501612f8d565b91505092915050565b6000602082840312156132d3576132d26140a6565b5b600082013567ffffffffffffffff8111156132f1576132f06140a1565b5b6132fd84828501612fd0565b91505092915050565b60006020828403121561331c5761331b6140a6565b5b600061332a84828501612ffe565b91505092915050565b60008060006040848603121561334c5761334b6140a6565b5b600061335a86828701612ffe565b935050602084013567ffffffffffffffff81111561337b5761337a6140a1565b5b61338786828701612ef8565b92509250509250925092565b61339c81613dfb565b82525050565b6133b36133ae82613dfb565b613fad565b82525050565b6133c281613e0d565b82525050565b6133d181613e19565b82525050565b60006133e282613cb4565b6133ec8185613cca565b93506133fc818560208601613ea4565b613405816140ab565b840191505092915050565b600061341b82613cbf565b6134258185613ce6565b9350613435818560208601613ea4565b61343e816140ab565b840191505092915050565b6000613456602283613ce6565b9150613461826140c9565b604082019050919050565b6000613479600d83613ce6565b915061348482614118565b602082019050919050565b600061349c602683613ce6565b91506134a782614141565b604082019050919050565b60006134bf602a83613ce6565b91506134ca82614190565b604082019050919050565b60006134e2602383613ce6565b91506134ed826141df565b604082019050919050565b6000613505602483613ce6565b91506135108261422e565b604082019050919050565b6000613528603983613ce6565b91506135338261427d565b604082019050919050565b600061354b601283613ce6565b9150613556826142cc565b602082019050919050565b600061356e602b83613ce6565b9150613579826142f5565b604082019050919050565b6000613591602683613ce6565b915061359c82614344565b604082019050919050565b60006135b4602083613ce6565b91506135bf82614393565b602082019050919050565b60006135d7601a83613ce6565b91506135e2826143bc565b602082019050919050565b60006135fa603283613ce6565b9150613605826143e5565b604082019050919050565b600061361d601283613ce6565b915061362882614434565b602082019050919050565b6000613640602283613ce6565b915061364b8261445d565b604082019050919050565b6000613663600083613cdb565b915061366e826144ac565b600082019050919050565b6000613686601183613ce6565b9150613691826144af565b602082019050919050565b60006136a9603383613ce6565b91506136b4826144d8565b604082019050919050565b60006136cc601d83613ce6565b91506136d782614527565b602082019050919050565b60006136ef602183613ce6565b91506136fa82614550565b604082019050919050565b6000613712602e83613ce6565b915061371d8261459f565b604082019050919050565b6000613735601f83613ce6565b9150613740826145ee565b602082019050919050565b6000613758602f83613ce6565b915061376382614617565b604082019050919050565b600061377b602d83613ce6565b915061378682614666565b604082019050919050565b600061379e602283613ce6565b91506137a9826146b5565b604082019050919050565b6137bd81613e8b565b82525050565b60006137cf82846133a2565b60148201915081905092915050565b60006137e982613656565b9150819050919050565b60006020820190506138086000830184613393565b92915050565b60006060820190506138236000830186613393565b6138306020830185613393565b61383d60408301846137b4565b949350505050565b600060808201905061385a6000830187613393565b6138676020830186613393565b61387460408301856137b4565b818103606083015261388681846133d7565b905095945050505050565b60006040820190506138a66000830185613393565b6138b360208301846137b4565b9392505050565b60006020820190506138cf60008301846133b9565b92915050565b60006020820190506138ea60008301846133c8565b92915050565b6000602082019050818103600083015261390a8184613410565b905092915050565b6000602082019050818103600083015261392b81613449565b9050919050565b6000602082019050818103600083015261394b8161346c565b9050919050565b6000602082019050818103600083015261396b8161348f565b9050919050565b6000602082019050818103600083015261398b816134b2565b9050919050565b600060208201905081810360008301526139ab816134d5565b9050919050565b600060208201905081810360008301526139cb816134f8565b9050919050565b600060208201905081810360008301526139eb8161351b565b9050919050565b60006020820190508181036000830152613a0b8161353e565b9050919050565b60006020820190508181036000830152613a2b81613561565b9050919050565b60006020820190508181036000830152613a4b81613584565b9050919050565b60006020820190508181036000830152613a6b816135a7565b9050919050565b60006020820190508181036000830152613a8b816135ca565b9050919050565b60006020820190508181036000830152613aab816135ed565b9050919050565b60006020820190508181036000830152613acb81613610565b9050919050565b60006020820190508181036000830152613aeb81613633565b9050919050565b60006020820190508181036000830152613b0b81613679565b9050919050565b60006020820190508181036000830152613b2b8161369c565b9050919050565b60006020820190508181036000830152613b4b816136bf565b9050919050565b60006020820190508181036000830152613b6b816136e2565b9050919050565b60006020820190508181036000830152613b8b81613705565b9050919050565b60006020820190508181036000830152613bab81613728565b9050919050565b60006020820190508181036000830152613bcb8161374b565b9050919050565b60006020820190508181036000830152613beb8161376e565b9050919050565b60006020820190508181036000830152613c0b81613791565b9050919050565b6000602082019050613c2760008301846137b4565b92915050565b6000613c37613c48565b9050613c438282613f33565b919050565b6000604051905090565b600067ffffffffffffffff821115613c6d57613c6c61405e565b5b613c76826140ab565b9050602081019050919050565b600067ffffffffffffffff821115613c9e57613c9d61405e565b5b613ca7826140ab565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b6000613d0282613e4f565b9150613d0d83613e4f565b9250826fffffffffffffffffffffffffffffffff03821115613d3257613d31613fd1565b5b828201905092915050565b6000613d4882613e8b565b9150613d5383613e8b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d8857613d87613fd1565b5b828201905092915050565b6000613d9e82613e4f565b9150613da983613e4f565b925082821015613dbc57613dbb613fd1565b5b828203905092915050565b6000613dd282613e8b565b9150613ddd83613e8b565b925082821015613df057613def613fd1565b5b828203905092915050565b6000613e0682613e6b565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613ec2578082015181840152602081019050613ea7565b83811115613ed1576000848401525b50505050565b6000613ee282613e8b565b91506000821415613ef657613ef5613fd1565b5b600182039050919050565b60006002820490506001821680613f1957607f821691505b60208210811415613f2d57613f2c614000565b5b50919050565b613f3c826140ab565b810181811067ffffffffffffffff82111715613f5b57613f5a61405e565b5b80604052505050565b6000613f6f82613e8b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613fa257613fa1613fd1565b5b600182019050919050565b6000613fb882613fbf565b9050919050565b6000613fca826140bc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f5472616e73666572206661696c00000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f4f6e6c7920616c6c6f77206c6973746564206164647265737365732063616e2060008201527f6d696e7400000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f45786365656473206d617820737570706c790000000000000000000000000000600082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f4d61782074776f207065722077616c6c65740000000000000000000000000000600082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4d696e74696e6720697320706175736564000000000000000000000000000000600082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b61470d81613dfb565b811461471857600080fd5b50565b61472481613e0d565b811461472f57600080fd5b50565b61473b81613e19565b811461474657600080fd5b50565b61475281613e23565b811461475d57600080fd5b50565b61476981613e8b565b811461477457600080fd5b5056fea26469706673582212201e5780d0f6e92d715930318d69025e1c4d2e3173cc148e25432fe7979d695d2864736f6c6343000807003368747470733a2f2f697066732e696f2f697066732f516d63516a33596931507479744a4a396965704433617767564c534e7a545a4236594d4c42464564727a35353946000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000001dfc000000000000000000000000000000000000000000000000000000000000001050726f6261626c79204e6f7468696e67000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002504e000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102065760003560e01c8063677621691161011a578063b88d4fde116100ad578063d7224ba01161007c578063d7224ba0146105c5578063dab5f340146105e3578063e5e01c11146105ff578063e985e9c51461061b578063f2fde38b1461064b57610206565b8063b88d4fde1461053f578063ba41b0c61461055b578063c87b56dd14610577578063d5abeb01146105a757610206565b80638da5cb5b116100e95780638da5cb5b146104b757806395d89b41146104d5578063a22cb465146104f3578063b4cc927d1461050f57610206565b8063677621691461042f5780636c0360eb1461045f57806370a082311461047d578063715018a6146104ad57610206565b806338e21cce1161019d5780634674a23c1161016c5780634674a23c1461039f578063484b973c146103a95780634f6ccce7146103c557806359c74f29146103f55780636352211e146103ff57610206565b806338e21cce1461032d5780633ccfd60b1461035d57806342842e0e1461036757806342966c681461038357610206565b806318160ddd116101d957806318160ddd146102a557806323b872dd146102c35780632eb4a7ab146102df5780632f745c59146102fd57610206565b806301ffc9a71461020b57806306fdde031461023b578063081812fc14610259578063095ea7b314610289575b600080fd5b61022560048036038101906102209190613263565b610667565b60405161023291906138ba565b60405180910390f35b6102436107b1565b60405161025091906138f0565b60405180910390f35b610273600480360381019061026e9190613306565b610843565b60405161028091906137f3565b60405180910390f35b6102a3600480360381019061029e91906131f6565b6108c8565b005b6102ad6109e1565b6040516102ba9190613c12565b60405180910390f35b6102dd60048036038101906102d89190613080565b6109ea565b005b6102e76109fa565b6040516102f491906138d5565b60405180910390f35b610317600480360381019061031291906131f6565b610a00565b6040516103249190613c12565b60405180910390f35b61034760048036038101906103429190613013565b610bfe565b60405161035491906138ba565b60405180910390f35b610365610c1e565b005b610381600480360381019061037c9190613080565b610d50565b005b61039d60048036038101906103989190613306565b610d70565b005b6103a7610dc9565b005b6103c360048036038101906103be91906131f6565b610e71565b005b6103df60048036038101906103da9190613306565b610f92565b6040516103ec9190613c12565b60405180910390f35b6103fd610fe5565b005b61041960048036038101906104149190613306565b61108d565b60405161042691906137f3565b60405180910390f35b61044960048036038101906104449190613156565b6110a3565b60405161045691906138ba565b60405180910390f35b61046761112d565b60405161047491906138f0565b60405180910390f35b61049760048036038101906104929190613013565b6111bb565b6040516104a49190613c12565b60405180910390f35b6104b56112a4565b005b6104bf61132c565b6040516104cc91906137f3565b60405180910390f35b6104dd611356565b6040516104ea91906138f0565b60405180910390f35b61050d600480360381019061050891906131b6565b6113e8565b005b61052960048036038101906105249190613013565b611569565b6040516105369190613c12565b60405180910390f35b610559600480360381019061055491906130d3565b611581565b005b61057560048036038101906105709190613333565b6115dd565b005b610591600480360381019061058c9190613306565b6119a1565b60405161059e91906138f0565b60405180910390f35b6105af611a35565b6040516105bc9190613c12565b60405180910390f35b6105cd611a3b565b6040516105da9190613c12565b60405180910390f35b6105fd60048036038101906105f89190613236565b611a41565b005b610619600480360381019061061491906132bd565b611ac7565b005b61063560048036038101906106309190613040565b611b5d565b60405161064291906138ba565b60405180910390f35b61066560048036038101906106609190613013565b611bf1565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061073257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061079a57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107aa57506107a982611ce9565b5b9050919050565b6060600180546107c090613f01565b80601f01602080910402602001604051908101604052809291908181526020018280546107ec90613f01565b80156108395780601f1061080e57610100808354040283529160200191610839565b820191906000526020600020905b81548152906001019060200180831161081c57829003601f168201915b5050505050905090565b600061084e82611d53565b61088d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088490613bd2565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108d38261108d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610944576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093b90613ad2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610963611d60565b73ffffffffffffffffffffffffffffffffffffffff16148061099257506109918161098c611d60565b611b5d565b5b6109d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c8906139d2565b60405180910390fd5b6109dc838383611d68565b505050565b60008054905090565b6109f5838383611e1a565b505050565b600d5481565b6000610a0b836111bb565b8210610a4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4390613912565b60405180910390fd5b6000610a566109e1565b905060008060005b83811015610bbc576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610b5057806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ba85786841415610b99578195505050505050610bf8565b8380610ba490613f64565b9450505b508080610bb490613f64565b915050610a5e565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bef90613b72565b60405180910390fd5b92915050565b600f6020528060005260406000206000915054906101000a900460ff1681565b610c26611d60565b73ffffffffffffffffffffffffffffffffffffffff16610c4461132c565b73ffffffffffffffffffffffffffffffffffffffff1614610c9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9190613a52565b60405180910390fd5b6000610ca461132c565b73ffffffffffffffffffffffffffffffffffffffff1647604051610cc7906137de565b60006040518083038185875af1925050503d8060008114610d04576040519150601f19603f3d011682016040523d82523d6000602084013e610d09565b606091505b5050905080610d4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4490613932565b60405180910390fd5b50565b610d6b83838360405180602001604052806000815250611581565b505050565b610d83610d7b611d60565b6000836109ea565b7f4911fc0126af9455d0aa4a23d3cf11a705afa45b85f7721bf29a93ccbbf76a87610dac611d60565b600083604051610dbe9392919061380e565b60405180910390a150565b610dd1611d60565b73ffffffffffffffffffffffffffffffffffffffff16610def61132c565b73ffffffffffffffffffffffffffffffffffffffff1614610e45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3c90613a52565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b610e79611d60565b73ffffffffffffffffffffffffffffffffffffffff16610e9761132c565b73ffffffffffffffffffffffffffffffffffffffff1614610eed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee490613a52565b60405180910390fd5b600c5481610ef96109e1565b610f039190613d3d565b1115610f44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3b906139f2565b60405180910390fd5b610f4e8282612363565b7fb7656808f0e04b4af7a20f7ef1caa7669f0d781f1ca4cba31a3ba467880766c982610f786109e1565b604051610f86929190613891565b60405180910390a15050565b6000610f9c6109e1565b8210610fdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd490613992565b60405180910390fd5b819050919050565b610fed611d60565b73ffffffffffffffffffffffffffffffffffffffff1661100b61132c565b73ffffffffffffffffffffffffffffffffffffffff1614611061576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105890613a52565b60405180910390fd5b600e60019054906101000a900460ff1615600e60016101000a81548160ff021916908315150217905550565b600061109882612381565b600001519050919050565b600080846040516020016110b791906137c3565b604051602081830303815290604052805190602001209050600061111f858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600d5484612584565b905080925050509392505050565b600b805461113a90613f01565b80601f016020809104026020016040519081016040528092919081815260200182805461116690613f01565b80156111b35780601f10611188576101008083540402835291602001916111b3565b820191906000526020600020905b81548152906001019060200180831161119657829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561122c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122390613a12565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6112ac611d60565b73ffffffffffffffffffffffffffffffffffffffff166112ca61132c565b73ffffffffffffffffffffffffffffffffffffffff1614611320576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131790613a52565b60405180910390fd5b61132a600061259b565b565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606002805461136590613f01565b80601f016020809104026020016040519081016040528092919081815260200182805461139190613f01565b80156113de5780601f106113b3576101008083540402835291602001916113de565b820191906000526020600020905b8154815290600101906020018083116113c157829003601f168201915b5050505050905090565b6113f0611d60565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561145e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145590613a72565b60405180910390fd5b806006600061146b611d60565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611518611d60565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161155d91906138ba565b60405180910390a35050565b60106020528060005260406000206000915090505481565b61158c848484611e1a565b61159884848484612661565b6115d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ce90613b12565b60405180910390fd5b50505050565b6002600a541415611623576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161a90613b92565b60405180910390fd5b6002600a81905550600c54836116376109e1565b6116419190613d3d565b1115611682576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611679906139f2565b60405180910390fd5b600260106000611690611d60565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054846116d69190613d3d565b1115611717576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170e90613ab2565b60405180910390fd5b600e60019054906101000a900460ff16611766576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175d90613af2565b60405180910390fd5b8260106000611773611d60565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117bc9190613d3d565b925050819055506117d56117ce611d60565b83836110a3565b80156118325750600f60006117e8611d60565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156118eb57600260106000611845611d60565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414156118e6576001600f6000611894611d60565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b61193c565b600e60009054906101000a900460ff161561193b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611932906139b2565b60405180910390fd5b5b61194d611947611d60565b84612363565b7fb7656808f0e04b4af7a20f7ef1caa7669f0d781f1ca4cba31a3ba467880766c9611976611d60565b61197e6109e1565b60405161198c929190613891565b60405180910390a16001600a81905550505050565b6060600b80546119b090613f01565b80601f01602080910402602001604051908101604052809291908181526020018280546119dc90613f01565b8015611a295780601f106119fe57610100808354040283529160200191611a29565b820191906000526020600020905b815481529060010190602001808311611a0c57829003601f168201915b50505050509050919050565b600c5481565b60085481565b611a49611d60565b73ffffffffffffffffffffffffffffffffffffffff16611a6761132c565b73ffffffffffffffffffffffffffffffffffffffff1614611abd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab490613a52565b60405180910390fd5b80600d8190555050565b611acf611d60565b73ffffffffffffffffffffffffffffffffffffffff16611aed61132c565b73ffffffffffffffffffffffffffffffffffffffff1614611b43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3a90613a52565b60405180910390fd5b80600b9080519060200190611b59929190612d82565b5050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611bf9611d60565b73ffffffffffffffffffffffffffffffffffffffff16611c1761132c565b73ffffffffffffffffffffffffffffffffffffffff1614611c6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6490613a52565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611cdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd490613952565b60405180910390fd5b611ce68161259b565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611e2582612381565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611e4c611d60565b73ffffffffffffffffffffffffffffffffffffffff161480611ea85750611e71611d60565b73ffffffffffffffffffffffffffffffffffffffff16611e9084610843565b73ffffffffffffffffffffffffffffffffffffffff16145b80611ec45750611ec38260000151611ebe611d60565b611b5d565b5b905080611f06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611efd90613a92565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611f78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6f90613a32565b60405180910390fd5b611f8585858560016127f8565b611f956000848460000151611d68565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166120039190613d93565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166120a79190613cf7565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060006001846121ad9190613d3d565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156122f35761222381611d53565b156122f2576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461235b86868660016127fe565b505050505050565b61237d828260405180602001604052806000815250612804565b5050565b612389612e08565b61239282611d53565b6123d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c890613972565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000006483106124355760017f0000000000000000000000000000000000000000000000000000000000000064846124289190613dc7565b6124329190613d3d565b90505b60008390505b818110612543576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461252f5780935050505061257f565b50808061253b90613ed7565b91505061243b565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257690613bb2565b60405180910390fd5b919050565b6000826125918584612ce3565b1490509392505050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006126828473ffffffffffffffffffffffffffffffffffffffff16612d58565b156127eb578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026126ab611d60565b8786866040518563ffffffff1660e01b81526004016126cd9493929190613845565b602060405180830381600087803b1580156126e757600080fd5b505af192505050801561271857506040513d601f19601f820116820180604052508101906127159190613290565b60015b61279b573d8060008114612748576040519150601f19603f3d011682016040523d82523d6000602084013e61274d565b606091505b50600081511415612793576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278a90613b12565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506127f0565b600190505b949350505050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561287a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287190613b52565b60405180910390fd5b61288381611d53565b156128c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ba90613b32565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000064831115612926576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291d90613bf2565b60405180910390fd5b61293360008583866127f8565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506040518060400160405280858360000151612a309190613cf7565b6fffffffffffffffffffffffffffffffff168152602001858360200151612a579190613cf7565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b85811015612cc657818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c666000888488612661565b612ca5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9c90613b12565b60405180910390fd5b8180612cb090613f64565b9250508080612cbe90613f64565b915050612bf5565b5080600081905550612cdb60008785886127fe565b505050505050565b60008082905060005b8451811015612d4d576000858281518110612d0a57612d0961402f565b5b60200260200101519050808311612d2c57612d258382612d6b565b9250612d39565b612d368184612d6b565b92505b508080612d4590613f64565b915050612cec565b508091505092915050565b600080823b905060008111915050919050565b600082600052816020526040600020905092915050565b828054612d8e90613f01565b90600052602060002090601f016020900481019282612db05760008555612df7565b82601f10612dc957805160ff1916838001178555612df7565b82800160010185558215612df7579182015b82811115612df6578251825591602001919060010190612ddb565b5b509050612e049190612e42565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115612e5b576000816000905550600101612e43565b5090565b6000612e72612e6d84613c52565b613c2d565b905082815260208101848484011115612e8e57612e8d61409c565b5b612e99848285613e95565b509392505050565b6000612eb4612eaf84613c83565b613c2d565b905082815260208101848484011115612ed057612ecf61409c565b5b612edb848285613e95565b509392505050565b600081359050612ef281614704565b92915050565b60008083601f840112612f0e57612f0d614092565b5b8235905067ffffffffffffffff811115612f2b57612f2a61408d565b5b602083019150836020820283011115612f4757612f46614097565b5b9250929050565b600081359050612f5d8161471b565b92915050565b600081359050612f7281614732565b92915050565b600081359050612f8781614749565b92915050565b600081519050612f9c81614749565b92915050565b600082601f830112612fb757612fb6614092565b5b8135612fc7848260208601612e5f565b91505092915050565b600082601f830112612fe557612fe4614092565b5b8135612ff5848260208601612ea1565b91505092915050565b60008135905061300d81614760565b92915050565b600060208284031215613029576130286140a6565b5b600061303784828501612ee3565b91505092915050565b60008060408385031215613057576130566140a6565b5b600061306585828601612ee3565b925050602061307685828601612ee3565b9150509250929050565b600080600060608486031215613099576130986140a6565b5b60006130a786828701612ee3565b93505060206130b886828701612ee3565b92505060406130c986828701612ffe565b9150509250925092565b600080600080608085870312156130ed576130ec6140a6565b5b60006130fb87828801612ee3565b945050602061310c87828801612ee3565b935050604061311d87828801612ffe565b925050606085013567ffffffffffffffff81111561313e5761313d6140a1565b5b61314a87828801612fa2565b91505092959194509250565b60008060006040848603121561316f5761316e6140a6565b5b600061317d86828701612ee3565b935050602084013567ffffffffffffffff81111561319e5761319d6140a1565b5b6131aa86828701612ef8565b92509250509250925092565b600080604083850312156131cd576131cc6140a6565b5b60006131db85828601612ee3565b92505060206131ec85828601612f4e565b9150509250929050565b6000806040838503121561320d5761320c6140a6565b5b600061321b85828601612ee3565b925050602061322c85828601612ffe565b9150509250929050565b60006020828403121561324c5761324b6140a6565b5b600061325a84828501612f63565b91505092915050565b600060208284031215613279576132786140a6565b5b600061328784828501612f78565b91505092915050565b6000602082840312156132a6576132a56140a6565b5b60006132b484828501612f8d565b91505092915050565b6000602082840312156132d3576132d26140a6565b5b600082013567ffffffffffffffff8111156132f1576132f06140a1565b5b6132fd84828501612fd0565b91505092915050565b60006020828403121561331c5761331b6140a6565b5b600061332a84828501612ffe565b91505092915050565b60008060006040848603121561334c5761334b6140a6565b5b600061335a86828701612ffe565b935050602084013567ffffffffffffffff81111561337b5761337a6140a1565b5b61338786828701612ef8565b92509250509250925092565b61339c81613dfb565b82525050565b6133b36133ae82613dfb565b613fad565b82525050565b6133c281613e0d565b82525050565b6133d181613e19565b82525050565b60006133e282613cb4565b6133ec8185613cca565b93506133fc818560208601613ea4565b613405816140ab565b840191505092915050565b600061341b82613cbf565b6134258185613ce6565b9350613435818560208601613ea4565b61343e816140ab565b840191505092915050565b6000613456602283613ce6565b9150613461826140c9565b604082019050919050565b6000613479600d83613ce6565b915061348482614118565b602082019050919050565b600061349c602683613ce6565b91506134a782614141565b604082019050919050565b60006134bf602a83613ce6565b91506134ca82614190565b604082019050919050565b60006134e2602383613ce6565b91506134ed826141df565b604082019050919050565b6000613505602483613ce6565b91506135108261422e565b604082019050919050565b6000613528603983613ce6565b91506135338261427d565b604082019050919050565b600061354b601283613ce6565b9150613556826142cc565b602082019050919050565b600061356e602b83613ce6565b9150613579826142f5565b604082019050919050565b6000613591602683613ce6565b915061359c82614344565b604082019050919050565b60006135b4602083613ce6565b91506135bf82614393565b602082019050919050565b60006135d7601a83613ce6565b91506135e2826143bc565b602082019050919050565b60006135fa603283613ce6565b9150613605826143e5565b604082019050919050565b600061361d601283613ce6565b915061362882614434565b602082019050919050565b6000613640602283613ce6565b915061364b8261445d565b604082019050919050565b6000613663600083613cdb565b915061366e826144ac565b600082019050919050565b6000613686601183613ce6565b9150613691826144af565b602082019050919050565b60006136a9603383613ce6565b91506136b4826144d8565b604082019050919050565b60006136cc601d83613ce6565b91506136d782614527565b602082019050919050565b60006136ef602183613ce6565b91506136fa82614550565b604082019050919050565b6000613712602e83613ce6565b915061371d8261459f565b604082019050919050565b6000613735601f83613ce6565b9150613740826145ee565b602082019050919050565b6000613758602f83613ce6565b915061376382614617565b604082019050919050565b600061377b602d83613ce6565b915061378682614666565b604082019050919050565b600061379e602283613ce6565b91506137a9826146b5565b604082019050919050565b6137bd81613e8b565b82525050565b60006137cf82846133a2565b60148201915081905092915050565b60006137e982613656565b9150819050919050565b60006020820190506138086000830184613393565b92915050565b60006060820190506138236000830186613393565b6138306020830185613393565b61383d60408301846137b4565b949350505050565b600060808201905061385a6000830187613393565b6138676020830186613393565b61387460408301856137b4565b818103606083015261388681846133d7565b905095945050505050565b60006040820190506138a66000830185613393565b6138b360208301846137b4565b9392505050565b60006020820190506138cf60008301846133b9565b92915050565b60006020820190506138ea60008301846133c8565b92915050565b6000602082019050818103600083015261390a8184613410565b905092915050565b6000602082019050818103600083015261392b81613449565b9050919050565b6000602082019050818103600083015261394b8161346c565b9050919050565b6000602082019050818103600083015261396b8161348f565b9050919050565b6000602082019050818103600083015261398b816134b2565b9050919050565b600060208201905081810360008301526139ab816134d5565b9050919050565b600060208201905081810360008301526139cb816134f8565b9050919050565b600060208201905081810360008301526139eb8161351b565b9050919050565b60006020820190508181036000830152613a0b8161353e565b9050919050565b60006020820190508181036000830152613a2b81613561565b9050919050565b60006020820190508181036000830152613a4b81613584565b9050919050565b60006020820190508181036000830152613a6b816135a7565b9050919050565b60006020820190508181036000830152613a8b816135ca565b9050919050565b60006020820190508181036000830152613aab816135ed565b9050919050565b60006020820190508181036000830152613acb81613610565b9050919050565b60006020820190508181036000830152613aeb81613633565b9050919050565b60006020820190508181036000830152613b0b81613679565b9050919050565b60006020820190508181036000830152613b2b8161369c565b9050919050565b60006020820190508181036000830152613b4b816136bf565b9050919050565b60006020820190508181036000830152613b6b816136e2565b9050919050565b60006020820190508181036000830152613b8b81613705565b9050919050565b60006020820190508181036000830152613bab81613728565b9050919050565b60006020820190508181036000830152613bcb8161374b565b9050919050565b60006020820190508181036000830152613beb8161376e565b9050919050565b60006020820190508181036000830152613c0b81613791565b9050919050565b6000602082019050613c2760008301846137b4565b92915050565b6000613c37613c48565b9050613c438282613f33565b919050565b6000604051905090565b600067ffffffffffffffff821115613c6d57613c6c61405e565b5b613c76826140ab565b9050602081019050919050565b600067ffffffffffffffff821115613c9e57613c9d61405e565b5b613ca7826140ab565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b6000613d0282613e4f565b9150613d0d83613e4f565b9250826fffffffffffffffffffffffffffffffff03821115613d3257613d31613fd1565b5b828201905092915050565b6000613d4882613e8b565b9150613d5383613e8b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d8857613d87613fd1565b5b828201905092915050565b6000613d9e82613e4f565b9150613da983613e4f565b925082821015613dbc57613dbb613fd1565b5b828203905092915050565b6000613dd282613e8b565b9150613ddd83613e8b565b925082821015613df057613def613fd1565b5b828203905092915050565b6000613e0682613e6b565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613ec2578082015181840152602081019050613ea7565b83811115613ed1576000848401525b50505050565b6000613ee282613e8b565b91506000821415613ef657613ef5613fd1565b5b600182039050919050565b60006002820490506001821680613f1957607f821691505b60208210811415613f2d57613f2c614000565b5b50919050565b613f3c826140ab565b810181811067ffffffffffffffff82111715613f5b57613f5a61405e565b5b80604052505050565b6000613f6f82613e8b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613fa257613fa1613fd1565b5b600182019050919050565b6000613fb882613fbf565b9050919050565b6000613fca826140bc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f5472616e73666572206661696c00000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f4f6e6c7920616c6c6f77206c6973746564206164647265737365732063616e2060008201527f6d696e7400000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f45786365656473206d617820737570706c790000000000000000000000000000600082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f4d61782074776f207065722077616c6c65740000000000000000000000000000600082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4d696e74696e6720697320706175736564000000000000000000000000000000600082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b61470d81613dfb565b811461471857600080fd5b50565b61472481613e0d565b811461472f57600080fd5b50565b61473b81613e19565b811461474657600080fd5b50565b61475281613e23565b811461475d57600080fd5b50565b61476981613e8b565b811461477457600080fd5b5056fea26469706673582212201e5780d0f6e92d715930318d69025e1c4d2e3173cc148e25432fe7979d695d2864736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000001dfc000000000000000000000000000000000000000000000000000000000000001050726f6261626c79204e6f7468696e67000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002504e000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): Probably Nothing
Arg [1] : symbol (string): PN
Arg [2] : _maxSupply (uint256): 7676

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000001dfc
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000010
Arg [4] : 50726f6261626c79204e6f7468696e6700000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [6] : 504e000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

172:2796:13:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3880:358:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5544:92;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7024:200;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6602:369;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2486:92;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7842:136;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;297:25:13;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3100:721:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;366:41:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2805:161;;;:::i;:::-;;8036:151:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2368:160:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2724:75;;;:::i;:::-;;1628:247;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2642:174:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2637:81:13;;;:::i;:::-;;5374:116:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1881:266:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;240:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4289:208:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1661:101:12;;;:::i;:::-;;1029:85;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5692:96:4;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7283:269;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;413:45:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8245:300:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;894:728:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2243:119;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;267:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12517:43:4;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2153:84:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2534:97;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7610:178:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1911:198:12;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3880:358:4;4002:4;4044:25;4029:40;;;:11;:40;;;;:98;;;;4094:33;4079:48;;;:11;:48;;;;4029:98;:158;;;;4152:35;4137:50;;;:11;:50;;;;4029:158;:204;;;;4197:36;4221:11;4197:23;:36::i;:::-;4029:204;4016:217;;3880:358;;;:::o;5544:92::-;5598:13;5626:5;5619:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5544:92;:::o;7024:200::-;7092:7;7115:16;7123:7;7115;:16::i;:::-;7107:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;7195:15;:24;7211:7;7195:24;;;;;;;;;;;;;;;;;;;;;7188:31;;7024:200;;;:::o;6602:369::-;6670:13;6686:24;6702:7;6686:15;:24::i;:::-;6670:40;;6730:5;6724:11;;:2;:11;;;;6716:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;6812:5;6796:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;6821:37;6838:5;6845:12;:10;:12::i;:::-;6821:16;:37::i;:::-;6796:62;6781:150;;;;;;;;;;;;:::i;:::-;;;;;;;;;6938:28;6947:2;6951:7;6960:5;6938:8;:28::i;:::-;6664:307;6602:369;;:::o;2486:92::-;2539:7;2561:12;;2554:19;;2486:92;:::o;7842:136::-;7945:28;7955:4;7961:2;7965:7;7945:9;:28::i;:::-;7842:136;;;:::o;297:25:13:-;;;;:::o;3100:721:4:-;3205:7;3238:16;3248:5;3238:9;:16::i;:::-;3230:5;:24;3222:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;3299:22;3324:13;:11;:13::i;:::-;3299:38;;3343:19;3372:25;3421:9;3416:339;3440:14;3436:1;:18;3416:339;;;3469:31;3503:11;:14;3515:1;3503:14;;;;;;;;;;;3469:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3555:1;3529:28;;:9;:14;;;:28;;;3525:87;;3589:9;:14;;;3569:34;;3525:87;3644:5;3623:26;;:17;:26;;;3619:130;;;3680:5;3665:11;:20;3661:57;;;3706:1;3699:8;;;;;;;;;3661:57;3727:13;;;;;:::i;:::-;;;;3619:130;3461:294;3456:3;;;;;:::i;:::-;;;;3416:339;;;;3760:56;;;;;;;;;;:::i;:::-;;;;;;;;3100:721;;;;;:::o;366:41:13:-;;;;;;;;;;;;;;;;;;;;;;:::o;2805:161::-;1252:12:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2853:12:13::1;2870:7;:5;:7::i;:::-;:12;;2890:21;2870:46;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2852:64;;;2934:7;2926:33;;;;;;;;;;;;:::i;:::-;;;;;;;;;2842:124;2805:161::o:0;8036:151:4:-;8143:39;8160:4;8166:2;8170:7;8143:39;;;;;;;;;;;;:16;:39::i;:::-;8036:151;;;:::o;2368:160:13:-;2418:47;2431:12;:10;:12::i;:::-;2453:1;2457:7;2418:12;:47::i;:::-;2480:41;2487:12;:10;:12::i;:::-;2509:1;2513:7;2480:41;;;;;;;;:::i;:::-;;;;;;;;2368:160;:::o;2724:75::-;1252:12:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2786:6:13::1;;;;;;;;;;;2785:7;2776:6;;:16;;;;;;;;;;;;;;;;;;2724:75::o:0;1628:247::-;1252:12:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1748:9:13::1;;1737:7;1721:13;:11;:13::i;:::-;:23;;;;:::i;:::-;:36;;1713:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;1790:30;1800:10;1812:7;1790:9;:30::i;:::-;1835:33;1842:10;1854:13;:11;:13::i;:::-;1835:33;;;;;;;:::i;:::-;;;;;;;;1628:247:::0;;:::o;2642:174:4:-;2709:7;2740:13;:11;:13::i;:::-;2732:5;:21;2724:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;2806:5;2799:12;;2642:174;;;:::o;2637:81:13:-;1252:12:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2703:8:13::1;;;;;;;;;;;2702:9;2691:8;;:20;;;;;;;;;;;;;;;;;;2637:81::o:0;5374:116:4:-;5438:7;5460:20;5472:7;5460:11;:20::i;:::-;:25;;;5453:32;;5374:116;;;:::o;1881:266:13:-;1977:4;1993:12;2035:10;2018:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;2008:39;;;;;;1993:54;;2057:9;2069:50;2088:12;;2069:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2102:10;;2114:4;2069:18;:50::i;:::-;2057:62;;2136:4;2129:11;;;;1881:266;;;;;:::o;240:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4289:208:4:-;4353:7;4393:1;4376:19;;:5;:19;;;;4368:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;4464:12;:19;4477:5;4464:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;4456:36;;4449:43;;4289:208;;;:::o;1661:101:12:-;1252:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1725:30:::1;1752:1;1725:18;:30::i;:::-;1661:101::o:0;1029:85::-;1075:7;1101:6;;;;;;;;;;;1094:13;;1029:85;:::o;5692:96:4:-;5748:13;5776:7;5769:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5692:96;:::o;7283:269::-;7385:12;:10;:12::i;:::-;7373:24;;:8;:24;;;;7365:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;7480:8;7435:18;:32;7454:12;:10;:12::i;:::-;7435:32;;;;;;;;;;;;;;;:42;7468:8;7435:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;7528:8;7499:48;;7514:12;:10;:12::i;:::-;7499:48;;;7538:8;7499:48;;;;;;:::i;:::-;;;;;;;;7283:269;;:::o;413:45:13:-;;;;;;;;;;;;;;;;;:::o;8245:300:4:-;8376:28;8386:4;8392:2;8396:7;8376:9;:28::i;:::-;8425:48;8448:4;8454:2;8458:7;8467:5;8425:22;:48::i;:::-;8410:130;;;;;;;;;;;;:::i;:::-;;;;;;;;;8245:300;;;;:::o;894:728:13:-;1680:1:14;2259:7;;:19;;2251:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1680:1;2389:7;:18;;;;1025:9:13::1;;1014:7;998:13;:11;:13::i;:::-;:23;;;;:::i;:::-;:36;;990:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;1113:1;1085:10;:24;1096:12;:10;:12::i;:::-;1085:24;;;;;;;;;;;;;;;;1075:7;:34;;;;:::i;:::-;:39;;1067:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;1155:8;;;;;;;;;;;1147:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;1224:7;1196:10;:24;1207:12;:10;:12::i;:::-;1196:24;;;;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;;;;;1245:41;1259:12;:10;:12::i;:::-;1273;;1245:13;:41::i;:::-;:69;;;;;1291:9;:23;1301:12;:10;:12::i;:::-;1291:23;;;;;;;;;;;;;;;;;;;;;;;;;1290:24;1245:69;1242:281;;;1361:1;1333:10;:24;1344:12;:10;:12::i;:::-;1333:24;;;;;;;;;;;;;;;;:29;1330:96;;;1407:4;1381:9;:23;1391:12;:10;:12::i;:::-;1381:23;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;1330:96;1242:281;;;1465:6;;;;;;;;;;;1464:7;1456:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;1242:281;1533:32;1543:12;:10;:12::i;:::-;1557:7;1533:9;:32::i;:::-;1580:35;1587:12;:10;:12::i;:::-;1601:13;:11;:13::i;:::-;1580:35;;;;;;;:::i;:::-;;;;;;;;1637:1:14::0;2562:7;:22;;;;894:728:13;;;:::o;2243:119::-;2316:13;2348:7;2341:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2243:119;;;:::o;267:24::-;;;;:::o;12517:43:4:-;;;;:::o;2153:84:13:-;1252:12:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2226:4:13::1;2213:10;:17;;;;2153:84:::0;:::o;2534:97::-;1252:12:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2616:8:13::1;2606:7;:18;;;;;;;;;;;;:::i;:::-;;2534:97:::0;:::o;7610:178:4:-;7727:4;7748:18;:25;7767:5;7748:25;;;;;;;;;;;;;;;:35;7774:8;7748:35;;;;;;;;;;;;;;;;;;;;;;;;;7741:42;;7610:178;;;;:::o;1911:198:12:-;1252:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2019:1:::1;1999:22;;:8;:22;;;;1991:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2074:28;2093:8;2074:18;:28::i;:::-;1911:198:::0;:::o;763:155:2:-;848:4;886:25;871:40;;;:11;:40;;;;864:47;;763:155;;;:::o;8775:103:4:-;8832:4;8861:12;;8851:7;:22;8844:29;;8775:103;;;:::o;588:96:1:-;641:7;667:10;660:17;;588:96;:::o;12348:165:4:-;12467:2;12440:15;:24;12456:7;12440:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;12500:7;12496:2;12480:28;;12489:5;12480:28;;;;;;;;;;;;12348:165;;;:::o;10763:1486::-;10855:35;10893:20;10905:7;10893:11;:20::i;:::-;10855:58;;10920:22;10962:13;:18;;;10946:34;;:12;:10;:12::i;:::-;:34;;;:80;;;;11014:12;:10;:12::i;:::-;10990:36;;:20;11002:7;10990:11;:20::i;:::-;:36;;;10946:80;:140;;;;11036:50;11053:13;:18;;;11073:12;:10;:12::i;:::-;11036:16;:50::i;:::-;10946:140;10920:167;;11109:17;11094:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;11236:4;11214:26;;:13;:18;;;:26;;;11199:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;11375:43;11397:4;11403:2;11407:7;11416:1;11375:21;:43::i;:::-;11472:49;11489:1;11493:7;11502:13;:18;;;11472:8;:49::i;:::-;11558:1;11528:12;:18;11541:4;11528:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;11593:1;11565:12;:16;11578:2;11565:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;11623:43;;;;;;;;11638:2;11623:43;;;;;;11649:15;11623:43;;;;;11600:11;:20;11612:7;11600:20;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11890:19;11922:1;11912:7;:11;;;;:::i;:::-;11890:33;;11974:1;11933:43;;:11;:24;11945:11;11933:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;11929:229;;;11990:20;11998:11;11990:7;:20::i;:::-;11986:166;;;12049:94;;;;;;;;12075:13;:18;;;12049:94;;;;;;12105:13;:28;;;12049:94;;;;;12022:11;:24;12034:11;12022:24;;;;;;;;;;;:121;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11986:166;11929:229;12188:7;12184:2;12169:27;;12178:4;12169:27;;;;;;;;;;;;12202:42;12223:4;12229:2;12233:7;12242:1;12202:20;:42::i;:::-;10849:1400;;;10763:1486;;;:::o;8882:96::-;8946:27;8956:2;8960:8;8946:27;;;;;;;;;;;;:9;:27::i;:::-;8882:96;;:::o;4739:586::-;4812:21;;:::i;:::-;4851:16;4859:7;4851;:16::i;:::-;4843:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;4921:26;4968:12;4957:7;:23;4953:91;;5036:1;5021:12;5011:7;:22;;;;:::i;:::-;:26;;;;:::i;:::-;4990:47;;4953:91;5055:12;5070:7;5055:22;;5050:207;5087:18;5079:4;:26;5050:207;;5123:31;5157:11;:17;5169:4;5157:17;;;;;;;;;;;5123:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5212:1;5186:28;;:9;:14;;;:28;;;5182:69;;5233:9;5226:16;;;;;;;5182:69;5115:142;5107:6;;;;;:::i;:::-;;;;5050:207;;;;5263:57;;;;;;;;;;:::i;:::-;;;;;;;;4739:586;;;;:::o;1154:184:11:-;1275:4;1327;1298:25;1311:5;1318:4;1298:12;:25::i;:::-;:33;1291:40;;1154:184;;;;;:::o;2263:187:12:-;2336:16;2355:6;;;;;;;;;;;2336:25;;2380:8;2371:6;;:17;;;;;;;;;;;;;;;;;;2434:8;2403:40;;2424:8;2403:40;;;;;;;;;;;;2326:124;2263:187;:::o;14018:667:4:-;14150:4;14166:15;:2;:13;;;:15::i;:::-;14162:519;;;14219:2;14203:36;;;14240:12;:10;:12::i;:::-;14254:4;14260:7;14269:5;14203:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;14191:452;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14447:1;14430:6;:13;:18;14426:209;;;14462:61;;;;;;;;;;:::i;:::-;;;;;;;;14426:209;14605:6;14599:13;14590:6;14586:2;14582:15;14575:38;14191:452;14333:45;;;14323:55;;;:6;:55;;;;14316:62;;;;;14162:519;14670:4;14663:11;;14018:667;;;;;;;:::o;15133:136::-;;;;;:::o;15641:135::-;;;;;:::o;9304:1239::-;9404:20;9427:12;;9404:35;;9467:1;9453:16;;:2;:16;;;;9445:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;9642:21;9650:12;9642:7;:21::i;:::-;9641:22;9633:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;9723:12;9711:8;:24;;9703:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;9781:61;9811:1;9815:2;9819:12;9833:8;9781:21;:61::i;:::-;9849:30;9882:12;:16;9895:2;9882:16;;;;;;;;;;;;;;;9849:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9923:116;;;;;;;;9972:8;9942:11;:19;;;:39;;;;:::i;:::-;9923:116;;;;;;10024:8;9989:11;:24;;;:44;;;;:::i;:::-;9923:116;;;;;9904:12;:16;9917:2;9904:16;;;;;;;;;;;;;;;:135;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10073:43;;;;;;;;10088:2;10073:43;;;;;;10099:15;10073:43;;;;;10045:11;:25;10057:12;10045:25;;;;;;;;;;;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10123:20;10146:12;10123:35;;10170:9;10165:274;10189:8;10185:1;:12;10165:274;;;10242:12;10238:2;10217:38;;10234:1;10217:38;;;;;;;;;;;;10280:59;10311:1;10315:2;10319:12;10333:5;10280:22;:59::i;:::-;10263:147;;;;;;;;;;;;:::i;:::-;;;;;;;;;10418:14;;;;;:::i;:::-;;;;10199:3;;;;;:::i;:::-;;;;10165:274;;;;10460:12;10445;:27;;;;10478:60;10507:1;10511:2;10515:12;10529:8;10478:20;:60::i;:::-;9398:1145;;;9304:1239;;;:::o;1689:662:11:-;1772:7;1791:20;1814:4;1791:27;;1833:9;1828:488;1852:5;:12;1848:1;:16;1828:488;;;1885:20;1908:5;1914:1;1908:8;;;;;;;;:::i;:::-;;;;;;;;1885:31;;1950:12;1934;:28;1930:376;;2075:42;2090:12;2104;2075:14;:42::i;:::-;2060:57;;1930:376;;;2249:42;2264:12;2278;2249:14;:42::i;:::-;2234:57;;1930:376;1871:445;1866:3;;;;;:::i;:::-;;;;1828:488;;;;2332:12;2325:19;;;1689:662;;;;:::o;718:413:0:-;778:4;981:12;1090:7;1078:20;1070:28;;1123:1;1116:4;:8;1109:15;;;718:413;;;:::o;2357:218:11:-;2425:13;2486:1;2480:4;2473:15;2514:1;2508:4;2501:15;2554:4;2548;2538:21;2529:30;;2357:218;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:16:-;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:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1577:133::-;1620:5;1658:6;1645:20;1636:29;;1674:30;1698:5;1674:30;:::i;:::-;1577:133;;;;:::o;1716:139::-;1762:5;1800:6;1787:20;1778:29;;1816:33;1843:5;1816:33;:::i;:::-;1716:139;;;;:::o;1861:137::-;1906:5;1944:6;1931:20;1922:29;;1960:32;1986:5;1960:32;:::i;:::-;1861:137;;;;:::o;2004:141::-;2060:5;2091:6;2085:13;2076:22;;2107:32;2133:5;2107:32;:::i;:::-;2004:141;;;;:::o;2164:338::-;2219:5;2268:3;2261:4;2253:6;2249:17;2245:27;2235:122;;2276:79;;:::i;:::-;2235:122;2393:6;2380:20;2418:78;2492:3;2484:6;2477:4;2469:6;2465:17;2418:78;:::i;:::-;2409:87;;2225:277;2164:338;;;;:::o;2522:340::-;2578:5;2627:3;2620:4;2612:6;2608:17;2604:27;2594:122;;2635:79;;:::i;:::-;2594:122;2752:6;2739:20;2777:79;2852:3;2844:6;2837:4;2829:6;2825:17;2777:79;:::i;:::-;2768:88;;2584:278;2522:340;;;;:::o;2868:139::-;2914:5;2952:6;2939:20;2930:29;;2968:33;2995:5;2968:33;:::i;:::-;2868:139;;;;:::o;3013:329::-;3072:6;3121:2;3109:9;3100:7;3096:23;3092:32;3089:119;;;3127:79;;:::i;:::-;3089:119;3247:1;3272:53;3317:7;3308:6;3297:9;3293:22;3272:53;:::i;:::-;3262:63;;3218:117;3013:329;;;;:::o;3348:474::-;3416:6;3424;3473:2;3461:9;3452:7;3448:23;3444:32;3441:119;;;3479:79;;:::i;:::-;3441:119;3599:1;3624:53;3669:7;3660:6;3649:9;3645:22;3624:53;:::i;:::-;3614:63;;3570:117;3726:2;3752:53;3797:7;3788:6;3777:9;3773:22;3752:53;:::i;:::-;3742:63;;3697:118;3348:474;;;;;:::o;3828:619::-;3905:6;3913;3921;3970:2;3958:9;3949:7;3945:23;3941:32;3938:119;;;3976:79;;:::i;:::-;3938:119;4096:1;4121:53;4166:7;4157:6;4146:9;4142:22;4121:53;:::i;:::-;4111:63;;4067:117;4223:2;4249:53;4294:7;4285:6;4274:9;4270:22;4249:53;:::i;:::-;4239:63;;4194:118;4351:2;4377:53;4422:7;4413:6;4402:9;4398:22;4377:53;:::i;:::-;4367:63;;4322:118;3828:619;;;;;:::o;4453:943::-;4548:6;4556;4564;4572;4621:3;4609:9;4600:7;4596:23;4592:33;4589:120;;;4628:79;;:::i;:::-;4589:120;4748:1;4773:53;4818:7;4809:6;4798:9;4794:22;4773:53;:::i;:::-;4763:63;;4719:117;4875:2;4901:53;4946:7;4937:6;4926:9;4922:22;4901:53;:::i;:::-;4891:63;;4846:118;5003:2;5029:53;5074:7;5065:6;5054:9;5050:22;5029:53;:::i;:::-;5019:63;;4974:118;5159:2;5148:9;5144:18;5131:32;5190:18;5182:6;5179:30;5176:117;;;5212:79;;:::i;:::-;5176:117;5317:62;5371:7;5362:6;5351:9;5347:22;5317:62;:::i;:::-;5307:72;;5102:287;4453:943;;;;;;;:::o;5402:704::-;5497:6;5505;5513;5562:2;5550:9;5541:7;5537:23;5533:32;5530:119;;;5568:79;;:::i;:::-;5530:119;5688:1;5713:53;5758:7;5749:6;5738:9;5734:22;5713:53;:::i;:::-;5703:63;;5659:117;5843:2;5832:9;5828:18;5815:32;5874:18;5866:6;5863:30;5860:117;;;5896:79;;:::i;:::-;5860:117;6009:80;6081:7;6072:6;6061:9;6057:22;6009:80;:::i;:::-;5991:98;;;;5786:313;5402:704;;;;;:::o;6112:468::-;6177:6;6185;6234:2;6222:9;6213:7;6209:23;6205:32;6202:119;;;6240:79;;:::i;:::-;6202:119;6360:1;6385:53;6430:7;6421:6;6410:9;6406:22;6385:53;:::i;:::-;6375:63;;6331:117;6487:2;6513:50;6555:7;6546:6;6535:9;6531:22;6513:50;:::i;:::-;6503:60;;6458:115;6112:468;;;;;:::o;6586:474::-;6654:6;6662;6711:2;6699:9;6690:7;6686:23;6682:32;6679:119;;;6717:79;;:::i;:::-;6679:119;6837:1;6862:53;6907:7;6898:6;6887:9;6883:22;6862:53;:::i;:::-;6852:63;;6808:117;6964:2;6990:53;7035:7;7026:6;7015:9;7011:22;6990:53;:::i;:::-;6980:63;;6935:118;6586:474;;;;;:::o;7066:329::-;7125:6;7174:2;7162:9;7153:7;7149:23;7145:32;7142:119;;;7180:79;;:::i;:::-;7142:119;7300:1;7325:53;7370:7;7361:6;7350:9;7346:22;7325:53;:::i;:::-;7315:63;;7271:117;7066:329;;;;:::o;7401:327::-;7459:6;7508:2;7496:9;7487:7;7483:23;7479:32;7476:119;;;7514:79;;:::i;:::-;7476:119;7634:1;7659:52;7703:7;7694:6;7683:9;7679:22;7659:52;:::i;:::-;7649:62;;7605:116;7401:327;;;;:::o;7734:349::-;7803:6;7852:2;7840:9;7831:7;7827:23;7823:32;7820:119;;;7858:79;;:::i;:::-;7820:119;7978:1;8003:63;8058:7;8049:6;8038:9;8034:22;8003:63;:::i;:::-;7993:73;;7949:127;7734:349;;;;:::o;8089:509::-;8158:6;8207:2;8195:9;8186:7;8182:23;8178:32;8175:119;;;8213:79;;:::i;:::-;8175:119;8361:1;8350:9;8346:17;8333:31;8391:18;8383:6;8380:30;8377:117;;;8413:79;;:::i;:::-;8377:117;8518:63;8573:7;8564:6;8553:9;8549:22;8518:63;:::i;:::-;8508:73;;8304:287;8089:509;;;;:::o;8604:329::-;8663:6;8712:2;8700:9;8691:7;8687:23;8683:32;8680:119;;;8718:79;;:::i;:::-;8680:119;8838:1;8863:53;8908:7;8899:6;8888:9;8884:22;8863:53;:::i;:::-;8853:63;;8809:117;8604:329;;;;:::o;8939:704::-;9034:6;9042;9050;9099:2;9087:9;9078:7;9074:23;9070:32;9067:119;;;9105:79;;:::i;:::-;9067:119;9225:1;9250:53;9295:7;9286:6;9275:9;9271:22;9250:53;:::i;:::-;9240:63;;9196:117;9380:2;9369:9;9365:18;9352:32;9411:18;9403:6;9400:30;9397:117;;;9433:79;;:::i;:::-;9397:117;9546:80;9618:7;9609:6;9598:9;9594:22;9546:80;:::i;:::-;9528:98;;;;9323:313;8939:704;;;;;:::o;9649:118::-;9736:24;9754:5;9736:24;:::i;:::-;9731:3;9724:37;9649:118;;:::o;9773:157::-;9878:45;9898:24;9916:5;9898:24;:::i;:::-;9878:45;:::i;:::-;9873:3;9866:58;9773:157;;:::o;9936:109::-;10017:21;10032:5;10017:21;:::i;:::-;10012:3;10005:34;9936:109;;:::o;10051:118::-;10138:24;10156:5;10138:24;:::i;:::-;10133:3;10126:37;10051:118;;:::o;10175:360::-;10261:3;10289:38;10321:5;10289:38;:::i;:::-;10343:70;10406:6;10401:3;10343:70;:::i;:::-;10336:77;;10422:52;10467:6;10462:3;10455:4;10448:5;10444:16;10422:52;:::i;:::-;10499:29;10521:6;10499:29;:::i;:::-;10494:3;10490:39;10483:46;;10265:270;10175:360;;;;:::o;10541:364::-;10629:3;10657:39;10690:5;10657:39;:::i;:::-;10712:71;10776:6;10771:3;10712:71;:::i;:::-;10705:78;;10792:52;10837:6;10832:3;10825:4;10818:5;10814:16;10792:52;:::i;:::-;10869:29;10891:6;10869:29;:::i;:::-;10864:3;10860:39;10853:46;;10633:272;10541:364;;;;:::o;10911:366::-;11053:3;11074:67;11138:2;11133:3;11074:67;:::i;:::-;11067:74;;11150:93;11239:3;11150:93;:::i;:::-;11268:2;11263:3;11259:12;11252:19;;10911:366;;;:::o;11283:::-;11425:3;11446:67;11510:2;11505:3;11446:67;:::i;:::-;11439:74;;11522:93;11611:3;11522:93;:::i;:::-;11640:2;11635:3;11631:12;11624:19;;11283:366;;;:::o;11655:::-;11797:3;11818:67;11882:2;11877:3;11818:67;:::i;:::-;11811:74;;11894:93;11983:3;11894:93;:::i;:::-;12012:2;12007:3;12003:12;11996:19;;11655:366;;;:::o;12027:::-;12169:3;12190:67;12254:2;12249:3;12190:67;:::i;:::-;12183:74;;12266:93;12355:3;12266:93;:::i;:::-;12384:2;12379:3;12375:12;12368:19;;12027:366;;;:::o;12399:::-;12541:3;12562:67;12626:2;12621:3;12562:67;:::i;:::-;12555:74;;12638:93;12727:3;12638:93;:::i;:::-;12756:2;12751:3;12747:12;12740:19;;12399:366;;;:::o;12771:::-;12913:3;12934:67;12998:2;12993:3;12934:67;:::i;:::-;12927:74;;13010:93;13099:3;13010:93;:::i;:::-;13128:2;13123:3;13119:12;13112:19;;12771:366;;;:::o;13143:::-;13285:3;13306:67;13370:2;13365:3;13306:67;:::i;:::-;13299:74;;13382:93;13471:3;13382:93;:::i;:::-;13500:2;13495:3;13491:12;13484:19;;13143:366;;;:::o;13515:::-;13657:3;13678:67;13742:2;13737:3;13678:67;:::i;:::-;13671:74;;13754:93;13843:3;13754:93;:::i;:::-;13872:2;13867:3;13863:12;13856:19;;13515:366;;;:::o;13887:::-;14029:3;14050:67;14114:2;14109:3;14050:67;:::i;:::-;14043:74;;14126:93;14215:3;14126:93;:::i;:::-;14244:2;14239:3;14235:12;14228:19;;13887:366;;;:::o;14259:::-;14401:3;14422:67;14486:2;14481:3;14422:67;:::i;:::-;14415:74;;14498:93;14587:3;14498:93;:::i;:::-;14616:2;14611:3;14607:12;14600:19;;14259:366;;;:::o;14631:::-;14773:3;14794:67;14858:2;14853:3;14794:67;:::i;:::-;14787:74;;14870:93;14959:3;14870:93;:::i;:::-;14988:2;14983:3;14979:12;14972:19;;14631:366;;;:::o;15003:::-;15145:3;15166:67;15230:2;15225:3;15166:67;:::i;:::-;15159:74;;15242:93;15331:3;15242:93;:::i;:::-;15360:2;15355:3;15351:12;15344:19;;15003:366;;;:::o;15375:::-;15517:3;15538:67;15602:2;15597:3;15538:67;:::i;:::-;15531:74;;15614:93;15703:3;15614:93;:::i;:::-;15732:2;15727:3;15723:12;15716:19;;15375:366;;;:::o;15747:::-;15889:3;15910:67;15974:2;15969:3;15910:67;:::i;:::-;15903:74;;15986:93;16075:3;15986:93;:::i;:::-;16104:2;16099:3;16095:12;16088:19;;15747:366;;;:::o;16119:::-;16261:3;16282:67;16346:2;16341:3;16282:67;:::i;:::-;16275:74;;16358:93;16447:3;16358:93;:::i;:::-;16476:2;16471:3;16467:12;16460:19;;16119:366;;;:::o;16491:398::-;16650:3;16671:83;16752:1;16747:3;16671:83;:::i;:::-;16664:90;;16763:93;16852:3;16763:93;:::i;:::-;16881:1;16876:3;16872:11;16865:18;;16491:398;;;:::o;16895:366::-;17037:3;17058:67;17122:2;17117:3;17058:67;:::i;:::-;17051:74;;17134:93;17223:3;17134:93;:::i;:::-;17252:2;17247:3;17243:12;17236:19;;16895:366;;;:::o;17267:::-;17409:3;17430:67;17494:2;17489:3;17430:67;:::i;:::-;17423:74;;17506:93;17595:3;17506:93;:::i;:::-;17624:2;17619:3;17615:12;17608:19;;17267:366;;;:::o;17639:::-;17781:3;17802:67;17866:2;17861:3;17802:67;:::i;:::-;17795:74;;17878:93;17967:3;17878:93;:::i;:::-;17996:2;17991:3;17987:12;17980:19;;17639:366;;;:::o;18011:::-;18153:3;18174:67;18238:2;18233:3;18174:67;:::i;:::-;18167:74;;18250:93;18339:3;18250:93;:::i;:::-;18368:2;18363:3;18359:12;18352:19;;18011:366;;;:::o;18383:::-;18525:3;18546:67;18610:2;18605:3;18546:67;:::i;:::-;18539:74;;18622:93;18711:3;18622:93;:::i;:::-;18740:2;18735:3;18731:12;18724:19;;18383:366;;;:::o;18755:::-;18897:3;18918:67;18982:2;18977:3;18918:67;:::i;:::-;18911:74;;18994:93;19083:3;18994:93;:::i;:::-;19112:2;19107:3;19103:12;19096:19;;18755:366;;;:::o;19127:::-;19269:3;19290:67;19354:2;19349:3;19290:67;:::i;:::-;19283:74;;19366:93;19455:3;19366:93;:::i;:::-;19484:2;19479:3;19475:12;19468:19;;19127:366;;;:::o;19499:::-;19641:3;19662:67;19726:2;19721:3;19662:67;:::i;:::-;19655:74;;19738:93;19827:3;19738:93;:::i;:::-;19856:2;19851:3;19847:12;19840:19;;19499:366;;;:::o;19871:::-;20013:3;20034:67;20098:2;20093:3;20034:67;:::i;:::-;20027:74;;20110:93;20199:3;20110:93;:::i;:::-;20228:2;20223:3;20219:12;20212:19;;19871:366;;;:::o;20243:118::-;20330:24;20348:5;20330:24;:::i;:::-;20325:3;20318:37;20243:118;;:::o;20367:256::-;20479:3;20494:75;20565:3;20556:6;20494:75;:::i;:::-;20594:2;20589:3;20585:12;20578:19;;20614:3;20607:10;;20367:256;;;;:::o;20629:379::-;20813:3;20835:147;20978:3;20835:147;:::i;:::-;20828:154;;20999:3;20992:10;;20629:379;;;:::o;21014:222::-;21107:4;21145:2;21134:9;21130:18;21122:26;;21158:71;21226:1;21215:9;21211:17;21202:6;21158:71;:::i;:::-;21014:222;;;;:::o;21242:442::-;21391:4;21429:2;21418:9;21414:18;21406:26;;21442:71;21510:1;21499:9;21495:17;21486:6;21442:71;:::i;:::-;21523:72;21591:2;21580:9;21576:18;21567:6;21523:72;:::i;:::-;21605;21673:2;21662:9;21658:18;21649:6;21605:72;:::i;:::-;21242:442;;;;;;:::o;21690:640::-;21885:4;21923:3;21912:9;21908:19;21900:27;;21937:71;22005:1;21994:9;21990:17;21981:6;21937:71;:::i;:::-;22018:72;22086:2;22075:9;22071:18;22062:6;22018:72;:::i;:::-;22100;22168:2;22157:9;22153:18;22144:6;22100:72;:::i;:::-;22219:9;22213:4;22209:20;22204:2;22193:9;22189:18;22182:48;22247:76;22318:4;22309:6;22247:76;:::i;:::-;22239:84;;21690:640;;;;;;;:::o;22336:332::-;22457:4;22495:2;22484:9;22480:18;22472:26;;22508:71;22576:1;22565:9;22561:17;22552:6;22508:71;:::i;:::-;22589:72;22657:2;22646:9;22642:18;22633:6;22589:72;:::i;:::-;22336:332;;;;;:::o;22674:210::-;22761:4;22799:2;22788:9;22784:18;22776:26;;22812:65;22874:1;22863:9;22859:17;22850:6;22812:65;:::i;:::-;22674:210;;;;:::o;22890:222::-;22983:4;23021:2;23010:9;23006:18;22998:26;;23034:71;23102:1;23091:9;23087:17;23078:6;23034:71;:::i;:::-;22890:222;;;;:::o;23118:313::-;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:78;23419:4;23410:6;23346:78;:::i;:::-;23338:86;;23118:313;;;;:::o;23437:419::-;23603:4;23641:2;23630:9;23626:18;23618:26;;23690:9;23684:4;23680:20;23676:1;23665:9;23661:17;23654:47;23718:131;23844:4;23718:131;:::i;:::-;23710:139;;23437:419;;;:::o;23862:::-;24028:4;24066:2;24055:9;24051:18;24043:26;;24115:9;24109:4;24105:20;24101:1;24090:9;24086:17;24079:47;24143:131;24269:4;24143:131;:::i;:::-;24135:139;;23862:419;;;:::o;24287:::-;24453:4;24491:2;24480:9;24476:18;24468:26;;24540:9;24534:4;24530:20;24526:1;24515:9;24511:17;24504:47;24568:131;24694:4;24568:131;:::i;:::-;24560:139;;24287:419;;;:::o;24712:::-;24878:4;24916:2;24905:9;24901:18;24893:26;;24965:9;24959:4;24955:20;24951:1;24940:9;24936:17;24929:47;24993:131;25119:4;24993:131;:::i;:::-;24985:139;;24712:419;;;:::o;25137:::-;25303:4;25341:2;25330:9;25326:18;25318:26;;25390:9;25384:4;25380:20;25376:1;25365:9;25361:17;25354:47;25418:131;25544:4;25418:131;:::i;:::-;25410:139;;25137:419;;;:::o;25562:::-;25728:4;25766:2;25755:9;25751:18;25743:26;;25815:9;25809:4;25805:20;25801:1;25790:9;25786:17;25779:47;25843:131;25969:4;25843:131;:::i;:::-;25835:139;;25562:419;;;:::o;25987:::-;26153:4;26191:2;26180:9;26176:18;26168:26;;26240:9;26234:4;26230:20;26226:1;26215:9;26211:17;26204:47;26268:131;26394:4;26268:131;:::i;:::-;26260:139;;25987:419;;;:::o;26412:::-;26578:4;26616:2;26605:9;26601:18;26593:26;;26665:9;26659:4;26655:20;26651:1;26640:9;26636:17;26629:47;26693:131;26819:4;26693:131;:::i;:::-;26685:139;;26412:419;;;:::o;26837:::-;27003:4;27041:2;27030:9;27026:18;27018:26;;27090:9;27084:4;27080:20;27076:1;27065:9;27061:17;27054:47;27118:131;27244:4;27118:131;:::i;:::-;27110:139;;26837:419;;;:::o;27262:::-;27428:4;27466:2;27455:9;27451:18;27443:26;;27515:9;27509:4;27505:20;27501:1;27490:9;27486:17;27479:47;27543:131;27669:4;27543:131;:::i;:::-;27535:139;;27262:419;;;:::o;27687:::-;27853:4;27891:2;27880:9;27876:18;27868:26;;27940:9;27934:4;27930:20;27926:1;27915:9;27911:17;27904:47;27968:131;28094:4;27968:131;:::i;:::-;27960:139;;27687:419;;;:::o;28112:::-;28278:4;28316:2;28305:9;28301:18;28293:26;;28365:9;28359:4;28355:20;28351:1;28340:9;28336:17;28329:47;28393:131;28519:4;28393:131;:::i;:::-;28385:139;;28112:419;;;:::o;28537:::-;28703:4;28741:2;28730:9;28726:18;28718:26;;28790:9;28784:4;28780:20;28776:1;28765:9;28761:17;28754:47;28818:131;28944:4;28818:131;:::i;:::-;28810:139;;28537:419;;;:::o;28962:::-;29128:4;29166:2;29155:9;29151:18;29143:26;;29215:9;29209:4;29205:20;29201:1;29190:9;29186:17;29179:47;29243:131;29369:4;29243:131;:::i;:::-;29235:139;;28962:419;;;:::o;29387:::-;29553:4;29591:2;29580:9;29576:18;29568:26;;29640:9;29634:4;29630:20;29626:1;29615:9;29611:17;29604:47;29668:131;29794:4;29668:131;:::i;:::-;29660:139;;29387:419;;;:::o;29812:::-;29978:4;30016:2;30005:9;30001:18;29993:26;;30065:9;30059:4;30055:20;30051:1;30040:9;30036:17;30029:47;30093:131;30219:4;30093:131;:::i;:::-;30085:139;;29812:419;;;:::o;30237:::-;30403:4;30441:2;30430:9;30426:18;30418:26;;30490:9;30484:4;30480:20;30476:1;30465:9;30461:17;30454:47;30518:131;30644:4;30518:131;:::i;:::-;30510:139;;30237:419;;;:::o;30662:::-;30828:4;30866:2;30855:9;30851:18;30843:26;;30915:9;30909:4;30905:20;30901:1;30890:9;30886:17;30879:47;30943:131;31069:4;30943:131;:::i;:::-;30935:139;;30662:419;;;:::o;31087:::-;31253:4;31291:2;31280:9;31276:18;31268:26;;31340:9;31334:4;31330:20;31326:1;31315:9;31311:17;31304:47;31368:131;31494:4;31368:131;:::i;:::-;31360:139;;31087:419;;;:::o;31512:::-;31678:4;31716:2;31705:9;31701:18;31693:26;;31765:9;31759:4;31755:20;31751:1;31740:9;31736:17;31729:47;31793:131;31919:4;31793:131;:::i;:::-;31785:139;;31512:419;;;:::o;31937:::-;32103:4;32141:2;32130:9;32126:18;32118:26;;32190:9;32184:4;32180:20;32176:1;32165:9;32161:17;32154:47;32218:131;32344:4;32218:131;:::i;:::-;32210:139;;31937:419;;;:::o;32362:::-;32528:4;32566:2;32555:9;32551:18;32543:26;;32615:9;32609:4;32605:20;32601:1;32590:9;32586:17;32579:47;32643:131;32769:4;32643:131;:::i;:::-;32635:139;;32362:419;;;:::o;32787:::-;32953:4;32991:2;32980:9;32976:18;32968:26;;33040:9;33034:4;33030:20;33026:1;33015:9;33011:17;33004:47;33068:131;33194:4;33068:131;:::i;:::-;33060:139;;32787:419;;;:::o;33212:::-;33378:4;33416:2;33405:9;33401:18;33393:26;;33465:9;33459:4;33455:20;33451:1;33440:9;33436:17;33429:47;33493:131;33619:4;33493:131;:::i;:::-;33485:139;;33212:419;;;:::o;33637:222::-;33730:4;33768:2;33757:9;33753:18;33745:26;;33781:71;33849:1;33838:9;33834:17;33825:6;33781:71;:::i;:::-;33637:222;;;;:::o;33865:129::-;33899:6;33926:20;;:::i;:::-;33916:30;;33955:33;33983:4;33975:6;33955:33;:::i;:::-;33865:129;;;:::o;34000:75::-;34033:6;34066:2;34060:9;34050:19;;34000:75;:::o;34081:307::-;34142:4;34232:18;34224:6;34221:30;34218:56;;;34254:18;;:::i;:::-;34218:56;34292:29;34314:6;34292:29;:::i;:::-;34284:37;;34376:4;34370;34366:15;34358:23;;34081:307;;;:::o;34394:308::-;34456:4;34546:18;34538:6;34535:30;34532:56;;;34568:18;;:::i;:::-;34532:56;34606:29;34628:6;34606:29;:::i;:::-;34598:37;;34690:4;34684;34680:15;34672:23;;34394:308;;;:::o;34708:98::-;34759:6;34793:5;34787:12;34777:22;;34708:98;;;:::o;34812:99::-;34864:6;34898:5;34892:12;34882:22;;34812:99;;;:::o;34917:168::-;35000:11;35034:6;35029:3;35022:19;35074:4;35069:3;35065:14;35050:29;;34917:168;;;;:::o;35091:147::-;35192:11;35229:3;35214:18;;35091:147;;;;:::o;35244:169::-;35328:11;35362:6;35357:3;35350:19;35402:4;35397:3;35393:14;35378:29;;35244:169;;;;:::o;35419:273::-;35459:3;35478:20;35496:1;35478:20;:::i;:::-;35473:25;;35512:20;35530:1;35512:20;:::i;:::-;35507:25;;35634:1;35598:34;35594:42;35591:1;35588:49;35585:75;;;35640:18;;:::i;:::-;35585:75;35684:1;35681;35677:9;35670:16;;35419:273;;;;:::o;35698:305::-;35738:3;35757:20;35775:1;35757:20;:::i;:::-;35752:25;;35791:20;35809:1;35791:20;:::i;:::-;35786:25;;35945:1;35877:66;35873:74;35870:1;35867:81;35864:107;;;35951:18;;:::i;:::-;35864:107;35995:1;35992;35988:9;35981:16;;35698:305;;;;:::o;36009:191::-;36049:4;36069:20;36087:1;36069:20;:::i;:::-;36064:25;;36103:20;36121:1;36103:20;:::i;:::-;36098:25;;36142:1;36139;36136:8;36133:34;;;36147:18;;:::i;:::-;36133:34;36192:1;36189;36185:9;36177:17;;36009:191;;;;:::o;36206:::-;36246:4;36266:20;36284:1;36266:20;:::i;:::-;36261:25;;36300:20;36318:1;36300:20;:::i;:::-;36295:25;;36339:1;36336;36333:8;36330:34;;;36344:18;;:::i;:::-;36330:34;36389:1;36386;36382:9;36374:17;;36206:191;;;;:::o;36403:96::-;36440:7;36469:24;36487:5;36469:24;:::i;:::-;36458:35;;36403:96;;;:::o;36505:90::-;36539:7;36582:5;36575:13;36568:21;36557:32;;36505:90;;;:::o;36601:77::-;36638:7;36667:5;36656:16;;36601:77;;;:::o;36684:149::-;36720:7;36760:66;36753:5;36749:78;36738:89;;36684:149;;;:::o;36839:118::-;36876:7;36916:34;36909:5;36905:46;36894:57;;36839:118;;;:::o;36963:126::-;37000:7;37040:42;37033:5;37029:54;37018:65;;36963:126;;;:::o;37095:77::-;37132:7;37161:5;37150:16;;37095:77;;;:::o;37178:154::-;37262:6;37257:3;37252;37239:30;37324:1;37315:6;37310:3;37306:16;37299:27;37178:154;;;:::o;37338:307::-;37406:1;37416:113;37430:6;37427:1;37424:13;37416:113;;;37515:1;37510:3;37506:11;37500:18;37496:1;37491:3;37487:11;37480:39;37452:2;37449:1;37445:10;37440:15;;37416:113;;;37547:6;37544:1;37541:13;37538:101;;;37627:1;37618:6;37613:3;37609:16;37602:27;37538:101;37387:258;37338:307;;;:::o;37651:171::-;37690:3;37713:24;37731:5;37713:24;:::i;:::-;37704:33;;37759:4;37752:5;37749:15;37746:41;;;37767:18;;:::i;:::-;37746:41;37814:1;37807:5;37803:13;37796:20;;37651:171;;;:::o;37828:320::-;37872:6;37909:1;37903:4;37899:12;37889:22;;37956:1;37950:4;37946:12;37977:18;37967:81;;38033:4;38025:6;38021:17;38011:27;;37967:81;38095:2;38087:6;38084:14;38064:18;38061:38;38058:84;;;38114:18;;:::i;:::-;38058:84;37879:269;37828:320;;;:::o;38154:281::-;38237:27;38259:4;38237:27;:::i;:::-;38229:6;38225:40;38367:6;38355:10;38352:22;38331:18;38319:10;38316:34;38313:62;38310:88;;;38378:18;;:::i;:::-;38310:88;38418:10;38414:2;38407:22;38197:238;38154:281;;:::o;38441:233::-;38480:3;38503:24;38521:5;38503:24;:::i;:::-;38494:33;;38549:66;38542:5;38539:77;38536:103;;;38619:18;;:::i;:::-;38536:103;38666:1;38659:5;38655:13;38648:20;;38441:233;;;:::o;38680:100::-;38719:7;38748:26;38768:5;38748:26;:::i;:::-;38737:37;;38680:100;;;:::o;38786:94::-;38825:7;38854:20;38868:5;38854:20;:::i;:::-;38843:31;;38786:94;;;:::o;38886:180::-;38934:77;38931:1;38924:88;39031:4;39028:1;39021:15;39055:4;39052:1;39045:15;39072:180;39120:77;39117:1;39110:88;39217:4;39214:1;39207:15;39241:4;39238:1;39231:15;39258:180;39306:77;39303:1;39296:88;39403:4;39400:1;39393:15;39427:4;39424:1;39417:15;39444:180;39492:77;39489:1;39482:88;39589:4;39586:1;39579:15;39613:4;39610:1;39603:15;39630:117;39739:1;39736;39729:12;39753:117;39862:1;39859;39852:12;39876:117;39985:1;39982;39975:12;39999:117;40108:1;40105;40098:12;40122:117;40231:1;40228;40221:12;40245:117;40354:1;40351;40344:12;40368:102;40409:6;40460:2;40456:7;40451:2;40444:5;40440:14;40436:28;40426:38;;40368:102;;;:::o;40476:94::-;40509:8;40557:5;40553:2;40549:14;40528:35;;40476:94;;;:::o;40576:221::-;40716:34;40712:1;40704:6;40700:14;40693:58;40785:4;40780:2;40772:6;40768:15;40761:29;40576:221;:::o;40803:163::-;40943:15;40939:1;40931:6;40927:14;40920:39;40803:163;:::o;40972:225::-;41112:34;41108:1;41100:6;41096:14;41089:58;41181:8;41176:2;41168:6;41164:15;41157:33;40972:225;:::o;41203:229::-;41343:34;41339:1;41331:6;41327:14;41320:58;41412:12;41407:2;41399:6;41395:15;41388:37;41203:229;:::o;41438:222::-;41578:34;41574:1;41566:6;41562:14;41555:58;41647:5;41642:2;41634:6;41630:15;41623:30;41438:222;:::o;41666:223::-;41806:34;41802:1;41794:6;41790:14;41783:58;41875:6;41870:2;41862:6;41858:15;41851:31;41666:223;:::o;41895:244::-;42035:34;42031:1;42023:6;42019:14;42012:58;42104:27;42099:2;42091:6;42087:15;42080:52;41895:244;:::o;42145:168::-;42285:20;42281:1;42273:6;42269:14;42262:44;42145:168;:::o;42319:230::-;42459:34;42455:1;42447:6;42443:14;42436:58;42528:13;42523:2;42515:6;42511:15;42504:38;42319:230;:::o;42555:225::-;42695:34;42691:1;42683:6;42679:14;42672:58;42764:8;42759:2;42751:6;42747:15;42740:33;42555:225;:::o;42786:182::-;42926:34;42922:1;42914:6;42910:14;42903:58;42786:182;:::o;42974:176::-;43114:28;43110:1;43102:6;43098:14;43091:52;42974:176;:::o;43156:237::-;43296:34;43292:1;43284:6;43280:14;43273:58;43365:20;43360:2;43352:6;43348:15;43341:45;43156:237;:::o;43399:168::-;43539:20;43535:1;43527:6;43523:14;43516:44;43399:168;:::o;43573:221::-;43713:34;43709:1;43701:6;43697:14;43690:58;43782:4;43777:2;43769:6;43765:15;43758:29;43573:221;:::o;43800:114::-;;:::o;43920:167::-;44060:19;44056:1;44048:6;44044:14;44037:43;43920:167;:::o;44093:238::-;44233:34;44229:1;44221:6;44217:14;44210:58;44302:21;44297:2;44289:6;44285:15;44278:46;44093:238;:::o;44337:179::-;44477:31;44473:1;44465:6;44461:14;44454:55;44337:179;:::o;44522:220::-;44662:34;44658:1;44650:6;44646:14;44639:58;44731:3;44726:2;44718:6;44714:15;44707:28;44522:220;:::o;44748:233::-;44888:34;44884:1;44876:6;44872:14;44865:58;44957:16;44952:2;44944:6;44940:15;44933:41;44748:233;:::o;44987:181::-;45127:33;45123:1;45115:6;45111:14;45104:57;44987:181;:::o;45174:234::-;45314:34;45310:1;45302:6;45298:14;45291:58;45383:17;45378:2;45370:6;45366:15;45359:42;45174:234;:::o;45414:232::-;45554:34;45550:1;45542:6;45538:14;45531:58;45623:15;45618:2;45610:6;45606:15;45599:40;45414:232;:::o;45652:221::-;45792:34;45788:1;45780:6;45776:14;45769:58;45861:4;45856:2;45848:6;45844:15;45837:29;45652:221;:::o;45879:122::-;45952:24;45970:5;45952:24;:::i;:::-;45945:5;45942:35;45932:63;;45991:1;45988;45981:12;45932:63;45879:122;:::o;46007:116::-;46077:21;46092:5;46077:21;:::i;:::-;46070:5;46067:32;46057:60;;46113:1;46110;46103:12;46057:60;46007:116;:::o;46129:122::-;46202:24;46220:5;46202:24;:::i;:::-;46195:5;46192:35;46182:63;;46241:1;46238;46231:12;46182:63;46129:122;:::o;46257:120::-;46329:23;46346:5;46329:23;:::i;:::-;46322:5;46319:34;46309:62;;46367:1;46364;46357:12;46309:62;46257:120;:::o;46383:122::-;46456:24;46474:5;46456:24;:::i;:::-;46449:5;46446:35;46436:63;;46495:1;46492;46485:12;46436:63;46383:122;:::o

Swarm Source

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