ETH Price: $3,121.37 (+1.09%)
Gas: 5 Gwei

Token

 

Overview

Max Total Supply

93

Holders

51

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
killing-myself.eth
0x584456aab0110a0f1b177d8a1cde7aff6d09a292
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:
ArtForZombiesSpecials

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
File 1 of 11 : ArtForZombiesSpecials.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

/**

      /$$$$$$   /$$$$$$  /$$      /$$
     /$$__  $$ /$$__  $$| $$$    /$$$
    |__/  \ $$| $$  \__/| $$$$  /$$$$
       /$$$$$/| $$ /$$$$| $$ $$/$$ $$
      |___  $$| $$|_  $$| $$  $$$| $$
     /$$  \ $$| $$  \ $$| $$\  $ | $$
    |  $$$$$$/|  $$$$$$/| $$ \/  | $$
    \______/  \______/ |__/     |__/


    ** Website
       https://3gm.dev/

    ** Twitter
       https://twitter.com/3gmdev

**/

import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";
import "@openzeppelin/contracts/utils/Strings.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

interface ERC721A {
    function ownerOf(uint256 tokenId) external view returns (address owner);
}

contract ArtForZombiesSpecials is ERC1155, Ownable {

    enum Stages { Closed, Whitelist, Public }

    ERC721A public brainsContract = ERC721A(0xcA0e2E59649423e7F912Ce39AeDa8cF25F2Bfa8c);
    string public baseURI = "";
    Stages public stage = Stages.Closed;
    mapping(uint256 => uint256) public mintAmount;
    mapping(uint256 => uint256) public supplyAmount;
    mapping(uint256 => bool) public brainTokenIdMinted;

    constructor() ERC1155("") {
        for (uint256 i = 1; i < 21; i++) {
            mintAmount[i] += 1;
            _mint(msg.sender, i, 1, "");
        }
    }

    function mint(uint256 _tokenId, uint256 _brainTokenId) external payable {
        require(stage == Stages.Whitelist || stage == Stages.Public, "Paused");
        require(supplyAmount[_tokenId] >= mintAmount[_tokenId] + 1, "Exceeds max supply");

        address _caller = _msgSender();
        require(tx.origin == _caller, "No contracts");
        require(_caller == brainsContract.ownerOf(_brainTokenId), "Not owner of this _brainTokenId");
        require(!brainTokenIdMinted[_brainTokenId], "_brainTokenId already use to mint");

        if(stage == Stages.Whitelist) {
            require(_tokenId >= 1 && _tokenId <= 5, "Can mint only range 1 to 5");
        }else if(stage == Stages.Public) {
            require(_tokenId >= 1 && _tokenId <= 20, "Can mint only range 1 to 20");
        }

        unchecked { 
            mintAmount[_tokenId] += 1; 
            brainTokenIdMinted[_brainTokenId] = true;
        }

        _mint(_caller, _tokenId, 1, "");
    }

    function uri(uint256 _tokenId) public view override returns (string memory) {
        return bytes(baseURI).length > 0 ? string(
            abi.encodePacked(
              baseURI,
              Strings.toString(_tokenId),
              ".json"
            )
        ) : "";
    }

    function setSupply(uint256[] memory ids, uint256[] memory supply) external onlyOwner {
        require(ids.length == supply.length, "Not same lenght");
        for (uint256 i; i < ids.length; i++) {
            supplyAmount[ids[i]] = supply[i];
        }
    }
    
    function setBrainsContract(ERC721A _brains) external onlyOwner {
        brainsContract = _brains;
    }

    function setStage(Stages _stage) external onlyOwner {
        stage = _stage;
    }

    function setBaseURI(string memory baseURI_) external onlyOwner {
        baseURI = baseURI_;
    }

    function withdraw() external onlyOwner {
        (bool success, ) = _msgSender().call{value: address(this).balance}("");
        require(success, "Failed to send");
    }
}

File 2 of 11 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (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 Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

File 4 of 11 : 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 5 of 11 : 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 6 of 11 : 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 7 of 11 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.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

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

File 8 of 11 : 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 9 of 11 : 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 10 of 11 : IERC1155.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (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 be 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 11 : 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);
}

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

Contract Security Audit

Contract ABI

[{"inputs":[],"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":[{"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":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"brainTokenIdMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"brainsContract","outputs":[{"internalType":"contract ERC721A","name":"","type":"address"}],"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":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_brainTokenId","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mintAmount","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":"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":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ERC721A","name":"_brains","type":"address"}],"name":"setBrainsContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum ArtForZombiesSpecials.Stages","name":"_stage","type":"uint8"}],"name":"setStage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"supply","type":"uint256[]"}],"name":"setSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stage","outputs":[{"internalType":"enum ArtForZombiesSpecials.Stages","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"supplyAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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"}]

600480546001600160a01b03191673ca0e2e59649423e7f912ce39aeda8cf25f2bfa8c17905560a0604052600060809081526005906200004090826200054c565b506006805460ff191690553480156200005857600080fd5b506040805160208101909152600081526200007381620000f4565b506200007f3362000106565b60015b6015811015620000ed576000818152600760205260408120805460019290620000ad9084906200062e565b92505081905550620000d833826001604051806020016040528060008152506200015860201b60201c565b80620000e48162000649565b91505062000082565b5062000835565b60026200010282826200054c565b5050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038416620001be5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084015b60405180910390fd5b336000620001cc856200027a565b90506000620001db856200027a565b90506000868152602081815260408083206001600160a01b038b168452909152812080548792906200020f9084906200062e565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46200027183600089898989620002d0565b50505050505050565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110620002b757620002b762000665565b602090810291909101015292915050565b505050505050565b620002ef846001600160a01b03166200049c60201b62000f051760201c565b15620002c85760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906200032b9089908990889088908890600401620006cb565b6020604051808303816000875af192505050801562000369575060408051601f3d908101601f19168201909252620003669181019062000712565b60015b62000429576200037862000745565b806308c379a003620003b857506200038f62000791565b806200039c5750620003ba565b8060405162461bcd60e51b8152600401620001b5919062000820565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e204552433131353560448201527f526563656976657220696d706c656d656e7465720000000000000000000000006064820152608401620001b5565b6001600160e01b0319811663f23a6e6160e01b14620002715760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a656374656044820152676420746f6b656e7360c01b6064820152608401620001b5565b6001600160a01b03163b151590565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620004d657607f821691505b602082108103620004f757634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200054757600081815260208120601f850160051c81016020861015620005265750805b601f850160051c820191505b81811015620002c85782815560010162000532565b505050565b81516001600160401b03811115620005685762000568620004ab565b6200058081620005798454620004c1565b84620004fd565b602080601f831160018114620005b857600084156200059f5750858301515b600019600386901b1c1916600185901b178555620002c8565b600085815260208120601f198616915b82811015620005e957888601518255948401946001909101908401620005c8565b5085821015620006085787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b6000821982111562000644576200064462000618565b500190565b6000600182016200065e576200065e62000618565b5060010190565b634e487b7160e01b600052603260045260246000fd5b6000815180845260005b81811015620006a35760208185018101518683018201520162000685565b81811115620006b6576000602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009062000707908301846200067b565b979650505050505050565b6000602082840312156200072557600080fd5b81516001600160e01b0319811681146200073e57600080fd5b9392505050565b600060033d11156200075f5760046000803e5060005160e01c5b90565b601f8201601f191681016001600160401b03811182821017156200078a576200078a620004ab565b6040525050565b600060443d1015620007a05790565b6040516003193d81016004833e81513d6001600160401b038083116024840183101715620007d057505050505090565b8285019150815181811115620007e95750505050505090565b843d8701016020828501011115620008045750505050505090565b620008156020828601018762000762565b509095945050505050565b6020815260006200073e60208301846200067b565b6123c180620008456000396000f3fe60806040526004361061013f5760003560e01c8063715018a6116100b6578063c040e6b81161006f578063c040e6b8146103a4578063ce3cd997146103cb578063e412c3c8146103eb578063e985e9c514610418578063f242432a14610461578063f2fde38b1461048157600080fd5b8063715018a6146102c05780637f21cfb9146102d55780638da5cb5b14610302578063a22cb46514610334578063a2dca4d314610354578063a45181c21461038457600080fd5b806323f927c91161010857806323f927c9146102095780632eb2c2d6146102295780633ccfd60b146102495780634e1273f41461025e57806355f804b31461028b5780636c0360eb146102ab57600080fd5b8062fdd58e1461014457806301ffc9a7146101775780630465ee8e146101a75780630e89341c146101c95780631b2ef1ca146101f6575b600080fd5b34801561015057600080fd5b5061016461015f3660046117e0565b6104a1565b6040519081526020015b60405180910390f35b34801561018357600080fd5b50610197610192366004611822565b610537565b604051901515815260200161016e565b3480156101b357600080fd5b506101c76101c2366004611846565b610589565b005b3480156101d557600080fd5b506101e96101e4366004611863565b6105d5565b60405161016e91906118d8565b6101c76102043660046118eb565b610633565b34801561021557600080fd5b506101c76102243660046119e5565b6109cc565b34801561023557600080fd5b506101c7610244366004611ac7565b610aa2565b34801561025557600080fd5b506101c7610aee565b34801561026a57600080fd5b5061027e610279366004611b75565b610ba4565b60405161016e9190611c66565b34801561029757600080fd5b506101c76102a6366004611c79565b610cce565b3480156102b757600080fd5b506101e9610d08565b3480156102cc57600080fd5b506101c7610d96565b3480156102e157600080fd5b506101646102f0366004611863565b60086020526000908152604090205481565b34801561030e57600080fd5b506003546001600160a01b03165b6040516001600160a01b03909116815260200161016e565b34801561034057600080fd5b506101c761034f366004611cc2565b610dcc565b34801561036057600080fd5b5061019761036f366004611863565b60096020526000908152604090205460ff1681565b34801561039057600080fd5b5060045461031c906001600160a01b031681565b3480156103b057600080fd5b506006546103be9060ff1681565b60405161016e9190611d16565b3480156103d757600080fd5b506101c76103e6366004611d3e565b610dd7565b3480156103f757600080fd5b50610164610406366004611863565b60076020526000908152604090205481565b34801561042457600080fd5b50610197610433366004611d5f565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b34801561046d57600080fd5b506101c761047c366004611d8d565b610e28565b34801561048d57600080fd5b506101c761049c366004611846565b610e6d565b60006001600160a01b0383166105115760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b148061056857506001600160e01b031982166303a24d0760e21b145b8061058357506301ffc9a760e01b6001600160e01b03198316145b92915050565b6003546001600160a01b031633146105b35760405162461bcd60e51b815260040161050890611df6565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b60606000600580546105e690611e2b565b9050116106025760405180602001604052806000815250610583565b600561060d83610f14565b60405160200161061e929190611e65565b60405160208183030381529060405292915050565b600160065460ff16600281111561064c5761064c611d00565b148061066e5750600260065460ff16600281111561066c5761066c611d00565b145b6106a35760405162461bcd60e51b815260206004820152600660248201526514185d5cd95960d21b6044820152606401610508565b6000828152600760205260409020546106bd906001611f12565b600083815260086020526040902054101561070f5760405162461bcd60e51b815260206004820152601260248201527145786365656473206d617820737570706c7960701b6044820152606401610508565b3332811461074e5760405162461bcd60e51b815260206004820152600c60248201526b4e6f20636f6e74726163747360a01b6044820152606401610508565b600480546040516331a9108f60e11b81529182018490526001600160a01b031690636352211e90602401602060405180830381865afa158015610795573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107b99190611f2a565b6001600160a01b0316816001600160a01b0316146108195760405162461bcd60e51b815260206004820152601f60248201527f4e6f74206f776e6572206f662074686973205f627261696e546f6b656e4964006044820152606401610508565b60008281526009602052604090205460ff16156108825760405162461bcd60e51b815260206004820152602160248201527f5f627261696e546f6b656e496420616c72656164792075736520746f206d696e6044820152601d60fa1b6064820152608401610508565b600160065460ff16600281111561089b5761089b611d00565b0361090357600183101580156108b2575060058311155b6108fe5760405162461bcd60e51b815260206004820152601a60248201527f43616e206d696e74206f6e6c792072616e6765203120746f20350000000000006044820152606401610508565b61097f565b600260065460ff16600281111561091c5761091c611d00565b0361097f5760018310158015610933575060148311155b61097f5760405162461bcd60e51b815260206004820152601b60248201527f43616e206d696e74206f6e6c792072616e6765203120746f20323000000000006044820152606401610508565b60008381526007602090815260408083208054600190810190915585845260098352818420805460ff19168217905581519283019091529181526109c791839186919061101d565b505050565b6003546001600160a01b031633146109f65760405162461bcd60e51b815260040161050890611df6565b8051825114610a395760405162461bcd60e51b815260206004820152600f60248201526e139bdd081cd85b59481b195b99da1d608a1b6044820152606401610508565b60005b82518110156109c757818181518110610a5757610a57611f47565b602002602001015160086000858481518110610a7557610a75611f47565b60200260200101518152602001908152602001600020819055508080610a9a90611f5d565b915050610a3c565b6001600160a01b038516331480610abe5750610abe8533610433565b610ada5760405162461bcd60e51b815260040161050890611f76565b610ae78585858585611131565b5050505050565b6003546001600160a01b03163314610b185760405162461bcd60e51b815260040161050890611df6565b604051600090339047908381818185875af1925050503d8060008114610b5a576040519150601f19603f3d011682016040523d82523d6000602084013e610b5f565b606091505b5050905080610ba15760405162461bcd60e51b815260206004820152600e60248201526d11985a5b1959081d1bc81cd95b9960921b6044820152606401610508565b50565b60608151835114610c095760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610508565b6000835167ffffffffffffffff811115610c2557610c2561190d565b604051908082528060200260200182016040528015610c4e578160200160208202803683370190505b50905060005b8451811015610cc657610c99858281518110610c7257610c72611f47565b6020026020010151858381518110610c8c57610c8c611f47565b60200260200101516104a1565b828281518110610cab57610cab611f47565b6020908102919091010152610cbf81611f5d565b9050610c54565b509392505050565b6003546001600160a01b03163314610cf85760405162461bcd60e51b815260040161050890611df6565b6005610d04828261200b565b5050565b60058054610d1590611e2b565b80601f0160208091040260200160405190810160405280929190818152602001828054610d4190611e2b565b8015610d8e5780601f10610d6357610100808354040283529160200191610d8e565b820191906000526020600020905b815481529060010190602001808311610d7157829003601f168201915b505050505081565b6003546001600160a01b03163314610dc05760405162461bcd60e51b815260040161050890611df6565b610dca600061130e565b565b610d04338383611360565b6003546001600160a01b03163314610e015760405162461bcd60e51b815260040161050890611df6565b6006805482919060ff19166001836002811115610e2057610e20611d00565b021790555050565b6001600160a01b038516331480610e445750610e448533610433565b610e605760405162461bcd60e51b815260040161050890611f76565b610ae78585858585611440565b6003546001600160a01b03163314610e975760405162461bcd60e51b815260040161050890611df6565b6001600160a01b038116610efc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610508565b610ba18161130e565b6001600160a01b03163b151590565b606081600003610f3b5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115610f655780610f4f81611f5d565b9150610f5e9050600a836120e1565b9150610f3f565b60008167ffffffffffffffff811115610f8057610f8061190d565b6040519080825280601f01601f191660200182016040528015610faa576020820181803683370190505b5090505b841561101557610fbf6001836120f5565b9150610fcc600a8661210c565b610fd7906030611f12565b60f81b818381518110610fec57610fec611f47565b60200101906001600160f81b031916908160001a90535061100e600a866120e1565b9450610fae565b949350505050565b6001600160a01b03841661107d5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610508565b3360006110898561156a565b905060006110968561156a565b90506000868152602081815260408083206001600160a01b038b168452909152812080548792906110c8908490611f12565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611128836000898989896115b5565b50505050505050565b81518351146111935760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b6064820152608401610508565b6001600160a01b0384166111b95760405162461bcd60e51b815260040161050890612120565b3360005b84518110156112a05760008582815181106111da576111da611f47565b6020026020010151905060008583815181106111f8576111f8611f47565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156112485760405162461bcd60e51b815260040161050890612165565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290611285908490611f12565b925050819055505050508061129990611f5d565b90506111bd565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516112f09291906121af565b60405180910390a4611306818787878787611710565b505050505050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b0316036113d35760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610508565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0384166114665760405162461bcd60e51b815260040161050890612120565b3360006114728561156a565b9050600061147f8561156a565b90506000868152602081815260408083206001600160a01b038c168452909152902054858110156114c25760405162461bcd60e51b815260040161050890612165565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a168252812080548892906114ff908490611f12565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461155f848a8a8a8a8a6115b5565b505050505050505050565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106115a4576115a4611f47565b602090810291909101015292915050565b6001600160a01b0384163b156113065760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906115f990899089908890889088906004016121dd565b6020604051808303816000875af1925050508015611634575060408051601f3d908101601f1916820190925261163191810190612222565b60015b6116e05761164061223f565b806308c379a003611679575061165461225b565b8061165f575061167b565b8060405162461bcd60e51b815260040161050891906118d8565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610508565b6001600160e01b0319811663f23a6e6160e01b146111285760405162461bcd60e51b8152600401610508906122e5565b6001600160a01b0384163b156113065760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190611754908990899088908890889060040161232d565b6020604051808303816000875af192505050801561178f575060408051601f3d908101601f1916820190925261178c91810190612222565b60015b61179b5761164061223f565b6001600160e01b0319811663bc197c8160e01b146111285760405162461bcd60e51b8152600401610508906122e5565b6001600160a01b0381168114610ba157600080fd5b600080604083850312156117f357600080fd5b82356117fe816117cb565b946020939093013593505050565b6001600160e01b031981168114610ba157600080fd5b60006020828403121561183457600080fd5b813561183f8161180c565b9392505050565b60006020828403121561185857600080fd5b813561183f816117cb565b60006020828403121561187557600080fd5b5035919050565b60005b8381101561189757818101518382015260200161187f565b838111156118a6576000848401525b50505050565b600081518084526118c481602086016020860161187c565b601f01601f19169290920160200192915050565b60208152600061183f60208301846118ac565b600080604083850312156118fe57600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b601f8201601f1916810167ffffffffffffffff811182821017156119495761194961190d565b6040525050565b600067ffffffffffffffff82111561196a5761196a61190d565b5060051b60200190565b600082601f83011261198557600080fd5b8135602061199282611950565b60405161199f8282611923565b83815260059390931b85018201928281019150868411156119bf57600080fd5b8286015b848110156119da57803583529183019183016119c3565b509695505050505050565b600080604083850312156119f857600080fd5b823567ffffffffffffffff80821115611a1057600080fd5b611a1c86838701611974565b93506020850135915080821115611a3257600080fd5b50611a3f85828601611974565b9150509250929050565b600067ffffffffffffffff831115611a6357611a6361190d565b604051611a7a601f8501601f191660200182611923565b809150838152848484011115611a8f57600080fd5b83836020830137600060208583010152509392505050565b600082601f830112611ab857600080fd5b61183f83833560208501611a49565b600080600080600060a08688031215611adf57600080fd5b8535611aea816117cb565b94506020860135611afa816117cb565b9350604086013567ffffffffffffffff80821115611b1757600080fd5b611b2389838a01611974565b94506060880135915080821115611b3957600080fd5b611b4589838a01611974565b93506080880135915080821115611b5b57600080fd5b50611b6888828901611aa7565b9150509295509295909350565b60008060408385031215611b8857600080fd5b823567ffffffffffffffff80821115611ba057600080fd5b818501915085601f830112611bb457600080fd5b81356020611bc182611950565b604051611bce8282611923565b83815260059390931b8501820192828101915089841115611bee57600080fd5b948201945b83861015611c15578535611c06816117cb565b82529482019490820190611bf3565b96505086013592505080821115611a3257600080fd5b600081518084526020808501945080840160005b83811015611c5b57815187529582019590820190600101611c3f565b509495945050505050565b60208152600061183f6020830184611c2b565b600060208284031215611c8b57600080fd5b813567ffffffffffffffff811115611ca257600080fd5b8201601f81018413611cb357600080fd5b61101584823560208401611a49565b60008060408385031215611cd557600080fd5b8235611ce0816117cb565b915060208301358015158114611cf557600080fd5b809150509250929050565b634e487b7160e01b600052602160045260246000fd5b6020810160038310611d3857634e487b7160e01b600052602160045260246000fd5b91905290565b600060208284031215611d5057600080fd5b81356003811061183f57600080fd5b60008060408385031215611d7257600080fd5b8235611d7d816117cb565b91506020830135611cf5816117cb565b600080600080600060a08688031215611da557600080fd5b8535611db0816117cb565b94506020860135611dc0816117cb565b93506040860135925060608601359150608086013567ffffffffffffffff811115611dea57600080fd5b611b6888828901611aa7565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c90821680611e3f57607f821691505b602082108103611e5f57634e487b7160e01b600052602260045260246000fd5b50919050565b6000808454611e7381611e2b565b60018281168015611e8b5760018114611ea057611ecf565b60ff1984168752821515830287019450611ecf565b8860005260208060002060005b85811015611ec65781548a820152908401908201611ead565b50505082870194505b505050508351611ee381836020880161187c565b64173539b7b760d91b9101908152600501949350505050565b634e487b7160e01b600052601160045260246000fd5b60008219821115611f2557611f25611efc565b500190565b600060208284031215611f3c57600080fd5b815161183f816117cb565b634e487b7160e01b600052603260045260246000fd5b600060018201611f6f57611f6f611efc565b5060010190565b6020808252602f908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526e195c881b9bdc88185c1c1c9bdd9959608a1b606082015260800190565b601f8211156109c757600081815260208120601f850160051c81016020861015611fec5750805b601f850160051c820191505b8181101561130657828155600101611ff8565b815167ffffffffffffffff8111156120255761202561190d565b612039816120338454611e2b565b84611fc5565b602080601f83116001811461206e57600084156120565750858301515b600019600386901b1c1916600185901b178555611306565b600085815260208120601f198616915b8281101561209d5788860151825594840194600190910190840161207e565b50858210156120bb5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601260045260246000fd5b6000826120f0576120f06120cb565b500490565b60008282101561210757612107611efc565b500390565b60008261211b5761211b6120cb565b500690565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6040815260006121c26040830185611c2b565b82810360208401526121d48185611c2b565b95945050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090612217908301846118ac565b979650505050505050565b60006020828403121561223457600080fd5b815161183f8161180c565b600060033d11156122585760046000803e5060005160e01c5b90565b600060443d10156122695790565b6040516003193d81016004833e81513d67ffffffffffffffff816024840111818411171561229957505050505090565b82850191508151818111156122b15750505050505090565b843d87010160208285010111156122cb5750505050505090565b6122da60208286010187611923565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b0386811682528516602082015260a06040820181905260009061235990830186611c2b565b828103606084015261236b8186611c2b565b9050828103608084015261237f81856118ac565b9897505050505050505056fea2646970667358221220a1389670945a9f563e028d3c5882bb4a5b600dea19233068a643a020ead6cba564736f6c634300080f0033

Deployed Bytecode

0x60806040526004361061013f5760003560e01c8063715018a6116100b6578063c040e6b81161006f578063c040e6b8146103a4578063ce3cd997146103cb578063e412c3c8146103eb578063e985e9c514610418578063f242432a14610461578063f2fde38b1461048157600080fd5b8063715018a6146102c05780637f21cfb9146102d55780638da5cb5b14610302578063a22cb46514610334578063a2dca4d314610354578063a45181c21461038457600080fd5b806323f927c91161010857806323f927c9146102095780632eb2c2d6146102295780633ccfd60b146102495780634e1273f41461025e57806355f804b31461028b5780636c0360eb146102ab57600080fd5b8062fdd58e1461014457806301ffc9a7146101775780630465ee8e146101a75780630e89341c146101c95780631b2ef1ca146101f6575b600080fd5b34801561015057600080fd5b5061016461015f3660046117e0565b6104a1565b6040519081526020015b60405180910390f35b34801561018357600080fd5b50610197610192366004611822565b610537565b604051901515815260200161016e565b3480156101b357600080fd5b506101c76101c2366004611846565b610589565b005b3480156101d557600080fd5b506101e96101e4366004611863565b6105d5565b60405161016e91906118d8565b6101c76102043660046118eb565b610633565b34801561021557600080fd5b506101c76102243660046119e5565b6109cc565b34801561023557600080fd5b506101c7610244366004611ac7565b610aa2565b34801561025557600080fd5b506101c7610aee565b34801561026a57600080fd5b5061027e610279366004611b75565b610ba4565b60405161016e9190611c66565b34801561029757600080fd5b506101c76102a6366004611c79565b610cce565b3480156102b757600080fd5b506101e9610d08565b3480156102cc57600080fd5b506101c7610d96565b3480156102e157600080fd5b506101646102f0366004611863565b60086020526000908152604090205481565b34801561030e57600080fd5b506003546001600160a01b03165b6040516001600160a01b03909116815260200161016e565b34801561034057600080fd5b506101c761034f366004611cc2565b610dcc565b34801561036057600080fd5b5061019761036f366004611863565b60096020526000908152604090205460ff1681565b34801561039057600080fd5b5060045461031c906001600160a01b031681565b3480156103b057600080fd5b506006546103be9060ff1681565b60405161016e9190611d16565b3480156103d757600080fd5b506101c76103e6366004611d3e565b610dd7565b3480156103f757600080fd5b50610164610406366004611863565b60076020526000908152604090205481565b34801561042457600080fd5b50610197610433366004611d5f565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b34801561046d57600080fd5b506101c761047c366004611d8d565b610e28565b34801561048d57600080fd5b506101c761049c366004611846565b610e6d565b60006001600160a01b0383166105115760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b148061056857506001600160e01b031982166303a24d0760e21b145b8061058357506301ffc9a760e01b6001600160e01b03198316145b92915050565b6003546001600160a01b031633146105b35760405162461bcd60e51b815260040161050890611df6565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b60606000600580546105e690611e2b565b9050116106025760405180602001604052806000815250610583565b600561060d83610f14565b60405160200161061e929190611e65565b60405160208183030381529060405292915050565b600160065460ff16600281111561064c5761064c611d00565b148061066e5750600260065460ff16600281111561066c5761066c611d00565b145b6106a35760405162461bcd60e51b815260206004820152600660248201526514185d5cd95960d21b6044820152606401610508565b6000828152600760205260409020546106bd906001611f12565b600083815260086020526040902054101561070f5760405162461bcd60e51b815260206004820152601260248201527145786365656473206d617820737570706c7960701b6044820152606401610508565b3332811461074e5760405162461bcd60e51b815260206004820152600c60248201526b4e6f20636f6e74726163747360a01b6044820152606401610508565b600480546040516331a9108f60e11b81529182018490526001600160a01b031690636352211e90602401602060405180830381865afa158015610795573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107b99190611f2a565b6001600160a01b0316816001600160a01b0316146108195760405162461bcd60e51b815260206004820152601f60248201527f4e6f74206f776e6572206f662074686973205f627261696e546f6b656e4964006044820152606401610508565b60008281526009602052604090205460ff16156108825760405162461bcd60e51b815260206004820152602160248201527f5f627261696e546f6b656e496420616c72656164792075736520746f206d696e6044820152601d60fa1b6064820152608401610508565b600160065460ff16600281111561089b5761089b611d00565b0361090357600183101580156108b2575060058311155b6108fe5760405162461bcd60e51b815260206004820152601a60248201527f43616e206d696e74206f6e6c792072616e6765203120746f20350000000000006044820152606401610508565b61097f565b600260065460ff16600281111561091c5761091c611d00565b0361097f5760018310158015610933575060148311155b61097f5760405162461bcd60e51b815260206004820152601b60248201527f43616e206d696e74206f6e6c792072616e6765203120746f20323000000000006044820152606401610508565b60008381526007602090815260408083208054600190810190915585845260098352818420805460ff19168217905581519283019091529181526109c791839186919061101d565b505050565b6003546001600160a01b031633146109f65760405162461bcd60e51b815260040161050890611df6565b8051825114610a395760405162461bcd60e51b815260206004820152600f60248201526e139bdd081cd85b59481b195b99da1d608a1b6044820152606401610508565b60005b82518110156109c757818181518110610a5757610a57611f47565b602002602001015160086000858481518110610a7557610a75611f47565b60200260200101518152602001908152602001600020819055508080610a9a90611f5d565b915050610a3c565b6001600160a01b038516331480610abe5750610abe8533610433565b610ada5760405162461bcd60e51b815260040161050890611f76565b610ae78585858585611131565b5050505050565b6003546001600160a01b03163314610b185760405162461bcd60e51b815260040161050890611df6565b604051600090339047908381818185875af1925050503d8060008114610b5a576040519150601f19603f3d011682016040523d82523d6000602084013e610b5f565b606091505b5050905080610ba15760405162461bcd60e51b815260206004820152600e60248201526d11985a5b1959081d1bc81cd95b9960921b6044820152606401610508565b50565b60608151835114610c095760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610508565b6000835167ffffffffffffffff811115610c2557610c2561190d565b604051908082528060200260200182016040528015610c4e578160200160208202803683370190505b50905060005b8451811015610cc657610c99858281518110610c7257610c72611f47565b6020026020010151858381518110610c8c57610c8c611f47565b60200260200101516104a1565b828281518110610cab57610cab611f47565b6020908102919091010152610cbf81611f5d565b9050610c54565b509392505050565b6003546001600160a01b03163314610cf85760405162461bcd60e51b815260040161050890611df6565b6005610d04828261200b565b5050565b60058054610d1590611e2b565b80601f0160208091040260200160405190810160405280929190818152602001828054610d4190611e2b565b8015610d8e5780601f10610d6357610100808354040283529160200191610d8e565b820191906000526020600020905b815481529060010190602001808311610d7157829003601f168201915b505050505081565b6003546001600160a01b03163314610dc05760405162461bcd60e51b815260040161050890611df6565b610dca600061130e565b565b610d04338383611360565b6003546001600160a01b03163314610e015760405162461bcd60e51b815260040161050890611df6565b6006805482919060ff19166001836002811115610e2057610e20611d00565b021790555050565b6001600160a01b038516331480610e445750610e448533610433565b610e605760405162461bcd60e51b815260040161050890611f76565b610ae78585858585611440565b6003546001600160a01b03163314610e975760405162461bcd60e51b815260040161050890611df6565b6001600160a01b038116610efc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610508565b610ba18161130e565b6001600160a01b03163b151590565b606081600003610f3b5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115610f655780610f4f81611f5d565b9150610f5e9050600a836120e1565b9150610f3f565b60008167ffffffffffffffff811115610f8057610f8061190d565b6040519080825280601f01601f191660200182016040528015610faa576020820181803683370190505b5090505b841561101557610fbf6001836120f5565b9150610fcc600a8661210c565b610fd7906030611f12565b60f81b818381518110610fec57610fec611f47565b60200101906001600160f81b031916908160001a90535061100e600a866120e1565b9450610fae565b949350505050565b6001600160a01b03841661107d5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610508565b3360006110898561156a565b905060006110968561156a565b90506000868152602081815260408083206001600160a01b038b168452909152812080548792906110c8908490611f12565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611128836000898989896115b5565b50505050505050565b81518351146111935760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b6064820152608401610508565b6001600160a01b0384166111b95760405162461bcd60e51b815260040161050890612120565b3360005b84518110156112a05760008582815181106111da576111da611f47565b6020026020010151905060008583815181106111f8576111f8611f47565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156112485760405162461bcd60e51b815260040161050890612165565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290611285908490611f12565b925050819055505050508061129990611f5d565b90506111bd565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516112f09291906121af565b60405180910390a4611306818787878787611710565b505050505050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b0316036113d35760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610508565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0384166114665760405162461bcd60e51b815260040161050890612120565b3360006114728561156a565b9050600061147f8561156a565b90506000868152602081815260408083206001600160a01b038c168452909152902054858110156114c25760405162461bcd60e51b815260040161050890612165565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a168252812080548892906114ff908490611f12565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461155f848a8a8a8a8a6115b5565b505050505050505050565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106115a4576115a4611f47565b602090810291909101015292915050565b6001600160a01b0384163b156113065760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906115f990899089908890889088906004016121dd565b6020604051808303816000875af1925050508015611634575060408051601f3d908101601f1916820190925261163191810190612222565b60015b6116e05761164061223f565b806308c379a003611679575061165461225b565b8061165f575061167b565b8060405162461bcd60e51b815260040161050891906118d8565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610508565b6001600160e01b0319811663f23a6e6160e01b146111285760405162461bcd60e51b8152600401610508906122e5565b6001600160a01b0384163b156113065760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190611754908990899088908890889060040161232d565b6020604051808303816000875af192505050801561178f575060408051601f3d908101601f1916820190925261178c91810190612222565b60015b61179b5761164061223f565b6001600160e01b0319811663bc197c8160e01b146111285760405162461bcd60e51b8152600401610508906122e5565b6001600160a01b0381168114610ba157600080fd5b600080604083850312156117f357600080fd5b82356117fe816117cb565b946020939093013593505050565b6001600160e01b031981168114610ba157600080fd5b60006020828403121561183457600080fd5b813561183f8161180c565b9392505050565b60006020828403121561185857600080fd5b813561183f816117cb565b60006020828403121561187557600080fd5b5035919050565b60005b8381101561189757818101518382015260200161187f565b838111156118a6576000848401525b50505050565b600081518084526118c481602086016020860161187c565b601f01601f19169290920160200192915050565b60208152600061183f60208301846118ac565b600080604083850312156118fe57600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b601f8201601f1916810167ffffffffffffffff811182821017156119495761194961190d565b6040525050565b600067ffffffffffffffff82111561196a5761196a61190d565b5060051b60200190565b600082601f83011261198557600080fd5b8135602061199282611950565b60405161199f8282611923565b83815260059390931b85018201928281019150868411156119bf57600080fd5b8286015b848110156119da57803583529183019183016119c3565b509695505050505050565b600080604083850312156119f857600080fd5b823567ffffffffffffffff80821115611a1057600080fd5b611a1c86838701611974565b93506020850135915080821115611a3257600080fd5b50611a3f85828601611974565b9150509250929050565b600067ffffffffffffffff831115611a6357611a6361190d565b604051611a7a601f8501601f191660200182611923565b809150838152848484011115611a8f57600080fd5b83836020830137600060208583010152509392505050565b600082601f830112611ab857600080fd5b61183f83833560208501611a49565b600080600080600060a08688031215611adf57600080fd5b8535611aea816117cb565b94506020860135611afa816117cb565b9350604086013567ffffffffffffffff80821115611b1757600080fd5b611b2389838a01611974565b94506060880135915080821115611b3957600080fd5b611b4589838a01611974565b93506080880135915080821115611b5b57600080fd5b50611b6888828901611aa7565b9150509295509295909350565b60008060408385031215611b8857600080fd5b823567ffffffffffffffff80821115611ba057600080fd5b818501915085601f830112611bb457600080fd5b81356020611bc182611950565b604051611bce8282611923565b83815260059390931b8501820192828101915089841115611bee57600080fd5b948201945b83861015611c15578535611c06816117cb565b82529482019490820190611bf3565b96505086013592505080821115611a3257600080fd5b600081518084526020808501945080840160005b83811015611c5b57815187529582019590820190600101611c3f565b509495945050505050565b60208152600061183f6020830184611c2b565b600060208284031215611c8b57600080fd5b813567ffffffffffffffff811115611ca257600080fd5b8201601f81018413611cb357600080fd5b61101584823560208401611a49565b60008060408385031215611cd557600080fd5b8235611ce0816117cb565b915060208301358015158114611cf557600080fd5b809150509250929050565b634e487b7160e01b600052602160045260246000fd5b6020810160038310611d3857634e487b7160e01b600052602160045260246000fd5b91905290565b600060208284031215611d5057600080fd5b81356003811061183f57600080fd5b60008060408385031215611d7257600080fd5b8235611d7d816117cb565b91506020830135611cf5816117cb565b600080600080600060a08688031215611da557600080fd5b8535611db0816117cb565b94506020860135611dc0816117cb565b93506040860135925060608601359150608086013567ffffffffffffffff811115611dea57600080fd5b611b6888828901611aa7565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c90821680611e3f57607f821691505b602082108103611e5f57634e487b7160e01b600052602260045260246000fd5b50919050565b6000808454611e7381611e2b565b60018281168015611e8b5760018114611ea057611ecf565b60ff1984168752821515830287019450611ecf565b8860005260208060002060005b85811015611ec65781548a820152908401908201611ead565b50505082870194505b505050508351611ee381836020880161187c565b64173539b7b760d91b9101908152600501949350505050565b634e487b7160e01b600052601160045260246000fd5b60008219821115611f2557611f25611efc565b500190565b600060208284031215611f3c57600080fd5b815161183f816117cb565b634e487b7160e01b600052603260045260246000fd5b600060018201611f6f57611f6f611efc565b5060010190565b6020808252602f908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526e195c881b9bdc88185c1c1c9bdd9959608a1b606082015260800190565b601f8211156109c757600081815260208120601f850160051c81016020861015611fec5750805b601f850160051c820191505b8181101561130657828155600101611ff8565b815167ffffffffffffffff8111156120255761202561190d565b612039816120338454611e2b565b84611fc5565b602080601f83116001811461206e57600084156120565750858301515b600019600386901b1c1916600185901b178555611306565b600085815260208120601f198616915b8281101561209d5788860151825594840194600190910190840161207e565b50858210156120bb5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601260045260246000fd5b6000826120f0576120f06120cb565b500490565b60008282101561210757612107611efc565b500390565b60008261211b5761211b6120cb565b500690565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6040815260006121c26040830185611c2b565b82810360208401526121d48185611c2b565b95945050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090612217908301846118ac565b979650505050505050565b60006020828403121561223457600080fd5b815161183f8161180c565b600060033d11156122585760046000803e5060005160e01c5b90565b600060443d10156122695790565b6040516003193d81016004833e81513d67ffffffffffffffff816024840111818411171561229957505050505090565b82850191508151818111156122b15750505050505090565b843d87010160208285010111156122cb5750505050505090565b6122da60208286010187611923565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b0386811682528516602082015260a06040820181905260009061235990830186611c2b565b828103606084015261236b8186611c2b565b9050828103608084015261237f81856118ac565b9897505050505050505056fea2646970667358221220a1389670945a9f563e028d3c5882bb4a5b600dea19233068a643a020ead6cba564736f6c634300080f0033

Deployed Bytecode Sourcemap

760:2673:10:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2185:227:1;;;;;;;;;;-1:-1:-1;2185:227:1;;;;;:::i;:::-;;:::i;:::-;;;616:25:11;;;604:2;589:18;2185:227:1;;;;;;;;1236:305;;;;;;;;;;-1:-1:-1;1236:305:1;;;;;:::i;:::-;;:::i;:::-;;;1203:14:11;;1196:22;1178:41;;1166:2;1151:18;1236:305:1;1038:187:11;2942:106:10;;;;;;;;;;-1:-1:-1;2942:106:10;;;;;:::i;:::-;;:::i;:::-;;2368:289;;;;;;;;;;-1:-1:-1;2368:289:10;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1371:989::-;;;;;;:::i;:::-;;:::i;2665:265::-;;;;;;;;;;-1:-1:-1;2665:265:10;;;;;:::i;:::-;;:::i;4065:427:1:-;;;;;;;;;;-1:-1:-1;4065:427:1;;;;;:::i;:::-;;:::i;3257:173:10:-;;;;;;;;;;;;;:::i;2569:508:1:-;;;;;;;;;;-1:-1:-1;2569:508:1;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;3149:100:10:-;;;;;;;;;;-1:-1:-1;3149:100:10;;;;;:::i;:::-;;:::i;959:26::-;;;;;;;;;;;;;:::i;1668:101:0:-;;;;;;;;;;;;;:::i;1086:47:10:-;;;;;;;;;;-1:-1:-1;1086:47:10;;;;;:::i;:::-;;;;;;;;;;;;;;1036:85:0;;;;;;;;;;-1:-1:-1;1108:6:0;;-1:-1:-1;;;;;1108:6:0;1036:85;;;-1:-1:-1;;;;;8971:32:11;;;8953:51;;8941:2;8926:18;1036:85:0;8807:203:11;3145:153:1;;;;;;;;;;-1:-1:-1;3145:153:1;;;;;:::i;:::-;;:::i;1140:50:10:-;;;;;;;;;;-1:-1:-1;1140:50:10;;;;;:::i;:::-;;;;;;;;;;;;;;;;869:83;;;;;;;;;;-1:-1:-1;869:83:10;;;;-1:-1:-1;;;;;869:83:10;;;992:35;;;;;;;;;;-1:-1:-1;992:35:10;;;;;;;;;;;;;;;:::i;3056:85::-;;;;;;;;;;-1:-1:-1;3056:85:10;;;;;:::i;:::-;;:::i;1034:45::-;;;;;;;;;;-1:-1:-1;1034:45:10;;;;;:::i;:::-;;;;;;;;;;;;;;3365:166:1;;;;;;;;;;-1:-1:-1;3365:166:1;;;;;:::i;:::-;-1:-1:-1;;;;;3487:27:1;;;3464:4;3487:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;3365:166;3598:395;;;;;;;;;;-1:-1:-1;3598:395:1;;;;;:::i;:::-;;:::i;1918:198:0:-;;;;;;;;;;-1:-1:-1;1918:198:0;;;;;:::i;:::-;;:::i;2185:227:1:-;2271:7;-1:-1:-1;;;;;2298:21:1;;2290:76;;;;-1:-1:-1;;;2290:76:1;;11994:2:11;2290:76:1;;;11976:21:11;12033:2;12013:18;;;12006:30;12072:34;12052:18;;;12045:62;-1:-1:-1;;;12123:18:11;;;12116:40;12173:19;;2290:76:1;;;;;;;;;-1:-1:-1;2383:9:1;:13;;;;;;;;;;;-1:-1:-1;;;;;2383:22:1;;;;;;;;;;;;2185:227::o;1236:305::-;1338:4;-1:-1:-1;;;;;;1373:41:1;;-1:-1:-1;;;1373:41:1;;:109;;-1:-1:-1;;;;;;;1430:52:1;;-1:-1:-1;;;1430:52:1;1373:109;:161;;;-1:-1:-1;;;;;;;;;;937:40:8;;;1498:36:1;1354:180;1236:305;-1:-1:-1;;1236:305:1:o;2942:106:10:-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:6;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;3016:14:10::1;:24:::0;;-1:-1:-1;;;;;;3016:24:10::1;-1:-1:-1::0;;;;;3016:24:10;;;::::1;::::0;;;::::1;::::0;;2942:106::o;2368:289::-;2429:13;2486:1;2468:7;2462:21;;;;;:::i;:::-;;;:25;:187;;;;;;;;;;;;;;;;;2544:7;2568:26;2585:8;2568:16;:26::i;:::-;2511:122;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2455:194;2368:289;-1:-1:-1;;2368:289:10:o;1371:989::-;1471:16;1462:5;;;;:25;;;;;;;;:::i;:::-;;:51;;;-1:-1:-1;1500:13:10;1491:5;;;;:22;;;;;;;;:::i;:::-;;1462:51;1454:70;;;;-1:-1:-1;;;1454:70:10;;14456:2:11;1454:70:10;;;14438:21:11;14495:1;14475:18;;;14468:29;-1:-1:-1;;;14513:18:11;;;14506:36;14559:18;;1454:70:10;14254:329:11;1454:70:10;1569:20;;;;:10;:20;;;;;;:24;;1592:1;1569:24;:::i;:::-;1543:22;;;;:12;:22;;;;;;:50;;1535:81;;;;-1:-1:-1;;;1535:81:10;;15055:2:11;1535:81:10;;;15037:21:11;15094:2;15074:18;;;15067:30;-1:-1:-1;;;15113:18:11;;;15106:48;15171:18;;1535:81:10;14853:342:11;1535:81:10;719:10:6;1678:9:10;:20;;1670:45;;;;-1:-1:-1;;;1670:45:10;;15402:2:11;1670:45:10;;;15384:21:11;15441:2;15421:18;;;15414:30;-1:-1:-1;;;15460:18:11;;;15453:42;15512:18;;1670:45:10;15200:336:11;1670:45:10;1745:14;;;:37;;-1:-1:-1;;;1745:37:10;;;;;616:25:11;;;-1:-1:-1;;;;;1745:14:10;;:22;;589:18:11;;1745:37:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1734:48:10;:7;-1:-1:-1;;;;;1734:48:10;;1726:92;;;;-1:-1:-1;;;1726:92:10;;15999:2:11;1726:92:10;;;15981:21:11;16038:2;16018:18;;;16011:30;16077:33;16057:18;;;16050:61;16128:18;;1726:92:10;15797:355:11;1726:92:10;1838:33;;;;:18;:33;;;;;;;;1837:34;1829:80;;;;-1:-1:-1;;;1829:80:10;;16359:2:11;1829:80:10;;;16341:21:11;16398:2;16378:18;;;16371:30;16437:34;16417:18;;;16410:62;-1:-1:-1;;;16488:18:11;;;16481:31;16529:19;;1829:80:10;16157:397:11;1829:80:10;1934:16;1925:5;;;;:25;;;;;;;;:::i;:::-;;1922:256;;1987:1;1975:8;:13;;:30;;;;;2004:1;1992:8;:13;;1975:30;1967:69;;;;-1:-1:-1;;;1967:69:10;;16761:2:11;1967:69:10;;;16743:21:11;16800:2;16780:18;;;16773:30;16839:28;16819:18;;;16812:56;16885:18;;1967:69:10;16559:350:11;1967:69:10;1922:256;;;2065:13;2056:5;;;;:22;;;;;;;;:::i;:::-;;2053:125;;2115:1;2103:8;:13;;:31;;;;;2132:2;2120:8;:14;;2103:31;2095:71;;;;-1:-1:-1;;;2095:71:10;;17116:2:11;2095:71:10;;;17098:21:11;17155:2;17135:18;;;17128:30;17194:29;17174:18;;;17167:57;17241:18;;2095:71:10;16914:351:11;2095:71:10;2216:20;;;;:10;:20;;;;;;;;:25;;2240:1;2216:25;;;;;;2257:33;;;:18;:33;;;;;:40;;-1:-1:-1;;2257:40:10;;;;;2321:31;;;;;;;;;;;;;2327:7;;2227:8;;2240:1;2321:5;:31::i;:::-;1443:917;1371:989;;:::o;2665:265::-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:6;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;2783:6:10::1;:13;2769:3;:10;:27;2761:55;;;::::0;-1:-1:-1;;;2761:55:10;;17472:2:11;2761:55:10::1;::::0;::::1;17454:21:11::0;17511:2;17491:18;;;17484:30;-1:-1:-1;;;17530:18:11;;;17523:45;17585:18;;2761:55:10::1;17270:339:11::0;2761:55:10::1;2832:9;2827:96;2847:3;:10;2843:1;:14;2827:96;;;2902:6;2909:1;2902:9;;;;;;;;:::i;:::-;;;;;;;2879:12;:20;2892:3;2896:1;2892:6;;;;;;;;:::i;:::-;;;;;;;2879:20;;;;;;;;;;;:32;;;;2859:3;;;;;:::i;:::-;;;;2827:96;;4065:427:1::0;-1:-1:-1;;;;;4290:20:1;;719:10:6;4290:20:1;;:60;;-1:-1:-1;4314:36:1;4331:4;719:10:6;3365:166:1;:::i;4314:36::-;4269:154;;;;-1:-1:-1;;;4269:154:1;;;;;;;:::i;:::-;4433:52;4456:4;4462:2;4466:3;4471:7;4480:4;4433:22;:52::i;:::-;4065:427;;;;;:::o;3257:173:10:-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:6;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;3326:51:10::1;::::0;3308:12:::1;::::0;719:10:6;;3351:21:10::1;::::0;3308:12;3326:51;3308:12;3326:51;3351:21;719:10:6;3326:51:10::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3307:70;;;3396:7;3388:34;;;::::0;-1:-1:-1;;;3388:34:10;;18714:2:11;3388:34:10::1;::::0;::::1;18696:21:11::0;18753:2;18733:18;;;18726:30;-1:-1:-1;;;18772:18:11;;;18765:44;18826:18;;3388:34:10::1;18512:338:11::0;3388:34:10::1;3296:134;3257:173::o:0;2569:508:1:-;2720:16;2779:3;:10;2760:8;:15;:29;2752:83;;;;-1:-1:-1;;;2752:83:1;;19057:2:11;2752:83:1;;;19039:21:11;19096:2;19076:18;;;19069:30;19135:34;19115:18;;;19108:62;-1:-1:-1;;;19186:18:11;;;19179:39;19235:19;;2752:83:1;18855:405:11;2752:83:1;2846:30;2893:8;:15;2879:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2879:30:1;;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;;;-1:-1:-1;3057:13:1;2569:508;-1:-1:-1;;;2569:508:1:o;3149:100:10:-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:6;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;3223:7:10::1;:18;3233:8:::0;3223:7;:18:::1;:::i;:::-;;3149:100:::0;:::o;959:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1668:101:0:-;1108:6;;-1:-1:-1;;;;;1108:6:0;719:10:6;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;1732:30:::1;1759:1;1732:18;:30::i;:::-;1668:101::o:0;3145:153:1:-;3239:52;719:10:6;3272:8:1;3282;3239:18;:52::i;3056:85:10:-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:6;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;3119:5:10::1;:14:::0;;3127:6;;3119:5;-1:-1:-1;;3119:14:10::1;::::0;3127:6;3119:14:::1;::::0;::::1;;;;;;:::i;:::-;;;;;;3056:85:::0;:::o;3598:395:1:-;-1:-1:-1;;;;;3798:20:1;;719:10:6;3798:20:1;;:60;;-1:-1:-1;3822:36:1;3839:4;719:10:6;3365:166:1;:::i;3822:36::-;3777:154;;;;-1:-1:-1;;;3777:154:1;;;;;;;:::i;:::-;3941:45;3959:4;3965:2;3969;3973:6;3981:4;3941:17;:45::i;1918:198:0:-;1108:6;;-1:-1:-1;;;;;1108:6:0;719:10:6;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2006:22:0;::::1;1998:73;;;::::0;-1:-1:-1;;;1998:73:0;;21545:2:11;1998:73:0::1;::::0;::::1;21527:21:11::0;21584:2;21564:18;;;21557:30;21623:34;21603:18;;;21596:62;-1:-1:-1;;;21674:18:11;;;21667:36;21720:19;;1998:73:0::1;21343:402:11::0;1998:73:0::1;2081:28;2100:8;2081:18;:28::i;1175:320:5:-:0;-1:-1:-1;;;;;1465:19:5;;:23;;;1175:320::o;328:703:7:-;384:13;601:5;610:1;601:10;597:51;;-1:-1:-1;;627:10:7;;;;;;;;;;;;-1:-1:-1;;;627:10:7;;;;;328:703::o;597:51::-;672:5;657:12;711:75;718:9;;711:75;;743:8;;;;:::i;:::-;;-1:-1:-1;765:10:7;;-1:-1:-1;773:2:7;765:10;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;817:17:7;;795:39;;844:150;851:10;;844:150;;877:11;887:1;877:11;;:::i;:::-;;-1:-1:-1;945:10:7;953:2;945:5;:10;:::i;:::-;932:24;;:2;:24;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;902:56:7;;;;;;;;-1:-1:-1;972:11:7;981:2;972:11;;:::i;:::-;;;844:150;;;1017:6;328:703;-1:-1:-1;;;;328:703:7:o;8632:709:1:-;-1:-1:-1;;;;;8779:16:1;;8771:62;;;;-1:-1:-1;;;8771:62:1;;22456:2:11;8771:62:1;;;22438:21:11;22495:2;22475:18;;;22468:30;22534:34;22514:18;;;22507:62;-1:-1:-1;;;22585:18:11;;;22578:31;22626:19;;8771:62:1;22254:397:11;8771:62:1;719:10:6;8844:16:1;8908:21;8926:2;8908:17;:21::i;:::-;8885:44;;8939:24;8966:25;8984:6;8966:17;:25::i;:::-;8939:52;;9079:9;:13;;;;;;;;;;;-1:-1:-1;;;;;9079:17:1;;;;;;;;;:27;;9100:6;;9079:9;:27;;9100:6;;9079:27;:::i;:::-;;;;-1:-1:-1;;9121:52:1;;;22830:25:11;;;22886:2;22871:18;;22864:34;;;-1:-1:-1;;;;;9121:52:1;;;;9154:1;;9121:52;;;;;;22803:18:11;9121:52:1;;;;;;;9260:74;9291:8;9309:1;9313:2;9317;9321:6;9329:4;9260:30;:74::i;:::-;8761:580;;;8632:709;;;;:::o;6235:1115::-;6455:7;:14;6441:3;:10;:28;6433:81;;;;-1:-1:-1;;;6433:81:1;;23111:2:11;6433:81:1;;;23093:21:11;23150:2;23130:18;;;23123:30;23189:34;23169:18;;;23162:62;-1:-1:-1;;;23240:18:11;;;23233:38;23288:19;;6433:81:1;22909:404:11;6433:81:1;-1:-1:-1;;;;;6532:16:1;;6524:66;;;;-1:-1:-1;;;6524:66:1;;;;;;;:::i;:::-;719:10:6;6601:16:1;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;:::-;;;;;;;;;;;;6844:19;6866:13;;;;;;;;;;-1:-1:-1;;;;;6866:19:1;;;;;;;;;;;;6819:10;;-1:-1:-1;6907:21:1;;;;6899:76;;;;-1:-1:-1;;;6899:76:1;;;;;;;:::i;:::-;7017:9;:13;;;;;;;;;;;-1:-1:-1;;;;;7017:19:1;;;;;;;;;;7039:20;;;7017:42;;7087:17;;;;;;;:27;;7039:20;;7017:9;7087:27;;7039:20;;7087:27;:::i;:::-;;;;;;;;6755:370;;;6750:3;;;;:::i;:::-;;;6714:411;;;;7170:2;-1:-1:-1;;;;;7140:47:1;7164:4;-1:-1:-1;;;;;7140:47:1;7154:8;-1:-1:-1;;;;;7140:47:1;;7174:3;7179:7;7140:47;;;;;;;:::i;:::-;;;;;;;;7268:75;7304:8;7314:4;7320:2;7324:3;7329:7;7338:4;7268:35;:75::i;:::-;6423:927;6235:1115;;;;;:::o;2270:187:0:-;2362:6;;;-1:-1:-1;;;;;2378:17:0;;;-1:-1:-1;;;;;;2378:17:0;;;;;;;2410:40;;2362:6;;;2378:17;2362:6;;2410:40;;2343:16;;2410:40;2333:124;2270:187;:::o;12912:323:1:-;13062:8;-1:-1:-1;;;;;13053:17:1;:5;-1:-1:-1;;;;;13053:17:1;;13045:71;;;;-1:-1:-1;;;13045:71:1;;24807:2:11;13045:71:1;;;24789:21:11;24846:2;24826:18;;;24819:30;24885:34;24865:18;;;24858:62;-1:-1:-1;;;24936:18:11;;;24929:39;24985:19;;13045:71:1;24605:405:11;13045:71:1;-1:-1:-1;;;;;13126:25:1;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;13126:46:1;;;;;;;;;;13187:41;;1178::11;;;13187::1;;1151:18:11;13187:41:1;;;;;;;12912:323;;;:::o;4942:947::-;-1:-1:-1;;;;;5123:16:1;;5115:66;;;;-1:-1:-1;;;5115:66:1;;;;;;;:::i;:::-;719:10:6;5192:16:1;5256:21;5274:2;5256:17;:21::i;:::-;5233:44;;5287:24;5314:25;5332:6;5314:17;:25::i;:::-;5287:52;;5421:19;5443:13;;;;;;;;;;;-1:-1:-1;;;;;5443:19:1;;;;;;;;;;5480:21;;;;5472:76;;;;-1:-1:-1;;;5472:76:1;;;;;;;:::i;:::-;5582:9;:13;;;;;;;;;;;-1:-1:-1;;;;;5582:19:1;;;;;;;;;;5604:20;;;5582:42;;5644:17;;;;;;;:27;;5604:20;;5582:9;5644:27;;5604:20;;5644:27;:::i;:::-;;;;-1:-1:-1;;5687:46:1;;;22830:25:11;;;22886:2;22871:18;;22864:34;;;-1:-1:-1;;;;;5687:46:1;;;;;;;;;;;;;;22803:18:11;5687:46:1;;;;;;;5814:68;5845:8;5855:4;5861:2;5865;5869:6;5877:4;5814:30;:68::i;:::-;5105:784;;;;4942:947;;;;;:::o;17066:193::-;17185:16;;;17199:1;17185:16;;;;;;;;;17132;;17160:22;;17185:16;;;;;;;;;;;;-1:-1:-1;17185:16:1;17160:41;;17222:7;17211:5;17217:1;17211:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;17247:5;17066:193;-1:-1:-1;;17066:193:1:o;15537:725::-;-1:-1:-1;;;;;15744:13:1;;1465:19:5;:23;15740:516:1;;15779:72;;-1:-1:-1;;;15779:72:1;;-1:-1:-1;;;;;15779:38:1;;;;;:72;;15818:8;;15828:4;;15834:2;;15838:6;;15846:4;;15779:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15779:72:1;;;;;;;;-1:-1:-1;;15779:72:1;;;;;;;;;;;;:::i;:::-;;;15775:471;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;16122:6;16115:14;;-1:-1:-1;;;16115:14:1;;;;;;;;:::i;15775:471::-;;;16169:62;;-1:-1:-1;;;16169:62:1;;26897:2:11;16169:62:1;;;26879:21:11;26936:2;26916:18;;;26909:30;26975:34;26955:18;;;26948:62;-1:-1:-1;;;27026:18:11;;;27019:50;27086:19;;16169:62:1;26695:416:11;15775:471:1;-1:-1:-1;;;;;;15900:55:1;;-1:-1:-1;;;15900:55:1;15896:152;;15979:50;;-1:-1:-1;;;15979:50:1;;;;;;;:::i;16268:792::-;-1:-1:-1;;;;;16500:13:1;;1465:19:5;:23;16496:558:1;;16535:79;;-1:-1:-1;;;16535:79:1;;-1:-1:-1;;;;;16535:43:1;;;;;:79;;16579:8;;16589:4;;16595:3;;16600:7;;16609:4;;16535:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16535:79:1;;;;;;;;-1:-1:-1;;16535:79:1;;;;;;;;;;;;:::i;:::-;;;16531:513;;;;:::i;:::-;-1:-1:-1;;;;;;16693:60:1;;-1:-1:-1;;;16693:60:1;16689:157;;16777:50;;-1:-1:-1;;;16777:50:1;;;;;;;:::i;14:131:11:-;-1:-1:-1;;;;;89:31:11;;79:42;;69:70;;135:1;132;125:12;150:315;218:6;226;279:2;267:9;258:7;254:23;250:32;247:52;;;295:1;292;285:12;247:52;334:9;321:23;353:31;378:5;353:31;:::i;:::-;403:5;455:2;440:18;;;;427:32;;-1:-1:-1;;;150:315:11:o;652:131::-;-1:-1:-1;;;;;;726:32:11;;716:43;;706:71;;773:1;770;763:12;788:245;846:6;899:2;887:9;878:7;874:23;870:32;867:52;;;915:1;912;905:12;867:52;954:9;941:23;973:30;997:5;973:30;:::i;:::-;1022:5;788:245;-1:-1:-1;;;788:245:11:o;1230:263::-;1305:6;1358:2;1346:9;1337:7;1333:23;1329:32;1326:52;;;1374:1;1371;1364:12;1326:52;1413:9;1400:23;1432:31;1457:5;1432:31;:::i;1498:180::-;1557:6;1610:2;1598:9;1589:7;1585:23;1581:32;1578:52;;;1626:1;1623;1616:12;1578:52;-1:-1:-1;1649:23:11;;1498:180;-1:-1:-1;1498:180:11:o;1683:258::-;1755:1;1765:113;1779:6;1776:1;1773:13;1765:113;;;1855:11;;;1849:18;1836:11;;;1829:39;1801:2;1794:10;1765:113;;;1896:6;1893:1;1890:13;1887:48;;;1931:1;1922:6;1917:3;1913:16;1906:27;1887:48;;1683:258;;;:::o;1946:::-;1988:3;2026:5;2020:12;2053:6;2048:3;2041:19;2069:63;2125:6;2118:4;2113:3;2109:14;2102:4;2095:5;2091:16;2069:63;:::i;:::-;2186:2;2165:15;-1:-1:-1;;2161:29:11;2152:39;;;;2193:4;2148:50;;1946:258;-1:-1:-1;;1946:258:11:o;2209:220::-;2358:2;2347:9;2340:21;2321:4;2378:45;2419:2;2408:9;2404:18;2396:6;2378:45;:::i;2434:248::-;2502:6;2510;2563:2;2551:9;2542:7;2538:23;2534:32;2531:52;;;2579:1;2576;2569:12;2531:52;-1:-1:-1;;2602:23:11;;;2672:2;2657:18;;;2644:32;;-1:-1:-1;2434:248:11:o;2687:127::-;2748:10;2743:3;2739:20;2736:1;2729:31;2779:4;2776:1;2769:15;2803:4;2800:1;2793:15;2819:249;2929:2;2910:13;;-1:-1:-1;;2906:27:11;2894:40;;2964:18;2949:34;;2985:22;;;2946:62;2943:88;;;3011:18;;:::i;:::-;3047:2;3040:22;-1:-1:-1;;2819:249:11:o;3073:183::-;3133:4;3166:18;3158:6;3155:30;3152:56;;;3188:18;;:::i;:::-;-1:-1:-1;3233:1:11;3229:14;3245:4;3225:25;;3073:183::o;3261:724::-;3315:5;3368:3;3361:4;3353:6;3349:17;3345:27;3335:55;;3386:1;3383;3376:12;3335:55;3422:6;3409:20;3448:4;3471:43;3511:2;3471:43;:::i;:::-;3543:2;3537:9;3555:31;3583:2;3575:6;3555:31;:::i;:::-;3621:18;;;3713:1;3709:10;;;;3697:23;;3693:32;;;3655:15;;;;-1:-1:-1;3737:15:11;;;3734:35;;;3765:1;3762;3755:12;3734:35;3801:2;3793:6;3789:15;3813:142;3829:6;3824:3;3821:15;3813:142;;;3895:17;;3883:30;;3933:12;;;;3846;;3813:142;;;-1:-1:-1;3973:6:11;3261:724;-1:-1:-1;;;;;;3261:724:11:o;3990:595::-;4108:6;4116;4169:2;4157:9;4148:7;4144:23;4140:32;4137:52;;;4185:1;4182;4175:12;4137:52;4225:9;4212:23;4254:18;4295:2;4287:6;4284:14;4281:34;;;4311:1;4308;4301:12;4281:34;4334:61;4387:7;4378:6;4367:9;4363:22;4334:61;:::i;:::-;4324:71;;4448:2;4437:9;4433:18;4420:32;4404:48;;4477:2;4467:8;4464:16;4461:36;;;4493:1;4490;4483:12;4461:36;;4516:63;4571:7;4560:8;4549:9;4545:24;4516:63;:::i;:::-;4506:73;;;3990:595;;;;;:::o;4590:468::-;4654:5;4688:18;4680:6;4677:30;4674:56;;;4710:18;;:::i;:::-;4759:2;4753:9;4771:69;4828:2;4807:15;;-1:-1:-1;;4803:29:11;4834:4;4799:40;4753:9;4771:69;:::i;:::-;4858:6;4849:15;;4888:6;4880;4873:22;4928:3;4919:6;4914:3;4910:16;4907:25;4904:45;;;4945:1;4942;4935:12;4904:45;4995:6;4990:3;4983:4;4975:6;4971:17;4958:44;5050:1;5043:4;5034:6;5026;5022:19;5018:30;5011:41;;4590:468;;;;;:::o;5063:220::-;5105:5;5158:3;5151:4;5143:6;5139:17;5135:27;5125:55;;5176:1;5173;5166:12;5125:55;5198:79;5273:3;5264:6;5251:20;5244:4;5236:6;5232:17;5198:79;:::i;5288:1071::-;5442:6;5450;5458;5466;5474;5527:3;5515:9;5506:7;5502:23;5498:33;5495:53;;;5544:1;5541;5534:12;5495:53;5583:9;5570:23;5602:31;5627:5;5602:31;:::i;:::-;5652:5;-1:-1:-1;5709:2:11;5694:18;;5681:32;5722:33;5681:32;5722:33;:::i;:::-;5774:7;-1:-1:-1;5832:2:11;5817:18;;5804:32;5855:18;5885:14;;;5882:34;;;5912:1;5909;5902:12;5882:34;5935:61;5988:7;5979:6;5968:9;5964:22;5935:61;:::i;:::-;5925:71;;6049:2;6038:9;6034:18;6021:32;6005:48;;6078:2;6068:8;6065:16;6062:36;;;6094:1;6091;6084:12;6062:36;6117:63;6172:7;6161:8;6150:9;6146:24;6117:63;:::i;:::-;6107:73;;6233:3;6222:9;6218:19;6205:33;6189:49;;6263:2;6253:8;6250:16;6247:36;;;6279:1;6276;6269:12;6247:36;;6302:51;6345:7;6334:8;6323:9;6319:24;6302:51;:::i;:::-;6292:61;;;5288:1071;;;;;;;;:::o;6364:1277::-;6482:6;6490;6543:2;6531:9;6522:7;6518:23;6514:32;6511:52;;;6559:1;6556;6549:12;6511:52;6599:9;6586:23;6628:18;6669:2;6661:6;6658:14;6655:34;;;6685:1;6682;6675:12;6655:34;6723:6;6712:9;6708:22;6698:32;;6768:7;6761:4;6757:2;6753:13;6749:27;6739:55;;6790:1;6787;6780:12;6739:55;6826:2;6813:16;6848:4;6871:43;6911:2;6871:43;:::i;:::-;6943:2;6937:9;6955:31;6983:2;6975:6;6955:31;:::i;:::-;7021:18;;;7109:1;7105:10;;;;7097:19;;7093:28;;;7055:15;;;;-1:-1:-1;7133:19:11;;;7130:39;;;7165:1;7162;7155:12;7130:39;7189:11;;;;7209:217;7225:6;7220:3;7217:15;7209:217;;;7305:3;7292:17;7322:31;7347:5;7322:31;:::i;:::-;7366:18;;7242:12;;;;7404;;;;7209:217;;;7445:6;-1:-1:-1;;7489:18:11;;7476:32;;-1:-1:-1;;7520:16:11;;;7517:36;;;7549:1;7546;7539:12;7646:435;7699:3;7737:5;7731:12;7764:6;7759:3;7752:19;7790:4;7819:2;7814:3;7810:12;7803:19;;7856:2;7849:5;7845:14;7877:1;7887:169;7901:6;7898:1;7895:13;7887:169;;;7962:13;;7950:26;;7996:12;;;;8031:15;;;;7923:1;7916:9;7887:169;;;-1:-1:-1;8072:3:11;;7646:435;-1:-1:-1;;;;;7646:435:11:o;8086:261::-;8265:2;8254:9;8247:21;8228:4;8285:56;8337:2;8326:9;8322:18;8314:6;8285:56;:::i;8352:450::-;8421:6;8474:2;8462:9;8453:7;8449:23;8445:32;8442:52;;;8490:1;8487;8480:12;8442:52;8530:9;8517:23;8563:18;8555:6;8552:30;8549:50;;;8595:1;8592;8585:12;8549:50;8618:22;;8671:4;8663:13;;8659:27;-1:-1:-1;8649:55:11;;8700:1;8697;8690:12;8649:55;8723:73;8788:7;8783:2;8770:16;8765:2;8761;8757:11;8723:73;:::i;9015:416::-;9080:6;9088;9141:2;9129:9;9120:7;9116:23;9112:32;9109:52;;;9157:1;9154;9147:12;9109:52;9196:9;9183:23;9215:31;9240:5;9215:31;:::i;:::-;9265:5;-1:-1:-1;9322:2:11;9307:18;;9294:32;9364:15;;9357:23;9345:36;;9335:64;;9395:1;9392;9385:12;9335:64;9418:7;9408:17;;;9015:416;;;;;:::o;9660:127::-;9721:10;9716:3;9712:20;9709:1;9702:31;9752:4;9749:1;9742:15;9776:4;9773:1;9766:15;9792:339;9935:2;9920:18;;9968:1;9957:13;;9947:144;;10013:10;10008:3;10004:20;10001:1;9994:31;10048:4;10045:1;10038:15;10076:4;10073:1;10066:15;9947:144;10100:25;;;9792:339;:::o;10136:267::-;10206:6;10259:2;10247:9;10238:7;10234:23;10230:32;10227:52;;;10275:1;10272;10265:12;10227:52;10314:9;10301:23;10353:1;10346:5;10343:12;10333:40;;10369:1;10366;10359:12;10408:388;10476:6;10484;10537:2;10525:9;10516:7;10512:23;10508:32;10505:52;;;10553:1;10550;10543:12;10505:52;10592:9;10579:23;10611:31;10636:5;10611:31;:::i;:::-;10661:5;-1:-1:-1;10718:2:11;10703:18;;10690:32;10731:33;10690:32;10731:33;:::i;10801:734::-;10905:6;10913;10921;10929;10937;10990:3;10978:9;10969:7;10965:23;10961:33;10958:53;;;11007:1;11004;10997:12;10958:53;11046:9;11033:23;11065:31;11090:5;11065:31;:::i;:::-;11115:5;-1:-1:-1;11172:2:11;11157:18;;11144:32;11185:33;11144:32;11185:33;:::i;:::-;11237:7;-1:-1:-1;11291:2:11;11276:18;;11263:32;;-1:-1:-1;11342:2:11;11327:18;;11314:32;;-1:-1:-1;11397:3:11;11382:19;;11369:33;11425:18;11414:30;;11411:50;;;11457:1;11454;11447:12;11411:50;11480:49;11521:7;11512:6;11501:9;11497:22;11480:49;:::i;12203:356::-;12405:2;12387:21;;;12424:18;;;12417:30;12483:34;12478:2;12463:18;;12456:62;12550:2;12535:18;;12203:356::o;12564:380::-;12643:1;12639:12;;;;12686;;;12707:61;;12761:4;12753:6;12749:17;12739:27;;12707:61;12814:2;12806:6;12803:14;12783:18;12780:38;12777:161;;12860:10;12855:3;12851:20;12848:1;12841:31;12895:4;12892:1;12885:15;12923:4;12920:1;12913:15;12777:161;;12564:380;;;:::o;13075:1174::-;13352:3;13381:1;13414:6;13408:13;13444:36;13470:9;13444:36;:::i;:::-;13499:1;13516:18;;;13543:133;;;;13690:1;13685:356;;;;13509:532;;13543:133;-1:-1:-1;;13576:24:11;;13564:37;;13649:14;;13642:22;13630:35;;13621:45;;;-1:-1:-1;13543:133:11;;13685:356;13716:6;13713:1;13706:17;13746:4;13791:2;13788:1;13778:16;13816:1;13830:165;13844:6;13841:1;13838:13;13830:165;;;13922:14;;13909:11;;;13902:35;13965:16;;;;13859:10;;13830:165;;;13834:3;;;14024:6;14019:3;14015:16;14008:23;;13509:532;;;;;14072:6;14066:13;14088:55;14134:8;14129:3;14122:4;14114:6;14110:17;14088:55;:::i;:::-;-1:-1:-1;;;14165:18:11;;14192:22;;;14241:1;14230:13;;13075:1174;-1:-1:-1;;;;13075:1174:11:o;14588:127::-;14649:10;14644:3;14640:20;14637:1;14630:31;14680:4;14677:1;14670:15;14704:4;14701:1;14694:15;14720:128;14760:3;14791:1;14787:6;14784:1;14781:13;14778:39;;;14797:18;;:::i;:::-;-1:-1:-1;14833:9:11;;14720:128::o;15541:251::-;15611:6;15664:2;15652:9;15643:7;15639:23;15635:32;15632:52;;;15680:1;15677;15670:12;15632:52;15712:9;15706:16;15731:31;15756:5;15731:31;:::i;17614:127::-;17675:10;17670:3;17666:20;17663:1;17656:31;17706:4;17703:1;17696:15;17730:4;17727:1;17720:15;17746:135;17785:3;17806:17;;;17803:43;;17826:18;;:::i;:::-;-1:-1:-1;17873:1:11;17862:13;;17746:135::o;17886:411::-;18088:2;18070:21;;;18127:2;18107:18;;;18100:30;18166:34;18161:2;18146:18;;18139:62;-1:-1:-1;;;18232:2:11;18217:18;;18210:45;18287:3;18272:19;;17886:411::o;19265:545::-;19367:2;19362:3;19359:11;19356:448;;;19403:1;19428:5;19424:2;19417:17;19473:4;19469:2;19459:19;19543:2;19531:10;19527:19;19524:1;19520:27;19514:4;19510:38;19579:4;19567:10;19564:20;19561:47;;;-1:-1:-1;19602:4:11;19561:47;19657:2;19652:3;19648:12;19645:1;19641:20;19635:4;19631:31;19621:41;;19712:82;19730:2;19723:5;19720:13;19712:82;;;19775:17;;;19756:1;19745:13;19712:82;;19986:1352;20112:3;20106:10;20139:18;20131:6;20128:30;20125:56;;;20161:18;;:::i;:::-;20190:97;20280:6;20240:38;20272:4;20266:11;20240:38;:::i;:::-;20234:4;20190:97;:::i;:::-;20342:4;;20406:2;20395:14;;20423:1;20418:663;;;;21125:1;21142:6;21139:89;;;-1:-1:-1;21194:19:11;;;21188:26;21139:89;-1:-1:-1;;19943:1:11;19939:11;;;19935:24;19931:29;19921:40;19967:1;19963:11;;;19918:57;21241:81;;20388:944;;20418:663;13022:1;13015:14;;;13059:4;13046:18;;-1:-1:-1;;20454:20:11;;;20572:236;20586:7;20583:1;20580:14;20572:236;;;20675:19;;;20669:26;20654:42;;20767:27;;;;20735:1;20723:14;;;;20602:19;;20572:236;;;20576:3;20836:6;20827:7;20824:19;20821:201;;;20897:19;;;20891:26;-1:-1:-1;;20980:1:11;20976:14;;;20992:3;20972:24;20968:37;20964:42;20949:58;20934:74;;20821:201;-1:-1:-1;;;;;21068:1:11;21052:14;;;21048:22;21035:36;;-1:-1:-1;19986:1352:11:o;21750:127::-;21811:10;21806:3;21802:20;21799:1;21792:31;21842:4;21839:1;21832:15;21866:4;21863:1;21856:15;21882:120;21922:1;21948;21938:35;;21953:18;;:::i;:::-;-1:-1:-1;21987:9:11;;21882:120::o;22007:125::-;22047:4;22075:1;22072;22069:8;22066:34;;;22080:18;;:::i;:::-;-1:-1:-1;22117:9:11;;22007:125::o;22137:112::-;22169:1;22195;22185:35;;22200:18;;:::i;:::-;-1:-1:-1;22234:9:11;;22137:112::o;23318:401::-;23520:2;23502:21;;;23559:2;23539:18;;;23532:30;23598:34;23593:2;23578:18;;23571:62;-1:-1:-1;;;23664:2:11;23649:18;;23642:35;23709:3;23694:19;;23318:401::o;23724:406::-;23926:2;23908:21;;;23965:2;23945:18;;;23938:30;24004:34;23999:2;23984:18;;23977:62;-1:-1:-1;;;24070:2:11;24055:18;;24048:40;24120:3;24105:19;;23724:406::o;24135:465::-;24392:2;24381:9;24374:21;24355:4;24418:56;24470:2;24459:9;24455:18;24447:6;24418:56;:::i;:::-;24522:9;24514:6;24510:22;24505:2;24494:9;24490:18;24483:50;24550:44;24587:6;24579;24550:44;:::i;:::-;24542:52;24135:465;-1:-1:-1;;;;;24135:465:11:o;25015:561::-;-1:-1:-1;;;;;25312:15:11;;;25294:34;;25364:15;;25359:2;25344:18;;25337:43;25411:2;25396:18;;25389:34;;;25454:2;25439:18;;25432:34;;;25274:3;25497;25482:19;;25475:32;;;25237:4;;25524:46;;25550:19;;25542:6;25524:46;:::i;:::-;25516:54;25015:561;-1:-1:-1;;;;;;;25015:561:11:o;25581:249::-;25650:6;25703:2;25691:9;25682:7;25678:23;25674:32;25671:52;;;25719:1;25716;25709:12;25671:52;25751:9;25745:16;25770:30;25794:5;25770:30;:::i;25835:179::-;25870:3;25912:1;25894:16;25891:23;25888:120;;;25958:1;25955;25952;25937:23;-1:-1:-1;25995:1:11;25989:8;25984:3;25980:18;25888:120;25835:179;:::o;26019:671::-;26058:3;26100:4;26082:16;26079:26;26076:39;;;26019:671;:::o;26076:39::-;26142:2;26136:9;-1:-1:-1;;26207:16:11;26203:25;;26200:1;26136:9;26179:50;26258:4;26252:11;26282:16;26317:18;26388:2;26381:4;26373:6;26369:17;26366:25;26361:2;26353:6;26350:14;26347:45;26344:58;;;26395:5;;;;;26019:671;:::o;26344:58::-;26432:6;26426:4;26422:17;26411:28;;26468:3;26462:10;26495:2;26487:6;26484:14;26481:27;;;26501:5;;;;;;26019:671;:::o;26481:27::-;26585:2;26566:16;26560:4;26556:27;26552:36;26545:4;26536:6;26531:3;26527:16;26523:27;26520:69;26517:82;;;26592:5;;;;;;26019:671;:::o;26517:82::-;26608:57;26659:4;26650:6;26642;26638:19;26634:30;26628:4;26608:57;:::i;:::-;-1:-1:-1;26681:3:11;;26019:671;-1:-1:-1;;;;;26019:671:11:o;27116:404::-;27318:2;27300:21;;;27357:2;27337:18;;;27330:30;27396:34;27391:2;27376:18;;27369:62;-1:-1:-1;;;27462:2:11;27447:18;;27440:38;27510:3;27495:19;;27116:404::o;27525:827::-;-1:-1:-1;;;;;27922:15:11;;;27904:34;;27974:15;;27969:2;27954:18;;27947:43;27884:3;28021:2;28006:18;;27999:31;;;27847:4;;28053:57;;28090:19;;28082:6;28053:57;:::i;:::-;28158:9;28150:6;28146:22;28141:2;28130:9;28126:18;28119:50;28192:44;28229:6;28221;28192:44;:::i;:::-;28178:58;;28285:9;28277:6;28273:22;28267:3;28256:9;28252:19;28245:51;28313:33;28339:6;28331;28313:33;:::i;:::-;28305:41;27525:827;-1:-1:-1;;;;;;;;27525:827:11:o

Swarm Source

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