ETH Price: $2,673.58 (+10.11%)
Gas: 8 Gwei

Token

Confetti (CONFETTI)
 

Overview

Max Total Supply

235 CONFETTI

Holders

203

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
ziito.eth
0x59395D88307b4522Df0E29222720FC37e850876b
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:
Confetti

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license
File 1 of 19 : Confetti.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";
import "@openzeppelin/contracts/token/ERC1155/extensions/ERC1155Supply.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/utils/Strings.sol";

contract Confetti is ERC1155, ERC1155Supply, Ownable, ReentrancyGuard {
    using Strings for uint256;

    enum Type {
        Sketch,
        Ruby9100M,
        BAFTA_Exclusive,
        Green,
        Yellow,
        Blue,
        Red,
        Pink
    }

    uint256 public constant MAX_SUPPLY = 2222;
    uint256 public constant AMOUNT_FOR_FREEMINT = 200;
    uint256 public constant AMOUNT_FOR_MARKETING = 100;

    uint256 public numberMinted;
    uint256 public maxPerAddressForFree = 1;
    uint256 public maxPerAddressForPublic = 3;

    mapping(Type => uint256) public maxSupplyForTokenId;
    uint256 public publicSaleTime;
    bool public devMinted = false;

    mapping(address => uint256) private _count;

    string private _name;

    string private _symbol;

    address private _flowerAddress;

    mapping(uint256 => string) private _tokenURIs;

    Type[8] private _types = [
        Type.Sketch,
        Type.Ruby9100M,
        Type.BAFTA_Exclusive,
        Type.Green,
        Type.Yellow,
        Type.Blue,
        Type.Red,
        Type.Pink
    ];

    Type[] private _availableTypes = [
        Type.Green,
        Type.Yellow,
        Type.Blue,
        Type.Red,
        Type.Pink
    ];

    constructor(
        string memory name_,
        string memory symbol_,
        string memory uri_,
        uint256 publicSaleTime_
    ) ERC1155(uri_) {
        _name = name_;
        _symbol = symbol_;
        publicSaleTime = publicSaleTime_;

        maxSupplyForTokenId[Type.Sketch] = 1;
        maxSupplyForTokenId[Type.Ruby9100M] = 1;
        maxSupplyForTokenId[Type.BAFTA_Exclusive] = 20;
        maxSupplyForTokenId[Type.Green] = 440;
        maxSupplyForTokenId[Type.Yellow] = 440;
        maxSupplyForTokenId[Type.Blue] = 440;
        maxSupplyForTokenId[Type.Red] = 440;
        maxSupplyForTokenId[Type.Pink] = 440;
    }

    function _pickRandomType(uint256 lastTokenType_) private returns (uint256) {
        uint256 tokenType = uint256(
            keccak256(
                abi.encodePacked(
                    tx.origin,
                    blockhash(block.number),
                    block.timestamp,
                    lastTokenType_
                )
            )
        ) % _availableTypes.length;
        Type t = _availableTypes[tokenType];

        if (totalSupply(tokenType) >= maxSupplyForTokenId[t]) {
            for (uint i = 0; i < _availableTypes.length; i++) {
                if (_availableTypes[i] == t) {
                    _availableTypes[i] = _availableTypes[
                        _availableTypes.length - 1
                    ];
                    _availableTypes.pop();
                }
            }
            return _pickRandomType(tokenType);
        }
        return uint256(t);
    }

    function price() public view returns (uint256) {
        return
            numberMinted < AMOUNT_FOR_FREEMINT + AMOUNT_FOR_MARKETING
                ? 0
                : 0.1 ether;
    }

    function devMint(address recipient) external onlyOwner {
        require(!devMinted, "Already minted");
        require(
            numberMinted + AMOUNT_FOR_MARKETING <= MAX_SUPPLY,
            "Over max supply"
        );

        devMinted = true;

        uint256[] memory ids = new uint256[](3);
        uint256[] memory amounts = new uint256[](3);

        ids[0] = uint256(Type.Sketch);
        ids[1] = uint256(Type.Ruby9100M);
        ids[2] = uint256(Type.BAFTA_Exclusive);
        amounts[0] = maxSupplyForTokenId[Type.Sketch];
        amounts[1] = maxSupplyForTokenId[Type.Ruby9100M];
        amounts[2] = maxSupplyForTokenId[Type.BAFTA_Exclusive];

        _mintBatch(recipient, ids, amounts, "");
        numberMinted += 22;

        for (uint i = 0; i < AMOUNT_FOR_MARKETING - 22; i++) {
            uint256 tokenType = _pickRandomType(numberMinted);

            _mint(recipient, tokenType, 1, "");
            numberMinted++;
        }
    }

    function mint(uint256 quantity) external payable {
        require(msg.sender == tx.origin, "Only EOA");
        require(block.timestamp >= publicSaleTime, "Public sale has not begun yet");
        require(numberMinted + quantity <= MAX_SUPPLY, "Exceeded max supply");
        require(_count[msg.sender] == 0, "Already minted");

        uint256 cost = price() * quantity;
        require(msg.value >= cost, "Need to send more eth");

        _count[msg.sender] = quantity;
        if (price() == 0) {
            require(quantity <= maxPerAddressForFree, "Quantity to mint too high");
        } else {
            require(quantity <= maxPerAddressForPublic, "Quantity to mint too high");
        }

        for (uint i = 0; i < quantity; i++) {
            uint256 tokenType = _pickRandomType(numberMinted);
            _mint(msg.sender, tokenType, 1, "");
            numberMinted++;
        }

        if (msg.value > 0) {
            refundIfOver(cost);
        }
    }

    function refundIfOver(uint256 cost) private {
        if (msg.value > cost) {
            payable(msg.sender).transfer(msg.value - cost);
        }
    }

    function withdraw() external onlyOwner nonReentrant {
        (bool _success, ) = msg.sender.call{value: address(this).balance}("");
        require(_success, "Transfer failed");
    }

    function setURI(string memory newURI) external onlyOwner {
        _setURI(newURI);
    }

    function uri(uint256 tokenId) public view virtual override returns (string memory) {
        return bytes(super.uri(tokenId)).length > 0 ? string(abi.encodePacked(super.uri(tokenId), tokenId.toString(), '.json')) : super.uri(tokenId);
    }

    function setPublicSaleTime(uint256 publicSaleTime_) external onlyOwner {
        publicSaleTime = publicSaleTime_;
    }

    function setMaxPerAddressForFree(uint256 amount) external onlyOwner {
        maxPerAddressForFree = amount;
    }

    function setMaxPerAddressForPublic(uint256 amount) external onlyOwner {
        maxPerAddressForPublic = amount;
    }

    function name() public view returns (string memory) {
        return _name;
    }

    function symbol() public view returns (string memory) {
        return _symbol;
    }

    // The following functions are overrides required by Solidity.
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal override(ERC1155, ERC1155Supply) {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);
    }

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

File 2 of 19 : Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

File 3 of 19 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/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 Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        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 4 of 19 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

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 making 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 5 of 19 : ERC1155.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/ERC1155.sol)

pragma solidity ^0.8.0;

import "./IERC1155.sol";
import "./IERC1155Receiver.sol";
import "./extensions/IERC1155MetadataURI.sol";
import "../../utils/Address.sol";
import "../../utils/Context.sol";
import "../../utils/introspection/ERC165.sol";

/**
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using Address for address;

    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) private _balances;

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

    // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
    string private _uri;

    /**
     * @dev See {_setURI}.
     */
    constructor(string memory uri_) {
        _setURI(uri_);
    }

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

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256) public view virtual override returns (string memory) {
        return _uri;
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
        require(account != address(0), "ERC1155: address zero is not a valid owner");
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

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

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

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not token owner nor approved"
        );
        _safeTransferFrom(from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not token owner nor approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }
        _balances[id][to] += amount;

        emit TransferSingle(operator, from, to, id, amount);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
            _balances[id][to] += amount;
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
    }

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * By this mechanism, any occurrence of the `\{id\}` substring in either the
     * URI or any of the amounts in the JSON file at said URI will be replaced by
     * clients with the token type ID.
     *
     * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
     * interpreted by clients as
     * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
     * for token type ID 0x4cce0.
     *
     * See {uri}.
     *
     * Because these URIs cannot be meaningfully represented by the {URI} event,
     * this function emits no events.
     */
    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        _balances[id][to] += amount;
        emit TransferSingle(operator, address(0), to, id, amount);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `from`
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `from` must have at least `amount` tokens of token type `id`.
     */
    function _burn(
        address from,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }

        emit TransferSingle(operator, from, address(0), id, amount);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(
        address from,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        for (uint256 i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
        }

        emit TransferBatch(operator, from, address(0), ids, amounts);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits an {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC1155: setting approval status for self");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `ids` and `amounts` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    /**
     * @dev Hook that is called after any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
                if (response != IERC1155Receiver.onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (
                bytes4 response
            ) {
                if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}

File 6 of 19 : ERC1155Supply.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC1155/extensions/ERC1155Supply.sol)

pragma solidity ^0.8.0;

import "../ERC1155.sol";

/**
 * @dev Extension of ERC1155 that adds tracking of total supply per id.
 *
 * Useful for scenarios where Fungible and Non-fungible tokens have to be
 * clearly identified. Note: While a totalSupply of 1 might mean the
 * corresponding is an NFT, there is no guarantees that no other token with the
 * same id are not going to be minted.
 */
abstract contract ERC1155Supply is ERC1155 {
    mapping(uint256 => uint256) private _totalSupply;

    /**
     * @dev Total amount of tokens in with a given id.
     */
    function totalSupply(uint256 id) public view virtual returns (uint256) {
        return _totalSupply[id];
    }

    /**
     * @dev Indicates whether any token exist with a given id, or not.
     */
    function exists(uint256 id) public view virtual returns (bool) {
        return ERC1155Supply.totalSupply(id) > 0;
    }

    /**
     * @dev See {ERC1155-_beforeTokenTransfer}.
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual override {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);

        if (from == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                _totalSupply[ids[i]] += amounts[i];
            }
        }

        if (to == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                uint256 id = ids[i];
                uint256 amount = amounts[i];
                uint256 supply = _totalSupply[id];
                require(supply >= amount, "ERC1155: burn amount exceeds totalSupply");
                unchecked {
                    _totalSupply[id] = supply - amount;
                }
            }
        }
    }
}

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

pragma solidity ^0.8.0;

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

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

File 8 of 19 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

File 10 of 19 : IERC1155.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

File 11 of 19 : IERC1155Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
     * @dev Handles the receipt of a single ERC1155 token type. This function is
     * called at the end of a `safeTransferFrom` after the balance has been updated.
     *
     * NOTE: To accept the transfer, this must return
     * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     * (i.e. 0xf23a6e61, or its own function selector).
     *
     * @param operator The address which initiated the transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param id The ID of the token being transferred
     * @param value The amount of tokens being transferred
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
     */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
     * @dev Handles the receipt of a multiple ERC1155 token types. This function
     * is called at the end of a `safeBatchTransferFrom` after the balances have
     * been updated.
     *
     * NOTE: To accept the transfer(s), this must return
     * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
     * (i.e. 0xbc197c81, or its own function selector).
     *
     * @param operator The address which initiated the batch transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param ids An array containing ids of each token being transferred (order and length must match values array)
     * @param values An array containing amounts of each token being transferred (order and length must match ids array)
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
     */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

File 12 of 19 : IERC1155MetadataURI.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)

pragma solidity ^0.8.0;

import "../IERC1155.sol";

/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}

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

pragma solidity ^0.8.0;

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

File 14 of 19 : IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/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`.
     *
     * 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;

    /**
     * @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 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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

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

pragma solidity ^0.8.0;

import "../IERC721.sol";

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

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

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

File 16 of 19 : ERC721A.sol
// SPDX-License-Identifier: MIT
// Creator: Chiru Labs

pragma solidity ^0.8.0;

import '@openzeppelin/contracts/token/ERC721/IERC721.sol';
import '@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol';
import '@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol';
import '@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol';
import '@openzeppelin/contracts/utils/Address.sol';
import '@openzeppelin/contracts/utils/Context.sol';
import '@openzeppelin/contracts/utils/Strings.sol';
import '@openzeppelin/contracts/utils/introspection/ERC165.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..).
 *
 * Does not support burning tokens to address(0).
 *
 * Assumes that an owner cannot have more than the 2**128 (max value of uint128) of supply
 */
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 internal currentIndex = 0;

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

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @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(totalSupply). 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');

        for (uint256 curr = tokenId; ; 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.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    /**
     * @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:
     *
     * - `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 > 0, 'ERC721A: quantity must be greater 0');

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        unchecked {
            _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);
    }

    /**
     * @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 17 of 19 : IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

File 18 of 19 : 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 19 of 19 : Confetti_721.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/access/Ownable.sol";
import "./ERC721A.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/utils/Strings.sol"; 
import "@openzeppelin/contracts/utils/Address.sol"; 


contract Confetti721 is Ownable, ERC721A, ReentrancyGuard {
    using Strings for uint256;
    using Address for address;

    uint256 public constant MAX_SUPPLY = 2222;
    uint256 public constant START_TIME = 1665667000;  // TODO 2022-10-20 15:00 UTC
    uint256 public constant AMOUNT_FOR_FREEMINT = 200;
    uint256 public constant AMOUNT_FOR_MARKETING = 100;
    uint256 public constant MAX_PER_ADDRESS_FOR_FREE = 1; 
    uint256 public constant MAX_PER_ADDRESS_FOR_PUBLIC = 3;

    bool public devMinted = false;

    string private _baseTokenURI;

    constructor() ERC721A("Confetti", "CONFETTI") {}

    modifier mintStarted() {
        require(block.timestamp >= START_TIME, "Public sale has not begun yet");
        _;
    }

    function mintPrice() public view returns (uint256 price) {
        price = currentIndex < AMOUNT_FOR_FREEMINT + AMOUNT_FOR_MARKETING ? 0 : 0.1 ether;
    }

    function devMint(address _address) external onlyOwner {
        require(!devMinted, "Already minted");
        require(totalSupply() + AMOUNT_FOR_MARKETING < MAX_SUPPLY, "Over max supply");

        devMinted = true;
        _safeMint(_address, AMOUNT_FOR_MARKETING);
    }

    function mint(uint256 _quantity) external payable mintStarted {
        require(msg.sender == tx.origin, "Only EOA");
        require(totalSupply() + _quantity < MAX_SUPPLY, "Over max supply");
        require(_numberMinted(msg.sender) == 0, "Already minted");

        if (mintPrice() == 0) {
            require(_quantity <= MAX_PER_ADDRESS_FOR_FREE, "Quantity to mint too high");
        } else {
            require(_numberMinted(msg.sender) + _quantity <= MAX_PER_ADDRESS_FOR_PUBLIC, "Quantity to mint too high");
            require(_quantity <= MAX_PER_ADDRESS_FOR_PUBLIC, "Quantity to mint too high");
        }

        _safeMint(msg.sender, _quantity);

        if (currentIndex > AMOUNT_FOR_FREEMINT + AMOUNT_FOR_MARKETING) {
            refundIfOver(mintPrice() * _quantity);
        }
    }

    function refundIfOver(uint256 price) private {
        require(msg.value >= price, "Need to send more ETH");
        if (msg.value > price) {
            payable(msg.sender).transfer(msg.value - price);
        }
    }

    function withdraw() external onlyOwner nonReentrant {
        (bool _success, ) = msg.sender.call{value: address(this).balance}("");
        require(_success, "Transfer failed");
    }

    function numberMinted(address owner) public view returns (uint256) {
        return _numberMinted(owner);
    }

    function _baseURI() internal view virtual override returns (string memory) {
        return _baseTokenURI;
    }

    function setBaseURI(string calldata baseURI) external onlyOwner {
        _baseTokenURI = baseURI;
    }

    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())) : '';
    }
}

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"string","name":"uri_","type":"string"},{"internalType":"uint256","name":"publicSaleTime_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","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":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"AMOUNT_FOR_FREEMINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"AMOUNT_FOR_MARKETING","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"devMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerAddressForFree","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerAddressForPublic","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum Confetti.Type","name":"","type":"uint8"}],"name":"maxSupplyForTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","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":"uint256","name":"amount","type":"uint256"}],"name":"setMaxPerAddressForFree","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxPerAddressForPublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"publicSaleTime_","type":"uint256"}],"name":"setPublicSaleTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newURI","type":"string"}],"name":"setURI","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":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600160075560036008556000600b60006101000a81548160ff021916908315150217905550604051806101000160405280600060078111156200004c576200004b620008be565b5b6007811115620000615762000060620008be565b5b8152602001600160078111156200007d576200007c620008be565b5b6007811115620000925762000091620008be565b5b815260200160026007811115620000ae57620000ad620008be565b5b6007811115620000c357620000c2620008be565b5b815260200160036007811115620000df57620000de620008be565b5b6007811115620000f457620000f3620008be565b5b81526020016004600781111562000110576200010f620008be565b5b6007811115620001255762000124620008be565b5b815260200160056007811115620001415762000140620008be565b5b6007811115620001565762000155620008be565b5b815260200160066007811115620001725762000171620008be565b5b6007811115620001875762000186620008be565b5b8152602001600780811115620001a257620001a1620008be565b5b6007811115620001b757620001b6620008be565b5b8152506011906008620001cc9291906200069b565b506040518060a0016040528060036007811115620001ef57620001ee620008be565b5b6007811115620002045762000203620008be565b5b81526020016004600781111562000220576200021f620008be565b5b6007811115620002355762000234620008be565b5b815260200160056007811115620002515762000250620008be565b5b6007811115620002665762000265620008be565b5b815260200160066007811115620002825762000281620008be565b5b6007811115620002975762000296620008be565b5b8152602001600780811115620002b257620002b1620008be565b5b6007811115620002c757620002c6620008be565b5b8152506012906005620002dc9291906200074e565b50348015620002ea57600080fd5b506040516200590538038062005905833981810160405281019062000310919062000ac5565b816200032281620005b160201b60201c565b506200034362000337620005cd60201b60201c565b620005d560201b60201c565b600160058190555083600d9080519060200190620003639291906200080e565b5082600e90805190602001906200037c9291906200080e565b5080600a81905550600160096000806007811115620003a0576200039f620008be565b5b6007811115620003b557620003b4620008be565b5b81526020019081526020016000208190555060016009600060016007811115620003e457620003e3620008be565b5b6007811115620003f957620003f8620008be565b5b81526020019081526020016000208190555060146009600060026007811115620004285762000427620008be565b5b60078111156200043d576200043c620008be565b5b8152602001908152602001600020819055506101b860096000600360078111156200046d576200046c620008be565b5b6007811115620004825762000481620008be565b5b8152602001908152602001600020819055506101b86009600060046007811115620004b257620004b1620008be565b5b6007811115620004c757620004c6620008be565b5b8152602001908152602001600020819055506101b86009600060056007811115620004f757620004f6620008be565b5b60078111156200050c576200050b620008be565b5b8152602001908152602001600020819055506101b860096000600660078111156200053c576200053b620008be565b5b6007811115620005515762000550620008be565b5b8152602001908152602001600020819055506101b86009600060078081111562000580576200057f620008be565b5b6007811115620005955762000594620008be565b5b8152602001908152602001600020819055505050505062000bf9565b8060029080519060200190620005c99291906200080e565b5050565b600033905090565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b826008601f016020900481019282156200073b5791602002820160005b838211156200070a57835183826101000a81548160ff02191690836007811115620006e857620006e7620008be565b5b02179055509260200192600101602081600001049283019260010302620006b8565b8015620007395782816101000a81549060ff02191690556001016020816000010492830192600103026200070a565b505b5090506200074a91906200089f565b5090565b82805482825590600052602060002090601f01602090048101928215620007fb5791602002820160005b83821115620007ca57835183826101000a81548160ff02191690836007811115620007a857620007a7620008be565b5b0217905550926020019260010160208160000104928301926001030262000778565b8015620007f95782816101000a81549060ff0219169055600101602081600001049283019260010302620007ca565b505b5090506200080a91906200089f565b5090565b8280546200081c9062000bc3565b90600052602060002090601f0160209004810192826200084057600085556200088c565b82601f106200085b57805160ff19168380011785556200088c565b828001600101855582156200088c579182015b828111156200088b5782518255916020019190600101906200086e565b5b5090506200089b91906200089f565b5090565b5b80821115620008ba576000816000905550600101620008a0565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b62000956826200090b565b810181811067ffffffffffffffff821117156200097857620009776200091c565b5b80604052505050565b60006200098d620008ed565b90506200099b82826200094b565b919050565b600067ffffffffffffffff821115620009be57620009bd6200091c565b5b620009c9826200090b565b9050602081019050919050565b60005b83811015620009f6578082015181840152602081019050620009d9565b8381111562000a06576000848401525b50505050565b600062000a2362000a1d84620009a0565b62000981565b90508281526020810184848401111562000a425762000a4162000906565b5b62000a4f848285620009d6565b509392505050565b600082601f83011262000a6f5762000a6e62000901565b5b815162000a8184826020860162000a0c565b91505092915050565b6000819050919050565b62000a9f8162000a8a565b811462000aab57600080fd5b50565b60008151905062000abf8162000a94565b92915050565b6000806000806080858703121562000ae25762000ae1620008f7565b5b600085015167ffffffffffffffff81111562000b035762000b02620008fc565b5b62000b118782880162000a57565b945050602085015167ffffffffffffffff81111562000b355762000b34620008fc565b5b62000b438782880162000a57565b935050604085015167ffffffffffffffff81111562000b675762000b66620008fc565b5b62000b758782880162000a57565b925050606062000b888782880162000aae565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000bdc57607f821691505b6020821081141562000bf35762000bf262000b94565b5b50919050565b614cfc8062000c096000396000f3fe6080604052600436106101e25760003560e01c8063715018a611610102578063bd85b03911610095578063e985e9c511610064578063e985e9c5146106d4578063f242432a14610711578063f26fc3c61461073a578063f2fde38b14610765576101e2565b8063bd85b03914610618578063c17963e914610655578063d3fa48d81461067e578063dcefdfcf146106a9576101e2565b8063a0712d68116100d1578063a0712d681461057f578063a22cb4651461059b578063adf2131b146105c4578063ba8f4c3f146105ef576101e2565b8063715018a6146104e75780638da5cb5b146104fe57806395d89b4114610529578063a035b1fe14610554576101e2565b806332cb6b0c1161017a57806341ee05f71161014957806341ee05f71461041957806349a772b5146104425780634e1273f41461046d5780634f558e79146104aa576101e2565b806332cb6b0c1461036f578063371f13701461039a5780633b0b34a0146103c55780633ccfd60b14610402576101e2565b80630e89341c116101b65780630e89341c146102b557806311b7e5e7146102f25780632344be0a1461031b5780632eb2c2d614610346576101e2565b8062fdd58e146101e757806301ffc9a71461022457806302fe53051461026157806306fdde031461028a575b600080fd5b3480156101f357600080fd5b5061020e600480360381019061020991906130b4565b61078e565b60405161021b9190613103565b60405180910390f35b34801561023057600080fd5b5061024b60048036038101906102469190613176565b610857565b60405161025891906131be565b60405180910390f35b34801561026d57600080fd5b506102886004803603810190610283919061331f565b610869565b005b34801561029657600080fd5b5061029f61087d565b6040516102ac91906133f0565b60405180910390f35b3480156102c157600080fd5b506102dc60048036038101906102d79190613412565b61090f565b6040516102e991906133f0565b60405180910390f35b3480156102fe57600080fd5b5061031960048036038101906103149190613412565b61096a565b005b34801561032757600080fd5b5061033061097c565b60405161033d9190613103565b60405180910390f35b34801561035257600080fd5b5061036d600480360381019061036891906135a8565b610982565b005b34801561037b57600080fd5b50610384610a23565b6040516103919190613103565b60405180910390f35b3480156103a657600080fd5b506103af610a29565b6040516103bc9190613103565b60405180910390f35b3480156103d157600080fd5b506103ec60048036038101906103e7919061369c565b610a2e565b6040516103f99190613103565b60405180910390f35b34801561040e57600080fd5b50610417610a46565b005b34801561042557600080fd5b50610440600480360381019061043b91906136c9565b610b53565b005b34801561044e57600080fd5b50610457610f05565b6040516104649190613103565b60405180910390f35b34801561047957600080fd5b50610494600480360381019061048f91906137b9565b610f0b565b6040516104a191906138ef565b60405180910390f35b3480156104b657600080fd5b506104d160048036038101906104cc9190613412565b611024565b6040516104de91906131be565b60405180910390f35b3480156104f357600080fd5b506104fc611038565b005b34801561050a57600080fd5b5061051361104c565b6040516105209190613920565b60405180910390f35b34801561053557600080fd5b5061053e611076565b60405161054b91906133f0565b60405180910390f35b34801561056057600080fd5b50610569611108565b6040516105769190613103565b60405180910390f35b61059960048036038101906105949190613412565b611140565b005b3480156105a757600080fd5b506105c260048036038101906105bd9190613967565b61147f565b005b3480156105d057600080fd5b506105d9611495565b6040516105e691906131be565b60405180910390f35b3480156105fb57600080fd5b5061061660048036038101906106119190613412565b6114a8565b005b34801561062457600080fd5b5061063f600480360381019061063a9190613412565b6114ba565b60405161064c9190613103565b60405180910390f35b34801561066157600080fd5b5061067c60048036038101906106779190613412565b6114d7565b005b34801561068a57600080fd5b506106936114e9565b6040516106a09190613103565b60405180910390f35b3480156106b557600080fd5b506106be6114ef565b6040516106cb9190613103565b60405180910390f35b3480156106e057600080fd5b506106fb60048036038101906106f691906139a7565b6114f5565b60405161070891906131be565b60405180910390f35b34801561071d57600080fd5b50610738600480360381019061073391906139e7565b611589565b005b34801561074657600080fd5b5061074f61162a565b60405161075c9190613103565b60405180910390f35b34801561077157600080fd5b5061078c600480360381019061078791906136c9565b61162f565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f690613af0565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000610862826116b3565b9050919050565b610871611795565b61087a81611813565b50565b6060600d805461088c90613b3f565b80601f01602080910402602001604051908101604052809291908181526020018280546108b890613b3f565b80156109055780601f106108da57610100808354040283529160200191610905565b820191906000526020600020905b8154815290600101906020018083116108e857829003601f168201915b5050505050905090565b6060600061091c8361182d565b51116109305761092b8261182d565b610963565b6109398261182d565b610942836118c1565b604051602001610953929190613bf9565b6040516020818303038152906040525b9050919050565b610972611795565b80600a8190555050565b600a5481565b61098a611a22565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806109d057506109cf856109ca611a22565b6114f5565b5b610a0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0690613c9a565b60405180910390fd5b610a1c8585858585611a2a565b5050505050565b6108ae81565b606481565b60096020528060005260406000206000915090505481565b610a4e611795565b60026005541415610a94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8b90613d06565b60405180910390fd5b600260058190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051610ac290613d57565b60006040518083038185875af1925050503d8060008114610aff576040519150601f19603f3d011682016040523d82523d6000602084013e610b04565b606091505b5050905080610b48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3f90613db8565b60405180910390fd5b506001600581905550565b610b5b611795565b600b60009054906101000a900460ff1615610bab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba290613e24565b60405180910390fd5b6108ae6064600654610bbd9190613e73565b1115610bfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf590613f15565b60405180910390fd5b6001600b60006101000a81548160ff0219169083151502179055506000600367ffffffffffffffff811115610c3657610c356131f4565b5b604051908082528060200260200182016040528015610c645781602001602082028036833780820191505090505b5090506000600367ffffffffffffffff811115610c8457610c836131f4565b5b604051908082528060200260200182016040528015610cb25781602001602082028036833780820191505090505b50905060006007811115610cc957610cc8613f35565b5b82600081518110610cdd57610cdc613f64565b5b60200260200101818152505060016007811115610cfd57610cfc613f35565b5b82600181518110610d1157610d10613f64565b5b60200260200101818152505060026007811115610d3157610d30613f35565b5b82600281518110610d4557610d44613f64565b5b60200260200101818152505060096000806007811115610d6857610d67613f35565b5b6007811115610d7a57610d79613f35565b5b81526020019081526020016000205481600081518110610d9d57610d9c613f64565b5b6020026020010181815250506009600060016007811115610dc157610dc0613f35565b5b6007811115610dd357610dd2613f35565b5b81526020019081526020016000205481600181518110610df657610df5613f64565b5b6020026020010181815250506009600060026007811115610e1a57610e19613f35565b5b6007811115610e2c57610e2b613f35565b5b81526020019081526020016000205481600281518110610e4f57610e4e613f64565b5b602002602001018181525050610e7683838360405180602001604052806000815250611d4c565b601660066000828254610e899190613e73565b9250508190555060005b60166064610ea19190613f93565b811015610eff576000610eb5600654611f79565b9050610ed385826001604051806020016040528060008152506121be565b60066000815480929190610ee690613fc7565b9190505550508080610ef790613fc7565b915050610e93565b50505050565b60065481565b60608151835114610f51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4890614082565b60405180910390fd5b6000835167ffffffffffffffff811115610f6e57610f6d6131f4565b5b604051908082528060200260200182016040528015610f9c5781602001602082028036833780820191505090505b50905060005b845181101561101957610fe9858281518110610fc157610fc0613f64565b5b6020026020010151858381518110610fdc57610fdb613f64565b5b602002602001015161078e565b828281518110610ffc57610ffb613f64565b5b6020026020010181815250508061101290613fc7565b9050610fa2565b508091505092915050565b600080611030836114ba565b119050919050565b611040611795565b61104a600061236f565b565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600e805461108590613b3f565b80601f01602080910402602001604051908101604052809291908181526020018280546110b190613b3f565b80156110fe5780601f106110d3576101008083540402835291602001916110fe565b820191906000526020600020905b8154815290600101906020018083116110e157829003601f168201915b5050505050905090565b6000606460c86111189190613e73565b6006541061112e5767016345785d8a0000611131565b60005b67ffffffffffffffff16905090565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146111ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a5906140ee565b60405180910390fd5b600a544210156111f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ea9061415a565b60405180910390fd5b6108ae816006546112049190613e73565b1115611245576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123c906141c6565b60405180910390fd5b6000600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054146112c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112be90613e24565b60405180910390fd5b6000816112d2611108565b6112dc91906141e6565b905080341015611321576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113189061428c565b60405180910390fd5b81600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600061136f611108565b14156113bf576007548211156113ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b1906142f8565b60405180910390fd5b611405565b600854821115611404576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fb906142f8565b60405180910390fd5b5b60005b8281101561146757600061141d600654611f79565b905061143b33826001604051806020016040528060008152506121be565b6006600081548092919061144e90613fc7565b919050555050808061145f90613fc7565b915050611408565b50600034111561147b5761147a81612435565b5b5050565b61149161148a611a22565b8383612493565b5050565b600b60009054906101000a900460ff1681565b6114b0611795565b8060088190555050565b600060036000838152602001908152602001600020549050919050565b6114df611795565b8060078190555050565b60085481565b60075481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611591611a22565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806115d757506115d6856115d1611a22565b6114f5565b5b611616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160d90613c9a565b60405180910390fd5b6116238585858585612600565b5050505050565b60c881565b611637611795565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156116a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169e9061438a565b60405180910390fd5b6116b08161236f565b50565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061177e57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061178e575061178d8261289c565b5b9050919050565b61179d611a22565b73ffffffffffffffffffffffffffffffffffffffff166117bb61104c565b73ffffffffffffffffffffffffffffffffffffffff1614611811576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611808906143f6565b60405180910390fd5b565b8060029080519060200190611829929190612f69565b5050565b60606002805461183c90613b3f565b80601f016020809104026020016040519081016040528092919081815260200182805461186890613b3f565b80156118b55780601f1061188a576101008083540402835291602001916118b5565b820191906000526020600020905b81548152906001019060200180831161189857829003601f168201915b50505050509050919050565b60606000821415611909576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611a1d565b600082905060005b6000821461193b57808061192490613fc7565b915050600a826119349190614445565b9150611911565b60008167ffffffffffffffff811115611957576119566131f4565b5b6040519080825280601f01601f1916602001820160405280156119895781602001600182028036833780820191505090505b5090505b60008514611a16576001826119a29190613f93565b9150600a856119b19190614476565b60306119bd9190613e73565b60f81b8183815181106119d3576119d2613f64565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611a0f9190614445565b945061198d565b8093505050505b919050565b600033905090565b8151835114611a6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6590614519565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611ade576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad5906145ab565b60405180910390fd5b6000611ae8611a22565b9050611af8818787878787612906565b60005b8451811015611ca9576000858281518110611b1957611b18613f64565b5b602002602001015190506000858381518110611b3857611b37613f64565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611bd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd09061463d565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c8e9190613e73565b9250508190555050505080611ca290613fc7565b9050611afb565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611d2092919061465d565b60405180910390a4611d3681878787878761291c565b611d44818787878787612924565b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611dbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db390614706565b60405180910390fd5b8151835114611e00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df790614519565b60405180910390fd5b6000611e0a611a22565b9050611e1b81600087878787612906565b60005b8451811015611ed457838181518110611e3a57611e39613f64565b5b6020026020010151600080878481518110611e5857611e57613f64565b5b6020026020010151815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611eba9190613e73565b925050819055508080611ecc90613fc7565b915050611e1e565b508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611f4c92919061465d565b60405180910390a4611f638160008787878761291c565b611f7281600087878787612924565b5050505050565b6000806012805490503243404286604051602001611f9a94939291906147ba565b6040516020818303038152906040528051906020012060001c611fbd9190614476565b9050600060128281548110611fd557611fd4613f64565b5b90600052602060002090602091828204019190069054906101000a900460ff1690506009600082600781111561200e5761200d613f35565b5b60078111156120205761201f613f35565b5b815260200190815260200160002054612038836114ba565b106121a15760005b60128054905081101561218e578160078111156120605761205f613f35565b5b6012828154811061207457612073613f64565b5b90600052602060002090602091828204019190069054906101000a900460ff1660078111156120a6576120a5613f35565b5b141561217b57601260016012805490506120c09190613f93565b815481106120d1576120d0613f64565b5b90600052602060002090602091828204019190069054906101000a900460ff166012828154811061210557612104613f64565b5b90600052602060002090602091828204019190066101000a81548160ff0219169083600781111561213957612138613f35565b5b021790555060128054806121505761214f614808565b5b60019003818190600052602060002090602091828204019190066101000a81549060ff021916905590555b808061218690613fc7565b915050612040565b5061219882611f79565b925050506121b9565b8060078111156121b4576121b3613f35565b5b925050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561222e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222590614706565b60405180910390fd5b6000612238611a22565b9050600061224585612b0b565b9050600061225285612b0b565b905061226383600089858589612906565b8460008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122c29190613e73565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628989604051612340929190614837565b60405180910390a46123578360008985858961291c565b61236683600089898989612b85565b50505050505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80341115612490573373ffffffffffffffffffffffffffffffffffffffff166108fc82346124639190613f93565b9081150290604051600060405180830381858888f1935050505015801561248e573d6000803e3d6000fd5b505b50565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612502576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f9906148d2565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516125f391906131be565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612670576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612667906145ab565b60405180910390fd5b600061267a611a22565b9050600061268785612b0b565b9050600061269485612b0b565b90506126a4838989858589612906565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508581101561273b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127329061463d565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127f09190613e73565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a60405161286d929190614837565b60405180910390a4612883848a8a86868a61291c565b612891848a8a8a8a8a612b85565b505050505050505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612914868686868686612d6c565b505050505050565b505050505050565b6129438473ffffffffffffffffffffffffffffffffffffffff16612f3e565b15612b03578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401612989959493929190614947565b602060405180830381600087803b1580156129a357600080fd5b505af19250505080156129d457506040513d601f19601f820116820180604052508101906129d191906149c4565b60015b612a7a576129e06149fe565b806308c379a01415612a3d57506129f5614a20565b80612a005750612a3f565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a3491906133f0565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7190614b28565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612b01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af890614bba565b60405180910390fd5b505b505050505050565b60606000600167ffffffffffffffff811115612b2a57612b296131f4565b5b604051908082528060200260200182016040528015612b585781602001602082028036833780820191505090505b5090508281600081518110612b7057612b6f613f64565b5b60200260200101818152505080915050919050565b612ba48473ffffffffffffffffffffffffffffffffffffffff16612f3e565b15612d64578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401612bea959493929190614bda565b602060405180830381600087803b158015612c0457600080fd5b505af1925050508015612c3557506040513d601f19601f82011682018060405250810190612c3291906149c4565b60015b612cdb57612c416149fe565b806308c379a01415612c9e5750612c56614a20565b80612c615750612ca0565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9591906133f0565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cd290614b28565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612d62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5990614bba565b60405180910390fd5b505b505050505050565b612d7a868686868686612f61565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612e2c5760005b8351811015612e2a57828181518110612dce57612dcd613f64565b5b602002602001015160036000868481518110612ded57612dec613f64565b5b602002602001015181526020019081526020016000206000828254612e129190613e73565b9250508190555080612e2390613fc7565b9050612db2565b505b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612f365760005b8351811015612f34576000848281518110612e8257612e81613f64565b5b602002602001015190506000848381518110612ea157612ea0613f64565b5b6020026020010151905060006003600084815260200190815260200160002054905081811015612f06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612efd90614ca6565b60405180910390fd5b818103600360008581526020019081526020016000208190555050505080612f2d90613fc7565b9050612e64565b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050505050565b828054612f7590613b3f565b90600052602060002090601f016020900481019282612f975760008555612fde565b82601f10612fb057805160ff1916838001178555612fde565b82800160010185558215612fde579182015b82811115612fdd578251825591602001919060010190612fc2565b5b509050612feb9190612fef565b5090565b5b80821115613008576000816000905550600101612ff0565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061304b82613020565b9050919050565b61305b81613040565b811461306657600080fd5b50565b60008135905061307881613052565b92915050565b6000819050919050565b6130918161307e565b811461309c57600080fd5b50565b6000813590506130ae81613088565b92915050565b600080604083850312156130cb576130ca613016565b5b60006130d985828601613069565b92505060206130ea8582860161309f565b9150509250929050565b6130fd8161307e565b82525050565b600060208201905061311860008301846130f4565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6131538161311e565b811461315e57600080fd5b50565b6000813590506131708161314a565b92915050565b60006020828403121561318c5761318b613016565b5b600061319a84828501613161565b91505092915050565b60008115159050919050565b6131b8816131a3565b82525050565b60006020820190506131d360008301846131af565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61322c826131e3565b810181811067ffffffffffffffff8211171561324b5761324a6131f4565b5b80604052505050565b600061325e61300c565b905061326a8282613223565b919050565b600067ffffffffffffffff82111561328a576132896131f4565b5b613293826131e3565b9050602081019050919050565b82818337600083830152505050565b60006132c26132bd8461326f565b613254565b9050828152602081018484840111156132de576132dd6131de565b5b6132e98482856132a0565b509392505050565b600082601f830112613306576133056131d9565b5b81356133168482602086016132af565b91505092915050565b60006020828403121561333557613334613016565b5b600082013567ffffffffffffffff8111156133535761335261301b565b5b61335f848285016132f1565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156133a2578082015181840152602081019050613387565b838111156133b1576000848401525b50505050565b60006133c282613368565b6133cc8185613373565b93506133dc818560208601613384565b6133e5816131e3565b840191505092915050565b6000602082019050818103600083015261340a81846133b7565b905092915050565b60006020828403121561342857613427613016565b5b60006134368482850161309f565b91505092915050565b600067ffffffffffffffff82111561345a576134596131f4565b5b602082029050602081019050919050565b600080fd5b600061348361347e8461343f565b613254565b905080838252602082019050602084028301858111156134a6576134a561346b565b5b835b818110156134cf57806134bb888261309f565b8452602084019350506020810190506134a8565b5050509392505050565b600082601f8301126134ee576134ed6131d9565b5b81356134fe848260208601613470565b91505092915050565b600067ffffffffffffffff821115613522576135216131f4565b5b61352b826131e3565b9050602081019050919050565b600061354b61354684613507565b613254565b905082815260208101848484011115613567576135666131de565b5b6135728482856132a0565b509392505050565b600082601f83011261358f5761358e6131d9565b5b813561359f848260208601613538565b91505092915050565b600080600080600060a086880312156135c4576135c3613016565b5b60006135d288828901613069565b95505060206135e388828901613069565b945050604086013567ffffffffffffffff8111156136045761360361301b565b5b613610888289016134d9565b935050606086013567ffffffffffffffff8111156136315761363061301b565b5b61363d888289016134d9565b925050608086013567ffffffffffffffff81111561365e5761365d61301b565b5b61366a8882890161357a565b9150509295509295909350565b6008811061368457600080fd5b50565b60008135905061369681613677565b92915050565b6000602082840312156136b2576136b1613016565b5b60006136c084828501613687565b91505092915050565b6000602082840312156136df576136de613016565b5b60006136ed84828501613069565b91505092915050565b600067ffffffffffffffff821115613711576137106131f4565b5b602082029050602081019050919050565b6000613735613730846136f6565b613254565b905080838252602082019050602084028301858111156137585761375761346b565b5b835b81811015613781578061376d8882613069565b84526020840193505060208101905061375a565b5050509392505050565b600082601f8301126137a05761379f6131d9565b5b81356137b0848260208601613722565b91505092915050565b600080604083850312156137d0576137cf613016565b5b600083013567ffffffffffffffff8111156137ee576137ed61301b565b5b6137fa8582860161378b565b925050602083013567ffffffffffffffff81111561381b5761381a61301b565b5b613827858286016134d9565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6138668161307e565b82525050565b6000613878838361385d565b60208301905092915050565b6000602082019050919050565b600061389c82613831565b6138a6818561383c565b93506138b18361384d565b8060005b838110156138e25781516138c9888261386c565b97506138d483613884565b9250506001810190506138b5565b5085935050505092915050565b600060208201905081810360008301526139098184613891565b905092915050565b61391a81613040565b82525050565b60006020820190506139356000830184613911565b92915050565b613944816131a3565b811461394f57600080fd5b50565b6000813590506139618161393b565b92915050565b6000806040838503121561397e5761397d613016565b5b600061398c85828601613069565b925050602061399d85828601613952565b9150509250929050565b600080604083850312156139be576139bd613016565b5b60006139cc85828601613069565b92505060206139dd85828601613069565b9150509250929050565b600080600080600060a08688031215613a0357613a02613016565b5b6000613a1188828901613069565b9550506020613a2288828901613069565b9450506040613a338882890161309f565b9350506060613a448882890161309f565b925050608086013567ffffffffffffffff811115613a6557613a6461301b565b5b613a718882890161357a565b9150509295509295909350565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b6000613ada602a83613373565b9150613ae582613a7e565b604082019050919050565b60006020820190508181036000830152613b0981613acd565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613b5757607f821691505b60208210811415613b6b57613b6a613b10565b5b50919050565b600081905092915050565b6000613b8782613368565b613b918185613b71565b9350613ba1818560208601613384565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000613be3600583613b71565b9150613bee82613bad565b600582019050919050565b6000613c058285613b7c565b9150613c118284613b7c565b9150613c1c82613bd6565b91508190509392505050565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206e6f7220617070726f7665640000000000000000000000000000000000602082015250565b6000613c84602f83613373565b9150613c8f82613c28565b604082019050919050565b60006020820190508181036000830152613cb381613c77565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613cf0601f83613373565b9150613cfb82613cba565b602082019050919050565b60006020820190508181036000830152613d1f81613ce3565b9050919050565b600081905092915050565b50565b6000613d41600083613d26565b9150613d4c82613d31565b600082019050919050565b6000613d6282613d34565b9150819050919050565b7f5472616e73666572206661696c65640000000000000000000000000000000000600082015250565b6000613da2600f83613373565b9150613dad82613d6c565b602082019050919050565b60006020820190508181036000830152613dd181613d95565b9050919050565b7f416c7265616479206d696e746564000000000000000000000000000000000000600082015250565b6000613e0e600e83613373565b9150613e1982613dd8565b602082019050919050565b60006020820190508181036000830152613e3d81613e01565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613e7e8261307e565b9150613e898361307e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613ebe57613ebd613e44565b5b828201905092915050565b7f4f766572206d617820737570706c790000000000000000000000000000000000600082015250565b6000613eff600f83613373565b9150613f0a82613ec9565b602082019050919050565b60006020820190508181036000830152613f2e81613ef2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000613f9e8261307e565b9150613fa98361307e565b925082821015613fbc57613fbb613e44565b5b828203905092915050565b6000613fd28261307e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561400557614004613e44565b5b600182019050919050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b600061406c602983613373565b915061407782614010565b604082019050919050565b6000602082019050818103600083015261409b8161405f565b9050919050565b7f4f6e6c7920454f41000000000000000000000000000000000000000000000000600082015250565b60006140d8600883613373565b91506140e3826140a2565b602082019050919050565b60006020820190508181036000830152614107816140cb565b9050919050565b7f5075626c69632073616c6520686173206e6f7420626567756e20796574000000600082015250565b6000614144601d83613373565b915061414f8261410e565b602082019050919050565b6000602082019050818103600083015261417381614137565b9050919050565b7f4578636565646564206d617820737570706c7900000000000000000000000000600082015250565b60006141b0601383613373565b91506141bb8261417a565b602082019050919050565b600060208201905081810360008301526141df816141a3565b9050919050565b60006141f18261307e565b91506141fc8361307e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561423557614234613e44565b5b828202905092915050565b7f4e65656420746f2073656e64206d6f7265206574680000000000000000000000600082015250565b6000614276601583613373565b915061428182614240565b602082019050919050565b600060208201905081810360008301526142a581614269565b9050919050565b7f5175616e7469747920746f206d696e7420746f6f206869676800000000000000600082015250565b60006142e2601983613373565b91506142ed826142ac565b602082019050919050565b60006020820190508181036000830152614311816142d5565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614374602683613373565b915061437f82614318565b604082019050919050565b600060208201905081810360008301526143a381614367565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006143e0602083613373565b91506143eb826143aa565b602082019050919050565b6000602082019050818103600083015261440f816143d3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006144508261307e565b915061445b8361307e565b92508261446b5761446a614416565b5b828204905092915050565b60006144818261307e565b915061448c8361307e565b92508261449c5761449b614416565b5b828206905092915050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b6000614503602883613373565b915061450e826144a7565b604082019050919050565b60006020820190508181036000830152614532816144f6565b9050919050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614595602583613373565b91506145a082614539565b604082019050919050565b600060208201905081810360008301526145c481614588565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b6000614627602a83613373565b9150614632826145cb565b604082019050919050565b600060208201905081810360008301526146568161461a565b9050919050565b600060408201905081810360008301526146778185613891565b9050818103602083015261468b8184613891565b90509392505050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006146f0602183613373565b91506146fb82614694565b604082019050919050565b6000602082019050818103600083015261471f816146e3565b9050919050565b60008160601b9050919050565b600061473e82614726565b9050919050565b600061475082614733565b9050919050565b61476861476382613040565b614745565b82525050565b6000819050919050565b6000819050919050565b61479361478e8261476e565b614778565b82525050565b6000819050919050565b6147b46147af8261307e565b614799565b82525050565b60006147c68287614757565b6014820191506147d68286614782565b6020820191506147e682856147a3565b6020820191506147f682846147a3565b60208201915081905095945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600060408201905061484c60008301856130f4565b61485960208301846130f4565b9392505050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b60006148bc602983613373565b91506148c782614860565b604082019050919050565b600060208201905081810360008301526148eb816148af565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614919826148f2565b61492381856148fd565b9350614933818560208601613384565b61493c816131e3565b840191505092915050565b600060a08201905061495c6000830188613911565b6149696020830187613911565b818103604083015261497b8186613891565b9050818103606083015261498f8185613891565b905081810360808301526149a3818461490e565b90509695505050505050565b6000815190506149be8161314a565b92915050565b6000602082840312156149da576149d9613016565b5b60006149e8848285016149af565b91505092915050565b60008160e01c9050919050565b600060033d1115614a1d5760046000803e614a1a6000516149f1565b90505b90565b600060443d1015614a3057614ab3565b614a3861300c565b60043d036004823e80513d602482011167ffffffffffffffff82111715614a60575050614ab3565b808201805167ffffffffffffffff811115614a7e5750505050614ab3565b80602083010160043d038501811115614a9b575050505050614ab3565b614aaa82602001850186613223565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b6000614b12603483613373565b9150614b1d82614ab6565b604082019050919050565b60006020820190508181036000830152614b4181614b05565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b6000614ba4602883613373565b9150614baf82614b48565b604082019050919050565b60006020820190508181036000830152614bd381614b97565b9050919050565b600060a082019050614bef6000830188613911565b614bfc6020830187613911565b614c0960408301866130f4565b614c1660608301856130f4565b8181036080830152614c28818461490e565b90509695505050505050565b7f455243313135353a206275726e20616d6f756e74206578636565647320746f7460008201527f616c537570706c79000000000000000000000000000000000000000000000000602082015250565b6000614c90602883613373565b9150614c9b82614c34565b604082019050919050565b60006020820190508181036000830152614cbf81614c83565b905091905056fea2646970667358221220df4fd199a7990b9f8522e26a452059b029af830e6171a2b61ca1eaca9e18d9a164736f6c63430008090033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000635162700000000000000000000000000000000000000000000000000000000000000008436f6e66657474690000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008434f4e46455454490000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d5075727647524777316e65543155796b734c376f72344c754573354a3658396e706933486a6f4374445442612f00000000000000000000

Deployed Bytecode

0x6080604052600436106101e25760003560e01c8063715018a611610102578063bd85b03911610095578063e985e9c511610064578063e985e9c5146106d4578063f242432a14610711578063f26fc3c61461073a578063f2fde38b14610765576101e2565b8063bd85b03914610618578063c17963e914610655578063d3fa48d81461067e578063dcefdfcf146106a9576101e2565b8063a0712d68116100d1578063a0712d681461057f578063a22cb4651461059b578063adf2131b146105c4578063ba8f4c3f146105ef576101e2565b8063715018a6146104e75780638da5cb5b146104fe57806395d89b4114610529578063a035b1fe14610554576101e2565b806332cb6b0c1161017a57806341ee05f71161014957806341ee05f71461041957806349a772b5146104425780634e1273f41461046d5780634f558e79146104aa576101e2565b806332cb6b0c1461036f578063371f13701461039a5780633b0b34a0146103c55780633ccfd60b14610402576101e2565b80630e89341c116101b65780630e89341c146102b557806311b7e5e7146102f25780632344be0a1461031b5780632eb2c2d614610346576101e2565b8062fdd58e146101e757806301ffc9a71461022457806302fe53051461026157806306fdde031461028a575b600080fd5b3480156101f357600080fd5b5061020e600480360381019061020991906130b4565b61078e565b60405161021b9190613103565b60405180910390f35b34801561023057600080fd5b5061024b60048036038101906102469190613176565b610857565b60405161025891906131be565b60405180910390f35b34801561026d57600080fd5b506102886004803603810190610283919061331f565b610869565b005b34801561029657600080fd5b5061029f61087d565b6040516102ac91906133f0565b60405180910390f35b3480156102c157600080fd5b506102dc60048036038101906102d79190613412565b61090f565b6040516102e991906133f0565b60405180910390f35b3480156102fe57600080fd5b5061031960048036038101906103149190613412565b61096a565b005b34801561032757600080fd5b5061033061097c565b60405161033d9190613103565b60405180910390f35b34801561035257600080fd5b5061036d600480360381019061036891906135a8565b610982565b005b34801561037b57600080fd5b50610384610a23565b6040516103919190613103565b60405180910390f35b3480156103a657600080fd5b506103af610a29565b6040516103bc9190613103565b60405180910390f35b3480156103d157600080fd5b506103ec60048036038101906103e7919061369c565b610a2e565b6040516103f99190613103565b60405180910390f35b34801561040e57600080fd5b50610417610a46565b005b34801561042557600080fd5b50610440600480360381019061043b91906136c9565b610b53565b005b34801561044e57600080fd5b50610457610f05565b6040516104649190613103565b60405180910390f35b34801561047957600080fd5b50610494600480360381019061048f91906137b9565b610f0b565b6040516104a191906138ef565b60405180910390f35b3480156104b657600080fd5b506104d160048036038101906104cc9190613412565b611024565b6040516104de91906131be565b60405180910390f35b3480156104f357600080fd5b506104fc611038565b005b34801561050a57600080fd5b5061051361104c565b6040516105209190613920565b60405180910390f35b34801561053557600080fd5b5061053e611076565b60405161054b91906133f0565b60405180910390f35b34801561056057600080fd5b50610569611108565b6040516105769190613103565b60405180910390f35b61059960048036038101906105949190613412565b611140565b005b3480156105a757600080fd5b506105c260048036038101906105bd9190613967565b61147f565b005b3480156105d057600080fd5b506105d9611495565b6040516105e691906131be565b60405180910390f35b3480156105fb57600080fd5b5061061660048036038101906106119190613412565b6114a8565b005b34801561062457600080fd5b5061063f600480360381019061063a9190613412565b6114ba565b60405161064c9190613103565b60405180910390f35b34801561066157600080fd5b5061067c60048036038101906106779190613412565b6114d7565b005b34801561068a57600080fd5b506106936114e9565b6040516106a09190613103565b60405180910390f35b3480156106b557600080fd5b506106be6114ef565b6040516106cb9190613103565b60405180910390f35b3480156106e057600080fd5b506106fb60048036038101906106f691906139a7565b6114f5565b60405161070891906131be565b60405180910390f35b34801561071d57600080fd5b50610738600480360381019061073391906139e7565b611589565b005b34801561074657600080fd5b5061074f61162a565b60405161075c9190613103565b60405180910390f35b34801561077157600080fd5b5061078c600480360381019061078791906136c9565b61162f565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f690613af0565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000610862826116b3565b9050919050565b610871611795565b61087a81611813565b50565b6060600d805461088c90613b3f565b80601f01602080910402602001604051908101604052809291908181526020018280546108b890613b3f565b80156109055780601f106108da57610100808354040283529160200191610905565b820191906000526020600020905b8154815290600101906020018083116108e857829003601f168201915b5050505050905090565b6060600061091c8361182d565b51116109305761092b8261182d565b610963565b6109398261182d565b610942836118c1565b604051602001610953929190613bf9565b6040516020818303038152906040525b9050919050565b610972611795565b80600a8190555050565b600a5481565b61098a611a22565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806109d057506109cf856109ca611a22565b6114f5565b5b610a0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0690613c9a565b60405180910390fd5b610a1c8585858585611a2a565b5050505050565b6108ae81565b606481565b60096020528060005260406000206000915090505481565b610a4e611795565b60026005541415610a94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8b90613d06565b60405180910390fd5b600260058190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051610ac290613d57565b60006040518083038185875af1925050503d8060008114610aff576040519150601f19603f3d011682016040523d82523d6000602084013e610b04565b606091505b5050905080610b48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3f90613db8565b60405180910390fd5b506001600581905550565b610b5b611795565b600b60009054906101000a900460ff1615610bab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba290613e24565b60405180910390fd5b6108ae6064600654610bbd9190613e73565b1115610bfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf590613f15565b60405180910390fd5b6001600b60006101000a81548160ff0219169083151502179055506000600367ffffffffffffffff811115610c3657610c356131f4565b5b604051908082528060200260200182016040528015610c645781602001602082028036833780820191505090505b5090506000600367ffffffffffffffff811115610c8457610c836131f4565b5b604051908082528060200260200182016040528015610cb25781602001602082028036833780820191505090505b50905060006007811115610cc957610cc8613f35565b5b82600081518110610cdd57610cdc613f64565b5b60200260200101818152505060016007811115610cfd57610cfc613f35565b5b82600181518110610d1157610d10613f64565b5b60200260200101818152505060026007811115610d3157610d30613f35565b5b82600281518110610d4557610d44613f64565b5b60200260200101818152505060096000806007811115610d6857610d67613f35565b5b6007811115610d7a57610d79613f35565b5b81526020019081526020016000205481600081518110610d9d57610d9c613f64565b5b6020026020010181815250506009600060016007811115610dc157610dc0613f35565b5b6007811115610dd357610dd2613f35565b5b81526020019081526020016000205481600181518110610df657610df5613f64565b5b6020026020010181815250506009600060026007811115610e1a57610e19613f35565b5b6007811115610e2c57610e2b613f35565b5b81526020019081526020016000205481600281518110610e4f57610e4e613f64565b5b602002602001018181525050610e7683838360405180602001604052806000815250611d4c565b601660066000828254610e899190613e73565b9250508190555060005b60166064610ea19190613f93565b811015610eff576000610eb5600654611f79565b9050610ed385826001604051806020016040528060008152506121be565b60066000815480929190610ee690613fc7565b9190505550508080610ef790613fc7565b915050610e93565b50505050565b60065481565b60608151835114610f51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4890614082565b60405180910390fd5b6000835167ffffffffffffffff811115610f6e57610f6d6131f4565b5b604051908082528060200260200182016040528015610f9c5781602001602082028036833780820191505090505b50905060005b845181101561101957610fe9858281518110610fc157610fc0613f64565b5b6020026020010151858381518110610fdc57610fdb613f64565b5b602002602001015161078e565b828281518110610ffc57610ffb613f64565b5b6020026020010181815250508061101290613fc7565b9050610fa2565b508091505092915050565b600080611030836114ba565b119050919050565b611040611795565b61104a600061236f565b565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600e805461108590613b3f565b80601f01602080910402602001604051908101604052809291908181526020018280546110b190613b3f565b80156110fe5780601f106110d3576101008083540402835291602001916110fe565b820191906000526020600020905b8154815290600101906020018083116110e157829003601f168201915b5050505050905090565b6000606460c86111189190613e73565b6006541061112e5767016345785d8a0000611131565b60005b67ffffffffffffffff16905090565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146111ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a5906140ee565b60405180910390fd5b600a544210156111f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ea9061415a565b60405180910390fd5b6108ae816006546112049190613e73565b1115611245576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123c906141c6565b60405180910390fd5b6000600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054146112c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112be90613e24565b60405180910390fd5b6000816112d2611108565b6112dc91906141e6565b905080341015611321576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113189061428c565b60405180910390fd5b81600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600061136f611108565b14156113bf576007548211156113ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b1906142f8565b60405180910390fd5b611405565b600854821115611404576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fb906142f8565b60405180910390fd5b5b60005b8281101561146757600061141d600654611f79565b905061143b33826001604051806020016040528060008152506121be565b6006600081548092919061144e90613fc7565b919050555050808061145f90613fc7565b915050611408565b50600034111561147b5761147a81612435565b5b5050565b61149161148a611a22565b8383612493565b5050565b600b60009054906101000a900460ff1681565b6114b0611795565b8060088190555050565b600060036000838152602001908152602001600020549050919050565b6114df611795565b8060078190555050565b60085481565b60075481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611591611a22565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806115d757506115d6856115d1611a22565b6114f5565b5b611616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160d90613c9a565b60405180910390fd5b6116238585858585612600565b5050505050565b60c881565b611637611795565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156116a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169e9061438a565b60405180910390fd5b6116b08161236f565b50565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061177e57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061178e575061178d8261289c565b5b9050919050565b61179d611a22565b73ffffffffffffffffffffffffffffffffffffffff166117bb61104c565b73ffffffffffffffffffffffffffffffffffffffff1614611811576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611808906143f6565b60405180910390fd5b565b8060029080519060200190611829929190612f69565b5050565b60606002805461183c90613b3f565b80601f016020809104026020016040519081016040528092919081815260200182805461186890613b3f565b80156118b55780601f1061188a576101008083540402835291602001916118b5565b820191906000526020600020905b81548152906001019060200180831161189857829003601f168201915b50505050509050919050565b60606000821415611909576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611a1d565b600082905060005b6000821461193b57808061192490613fc7565b915050600a826119349190614445565b9150611911565b60008167ffffffffffffffff811115611957576119566131f4565b5b6040519080825280601f01601f1916602001820160405280156119895781602001600182028036833780820191505090505b5090505b60008514611a16576001826119a29190613f93565b9150600a856119b19190614476565b60306119bd9190613e73565b60f81b8183815181106119d3576119d2613f64565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611a0f9190614445565b945061198d565b8093505050505b919050565b600033905090565b8151835114611a6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6590614519565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611ade576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad5906145ab565b60405180910390fd5b6000611ae8611a22565b9050611af8818787878787612906565b60005b8451811015611ca9576000858281518110611b1957611b18613f64565b5b602002602001015190506000858381518110611b3857611b37613f64565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611bd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd09061463d565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c8e9190613e73565b9250508190555050505080611ca290613fc7565b9050611afb565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611d2092919061465d565b60405180910390a4611d3681878787878761291c565b611d44818787878787612924565b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611dbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db390614706565b60405180910390fd5b8151835114611e00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df790614519565b60405180910390fd5b6000611e0a611a22565b9050611e1b81600087878787612906565b60005b8451811015611ed457838181518110611e3a57611e39613f64565b5b6020026020010151600080878481518110611e5857611e57613f64565b5b6020026020010151815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611eba9190613e73565b925050819055508080611ecc90613fc7565b915050611e1e565b508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611f4c92919061465d565b60405180910390a4611f638160008787878761291c565b611f7281600087878787612924565b5050505050565b6000806012805490503243404286604051602001611f9a94939291906147ba565b6040516020818303038152906040528051906020012060001c611fbd9190614476565b9050600060128281548110611fd557611fd4613f64565b5b90600052602060002090602091828204019190069054906101000a900460ff1690506009600082600781111561200e5761200d613f35565b5b60078111156120205761201f613f35565b5b815260200190815260200160002054612038836114ba565b106121a15760005b60128054905081101561218e578160078111156120605761205f613f35565b5b6012828154811061207457612073613f64565b5b90600052602060002090602091828204019190069054906101000a900460ff1660078111156120a6576120a5613f35565b5b141561217b57601260016012805490506120c09190613f93565b815481106120d1576120d0613f64565b5b90600052602060002090602091828204019190069054906101000a900460ff166012828154811061210557612104613f64565b5b90600052602060002090602091828204019190066101000a81548160ff0219169083600781111561213957612138613f35565b5b021790555060128054806121505761214f614808565b5b60019003818190600052602060002090602091828204019190066101000a81549060ff021916905590555b808061218690613fc7565b915050612040565b5061219882611f79565b925050506121b9565b8060078111156121b4576121b3613f35565b5b925050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561222e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222590614706565b60405180910390fd5b6000612238611a22565b9050600061224585612b0b565b9050600061225285612b0b565b905061226383600089858589612906565b8460008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122c29190613e73565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628989604051612340929190614837565b60405180910390a46123578360008985858961291c565b61236683600089898989612b85565b50505050505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80341115612490573373ffffffffffffffffffffffffffffffffffffffff166108fc82346124639190613f93565b9081150290604051600060405180830381858888f1935050505015801561248e573d6000803e3d6000fd5b505b50565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612502576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f9906148d2565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516125f391906131be565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612670576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612667906145ab565b60405180910390fd5b600061267a611a22565b9050600061268785612b0b565b9050600061269485612b0b565b90506126a4838989858589612906565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508581101561273b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127329061463d565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127f09190613e73565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a60405161286d929190614837565b60405180910390a4612883848a8a86868a61291c565b612891848a8a8a8a8a612b85565b505050505050505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612914868686868686612d6c565b505050505050565b505050505050565b6129438473ffffffffffffffffffffffffffffffffffffffff16612f3e565b15612b03578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401612989959493929190614947565b602060405180830381600087803b1580156129a357600080fd5b505af19250505080156129d457506040513d601f19601f820116820180604052508101906129d191906149c4565b60015b612a7a576129e06149fe565b806308c379a01415612a3d57506129f5614a20565b80612a005750612a3f565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a3491906133f0565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7190614b28565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612b01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af890614bba565b60405180910390fd5b505b505050505050565b60606000600167ffffffffffffffff811115612b2a57612b296131f4565b5b604051908082528060200260200182016040528015612b585781602001602082028036833780820191505090505b5090508281600081518110612b7057612b6f613f64565b5b60200260200101818152505080915050919050565b612ba48473ffffffffffffffffffffffffffffffffffffffff16612f3e565b15612d64578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401612bea959493929190614bda565b602060405180830381600087803b158015612c0457600080fd5b505af1925050508015612c3557506040513d601f19601f82011682018060405250810190612c3291906149c4565b60015b612cdb57612c416149fe565b806308c379a01415612c9e5750612c56614a20565b80612c615750612ca0565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9591906133f0565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cd290614b28565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612d62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5990614bba565b60405180910390fd5b505b505050505050565b612d7a868686868686612f61565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612e2c5760005b8351811015612e2a57828181518110612dce57612dcd613f64565b5b602002602001015160036000868481518110612ded57612dec613f64565b5b602002602001015181526020019081526020016000206000828254612e129190613e73565b9250508190555080612e2390613fc7565b9050612db2565b505b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612f365760005b8351811015612f34576000848281518110612e8257612e81613f64565b5b602002602001015190506000848381518110612ea157612ea0613f64565b5b6020026020010151905060006003600084815260200190815260200160002054905081811015612f06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612efd90614ca6565b60405180910390fd5b818103600360008581526020019081526020016000208190555050505080612f2d90613fc7565b9050612e64565b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050505050565b828054612f7590613b3f565b90600052602060002090601f016020900481019282612f975760008555612fde565b82601f10612fb057805160ff1916838001178555612fde565b82800160010185558215612fde579182015b82811115612fdd578251825591602001919060010190612fc2565b5b509050612feb9190612fef565b5090565b5b80821115613008576000816000905550600101612ff0565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061304b82613020565b9050919050565b61305b81613040565b811461306657600080fd5b50565b60008135905061307881613052565b92915050565b6000819050919050565b6130918161307e565b811461309c57600080fd5b50565b6000813590506130ae81613088565b92915050565b600080604083850312156130cb576130ca613016565b5b60006130d985828601613069565b92505060206130ea8582860161309f565b9150509250929050565b6130fd8161307e565b82525050565b600060208201905061311860008301846130f4565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6131538161311e565b811461315e57600080fd5b50565b6000813590506131708161314a565b92915050565b60006020828403121561318c5761318b613016565b5b600061319a84828501613161565b91505092915050565b60008115159050919050565b6131b8816131a3565b82525050565b60006020820190506131d360008301846131af565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61322c826131e3565b810181811067ffffffffffffffff8211171561324b5761324a6131f4565b5b80604052505050565b600061325e61300c565b905061326a8282613223565b919050565b600067ffffffffffffffff82111561328a576132896131f4565b5b613293826131e3565b9050602081019050919050565b82818337600083830152505050565b60006132c26132bd8461326f565b613254565b9050828152602081018484840111156132de576132dd6131de565b5b6132e98482856132a0565b509392505050565b600082601f830112613306576133056131d9565b5b81356133168482602086016132af565b91505092915050565b60006020828403121561333557613334613016565b5b600082013567ffffffffffffffff8111156133535761335261301b565b5b61335f848285016132f1565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156133a2578082015181840152602081019050613387565b838111156133b1576000848401525b50505050565b60006133c282613368565b6133cc8185613373565b93506133dc818560208601613384565b6133e5816131e3565b840191505092915050565b6000602082019050818103600083015261340a81846133b7565b905092915050565b60006020828403121561342857613427613016565b5b60006134368482850161309f565b91505092915050565b600067ffffffffffffffff82111561345a576134596131f4565b5b602082029050602081019050919050565b600080fd5b600061348361347e8461343f565b613254565b905080838252602082019050602084028301858111156134a6576134a561346b565b5b835b818110156134cf57806134bb888261309f565b8452602084019350506020810190506134a8565b5050509392505050565b600082601f8301126134ee576134ed6131d9565b5b81356134fe848260208601613470565b91505092915050565b600067ffffffffffffffff821115613522576135216131f4565b5b61352b826131e3565b9050602081019050919050565b600061354b61354684613507565b613254565b905082815260208101848484011115613567576135666131de565b5b6135728482856132a0565b509392505050565b600082601f83011261358f5761358e6131d9565b5b813561359f848260208601613538565b91505092915050565b600080600080600060a086880312156135c4576135c3613016565b5b60006135d288828901613069565b95505060206135e388828901613069565b945050604086013567ffffffffffffffff8111156136045761360361301b565b5b613610888289016134d9565b935050606086013567ffffffffffffffff8111156136315761363061301b565b5b61363d888289016134d9565b925050608086013567ffffffffffffffff81111561365e5761365d61301b565b5b61366a8882890161357a565b9150509295509295909350565b6008811061368457600080fd5b50565b60008135905061369681613677565b92915050565b6000602082840312156136b2576136b1613016565b5b60006136c084828501613687565b91505092915050565b6000602082840312156136df576136de613016565b5b60006136ed84828501613069565b91505092915050565b600067ffffffffffffffff821115613711576137106131f4565b5b602082029050602081019050919050565b6000613735613730846136f6565b613254565b905080838252602082019050602084028301858111156137585761375761346b565b5b835b81811015613781578061376d8882613069565b84526020840193505060208101905061375a565b5050509392505050565b600082601f8301126137a05761379f6131d9565b5b81356137b0848260208601613722565b91505092915050565b600080604083850312156137d0576137cf613016565b5b600083013567ffffffffffffffff8111156137ee576137ed61301b565b5b6137fa8582860161378b565b925050602083013567ffffffffffffffff81111561381b5761381a61301b565b5b613827858286016134d9565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6138668161307e565b82525050565b6000613878838361385d565b60208301905092915050565b6000602082019050919050565b600061389c82613831565b6138a6818561383c565b93506138b18361384d565b8060005b838110156138e25781516138c9888261386c565b97506138d483613884565b9250506001810190506138b5565b5085935050505092915050565b600060208201905081810360008301526139098184613891565b905092915050565b61391a81613040565b82525050565b60006020820190506139356000830184613911565b92915050565b613944816131a3565b811461394f57600080fd5b50565b6000813590506139618161393b565b92915050565b6000806040838503121561397e5761397d613016565b5b600061398c85828601613069565b925050602061399d85828601613952565b9150509250929050565b600080604083850312156139be576139bd613016565b5b60006139cc85828601613069565b92505060206139dd85828601613069565b9150509250929050565b600080600080600060a08688031215613a0357613a02613016565b5b6000613a1188828901613069565b9550506020613a2288828901613069565b9450506040613a338882890161309f565b9350506060613a448882890161309f565b925050608086013567ffffffffffffffff811115613a6557613a6461301b565b5b613a718882890161357a565b9150509295509295909350565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b6000613ada602a83613373565b9150613ae582613a7e565b604082019050919050565b60006020820190508181036000830152613b0981613acd565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613b5757607f821691505b60208210811415613b6b57613b6a613b10565b5b50919050565b600081905092915050565b6000613b8782613368565b613b918185613b71565b9350613ba1818560208601613384565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000613be3600583613b71565b9150613bee82613bad565b600582019050919050565b6000613c058285613b7c565b9150613c118284613b7c565b9150613c1c82613bd6565b91508190509392505050565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206e6f7220617070726f7665640000000000000000000000000000000000602082015250565b6000613c84602f83613373565b9150613c8f82613c28565b604082019050919050565b60006020820190508181036000830152613cb381613c77565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613cf0601f83613373565b9150613cfb82613cba565b602082019050919050565b60006020820190508181036000830152613d1f81613ce3565b9050919050565b600081905092915050565b50565b6000613d41600083613d26565b9150613d4c82613d31565b600082019050919050565b6000613d6282613d34565b9150819050919050565b7f5472616e73666572206661696c65640000000000000000000000000000000000600082015250565b6000613da2600f83613373565b9150613dad82613d6c565b602082019050919050565b60006020820190508181036000830152613dd181613d95565b9050919050565b7f416c7265616479206d696e746564000000000000000000000000000000000000600082015250565b6000613e0e600e83613373565b9150613e1982613dd8565b602082019050919050565b60006020820190508181036000830152613e3d81613e01565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613e7e8261307e565b9150613e898361307e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613ebe57613ebd613e44565b5b828201905092915050565b7f4f766572206d617820737570706c790000000000000000000000000000000000600082015250565b6000613eff600f83613373565b9150613f0a82613ec9565b602082019050919050565b60006020820190508181036000830152613f2e81613ef2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000613f9e8261307e565b9150613fa98361307e565b925082821015613fbc57613fbb613e44565b5b828203905092915050565b6000613fd28261307e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561400557614004613e44565b5b600182019050919050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b600061406c602983613373565b915061407782614010565b604082019050919050565b6000602082019050818103600083015261409b8161405f565b9050919050565b7f4f6e6c7920454f41000000000000000000000000000000000000000000000000600082015250565b60006140d8600883613373565b91506140e3826140a2565b602082019050919050565b60006020820190508181036000830152614107816140cb565b9050919050565b7f5075626c69632073616c6520686173206e6f7420626567756e20796574000000600082015250565b6000614144601d83613373565b915061414f8261410e565b602082019050919050565b6000602082019050818103600083015261417381614137565b9050919050565b7f4578636565646564206d617820737570706c7900000000000000000000000000600082015250565b60006141b0601383613373565b91506141bb8261417a565b602082019050919050565b600060208201905081810360008301526141df816141a3565b9050919050565b60006141f18261307e565b91506141fc8361307e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561423557614234613e44565b5b828202905092915050565b7f4e65656420746f2073656e64206d6f7265206574680000000000000000000000600082015250565b6000614276601583613373565b915061428182614240565b602082019050919050565b600060208201905081810360008301526142a581614269565b9050919050565b7f5175616e7469747920746f206d696e7420746f6f206869676800000000000000600082015250565b60006142e2601983613373565b91506142ed826142ac565b602082019050919050565b60006020820190508181036000830152614311816142d5565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614374602683613373565b915061437f82614318565b604082019050919050565b600060208201905081810360008301526143a381614367565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006143e0602083613373565b91506143eb826143aa565b602082019050919050565b6000602082019050818103600083015261440f816143d3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006144508261307e565b915061445b8361307e565b92508261446b5761446a614416565b5b828204905092915050565b60006144818261307e565b915061448c8361307e565b92508261449c5761449b614416565b5b828206905092915050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b6000614503602883613373565b915061450e826144a7565b604082019050919050565b60006020820190508181036000830152614532816144f6565b9050919050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614595602583613373565b91506145a082614539565b604082019050919050565b600060208201905081810360008301526145c481614588565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b6000614627602a83613373565b9150614632826145cb565b604082019050919050565b600060208201905081810360008301526146568161461a565b9050919050565b600060408201905081810360008301526146778185613891565b9050818103602083015261468b8184613891565b90509392505050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006146f0602183613373565b91506146fb82614694565b604082019050919050565b6000602082019050818103600083015261471f816146e3565b9050919050565b60008160601b9050919050565b600061473e82614726565b9050919050565b600061475082614733565b9050919050565b61476861476382613040565b614745565b82525050565b6000819050919050565b6000819050919050565b61479361478e8261476e565b614778565b82525050565b6000819050919050565b6147b46147af8261307e565b614799565b82525050565b60006147c68287614757565b6014820191506147d68286614782565b6020820191506147e682856147a3565b6020820191506147f682846147a3565b60208201915081905095945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600060408201905061484c60008301856130f4565b61485960208301846130f4565b9392505050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b60006148bc602983613373565b91506148c782614860565b604082019050919050565b600060208201905081810360008301526148eb816148af565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614919826148f2565b61492381856148fd565b9350614933818560208601613384565b61493c816131e3565b840191505092915050565b600060a08201905061495c6000830188613911565b6149696020830187613911565b818103604083015261497b8186613891565b9050818103606083015261498f8185613891565b905081810360808301526149a3818461490e565b90509695505050505050565b6000815190506149be8161314a565b92915050565b6000602082840312156149da576149d9613016565b5b60006149e8848285016149af565b91505092915050565b60008160e01c9050919050565b600060033d1115614a1d5760046000803e614a1a6000516149f1565b90505b90565b600060443d1015614a3057614ab3565b614a3861300c565b60043d036004823e80513d602482011167ffffffffffffffff82111715614a60575050614ab3565b808201805167ffffffffffffffff811115614a7e5750505050614ab3565b80602083010160043d038501811115614a9b575050505050614ab3565b614aaa82602001850186613223565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b6000614b12603483613373565b9150614b1d82614ab6565b604082019050919050565b60006020820190508181036000830152614b4181614b05565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b6000614ba4602883613373565b9150614baf82614b48565b604082019050919050565b60006020820190508181036000830152614bd381614b97565b9050919050565b600060a082019050614bef6000830188613911565b614bfc6020830187613911565b614c0960408301866130f4565b614c1660608301856130f4565b8181036080830152614c28818461490e565b90509695505050505050565b7f455243313135353a206275726e20616d6f756e74206578636565647320746f7460008201527f616c537570706c79000000000000000000000000000000000000000000000000602082015250565b6000614c90602883613373565b9150614c9b82614c34565b604082019050919050565b60006020820190508181036000830152614cbf81614c83565b905091905056fea2646970667358221220df4fd199a7990b9f8522e26a452059b029af830e6171a2b61ca1eaca9e18d9a164736f6c63430008090033

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

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000635162700000000000000000000000000000000000000000000000000000000000000008436f6e66657474690000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008434f4e46455454490000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d5075727647524777316e65543155796b734c376f72344c754573354a3658396e706933486a6f4374445442612f00000000000000000000

-----Decoded View---------------
Arg [0] : name_ (string): Confetti
Arg [1] : symbol_ (string): CONFETTI
Arg [2] : uri_ (string): ipfs://QmPurvGRGw1neT1UyksL7or4LuEs5J6X9npi3HjoCtDTBa/
Arg [3] : publicSaleTime_ (uint256): 1666278000

-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 0000000000000000000000000000000000000000000000000000000063516270
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [5] : 436f6e6665747469000000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [7] : 434f4e4645545449000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [9] : 697066733a2f2f516d5075727647524777316e65543155796b734c376f72344c
Arg [10] : 754573354a3658396e706933486a6f4374445442612f00000000000000000000


Deployed Bytecode Sourcemap

363:6733:16:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2185:227:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6906:188:16;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5624:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6335:81;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5719:240;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5965:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;967:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4065:427:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;625:41:16;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;727:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;910:51;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5434:184;;;;;;;;;;;;;:::i;:::-;;3331:959;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;784:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2569:508:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;901:120:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1831:101:0;;;;;;;;;;;;;:::i;:::-;;1201:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6422::16;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3137:188;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4296:973;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3145:153:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1002:29:16;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6211:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;697:111:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6091:114:16;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;862:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;817:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3365:166:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3598:395;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;672:49:16;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2081:198:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2185:227:2;2271:7;2317:1;2298:21;;:7;:21;;;;2290:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;2383:9;:13;2393:2;2383:13;;;;;;;;;;;:22;2397:7;2383:22;;;;;;;;;;;;;;;;2376:29;;2185:227;;;;:::o;6906:188:16:-;7024:4;7051:36;7075:11;7051:23;:36::i;:::-;7044:43;;6906:188;;;:::o;5624:89::-;1094:13:0;:11;:13::i;:::-;5691:15:16::1;5699:6;5691:7;:15::i;:::-;5624:89:::0;:::o;6335:81::-;6372:13;6404:5;6397:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6335:81;:::o;5719:240::-;5787:13;5854:1;5825:18;5835:7;5825:9;:18::i;:::-;5819:32;:36;:133;;5934:18;5944:7;5934:9;:18::i;:::-;5819:133;;;5882:18;5892:7;5882:9;:18::i;:::-;5902;:7;:16;:18::i;:::-;5865:65;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5819:133;5812:140;;5719:240;;;:::o;5965:120::-;1094:13:0;:11;:13::i;:::-;6063:15:16::1;6046:14;:32;;;;5965:120:::0;:::o;967:29::-;;;;:::o;4065:427:2:-;4298:12;:10;:12::i;:::-;4290:20;;:4;:20;;;:60;;;;4314:36;4331:4;4337:12;:10;:12::i;:::-;4314:16;:36::i;:::-;4290:60;4269:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;4433:52;4456:4;4462:2;4466:3;4471:7;4480:4;4433:22;:52::i;:::-;4065:427;;;;;:::o;625:41:16:-;662:4;625:41;:::o;727:50::-;774:3;727:50;:::o;910:51::-;;;;;;;;;;;;;;;;;:::o;5434:184::-;1094:13:0;:11;:13::i;:::-;1744:1:1::1;2325:7;;:19;;2317:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1;2455:7;:18;;;;5497:13:16::2;5516:10;:15;;5539:21;5516:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5496:69;;;5583:8;5575:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;5486:132;1701:1:1::1;2628:7;:22;;;;5434:184:16:o:0;3331:959::-;1094:13:0;:11;:13::i;:::-;3405:9:16::1;;;;;;;;;;;3404:10;3396:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;662:4;774:3;3464:12;;:35;;;;:::i;:::-;:49;;3443:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;3577:4;3565:9;;:16;;;;;;;;;;;;;;;;;;3592:20;3629:1;3615:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3592:39;;3641:24;3682:1;3668:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3641:43;;3712:11;3704:20;;;;;;;;:::i;:::-;;3695:3;3699:1;3695:6;;;;;;;;:::i;:::-;;;;;;;:29;;;::::0;::::1;3751:14;3743:23;;;;;;;;:::i;:::-;;3734:3;3738:1;3734:6;;;;;;;;:::i;:::-;;;;;;;:32;;;::::0;::::1;3793:20;3785:29;;;;;;;;:::i;:::-;;3776:3;3780:1;3776:6;;;;;;;;:::i;:::-;;;;;;;:38;;;::::0;::::1;3837:19;:32;3857:11:::0;3837:32:::1;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;3824:7;3832:1;3824:10;;;;;;;;:::i;:::-;;;;;;;:45;;;::::0;::::1;3892:19;:35;3912:14;3892:35;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;3879:7;3887:1;3879:10;;;;;;;;:::i;:::-;;;;;;;:48;;;::::0;::::1;3950:19;:41;3970:20;3950:41;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;3937:7;3945:1;3937:10;;;;;;;;:::i;:::-;;;;;;;:54;;;::::0;::::1;4002:39;4013:9;4024:3;4029:7;4002:39;;;;;;;;;;;::::0;:10:::1;:39::i;:::-;4067:2;4051:12;;:18;;;;;;;:::i;:::-;;;;;;;;4085:6;4080:204;4124:2;774:3;4101:25;;;;:::i;:::-;4097:1;:29;4080:204;;;4147:17;4167:29;4183:12;;4167:15;:29::i;:::-;4147:49;;4211:34;4217:9;4228;4239:1;4211:34;;;;;;;;;;;::::0;:5:::1;:34::i;:::-;4259:12;;:14;;;;;;;;;:::i;:::-;;;;;;4133:151;4128:3;;;;;:::i;:::-;;;;4080:204;;;;3386:904;;3331:959:::0;:::o;784:27::-;;;;:::o;2569:508:2:-;2720:16;2779:3;:10;2760:8;:15;:29;2752:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;2846:30;2893:8;:15;2879:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2846:63;;2925:9;2920:120;2944:8;:15;2940:1;:19;2920:120;;;2999:30;3009:8;3018:1;3009:11;;;;;;;;:::i;:::-;;;;;;;;3022:3;3026:1;3022:6;;;;;;;;:::i;:::-;;;;;;;;2999:9;:30::i;:::-;2980:13;2994:1;2980:16;;;;;;;;:::i;:::-;;;;;;;:49;;;;;2961:3;;;;:::i;:::-;;;2920:120;;;;3057:13;3050:20;;;2569:508;;;;:::o;901:120:5:-;958:4;1013:1;981:29;1007:2;981:25;:29::i;:::-;:33;974:40;;901:120;;;:::o;1831:101:0:-;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;:::-;1831:101::o:0;1201:85::-;1247:7;1273:6;;;;;;;;;;;1266:13;;1201:85;:::o;6422::16:-;6461:13;6493:7;6486:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6422:85;:::o;3137:188::-;3175:7;774:3;718;3228:42;;;;:::i;:::-;3213:12;;:57;:105;;3309:9;3213:105;;;3289:1;3213:105;3194:124;;;;3137:188;:::o;4296:973::-;4377:9;4363:23;;:10;:23;;;4355:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;4436:14;;4417:15;:33;;4409:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;662:4;4517:8;4502:12;;:23;;;;:::i;:::-;:37;;4494:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;4603:1;4581:6;:18;4588:10;4581:18;;;;;;;;;;;;;;;;:23;4573:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;4634:12;4659:8;4649:7;:5;:7::i;:::-;:18;;;;:::i;:::-;4634:33;;4698:4;4685:9;:17;;4677:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;4760:8;4739:6;:18;4746:10;4739:18;;;;;;;;;;;;;;;:29;;;;4793:1;4782:7;:5;:7::i;:::-;:12;4778:216;;;4830:20;;4818:8;:32;;4810:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;4778:216;;;4931:22;;4919:8;:34;;4911:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;4778:216;5009:6;5004:187;5025:8;5021:1;:12;5004:187;;;5054:17;5074:29;5090:12;;5074:15;:29::i;:::-;5054:49;;5117:35;5123:10;5135:9;5146:1;5117:35;;;;;;;;;;;;:5;:35::i;:::-;5166:12;;:14;;;;;;;;;:::i;:::-;;;;;;5040:151;5035:3;;;;;:::i;:::-;;;;5004:187;;;;5217:1;5205:9;:13;5201:62;;;5234:18;5247:4;5234:12;:18::i;:::-;5201:62;4345:924;4296:973;:::o;3145:153:2:-;3239:52;3258:12;:10;:12::i;:::-;3272:8;3282;3239:18;:52::i;:::-;3145:153;;:::o;1002:29:16:-;;;;;;;;;;;;;:::o;6211:118::-;1094:13:0;:11;:13::i;:::-;6316:6:16::1;6291:22;:31;;;;6211:118:::0;:::o;697:111:5:-;759:7;785:12;:16;798:2;785:16;;;;;;;;;;;;778:23;;697:111;;;:::o;6091:114:16:-;1094:13:0;:11;:13::i;:::-;6192:6:16::1;6169:20;:29;;;;6091:114:::0;:::o;862:41::-;;;;:::o;817:39::-;;;;:::o;3365:166:2:-;3464:4;3487:18;:27;3506:7;3487:27;;;;;;;;;;;;;;;:37;3515:8;3487:37;;;;;;;;;;;;;;;;;;;;;;;;;3480:44;;3365:166;;;;:::o;3598:395::-;3806:12;:10;:12::i;:::-;3798:20;;:4;:20;;;:60;;;;3822:36;3839:4;3845:12;:10;:12::i;:::-;3822:16;:36::i;:::-;3798:60;3777:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;3941:45;3959:4;3965:2;3969;3973:6;3981:4;3941:17;:45::i;:::-;3598:395;;;;;:::o;672:49:16:-;718:3;672:49;:::o;2081:198:0:-;1094:13;:11;:13::i;:::-;2189:1:::1;2169:22;;:8;:22;;;;2161:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2244:28;2263:8;2244:18;:28::i;:::-;2081:198:::0;:::o;1236:305:2:-;1338:4;1388:26;1373:41;;;:11;:41;;;;:109;;;;1445:37;1430:52;;;:11;:52;;;;1373:109;:161;;;;1498:36;1522:11;1498:23;:36::i;:::-;1373:161;1354:180;;1236:305;;;:::o;1359:130:0:-;1433:12;:10;:12::i;:::-;1422:23;;:7;:5;:7::i;:::-;:23;;;1414:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1359:130::o;8173:86:2:-;8246:6;8239:4;:13;;;;;;;;;;;;:::i;:::-;;8173:86;:::o;1940:103::-;2000:13;2032:4;2025:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1940:103;;;:::o;392:703:13:-;448:13;674:1;665:5;:10;661:51;;;691:10;;;;;;;;;;;;;;;;;;;;;661:51;721:12;736:5;721:20;;751:14;775:75;790:1;782:4;:9;775:75;;807:8;;;;;:::i;:::-;;;;837:2;829:10;;;;;:::i;:::-;;;775:75;;;859:19;891:6;881:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;859:39;;908:150;924:1;915:5;:10;908:150;;951:1;941:11;;;;;:::i;:::-;;;1017:2;1009:5;:10;;;;:::i;:::-;996:2;:24;;;;:::i;:::-;983:39;;966:6;973;966:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1045:2;1036:11;;;;;:::i;:::-;;;908:150;;;1081:6;1067:21;;;;;392:703;;;;:::o;640:96:12:-;693:7;719:10;712:17;;640:96;:::o;6235:1115:2:-;6455:7;:14;6441:3;:10;:28;6433:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;6546:1;6532:16;;:2;:16;;;;6524:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;6601:16;6620:12;:10;:12::i;:::-;6601:31;;6643:60;6664:8;6674:4;6680:2;6684:3;6689:7;6698:4;6643:20;:60::i;:::-;6719:9;6714:411;6738:3;:10;6734:1;:14;6714:411;;;6769:10;6782:3;6786:1;6782:6;;;;;;;;:::i;:::-;;;;;;;;6769:19;;6802:14;6819:7;6827:1;6819:10;;;;;;;;:::i;:::-;;;;;;;;6802:27;;6844:19;6866:9;:13;6876:2;6866:13;;;;;;;;;;;:19;6880:4;6866:19;;;;;;;;;;;;;;;;6844:41;;6922:6;6907:11;:21;;6899:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;7053:6;7039:11;:20;7017:9;:13;7027:2;7017:13;;;;;;;;;;;:19;7031:4;7017:19;;;;;;;;;;;;;;;:42;;;;7108:6;7087:9;:13;7097:2;7087:13;;;;;;;;;;;:17;7101:2;7087:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;6755:370;;;6750:3;;;;:::i;:::-;;;6714:411;;;;7170:2;7140:47;;7164:4;7140:47;;7154:8;7140:47;;;7174:3;7179:7;7140:47;;;;;;;:::i;:::-;;;;;;;;7198:59;7218:8;7228:4;7234:2;7238:3;7243:7;7252:4;7198:19;:59::i;:::-;7268:75;7304:8;7314:4;7320:2;7324:3;7329:7;7338:4;7268:35;:75::i;:::-;6423:927;6235:1115;;;;;:::o;9731:791::-;9917:1;9903:16;;:2;:16;;;;9895:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;9989:7;:14;9975:3;:10;:28;9967:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;10059:16;10078:12;:10;:12::i;:::-;10059:31;;10101:66;10122:8;10140:1;10144:2;10148:3;10153:7;10162:4;10101:20;:66::i;:::-;10183:9;10178:101;10202:3;:10;10198:1;:14;10178:101;;;10258:7;10266:1;10258:10;;;;;;;;:::i;:::-;;;;;;;;10233:9;:17;10243:3;10247:1;10243:6;;;;;;;;:::i;:::-;;;;;;;;10233:17;;;;;;;;;;;:21;10251:2;10233:21;;;;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;;;;;10214:3;;;;;:::i;:::-;;;;10178:101;;;;10330:2;10294:53;;10326:1;10294:53;;10308:8;10294:53;;;10334:3;10339:7;10294:53;;;;;;;:::i;:::-;;;;;;;;10358:65;10378:8;10396:1;10400:2;10404:3;10409:7;10418:4;10358:19;:65::i;:::-;10434:81;10470:8;10488:1;10492:2;10496:3;10501:7;10510:4;10434:35;:81::i;:::-;9885:637;9731:791;;;;:::o;2227:904:16:-;2293:7;2312:17;2590:15;:22;;;;2418:9;2459:12;2449:23;2494:15;2531:14;2380:183;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2353:224;;;;;;2332:255;;:280;;;;:::i;:::-;2312:300;;2622:6;2631:15;2647:9;2631:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;2622:35;;2698:19;:22;2718:1;2698:22;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;2672;2684:9;2672:11;:22::i;:::-;:48;2668:430;;2741:6;2736:305;2757:15;:22;;;;2753:1;:26;2736:305;;;2830:1;2808:23;;;;;;;;:::i;:::-;;:15;2824:1;2808:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:23;;;;;;;;:::i;:::-;;;2804:223;;;2876:15;2942:1;2917:15;:22;;;;:26;;;;:::i;:::-;2876:89;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;2855:15;2871:1;2855:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:110;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;2987:15;:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2804:223;2781:3;;;;;:::i;:::-;;;;2736:305;;;;3061:26;3077:9;3061:15;:26::i;:::-;3054:33;;;;;;2668:430;3122:1;3114:10;;;;;;;;:::i;:::-;;3107:17;;;;2227:904;;;;:::o;8632:709:2:-;8793:1;8779:16;;:2;:16;;;;8771:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;8844:16;8863:12;:10;:12::i;:::-;8844:31;;8885:20;8908:21;8926:2;8908:17;:21::i;:::-;8885:44;;8939:24;8966:25;8984:6;8966:17;:25::i;:::-;8939:52;;9002:66;9023:8;9041:1;9045:2;9049:3;9054:7;9063:4;9002:20;:66::i;:::-;9100:6;9079:9;:13;9089:2;9079:13;;;;;;;;;;;:17;9093:2;9079:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;9158:2;9121:52;;9154:1;9121:52;;9136:8;9121:52;;;9162:2;9166:6;9121:52;;;;;;;:::i;:::-;;;;;;;;9184:65;9204:8;9222:1;9226:2;9230:3;9235:7;9244:4;9184:19;:65::i;:::-;9260:74;9291:8;9309:1;9313:2;9317;9321:6;9329:4;9260:30;:74::i;:::-;8761:580;;;8632:709;;;;:::o;2433:187:0:-;2506:16;2525:6;;;;;;;;;;;2506:25;;2550:8;2541:6;;:17;;;;;;;;;;;;;;;;;;2604:8;2573:40;;2594:8;2573:40;;;;;;;;;;;;2496:124;2433:187;:::o;5275:153:16:-;5345:4;5333:9;:16;5329:93;;;5373:10;5365:28;;:46;5406:4;5394:9;:16;;;;:::i;:::-;5365:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5329:93;5275:153;:::o;12912:323:2:-;13062:8;13053:17;;:5;:17;;;;13045:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;13164:8;13126:18;:25;13145:5;13126:25;;;;;;;;;;;;;;;:35;13152:8;13126:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;13209:8;13187:41;;13202:5;13187:41;;;13219:8;13187:41;;;;;;:::i;:::-;;;;;;;;12912:323;;;:::o;4942:947::-;5137:1;5123:16;;:2;:16;;;;5115:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;5192:16;5211:12;:10;:12::i;:::-;5192:31;;5233:20;5256:21;5274:2;5256:17;:21::i;:::-;5233:44;;5287:24;5314:25;5332:6;5314:17;:25::i;:::-;5287:52;;5350:60;5371:8;5381:4;5387:2;5391:3;5396:7;5405:4;5350:20;:60::i;:::-;5421:19;5443:9;:13;5453:2;5443:13;;;;;;;;;;;:19;5457:4;5443:19;;;;;;;;;;;;;;;;5421:41;;5495:6;5480:11;:21;;5472:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;5618:6;5604:11;:20;5582:9;:13;5592:2;5582:13;;;;;;;;;;;:19;5596:4;5582:19;;;;;;;;;;;;;;;:42;;;;5665:6;5644:9;:13;5654:2;5644:13;;;;;;;;;;;:17;5658:2;5644:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;5718:2;5687:46;;5712:4;5687:46;;5702:8;5687:46;;;5722:2;5726:6;5687:46;;;;;;;:::i;:::-;;;;;;;;5744:59;5764:8;5774:4;5780:2;5784:3;5789:7;5798:4;5744:19;:59::i;:::-;5814:68;5845:8;5855:4;5861:2;5865;5869:6;5877:4;5814:30;:68::i;:::-;5105:784;;;;4942:947;;;;;:::o;829:155:14:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;6580:320:16:-;6827:66;6854:8;6864:4;6870:2;6874:3;6879:7;6888:4;6827:26;:66::i;:::-;6580:320;;;;;;:::o;15318:213:2:-;;;;;;;:::o;16268:792::-;16500:15;:2;:13;;;:15::i;:::-;16496:558;;;16552:2;16535:43;;;16579:8;16589:4;16595:3;16600:7;16609:4;16535:79;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;16531:513;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;16920:6;16913:14;;;;;;;;;;;:::i;:::-;;;;;;;;16531:513;;;16967:62;;;;;;;;;;:::i;:::-;;;;;;;;16531:513;16705:48;;;16693:60;;;:8;:60;;;;16689:157;;16777:50;;;;;;;;;;:::i;:::-;;;;;;;;16689:157;16615:245;16496:558;16268:792;;;;;;:::o;17066:193::-;17132:16;17160:22;17199:1;17185:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17160:41;;17222:7;17211:5;17217:1;17211:8;;;;;;;;:::i;:::-;;;;;;;:18;;;;;17247:5;17240:12;;;17066:193;;;:::o;15537:725::-;15744:15;:2;:13;;;:15::i;:::-;15740:516;;;15796:2;15779:38;;;15818:8;15828:4;15834:2;15838:6;15846:4;15779:72;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;15775:471;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;16122:6;16115:14;;;;;;;;;;;:::i;:::-;;;;;;;;15775:471;;;16169:62;;;;;;;;;;:::i;:::-;;;;;;;;15775:471;15912:43;;;15900:55;;;:8;:55;;;;15896:152;;15979:50;;;;;;;;;;:::i;:::-;;;;;;;;15896:152;15852:210;15740:516;15537:725;;;;;;:::o;1091:904:5:-;1322:66;1349:8;1359:4;1365:2;1369:3;1374:7;1383:4;1322:26;:66::i;:::-;1419:1;1403:18;;:4;:18;;;1399:156;;;1442:9;1437:108;1461:3;:10;1457:1;:14;1437:108;;;1520:7;1528:1;1520:10;;;;;;;;:::i;:::-;;;;;;;;1496:12;:20;1509:3;1513:1;1509:6;;;;;;;;:::i;:::-;;;;;;;;1496:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;;;;;1473:3;;;;:::i;:::-;;;1437:108;;;;1399:156;1583:1;1569:16;;:2;:16;;;1565:424;;;1606:9;1601:378;1625:3;:10;1621:1;:14;1601:378;;;1660:10;1673:3;1677:1;1673:6;;;;;;;;:::i;:::-;;;;;;;;1660:19;;1697:14;1714:7;1722:1;1714:10;;;;;;;;:::i;:::-;;;;;;;;1697:27;;1742:14;1759:12;:16;1772:2;1759:16;;;;;;;;;;;;1742:33;;1811:6;1801;:16;;1793:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;1940:6;1931;:15;1912:12;:16;1925:2;1912:16;;;;;;;;;;;:34;;;;1642:337;;;1637:3;;;;:::i;:::-;;;1601:378;;;;1565:424;1091:904;;;;;;:::o;1175:320:11:-;1235:4;1487:1;1465:7;:19;;;:23;1458:30;;1175:320;;;:::o;14171:214:2:-;;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:19:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:77::-;878:7;907:5;896:16;;841:77;;;:::o;924:122::-;997:24;1015:5;997:24;:::i;:::-;990:5;987:35;977:63;;1036:1;1033;1026:12;977:63;924:122;:::o;1052:139::-;1098:5;1136:6;1123:20;1114:29;;1152:33;1179:5;1152:33;:::i;:::-;1052:139;;;;:::o;1197:474::-;1265:6;1273;1322:2;1310:9;1301:7;1297:23;1293:32;1290:119;;;1328:79;;:::i;:::-;1290:119;1448:1;1473:53;1518:7;1509:6;1498:9;1494:22;1473:53;:::i;:::-;1463:63;;1419:117;1575:2;1601:53;1646:7;1637:6;1626:9;1622:22;1601:53;:::i;:::-;1591:63;;1546:118;1197:474;;;;;:::o;1677:118::-;1764:24;1782:5;1764:24;:::i;:::-;1759:3;1752:37;1677:118;;:::o;1801:222::-;1894:4;1932:2;1921:9;1917:18;1909:26;;1945:71;2013:1;2002:9;1998:17;1989:6;1945:71;:::i;:::-;1801:222;;;;:::o;2029:149::-;2065:7;2105:66;2098:5;2094:78;2083:89;;2029:149;;;:::o;2184:120::-;2256:23;2273:5;2256:23;:::i;:::-;2249:5;2246:34;2236:62;;2294:1;2291;2284:12;2236:62;2184:120;:::o;2310:137::-;2355:5;2393:6;2380:20;2371:29;;2409:32;2435:5;2409:32;:::i;:::-;2310:137;;;;:::o;2453:327::-;2511:6;2560:2;2548:9;2539:7;2535:23;2531:32;2528:119;;;2566:79;;:::i;:::-;2528:119;2686:1;2711:52;2755:7;2746:6;2735:9;2731:22;2711:52;:::i;:::-;2701:62;;2657:116;2453:327;;;;:::o;2786:90::-;2820:7;2863:5;2856:13;2849:21;2838:32;;2786:90;;;:::o;2882:109::-;2963:21;2978:5;2963:21;:::i;:::-;2958:3;2951:34;2882:109;;:::o;2997:210::-;3084:4;3122:2;3111:9;3107:18;3099:26;;3135:65;3197:1;3186:9;3182:17;3173:6;3135:65;:::i;:::-;2997:210;;;;:::o;3213:117::-;3322:1;3319;3312:12;3336:117;3445:1;3442;3435:12;3459:102;3500:6;3551:2;3547:7;3542:2;3535:5;3531:14;3527:28;3517:38;;3459:102;;;:::o;3567:180::-;3615:77;3612:1;3605:88;3712:4;3709:1;3702:15;3736:4;3733:1;3726:15;3753:281;3836:27;3858:4;3836:27;:::i;:::-;3828:6;3824:40;3966:6;3954:10;3951:22;3930:18;3918:10;3915:34;3912:62;3909:88;;;3977:18;;:::i;:::-;3909:88;4017:10;4013:2;4006:22;3796:238;3753:281;;:::o;4040:129::-;4074:6;4101:20;;:::i;:::-;4091:30;;4130:33;4158:4;4150:6;4130:33;:::i;:::-;4040:129;;;:::o;4175:308::-;4237:4;4327:18;4319:6;4316:30;4313:56;;;4349:18;;:::i;:::-;4313:56;4387:29;4409:6;4387:29;:::i;:::-;4379:37;;4471:4;4465;4461:15;4453:23;;4175:308;;;:::o;4489:154::-;4573:6;4568:3;4563;4550:30;4635:1;4626:6;4621:3;4617:16;4610:27;4489:154;;;:::o;4649:412::-;4727:5;4752:66;4768:49;4810:6;4768:49;:::i;:::-;4752:66;:::i;:::-;4743:75;;4841:6;4834:5;4827:21;4879:4;4872:5;4868:16;4917:3;4908:6;4903:3;4899:16;4896:25;4893:112;;;4924:79;;:::i;:::-;4893:112;5014:41;5048:6;5043:3;5038;5014:41;:::i;:::-;4733:328;4649:412;;;;;:::o;5081:340::-;5137:5;5186:3;5179:4;5171:6;5167:17;5163:27;5153:122;;5194:79;;:::i;:::-;5153:122;5311:6;5298:20;5336:79;5411:3;5403:6;5396:4;5388:6;5384:17;5336:79;:::i;:::-;5327:88;;5143:278;5081:340;;;;:::o;5427:509::-;5496:6;5545:2;5533:9;5524:7;5520:23;5516:32;5513:119;;;5551:79;;:::i;:::-;5513:119;5699:1;5688:9;5684:17;5671:31;5729:18;5721:6;5718:30;5715:117;;;5751:79;;:::i;:::-;5715:117;5856:63;5911:7;5902:6;5891:9;5887:22;5856:63;:::i;:::-;5846:73;;5642:287;5427:509;;;;:::o;5942:99::-;5994:6;6028:5;6022:12;6012:22;;5942:99;;;:::o;6047:169::-;6131:11;6165:6;6160:3;6153:19;6205:4;6200:3;6196:14;6181:29;;6047:169;;;;:::o;6222:307::-;6290:1;6300:113;6314:6;6311:1;6308:13;6300:113;;;6399:1;6394:3;6390:11;6384:18;6380:1;6375:3;6371:11;6364:39;6336:2;6333:1;6329:10;6324:15;;6300:113;;;6431:6;6428:1;6425:13;6422:101;;;6511:1;6502:6;6497:3;6493:16;6486:27;6422:101;6271:258;6222:307;;;:::o;6535:364::-;6623:3;6651:39;6684:5;6651:39;:::i;:::-;6706:71;6770:6;6765:3;6706:71;:::i;:::-;6699:78;;6786:52;6831:6;6826:3;6819:4;6812:5;6808:16;6786:52;:::i;:::-;6863:29;6885:6;6863:29;:::i;:::-;6858:3;6854:39;6847:46;;6627:272;6535:364;;;;:::o;6905:313::-;7018:4;7056:2;7045:9;7041:18;7033:26;;7105:9;7099:4;7095:20;7091:1;7080:9;7076:17;7069:47;7133:78;7206:4;7197:6;7133:78;:::i;:::-;7125:86;;6905:313;;;;:::o;7224:329::-;7283:6;7332:2;7320:9;7311:7;7307:23;7303:32;7300:119;;;7338:79;;:::i;:::-;7300:119;7458:1;7483:53;7528:7;7519:6;7508:9;7504:22;7483:53;:::i;:::-;7473:63;;7429:117;7224:329;;;;:::o;7559:311::-;7636:4;7726:18;7718:6;7715:30;7712:56;;;7748:18;;:::i;:::-;7712:56;7798:4;7790:6;7786:17;7778:25;;7858:4;7852;7848:15;7840:23;;7559:311;;;:::o;7876:117::-;7985:1;7982;7975:12;8016:710;8112:5;8137:81;8153:64;8210:6;8153:64;:::i;:::-;8137:81;:::i;:::-;8128:90;;8238:5;8267:6;8260:5;8253:21;8301:4;8294:5;8290:16;8283:23;;8354:4;8346:6;8342:17;8334:6;8330:30;8383:3;8375:6;8372:15;8369:122;;;8402:79;;:::i;:::-;8369:122;8517:6;8500:220;8534:6;8529:3;8526:15;8500:220;;;8609:3;8638:37;8671:3;8659:10;8638:37;:::i;:::-;8633:3;8626:50;8705:4;8700:3;8696:14;8689:21;;8576:144;8560:4;8555:3;8551:14;8544:21;;8500:220;;;8504:21;8118:608;;8016:710;;;;;:::o;8749:370::-;8820:5;8869:3;8862:4;8854:6;8850:17;8846:27;8836:122;;8877:79;;:::i;:::-;8836:122;8994:6;8981:20;9019:94;9109:3;9101:6;9094:4;9086:6;9082:17;9019:94;:::i;:::-;9010:103;;8826:293;8749:370;;;;:::o;9125:307::-;9186:4;9276:18;9268:6;9265:30;9262:56;;;9298:18;;:::i;:::-;9262:56;9336:29;9358:6;9336:29;:::i;:::-;9328:37;;9420:4;9414;9410:15;9402:23;;9125:307;;;:::o;9438:410::-;9515:5;9540:65;9556:48;9597:6;9556:48;:::i;:::-;9540:65;:::i;:::-;9531:74;;9628:6;9621:5;9614:21;9666:4;9659:5;9655:16;9704:3;9695:6;9690:3;9686:16;9683:25;9680:112;;;9711:79;;:::i;:::-;9680:112;9801:41;9835:6;9830:3;9825;9801:41;:::i;:::-;9521:327;9438:410;;;;;:::o;9867:338::-;9922:5;9971:3;9964:4;9956:6;9952:17;9948:27;9938:122;;9979:79;;:::i;:::-;9938:122;10096:6;10083:20;10121:78;10195:3;10187:6;10180:4;10172:6;10168:17;10121:78;:::i;:::-;10112:87;;9928:277;9867:338;;;;:::o;10211:1509::-;10365:6;10373;10381;10389;10397;10446:3;10434:9;10425:7;10421:23;10417:33;10414:120;;;10453:79;;:::i;:::-;10414:120;10573:1;10598:53;10643:7;10634:6;10623:9;10619:22;10598:53;:::i;:::-;10588:63;;10544:117;10700:2;10726:53;10771:7;10762:6;10751:9;10747:22;10726:53;:::i;:::-;10716:63;;10671:118;10856:2;10845:9;10841:18;10828:32;10887:18;10879:6;10876:30;10873:117;;;10909:79;;:::i;:::-;10873:117;11014:78;11084:7;11075:6;11064:9;11060:22;11014:78;:::i;:::-;11004:88;;10799:303;11169:2;11158:9;11154:18;11141:32;11200:18;11192:6;11189:30;11186:117;;;11222:79;;:::i;:::-;11186:117;11327:78;11397:7;11388:6;11377:9;11373:22;11327:78;:::i;:::-;11317:88;;11112:303;11482:3;11471:9;11467:19;11454:33;11514:18;11506:6;11503:30;11500:117;;;11536:79;;:::i;:::-;11500:117;11641:62;11695:7;11686:6;11675:9;11671:22;11641:62;:::i;:::-;11631:72;;11425:288;10211:1509;;;;;;;;:::o;11726:108::-;11808:1;11801:5;11798:12;11788:40;;11824:1;11821;11814:12;11788:40;11726:108;:::o;11840:157::-;11895:5;11933:6;11920:20;11911:29;;11949:42;11985:5;11949:42;:::i;:::-;11840:157;;;;:::o;12003:347::-;12071:6;12120:2;12108:9;12099:7;12095:23;12091:32;12088:119;;;12126:79;;:::i;:::-;12088:119;12246:1;12271:62;12325:7;12316:6;12305:9;12301:22;12271:62;:::i;:::-;12261:72;;12217:126;12003:347;;;;:::o;12356:329::-;12415:6;12464:2;12452:9;12443:7;12439:23;12435:32;12432:119;;;12470:79;;:::i;:::-;12432:119;12590:1;12615:53;12660:7;12651:6;12640:9;12636:22;12615:53;:::i;:::-;12605:63;;12561:117;12356:329;;;;:::o;12691:311::-;12768:4;12858:18;12850:6;12847:30;12844:56;;;12880:18;;:::i;:::-;12844:56;12930:4;12922:6;12918:17;12910:25;;12990:4;12984;12980:15;12972:23;;12691:311;;;:::o;13025:710::-;13121:5;13146:81;13162:64;13219:6;13162:64;:::i;:::-;13146:81;:::i;:::-;13137:90;;13247:5;13276:6;13269:5;13262:21;13310:4;13303:5;13299:16;13292:23;;13363:4;13355:6;13351:17;13343:6;13339:30;13392:3;13384:6;13381:15;13378:122;;;13411:79;;:::i;:::-;13378:122;13526:6;13509:220;13543:6;13538:3;13535:15;13509:220;;;13618:3;13647:37;13680:3;13668:10;13647:37;:::i;:::-;13642:3;13635:50;13714:4;13709:3;13705:14;13698:21;;13585:144;13569:4;13564:3;13560:14;13553:21;;13509:220;;;13513:21;13127:608;;13025:710;;;;;:::o;13758:370::-;13829:5;13878:3;13871:4;13863:6;13859:17;13855:27;13845:122;;13886:79;;:::i;:::-;13845:122;14003:6;13990:20;14028:94;14118:3;14110:6;14103:4;14095:6;14091:17;14028:94;:::i;:::-;14019:103;;13835:293;13758:370;;;;:::o;14134:894::-;14252:6;14260;14309:2;14297:9;14288:7;14284:23;14280:32;14277:119;;;14315:79;;:::i;:::-;14277:119;14463:1;14452:9;14448:17;14435:31;14493:18;14485:6;14482:30;14479:117;;;14515:79;;:::i;:::-;14479:117;14620:78;14690:7;14681:6;14670:9;14666:22;14620:78;:::i;:::-;14610:88;;14406:302;14775:2;14764:9;14760:18;14747:32;14806:18;14798:6;14795:30;14792:117;;;14828:79;;:::i;:::-;14792:117;14933:78;15003:7;14994:6;14983:9;14979:22;14933:78;:::i;:::-;14923:88;;14718:303;14134:894;;;;;:::o;15034:114::-;15101:6;15135:5;15129:12;15119:22;;15034:114;;;:::o;15154:184::-;15253:11;15287:6;15282:3;15275:19;15327:4;15322:3;15318:14;15303:29;;15154:184;;;;:::o;15344:132::-;15411:4;15434:3;15426:11;;15464:4;15459:3;15455:14;15447:22;;15344:132;;;:::o;15482:108::-;15559:24;15577:5;15559:24;:::i;:::-;15554:3;15547:37;15482:108;;:::o;15596:179::-;15665:10;15686:46;15728:3;15720:6;15686:46;:::i;:::-;15764:4;15759:3;15755:14;15741:28;;15596:179;;;;:::o;15781:113::-;15851:4;15883;15878:3;15874:14;15866:22;;15781:113;;;:::o;15930:732::-;16049:3;16078:54;16126:5;16078:54;:::i;:::-;16148:86;16227:6;16222:3;16148:86;:::i;:::-;16141:93;;16258:56;16308:5;16258:56;:::i;:::-;16337:7;16368:1;16353:284;16378:6;16375:1;16372:13;16353:284;;;16454:6;16448:13;16481:63;16540:3;16525:13;16481:63;:::i;:::-;16474:70;;16567:60;16620:6;16567:60;:::i;:::-;16557:70;;16413:224;16400:1;16397;16393:9;16388:14;;16353:284;;;16357:14;16653:3;16646:10;;16054:608;;;15930:732;;;;:::o;16668:373::-;16811:4;16849:2;16838:9;16834:18;16826:26;;16898:9;16892:4;16888:20;16884:1;16873:9;16869:17;16862:47;16926:108;17029:4;17020:6;16926:108;:::i;:::-;16918:116;;16668:373;;;;:::o;17047:118::-;17134:24;17152:5;17134:24;:::i;:::-;17129:3;17122:37;17047:118;;:::o;17171:222::-;17264:4;17302:2;17291:9;17287:18;17279:26;;17315:71;17383:1;17372:9;17368:17;17359:6;17315:71;:::i;:::-;17171:222;;;;:::o;17399:116::-;17469:21;17484:5;17469:21;:::i;:::-;17462:5;17459:32;17449:60;;17505:1;17502;17495:12;17449:60;17399:116;:::o;17521:133::-;17564:5;17602:6;17589:20;17580:29;;17618:30;17642:5;17618:30;:::i;:::-;17521:133;;;;:::o;17660:468::-;17725:6;17733;17782:2;17770:9;17761:7;17757:23;17753:32;17750:119;;;17788:79;;:::i;:::-;17750:119;17908:1;17933:53;17978:7;17969:6;17958:9;17954:22;17933:53;:::i;:::-;17923:63;;17879:117;18035:2;18061:50;18103:7;18094:6;18083:9;18079:22;18061:50;:::i;:::-;18051:60;;18006:115;17660:468;;;;;:::o;18134:474::-;18202:6;18210;18259:2;18247:9;18238:7;18234:23;18230:32;18227:119;;;18265:79;;:::i;:::-;18227:119;18385:1;18410:53;18455:7;18446:6;18435:9;18431:22;18410:53;:::i;:::-;18400:63;;18356:117;18512:2;18538:53;18583:7;18574:6;18563:9;18559:22;18538:53;:::i;:::-;18528:63;;18483:118;18134:474;;;;;:::o;18614:1089::-;18718:6;18726;18734;18742;18750;18799:3;18787:9;18778:7;18774:23;18770:33;18767:120;;;18806:79;;:::i;:::-;18767:120;18926:1;18951:53;18996:7;18987:6;18976:9;18972:22;18951:53;:::i;:::-;18941:63;;18897:117;19053:2;19079:53;19124:7;19115:6;19104:9;19100:22;19079:53;:::i;:::-;19069:63;;19024:118;19181:2;19207:53;19252:7;19243:6;19232:9;19228:22;19207:53;:::i;:::-;19197:63;;19152:118;19309:2;19335:53;19380:7;19371:6;19360:9;19356:22;19335:53;:::i;:::-;19325:63;;19280:118;19465:3;19454:9;19450:19;19437:33;19497:18;19489:6;19486:30;19483:117;;;19519:79;;:::i;:::-;19483:117;19624:62;19678:7;19669:6;19658:9;19654:22;19624:62;:::i;:::-;19614:72;;19408:288;18614:1089;;;;;;;;:::o;19709:229::-;19849:34;19845:1;19837:6;19833:14;19826:58;19918:12;19913:2;19905:6;19901:15;19894:37;19709:229;:::o;19944:366::-;20086:3;20107:67;20171:2;20166:3;20107:67;:::i;:::-;20100:74;;20183:93;20272:3;20183:93;:::i;:::-;20301:2;20296:3;20292:12;20285:19;;19944:366;;;:::o;20316:419::-;20482:4;20520:2;20509:9;20505:18;20497:26;;20569:9;20563:4;20559:20;20555:1;20544:9;20540:17;20533:47;20597:131;20723:4;20597:131;:::i;:::-;20589:139;;20316:419;;;:::o;20741:180::-;20789:77;20786:1;20779:88;20886:4;20883:1;20876:15;20910:4;20907:1;20900:15;20927:320;20971:6;21008:1;21002:4;20998:12;20988:22;;21055:1;21049:4;21045:12;21076:18;21066:81;;21132:4;21124:6;21120:17;21110:27;;21066:81;21194:2;21186:6;21183:14;21163:18;21160:38;21157:84;;;21213:18;;:::i;:::-;21157:84;20978:269;20927:320;;;:::o;21253:148::-;21355:11;21392:3;21377:18;;21253:148;;;;:::o;21407:377::-;21513:3;21541:39;21574:5;21541:39;:::i;:::-;21596:89;21678:6;21673:3;21596:89;:::i;:::-;21589:96;;21694:52;21739:6;21734:3;21727:4;21720:5;21716:16;21694:52;:::i;:::-;21771:6;21766:3;21762:16;21755:23;;21517:267;21407:377;;;;:::o;21790:155::-;21930:7;21926:1;21918:6;21914:14;21907:31;21790:155;:::o;21951:400::-;22111:3;22132:84;22214:1;22209:3;22132:84;:::i;:::-;22125:91;;22225:93;22314:3;22225:93;:::i;:::-;22343:1;22338:3;22334:11;22327:18;;21951:400;;;:::o;22357:701::-;22638:3;22660:95;22751:3;22742:6;22660:95;:::i;:::-;22653:102;;22772:95;22863:3;22854:6;22772:95;:::i;:::-;22765:102;;22884:148;23028:3;22884:148;:::i;:::-;22877:155;;23049:3;23042:10;;22357:701;;;;;:::o;23064:234::-;23204:34;23200:1;23192:6;23188:14;23181:58;23273:17;23268:2;23260:6;23256:15;23249:42;23064:234;:::o;23304:366::-;23446:3;23467:67;23531:2;23526:3;23467:67;:::i;:::-;23460:74;;23543:93;23632:3;23543:93;:::i;:::-;23661:2;23656:3;23652:12;23645:19;;23304:366;;;:::o;23676:419::-;23842:4;23880:2;23869:9;23865:18;23857:26;;23929:9;23923:4;23919:20;23915:1;23904:9;23900:17;23893:47;23957:131;24083:4;23957:131;:::i;:::-;23949:139;;23676:419;;;:::o;24101:181::-;24241:33;24237:1;24229:6;24225:14;24218:57;24101:181;:::o;24288:366::-;24430:3;24451:67;24515:2;24510:3;24451:67;:::i;:::-;24444:74;;24527:93;24616:3;24527:93;:::i;:::-;24645:2;24640:3;24636:12;24629:19;;24288:366;;;:::o;24660:419::-;24826:4;24864:2;24853:9;24849:18;24841:26;;24913:9;24907:4;24903:20;24899:1;24888:9;24884:17;24877:47;24941:131;25067:4;24941:131;:::i;:::-;24933:139;;24660:419;;;:::o;25085:147::-;25186:11;25223:3;25208:18;;25085:147;;;;:::o;25238:114::-;;:::o;25358:398::-;25517:3;25538:83;25619:1;25614:3;25538:83;:::i;:::-;25531:90;;25630:93;25719:3;25630:93;:::i;:::-;25748:1;25743:3;25739:11;25732:18;;25358:398;;;:::o;25762:379::-;25946:3;25968:147;26111:3;25968:147;:::i;:::-;25961:154;;26132:3;26125:10;;25762:379;;;:::o;26147:165::-;26287:17;26283:1;26275:6;26271:14;26264:41;26147:165;:::o;26318:366::-;26460:3;26481:67;26545:2;26540:3;26481:67;:::i;:::-;26474:74;;26557:93;26646:3;26557:93;:::i;:::-;26675:2;26670:3;26666:12;26659:19;;26318:366;;;:::o;26690:419::-;26856:4;26894:2;26883:9;26879:18;26871:26;;26943:9;26937:4;26933:20;26929:1;26918:9;26914:17;26907:47;26971:131;27097:4;26971:131;:::i;:::-;26963:139;;26690:419;;;:::o;27115:164::-;27255:16;27251:1;27243:6;27239:14;27232:40;27115:164;:::o;27285:366::-;27427:3;27448:67;27512:2;27507:3;27448:67;:::i;:::-;27441:74;;27524:93;27613:3;27524:93;:::i;:::-;27642:2;27637:3;27633:12;27626:19;;27285:366;;;:::o;27657:419::-;27823:4;27861:2;27850:9;27846:18;27838:26;;27910:9;27904:4;27900:20;27896:1;27885:9;27881:17;27874:47;27938:131;28064:4;27938:131;:::i;:::-;27930:139;;27657:419;;;:::o;28082:180::-;28130:77;28127:1;28120:88;28227:4;28224:1;28217:15;28251:4;28248:1;28241:15;28268:305;28308:3;28327:20;28345:1;28327:20;:::i;:::-;28322:25;;28361:20;28379:1;28361:20;:::i;:::-;28356:25;;28515:1;28447:66;28443:74;28440:1;28437:81;28434:107;;;28521:18;;:::i;:::-;28434:107;28565:1;28562;28558:9;28551:16;;28268:305;;;;:::o;28579:165::-;28719:17;28715:1;28707:6;28703:14;28696:41;28579:165;:::o;28750:366::-;28892:3;28913:67;28977:2;28972:3;28913:67;:::i;:::-;28906:74;;28989:93;29078:3;28989:93;:::i;:::-;29107:2;29102:3;29098:12;29091:19;;28750:366;;;:::o;29122:419::-;29288:4;29326:2;29315:9;29311:18;29303:26;;29375:9;29369:4;29365:20;29361:1;29350:9;29346:17;29339:47;29403:131;29529:4;29403:131;:::i;:::-;29395:139;;29122:419;;;:::o;29547:180::-;29595:77;29592:1;29585:88;29692:4;29689:1;29682:15;29716:4;29713:1;29706:15;29733:180;29781:77;29778:1;29771:88;29878:4;29875:1;29868:15;29902:4;29899:1;29892:15;29919:191;29959:4;29979:20;29997:1;29979:20;:::i;:::-;29974:25;;30013:20;30031:1;30013:20;:::i;:::-;30008:25;;30052:1;30049;30046:8;30043:34;;;30057:18;;:::i;:::-;30043:34;30102:1;30099;30095:9;30087:17;;29919:191;;;;:::o;30116:233::-;30155:3;30178:24;30196:5;30178:24;:::i;:::-;30169:33;;30224:66;30217:5;30214:77;30211:103;;;30294:18;;:::i;:::-;30211:103;30341:1;30334:5;30330:13;30323:20;;30116:233;;;:::o;30355:228::-;30495:34;30491:1;30483:6;30479:14;30472:58;30564:11;30559:2;30551:6;30547:15;30540:36;30355:228;:::o;30589:366::-;30731:3;30752:67;30816:2;30811:3;30752:67;:::i;:::-;30745:74;;30828:93;30917:3;30828:93;:::i;:::-;30946:2;30941:3;30937:12;30930:19;;30589:366;;;:::o;30961:419::-;31127:4;31165:2;31154:9;31150:18;31142:26;;31214:9;31208:4;31204:20;31200:1;31189:9;31185:17;31178:47;31242:131;31368:4;31242:131;:::i;:::-;31234:139;;30961:419;;;:::o;31386:158::-;31526:10;31522:1;31514:6;31510:14;31503:34;31386:158;:::o;31550:365::-;31692:3;31713:66;31777:1;31772:3;31713:66;:::i;:::-;31706:73;;31788:93;31877:3;31788:93;:::i;:::-;31906:2;31901:3;31897:12;31890:19;;31550:365;;;:::o;31921:419::-;32087:4;32125:2;32114:9;32110:18;32102:26;;32174:9;32168:4;32164:20;32160:1;32149:9;32145:17;32138:47;32202:131;32328:4;32202:131;:::i;:::-;32194:139;;31921:419;;;:::o;32346:179::-;32486:31;32482:1;32474:6;32470:14;32463:55;32346:179;:::o;32531:366::-;32673:3;32694:67;32758:2;32753:3;32694:67;:::i;:::-;32687:74;;32770:93;32859:3;32770:93;:::i;:::-;32888:2;32883:3;32879:12;32872:19;;32531:366;;;:::o;32903:419::-;33069:4;33107:2;33096:9;33092:18;33084:26;;33156:9;33150:4;33146:20;33142:1;33131:9;33127:17;33120:47;33184:131;33310:4;33184:131;:::i;:::-;33176:139;;32903:419;;;:::o;33328:169::-;33468:21;33464:1;33456:6;33452:14;33445:45;33328:169;:::o;33503:366::-;33645:3;33666:67;33730:2;33725:3;33666:67;:::i;:::-;33659:74;;33742:93;33831:3;33742:93;:::i;:::-;33860:2;33855:3;33851:12;33844:19;;33503:366;;;:::o;33875:419::-;34041:4;34079:2;34068:9;34064:18;34056:26;;34128:9;34122:4;34118:20;34114:1;34103:9;34099:17;34092:47;34156:131;34282:4;34156:131;:::i;:::-;34148:139;;33875:419;;;:::o;34300:348::-;34340:7;34363:20;34381:1;34363:20;:::i;:::-;34358:25;;34397:20;34415:1;34397:20;:::i;:::-;34392:25;;34585:1;34517:66;34513:74;34510:1;34507:81;34502:1;34495:9;34488:17;34484:105;34481:131;;;34592:18;;:::i;:::-;34481:131;34640:1;34637;34633:9;34622:20;;34300:348;;;;:::o;34654:171::-;34794:23;34790:1;34782:6;34778:14;34771:47;34654:171;:::o;34831:366::-;34973:3;34994:67;35058:2;35053:3;34994:67;:::i;:::-;34987:74;;35070:93;35159:3;35070:93;:::i;:::-;35188:2;35183:3;35179:12;35172:19;;34831:366;;;:::o;35203:419::-;35369:4;35407:2;35396:9;35392:18;35384:26;;35456:9;35450:4;35446:20;35442:1;35431:9;35427:17;35420:47;35484:131;35610:4;35484:131;:::i;:::-;35476:139;;35203:419;;;:::o;35628:175::-;35768:27;35764:1;35756:6;35752:14;35745:51;35628:175;:::o;35809:366::-;35951:3;35972:67;36036:2;36031:3;35972:67;:::i;:::-;35965:74;;36048:93;36137:3;36048:93;:::i;:::-;36166:2;36161:3;36157:12;36150:19;;35809:366;;;:::o;36181:419::-;36347:4;36385:2;36374:9;36370:18;36362:26;;36434:9;36428:4;36424:20;36420:1;36409:9;36405:17;36398:47;36462:131;36588:4;36462:131;:::i;:::-;36454:139;;36181:419;;;:::o;36606:225::-;36746:34;36742:1;36734:6;36730:14;36723:58;36815:8;36810:2;36802:6;36798:15;36791:33;36606:225;:::o;36837:366::-;36979:3;37000:67;37064:2;37059:3;37000:67;:::i;:::-;36993:74;;37076:93;37165:3;37076:93;:::i;:::-;37194:2;37189:3;37185:12;37178:19;;36837:366;;;:::o;37209:419::-;37375:4;37413:2;37402:9;37398:18;37390:26;;37462:9;37456:4;37452:20;37448:1;37437:9;37433:17;37426:47;37490:131;37616:4;37490:131;:::i;:::-;37482:139;;37209:419;;;:::o;37634:182::-;37774:34;37770:1;37762:6;37758:14;37751:58;37634:182;:::o;37822:366::-;37964:3;37985:67;38049:2;38044:3;37985:67;:::i;:::-;37978:74;;38061:93;38150:3;38061:93;:::i;:::-;38179:2;38174:3;38170:12;38163:19;;37822:366;;;:::o;38194:419::-;38360:4;38398:2;38387:9;38383:18;38375:26;;38447:9;38441:4;38437:20;38433:1;38422:9;38418:17;38411:47;38475:131;38601:4;38475:131;:::i;:::-;38467:139;;38194:419;;;:::o;38619:180::-;38667:77;38664:1;38657:88;38764:4;38761:1;38754:15;38788:4;38785:1;38778:15;38805:185;38845:1;38862:20;38880:1;38862:20;:::i;:::-;38857:25;;38896:20;38914:1;38896:20;:::i;:::-;38891:25;;38935:1;38925:35;;38940:18;;:::i;:::-;38925:35;38982:1;38979;38975:9;38970:14;;38805:185;;;;:::o;38996:176::-;39028:1;39045:20;39063:1;39045:20;:::i;:::-;39040:25;;39079:20;39097:1;39079:20;:::i;:::-;39074:25;;39118:1;39108:35;;39123:18;;:::i;:::-;39108:35;39164:1;39161;39157:9;39152:14;;38996:176;;;;:::o;39178:227::-;39318:34;39314:1;39306:6;39302:14;39295:58;39387:10;39382:2;39374:6;39370:15;39363:35;39178:227;:::o;39411:366::-;39553:3;39574:67;39638:2;39633:3;39574:67;:::i;:::-;39567:74;;39650:93;39739:3;39650:93;:::i;:::-;39768:2;39763:3;39759:12;39752:19;;39411:366;;;:::o;39783:419::-;39949:4;39987:2;39976:9;39972:18;39964:26;;40036:9;40030:4;40026:20;40022:1;40011:9;40007:17;40000:47;40064:131;40190:4;40064:131;:::i;:::-;40056:139;;39783:419;;;:::o;40208:224::-;40348:34;40344:1;40336:6;40332:14;40325:58;40417:7;40412:2;40404:6;40400:15;40393:32;40208:224;:::o;40438:366::-;40580:3;40601:67;40665:2;40660:3;40601:67;:::i;:::-;40594:74;;40677:93;40766:3;40677:93;:::i;:::-;40795:2;40790:3;40786:12;40779:19;;40438:366;;;:::o;40810:419::-;40976:4;41014:2;41003:9;40999:18;40991:26;;41063:9;41057:4;41053:20;41049:1;41038:9;41034:17;41027:47;41091:131;41217:4;41091:131;:::i;:::-;41083:139;;40810:419;;;:::o;41235:229::-;41375:34;41371:1;41363:6;41359:14;41352:58;41444:12;41439:2;41431:6;41427:15;41420:37;41235:229;:::o;41470:366::-;41612:3;41633:67;41697:2;41692:3;41633:67;:::i;:::-;41626:74;;41709:93;41798:3;41709:93;:::i;:::-;41827:2;41822:3;41818:12;41811:19;;41470:366;;;:::o;41842:419::-;42008:4;42046:2;42035:9;42031:18;42023:26;;42095:9;42089:4;42085:20;42081:1;42070:9;42066:17;42059:47;42123:131;42249:4;42123:131;:::i;:::-;42115:139;;41842:419;;;:::o;42267:634::-;42488:4;42526:2;42515:9;42511:18;42503:26;;42575:9;42569:4;42565:20;42561:1;42550:9;42546:17;42539:47;42603:108;42706:4;42697:6;42603:108;:::i;:::-;42595:116;;42758:9;42752:4;42748:20;42743:2;42732:9;42728:18;42721:48;42786:108;42889:4;42880:6;42786:108;:::i;:::-;42778:116;;42267:634;;;;;:::o;42907:220::-;43047:34;43043:1;43035:6;43031:14;43024:58;43116:3;43111:2;43103:6;43099:15;43092:28;42907:220;:::o;43133:366::-;43275:3;43296:67;43360:2;43355:3;43296:67;:::i;:::-;43289:74;;43372:93;43461:3;43372:93;:::i;:::-;43490:2;43485:3;43481:12;43474:19;;43133:366;;;:::o;43505:419::-;43671:4;43709:2;43698:9;43694:18;43686:26;;43758:9;43752:4;43748:20;43744:1;43733:9;43729:17;43722:47;43786:131;43912:4;43786:131;:::i;:::-;43778:139;;43505:419;;;:::o;43930:94::-;43963:8;44011:5;44007:2;44003:14;43982:35;;43930:94;;;:::o;44030:::-;44069:7;44098:20;44112:5;44098:20;:::i;:::-;44087:31;;44030:94;;;:::o;44130:100::-;44169:7;44198:26;44218:5;44198:26;:::i;:::-;44187:37;;44130:100;;;:::o;44236:157::-;44341:45;44361:24;44379:5;44361:24;:::i;:::-;44341:45;:::i;:::-;44336:3;44329:58;44236:157;;:::o;44399:77::-;44436:7;44465:5;44454:16;;44399:77;;;:::o;44482:79::-;44521:7;44550:5;44539:16;;44482:79;;;:::o;44567:157::-;44672:45;44692:24;44710:5;44692:24;:::i;:::-;44672:45;:::i;:::-;44667:3;44660:58;44567:157;;:::o;44730:79::-;44769:7;44798:5;44787:16;;44730:79;;;:::o;44815:157::-;44920:45;44940:24;44958:5;44940:24;:::i;:::-;44920:45;:::i;:::-;44915:3;44908:58;44815:157;;:::o;44978:679::-;45174:3;45189:75;45260:3;45251:6;45189:75;:::i;:::-;45289:2;45284:3;45280:12;45273:19;;45302:75;45373:3;45364:6;45302:75;:::i;:::-;45402:2;45397:3;45393:12;45386:19;;45415:75;45486:3;45477:6;45415:75;:::i;:::-;45515:2;45510:3;45506:12;45499:19;;45528:75;45599:3;45590:6;45528:75;:::i;:::-;45628:2;45623:3;45619:12;45612:19;;45648:3;45641:10;;44978:679;;;;;;;:::o;45663:180::-;45711:77;45708:1;45701:88;45808:4;45805:1;45798:15;45832:4;45829:1;45822:15;45849:332;45970:4;46008:2;45997:9;45993:18;45985:26;;46021:71;46089:1;46078:9;46074:17;46065:6;46021:71;:::i;:::-;46102:72;46170:2;46159:9;46155:18;46146:6;46102:72;:::i;:::-;45849:332;;;;;:::o;46187:228::-;46327:34;46323:1;46315:6;46311:14;46304:58;46396:11;46391:2;46383:6;46379:15;46372:36;46187:228;:::o;46421:366::-;46563:3;46584:67;46648:2;46643:3;46584:67;:::i;:::-;46577:74;;46660:93;46749:3;46660:93;:::i;:::-;46778:2;46773:3;46769:12;46762:19;;46421:366;;;:::o;46793:419::-;46959:4;46997:2;46986:9;46982:18;46974:26;;47046:9;47040:4;47036:20;47032:1;47021:9;47017:17;47010:47;47074:131;47200:4;47074:131;:::i;:::-;47066:139;;46793:419;;;:::o;47218:98::-;47269:6;47303:5;47297:12;47287:22;;47218:98;;;:::o;47322:168::-;47405:11;47439:6;47434:3;47427:19;47479:4;47474:3;47470:14;47455:29;;47322:168;;;;:::o;47496:360::-;47582:3;47610:38;47642:5;47610:38;:::i;:::-;47664:70;47727:6;47722:3;47664:70;:::i;:::-;47657:77;;47743:52;47788:6;47783:3;47776:4;47769:5;47765:16;47743:52;:::i;:::-;47820:29;47842:6;47820:29;:::i;:::-;47815:3;47811:39;47804:46;;47586:270;47496:360;;;;:::o;47862:1053::-;48185:4;48223:3;48212:9;48208:19;48200:27;;48237:71;48305:1;48294:9;48290:17;48281:6;48237:71;:::i;:::-;48318:72;48386:2;48375:9;48371:18;48362:6;48318:72;:::i;:::-;48437:9;48431:4;48427:20;48422:2;48411:9;48407:18;48400:48;48465:108;48568:4;48559:6;48465:108;:::i;:::-;48457:116;;48620:9;48614:4;48610:20;48605:2;48594:9;48590:18;48583:48;48648:108;48751:4;48742:6;48648:108;:::i;:::-;48640:116;;48804:9;48798:4;48794:20;48788:3;48777:9;48773:19;48766:49;48832:76;48903:4;48894:6;48832:76;:::i;:::-;48824:84;;47862:1053;;;;;;;;:::o;48921:141::-;48977:5;49008:6;49002:13;48993:22;;49024:32;49050:5;49024:32;:::i;:::-;48921:141;;;;:::o;49068:349::-;49137:6;49186:2;49174:9;49165:7;49161:23;49157:32;49154:119;;;49192:79;;:::i;:::-;49154:119;49312:1;49337:63;49392:7;49383:6;49372:9;49368:22;49337:63;:::i;:::-;49327:73;;49283:127;49068:349;;;;:::o;49423:106::-;49467:8;49516:5;49511:3;49507:15;49486:36;;49423:106;;;:::o;49535:183::-;49570:3;49608:1;49590:16;49587:23;49584:128;;;49646:1;49643;49640;49625:23;49668:34;49699:1;49693:8;49668:34;:::i;:::-;49661:41;;49584:128;49535:183;:::o;49724:711::-;49763:3;49801:4;49783:16;49780:26;49777:39;;;49809:5;;49777:39;49838:20;;:::i;:::-;49913:1;49895:16;49891:24;49888:1;49882:4;49867:49;49946:4;49940:11;50045:16;50038:4;50030:6;50026:17;50023:39;49990:18;49982:6;49979:30;49963:113;49960:146;;;50091:5;;;;49960:146;50137:6;50131:4;50127:17;50173:3;50167:10;50200:18;50192:6;50189:30;50186:43;;;50222:5;;;;;;50186:43;50270:6;50263:4;50258:3;50254:14;50250:27;50329:1;50311:16;50307:24;50301:4;50297:35;50292:3;50289:44;50286:57;;;50336:5;;;;;;;50286:57;50353;50401:6;50395:4;50391:17;50383:6;50379:30;50373:4;50353:57;:::i;:::-;50426:3;50419:10;;49767:668;;;;;49724:711;;:::o;50441:239::-;50581:34;50577:1;50569:6;50565:14;50558:58;50650:22;50645:2;50637:6;50633:15;50626:47;50441:239;:::o;50686:366::-;50828:3;50849:67;50913:2;50908:3;50849:67;:::i;:::-;50842:74;;50925:93;51014:3;50925:93;:::i;:::-;51043:2;51038:3;51034:12;51027:19;;50686:366;;;:::o;51058:419::-;51224:4;51262:2;51251:9;51247:18;51239:26;;51311:9;51305:4;51301:20;51297:1;51286:9;51282:17;51275:47;51339:131;51465:4;51339:131;:::i;:::-;51331:139;;51058:419;;;:::o;51483:227::-;51623:34;51619:1;51611:6;51607:14;51600:58;51692:10;51687:2;51679:6;51675:15;51668:35;51483:227;:::o;51716:366::-;51858:3;51879:67;51943:2;51938:3;51879:67;:::i;:::-;51872:74;;51955:93;52044:3;51955:93;:::i;:::-;52073:2;52068:3;52064:12;52057:19;;51716:366;;;:::o;52088:419::-;52254:4;52292:2;52281:9;52277:18;52269:26;;52341:9;52335:4;52331:20;52327:1;52316:9;52312:17;52305:47;52369:131;52495:4;52369:131;:::i;:::-;52361:139;;52088:419;;;:::o;52513:751::-;52736:4;52774:3;52763:9;52759:19;52751:27;;52788:71;52856:1;52845:9;52841:17;52832:6;52788:71;:::i;:::-;52869:72;52937:2;52926:9;52922:18;52913:6;52869:72;:::i;:::-;52951;53019:2;53008:9;53004:18;52995:6;52951:72;:::i;:::-;53033;53101:2;53090:9;53086:18;53077:6;53033:72;:::i;:::-;53153:9;53147:4;53143:20;53137:3;53126:9;53122:19;53115:49;53181:76;53252:4;53243:6;53181:76;:::i;:::-;53173:84;;52513:751;;;;;;;;:::o;53270:227::-;53410:34;53406:1;53398:6;53394:14;53387:58;53479:10;53474:2;53466:6;53462:15;53455:35;53270:227;:::o;53503:366::-;53645:3;53666:67;53730:2;53725:3;53666:67;:::i;:::-;53659:74;;53742:93;53831:3;53742:93;:::i;:::-;53860:2;53855:3;53851:12;53844:19;;53503:366;;;:::o;53875:419::-;54041:4;54079:2;54068:9;54064:18;54056:26;;54128:9;54122:4;54118:20;54114:1;54103:9;54099:17;54092:47;54156:131;54282:4;54156:131;:::i;:::-;54148:139;;53875:419;;;:::o

Swarm Source

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