ETH Price: $2,434.32 (+5.60%)
Gas: 21.7 Gwei

Token

Beach Hut Membership (MBHM)
 

Overview

Max Total Supply

16 MBHM

Holders

16

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
0x188af0036a0a9ba37d56b2c4816361e9f45a60a2
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:
BeachHutMembership

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
File 1 of 22 : BeachHutMembership.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

import "@openzeppelin/contracts/token/ERC1155/extensions/ERC1155Supply.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/Strings.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "./MalibuCoinI.sol";
import "./ERC721AI.sol";
                              
//     ______  ______  ______  ______  __  __       __  __  __  __  ______             
//    /\  == \/\  ___\/\  __ \/\  ___\/\ \_\ \     /\ \_\ \/\ \/\ \/\__  _\            
//    \ \  __<\ \  __\\ \  __ \ \ \___\ \  __ \    \ \  __ \ \ \_\ \/_/\ \/            
//     \ \_____\ \_____\ \_\ \_\ \_____\ \_\ \_\    \ \_\ \_\ \_____\ \ \_\            
//      \/_____/\/_____/\/_/\/_/\/_____/\/_/\/_/     \/_/\/_/\/_____/  \/_/            
//     __    __  ______  __    __  ______  ______  ______  ______  __  __  __  ______  
//    /\ "-./  \/\  ___\/\ "-./  \/\  == \/\  ___\/\  == \/\  ___\/\ \_\ \/\ \/\  == \ 
//    \ \ \-./\ \ \  __\\ \ \-./\ \ \  __<\ \  __\\ \  __<\ \___  \ \  __ \ \ \ \  _-/ 
//     \ \_\ \ \_\ \_____\ \_\ \ \_\ \_____\ \_____\ \_\ \_\/\_____\ \_\ \_\ \_\ \_\   
//      \/_/  \/_/\/_____/\/_/  \/_/\/_____/\/_____/\/_/ /_/\/_____/\/_/\/_/\/_/\/_/   

contract BeachHutMembership is ERC1155Supply, Ownable, ReentrancyGuard {

    string collectionURI = "";
    string private name_;
    string private symbol_; 
    uint256 public tokenPrice;
    uint256 public tokenDiscount;
    uint256 public salesPrice;
    uint256 public tokenQty;
    uint256 public maxMintQty;
    uint256 public currentTokenId;
    bool public paused;
    address public CoinContract;
    address public BABHContract;

    mapping(address => uint256) private lastRewardOfCoins;
    mapping(address => uint256) private retroActiveReward;

    MalibuCoinI public coin;
    ERC721AI public babh;

    constructor() ERC1155(collectionURI) {
        name_ = "Beach Hut Membership";
        symbol_ = "MBHM";
        tokenPrice = 0.15 ether;
        tokenDiscount = 0.05 ether;
        tokenQty = 50;
        maxMintQty = 1;
        currentTokenId = 1;
        paused = true;
    }
    
    function name() public view returns (string memory) {
      return name_;
    }

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

    function mint(uint256 amount)
        public
        payable
        nonReentrant
    {
        require(paused == false, "Minting is paused");
        require(totalSupply(currentTokenId) < tokenQty, "Memberships all minted");
        require(amount <= maxMintQty, "Mint quantity is too high");
        require(tx.origin == _msgSender(), "The caller is another contract");

        salesPrice = tokenPrice;
        if(babh.balanceOf(_msgSender()) > 0) {
            salesPrice = salesPrice - tokenDiscount;
            if(babh.balanceOf(_msgSender()) >= 10) {
                salesPrice = salesPrice - tokenDiscount;
            }
        } 

        require(amount * salesPrice == msg.value, "You have not sent the correct amount of ETH");
        _mint(_msgSender(), currentTokenId, amount, "");
    }

    //=============================================================================
    // Reward Functions
    //=============================================================================

    function getLastRewarded(address account) external view returns (uint256) {
        return lastRewardOfCoins[account];
    }

    function setLastRewarded(address account) external {
        require(_msgSender() == CoinContract, "Only callable from custom ERC20 contract");
        lastRewardOfCoins[account] = block.timestamp;
    }

    function getRetroActiveRewards(address account) external view returns (uint256) {
        return retroActiveReward[account];
    }

    function resetRetroActiveRewards(address account) external {
        require(_msgSender() == CoinContract, "Only callable from custom ERC20 contract");
        retroActiveReward[account] = 0;
    }

    //=============================================================================
    // Admin Functions
    //=============================================================================

    function adminMintOverride(address account, uint256 id, uint256 amount) public onlyOwner {
        _mint(account, id, amount, "");
    }

    function setCollectionURI(string memory newCollectionURI) public onlyOwner {
        collectionURI = newCollectionURI;
    }

    function getCollectionURI() public view returns(string memory) {
        return collectionURI;
    }

    function setTokenPrice(uint256 price) public onlyOwner {
        tokenPrice = price;
    }

    function setTokenDiscount(uint256 price) public onlyOwner {
        tokenDiscount = price;
    }

    function setTokenQty(uint256 qty) public onlyOwner {
        tokenQty = qty;
    }

    function setMaxMintQty(uint256 qty) public onlyOwner {
        maxMintQty = qty;
    }

    function setCurrentTokenId(uint256 id) public onlyOwner {
        currentTokenId = id;
    }

    function togglePaused() public onlyOwner {
        paused = !paused;
    }

    function setBABHContract(address _contract) external onlyOwner {
        require(_contract != address(0), "Can not be address 0");
        babh = ERC721AI(_contract);
        BABHContract = _contract;
    }

    function setMalibuCoin(address _contract) external onlyOwner {
        require(_contract != address(0), "Can not be address 0");
        coin = MalibuCoinI(_contract);
        CoinContract = _contract;
    }

    function withdrawETH() public onlyOwner {
        payable(_msgSender()).transfer(address(this).balance);
    }

    //=============================================================================
    // Override Functions
    //=============================================================================
    
    function _beforeTokenTransfer(address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data) internal override(ERC1155Supply) {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);

        if (getMembershipTokenCount(to) == 0) { 
            lastRewardOfCoins[to] = block.timestamp;
        } else {
            if (coin.getUnclaimedMalibuCoins(to) > 0) {
                retroActiveReward[to] = coin.getUnclaimedMalibuCoins(to);
                lastRewardOfCoins[to] = block.timestamp;
            }
        }
    }

    function getMembershipTokenCount(address account) public view returns (uint256) {

        uint256 membershipTokenId = 0;
        uint256 membershipTokenCount = 0;

        do {
            membershipTokenId++;
            if (balanceOf(account, membershipTokenId) >= 1) {

                membershipTokenCount += balanceOf(account, membershipTokenId);
            }
        } while (exists(membershipTokenId));

        return membershipTokenCount;
    }

    function uri(uint256 _tokenId) public override view returns (string memory) {
        return string(abi.encodePacked(collectionURI, Strings.toString(_tokenId), ".json"));
    }    
}

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

pragma solidity ^0.8.0;

import "../ERC1155.sol";

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

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

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

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

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

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

File 3 of 22 : 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 4 of 22 : 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 5 of 22 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

File 6 of 22 : MalibuCoinI.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

abstract contract MalibuCoinI is IERC20, Ownable {
         uint256 public maxSupply;

        function getUnclaimedMalibuCoins(address account) external view virtual returns (uint256 amount);
        
        function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool);

        function balanceOf(address account) public view virtual override returns (uint256);
}

File 7 of 22 : ERC721AI.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol";
import "@openzeppelin/contracts/utils/Address.sol";
import "@openzeppelin/contracts/utils/Context.sol";
import "@openzeppelin/contracts/utils/Strings.sol";
import "@openzeppelin/contracts/utils/introspection/ERC165.sol";

abstract contract ERC721AI is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    function balanceOf(address account) external view virtual override returns (uint256);
}

File 8 of 22 : ERC1155.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.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: balance query for the zero address");
        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 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: transfer caller is not 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}.
     *
     * 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`
     *
     * 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}.
     *
     * 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 a {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 `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 _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 9 of 22 : 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 10 of 22 : 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 11 of 22 : 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 12 of 22 : 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 13 of 22 : 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 14 of 22 : 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 15 of 22 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

File 16 of 22 : ERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;

import "./IERC20.sol";
import "./extensions/IERC20Metadata.sol";
import "../../utils/Context.sol";

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

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

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

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

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

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

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

File 17 of 22 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}

File 18 of 22 : IERC20Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC20.sol";

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

File 20 of 22 : IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

import "../IERC721.sol";

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

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

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

File 22 of 22 : IERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "../IERC721.sol";

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

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

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

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":[],"name":"BABHContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CoinContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"adminMintOverride","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"babh","outputs":[{"internalType":"contract ERC721AI","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"coin","outputs":[{"internalType":"contract MalibuCoinI","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCollectionURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getLastRewarded","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getMembershipTokenCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getRetroActiveRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintQty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"resetRetroActiveRewards","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":[],"name":"salesPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"}],"name":"setBABHContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newCollectionURI","type":"string"}],"name":"setCollectionURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"setCurrentTokenId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"setLastRewarded","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"}],"name":"setMalibuCoin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"setMaxMintQty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setTokenDiscount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setTokenPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"setTokenQty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"togglePaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokenDiscount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenQty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a06040819052600060808190526200001b91600691620001fa565b503480156200002957600080fd5b50600680546200003990620002a0565b80601f01602080910402602001604051908101604052809291908181526020018280546200006790620002a0565b8015620000b85780601f106200008c57610100808354040283529160200191620000b8565b820191906000526020600020905b8154815290600101906020018083116200009a57829003601f168201915b5050505050620000ce816200018f60201b60201c565b50620000da33620001a8565b60016005556040805180820190915260148082527f426561636820487574204d656d6265727368697000000000000000000000000060209092019182526200012591600791620001fa565b50604080518082019091526004808252634d42484d60e01b60209092019182526200015391600891620001fa565b50670214e8348c4f000060095566b1a2bc2ec50000600a556032600c556001600d819055600e819055600f805460ff19169091179055620002dd565b8051620001a4906002906020840190620001fa565b5050565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200020890620002a0565b90600052602060002090601f0160209004810192826200022c576000855562000277565b82601f106200024757805160ff191683800117855562000277565b8280016001018555821562000277579182015b82811115620002775782518255916020019190600101906200025a565b506200028592915062000289565b5090565b5b808211156200028557600081556001016200028a565b600181811c90821680620002b557607f821691505b60208210811415620002d757634e487b7160e01b600052602260045260246000fd5b50919050565b612c1680620002ed6000396000f3fe6080604052600436106102655760003560e01c8063658d4e4f11610144578063a0712d68116100b6578063e9079a6f1161007a578063e9079a6f14610725578063e985e9c514610745578063f242432a1461078e578063f2fde38b146107ae578063f59a8b5c146107ce578063ff99b0fd146107ee57600080fd5b8063a0712d681461069b578063a22cb465146106ae578063bd85b039146106ce578063cfb5bb1f146106fb578063e086e5ec1461071057600080fd5b80637ff9b596116101085780637ff9b596146105e65780638329de2f146105fc5780638da5cb5b1461061c57806395d89b411461063a5780639aa536a01461064f5780639d284ce91461068557600080fd5b8063658d4e4f1461054c5780636a61e5fc146105715780636e1054a014610591578063715018a6146105b1578063724b5dd7146105c657600080fd5b80632639f460116101dd5780633688236d116101a15780633688236d1461048057806346a607c2146104965780634e1273f4146104b65780634f558e79146104e35780635c975abb146105125780635f1f9ff31461052c57600080fd5b80632639f460146103eb57806328f5ee4b1461040b5780632eb2c2d61461042b578063306487651461044b57806336566f061461046b57600080fd5b80630e89341c1161022f5780630e89341c1461031b578063112f36a41461033b57806311df99951461035d578063129d0869146103955780631eac0691146103b5578063236effd9146103cb57600080fd5b80629a9b7b1461026a578062fdd58e1461029357806301ffc9a7146102b357806306fdde03146102e35780630de9b37914610305575b600080fd5b34801561027657600080fd5b50610280600e5481565b6040519081526020015b60405180910390f35b34801561029f57600080fd5b506102806102ae36600461241c565b610824565b3480156102bf57600080fd5b506102d36102ce36600461254a565b6108bb565b604051901515815260200161028a565b3480156102ef57600080fd5b506102f861090d565b60405161028a9190612818565b34801561031157600080fd5b50610280600a5481565b34801561032757600080fd5b506102f86103363660046125cd565b61099f565b34801561034757600080fd5b5061035b610356366004612446565b6109d3565b005b34801561036957600080fd5b5060135461037d906001600160a01b031681565b6040516001600160a01b03909116815260200161028a565b3480156103a157600080fd5b5061035b6103b0366004612283565b610a1d565b3480156103c157600080fd5b50610280600c5481565b3480156103d757600080fd5b5061035b6103e63660046125cd565b610a71565b3480156103f757600080fd5b5061035b610406366004612584565b610aa0565b34801561041757600080fd5b5061035b610426366004612283565b610ae1565b34801561043757600080fd5b5061035b6104463660046122d1565b610b33565b34801561045757600080fd5b5061035b6104663660046125cd565b610bca565b34801561047757600080fd5b5061035b610bf9565b34801561048c57600080fd5b50610280600d5481565b3480156104a257600080fd5b5061035b6104b1366004612283565b610c37565b3480156104c257600080fd5b506104d66104d1366004612479565b610cea565b60405161028a91906127e0565b3480156104ef57600080fd5b506102d36104fe3660046125cd565b600090815260036020526040902054151590565b34801561051e57600080fd5b50600f546102d39060ff1681565b34801561053857600080fd5b5060145461037d906001600160a01b031681565b34801561055857600080fd5b50600f5461037d9061010090046001600160a01b031681565b34801561057d57600080fd5b5061035b61058c3660046125cd565b610e14565b34801561059d57600080fd5b506102806105ac366004612283565b610e43565b3480156105bd57600080fd5b5061035b610e97565b3480156105d257600080fd5b5061035b6105e13660046125cd565b610ecd565b3480156105f257600080fd5b5061028060095481565b34801561060857600080fd5b5061035b6106173660046125cd565b610efc565b34801561062857600080fd5b506004546001600160a01b031661037d565b34801561064657600080fd5b506102f8610f2b565b34801561065b57600080fd5b5061028061066a366004612283565b6001600160a01b031660009081526012602052604090205490565b34801561069157600080fd5b50610280600b5481565b61035b6106a93660046125cd565b610f3a565b3480156106ba57600080fd5b5061035b6106c93660046123e0565b6112ba565b3480156106da57600080fd5b506102806106e93660046125cd565b60009081526003602052604090205490565b34801561070757600080fd5b506102f86112c5565b34801561071c57600080fd5b5061035b6112d4565b34801561073157600080fd5b5060105461037d906001600160a01b031681565b34801561075157600080fd5b506102d361076036600461229e565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b34801561079a57600080fd5b5061035b6107a936600461237b565b61132d565b3480156107ba57600080fd5b5061035b6107c9366004612283565b6113b4565b3480156107da57600080fd5b5061035b6107e9366004612283565b61144c565b3480156107fa57600080fd5b50610280610809366004612283565b6001600160a01b031660009081526011602052604090205490565b60006001600160a01b0383166108955760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b14806108ec57506001600160e01b031982166303a24d0760e21b145b8061090757506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606007805461091c90612a35565b80601f016020809104026020016040519081016040528092919081815260200182805461094890612a35565b80156109955780601f1061096a57610100808354040283529160200191610995565b820191906000526020600020905b81548152906001019060200180831161097857829003601f168201915b5050505050905090565b606060066109ac836114ef565b6040516020016109bd929190612682565b6040516020818303038152906040529050919050565b6004546001600160a01b031633146109fd5760405162461bcd60e51b815260040161088c9061294a565b610a18838383604051806020016040528060008152506115f5565b505050565b600f5461010090046001600160a01b0316336001600160a01b031614610a555760405162461bcd60e51b815260040161088c90612873565b6001600160a01b03166000908152601160205260409020429055565b6004546001600160a01b03163314610a9b5760405162461bcd60e51b815260040161088c9061294a565b600c55565b6004546001600160a01b03163314610aca5760405162461bcd60e51b815260040161088c9061294a565b8051610add9060069060208401906120d2565b5050565b600f5461010090046001600160a01b0316336001600160a01b031614610b195760405162461bcd60e51b815260040161088c90612873565b6001600160a01b0316600090815260126020526040812055565b6001600160a01b038516331480610b4f5750610b4f8533610760565b610bb65760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606482015260840161088c565b610bc38585858585611718565b5050505050565b6004546001600160a01b03163314610bf45760405162461bcd60e51b815260040161088c9061294a565b600a55565b6004546001600160a01b03163314610c235760405162461bcd60e51b815260040161088c9061294a565b600f805460ff19811660ff90911615179055565b6004546001600160a01b03163314610c615760405162461bcd60e51b815260040161088c9061294a565b6001600160a01b038116610cae5760405162461bcd60e51b8152602060048201526014602482015273043616e206e6f74206265206164647265737320360641b604482015260640161088c565b601380546001600160a01b0319166001600160a01b03929092169182179055600f8054610100600160a81b031916610100909202919091179055565b60608151835114610d4f5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b606482015260840161088c565b6000835167ffffffffffffffff811115610d6b57610d6b612b0e565b604051908082528060200260200182016040528015610d94578160200160208202803683370190505b50905060005b8451811015610e0c57610ddf858281518110610db857610db8612af8565b6020026020010151858381518110610dd257610dd2612af8565b6020026020010151610824565b828281518110610df157610df1612af8565b6020908102919091010152610e0581612a9d565b9050610d9a565b509392505050565b6004546001600160a01b03163314610e3e5760405162461bcd60e51b815260040161088c9061294a565b600955565b600080805b81610e5281612a9d565b9250506001610e618584610824565b10610e7d57610e708483610824565b610e7a90826129a3565b90505b600082815260036020526040902054610e48579392505050565b6004546001600160a01b03163314610ec15760405162461bcd60e51b815260040161088c9061294a565b610ecb6000611903565b565b6004546001600160a01b03163314610ef75760405162461bcd60e51b815260040161088c9061294a565b600d55565b6004546001600160a01b03163314610f265760405162461bcd60e51b815260040161088c9061294a565b600e55565b60606008805461091c90612a35565b60026005541415610f8d5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161088c565b6002600555600f5460ff1615610fd95760405162461bcd60e51b8152602060048201526011602482015270135a5b9d1a5b99c81a5cc81c185d5cd959607a1b604482015260640161088c565b600c54600e54600090815260036020526040902054106110345760405162461bcd60e51b815260206004820152601660248201527513595b58995c9cda1a5c1cc8185b1b081b5a5b9d195960521b604482015260640161088c565b600d548111156110865760405162461bcd60e51b815260206004820152601960248201527f4d696e74207175616e7469747920697320746f6f206869676800000000000000604482015260640161088c565b3233146110d55760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000604482015260640161088c565b600954600b556014546000906001600160a01b03166370a08231336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b15801561112f57600080fd5b505afa158015611143573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116791906125e6565b111561122557600a54600b5461117d91906129ee565b600b55601454600a906001600160a01b03166370a08231336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b1580156111d457600080fd5b505afa1580156111e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120c91906125e6565b1061122557600a54600b5461122191906129ee565b600b555b34600b548261123491906129cf565b146112955760405162461bcd60e51b815260206004820152602b60248201527f596f752068617665206e6f742073656e742074686520636f727265637420616d60448201526a0deeadce840decc408aa8960ab1b606482015260840161088c565b6112b233600e5483604051806020016040528060008152506115f5565b506001600555565b610add338383611955565b60606006805461091c90612a35565b6004546001600160a01b031633146112fe5760405162461bcd60e51b815260040161088c9061294a565b60405133904780156108fc02916000818181858888f1935050505015801561132a573d6000803e3d6000fd5b50565b6001600160a01b03851633148061134957506113498533610760565b6113a75760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b606482015260840161088c565b610bc38585858585611a36565b6004546001600160a01b031633146113de5760405162461bcd60e51b815260040161088c9061294a565b6001600160a01b0381166114435760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161088c565b61132a81611903565b6004546001600160a01b031633146114765760405162461bcd60e51b815260040161088c9061294a565b6001600160a01b0381166114c35760405162461bcd60e51b8152602060048201526014602482015273043616e206e6f74206265206164647265737320360641b604482015260640161088c565b601480546001600160a01b039092166001600160a01b0319928316811790915560108054909216179055565b6060816115135750506040805180820190915260018152600360fc1b602082015290565b8160005b811561153d578061152781612a9d565b91506115369050600a836129bb565b9150611517565b60008167ffffffffffffffff81111561155857611558612b0e565b6040519080825280601f01601f191660200182016040528015611582576020820181803683370190505b5090505b84156115ed576115976001836129ee565b91506115a4600a86612ab8565b6115af9060306129a3565b60f81b8183815181106115c4576115c4612af8565b60200101906001600160f81b031916908160001a9053506115e6600a866129bb565b9450611586565b949350505050565b6001600160a01b0384166116555760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b606482015260840161088c565b33600061166185611b6e565b9050600061166e85611b6e565b905061167f83600089858589611bb9565b6000868152602081815260408083206001600160a01b038b168452909152812080548792906116af9084906129a3565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461170f83600089898989611d24565b50505050505050565b815183511461177a5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b606482015260840161088c565b6001600160a01b0384166117a05760405162461bcd60e51b815260040161088c906128bb565b336117af818787878787611bb9565b60005b84518110156118955760008582815181106117cf576117cf612af8565b6020026020010151905060008583815181106117ed576117ed612af8565b602090810291909101810151600084815280835260408082206001600160a01b038e16835290935291909120549091508181101561183d5760405162461bcd60e51b815260040161088c90612900565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b1682528120805484929061187a9084906129a3565b925050819055505050508061188e90612a9d565b90506117b2565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516118e59291906127f3565b60405180910390a46118fb818787878787611e8f565b505050505050565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156119c95760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b606482015260840161088c565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b038416611a5c5760405162461bcd60e51b815260040161088c906128bb565b336000611a6885611b6e565b90506000611a7585611b6e565b9050611a85838989858589611bb9565b6000868152602081815260408083206001600160a01b038c16845290915290205485811015611ac65760405162461bcd60e51b815260040161088c90612900565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290611b039084906129a3565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611b63848a8a8a8a8a611d24565b505050505050505050565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110611ba857611ba8612af8565b602090810291909101015292915050565b611bc7868686868686611f59565b611bd084610e43565b611bf4576001600160a01b03841660009081526011602052604090204290556118fb565b6013546040516346d500a360e11b81526001600160a01b0386811660048301526000921690638daa01469060240160206040518083038186803b158015611c3a57600080fd5b505afa158015611c4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c7291906125e6565b11156118fb576013546040516346d500a360e11b81526001600160a01b03868116600483015290911690638daa01469060240160206040518083038186803b158015611cbd57600080fd5b505afa158015611cd1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cf591906125e6565b6001600160a01b0385166000908152601260209081526040808320939093556011905220429055505050505050565b6001600160a01b0384163b156118fb5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190611d68908990899088908890889060040161279b565b602060405180830381600087803b158015611d8257600080fd5b505af1925050508015611db2575060408051601f3d908101601f19168201909252611daf91810190612567565b60015b611e5f57611dbe612b24565b806308c379a01415611df85750611dd3612b40565b80611dde5750611dfa565b8060405162461bcd60e51b815260040161088c9190612818565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b606482015260840161088c565b6001600160e01b0319811663f23a6e6160e01b1461170f5760405162461bcd60e51b815260040161088c9061282b565b6001600160a01b0384163b156118fb5760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190611ed3908990899088908890889060040161273d565b602060405180830381600087803b158015611eed57600080fd5b505af1925050508015611f1d575060408051601f3d908101601f19168201909252611f1a91810190612567565b60015b611f2957611dbe612b24565b6001600160e01b0319811663bc197c8160e01b1461170f5760405162461bcd60e51b815260040161088c9061282b565b6001600160a01b038516611fe05760005b8351811015611fde57828181518110611f8557611f85612af8565b602002602001015160036000868481518110611fa357611fa3612af8565b602002602001015181526020019081526020016000206000828254611fc891906129a3565b90915550611fd7905081612a9d565b9050611f6a565b505b6001600160a01b0384166118fb5760005b835181101561170f57600084828151811061200e5761200e612af8565b60200260200101519050600084838151811061202c5761202c612af8565b60200260200101519050600060036000848152602001908152602001600020549050818110156120af5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a206275726e20616d6f756e74206578636565647320746f74604482015267616c537570706c7960c01b606482015260840161088c565b600092835260036020526040909220910390556120cb81612a9d565b9050611ff1565b8280546120de90612a35565b90600052602060002090601f0160209004810192826121005760008555612146565b82601f1061211957805160ff1916838001178555612146565b82800160010185558215612146579182015b8281111561214657825182559160200191906001019061212b565b50612152929150612156565b5090565b5b808211156121525760008155600101612157565b600067ffffffffffffffff83111561218557612185612b0e565b60405161219c601f8501601f191660200182612a70565b8091508381528484840111156121b157600080fd5b83836020830137600060208583010152509392505050565b80356001600160a01b03811681146121e057600080fd5b919050565b600082601f8301126121f657600080fd5b813560206122038261297f565b6040516122108282612a70565b8381528281019150858301600585901b8701840188101561223057600080fd5b60005b8581101561224f57813584529284019290840190600101612233565b5090979650505050505050565b600082601f83011261226d57600080fd5b61227c8383356020850161216b565b9392505050565b60006020828403121561229557600080fd5b61227c826121c9565b600080604083850312156122b157600080fd5b6122ba836121c9565b91506122c8602084016121c9565b90509250929050565b600080600080600060a086880312156122e957600080fd5b6122f2866121c9565b9450612300602087016121c9565b9350604086013567ffffffffffffffff8082111561231d57600080fd5b61232989838a016121e5565b9450606088013591508082111561233f57600080fd5b61234b89838a016121e5565b9350608088013591508082111561236157600080fd5b5061236e8882890161225c565b9150509295509295909350565b600080600080600060a0868803121561239357600080fd5b61239c866121c9565b94506123aa602087016121c9565b93506040860135925060608601359150608086013567ffffffffffffffff8111156123d457600080fd5b61236e8882890161225c565b600080604083850312156123f357600080fd5b6123fc836121c9565b91506020830135801515811461241157600080fd5b809150509250929050565b6000806040838503121561242f57600080fd5b612438836121c9565b946020939093013593505050565b60008060006060848603121561245b57600080fd5b612464846121c9565b95602085013595506040909401359392505050565b6000806040838503121561248c57600080fd5b823567ffffffffffffffff808211156124a457600080fd5b818501915085601f8301126124b857600080fd5b813560206124c58261297f565b6040516124d28282612a70565b8381528281019150858301600585901b870184018b10156124f257600080fd5b600096505b8487101561251c57612508816121c9565b8352600196909601959183019183016124f7565b509650508601359250508082111561253357600080fd5b50612540858286016121e5565b9150509250929050565b60006020828403121561255c57600080fd5b813561227c81612bca565b60006020828403121561257957600080fd5b815161227c81612bca565b60006020828403121561259657600080fd5b813567ffffffffffffffff8111156125ad57600080fd5b8201601f810184136125be57600080fd5b6115ed8482356020840161216b565b6000602082840312156125df57600080fd5b5035919050565b6000602082840312156125f857600080fd5b5051919050565b600081518084526020808501945080840160005b8381101561262f57815187529582019590820190600101612613565b509495945050505050565b60008151808452612652816020860160208601612a05565b601f01601f19169290920160200192915050565b60008151612678818560208601612a05565b9290920192915050565b600080845481600182811c91508083168061269e57607f831692505b60208084108214156126be57634e487b7160e01b86526022600452602486fd5b8180156126d257600181146126e357612710565b60ff19861689528489019650612710565b60008b81526020902060005b868110156127085781548b8201529085019083016126ef565b505084890196505b5050505050506127346127238286612666565b64173539b7b760d91b815260050190565b95945050505050565b6001600160a01b0386811682528516602082015260a060408201819052600090612769908301866125ff565b828103606084015261277b81866125ff565b9050828103608084015261278f818561263a565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190526000906127d59083018461263a565b979650505050505050565b60208152600061227c60208301846125ff565b60408152600061280660408301856125ff565b828103602084015261273481856125ff565b60208152600061227c602083018461263a565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526028908201527f4f6e6c792063616c6c61626c652066726f6d20637573746f6d2045524332302060408201526718dbdb9d1c9858dd60c21b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600067ffffffffffffffff82111561299957612999612b0e565b5060051b60200190565b600082198211156129b6576129b6612acc565b500190565b6000826129ca576129ca612ae2565b500490565b60008160001904831182151516156129e9576129e9612acc565b500290565b600082821015612a0057612a00612acc565b500390565b60005b83811015612a20578181015183820152602001612a08565b83811115612a2f576000848401525b50505050565b600181811c90821680612a4957607f821691505b60208210811415612a6a57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f1916810167ffffffffffffffff81118282101715612a9657612a96612b0e565b6040525050565b6000600019821415612ab157612ab1612acc565b5060010190565b600082612ac757612ac7612ae2565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d1115612b3d5760046000803e5060005160e01c5b90565b600060443d1015612b4e5790565b6040516003193d81016004833e81513d67ffffffffffffffff8160248401118184111715612b7e57505050505090565b8285019150815181811115612b965750505050505090565b843d8701016020828501011115612bb05750505050505090565b612bbf60208286010187612a70565b509095945050505050565b6001600160e01b03198116811461132a57600080fdfea2646970667358221220fb7efa353c1be6c6c050c4c3d0ef1adb5e9b5db858728c2132fae345b667ca0a64736f6c63430008070033

Deployed Bytecode

0x6080604052600436106102655760003560e01c8063658d4e4f11610144578063a0712d68116100b6578063e9079a6f1161007a578063e9079a6f14610725578063e985e9c514610745578063f242432a1461078e578063f2fde38b146107ae578063f59a8b5c146107ce578063ff99b0fd146107ee57600080fd5b8063a0712d681461069b578063a22cb465146106ae578063bd85b039146106ce578063cfb5bb1f146106fb578063e086e5ec1461071057600080fd5b80637ff9b596116101085780637ff9b596146105e65780638329de2f146105fc5780638da5cb5b1461061c57806395d89b411461063a5780639aa536a01461064f5780639d284ce91461068557600080fd5b8063658d4e4f1461054c5780636a61e5fc146105715780636e1054a014610591578063715018a6146105b1578063724b5dd7146105c657600080fd5b80632639f460116101dd5780633688236d116101a15780633688236d1461048057806346a607c2146104965780634e1273f4146104b65780634f558e79146104e35780635c975abb146105125780635f1f9ff31461052c57600080fd5b80632639f460146103eb57806328f5ee4b1461040b5780632eb2c2d61461042b578063306487651461044b57806336566f061461046b57600080fd5b80630e89341c1161022f5780630e89341c1461031b578063112f36a41461033b57806311df99951461035d578063129d0869146103955780631eac0691146103b5578063236effd9146103cb57600080fd5b80629a9b7b1461026a578062fdd58e1461029357806301ffc9a7146102b357806306fdde03146102e35780630de9b37914610305575b600080fd5b34801561027657600080fd5b50610280600e5481565b6040519081526020015b60405180910390f35b34801561029f57600080fd5b506102806102ae36600461241c565b610824565b3480156102bf57600080fd5b506102d36102ce36600461254a565b6108bb565b604051901515815260200161028a565b3480156102ef57600080fd5b506102f861090d565b60405161028a9190612818565b34801561031157600080fd5b50610280600a5481565b34801561032757600080fd5b506102f86103363660046125cd565b61099f565b34801561034757600080fd5b5061035b610356366004612446565b6109d3565b005b34801561036957600080fd5b5060135461037d906001600160a01b031681565b6040516001600160a01b03909116815260200161028a565b3480156103a157600080fd5b5061035b6103b0366004612283565b610a1d565b3480156103c157600080fd5b50610280600c5481565b3480156103d757600080fd5b5061035b6103e63660046125cd565b610a71565b3480156103f757600080fd5b5061035b610406366004612584565b610aa0565b34801561041757600080fd5b5061035b610426366004612283565b610ae1565b34801561043757600080fd5b5061035b6104463660046122d1565b610b33565b34801561045757600080fd5b5061035b6104663660046125cd565b610bca565b34801561047757600080fd5b5061035b610bf9565b34801561048c57600080fd5b50610280600d5481565b3480156104a257600080fd5b5061035b6104b1366004612283565b610c37565b3480156104c257600080fd5b506104d66104d1366004612479565b610cea565b60405161028a91906127e0565b3480156104ef57600080fd5b506102d36104fe3660046125cd565b600090815260036020526040902054151590565b34801561051e57600080fd5b50600f546102d39060ff1681565b34801561053857600080fd5b5060145461037d906001600160a01b031681565b34801561055857600080fd5b50600f5461037d9061010090046001600160a01b031681565b34801561057d57600080fd5b5061035b61058c3660046125cd565b610e14565b34801561059d57600080fd5b506102806105ac366004612283565b610e43565b3480156105bd57600080fd5b5061035b610e97565b3480156105d257600080fd5b5061035b6105e13660046125cd565b610ecd565b3480156105f257600080fd5b5061028060095481565b34801561060857600080fd5b5061035b6106173660046125cd565b610efc565b34801561062857600080fd5b506004546001600160a01b031661037d565b34801561064657600080fd5b506102f8610f2b565b34801561065b57600080fd5b5061028061066a366004612283565b6001600160a01b031660009081526012602052604090205490565b34801561069157600080fd5b50610280600b5481565b61035b6106a93660046125cd565b610f3a565b3480156106ba57600080fd5b5061035b6106c93660046123e0565b6112ba565b3480156106da57600080fd5b506102806106e93660046125cd565b60009081526003602052604090205490565b34801561070757600080fd5b506102f86112c5565b34801561071c57600080fd5b5061035b6112d4565b34801561073157600080fd5b5060105461037d906001600160a01b031681565b34801561075157600080fd5b506102d361076036600461229e565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b34801561079a57600080fd5b5061035b6107a936600461237b565b61132d565b3480156107ba57600080fd5b5061035b6107c9366004612283565b6113b4565b3480156107da57600080fd5b5061035b6107e9366004612283565b61144c565b3480156107fa57600080fd5b50610280610809366004612283565b6001600160a01b031660009081526011602052604090205490565b60006001600160a01b0383166108955760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b14806108ec57506001600160e01b031982166303a24d0760e21b145b8061090757506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606007805461091c90612a35565b80601f016020809104026020016040519081016040528092919081815260200182805461094890612a35565b80156109955780601f1061096a57610100808354040283529160200191610995565b820191906000526020600020905b81548152906001019060200180831161097857829003601f168201915b5050505050905090565b606060066109ac836114ef565b6040516020016109bd929190612682565b6040516020818303038152906040529050919050565b6004546001600160a01b031633146109fd5760405162461bcd60e51b815260040161088c9061294a565b610a18838383604051806020016040528060008152506115f5565b505050565b600f5461010090046001600160a01b0316336001600160a01b031614610a555760405162461bcd60e51b815260040161088c90612873565b6001600160a01b03166000908152601160205260409020429055565b6004546001600160a01b03163314610a9b5760405162461bcd60e51b815260040161088c9061294a565b600c55565b6004546001600160a01b03163314610aca5760405162461bcd60e51b815260040161088c9061294a565b8051610add9060069060208401906120d2565b5050565b600f5461010090046001600160a01b0316336001600160a01b031614610b195760405162461bcd60e51b815260040161088c90612873565b6001600160a01b0316600090815260126020526040812055565b6001600160a01b038516331480610b4f5750610b4f8533610760565b610bb65760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606482015260840161088c565b610bc38585858585611718565b5050505050565b6004546001600160a01b03163314610bf45760405162461bcd60e51b815260040161088c9061294a565b600a55565b6004546001600160a01b03163314610c235760405162461bcd60e51b815260040161088c9061294a565b600f805460ff19811660ff90911615179055565b6004546001600160a01b03163314610c615760405162461bcd60e51b815260040161088c9061294a565b6001600160a01b038116610cae5760405162461bcd60e51b8152602060048201526014602482015273043616e206e6f74206265206164647265737320360641b604482015260640161088c565b601380546001600160a01b0319166001600160a01b03929092169182179055600f8054610100600160a81b031916610100909202919091179055565b60608151835114610d4f5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b606482015260840161088c565b6000835167ffffffffffffffff811115610d6b57610d6b612b0e565b604051908082528060200260200182016040528015610d94578160200160208202803683370190505b50905060005b8451811015610e0c57610ddf858281518110610db857610db8612af8565b6020026020010151858381518110610dd257610dd2612af8565b6020026020010151610824565b828281518110610df157610df1612af8565b6020908102919091010152610e0581612a9d565b9050610d9a565b509392505050565b6004546001600160a01b03163314610e3e5760405162461bcd60e51b815260040161088c9061294a565b600955565b600080805b81610e5281612a9d565b9250506001610e618584610824565b10610e7d57610e708483610824565b610e7a90826129a3565b90505b600082815260036020526040902054610e48579392505050565b6004546001600160a01b03163314610ec15760405162461bcd60e51b815260040161088c9061294a565b610ecb6000611903565b565b6004546001600160a01b03163314610ef75760405162461bcd60e51b815260040161088c9061294a565b600d55565b6004546001600160a01b03163314610f265760405162461bcd60e51b815260040161088c9061294a565b600e55565b60606008805461091c90612a35565b60026005541415610f8d5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161088c565b6002600555600f5460ff1615610fd95760405162461bcd60e51b8152602060048201526011602482015270135a5b9d1a5b99c81a5cc81c185d5cd959607a1b604482015260640161088c565b600c54600e54600090815260036020526040902054106110345760405162461bcd60e51b815260206004820152601660248201527513595b58995c9cda1a5c1cc8185b1b081b5a5b9d195960521b604482015260640161088c565b600d548111156110865760405162461bcd60e51b815260206004820152601960248201527f4d696e74207175616e7469747920697320746f6f206869676800000000000000604482015260640161088c565b3233146110d55760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000604482015260640161088c565b600954600b556014546000906001600160a01b03166370a08231336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b15801561112f57600080fd5b505afa158015611143573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116791906125e6565b111561122557600a54600b5461117d91906129ee565b600b55601454600a906001600160a01b03166370a08231336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b1580156111d457600080fd5b505afa1580156111e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120c91906125e6565b1061122557600a54600b5461122191906129ee565b600b555b34600b548261123491906129cf565b146112955760405162461bcd60e51b815260206004820152602b60248201527f596f752068617665206e6f742073656e742074686520636f727265637420616d60448201526a0deeadce840decc408aa8960ab1b606482015260840161088c565b6112b233600e5483604051806020016040528060008152506115f5565b506001600555565b610add338383611955565b60606006805461091c90612a35565b6004546001600160a01b031633146112fe5760405162461bcd60e51b815260040161088c9061294a565b60405133904780156108fc02916000818181858888f1935050505015801561132a573d6000803e3d6000fd5b50565b6001600160a01b03851633148061134957506113498533610760565b6113a75760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b606482015260840161088c565b610bc38585858585611a36565b6004546001600160a01b031633146113de5760405162461bcd60e51b815260040161088c9061294a565b6001600160a01b0381166114435760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161088c565b61132a81611903565b6004546001600160a01b031633146114765760405162461bcd60e51b815260040161088c9061294a565b6001600160a01b0381166114c35760405162461bcd60e51b8152602060048201526014602482015273043616e206e6f74206265206164647265737320360641b604482015260640161088c565b601480546001600160a01b039092166001600160a01b0319928316811790915560108054909216179055565b6060816115135750506040805180820190915260018152600360fc1b602082015290565b8160005b811561153d578061152781612a9d565b91506115369050600a836129bb565b9150611517565b60008167ffffffffffffffff81111561155857611558612b0e565b6040519080825280601f01601f191660200182016040528015611582576020820181803683370190505b5090505b84156115ed576115976001836129ee565b91506115a4600a86612ab8565b6115af9060306129a3565b60f81b8183815181106115c4576115c4612af8565b60200101906001600160f81b031916908160001a9053506115e6600a866129bb565b9450611586565b949350505050565b6001600160a01b0384166116555760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b606482015260840161088c565b33600061166185611b6e565b9050600061166e85611b6e565b905061167f83600089858589611bb9565b6000868152602081815260408083206001600160a01b038b168452909152812080548792906116af9084906129a3565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461170f83600089898989611d24565b50505050505050565b815183511461177a5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b606482015260840161088c565b6001600160a01b0384166117a05760405162461bcd60e51b815260040161088c906128bb565b336117af818787878787611bb9565b60005b84518110156118955760008582815181106117cf576117cf612af8565b6020026020010151905060008583815181106117ed576117ed612af8565b602090810291909101810151600084815280835260408082206001600160a01b038e16835290935291909120549091508181101561183d5760405162461bcd60e51b815260040161088c90612900565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b1682528120805484929061187a9084906129a3565b925050819055505050508061188e90612a9d565b90506117b2565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516118e59291906127f3565b60405180910390a46118fb818787878787611e8f565b505050505050565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156119c95760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b606482015260840161088c565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b038416611a5c5760405162461bcd60e51b815260040161088c906128bb565b336000611a6885611b6e565b90506000611a7585611b6e565b9050611a85838989858589611bb9565b6000868152602081815260408083206001600160a01b038c16845290915290205485811015611ac65760405162461bcd60e51b815260040161088c90612900565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290611b039084906129a3565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611b63848a8a8a8a8a611d24565b505050505050505050565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110611ba857611ba8612af8565b602090810291909101015292915050565b611bc7868686868686611f59565b611bd084610e43565b611bf4576001600160a01b03841660009081526011602052604090204290556118fb565b6013546040516346d500a360e11b81526001600160a01b0386811660048301526000921690638daa01469060240160206040518083038186803b158015611c3a57600080fd5b505afa158015611c4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c7291906125e6565b11156118fb576013546040516346d500a360e11b81526001600160a01b03868116600483015290911690638daa01469060240160206040518083038186803b158015611cbd57600080fd5b505afa158015611cd1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cf591906125e6565b6001600160a01b0385166000908152601260209081526040808320939093556011905220429055505050505050565b6001600160a01b0384163b156118fb5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190611d68908990899088908890889060040161279b565b602060405180830381600087803b158015611d8257600080fd5b505af1925050508015611db2575060408051601f3d908101601f19168201909252611daf91810190612567565b60015b611e5f57611dbe612b24565b806308c379a01415611df85750611dd3612b40565b80611dde5750611dfa565b8060405162461bcd60e51b815260040161088c9190612818565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b606482015260840161088c565b6001600160e01b0319811663f23a6e6160e01b1461170f5760405162461bcd60e51b815260040161088c9061282b565b6001600160a01b0384163b156118fb5760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190611ed3908990899088908890889060040161273d565b602060405180830381600087803b158015611eed57600080fd5b505af1925050508015611f1d575060408051601f3d908101601f19168201909252611f1a91810190612567565b60015b611f2957611dbe612b24565b6001600160e01b0319811663bc197c8160e01b1461170f5760405162461bcd60e51b815260040161088c9061282b565b6001600160a01b038516611fe05760005b8351811015611fde57828181518110611f8557611f85612af8565b602002602001015160036000868481518110611fa357611fa3612af8565b602002602001015181526020019081526020016000206000828254611fc891906129a3565b90915550611fd7905081612a9d565b9050611f6a565b505b6001600160a01b0384166118fb5760005b835181101561170f57600084828151811061200e5761200e612af8565b60200260200101519050600084838151811061202c5761202c612af8565b60200260200101519050600060036000848152602001908152602001600020549050818110156120af5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a206275726e20616d6f756e74206578636565647320746f74604482015267616c537570706c7960c01b606482015260840161088c565b600092835260036020526040909220910390556120cb81612a9d565b9050611ff1565b8280546120de90612a35565b90600052602060002090601f0160209004810192826121005760008555612146565b82601f1061211957805160ff1916838001178555612146565b82800160010185558215612146579182015b8281111561214657825182559160200191906001019061212b565b50612152929150612156565b5090565b5b808211156121525760008155600101612157565b600067ffffffffffffffff83111561218557612185612b0e565b60405161219c601f8501601f191660200182612a70565b8091508381528484840111156121b157600080fd5b83836020830137600060208583010152509392505050565b80356001600160a01b03811681146121e057600080fd5b919050565b600082601f8301126121f657600080fd5b813560206122038261297f565b6040516122108282612a70565b8381528281019150858301600585901b8701840188101561223057600080fd5b60005b8581101561224f57813584529284019290840190600101612233565b5090979650505050505050565b600082601f83011261226d57600080fd5b61227c8383356020850161216b565b9392505050565b60006020828403121561229557600080fd5b61227c826121c9565b600080604083850312156122b157600080fd5b6122ba836121c9565b91506122c8602084016121c9565b90509250929050565b600080600080600060a086880312156122e957600080fd5b6122f2866121c9565b9450612300602087016121c9565b9350604086013567ffffffffffffffff8082111561231d57600080fd5b61232989838a016121e5565b9450606088013591508082111561233f57600080fd5b61234b89838a016121e5565b9350608088013591508082111561236157600080fd5b5061236e8882890161225c565b9150509295509295909350565b600080600080600060a0868803121561239357600080fd5b61239c866121c9565b94506123aa602087016121c9565b93506040860135925060608601359150608086013567ffffffffffffffff8111156123d457600080fd5b61236e8882890161225c565b600080604083850312156123f357600080fd5b6123fc836121c9565b91506020830135801515811461241157600080fd5b809150509250929050565b6000806040838503121561242f57600080fd5b612438836121c9565b946020939093013593505050565b60008060006060848603121561245b57600080fd5b612464846121c9565b95602085013595506040909401359392505050565b6000806040838503121561248c57600080fd5b823567ffffffffffffffff808211156124a457600080fd5b818501915085601f8301126124b857600080fd5b813560206124c58261297f565b6040516124d28282612a70565b8381528281019150858301600585901b870184018b10156124f257600080fd5b600096505b8487101561251c57612508816121c9565b8352600196909601959183019183016124f7565b509650508601359250508082111561253357600080fd5b50612540858286016121e5565b9150509250929050565b60006020828403121561255c57600080fd5b813561227c81612bca565b60006020828403121561257957600080fd5b815161227c81612bca565b60006020828403121561259657600080fd5b813567ffffffffffffffff8111156125ad57600080fd5b8201601f810184136125be57600080fd5b6115ed8482356020840161216b565b6000602082840312156125df57600080fd5b5035919050565b6000602082840312156125f857600080fd5b5051919050565b600081518084526020808501945080840160005b8381101561262f57815187529582019590820190600101612613565b509495945050505050565b60008151808452612652816020860160208601612a05565b601f01601f19169290920160200192915050565b60008151612678818560208601612a05565b9290920192915050565b600080845481600182811c91508083168061269e57607f831692505b60208084108214156126be57634e487b7160e01b86526022600452602486fd5b8180156126d257600181146126e357612710565b60ff19861689528489019650612710565b60008b81526020902060005b868110156127085781548b8201529085019083016126ef565b505084890196505b5050505050506127346127238286612666565b64173539b7b760d91b815260050190565b95945050505050565b6001600160a01b0386811682528516602082015260a060408201819052600090612769908301866125ff565b828103606084015261277b81866125ff565b9050828103608084015261278f818561263a565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190526000906127d59083018461263a565b979650505050505050565b60208152600061227c60208301846125ff565b60408152600061280660408301856125ff565b828103602084015261273481856125ff565b60208152600061227c602083018461263a565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526028908201527f4f6e6c792063616c6c61626c652066726f6d20637573746f6d2045524332302060408201526718dbdb9d1c9858dd60c21b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600067ffffffffffffffff82111561299957612999612b0e565b5060051b60200190565b600082198211156129b6576129b6612acc565b500190565b6000826129ca576129ca612ae2565b500490565b60008160001904831182151516156129e9576129e9612acc565b500290565b600082821015612a0057612a00612acc565b500390565b60005b83811015612a20578181015183820152602001612a08565b83811115612a2f576000848401525b50505050565b600181811c90821680612a4957607f821691505b60208210811415612a6a57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f1916810167ffffffffffffffff81118282101715612a9657612a96612b0e565b6040525050565b6000600019821415612ab157612ab1612acc565b5060010190565b600082612ac757612ac7612ae2565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d1115612b3d5760046000803e5060005160e01c5b90565b600060443d1015612b4e5790565b6040516003193d81016004833e81513d67ffffffffffffffff8160248401118184111715612b7e57505050505090565b8285019150815181811115612b965750505050505090565b843d8701016020828501011115612bb05750505050505090565b612bbf60208286010187612a70565b509095945050505050565b6001600160e01b03198116811461132a57600080fdfea2646970667358221220fb7efa353c1be6c6c050c4c3d0ef1adb5e9b5db858728c2132fae345b667ca0a64736f6c63430008070033

Deployed Bytecode Sourcemap

1267:5864:19:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1587:29;;;;;;;;;;;;;;;;;;;21447:25:22;;;21435:2;21420:18;1587:29:19;;;;;;;;2185:228:2;;;;;;;;;;-1:-1:-1;2185:228:2;;;;;:::i;:::-;;:::i;1236:305::-;;;;;;;;;;-1:-1:-1;1236:305:2;;;;;:::i;:::-;;:::i;:::-;;;11961:14:22;;11954:22;11936:41;;11924:2;11909:18;1236:305:2;11796:187:22;2175:79:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;1462:28::-;;;;;;;;;;;;;;;;6949:176;;;;;;;;;;-1:-1:-1;6949:176:19;;;;;:::i;:::-;;:::i;4220:136::-;;;;;;;;;;-1:-1:-1;4220:136:19;;;;;:::i;:::-;;:::i;:::-;;1832:23;;;;;;;;;;-1:-1:-1;1832:23:19;;;;-1:-1:-1;;;;;1832:23:19;;;;;;-1:-1:-1;;;;;9620:32:22;;;9602:51;;9590:2;9575:18;1832:23:19;9456:203:22;3480::19;;;;;;;;;;-1:-1:-1;3480:203:19;;;;;:::i;:::-;;:::i;1527:23::-;;;;;;;;;;;;;;;;4796:82;;;;;;;;;;-1:-1:-1;4796:82:19;;;;;:::i;:::-;;:::i;4362:124::-;;;;;;;;;;-1:-1:-1;4362:124:19;;;;;:::i;:::-;;:::i;3825:197::-;;;;;;;;;;-1:-1:-1;3825:197:19;;;;;:::i;:::-;;:::i;4060:430:2:-;;;;;;;;;;-1:-1:-1;4060:430:2;;;;;:::i;:::-;;:::i;4694:96:19:-;;;;;;;;;;-1:-1:-1;4694:96:19;;;;;:::i;:::-;;:::i;5074:74::-;;;;;;;;;;;;;:::i;1556:25::-;;;;;;;;;;;;;;;;5366:207;;;;;;;;;;-1:-1:-1;5366:207:19;;;;;:::i;:::-;;:::i;2570:508:2:-;;;;;;;;;;-1:-1:-1;2570:508:2;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;901:120:5:-;;;;;;;;;;-1:-1:-1;901:120:5;;;;;:::i;:::-;958:4;785:16;;;:12;:16;;;;;;-1:-1:-1;;;901:120:5;1622:18:19;;;;;;;;;;-1:-1:-1;1622:18:19;;;;;;;;1861:20;;;;;;;;;;-1:-1:-1;1861:20:19;;;;-1:-1:-1;;;;;1861:20:19;;;1646:27;;;;;;;;;;-1:-1:-1;1646:27:19;;;;;;;-1:-1:-1;;;;;1646:27:19;;;4598:90;;;;;;;;;;-1:-1:-1;4598:90:19;;;;;:::i;:::-;;:::i;6488:455::-;;;;;;;;;;-1:-1:-1;6488:455:19;;;;;:::i;:::-;;:::i;1668:101:0:-;;;;;;;;;;;;;:::i;4884:86:19:-;;;;;;;;;;-1:-1:-1;4884:86:19;;;;;:::i;:::-;;:::i;1431:25::-;;;;;;;;;;;;;;;;4976:92;;;;;;;;;;-1:-1:-1;4976:92:19;;;;;:::i;:::-;;:::i;1036:85:0:-;;;;;;;;;;-1:-1:-1;1108:6:0;;-1:-1:-1;;;;;1108:6:0;1036:85;;2260:83:19;;;;;;;;;;;;;:::i;3689:130::-;;;;;;;;;;-1:-1:-1;3689:130:19;;;;;:::i;:::-;-1:-1:-1;;;;;3786:26:19;3760:7;3786:26;;;:17;:26;;;;;;;3689:130;1496:25;;;;;;;;;;;;;;;;2349:802;;;;;;:::i;:::-;;:::i;3146:153:2:-;;;;;;;;;;-1:-1:-1;3146:153:2;;;;;:::i;:::-;;:::i;697:111:5:-;;;;;;;;;;-1:-1:-1;697:111:5;;;;;:::i;:::-;759:7;785:16;;;:12;:16;;;;;;;697:111;4492:100:19;;;;;;;;;;;;;:::i;5579:110::-;;;;;;;;;;;;;:::i;1679:27::-;;;;;;;;;;-1:-1:-1;1679:27:19;;;;-1:-1:-1;;;;;1679:27:19;;;3366:166:2;;;;;;;;;;-1:-1:-1;3366:166:2;;;;;:::i;:::-;-1:-1:-1;;;;;3488:27:2;;;3465:4;3488:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;3366:166;3599:389;;;;;;;;;;-1:-1:-1;3599:389:2;;;;;:::i;:::-;;:::i;1918:198:0:-;;;;;;;;;;-1:-1:-1;1918:198:0;;;;;:::i;:::-;;:::i;5154:206:19:-;;;;;;;;;;-1:-1:-1;5154:206:19;;;;;:::i;:::-;;:::i;3350:124::-;;;;;;;;;;-1:-1:-1;3350:124:19;;;;;:::i;:::-;-1:-1:-1;;;;;3441:26:19;3415:7;3441:26;;;:17;:26;;;;;;;3350:124;2185:228:2;2271:7;-1:-1:-1;;;;;2298:21:2;;2290:77;;;;-1:-1:-1;;;2290:77:2;;14457:2:22;2290:77:2;;;14439:21:22;14496:2;14476:18;;;14469:30;14535:34;14515:18;;;14508:62;-1:-1:-1;;;14586:18:22;;;14579:41;14637:19;;2290:77:2;;;;;;;;;-1:-1:-1;2384:9:2;:13;;;;;;;;;;;-1:-1:-1;;;;;2384:22:2;;;;;;;;;;;;2185:228::o;1236:305::-;1338:4;-1:-1:-1;;;;;;1373:41:2;;-1:-1:-1;;;1373:41:2;;:109;;-1:-1:-1;;;;;;;1430:52:2;;-1:-1:-1;;;1430:52:2;1373:109;:161;;;-1:-1:-1;;;;;;;;;;937:40:17;;;1498:36:2;1354:180;1236:305;-1:-1:-1;;1236:305:2:o;2175:79:19:-;2212:13;2242:5;2235:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2175:79;:::o;6949:176::-;7010:13;7066;7081:26;7098:8;7081:16;:26::i;:::-;7049:68;;;;;;;;;:::i;:::-;;;;;;;;;;;;;7035:83;;6949:176;;;:::o;4220:136::-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:15;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;4319:30:19::1;4325:7;4334:2;4338:6;4319:30;;;;;;;;;;;::::0;:5:::1;:30::i;:::-;4220:136:::0;;;:::o;3480:203::-;3565:12;;;;;-1:-1:-1;;;;;3565:12:19;719:10:15;-1:-1:-1;;;;;3549:28:19;;3541:81;;;;-1:-1:-1;;;3541:81:19;;;;;;;:::i;:::-;-1:-1:-1;;;;;3632:26:19;;;;;:17;:26;;;;;3661:15;3632:44;;3480:203::o;4796:82::-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:15;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;4857:8:19::1;:14:::0;4796:82::o;4362:124::-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:15;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;4447:32:19;;::::1;::::0;:13:::1;::::0;:32:::1;::::0;::::1;::::0;::::1;:::i;:::-;;4362:124:::0;:::o;3825:197::-;3918:12;;;;;-1:-1:-1;;;;;3918:12:19;719:10:15;-1:-1:-1;;;;;3902:28:19;;3894:81;;;;-1:-1:-1;;;3894:81:19;;;;;;;:::i;:::-;-1:-1:-1;;;;;3985:26:19;4014:1;3985:26;;;:17;:26;;;;;:30;3825:197::o;4060:430:2:-;-1:-1:-1;;;;;4285:20:2;;719:10:15;4285:20:2;;:60;;-1:-1:-1;4309:36:2;4326:4;719:10:15;3366:166:2;:::i;4309:36::-;4264:157;;;;-1:-1:-1;;;4264:157:2;;16800:2:22;4264:157:2;;;16782:21:22;16839:2;16819:18;;;16812:30;16878:34;16858:18;;;16851:62;-1:-1:-1;;;16929:18:22;;;16922:48;16987:19;;4264:157:2;16598:414:22;4264:157:2;4431:52;4454:4;4460:2;4464:3;4469:7;4478:4;4431:22;:52::i;:::-;4060:430;;;;;:::o;4694:96:19:-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:15;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;4762:13:19::1;:21:::0;4694:96::o;5074:74::-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:15;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;5135:6:19::1;::::0;;-1:-1:-1;;5125:16:19;::::1;5135:6;::::0;;::::1;5134:7;5125:16;::::0;;5074:74::o;5366:207::-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:15;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;5445:23:19;::::1;5437:56;;;::::0;-1:-1:-1;;;5437:56:19;;15276:2:22;5437:56:19::1;::::0;::::1;15258:21:22::0;15315:2;15295:18;;;15288:30;-1:-1:-1;;;15334:18:22;;;15327:50;15394:18;;5437:56:19::1;15074:344:22::0;5437:56:19::1;5503:4;:29:::0;;-1:-1:-1;;;;;;5503:29:19::1;-1:-1:-1::0;;;;;5503:29:19;;;::::1;::::0;;::::1;::::0;;5542:12:::1;:24:::0;;-1:-1:-1;;;;;;5542:24:19::1;5503:29;5542:24:::0;;::::1;::::0;;;::::1;::::0;;5366:207::o;2570:508:2:-;2721:16;2780:3;:10;2761:8;:15;:29;2753:83;;;;-1:-1:-1;;;2753:83:2;;19568:2:22;2753:83:2;;;19550:21:22;19607:2;19587:18;;;19580:30;19646:34;19626:18;;;19619:62;-1:-1:-1;;;19697:18:22;;;19690:39;19746:19;;2753:83:2;19366:405:22;2753:83:2;2847:30;2894:8;:15;2880:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2880:30:2;;2847:63;;2926:9;2921:120;2945:8;:15;2941:1;:19;2921:120;;;3000:30;3010:8;3019:1;3010:11;;;;;;;;:::i;:::-;;;;;;;3023:3;3027:1;3023:6;;;;;;;;:::i;:::-;;;;;;;3000:9;:30::i;:::-;2981:13;2995:1;2981:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;2962:3;;;:::i;:::-;;;2921:120;;;-1:-1:-1;3058:13:2;2570:508;-1:-1:-1;;;2570:508:2:o;4598:90:19:-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:15;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;4663:10:19::1;:18:::0;4598:90::o;6488:455::-;6559:7;;;6661:238;6678:19;;;;:::i;:::-;;;;6756:1;6715:37;6725:7;6734:17;6715:9;:37::i;:::-;:42;6711:143;;6802:37;6812:7;6821:17;6802:9;:37::i;:::-;6778:61;;;;:::i;:::-;;;6711:143;958:4:5;785:16;;;:12;:16;;;;;;6661:238:19;;6916:20;6488:455;-1:-1:-1;;;6488:455:19:o;1668:101:0:-;1108:6;;-1:-1:-1;;;;;1108:6:0;719:10:15;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;4884:86:19:-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:15;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;4947:10:19::1;:16:::0;4884:86::o;4976:92::-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:15;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;5042:14:19::1;:19:::0;4976:92::o;2260:83::-;2299:13;2329:7;2322:14;;;;;:::i;2349:802::-;1744:1:1;2325:7;;:19;;2317:63;;;;-1:-1:-1;;;2317:63:1;;21143:2:22;2317:63:1;;;21125:21:22;21182:2;21162:18;;;21155:30;21221:33;21201:18;;;21194:61;21272:18;;2317:63:1;20941:355:22;2317:63:1;1744:1;2455:7;:18;2453:6:19::1;::::0;::::1;;:15;2445:45;;;::::0;-1:-1:-1;;;2445:45:19;;18812:2:22;2445:45:19::1;::::0;::::1;18794:21:22::0;18851:2;18831:18;;;18824:30;-1:-1:-1;;;18870:18:22;;;18863:47;18927:18;;2445:45:19::1;18610:341:22::0;2445:45:19::1;2538:8;::::0;2520:14:::1;::::0;759:7:5;785:16;;;:12;:16;;;;;;2508:38:19::1;2500:73;;;::::0;-1:-1:-1;;;2500:73:19;;13697:2:22;2500:73:19::1;::::0;::::1;13679:21:22::0;13736:2;13716:18;;;13709:30;-1:-1:-1;;;13755:18:22;;;13748:52;13817:18;;2500:73:19::1;13495:346:22::0;2500:73:19::1;2601:10;;2591:6;:20;;2583:58;;;::::0;-1:-1:-1;;;2583:58:19;;19978:2:22;2583:58:19::1;::::0;::::1;19960:21:22::0;20017:2;19997:18;;;19990:30;20056:27;20036:18;;;20029:55;20101:18;;2583:58:19::1;19776:349:22::0;2583:58:19::1;2659:9;719:10:15::0;2659:25:19::1;2651:68;;;::::0;-1:-1:-1;;;2651:68:19;;16035:2:22;2651:68:19::1;::::0;::::1;16017:21:22::0;16074:2;16054:18;;;16047:30;16113:32;16093:18;;;16086:60;16163:18;;2651:68:19::1;15833:354:22::0;2651:68:19::1;2743:10;::::0;2730::::1;:23:::0;2766:4:::1;::::0;-1:-1:-1;;;;;;;2766:4:19::1;:14;719:10:15::0;2766:28:19::1;::::0;-1:-1:-1;;;;;;2766:28:19::1;::::0;;;;;;-1:-1:-1;;;;;9620:32:22;;;2766:28:19::1;::::0;::::1;9602:51:22::0;9575:18;;2766:28:19::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:32;2763:225;;;2840:13;;2827:10;;:26;;;;:::i;:::-;2814:10;:39:::0;2870:4:::1;::::0;2902:2:::1;::::0;-1:-1:-1;;;;;2870:4:19::1;:14;719:10:15::0;2870:28:19::1;::::0;-1:-1:-1;;;;;;2870:28:19::1;::::0;;;;;;-1:-1:-1;;;;;9620:32:22;;;2870:28:19::1;::::0;::::1;9602:51:22::0;9575:18;;2870:28:19::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:34;2867:111;;2950:13;;2937:10;;:26;;;;:::i;:::-;2924:10;:39:::0;2867:111:::1;3030:9;3016:10;;3007:6;:19;;;;:::i;:::-;:32;2999:88;;;::::0;-1:-1:-1;;;2999:88:19;;17219:2:22;2999:88:19::1;::::0;::::1;17201:21:22::0;17258:2;17238:18;;;17231:30;17297:34;17277:18;;;17270:62;-1:-1:-1;;;17348:18:22;;;17341:41;17399:19;;2999:88:19::1;17017:407:22::0;2999:88:19::1;3097:47;719:10:15::0;3117:14:19::1;;3133:6;3097:47;;;;;;;;;;;::::0;:5:::1;:47::i;:::-;-1:-1:-1::0;1701:1:1;2628:7;:22;2349:802:19:o;3146:153:2:-;3240:52;719:10:15;3273:8:2;3283;3240:18;:52::i;4492:100:19:-;4540:13;4572;4565:20;;;;;:::i;5579:110::-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:15;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;5629:53:19::1;::::0;719:10:15;;5660:21:19::1;5629:53:::0;::::1;;;::::0;::::1;::::0;;;5660:21;719:10:15;5629:53:19;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;5579:110::o:0;3599:389:2:-;-1:-1:-1;;;;;3799:20:2;;719:10:15;3799:20:2;;:60;;-1:-1:-1;3823:36:2;3840:4;719:10:15;3366:166:2;:::i;3823:36::-;3778:148;;;;-1:-1:-1;;;3778:148:2;;15625:2:22;3778:148:2;;;15607:21:22;15664:2;15644:18;;;15637:30;15703:34;15683:18;;;15676:62;-1:-1:-1;;;15754:18:22;;;15747:39;15803:19;;3778:148:2;15423:405:22;3778:148:2;3936:45;3954:4;3960:2;3964;3968:6;3976:4;3936:17;:45::i;1918:198:0:-;1108:6;;-1:-1:-1;;;;;1108:6:0;719:10:15;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;;14869:2:22;1998:73:0::1;::::0;::::1;14851:21:22::0;14908:2;14888:18;;;14881:30;14947:34;14927:18;;;14920:62;-1:-1:-1;;;14998:18:22;;;14991:36;15044:19;;1998:73:0::1;14667:402:22::0;1998:73:0::1;2081:28;2100:8;2081:18;:28::i;5154:206:19:-:0;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:15;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;5235:23:19;::::1;5227:56;;;::::0;-1:-1:-1;;;5227:56:19;;15276:2:22;5227:56:19::1;::::0;::::1;15258:21:22::0;15315:2;15295:18;;;15288:30;-1:-1:-1;;;15334:18:22;;;15327:50;15394:18;;5227:56:19::1;15074:344:22::0;5227:56:19::1;5293:4;:26:::0;;-1:-1:-1;;;;;5293:26:19;;::::1;-1:-1:-1::0;;;;;;5293:26:19;;::::1;::::0;::::1;::::0;;;5329:12:::1;:24:::0;;;;::::1;;::::0;;5154:206::o;328:703:16:-;384:13;601:10;597:51;;-1:-1:-1;;627:10:16;;;;;;;;;;;;-1:-1:-1;;;627:10:16;;;;;328:703::o;597:51::-;672:5;657:12;711:75;718:9;;711:75;;743:8;;;;:::i;:::-;;-1:-1:-1;765:10:16;;-1:-1:-1;773:2:16;765:10;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;817:17:16;;795:39;;844:150;851:10;;844:150;;877:11;887:1;877:11;;:::i;:::-;;-1:-1:-1;945:10:16;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:16;;;;;;;;-1:-1:-1;972:11:16;981:2;972:11;;:::i;:::-;;;844:150;;;1017:6;328:703;-1:-1:-1;;;;328:703:16:o;8630:709:2:-;-1:-1:-1;;;;;8777:16:2;;8769:62;;;;-1:-1:-1;;;8769:62:2;;20741:2:22;8769:62:2;;;20723:21:22;20780:2;20760:18;;;20753:30;20819:34;20799:18;;;20792:62;-1:-1:-1;;;20870:18:22;;;20863:31;20911:19;;8769:62:2;20539:397:22;8769:62:2;719:10:15;8842:16:2;8906:21;8924:2;8906:17;:21::i;:::-;8883:44;;8937:24;8964:25;8982:6;8964:17;:25::i;:::-;8937:52;;9000:66;9021:8;9039:1;9043:2;9047:3;9052:7;9061:4;9000:20;:66::i;:::-;9077:9;:13;;;;;;;;;;;-1:-1:-1;;;;;9077:17:2;;;;;;;;;:27;;9098:6;;9077:9;:27;;9098:6;;9077:27;:::i;:::-;;;;-1:-1:-1;;9119:52:2;;;21657:25:22;;;21713:2;21698:18;;21691:34;;;-1:-1:-1;;;;;9119:52:2;;;;9152:1;;9119:52;;;;;;21630:18:22;9119:52:2;;;;;;;9258:74;9289:8;9307:1;9311:2;9315;9319:6;9327:4;9258:30;:74::i;:::-;8759:580;;;8630:709;;;;:::o;6233:1115::-;6453:7;:14;6439:3;:10;:28;6431:81;;;;-1:-1:-1;;;6431:81:2;;20332:2:22;6431:81:2;;;20314:21:22;20371:2;20351:18;;;20344:30;20410:34;20390:18;;;20383:62;-1:-1:-1;;;20461:18:22;;;20454:38;20509:19;;6431:81:2;20130:404:22;6431:81:2;-1:-1:-1;;;;;6530:16:2;;6522:66;;;;-1:-1:-1;;;6522:66:2;;;;;;;:::i;:::-;719:10:15;6641:60:2;719:10:15;6672:4:2;6678:2;6682:3;6687:7;6696:4;6641:20;:60::i;:::-;6717:9;6712:411;6736:3;:10;6732:1;:14;6712:411;;;6767:10;6780:3;6784:1;6780:6;;;;;;;;:::i;:::-;;;;;;;6767:19;;6800:14;6817:7;6825:1;6817:10;;;;;;;;:::i;:::-;;;;;;;;;;;;6842:19;6864:13;;;;;;;;;;-1:-1:-1;;;;;6864:19:2;;;;;;;;;;;;6817:10;;-1:-1:-1;6905:21:2;;;;6897:76;;;;-1:-1:-1;;;6897:76:2;;;;;;;:::i;:::-;7015:9;:13;;;;;;;;;;;-1:-1:-1;;;;;7015:19:2;;;;;;;;;;7037:20;;;7015:42;;7085:17;;;;;;;:27;;7037:20;;7015:9;7085:27;;7037:20;;7085:27;:::i;:::-;;;;;;;;6753:370;;;6748:3;;;;:::i;:::-;;;6712:411;;;;7168:2;-1:-1:-1;;;;;7138:47:2;7162:4;-1:-1:-1;;;;;7138:47:2;7152:8;-1:-1:-1;;;;;7138:47:2;;7172:3;7177:7;7138:47;;;;;;;:::i;:::-;;;;;;;;7266:75;7302:8;7312:4;7318:2;7322:3;7327:7;7336:4;7266:35;:75::i;:::-;6421:927;6233: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;12773:323:2:-;12923:8;-1:-1:-1;;;;;12914:17:2;:5;-1:-1:-1;;;;;12914:17:2;;;12906:71;;;;-1:-1:-1;;;12906:71:2;;19158:2:22;12906:71:2;;;19140:21:22;19197:2;19177:18;;;19170:30;19236:34;19216:18;;;19209:62;-1:-1:-1;;;19287:18:22;;;19280:39;19336:19;;12906:71:2;18956:405:22;12906:71:2;-1:-1:-1;;;;;12987:25:2;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;12987:46:2;;;;;;;;;;13048:41;;11936::22;;;13048::2;;11909:18:22;13048:41:2;;;;;;;12773:323;;;:::o;4940:947::-;-1:-1:-1;;;;;5121:16:2;;5113:66;;;;-1:-1:-1;;;5113:66:2;;;;;;;:::i;:::-;719:10:15;5190:16:2;5254:21;5272:2;5254:17;:21::i;:::-;5231:44;;5285:24;5312:25;5330:6;5312:17;:25::i;:::-;5285:52;;5348:60;5369:8;5379:4;5385:2;5389:3;5394:7;5403:4;5348:20;:60::i;:::-;5419:19;5441:13;;;;;;;;;;;-1:-1:-1;;;;;5441:19:2;;;;;;;;;;5478:21;;;;5470:76;;;;-1:-1:-1;;;5470:76:2;;;;;;;:::i;:::-;5580:9;:13;;;;;;;;;;;-1:-1:-1;;;;;5580:19:2;;;;;;;;;;5602:20;;;5580:42;;5642:17;;;;;;;:27;;5602:20;;5580:9;5642:27;;5602:20;;5642:27;:::i;:::-;;;;-1:-1:-1;;5685:46:2;;;21657:25:22;;;21713:2;21698:18;;21691:34;;;-1:-1:-1;;;;;5685:46:2;;;;;;;;;;;;;;21630:18:22;5685:46:2;;;;;;;5812:68;5843:8;5853:4;5859:2;5863;5867:6;5875:4;5812:30;:68::i;:::-;5103:784;;;;4940:947;;;;;:::o;16925:193::-;17044:16;;;17058:1;17044:16;;;;;;;;;16991;;17019:22;;17044:16;;;;;;;;;;;;-1:-1:-1;17044:16:2;17019:41;;17081:7;17070:5;17076:1;17070:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;17106:5;16925:193;-1:-1:-1;;16925:193:2:o;5894:588:19:-;6078:66;6105:8;6115:4;6121:2;6125:3;6130:7;6139:4;6078:26;:66::i;:::-;6159:27;6183:2;6159:23;:27::i;:::-;6155:321;;-1:-1:-1;;;;;6208:21:19;;;;;;:17;:21;;;;;6232:15;6208:39;;6155:321;;;6282:4;;:32;;-1:-1:-1;;;6282:32:19;;-1:-1:-1;;;;;9620:32:22;;;6282::19;;;9602:51:22;6317:1:19;;6282:4;;:28;;9575:18:22;;6282:32:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:36;6278:188;;;6362:4;;:32;;-1:-1:-1;;;6362:32:19;;-1:-1:-1;;;;;9620:32:22;;;6362::19;;;9602:51:22;6362:4:19;;;;:28;;9575:18:22;;6362:32:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;6338:21:19;;;;;;:17;:21;;;;;;;;:56;;;;6412:17;:21;;;6436:15;6412:39;;5894:588;;;;;;:::o;15396:725:2:-;-1:-1:-1;;;;;15603:13:2;;1465:19:14;:23;15599:516:2;;15638:72;;-1:-1:-1;;;15638:72:2;;-1:-1:-1;;;;;15638:38:2;;;;;:72;;15677:8;;15687:4;;15693:2;;15697:6;;15705:4;;15638:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15638:72:2;;;;;;;;-1:-1:-1;;15638:72:2;;;;;;;;;;;;:::i;:::-;;;15634:471;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;15981:6;15974:14;;-1:-1:-1;;;15974:14:2;;;;;;;;:::i;15634:471::-;;;16028:62;;-1:-1:-1;;;16028:62:2;;12867:2:22;16028:62:2;;;12849:21:22;12906:2;12886:18;;;12879:30;12945:34;12925:18;;;12918:62;-1:-1:-1;;;12996:18:22;;;12989:50;13056:19;;16028:62:2;12665:416:22;15634:471:2;-1:-1:-1;;;;;;15759:55:2;;-1:-1:-1;;;15759:55:2;15755:152;;15838:50;;-1:-1:-1;;;15838:50:2;;;;;;;:::i;16127:792::-;-1:-1:-1;;;;;16359:13:2;;1465:19:14;:23;16355:558:2;;16394:79;;-1:-1:-1;;;16394:79:2;;-1:-1:-1;;;;;16394:43:2;;;;;:79;;16438:8;;16448:4;;16454:3;;16459:7;;16468:4;;16394:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16394:79:2;;;;;;;;-1:-1:-1;;16394:79:2;;;;;;;;;;;;:::i;:::-;;;16390:513;;;;:::i;:::-;-1:-1:-1;;;;;;16552:60:2;;-1:-1:-1;;;16552:60:2;16548:157;;16636:50;;-1:-1:-1;;;16636:50:2;;;;;;;:::i;1091:904:5:-;-1:-1:-1;;;;;1403:18:5;;1399:156;;1442:9;1437:108;1461:3;:10;1457:1;:14;1437:108;;;1520:7;1528:1;1520:10;;;;;;;;:::i;:::-;;;;;;;1496:12;:20;1509:3;1513:1;1509:6;;;;;;;;:::i;:::-;;;;;;;1496:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;1473:3:5;;-1:-1:-1;1473:3:5;;:::i;:::-;;;1437:108;;;;1399:156;-1:-1:-1;;;;;1569:16:5;;1565:424;;1606:9;1601:378;1625:3;:10;1621:1;:14;1601:378;;;1660:10;1673:3;1677:1;1673:6;;;;;;;;:::i;:::-;;;;;;;1660:19;;1697:14;1714:7;1722:1;1714:10;;;;;;;;:::i;:::-;;;;;;;1697:27;;1742:14;1759:12;:16;1772:2;1759:16;;;;;;;;;;;;1742:33;;1811:6;1801;:16;;1793:69;;;;-1:-1:-1;;;1793:69:5;;18403:2:22;1793:69:5;;;18385:21:22;18442:2;18422:18;;;18415:30;18481:34;18461:18;;;18454:62;-1:-1:-1;;;18532:18:22;;;18525:38;18580:19;;1793:69:5;18201:404:22;1793:69:5;1912:16;;;;:12;:16;;;;;;1931:15;;1912:34;;1637:3;;;:::i;:::-;;;1601:378;;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:468:22;78:5;112:18;104:6;101:30;98:56;;;134:18;;:::i;:::-;183:2;177:9;195:69;252:2;231:15;;-1:-1:-1;;227:29:22;258:4;223:40;177:9;195:69;:::i;:::-;282:6;273:15;;312:6;304;297:22;352:3;343:6;338:3;334:16;331:25;328:45;;;369:1;366;359:12;328:45;419:6;414:3;407:4;399:6;395:17;382:44;474:1;467:4;458:6;450;446:19;442:30;435:41;;14:468;;;;;:::o;487:173::-;555:20;;-1:-1:-1;;;;;604:31:22;;594:42;;584:70;;650:1;647;640:12;584:70;487:173;;;:::o;665:735::-;719:5;772:3;765:4;757:6;753:17;749:27;739:55;;790:1;787;780:12;739:55;826:6;813:20;852:4;875:43;915:2;875:43;:::i;:::-;947:2;941:9;959:31;987:2;979:6;959:31;:::i;:::-;1025:18;;;1059:15;;;;-1:-1:-1;1094:15:22;;;1144:1;1140:10;;;1128:23;;1124:32;;1121:41;-1:-1:-1;1118:61:22;;;1175:1;1172;1165:12;1118:61;1197:1;1207:163;1221:2;1218:1;1215:9;1207:163;;;1278:17;;1266:30;;1316:12;;;;1348;;;;1239:1;1232:9;1207:163;;;-1:-1:-1;1388:6:22;;665:735;-1:-1:-1;;;;;;;665:735:22:o;1405:220::-;1447:5;1500:3;1493:4;1485:6;1481:17;1477:27;1467:55;;1518:1;1515;1508:12;1467:55;1540:79;1615:3;1606:6;1593:20;1586:4;1578:6;1574:17;1540:79;:::i;:::-;1531:88;1405:220;-1:-1:-1;;;1405:220:22:o;1630:186::-;1689:6;1742:2;1730:9;1721:7;1717:23;1713:32;1710:52;;;1758:1;1755;1748:12;1710:52;1781:29;1800:9;1781:29;:::i;1821:260::-;1889:6;1897;1950:2;1938:9;1929:7;1925:23;1921:32;1918:52;;;1966:1;1963;1956:12;1918:52;1989:29;2008:9;1989:29;:::i;:::-;1979:39;;2037:38;2071:2;2060:9;2056:18;2037:38;:::i;:::-;2027:48;;1821:260;;;;;:::o;2086:943::-;2240:6;2248;2256;2264;2272;2325:3;2313:9;2304:7;2300:23;2296:33;2293:53;;;2342:1;2339;2332:12;2293:53;2365:29;2384:9;2365:29;:::i;:::-;2355:39;;2413:38;2447:2;2436:9;2432:18;2413:38;:::i;:::-;2403:48;;2502:2;2491:9;2487:18;2474:32;2525:18;2566:2;2558:6;2555:14;2552:34;;;2582:1;2579;2572:12;2552:34;2605:61;2658:7;2649:6;2638:9;2634:22;2605:61;:::i;:::-;2595:71;;2719:2;2708:9;2704:18;2691:32;2675:48;;2748:2;2738:8;2735:16;2732:36;;;2764:1;2761;2754:12;2732:36;2787:63;2842:7;2831:8;2820:9;2816:24;2787:63;:::i;:::-;2777:73;;2903:3;2892:9;2888:19;2875:33;2859:49;;2933:2;2923:8;2920:16;2917:36;;;2949:1;2946;2939:12;2917:36;;2972:51;3015:7;3004:8;2993:9;2989:24;2972:51;:::i;:::-;2962:61;;;2086:943;;;;;;;;:::o;3034:606::-;3138:6;3146;3154;3162;3170;3223:3;3211:9;3202:7;3198:23;3194:33;3191:53;;;3240:1;3237;3230:12;3191:53;3263:29;3282:9;3263:29;:::i;:::-;3253:39;;3311:38;3345:2;3334:9;3330:18;3311:38;:::i;:::-;3301:48;;3396:2;3385:9;3381:18;3368:32;3358:42;;3447:2;3436:9;3432:18;3419:32;3409:42;;3502:3;3491:9;3487:19;3474:33;3530:18;3522:6;3519:30;3516:50;;;3562:1;3559;3552:12;3516:50;3585:49;3626:7;3617:6;3606:9;3602:22;3585:49;:::i;3645:347::-;3710:6;3718;3771:2;3759:9;3750:7;3746:23;3742:32;3739:52;;;3787:1;3784;3777:12;3739:52;3810:29;3829:9;3810:29;:::i;:::-;3800:39;;3889:2;3878:9;3874:18;3861:32;3936:5;3929:13;3922:21;3915:5;3912:32;3902:60;;3958:1;3955;3948:12;3902:60;3981:5;3971:15;;;3645:347;;;;;:::o;3997:254::-;4065:6;4073;4126:2;4114:9;4105:7;4101:23;4097:32;4094:52;;;4142:1;4139;4132:12;4094:52;4165:29;4184:9;4165:29;:::i;:::-;4155:39;4241:2;4226:18;;;;4213:32;;-1:-1:-1;;;3997:254:22:o;4256:322::-;4333:6;4341;4349;4402:2;4390:9;4381:7;4377:23;4373:32;4370:52;;;4418:1;4415;4408:12;4370:52;4441:29;4460:9;4441:29;:::i;:::-;4431:39;4517:2;4502:18;;4489:32;;-1:-1:-1;4568:2:22;4553:18;;;4540:32;;4256:322;-1:-1:-1;;;4256:322:22:o;4583:1219::-;4701:6;4709;4762:2;4750:9;4741:7;4737:23;4733:32;4730:52;;;4778:1;4775;4768:12;4730:52;4818:9;4805:23;4847:18;4888:2;4880:6;4877:14;4874:34;;;4904:1;4901;4894:12;4874:34;4942:6;4931:9;4927:22;4917:32;;4987:7;4980:4;4976:2;4972:13;4968:27;4958:55;;5009:1;5006;4999:12;4958:55;5045:2;5032:16;5067:4;5090:43;5130:2;5090:43;:::i;:::-;5162:2;5156:9;5174:31;5202:2;5194:6;5174:31;:::i;:::-;5240:18;;;5274:15;;;;-1:-1:-1;5309:11:22;;;5351:1;5347:10;;;5339:19;;5335:28;;5332:41;-1:-1:-1;5329:61:22;;;5386:1;5383;5376:12;5329:61;5408:1;5399:10;;5418:169;5432:2;5429:1;5426:9;5418:169;;;5489:23;5508:3;5489:23;:::i;:::-;5477:36;;5450:1;5443:9;;;;;5533:12;;;;5565;;5418:169;;;-1:-1:-1;5606:6:22;-1:-1:-1;;5650:18:22;;5637:32;;-1:-1:-1;;5681:16:22;;;5678:36;;;5710:1;5707;5700:12;5678:36;;5733:63;5788:7;5777:8;5766:9;5762:24;5733:63;:::i;:::-;5723:73;;;4583:1219;;;;;:::o;5807:245::-;5865:6;5918:2;5906:9;5897:7;5893:23;5889:32;5886:52;;;5934:1;5931;5924:12;5886:52;5973:9;5960:23;5992:30;6016:5;5992:30;:::i;6057:249::-;6126:6;6179:2;6167:9;6158:7;6154:23;6150:32;6147:52;;;6195:1;6192;6185:12;6147:52;6227:9;6221:16;6246:30;6270:5;6246:30;:::i;6311:450::-;6380:6;6433:2;6421:9;6412:7;6408:23;6404:32;6401:52;;;6449:1;6446;6439:12;6401:52;6489:9;6476:23;6522:18;6514:6;6511:30;6508:50;;;6554:1;6551;6544:12;6508:50;6577:22;;6630:4;6622:13;;6618:27;-1:-1:-1;6608:55:22;;6659:1;6656;6649:12;6608:55;6682:73;6747:7;6742:2;6729:16;6724:2;6720;6716:11;6682:73;:::i;6766:180::-;6825:6;6878:2;6866:9;6857:7;6853:23;6849:32;6846:52;;;6894:1;6891;6884:12;6846:52;-1:-1:-1;6917:23:22;;6766:180;-1:-1:-1;6766:180:22:o;6951:184::-;7021:6;7074:2;7062:9;7053:7;7049:23;7045:32;7042:52;;;7090:1;7087;7080:12;7042:52;-1:-1:-1;7113:16:22;;6951:184;-1:-1:-1;6951:184:22:o;7140:435::-;7193:3;7231:5;7225:12;7258:6;7253:3;7246:19;7284:4;7313:2;7308:3;7304:12;7297:19;;7350:2;7343:5;7339:14;7371:1;7381:169;7395:6;7392:1;7389:13;7381:169;;;7456:13;;7444:26;;7490:12;;;;7525:15;;;;7417:1;7410:9;7381:169;;;-1:-1:-1;7566:3:22;;7140:435;-1:-1:-1;;;;;7140:435:22:o;7580:257::-;7621:3;7659:5;7653:12;7686:6;7681:3;7674:19;7702:63;7758:6;7751:4;7746:3;7742:14;7735:4;7728:5;7724:16;7702:63;:::i;:::-;7819:2;7798:15;-1:-1:-1;;7794:29:22;7785:39;;;;7826:4;7781:50;;7580:257;-1:-1:-1;;7580:257:22:o;7842:185::-;7884:3;7922:5;7916:12;7937:52;7982:6;7977:3;7970:4;7963:5;7959:16;7937:52;:::i;:::-;8005:16;;;;;7842:185;-1:-1:-1;;7842:185:22:o;8150:1301::-;8427:3;8456:1;8489:6;8483:13;8519:3;8541:1;8569:9;8565:2;8561:18;8551:28;;8629:2;8618:9;8614:18;8651;8641:61;;8695:4;8687:6;8683:17;8673:27;;8641:61;8721:2;8769;8761:6;8758:14;8738:18;8735:38;8732:165;;;-1:-1:-1;;;8796:33:22;;8852:4;8849:1;8842:15;8882:4;8803:3;8870:17;8732:165;8913:18;8940:104;;;;9058:1;9053:320;;;;8906:467;;8940:104;-1:-1:-1;;8973:24:22;;8961:37;;9018:16;;;;-1:-1:-1;8940:104:22;;9053:320;21997:1;21990:14;;;22034:4;22021:18;;9148:1;9162:165;9176:6;9173:1;9170:13;9162:165;;;9254:14;;9241:11;;;9234:35;9297:16;;;;9191:10;;9162:165;;;9166:3;;9356:6;9351:3;9347:16;9340:23;;8906:467;;;;;;;9389:56;9414:30;9440:3;9432:6;9414:30;:::i;:::-;-1:-1:-1;;;8092:20:22;;8137:1;8128:11;;8032:113;9389:56;9382:63;8150:1301;-1:-1:-1;;;;;8150:1301:22:o;9664:826::-;-1:-1:-1;;;;;10061:15:22;;;10043:34;;10113:15;;10108:2;10093:18;;10086:43;10023:3;10160:2;10145:18;;10138:31;;;9986:4;;10192:57;;10229:19;;10221:6;10192:57;:::i;:::-;10297:9;10289:6;10285:22;10280:2;10269:9;10265:18;10258:50;10331:44;10368:6;10360;10331:44;:::i;:::-;10317:58;;10424:9;10416:6;10412:22;10406:3;10395:9;10391:19;10384:51;10452:32;10477:6;10469;10452:32;:::i;:::-;10444:40;9664:826;-1:-1:-1;;;;;;;;9664:826:22:o;10495:560::-;-1:-1:-1;;;;;10792:15:22;;;10774:34;;10844:15;;10839:2;10824:18;;10817:43;10891:2;10876:18;;10869:34;;;10934:2;10919:18;;10912:34;;;10754:3;10977;10962:19;;10955:32;;;10717:4;;11004:45;;11029:19;;11021:6;11004:45;:::i;:::-;10996:53;10495:560;-1:-1:-1;;;;;;;10495:560:22:o;11060:261::-;11239:2;11228:9;11221:21;11202:4;11259:56;11311:2;11300:9;11296:18;11288:6;11259:56;:::i;11326:465::-;11583:2;11572:9;11565:21;11546:4;11609:56;11661:2;11650:9;11646:18;11638:6;11609:56;:::i;:::-;11713:9;11705:6;11701:22;11696:2;11685:9;11681:18;11674:50;11741:44;11778:6;11770;11741:44;:::i;12441:219::-;12590:2;12579:9;12572:21;12553:4;12610:44;12650:2;12639:9;12635:18;12627:6;12610:44;:::i;13086:404::-;13288:2;13270:21;;;13327:2;13307:18;;;13300:30;13366:34;13361:2;13346:18;;13339:62;-1:-1:-1;;;13432:2:22;13417:18;;13410:38;13480:3;13465:19;;13086:404::o;13846:::-;14048:2;14030:21;;;14087:2;14067:18;;;14060:30;14126:34;14121:2;14106:18;;14099:62;-1:-1:-1;;;14192:2:22;14177:18;;14170:38;14240:3;14225:19;;13846:404::o;16192:401::-;16394:2;16376:21;;;16433:2;16413:18;;;16406:30;16472:34;16467:2;16452:18;;16445:62;-1:-1:-1;;;16538:2:22;16523:18;;16516:35;16583:3;16568:19;;16192:401::o;17429:406::-;17631:2;17613:21;;;17670:2;17650:18;;;17643:30;17709:34;17704:2;17689:18;;17682:62;-1:-1:-1;;;17775:2:22;17760:18;;17753:40;17825:3;17810:19;;17429:406::o;17840:356::-;18042:2;18024:21;;;18061:18;;;18054:30;18120:34;18115:2;18100:18;;18093:62;18187:2;18172:18;;17840:356::o;21736:183::-;21796:4;21829:18;21821:6;21818:30;21815:56;;;21851:18;;:::i;:::-;-1:-1:-1;21896:1:22;21892:14;21908:4;21888:25;;21736:183::o;22050:128::-;22090:3;22121:1;22117:6;22114:1;22111:13;22108:39;;;22127:18;;:::i;:::-;-1:-1:-1;22163:9:22;;22050:128::o;22183:120::-;22223:1;22249;22239:35;;22254:18;;:::i;:::-;-1:-1:-1;22288:9:22;;22183:120::o;22308:168::-;22348:7;22414:1;22410;22406:6;22402:14;22399:1;22396:21;22391:1;22384:9;22377:17;22373:45;22370:71;;;22421:18;;:::i;:::-;-1:-1:-1;22461:9:22;;22308:168::o;22481:125::-;22521:4;22549:1;22546;22543:8;22540:34;;;22554:18;;:::i;:::-;-1:-1:-1;22591:9:22;;22481:125::o;22611:258::-;22683:1;22693:113;22707:6;22704:1;22701:13;22693:113;;;22783:11;;;22777:18;22764:11;;;22757:39;22729:2;22722:10;22693:113;;;22824:6;22821:1;22818:13;22815:48;;;22859:1;22850:6;22845:3;22841:16;22834:27;22815:48;;22611:258;;;:::o;22874:380::-;22953:1;22949:12;;;;22996;;;23017:61;;23071:4;23063:6;23059:17;23049:27;;23017:61;23124:2;23116:6;23113:14;23093:18;23090:38;23087:161;;;23170:10;23165:3;23161:20;23158:1;23151:31;23205:4;23202:1;23195:15;23233:4;23230:1;23223:15;23087:161;;22874:380;;;:::o;23259:249::-;23369:2;23350:13;;-1:-1:-1;;23346:27:22;23334:40;;23404:18;23389:34;;23425:22;;;23386:62;23383:88;;;23451:18;;:::i;:::-;23487:2;23480:22;-1:-1:-1;;23259:249:22:o;23513:135::-;23552:3;-1:-1:-1;;23573:17:22;;23570:43;;;23593:18;;:::i;:::-;-1:-1:-1;23640:1:22;23629:13;;23513:135::o;23653:112::-;23685:1;23711;23701:35;;23716:18;;:::i;:::-;-1:-1:-1;23750:9:22;;23653:112::o;23770:127::-;23831:10;23826:3;23822:20;23819:1;23812:31;23862:4;23859:1;23852:15;23886:4;23883:1;23876:15;23902:127;23963:10;23958:3;23954:20;23951:1;23944:31;23994:4;23991:1;23984:15;24018:4;24015:1;24008:15;24034:127;24095:10;24090:3;24086:20;24083:1;24076:31;24126:4;24123:1;24116:15;24150:4;24147:1;24140:15;24166:127;24227:10;24222:3;24218:20;24215:1;24208:31;24258:4;24255:1;24248:15;24282:4;24279:1;24272:15;24298:179;24333:3;24375:1;24357:16;24354:23;24351:120;;;24421:1;24418;24415;24400:23;-1:-1:-1;24458:1:22;24452:8;24447:3;24443:18;24351:120;24298:179;:::o;24482:671::-;24521:3;24563:4;24545:16;24542:26;24539:39;;;24482:671;:::o;24539:39::-;24605:2;24599:9;-1:-1:-1;;24670:16:22;24666:25;;24663:1;24599:9;24642:50;24721:4;24715:11;24745:16;24780:18;24851:2;24844:4;24836:6;24832:17;24829:25;24824:2;24816:6;24813:14;24810:45;24807:58;;;24858:5;;;;;24482:671;:::o;24807:58::-;24895:6;24889:4;24885:17;24874:28;;24931:3;24925:10;24958:2;24950:6;24947:14;24944:27;;;24964:5;;;;;;24482:671;:::o;24944:27::-;25048:2;25029:16;25023:4;25019:27;25015:36;25008:4;24999:6;24994:3;24990:16;24986:27;24983:69;24980:82;;;25055:5;;;;;;24482:671;:::o;24980:82::-;25071:57;25122:4;25113:6;25105;25101:19;25097:30;25091:4;25071:57;:::i;:::-;-1:-1:-1;25144:3:22;;24482:671;-1:-1:-1;;;;;24482:671:22:o;25158:131::-;-1:-1:-1;;;;;;25232:32:22;;25222:43;;25212:71;;25279:1;25276;25269:12

Swarm Source

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