ETH Price: $3,327.75 (-1.40%)

Token

Crazy Carl Collective Genesis NFTs ()
 

Overview

Max Total Supply

1,111

Holders

426

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
0x2ad7cbeb9b0fb6d942796da4512fd0a62d79800a
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

We are Crazy Carl. Watch us, then join us.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
CrazyCarl

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
File 1 of 14 : CrazyCarl.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.11;

import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/Strings.sol";
import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol";

contract CrazyCarl is ERC1155, Ownable {
    using Strings for string;
    using MerkleProof for bytes32[];

    bytes32 public root =
        0xca58eac98cf801780b3429b340c203bc9dc8a12fdf3b366c861cb65e8ca77dec;

    string public _baseURI =
        "ipfs://QmPEZGHQqUQpoTUknQ6ivxCRxQzyv3xgRJibHMnjCabeHC/";
    string public _contractURI =
        "ipfs://QmdrNApBH3WYuit8f7Dy4e3iRt6EbBa2LP7uPte2iVE7bt";

    uint256 public pricePerToken = 0.01 ether; //only for public sale
    bool public locked; //metadata lock
    mapping(uint256 => uint256) public tokensMinterTier; //tier 1 -> tokensMinted
    uint256 public tokensMinted = 0;
    uint256 public unlockedSupply = 933;
    uint256 public maxTiers = 3;
    mapping(address => uint256) public listPurchases; //keeps track of whitelist buys

    uint256 public publicSaleStartTime = 0;
    uint256 public publicSaleEndTime = 0;

    uint256 public whitelistStartTime = 1643983200;
    uint256 public whitelistEndTime = 1645192800;

    constructor() ERC1155(_baseURI) {}

    function adminMint(
        address receiver,
        uint256 tier,
        uint256 qty
    ) external onlyOwner {
        require(tier > 0 && tier <= maxTiers, "tier not in range");
        require(tokensMinterTier[tier] + qty <= 1111, "tier out of stock");
        require(tokensMinted + qty <= unlockedSupply, "out of stock");

        tokensMinterTier[tier] = tokensMinterTier[tier] + qty;
        tokensMinted = tokensMinted + qty;
        _mint(receiver, tier, qty, "");
    }

    //onlyWhitelists can claim
    function whitelistMint(
        uint256 tier,
        uint256 qty,
        uint256 tokenID, //tokenID is the max qty an address can get
        bytes32[] calldata proof
    ) external {
        require(tier > 0 && tier <= maxTiers, "tier not in range");
        require(
            listPurchases[msg.sender] + qty <= tokenID,
            "wallet limit reached"
        );
        require(tokensMinterTier[tier] + qty <= 1111, "tier out of stock");
        require(tokensMinted + qty <= unlockedSupply, "out of stock");
        require(isPurchaseValid(msg.sender, tokenID, proof), "invalid proof");
        require(whitelistStartTime < block.timestamp, "sale not started");
        require(whitelistEndTime > block.timestamp, "sale ended");
        listPurchases[msg.sender] += qty;

        tokensMinterTier[tier] = tokensMinterTier[tier] + qty;
        tokensMinted = tokensMinted + qty;
        _mint(msg.sender, tier, qty, "");
    }

    //anyone can buy, without any limits
    function publicBuy(uint256 tier, uint256 qty) external payable {
        require(tier > 0 && tier <= maxTiers, "tier not in range");
        require(tokensMinterTier[tier] + qty <= 1111, "tier out of stock");
        require(tokensMinted + qty <= unlockedSupply, "out of stock");
        require(pricePerToken * qty == msg.value, "exact amount needed");
        require(publicSaleStartTime < block.timestamp, "sale not started");
        require(publicSaleEndTime > block.timestamp, "sale ended");

        tokensMinterTier[tier] = tokensMinterTier[tier] + qty;
        tokensMinted = tokensMinted + qty;

        _mint(msg.sender, tier, qty, "");
    }

    function setMerkleRoot(bytes32 _root) external onlyOwner {
        root = _root;
    }

    function setBaseURI(string memory newuri) public onlyOwner {
        require(!locked, "locked functions");
        _baseURI = newuri;
    }

    function setContractURI(string memory newuri) public onlyOwner {
        require(!locked, "locked functions");
        _contractURI = newuri;
    }

    function uri(uint256 tokenId) public view override returns (string memory) {
        return string(abi.encodePacked(_baseURI, uint2str(tokenId)));
    }

    function contractURI() public view returns (string memory) {
        return _contractURI;
    }

    function isPurchaseValid(
        address _to,
        uint256 _qty,
        bytes32[] memory _proof
    ) public view returns (bool) {
        // construct Merkle tree leaf from the inputs supplied
        bytes32 leaf = keccak256(abi.encodePacked(_to, _qty));

        // verify the proof supplied, and return the verification result
        return _proof.verify(root, leaf);
    }

    function uint2str(uint256 _i)
        internal
        pure
        returns (string memory _uintAsString)
    {
        if (_i == 0) {
            return "0";
        }
        uint256 j = _i;
        uint256 len;
        while (j != 0) {
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint256 k = len;
        while (_i != 0) {
            k = k - 1;
            uint8 temp = (48 + uint8(_i - (_i / 10) * 10));
            bytes1 b1 = bytes1(temp);
            bstr[k] = b1;
            _i /= 10;
        }
        return string(bstr);
    }

    // withdraw the earnings to pay for the artists & devs :)
    function withdraw() public onlyOwner {
        uint256 balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }

    function reclaimERC20(IERC20 erc20Token) public onlyOwner {
        erc20Token.transfer(msg.sender, erc20Token.balanceOf(address(this)));
    }

    function reclaimERC721(IERC721 erc721Token, uint256 id) public onlyOwner {
        erc721Token.safeTransferFrom(address(this), msg.sender, id);
    }

    function reclaimERC1155(
        IERC1155 erc1155Token,
        uint256 id,
        uint256 amount
    ) public onlyOwner {
        erc1155Token.safeTransferFrom(
            address(this),
            msg.sender,
            id,
            amount,
            ""
        );
    }

    //changes the price per token
    function setPricePerToken(uint256 _newPrice) external onlyOwner {
        pricePerToken = _newPrice;
    }

    //set up start and end whitelisted dates
    function setWhitelistSaleTime(uint256 _startTime, uint256 _endTime)
        external
        onlyOwner
    {
        require(_endTime > _startTime, "endtime > starttime");
        require(_endTime > block.timestamp, "endtime > block timestamp");
        whitelistStartTime = _startTime;
        whitelistEndTime = _endTime;
    }

    //set up start and end public mint dates
    function setPublicSaleTime(uint256 _startTime, uint256 _endTime)
        external
        onlyOwner
    {
        require(_endTime > _startTime, "endtime > starttime");
        require(_endTime > block.timestamp, "endtime > block timestamp");
        publicSaleStartTime = _startTime;
        publicSaleEndTime = _endTime;
    }

    //can add a new tier
    function setMaxTiers(uint256 _maxTiers) external onlyOwner {
        maxTiers = _maxTiers;
    }

    //starts a new unlock period
    function setNewUnlockPeriod(uint256 _qty, uint256 _price)
        external
        onlyOwner
    {
        unlockedSupply = _qty;
        pricePerToken = _price;
    }

    // and for the eternity!
    function lockMetadata() external onlyOwner {
        locked = true;
    }
}

File 2 of 14 : ERC1155.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (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();

        _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), 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);

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

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

        _beforeTokenTransfer(operator, address(0), to, _asSingletonArray(id), _asSingletonArray(amount), data);

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

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

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

        _beforeTokenTransfer(operator, from, address(0), _asSingletonArray(id), _asSingletonArray(amount), "");

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

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

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

    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 3 of 14 : 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 4 of 14 : 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 5 of 14 : IERC1155Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (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.
        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. 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 6 of 14 : 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 7 of 14 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 8 of 14 : 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 9 of 14 : ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

File 10 of 14 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @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 `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, 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 `sender` to `recipient` 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 sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

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

File 11 of 14 : IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (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`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

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

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

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

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

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

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

File 12 of 14 : 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 13 of 14 : 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 14 of 14 : MerkleProof.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

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

Settings
{
  "metadata": {
    "useLiteralContent": true
  },
  "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":"_baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"tier","type":"uint256"},{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"adminMint","outputs":[],"stateMutability":"nonpayable","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":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_qty","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"isPurchaseValid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"listPurchases","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"locked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTiers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pricePerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tier","type":"uint256"},{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"publicBuy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicSaleEndTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC1155","name":"erc1155Token","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"reclaimERC1155","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"erc20Token","type":"address"}],"name":"reclaimERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC721","name":"erc721Token","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"reclaimERC721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"root","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newuri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newuri","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxTiers","type":"uint256"}],"name":"setMaxTiers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_qty","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setNewUnlockPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPricePerToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startTime","type":"uint256"},{"internalType":"uint256","name":"_endTime","type":"uint256"}],"name":"setPublicSaleTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startTime","type":"uint256"},{"internalType":"uint256","name":"_endTime","type":"uint256"}],"name":"setWhitelistSaleTime","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":"tokensMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokensMinterTier","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":[],"name":"unlockedSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistEndTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tier","type":"uint256"},{"internalType":"uint256","name":"qty","type":"uint256"},{"internalType":"uint256","name":"tokenID","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

7fca58eac98cf801780b3429b340c203bc9dc8a12fdf3b366c861cb65e8ca77dec60045560e060405260366080818152906200326660a03980516200004d91600591602090910190620001e3565b50604051806060016040528060358152602001620032316035913980516200007e91600691602090910190620001e3565b50662386f26fc100006007556000600a556103a5600b556003600c556000600e556000600f556361fd316060105563620fa660601155348015620000c157600080fd5b5060058054620000d19062000289565b80601f0160208091040260200160405190810160405280929190818152602001828054620000ff9062000289565b8015620001505780601f10620001245761010080835404028352916020019162000150565b820191906000526020600020905b8154815290600101906020018083116200013257829003601f168201915b505050505062000166816200017860201b60201c565b50620001723362000191565b620002c6565b80516200018d906002906020840190620001e3565b5050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001f19062000289565b90600052602060002090601f01602090048101928262000215576000855562000260565b82601f106200023057805160ff191683800117855562000260565b8280016001018555821562000260579182015b828111156200026057825182559160200191906001019062000243565b506200026e92915062000272565b5090565b5b808211156200026e576000815560010162000273565b600181811c908216806200029e57607f821691505b60208210811415620002c057634e487b7160e01b600052602260045260246000fd5b50919050565b612f5b80620002d66000396000f3fe60806040526004361061025a5760003560e01c80637cb6475911610144578063d6957315116100b6578063e985e9c51161007a578063e985e9c5146106cf578063ebdfd72214610718578063ebf0c7171461072e578063f242432a14610744578063f2fde38b14610764578063fd3d27b81461078457600080fd5b8063d69573151461062d578063daf5dd0b1461064d578063df7253961461066d578063e60ad0411461068d578063e8a3d485146106ba57600080fd5b80639292caaf116101085780639292caaf14610593578063938e3d7b146105a9578063989bdbb6146105c9578063a22cb465146105de578063c0e72740146105fe578063cf3090121461061357600080fd5b80637cb64759146104f55780637d6bc26014610515578063801316dc1461052b5780638905fd4f1461054b5780638da5cb5b1461056b57600080fd5b8063432697c7116101dd5780636b7d2470116101a15780636b7d2470146104695780636bb7b1d9146104895780636de9f32b1461049f578063715018a6146104b5578063743976a0146104ca5780637b1b1de6146104df57600080fd5b8063432697c7146103c95780634e1273f4146103dc57806354645d6a1461040957806355f804b31461042957806365733d091461044957600080fd5b80631c8e7d2a116102245780631c8e7d2a1461033e5780631e4d185f1461035e5780632bf2762f146103745780632eb2c2d6146103945780633ccfd60b146103b457600080fd5b80624a84cb1461025f578062fdd58e1461028157806301ffc9a7146102b45780630e89341c146102e45780630f39dc9d14610311575b600080fd5b34801561026b57600080fd5b5061027f61027a366004612311565b61079a565b005b34801561028d57600080fd5b506102a161029c366004612346565b6108c3565b6040519081526020015b60405180910390f35b3480156102c057600080fd5b506102d46102cf366004612388565b610955565b60405190151581526020016102ab565b3480156102f057600080fd5b506103046102ff3660046123ac565b6109a7565b6040516102ab9190612421565b34801561031d57600080fd5b506102a161032c3660046123ac565b60096020526000908152604090205481565b34801561034a57600080fd5b5061027f610359366004612311565b6109db565b34801561036a57600080fd5b506102a1600f5481565b34801561038057600080fd5b5061027f61038f3660046123ac565b610a85565b3480156103a057600080fd5b5061027f6103af36600461258a565b610ab4565b3480156103c057600080fd5b5061027f610b4b565b61027f6103d7366004612638565b610ba8565b3480156103e857600080fd5b506103fc6103f736600461265a565b610d6d565b6040516102ab9190612762565b34801561041557600080fd5b5061027f610424366004612638565b610e97565b34801561043557600080fd5b5061027f610444366004612775565b610f5c565b34801561045557600080fd5b5061027f6104643660046123ac565b610fdf565b34801561047557600080fd5b5061027f610484366004612346565b61100e565b34801561049557600080fd5b506102a1600e5481565b3480156104ab57600080fd5b506102a1600a5481565b3480156104c157600080fd5b5061027f6110a2565b3480156104d657600080fd5b506103046110d8565b3480156104eb57600080fd5b506102a160075481565b34801561050157600080fd5b5061027f6105103660046123ac565b611166565b34801561052157600080fd5b506102a1600c5481565b34801561053757600080fd5b5061027f610546366004612638565b611195565b34801561055757600080fd5b5061027f6105663660046127c6565b61125a565b34801561057757600080fd5b506003546040516001600160a01b0390911681526020016102ab565b34801561059f57600080fd5b506102a160105481565b3480156105b557600080fd5b5061027f6105c4366004612775565b611365565b3480156105d557600080fd5b5061027f6113e8565b3480156105ea57600080fd5b5061027f6105f93660046127f1565b611421565b34801561060a57600080fd5b5061030461142c565b34801561061f57600080fd5b506008546102d49060ff1681565b34801561063957600080fd5b5061027f610648366004612638565b611439565b34801561065957600080fd5b506102d461066836600461282a565b61146e565b34801561067957600080fd5b5061027f6106883660046128e4565b6114d1565b34801561069957600080fd5b506102a16106a83660046127c6565b600d6020526000908152604090205481565b3480156106c657600080fd5b50610304611744565b3480156106db57600080fd5b506102d46106ea366004612974565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b34801561072457600080fd5b506102a160115481565b34801561073a57600080fd5b506102a160045481565b34801561075057600080fd5b5061027f61075f3660046129a2565b6117d6565b34801561077057600080fd5b5061027f61077f3660046127c6565b61185d565b34801561079057600080fd5b506102a1600b5481565b6003546001600160a01b031633146107cd5760405162461bcd60e51b81526004016107c490612a0b565b60405180910390fd5b6000821180156107df5750600c548211155b6107fb5760405162461bcd60e51b81526004016107c490612a40565b60008281526009602052604090205461045790610819908390612a81565b11156108375760405162461bcd60e51b81526004016107c490612a99565b600b5481600a546108489190612a81565b11156108665760405162461bcd60e51b81526004016107c490612ac4565b600082815260096020526040902054610880908290612a81565b600083815260096020526040902055600a5461089d908290612a81565b600a819055506108be838383604051806020016040528060008152506118f8565b505050565b60006001600160a01b03831661092f5760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084016107c4565b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b148061098657506001600160e01b031982166303a24d0760e21b145b806109a157506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060056109b483611a02565b6040516020016109c5929190612b41565b6040516020818303038152906040529050919050565b6003546001600160a01b03163314610a055760405162461bcd60e51b81526004016107c490612a0b565b604051637921219560e11b8152306004820152336024820152604481018390526064810182905260a06084820152600060a48201526001600160a01b0384169063f242432a9060c401600060405180830381600087803b158015610a6857600080fd5b505af1158015610a7c573d6000803e3d6000fd5b50505050505050565b6003546001600160a01b03163314610aaf5760405162461bcd60e51b81526004016107c490612a0b565b600755565b6001600160a01b038516331480610ad05750610ad085336106ea565b610b375760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b60648201526084016107c4565b610b448585858585611b2b565b5050505050565b6003546001600160a01b03163314610b755760405162461bcd60e51b81526004016107c490612a0b565b6040514790339082156108fc029083906000818181858888f19350505050158015610ba4573d6000803e3d6000fd5b5050565b600082118015610bba5750600c548211155b610bd65760405162461bcd60e51b81526004016107c490612a40565b60008281526009602052604090205461045790610bf4908390612a81565b1115610c125760405162461bcd60e51b81526004016107c490612a99565b600b5481600a54610c239190612a81565b1115610c415760405162461bcd60e51b81526004016107c490612ac4565b3481600754610c509190612bdf565b14610c935760405162461bcd60e51b8152602060048201526013602482015272195e1858dd08185b5bdd5b9d081b9959591959606a1b60448201526064016107c4565b42600e5410610cd75760405162461bcd60e51b815260206004820152601060248201526f1cd85b19481b9bdd081cdd185c9d195960821b60448201526064016107c4565b42600f5411610d155760405162461bcd60e51b815260206004820152600a6024820152691cd85b1948195b99195960b21b60448201526064016107c4565b600082815260096020526040902054610d2f908290612a81565b600083815260096020526040902055600a54610d4c908290612a81565b600a81905550610ba4338383604051806020016040528060008152506118f8565b60608151835114610dd25760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b60648201526084016107c4565b6000835167ffffffffffffffff811115610dee57610dee612434565b604051908082528060200260200182016040528015610e17578160200160208202803683370190505b50905060005b8451811015610e8f57610e62858281518110610e3b57610e3b612bfe565b6020026020010151858381518110610e5557610e55612bfe565b60200260200101516108c3565b828281518110610e7457610e74612bfe565b6020908102919091010152610e8881612c14565b9050610e1d565b509392505050565b6003546001600160a01b03163314610ec15760405162461bcd60e51b81526004016107c490612a0b565b818111610f065760405162461bcd60e51b8152602060048201526013602482015272656e6474696d65203e20737461727474696d6560681b60448201526064016107c4565b428111610f515760405162461bcd60e51b81526020600482015260196024820152780656e6474696d65203e20626c6f636b2074696d657374616d7603c1b60448201526064016107c4565b600e91909155600f55565b6003546001600160a01b03163314610f865760405162461bcd60e51b81526004016107c490612a0b565b60085460ff1615610fcc5760405162461bcd60e51b815260206004820152601060248201526f6c6f636b65642066756e6374696f6e7360801b60448201526064016107c4565b8051610ba4906005906020840190612263565b6003546001600160a01b031633146110095760405162461bcd60e51b81526004016107c490612a0b565b600c55565b6003546001600160a01b031633146110385760405162461bcd60e51b81526004016107c490612a0b565b604051632142170760e11b8152306004820152336024820152604481018290526001600160a01b038316906342842e0e90606401600060405180830381600087803b15801561108657600080fd5b505af115801561109a573d6000803e3d6000fd5b505050505050565b6003546001600160a01b031633146110cc5760405162461bcd60e51b81526004016107c490612a0b565b6110d66000611d00565b565b600580546110e590612aea565b80601f016020809104026020016040519081016040528092919081815260200182805461111190612aea565b801561115e5780601f106111335761010080835404028352916020019161115e565b820191906000526020600020905b81548152906001019060200180831161114157829003601f168201915b505050505081565b6003546001600160a01b031633146111905760405162461bcd60e51b81526004016107c490612a0b565b600455565b6003546001600160a01b031633146111bf5760405162461bcd60e51b81526004016107c490612a0b565b8181116112045760405162461bcd60e51b8152602060048201526013602482015272656e6474696d65203e20737461727474696d6560681b60448201526064016107c4565b42811161124f5760405162461bcd60e51b81526020600482015260196024820152780656e6474696d65203e20626c6f636b2074696d657374616d7603c1b60448201526064016107c4565b601091909155601155565b6003546001600160a01b031633146112845760405162461bcd60e51b81526004016107c490612a0b565b6040516370a0823160e01b81523060048201526001600160a01b0382169063a9059cbb90339083906370a0823190602401602060405180830381865afa1580156112d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112f69190612c2f565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611341573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba49190612c48565b6003546001600160a01b0316331461138f5760405162461bcd60e51b81526004016107c490612a0b565b60085460ff16156113d55760405162461bcd60e51b815260206004820152601060248201526f6c6f636b65642066756e6374696f6e7360801b60448201526064016107c4565b8051610ba4906006906020840190612263565b6003546001600160a01b031633146114125760405162461bcd60e51b81526004016107c490612a0b565b6008805460ff19166001179055565b610ba4338383611d52565b600680546110e590612aea565b6003546001600160a01b031633146114635760405162461bcd60e51b81526004016107c490612a0b565b600b91909155600755565b6040516bffffffffffffffffffffffff19606085901b1660208201526034810183905260009081906054016040516020818303038152906040528051906020012090506114c86004548285611e339092919063ffffffff16565b95945050505050565b6000851180156114e35750600c548511155b6114ff5760405162461bcd60e51b81526004016107c490612a40565b336000908152600d6020526040902054839061151c908690612a81565b11156115615760405162461bcd60e51b81526020600482015260146024820152731dd85b1b195d081b1a5b5a5d081c995858da195960621b60448201526064016107c4565b6000858152600960205260409020546104579061157f908690612a81565b111561159d5760405162461bcd60e51b81526004016107c490612a99565b600b5484600a546115ae9190612a81565b11156115cc5760405162461bcd60e51b81526004016107c490612ac4565b61160a338484848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061146e92505050565b6116465760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b210383937b7b360991b60448201526064016107c4565b426010541061168a5760405162461bcd60e51b815260206004820152601060248201526f1cd85b19481b9bdd081cdd185c9d195960821b60448201526064016107c4565b42601154116116c85760405162461bcd60e51b815260206004820152600a6024820152691cd85b1948195b99195960b21b60448201526064016107c4565b336000908152600d6020526040812080548692906116e7908490612a81565b9091555050600085815260096020526040902054611706908590612a81565b600086815260096020526040902055600a54611723908590612a81565b600a81905550610b44338686604051806020016040528060008152506118f8565b60606006805461175390612aea565b80601f016020809104026020016040519081016040528092919081815260200182805461177f90612aea565b80156117cc5780601f106117a1576101008083540402835291602001916117cc565b820191906000526020600020905b8154815290600101906020018083116117af57829003601f168201915b5050505050905090565b6001600160a01b0385163314806117f257506117f285336106ea565b6118505760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b60648201526084016107c4565b610b448585858585611e49565b6003546001600160a01b031633146118875760405162461bcd60e51b81526004016107c490612a0b565b6001600160a01b0381166118ec5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107c4565b6118f581611d00565b50565b6001600160a01b0384166119585760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016107c4565b336119728160008761196988611f5d565b610b4488611f5d565b6000848152602081815260408083206001600160a01b0389168452909152812080548592906119a2908490612a81565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610b4481600087878787611fa8565b606081611a265750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611a505780611a3a81612c14565b9150611a499050600a83612c65565b9150611a2a565b60008167ffffffffffffffff811115611a6b57611a6b612434565b6040519080825280601f01601f191660200182016040528015611a95576020820181803683370190505b509050815b8515611b2257611aab600182612c87565b90506000611aba600a88612c65565b611ac590600a612bdf565b611acf9088612c87565b611ada906030612c9e565b905060008160f81b905080848481518110611af757611af7612bfe565b60200101906001600160f81b031916908160001a905350611b19600a89612c65565b97505050611a9a565b50949350505050565b8151835114611b8d5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b60648201526084016107c4565b6001600160a01b038416611bb35760405162461bcd60e51b81526004016107c490612cc3565b3360005b8451811015611c9a576000858281518110611bd457611bd4612bfe565b602002602001015190506000858381518110611bf257611bf2612bfe565b602090810291909101810151600084815280835260408082206001600160a01b038e168352909352919091205490915081811015611c425760405162461bcd60e51b81526004016107c490612d08565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290611c7f908490612a81565b9250508190555050505080611c9390612c14565b9050611bb7565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611cea929190612d52565b60405180910390a461109a818787878787612104565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415611dc65760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b60648201526084016107c4565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b600082611e4085846121bf565b14949350505050565b6001600160a01b038416611e6f5760405162461bcd60e51b81526004016107c490612cc3565b33611e7f81878761196988611f5d565b6000848152602081815260408083206001600160a01b038a16845290915290205483811015611ec05760405162461bcd60e51b81526004016107c490612d08565b6000858152602081815260408083206001600160a01b038b8116855292528083208785039055908816825281208054869290611efd908490612a81565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610a7c828888888888611fa8565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110611f9757611f97612bfe565b602090810291909101015292915050565b6001600160a01b0384163b1561109a5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190611fec9089908990889088908890600401612d77565b6020604051808303816000875af1925050508015612027575060408051601f3d908101601f1916820190925261202491810190612dbc565b60015b6120d457612033612dd9565b806308c379a0141561206d5750612048612df5565b80612053575061206f565b8060405162461bcd60e51b81526004016107c49190612421565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b60648201526084016107c4565b6001600160e01b0319811663f23a6e6160e01b14610a7c5760405162461bcd60e51b81526004016107c490612e7f565b6001600160a01b0384163b1561109a5760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906121489089908990889088908890600401612ec7565b6020604051808303816000875af1925050508015612183575060408051601f3d908101601f1916820190925261218091810190612dbc565b60015b61218f57612033612dd9565b6001600160e01b0319811663bc197c8160e01b14610a7c5760405162461bcd60e51b81526004016107c490612e7f565b600081815b8451811015610e8f5760008582815181106121e1576121e1612bfe565b60200260200101519050808311612223576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250612250565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b508061225b81612c14565b9150506121c4565b82805461226f90612aea565b90600052602060002090601f01602090048101928261229157600085556122d7565b82601f106122aa57805160ff19168380011785556122d7565b828001600101855582156122d7579182015b828111156122d75782518255916020019190600101906122bc565b506122e39291506122e7565b5090565b5b808211156122e357600081556001016122e8565b6001600160a01b03811681146118f557600080fd5b60008060006060848603121561232657600080fd5b8335612331816122fc565b95602085013595506040909401359392505050565b6000806040838503121561235957600080fd5b8235612364816122fc565b946020939093013593505050565b6001600160e01b0319811681146118f557600080fd5b60006020828403121561239a57600080fd5b81356123a581612372565b9392505050565b6000602082840312156123be57600080fd5b5035919050565b60005b838110156123e05781810151838201526020016123c8565b838111156123ef576000848401525b50505050565b6000815180845261240d8160208601602086016123c5565b601f01601f19169290920160200192915050565b6020815260006123a560208301846123f5565b634e487b7160e01b600052604160045260246000fd5b601f8201601f1916810167ffffffffffffffff8111828210171561247057612470612434565b6040525050565b600067ffffffffffffffff82111561249157612491612434565b5060051b60200190565b600082601f8301126124ac57600080fd5b813560206124b982612477565b6040516124c6828261244a565b83815260059390931b85018201928281019150868411156124e657600080fd5b8286015b8481101561250157803583529183019183016124ea565b509695505050505050565b600067ffffffffffffffff83111561252657612526612434565b60405161253d601f8501601f19166020018261244a565b80915083815284848401111561255257600080fd5b83836020830137600060208583010152509392505050565b600082601f83011261257b57600080fd5b6123a58383356020850161250c565b600080600080600060a086880312156125a257600080fd5b85356125ad816122fc565b945060208601356125bd816122fc565b9350604086013567ffffffffffffffff808211156125da57600080fd5b6125e689838a0161249b565b945060608801359150808211156125fc57600080fd5b61260889838a0161249b565b9350608088013591508082111561261e57600080fd5b5061262b8882890161256a565b9150509295509295909350565b6000806040838503121561264b57600080fd5b50508035926020909101359150565b6000806040838503121561266d57600080fd5b823567ffffffffffffffff8082111561268557600080fd5b818501915085601f83011261269957600080fd5b813560206126a682612477565b6040516126b3828261244a565b83815260059390931b85018201928281019150898411156126d357600080fd5b948201945b838610156126fa5785356126eb816122fc565b825294820194908201906126d8565b9650508601359250508082111561271057600080fd5b5061271d8582860161249b565b9150509250929050565b600081518084526020808501945080840160005b838110156127575781518752958201959082019060010161273b565b509495945050505050565b6020815260006123a56020830184612727565b60006020828403121561278757600080fd5b813567ffffffffffffffff81111561279e57600080fd5b8201601f810184136127af57600080fd5b6127be8482356020840161250c565b949350505050565b6000602082840312156127d857600080fd5b81356123a5816122fc565b80151581146118f557600080fd5b6000806040838503121561280457600080fd5b823561280f816122fc565b9150602083013561281f816127e3565b809150509250929050565b60008060006060848603121561283f57600080fd5b833561284a816122fc565b92506020848101359250604085013567ffffffffffffffff81111561286e57600080fd5b8501601f8101871361287f57600080fd5b803561288a81612477565b604051612897828261244a565b82815260059290921b83018401918481019150898311156128b757600080fd5b928401925b828410156128d5578335825292840192908401906128bc565b80955050505050509250925092565b6000806000806000608086880312156128fc57600080fd5b853594506020860135935060408601359250606086013567ffffffffffffffff8082111561292957600080fd5b818801915088601f83011261293d57600080fd5b81358181111561294c57600080fd5b8960208260051b850101111561296157600080fd5b9699959850939650602001949392505050565b6000806040838503121561298757600080fd5b8235612992816122fc565b9150602083013561281f816122fc565b600080600080600060a086880312156129ba57600080fd5b85356129c5816122fc565b945060208601356129d5816122fc565b93506040860135925060608601359150608086013567ffffffffffffffff8111156129ff57600080fd5b61262b8882890161256a565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526011908201527074696572206e6f7420696e2072616e676560781b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008219821115612a9457612a94612a6b565b500190565b60208082526011908201527074696572206f7574206f662073746f636b60781b604082015260600190565b6020808252600c908201526b6f7574206f662073746f636b60a01b604082015260600190565b600181811c90821680612afe57607f821691505b60208210811415612b1f57634e487b7160e01b600052602260045260246000fd5b50919050565b60008151612b378185602086016123c5565b9290920192915050565b600080845481600182811c915080831680612b5d57607f831692505b6020808410821415612b7d57634e487b7160e01b86526022600452602486fd5b818015612b915760018114612ba257612bcf565b60ff19861689528489019650612bcf565b60008b81526020902060005b86811015612bc75781548b820152908501908301612bae565b505084890196505b5050505050506114c88185612b25565b6000816000190483118215151615612bf957612bf9612a6b565b500290565b634e487b7160e01b600052603260045260246000fd5b6000600019821415612c2857612c28612a6b565b5060010190565b600060208284031215612c4157600080fd5b5051919050565b600060208284031215612c5a57600080fd5b81516123a5816127e3565b600082612c8257634e487b7160e01b600052601260045260246000fd5b500490565b600082821015612c9957612c99612a6b565b500390565b600060ff821660ff84168060ff03821115612cbb57612cbb612a6b565b019392505050565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b604081526000612d656040830185612727565b82810360208401526114c88185612727565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090612db1908301846123f5565b979650505050505050565b600060208284031215612dce57600080fd5b81516123a581612372565b600060033d1115612df25760046000803e5060005160e01c5b90565b600060443d1015612e035790565b6040516003193d81016004833e81513d67ffffffffffffffff8160248401118184111715612e3357505050505090565b8285019150815181811115612e4b5750505050505090565b843d8701016020828501011115612e655750505050505090565b612e746020828601018761244a565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b0386811682528516602082015260a060408201819052600090612ef390830186612727565b8281036060840152612f058186612727565b90508281036080840152612f1981856123f5565b9897505050505050505056fea264697066735822122090fe6359a31c43cc6c074477bc992282cfd60b8b11271e876e3dc8f4099d764864736f6c634300080b0033697066733a2f2f516d64724e4170424833575975697438663744793465336952743645624261324c50377550746532695645376274697066733a2f2f516d50455a474851715551706f54556b6e5136697678435278517a7976337867524a6962484d6e6a4361626548432f

Deployed Bytecode

0x60806040526004361061025a5760003560e01c80637cb6475911610144578063d6957315116100b6578063e985e9c51161007a578063e985e9c5146106cf578063ebdfd72214610718578063ebf0c7171461072e578063f242432a14610744578063f2fde38b14610764578063fd3d27b81461078457600080fd5b8063d69573151461062d578063daf5dd0b1461064d578063df7253961461066d578063e60ad0411461068d578063e8a3d485146106ba57600080fd5b80639292caaf116101085780639292caaf14610593578063938e3d7b146105a9578063989bdbb6146105c9578063a22cb465146105de578063c0e72740146105fe578063cf3090121461061357600080fd5b80637cb64759146104f55780637d6bc26014610515578063801316dc1461052b5780638905fd4f1461054b5780638da5cb5b1461056b57600080fd5b8063432697c7116101dd5780636b7d2470116101a15780636b7d2470146104695780636bb7b1d9146104895780636de9f32b1461049f578063715018a6146104b5578063743976a0146104ca5780637b1b1de6146104df57600080fd5b8063432697c7146103c95780634e1273f4146103dc57806354645d6a1461040957806355f804b31461042957806365733d091461044957600080fd5b80631c8e7d2a116102245780631c8e7d2a1461033e5780631e4d185f1461035e5780632bf2762f146103745780632eb2c2d6146103945780633ccfd60b146103b457600080fd5b80624a84cb1461025f578062fdd58e1461028157806301ffc9a7146102b45780630e89341c146102e45780630f39dc9d14610311575b600080fd5b34801561026b57600080fd5b5061027f61027a366004612311565b61079a565b005b34801561028d57600080fd5b506102a161029c366004612346565b6108c3565b6040519081526020015b60405180910390f35b3480156102c057600080fd5b506102d46102cf366004612388565b610955565b60405190151581526020016102ab565b3480156102f057600080fd5b506103046102ff3660046123ac565b6109a7565b6040516102ab9190612421565b34801561031d57600080fd5b506102a161032c3660046123ac565b60096020526000908152604090205481565b34801561034a57600080fd5b5061027f610359366004612311565b6109db565b34801561036a57600080fd5b506102a1600f5481565b34801561038057600080fd5b5061027f61038f3660046123ac565b610a85565b3480156103a057600080fd5b5061027f6103af36600461258a565b610ab4565b3480156103c057600080fd5b5061027f610b4b565b61027f6103d7366004612638565b610ba8565b3480156103e857600080fd5b506103fc6103f736600461265a565b610d6d565b6040516102ab9190612762565b34801561041557600080fd5b5061027f610424366004612638565b610e97565b34801561043557600080fd5b5061027f610444366004612775565b610f5c565b34801561045557600080fd5b5061027f6104643660046123ac565b610fdf565b34801561047557600080fd5b5061027f610484366004612346565b61100e565b34801561049557600080fd5b506102a1600e5481565b3480156104ab57600080fd5b506102a1600a5481565b3480156104c157600080fd5b5061027f6110a2565b3480156104d657600080fd5b506103046110d8565b3480156104eb57600080fd5b506102a160075481565b34801561050157600080fd5b5061027f6105103660046123ac565b611166565b34801561052157600080fd5b506102a1600c5481565b34801561053757600080fd5b5061027f610546366004612638565b611195565b34801561055757600080fd5b5061027f6105663660046127c6565b61125a565b34801561057757600080fd5b506003546040516001600160a01b0390911681526020016102ab565b34801561059f57600080fd5b506102a160105481565b3480156105b557600080fd5b5061027f6105c4366004612775565b611365565b3480156105d557600080fd5b5061027f6113e8565b3480156105ea57600080fd5b5061027f6105f93660046127f1565b611421565b34801561060a57600080fd5b5061030461142c565b34801561061f57600080fd5b506008546102d49060ff1681565b34801561063957600080fd5b5061027f610648366004612638565b611439565b34801561065957600080fd5b506102d461066836600461282a565b61146e565b34801561067957600080fd5b5061027f6106883660046128e4565b6114d1565b34801561069957600080fd5b506102a16106a83660046127c6565b600d6020526000908152604090205481565b3480156106c657600080fd5b50610304611744565b3480156106db57600080fd5b506102d46106ea366004612974565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b34801561072457600080fd5b506102a160115481565b34801561073a57600080fd5b506102a160045481565b34801561075057600080fd5b5061027f61075f3660046129a2565b6117d6565b34801561077057600080fd5b5061027f61077f3660046127c6565b61185d565b34801561079057600080fd5b506102a1600b5481565b6003546001600160a01b031633146107cd5760405162461bcd60e51b81526004016107c490612a0b565b60405180910390fd5b6000821180156107df5750600c548211155b6107fb5760405162461bcd60e51b81526004016107c490612a40565b60008281526009602052604090205461045790610819908390612a81565b11156108375760405162461bcd60e51b81526004016107c490612a99565b600b5481600a546108489190612a81565b11156108665760405162461bcd60e51b81526004016107c490612ac4565b600082815260096020526040902054610880908290612a81565b600083815260096020526040902055600a5461089d908290612a81565b600a819055506108be838383604051806020016040528060008152506118f8565b505050565b60006001600160a01b03831661092f5760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084016107c4565b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b148061098657506001600160e01b031982166303a24d0760e21b145b806109a157506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060056109b483611a02565b6040516020016109c5929190612b41565b6040516020818303038152906040529050919050565b6003546001600160a01b03163314610a055760405162461bcd60e51b81526004016107c490612a0b565b604051637921219560e11b8152306004820152336024820152604481018390526064810182905260a06084820152600060a48201526001600160a01b0384169063f242432a9060c401600060405180830381600087803b158015610a6857600080fd5b505af1158015610a7c573d6000803e3d6000fd5b50505050505050565b6003546001600160a01b03163314610aaf5760405162461bcd60e51b81526004016107c490612a0b565b600755565b6001600160a01b038516331480610ad05750610ad085336106ea565b610b375760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b60648201526084016107c4565b610b448585858585611b2b565b5050505050565b6003546001600160a01b03163314610b755760405162461bcd60e51b81526004016107c490612a0b565b6040514790339082156108fc029083906000818181858888f19350505050158015610ba4573d6000803e3d6000fd5b5050565b600082118015610bba5750600c548211155b610bd65760405162461bcd60e51b81526004016107c490612a40565b60008281526009602052604090205461045790610bf4908390612a81565b1115610c125760405162461bcd60e51b81526004016107c490612a99565b600b5481600a54610c239190612a81565b1115610c415760405162461bcd60e51b81526004016107c490612ac4565b3481600754610c509190612bdf565b14610c935760405162461bcd60e51b8152602060048201526013602482015272195e1858dd08185b5bdd5b9d081b9959591959606a1b60448201526064016107c4565b42600e5410610cd75760405162461bcd60e51b815260206004820152601060248201526f1cd85b19481b9bdd081cdd185c9d195960821b60448201526064016107c4565b42600f5411610d155760405162461bcd60e51b815260206004820152600a6024820152691cd85b1948195b99195960b21b60448201526064016107c4565b600082815260096020526040902054610d2f908290612a81565b600083815260096020526040902055600a54610d4c908290612a81565b600a81905550610ba4338383604051806020016040528060008152506118f8565b60608151835114610dd25760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b60648201526084016107c4565b6000835167ffffffffffffffff811115610dee57610dee612434565b604051908082528060200260200182016040528015610e17578160200160208202803683370190505b50905060005b8451811015610e8f57610e62858281518110610e3b57610e3b612bfe565b6020026020010151858381518110610e5557610e55612bfe565b60200260200101516108c3565b828281518110610e7457610e74612bfe565b6020908102919091010152610e8881612c14565b9050610e1d565b509392505050565b6003546001600160a01b03163314610ec15760405162461bcd60e51b81526004016107c490612a0b565b818111610f065760405162461bcd60e51b8152602060048201526013602482015272656e6474696d65203e20737461727474696d6560681b60448201526064016107c4565b428111610f515760405162461bcd60e51b81526020600482015260196024820152780656e6474696d65203e20626c6f636b2074696d657374616d7603c1b60448201526064016107c4565b600e91909155600f55565b6003546001600160a01b03163314610f865760405162461bcd60e51b81526004016107c490612a0b565b60085460ff1615610fcc5760405162461bcd60e51b815260206004820152601060248201526f6c6f636b65642066756e6374696f6e7360801b60448201526064016107c4565b8051610ba4906005906020840190612263565b6003546001600160a01b031633146110095760405162461bcd60e51b81526004016107c490612a0b565b600c55565b6003546001600160a01b031633146110385760405162461bcd60e51b81526004016107c490612a0b565b604051632142170760e11b8152306004820152336024820152604481018290526001600160a01b038316906342842e0e90606401600060405180830381600087803b15801561108657600080fd5b505af115801561109a573d6000803e3d6000fd5b505050505050565b6003546001600160a01b031633146110cc5760405162461bcd60e51b81526004016107c490612a0b565b6110d66000611d00565b565b600580546110e590612aea565b80601f016020809104026020016040519081016040528092919081815260200182805461111190612aea565b801561115e5780601f106111335761010080835404028352916020019161115e565b820191906000526020600020905b81548152906001019060200180831161114157829003601f168201915b505050505081565b6003546001600160a01b031633146111905760405162461bcd60e51b81526004016107c490612a0b565b600455565b6003546001600160a01b031633146111bf5760405162461bcd60e51b81526004016107c490612a0b565b8181116112045760405162461bcd60e51b8152602060048201526013602482015272656e6474696d65203e20737461727474696d6560681b60448201526064016107c4565b42811161124f5760405162461bcd60e51b81526020600482015260196024820152780656e6474696d65203e20626c6f636b2074696d657374616d7603c1b60448201526064016107c4565b601091909155601155565b6003546001600160a01b031633146112845760405162461bcd60e51b81526004016107c490612a0b565b6040516370a0823160e01b81523060048201526001600160a01b0382169063a9059cbb90339083906370a0823190602401602060405180830381865afa1580156112d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112f69190612c2f565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611341573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba49190612c48565b6003546001600160a01b0316331461138f5760405162461bcd60e51b81526004016107c490612a0b565b60085460ff16156113d55760405162461bcd60e51b815260206004820152601060248201526f6c6f636b65642066756e6374696f6e7360801b60448201526064016107c4565b8051610ba4906006906020840190612263565b6003546001600160a01b031633146114125760405162461bcd60e51b81526004016107c490612a0b565b6008805460ff19166001179055565b610ba4338383611d52565b600680546110e590612aea565b6003546001600160a01b031633146114635760405162461bcd60e51b81526004016107c490612a0b565b600b91909155600755565b6040516bffffffffffffffffffffffff19606085901b1660208201526034810183905260009081906054016040516020818303038152906040528051906020012090506114c86004548285611e339092919063ffffffff16565b95945050505050565b6000851180156114e35750600c548511155b6114ff5760405162461bcd60e51b81526004016107c490612a40565b336000908152600d6020526040902054839061151c908690612a81565b11156115615760405162461bcd60e51b81526020600482015260146024820152731dd85b1b195d081b1a5b5a5d081c995858da195960621b60448201526064016107c4565b6000858152600960205260409020546104579061157f908690612a81565b111561159d5760405162461bcd60e51b81526004016107c490612a99565b600b5484600a546115ae9190612a81565b11156115cc5760405162461bcd60e51b81526004016107c490612ac4565b61160a338484848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061146e92505050565b6116465760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b210383937b7b360991b60448201526064016107c4565b426010541061168a5760405162461bcd60e51b815260206004820152601060248201526f1cd85b19481b9bdd081cdd185c9d195960821b60448201526064016107c4565b42601154116116c85760405162461bcd60e51b815260206004820152600a6024820152691cd85b1948195b99195960b21b60448201526064016107c4565b336000908152600d6020526040812080548692906116e7908490612a81565b9091555050600085815260096020526040902054611706908590612a81565b600086815260096020526040902055600a54611723908590612a81565b600a81905550610b44338686604051806020016040528060008152506118f8565b60606006805461175390612aea565b80601f016020809104026020016040519081016040528092919081815260200182805461177f90612aea565b80156117cc5780601f106117a1576101008083540402835291602001916117cc565b820191906000526020600020905b8154815290600101906020018083116117af57829003601f168201915b5050505050905090565b6001600160a01b0385163314806117f257506117f285336106ea565b6118505760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b60648201526084016107c4565b610b448585858585611e49565b6003546001600160a01b031633146118875760405162461bcd60e51b81526004016107c490612a0b565b6001600160a01b0381166118ec5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107c4565b6118f581611d00565b50565b6001600160a01b0384166119585760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016107c4565b336119728160008761196988611f5d565b610b4488611f5d565b6000848152602081815260408083206001600160a01b0389168452909152812080548592906119a2908490612a81565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610b4481600087878787611fa8565b606081611a265750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611a505780611a3a81612c14565b9150611a499050600a83612c65565b9150611a2a565b60008167ffffffffffffffff811115611a6b57611a6b612434565b6040519080825280601f01601f191660200182016040528015611a95576020820181803683370190505b509050815b8515611b2257611aab600182612c87565b90506000611aba600a88612c65565b611ac590600a612bdf565b611acf9088612c87565b611ada906030612c9e565b905060008160f81b905080848481518110611af757611af7612bfe565b60200101906001600160f81b031916908160001a905350611b19600a89612c65565b97505050611a9a565b50949350505050565b8151835114611b8d5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b60648201526084016107c4565b6001600160a01b038416611bb35760405162461bcd60e51b81526004016107c490612cc3565b3360005b8451811015611c9a576000858281518110611bd457611bd4612bfe565b602002602001015190506000858381518110611bf257611bf2612bfe565b602090810291909101810151600084815280835260408082206001600160a01b038e168352909352919091205490915081811015611c425760405162461bcd60e51b81526004016107c490612d08565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290611c7f908490612a81565b9250508190555050505080611c9390612c14565b9050611bb7565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611cea929190612d52565b60405180910390a461109a818787878787612104565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415611dc65760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b60648201526084016107c4565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b600082611e4085846121bf565b14949350505050565b6001600160a01b038416611e6f5760405162461bcd60e51b81526004016107c490612cc3565b33611e7f81878761196988611f5d565b6000848152602081815260408083206001600160a01b038a16845290915290205483811015611ec05760405162461bcd60e51b81526004016107c490612d08565b6000858152602081815260408083206001600160a01b038b8116855292528083208785039055908816825281208054869290611efd908490612a81565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610a7c828888888888611fa8565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110611f9757611f97612bfe565b602090810291909101015292915050565b6001600160a01b0384163b1561109a5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190611fec9089908990889088908890600401612d77565b6020604051808303816000875af1925050508015612027575060408051601f3d908101601f1916820190925261202491810190612dbc565b60015b6120d457612033612dd9565b806308c379a0141561206d5750612048612df5565b80612053575061206f565b8060405162461bcd60e51b81526004016107c49190612421565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b60648201526084016107c4565b6001600160e01b0319811663f23a6e6160e01b14610a7c5760405162461bcd60e51b81526004016107c490612e7f565b6001600160a01b0384163b1561109a5760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906121489089908990889088908890600401612ec7565b6020604051808303816000875af1925050508015612183575060408051601f3d908101601f1916820190925261218091810190612dbc565b60015b61218f57612033612dd9565b6001600160e01b0319811663bc197c8160e01b14610a7c5760405162461bcd60e51b81526004016107c490612e7f565b600081815b8451811015610e8f5760008582815181106121e1576121e1612bfe565b60200260200101519050808311612223576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250612250565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b508061225b81612c14565b9150506121c4565b82805461226f90612aea565b90600052602060002090601f01602090048101928261229157600085556122d7565b82601f106122aa57805160ff19168380011785556122d7565b828001600101855582156122d7579182015b828111156122d75782518255916020019190600101906122bc565b506122e39291506122e7565b5090565b5b808211156122e357600081556001016122e8565b6001600160a01b03811681146118f557600080fd5b60008060006060848603121561232657600080fd5b8335612331816122fc565b95602085013595506040909401359392505050565b6000806040838503121561235957600080fd5b8235612364816122fc565b946020939093013593505050565b6001600160e01b0319811681146118f557600080fd5b60006020828403121561239a57600080fd5b81356123a581612372565b9392505050565b6000602082840312156123be57600080fd5b5035919050565b60005b838110156123e05781810151838201526020016123c8565b838111156123ef576000848401525b50505050565b6000815180845261240d8160208601602086016123c5565b601f01601f19169290920160200192915050565b6020815260006123a560208301846123f5565b634e487b7160e01b600052604160045260246000fd5b601f8201601f1916810167ffffffffffffffff8111828210171561247057612470612434565b6040525050565b600067ffffffffffffffff82111561249157612491612434565b5060051b60200190565b600082601f8301126124ac57600080fd5b813560206124b982612477565b6040516124c6828261244a565b83815260059390931b85018201928281019150868411156124e657600080fd5b8286015b8481101561250157803583529183019183016124ea565b509695505050505050565b600067ffffffffffffffff83111561252657612526612434565b60405161253d601f8501601f19166020018261244a565b80915083815284848401111561255257600080fd5b83836020830137600060208583010152509392505050565b600082601f83011261257b57600080fd5b6123a58383356020850161250c565b600080600080600060a086880312156125a257600080fd5b85356125ad816122fc565b945060208601356125bd816122fc565b9350604086013567ffffffffffffffff808211156125da57600080fd5b6125e689838a0161249b565b945060608801359150808211156125fc57600080fd5b61260889838a0161249b565b9350608088013591508082111561261e57600080fd5b5061262b8882890161256a565b9150509295509295909350565b6000806040838503121561264b57600080fd5b50508035926020909101359150565b6000806040838503121561266d57600080fd5b823567ffffffffffffffff8082111561268557600080fd5b818501915085601f83011261269957600080fd5b813560206126a682612477565b6040516126b3828261244a565b83815260059390931b85018201928281019150898411156126d357600080fd5b948201945b838610156126fa5785356126eb816122fc565b825294820194908201906126d8565b9650508601359250508082111561271057600080fd5b5061271d8582860161249b565b9150509250929050565b600081518084526020808501945080840160005b838110156127575781518752958201959082019060010161273b565b509495945050505050565b6020815260006123a56020830184612727565b60006020828403121561278757600080fd5b813567ffffffffffffffff81111561279e57600080fd5b8201601f810184136127af57600080fd5b6127be8482356020840161250c565b949350505050565b6000602082840312156127d857600080fd5b81356123a5816122fc565b80151581146118f557600080fd5b6000806040838503121561280457600080fd5b823561280f816122fc565b9150602083013561281f816127e3565b809150509250929050565b60008060006060848603121561283f57600080fd5b833561284a816122fc565b92506020848101359250604085013567ffffffffffffffff81111561286e57600080fd5b8501601f8101871361287f57600080fd5b803561288a81612477565b604051612897828261244a565b82815260059290921b83018401918481019150898311156128b757600080fd5b928401925b828410156128d5578335825292840192908401906128bc565b80955050505050509250925092565b6000806000806000608086880312156128fc57600080fd5b853594506020860135935060408601359250606086013567ffffffffffffffff8082111561292957600080fd5b818801915088601f83011261293d57600080fd5b81358181111561294c57600080fd5b8960208260051b850101111561296157600080fd5b9699959850939650602001949392505050565b6000806040838503121561298757600080fd5b8235612992816122fc565b9150602083013561281f816122fc565b600080600080600060a086880312156129ba57600080fd5b85356129c5816122fc565b945060208601356129d5816122fc565b93506040860135925060608601359150608086013567ffffffffffffffff8111156129ff57600080fd5b61262b8882890161256a565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526011908201527074696572206e6f7420696e2072616e676560781b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008219821115612a9457612a94612a6b565b500190565b60208082526011908201527074696572206f7574206f662073746f636b60781b604082015260600190565b6020808252600c908201526b6f7574206f662073746f636b60a01b604082015260600190565b600181811c90821680612afe57607f821691505b60208210811415612b1f57634e487b7160e01b600052602260045260246000fd5b50919050565b60008151612b378185602086016123c5565b9290920192915050565b600080845481600182811c915080831680612b5d57607f831692505b6020808410821415612b7d57634e487b7160e01b86526022600452602486fd5b818015612b915760018114612ba257612bcf565b60ff19861689528489019650612bcf565b60008b81526020902060005b86811015612bc75781548b820152908501908301612bae565b505084890196505b5050505050506114c88185612b25565b6000816000190483118215151615612bf957612bf9612a6b565b500290565b634e487b7160e01b600052603260045260246000fd5b6000600019821415612c2857612c28612a6b565b5060010190565b600060208284031215612c4157600080fd5b5051919050565b600060208284031215612c5a57600080fd5b81516123a5816127e3565b600082612c8257634e487b7160e01b600052601260045260246000fd5b500490565b600082821015612c9957612c99612a6b565b500390565b600060ff821660ff84168060ff03821115612cbb57612cbb612a6b565b019392505050565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b604081526000612d656040830185612727565b82810360208401526114c88185612727565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090612db1908301846123f5565b979650505050505050565b600060208284031215612dce57600080fd5b81516123a581612372565b600060033d1115612df25760046000803e5060005160e01c5b90565b600060443d1015612e035790565b6040516003193d81016004833e81513d67ffffffffffffffff8160248401118184111715612e3357505050505090565b8285019150815181811115612e4b5750505050505090565b843d8701016020828501011115612e655750505050505090565b612e746020828601018761244a565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b0386811682528516602082015260a060408201819052600090612ef390830186612727565b8281036060840152612f058186612727565b90508281036080840152612f1981856123f5565b9897505050505050505056fea264697066735822122090fe6359a31c43cc6c074477bc992282cfd60b8b11271e876e3dc8f4099d764864736f6c634300080b0033

Deployed Bytecode Sourcemap

408:6974:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1438:482;;;;;;;;;;-1:-1:-1;1438:482:0;;;;;:::i;:::-;;:::i;:::-;;2170:228:2;;;;;;;;;;-1:-1:-1;2170:228:2;;;;;:::i;:::-;;:::i;:::-;;;1004:25:14;;;992:2;977:18;2170:228:2;;;;;;;;1221:305;;;;;;;;;;-1:-1:-1;1221:305:2;;;;;:::i;:::-;;:::i;:::-;;;1591:14:14;;1584:22;1566:41;;1554:2;1539:18;1221:305:2;1426:187:14;3990:152:0;;;;;;;;;;-1:-1:-1;3990:152:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;928:51::-;;;;;;;;;;-1:-1:-1;928:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;5753:281;;;;;;;;;;-1:-1:-1;5753:281:0;;;;;:::i;:::-;;:::i;1252:36::-;;;;;;;;;;;;;;;;6074:106;;;;;;;;;;-1:-1:-1;6074:106:0;;;;;:::i;:::-;;:::i;4045:430:2:-;;;;;;;;;;-1:-1:-1;4045:430:2;;;;;:::i;:::-;;:::i;5303:140:0:-;;;;;;;;;;;;;:::i;2941:653::-;;;;;;:::i;:::-;;:::i;2555:508:2:-;;;;;;;;;;-1:-1:-1;2555:508:2;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;6611:328:0:-;;;;;;;;;;-1:-1:-1;6611:328:0;;;;;:::i;:::-;;:::i;3692:139::-;;;;;;;;;;-1:-1:-1;3692:139:0;;;;;:::i;:::-;;:::i;6970:96::-;;;;;;;;;;-1:-1:-1;6970:96:0;;;;;:::i;:::-;;:::i;5598:149::-;;;;;;;;;;-1:-1:-1;5598:149:0;;;;;:::i;:::-;;:::i;1208:38::-;;;;;;;;;;;;;;;;1010:31;;;;;;;;;;;;;;;;1668:101:1;;;;;;;;;;;;;:::i;624:89:0:-;;;;;;;;;;;;;:::i;818:41::-;;;;;;;;;;;;;;;;3600:86;;;;;;;;;;-1:-1:-1;3600:86:0;;;;;:::i;:::-;;:::i;1088:27::-;;;;;;;;;;;;;;;;6231:329;;;;;;;;;;-1:-1:-1;6231:329:0;;;;;:::i;:::-;;:::i;5449:143::-;;;;;;;;;;-1:-1:-1;5449:143:0;;;;;:::i;:::-;;:::i;1036:85:1:-;;;;;;;;;;-1:-1:-1;1108:6:1;;1036:85;;-1:-1:-1;;;;;1108:6:1;;;9688:51:14;;9676:2;9661:18;1036:85:1;9542:203:14;1295:46:0;;;;;;;;;;;;;;;;3837:147;;;;;;;;;;-1:-1:-1;3837:147:0;;;;;:::i;:::-;;:::i;7307:73::-;;;;;;;;;;;;;:::i;3131:153:2:-;;;;;;;;;;-1:-1:-1;3131:153:2;;;;;:::i;:::-;;:::i;719:92:0:-;;;;;;;;;;;;;:::i;888:18::-;;;;;;;;;;-1:-1:-1;888:18:0;;;;;;;;7105:167;;;;;;;;;;-1:-1:-1;7105:167:0;;;;;:::i;:::-;;:::i;4249:383::-;;;;;;;;;;-1:-1:-1;4249:383:0;;;;;:::i;:::-;;:::i;1957:937::-;;;;;;;;;;-1:-1:-1;1957:937:0;;;;;:::i;:::-;;:::i;1121:48::-;;;;;;;;;;-1:-1:-1;1121:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;4148:95;;;;;;;;;;;;;:::i;3351:166:2:-;;;;;;;;;;-1:-1:-1;3351:166:2;;;;;:::i;:::-;-1:-1:-1;;;;;3473:27:2;;;3450:4;3473:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;3351:166;1347:44:0;;;;;;;;;;;;;;;;521:96;;;;;;;;;;;;;;;;3584:389:2;;;;;;;;;;-1:-1:-1;3584:389:2;;;;;:::i;:::-;;:::i;1918:198:1:-;;;;;;;;;;-1:-1:-1;1918:198:1;;;;;:::i;:::-;;:::i;1047:35:0:-;;;;;;;;;;;;;;;;1438:482;1108:6:1;;-1:-1:-1;;;;;1108:6:1;719:10:9;1248:23:1;1240:68;;;;-1:-1:-1;;;1240:68:1;;;;;;;:::i;:::-;;;;;;;;;1576:1:0::1;1569:4;:8;:28;;;;;1589:8;;1581:4;:16;;1569:28;1561:58;;;;-1:-1:-1::0;;;1561:58:0::1;;;;;;;:::i;:::-;1637:22;::::0;;;:16:::1;:22;::::0;;;;;1669:4:::1;::::0;1637:28:::1;::::0;1662:3;;1637:28:::1;:::i;:::-;:36;;1629:66;;;;-1:-1:-1::0;;;1629:66:0::1;;;;;;;:::i;:::-;1735:14;;1728:3;1713:12;;:18;;;;:::i;:::-;:36;;1705:61;;;;-1:-1:-1::0;;;1705:61:0::1;;;;;;;:::i;:::-;1802:22;::::0;;;:16:::1;:22;::::0;;;;;:28:::1;::::0;1827:3;;1802:28:::1;:::i;:::-;1777:22;::::0;;;:16:::1;:22;::::0;;;;:53;1855:12:::1;::::0;:18:::1;::::0;1870:3;;1855:18:::1;:::i;:::-;1840:12;:33;;;;1883:30;1889:8;1899:4;1905:3;1883:30;;;;;;;;;;;::::0;:5:::1;:30::i;:::-;1438:482:::0;;;:::o;2170:228:2:-;2256:7;-1:-1:-1;;;;;2283:21:2;;2275:77;;;;-1:-1:-1;;;2275:77:2;;15673:2:14;2275:77:2;;;15655:21:14;15712:2;15692:18;;;15685:30;15751:34;15731:18;;;15724:62;-1:-1:-1;;;15802:18:14;;;15795:41;15853:19;;2275:77:2;15471:407:14;2275:77:2;-1:-1:-1;2369:9:2;:13;;;;;;;;;;;-1:-1:-1;;;;;2369:22:2;;;;;;;;;;;;2170:228::o;1221:305::-;1323:4;-1:-1:-1;;;;;;1358:41:2;;-1:-1:-1;;;1358:41:2;;:109;;-1:-1:-1;;;;;;;1415:52:2;;-1:-1:-1;;;1415:52:2;1358:109;:161;;;-1:-1:-1;;;;;;;;;;937:40:12;;;1483:36:2;1339:180;1221:305;-1:-1:-1;;1221:305:2:o;3990:152:0:-;4050:13;4106:8;4116:17;4125:7;4116:8;:17::i;:::-;4089:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4075:60;;3990:152;;;:::o;5753:281::-;1108:6:1;;-1:-1:-1;;;;;1108:6:1;719:10:9;1248:23:1;1240:68;;;;-1:-1:-1;;;1240:68:1;;;;;;;:::i;:::-;5885:142:0::1;::::0;-1:-1:-1;;;5885:142:0;;5936:4:::1;5885:142;::::0;::::1;18096:34:14::0;5955:10:0::1;18146:18:14::0;;;18139:43;18198:18;;;18191:34;;;18241:18;;;18234:34;;;18076:3;18284:19;;;18277:32;-1:-1:-1;18325:19:14;;;18318:30;-1:-1:-1;;;;;5885:29:0;::::1;::::0;::::1;::::0;18365:19:14;;5885:142:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;5753:281:::0;;;:::o;6074:106::-;1108:6:1;;-1:-1:-1;;;;;1108:6:1;719:10:9;1248:23:1;1240:68;;;;-1:-1:-1;;;1240:68:1;;;;;;;:::i;:::-;6148:13:0::1;:25:::0;6074:106::o;4045:430:2:-;-1:-1:-1;;;;;4270:20:2;;719:10:9;4270:20:2;;:60;;-1:-1:-1;4294:36:2;4311:4;719:10:9;3351:166:2;:::i;4294:36::-;4249:157;;;;-1:-1:-1;;;4249:157:2;;18597:2:14;4249:157:2;;;18579:21:14;18636:2;18616:18;;;18609:30;18675:34;18655:18;;;18648:62;-1:-1:-1;;;18726:18:14;;;18719:48;18784:19;;4249:157:2;18395:414:14;4249:157:2;4416:52;4439:4;4445:2;4449:3;4454:7;4463:4;4416:22;:52::i;:::-;4045:430;;;;;:::o;5303:140:0:-;1108:6:1;;-1:-1:-1;;;;;1108:6:1;719:10:9;1248:23:1;1240:68;;;;-1:-1:-1;;;1240:68:1;;;;;;;:::i;:::-;5399:37:0::1;::::0;5368:21:::1;::::0;5407:10:::1;::::0;5399:37;::::1;;;::::0;5368:21;;5350:15:::1;5399:37:::0;5350:15;5399:37;5368:21;5407:10;5399:37;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;5340:103;5303:140::o:0;2941:653::-;3029:1;3022:4;:8;:28;;;;;3042:8;;3034:4;:16;;3022:28;3014:58;;;;-1:-1:-1;;;3014:58:0;;;;;;;:::i;:::-;3090:22;;;;:16;:22;;;;;;3122:4;;3090:28;;3115:3;;3090:28;:::i;:::-;:36;;3082:66;;;;-1:-1:-1;;;3082:66:0;;;;;;;:::i;:::-;3188:14;;3181:3;3166:12;;:18;;;;:::i;:::-;:36;;3158:61;;;;-1:-1:-1;;;3158:61:0;;;;;;;:::i;:::-;3260:9;3253:3;3237:13;;:19;;;;:::i;:::-;:32;3229:64;;;;-1:-1:-1;;;3229:64:0;;19189:2:14;3229:64:0;;;19171:21:14;19228:2;19208:18;;;19201:30;-1:-1:-1;;;19247:18:14;;;19240:49;19306:18;;3229:64:0;18987:343:14;3229:64:0;3333:15;3311:19;;:37;3303:66;;;;-1:-1:-1;;;3303:66:0;;19537:2:14;3303:66:0;;;19519:21:14;19576:2;19556:18;;;19549:30;-1:-1:-1;;;19595:18:14;;;19588:46;19651:18;;3303:66:0;19335:340:14;3303:66:0;3407:15;3387:17;;:35;3379:58;;;;-1:-1:-1;;;3379:58:0;;19882:2:14;3379:58:0;;;19864:21:14;19921:2;19901:18;;;19894:30;-1:-1:-1;;;19940:18:14;;;19933:40;19990:18;;3379:58:0;19680:334:14;3379:58:0;3473:22;;;;:16;:22;;;;;;:28;;3498:3;;3473:28;:::i;:::-;3448:22;;;;:16;:22;;;;;:53;3526:12;;:18;;3541:3;;3526:18;:::i;:::-;3511:12;:33;;;;3555:32;3561:10;3573:4;3579:3;3555:32;;;;;;;;;;;;:5;:32::i;2555:508:2:-;2706:16;2765:3;:10;2746:8;:15;:29;2738:83;;;;-1:-1:-1;;;2738:83:2;;20221:2:14;2738:83:2;;;20203:21:14;20260:2;20240:18;;;20233:30;20299:34;20279:18;;;20272:62;-1:-1:-1;;;20350:18:14;;;20343:39;20399:19;;2738:83:2;20019:405:14;2738:83:2;2832:30;2879:8;:15;2865:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2865:30:2;;2832:63;;2911:9;2906:120;2930:8;:15;2926:1;:19;2906:120;;;2985:30;2995:8;3004:1;2995:11;;;;;;;;:::i;:::-;;;;;;;3008:3;3012:1;3008:6;;;;;;;;:::i;:::-;;;;;;;2985:9;:30::i;:::-;2966:13;2980:1;2966:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;2947:3;;;:::i;:::-;;;2906:120;;;-1:-1:-1;3043:13:2;2555:508;-1:-1:-1;;;2555:508:2:o;6611:328:0:-;1108:6:1;;-1:-1:-1;;;;;1108:6:1;719:10:9;1248:23:1;1240:68;;;;-1:-1:-1;;;1240:68:1;;;;;;;:::i;:::-;6744:10:0::1;6733:8;:21;6725:53;;;::::0;-1:-1:-1;;;6725:53:0;;20903:2:14;6725:53:0::1;::::0;::::1;20885:21:14::0;20942:2;20922:18;;;20915:30;-1:-1:-1;;;20961:18:14;;;20954:49;21020:18;;6725:53:0::1;20701:343:14::0;6725:53:0::1;6807:15;6796:8;:26;6788:64;;;::::0;-1:-1:-1;;;6788:64:0;;21251:2:14;6788:64:0::1;::::0;::::1;21233:21:14::0;21290:2;21270:18;;;21263:30;-1:-1:-1;;;21309:18:14;;;21302:55;21374:18;;6788:64:0::1;21049:349:14::0;6788:64:0::1;6862:19;:32:::0;;;;6904:17:::1;:28:::0;6611:328::o;3692:139::-;1108:6:1;;-1:-1:-1;;;;;1108:6:1;719:10:9;1248:23:1;1240:68;;;;-1:-1:-1;;;1240:68:1;;;;;;;:::i;:::-;3770:6:0::1;::::0;::::1;;3769:7;3761:36;;;::::0;-1:-1:-1;;;3761:36:0;;21605:2:14;3761:36:0::1;::::0;::::1;21587:21:14::0;21644:2;21624:18;;;21617:30;-1:-1:-1;;;21663:18:14;;;21656:46;21719:18;;3761:36:0::1;21403:340:14::0;3761:36:0::1;3807:17:::0;;::::1;::::0;:8:::1;::::0;:17:::1;::::0;::::1;::::0;::::1;:::i;6970:96::-:0;1108:6:1;;-1:-1:-1;;;;;1108:6:1;719:10:9;1248:23:1;1240:68;;;;-1:-1:-1;;;1240:68:1;;;;;;;:::i;:::-;7039:8:0::1;:20:::0;6970:96::o;5598:149::-;1108:6:1;;-1:-1:-1;;;;;1108:6:1;719:10:9;1248:23:1;1240:68;;;;-1:-1:-1;;;1240:68:1;;;;;;;:::i;:::-;5681:59:0::1;::::0;-1:-1:-1;;;5681:59:0;;5718:4:::1;5681:59;::::0;::::1;21988:34:14::0;5725:10:0::1;22038:18:14::0;;;22031:43;22090:18;;;22083:34;;;-1:-1:-1;;;;;5681:28:0;::::1;::::0;::::1;::::0;21923:18:14;;5681:59:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;5598:149:::0;;:::o;1668:101:1:-;1108:6;;-1:-1:-1;;;;;1108:6:1;719:10:9;1248:23:1;1240:68;;;;-1:-1:-1;;;1240:68:1;;;;;;;:::i;:::-;1732:30:::1;1759:1;1732:18;:30::i;:::-;1668:101::o:0;624:89:0:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3600:86::-;1108:6:1;;-1:-1:-1;;;;;1108:6:1;719:10:9;1248:23:1;1240:68;;;;-1:-1:-1;;;1240:68:1;;;;;;;:::i;:::-;3667:4:0::1;:12:::0;3600:86::o;6231:329::-;1108:6:1;;-1:-1:-1;;;;;1108:6:1;719:10:9;1248:23:1;1240:68;;;;-1:-1:-1;;;1240:68:1;;;;;;;:::i;:::-;6367:10:0::1;6356:8;:21;6348:53;;;::::0;-1:-1:-1;;;6348:53:0;;20903:2:14;6348:53:0::1;::::0;::::1;20885:21:14::0;20942:2;20922:18;;;20915:30;-1:-1:-1;;;20961:18:14;;;20954:49;21020:18;;6348:53:0::1;20701:343:14::0;6348:53:0::1;6430:15;6419:8;:26;6411:64;;;::::0;-1:-1:-1;;;6411:64:0;;21251:2:14;6411:64:0::1;::::0;::::1;21233:21:14::0;21290:2;21270:18;;;21263:30;-1:-1:-1;;;21309:18:14;;;21302:55;21374:18;;6411:64:0::1;21049:349:14::0;6411:64:0::1;6485:18;:31:::0;;;;6526:16:::1;:27:::0;6231:329::o;5449:143::-;1108:6:1;;-1:-1:-1;;;;;1108:6:1;719:10:9;1248:23:1;1240:68;;;;-1:-1:-1;;;1240:68:1;;;;;;;:::i;:::-;5549:35:0::1;::::0;-1:-1:-1;;;5549:35:0;;5578:4:::1;5549:35;::::0;::::1;9688:51:14::0;-1:-1:-1;;;;;5517:19:0;::::1;::::0;::::1;::::0;5537:10:::1;::::0;5517:19;;5549:20:::1;::::0;9661:18:14;;5549:35:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5517:68;::::0;-1:-1:-1;;;;;;5517:68:0::1;::::0;;;;;;-1:-1:-1;;;;;22509:32:14;;;5517:68:0::1;::::0;::::1;22491:51:14::0;22558:18;;;22551:34;22464:18;;5517:68:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;3837:147::-:0;1108:6:1;;-1:-1:-1;;;;;1108:6:1;719:10:9;1248:23:1;1240:68;;;;-1:-1:-1;;;1240:68:1;;;;;;;:::i;:::-;3919:6:0::1;::::0;::::1;;3918:7;3910:36;;;::::0;-1:-1:-1;;;3910:36:0;;21605:2:14;3910:36:0::1;::::0;::::1;21587:21:14::0;21644:2;21624:18;;;21617:30;-1:-1:-1;;;21663:18:14;;;21656:46;21719:18;;3910:36:0::1;21403:340:14::0;3910:36:0::1;3956:21:::0;;::::1;::::0;:12:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;7307:73::-:0;1108:6:1;;-1:-1:-1;;;;;1108:6:1;719:10:9;1248:23:1;1240:68;;;;-1:-1:-1;;;1240:68:1;;;;;;;:::i;:::-;7360:6:0::1;:13:::0;;-1:-1:-1;;7360:13:0::1;7369:4;7360:13;::::0;;7307:73::o;3131:153:2:-;3225:52;719:10:9;3258:8:2;3268;3225:18;:52::i;719:92:0:-;;;;;;;:::i;7105:167::-;1108:6:1;;-1:-1:-1;;;;;1108:6:1;719:10:9;1248:23:1;1240:68;;;;-1:-1:-1;;;1240:68:1;;;;;;;:::i;:::-;7212:14:0::1;:21:::0;;;;7243:13:::1;:22:::0;7105:167::o;4249:383::-;4481:27;;-1:-1:-1;;23023:2:14;23019:15;;;23015:53;4481:27:0;;;23003:66:14;23085:12;;;23078:28;;;4377:4:0;;;;23122:12:14;;4481:27:0;;;;;;;;;;;;4471:38;;;;;;4456:53;;4600:25;4614:4;;4620;4600:6;:13;;:25;;;;;:::i;:::-;4593:32;4249:383;-1:-1:-1;;;;;4249:383:0:o;1957:937::-;2166:1;2159:4;:8;:28;;;;;2179:8;;2171:4;:16;;2159:28;2151:58;;;;-1:-1:-1;;;2151:58:0;;;;;;;:::i;:::-;2254:10;2240:25;;;;:13;:25;;;;;;2275:7;;2240:31;;2268:3;;2240:31;:::i;:::-;:42;;2219:109;;;;-1:-1:-1;;;2219:109:0;;23347:2:14;2219:109:0;;;23329:21:14;23386:2;23366:18;;;23359:30;-1:-1:-1;;;23405:18:14;;;23398:50;23465:18;;2219:109:0;23145:344:14;2219:109:0;2346:22;;;;:16;:22;;;;;;2378:4;;2346:28;;2371:3;;2346:28;:::i;:::-;:36;;2338:66;;;;-1:-1:-1;;;2338:66:0;;;;;;;:::i;:::-;2444:14;;2437:3;2422:12;;:18;;;;:::i;:::-;:36;;2414:61;;;;-1:-1:-1;;;2414:61:0;;;;;;;:::i;:::-;2493:43;2509:10;2521:7;2530:5;;2493:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2493:15:0;;-1:-1:-1;;;2493:43:0:i;:::-;2485:69;;;;-1:-1:-1;;;2485:69:0;;23696:2:14;2485:69:0;;;23678:21:14;23735:2;23715:18;;;23708:30;-1:-1:-1;;;23754:18:14;;;23747:43;23807:18;;2485:69:0;23494:337:14;2485:69:0;2593:15;2572:18;;:36;2564:65;;;;-1:-1:-1;;;2564:65:0;;19537:2:14;2564:65:0;;;19519:21:14;19576:2;19556:18;;;19549:30;-1:-1:-1;;;19595:18:14;;;19588:46;19651:18;;2564:65:0;19335:340:14;2564:65:0;2666:15;2647:16;;:34;2639:57;;;;-1:-1:-1;;;2639:57:0;;19882:2:14;2639:57:0;;;19864:21:14;19921:2;19901:18;;;19894:30;-1:-1:-1;;;19940:18:14;;;19933:40;19990:18;;2639:57:0;19680:334:14;2639:57:0;2720:10;2706:25;;;;:13;:25;;;;;:32;;2735:3;;2706:25;:32;;2735:3;;2706:32;:::i;:::-;;;;-1:-1:-1;;2774:22:0;;;;:16;:22;;;;;;:28;;2799:3;;2774:28;:::i;:::-;2749:22;;;;:16;:22;;;;;:53;2827:12;;:18;;2842:3;;2827:18;:::i;:::-;2812:12;:33;;;;2855:32;2861:10;2873:4;2879:3;2855:32;;;;;;;;;;;;:5;:32::i;4148:95::-;4192:13;4224:12;4217:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4148:95;:::o;3584:389:2:-;-1:-1:-1;;;;;3784:20:2;;719:10:9;3784:20:2;;:60;;-1:-1:-1;3808:36:2;3825:4;719:10:9;3351:166:2;:::i;3808:36::-;3763:148;;;;-1:-1:-1;;;3763:148:2;;24038:2:14;3763:148:2;;;24020:21:14;24077:2;24057:18;;;24050:30;24116:34;24096:18;;;24089:62;-1:-1:-1;;;24167:18:14;;;24160:39;24216:19;;3763:148:2;23836:405:14;3763:148:2;3921:45;3939:4;3945:2;3949;3953:6;3961:4;3921:17;:45::i;1918:198:1:-;1108:6;;-1:-1:-1;;;;;1108:6:1;719:10:9;1248:23:1;1240:68;;;;-1:-1:-1;;;1240:68:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;2006:22:1;::::1;1998:73;;;::::0;-1:-1:-1;;;1998:73:1;;24448:2:14;1998:73:1::1;::::0;::::1;24430:21:14::0;24487:2;24467:18;;;24460:30;24526:34;24506:18;;;24499:62;-1:-1:-1;;;24577:18:14;;;24570:36;24623:19;;1998:73:1::1;24246:402:14::0;1998:73:1::1;2081:28;2100:8;2081:18;:28::i;:::-;1918:198:::0;:::o;8395:553:2:-;-1:-1:-1;;;;;8542:16:2;;8534:62;;;;-1:-1:-1;;;8534:62:2;;24855:2:14;8534:62:2;;;24837:21:14;24894:2;24874:18;;;24867:30;24933:34;24913:18;;;24906:62;-1:-1:-1;;;24984:18:14;;;24977:31;25025:19;;8534:62:2;24653:397:14;8534:62:2;719:10:9;8649:102:2;719:10:9;8607:16:2;8692:2;8696:21;8714:2;8696:17;:21::i;:::-;8719:25;8737:6;8719:17;:25::i;8649:102::-;8762:9;:13;;;;;;;;;;;-1:-1:-1;;;;;8762:17:2;;;;;;;;;:27;;8783:6;;8762:9;:27;;8783:6;;8762:27;:::i;:::-;;;;-1:-1:-1;;8804:52:2;;;25229:25:14;;;25285:2;25270:18;;25263:34;;;-1:-1:-1;;;;;8804:52:2;;;;8837:1;;8804:52;;;;;;25202:18:14;8804:52:2;;;;;;;8867:74;8898:8;8916:1;8920:2;8924;8928:6;8936:4;8867:30;:74::i;4638:597:0:-;4715:27;4762:7;4758:48;;-1:-1:-1;;4785:10:0;;;;;;;;;;;;-1:-1:-1;;;4785:10:0;;;;;4638:597::o;4758:48::-;4827:2;4815:9;4860:66;4867:6;;4860:66;;4889:5;;;;:::i;:::-;;-1:-1:-1;4908:7:0;;-1:-1:-1;4913:2:0;4908:7;;:::i;:::-;;;4860:66;;;4935:17;4965:3;4955:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4955:14:0;-1:-1:-1;4935:34:0;-1:-1:-1;4991:3:0;5004:196;5011:7;;5004:196;;5038:5;5042:1;5038;:5;:::i;:::-;5034:9;-1:-1:-1;5057:10:0;5088:7;5093:2;5088;:7;:::i;:::-;5087:14;;5099:2;5087:14;:::i;:::-;5082:19;;:2;:19;:::i;:::-;5071:31;;:2;:31;:::i;:::-;5057:46;;5117:9;5136:4;5129:12;;5117:24;;5165:2;5155:4;5160:1;5155:7;;;;;;;;:::i;:::-;;;;:12;-1:-1:-1;;;;;5155:12:0;;;;;;;;-1:-1:-1;5181:8:0;5187:2;5181:8;;:::i;:::-;;;5020:180;;5004:196;;;-1:-1:-1;5223:4:0;4638:597;-1:-1:-1;;;;4638:597:0:o;6068:1045:2:-;6288:7;:14;6274:3;:10;:28;6266:81;;;;-1:-1:-1;;;6266:81:2;;26071:2:14;6266:81:2;;;26053:21:14;26110:2;26090:18;;;26083:30;26149:34;26129:18;;;26122:62;-1:-1:-1;;;26200:18:14;;;26193:38;26248:19;;6266:81:2;25869:404:14;6266:81:2;-1:-1:-1;;;;;6365:16:2;;6357:66;;;;-1:-1:-1;;;6357:66:2;;;;;;;:::i;:::-;719:10:9;6434:16:2;6547:411;6571:3;:10;6567:1;:14;6547:411;;;6602:10;6615:3;6619:1;6615:6;;;;;;;;:::i;:::-;;;;;;;6602:19;;6635:14;6652:7;6660:1;6652:10;;;;;;;;:::i;:::-;;;;;;;;;;;;6677:19;6699:13;;;;;;;;;;-1:-1:-1;;;;;6699:19:2;;;;;;;;;;;;6652:10;;-1:-1:-1;6740:21:2;;;;6732:76;;;;-1:-1:-1;;;6732:76:2;;;;;;;:::i;:::-;6850:9;:13;;;;;;;;;;;-1:-1:-1;;;;;6850:19:2;;;;;;;;;;6872:20;;;6850:42;;6920:17;;;;;;;:27;;6872:20;;6850:9;6920:27;;6872:20;;6920:27;:::i;:::-;;;;;;;;6588:370;;;6583:3;;;;:::i;:::-;;;6547:411;;;;7003:2;-1:-1:-1;;;;;6973:47:2;6997:4;-1:-1:-1;;;;;6973:47:2;6987:8;-1:-1:-1;;;;;6973:47:2;;7007:3;7012:7;6973:47;;;;;;;:::i;:::-;;;;;;;;7031:75;7067:8;7077:4;7083:2;7087:3;7092:7;7101:4;7031:35;:75::i;2270:187:1:-;2362:6;;;-1:-1:-1;;;;;2378:17:1;;;-1:-1:-1;;;;;;2378:17:1;;;;;;;2410:40;;2362:6;;;2378:17;2362:6;;2410:40;;2343:16;;2410:40;2333:124;2270:187;:::o;12074:323:2:-;12224:8;-1:-1:-1;;;;;12215:17:2;:5;-1:-1:-1;;;;;12215:17:2;;;12207:71;;;;-1:-1:-1;;;12207:71:2;;27767:2:14;12207:71:2;;;27749:21:14;27806:2;27786:18;;;27779:30;27845:34;27825:18;;;27818:62;-1:-1:-1;;;27896:18:14;;;27889:39;27945:19;;12207:71:2;27565:405:14;12207:71:2;-1:-1:-1;;;;;12288:25:2;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;12288:46:2;;;;;;;;;;12349:41;;1566::14;;;12349::2;;1539:18:14;12349:41:2;;;;;;;12074:323;;;:::o;847:184:11:-;968:4;1020;991:25;1004:5;1011:4;991:12;:25::i;:::-;:33;;847:184;-1:-1:-1;;;;847:184:11:o;4925:797:2:-;-1:-1:-1;;;;;5106:16:2;;5098:66;;;;-1:-1:-1;;;5098:66:2;;;;;;;:::i;:::-;719:10:9;5217:96:2;719:10:9;5248:4:2;5254:2;5258:21;5276:2;5258:17;:21::i;5217:96::-;5324:19;5346:13;;;;;;;;;;;-1:-1:-1;;;;;5346:19:2;;;;;;;;;;5383:21;;;;5375:76;;;;-1:-1:-1;;;5375:76:2;;;;;;;:::i;:::-;5485:9;:13;;;;;;;;;;;-1:-1:-1;;;;;5485:19:2;;;;;;;;;;5507:20;;;5485:42;;5547:17;;;;;;;:27;;5507:20;;5485:9;5547:27;;5507:20;;5547:27;:::i;:::-;;;;-1:-1:-1;;5590:46:2;;;25229:25:14;;;25285:2;25270:18;;25263:34;;;-1:-1:-1;;;;;5590:46:2;;;;;;;;;;;;;;25202:18:14;5590:46:2;;;;;;;5647:68;5678:8;5688:4;5694:2;5698;5702:6;5710:4;5647:30;:68::i;15080:193::-;15199:16;;;15213:1;15199:16;;;;;;;;;15146;;15174:22;;15199:16;;;;;;;;;;;;-1:-1:-1;15199:16:2;15174:41;;15236:7;15225:5;15231:1;15225:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;15261:5;15080:193;-1:-1:-1;;15080:193:2:o;13551:725::-;-1:-1:-1;;;;;13758:13:2;;1087:20:8;1133:8;13754:516:2;;13793:72;;-1:-1:-1;;;13793:72:2;;-1:-1:-1;;;;;13793:38:2;;;;;:72;;13832:8;;13842:4;;13848:2;;13852:6;;13860:4;;13793:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13793:72:2;;;;;;;;-1:-1:-1;;13793:72:2;;;;;;;;;;;;:::i;:::-;;;13789:471;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;14136:6;14129:14;;-1:-1:-1;;;14129:14:2;;;;;;;;:::i;13789:471::-;;;14183:62;;-1:-1:-1;;;14183:62:2;;29868:2:14;14183:62:2;;;29850:21:14;29907:2;29887:18;;;29880:30;29946:34;29926:18;;;29919:62;-1:-1:-1;;;29997:18:14;;;29990:50;30057:19;;14183:62:2;29666:416:14;13789:471:2;-1:-1:-1;;;;;;13914:55:2;;-1:-1:-1;;;13914:55:2;13910:152;;13993:50;;-1:-1:-1;;;13993:50:2;;;;;;;:::i;14282:792::-;-1:-1:-1;;;;;14514:13:2;;1087:20:8;1133:8;14510:558:2;;14549:79;;-1:-1:-1;;;14549:79:2;;-1:-1:-1;;;;;14549:43:2;;;;;:79;;14593:8;;14603:4;;14609:3;;14614:7;;14623:4;;14549:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14549:79:2;;;;;;;;-1:-1:-1;;14549:79:2;;;;;;;;;;;;:::i;:::-;;;14545:513;;;;:::i;:::-;-1:-1:-1;;;;;;14707:60:2;;-1:-1:-1;;;14707:60:2;14703:157;;14791:50;;-1:-1:-1;;;14791:50:2;;;;;;;:::i;1383:688:11:-;1466:7;1508:4;1466:7;1522:514;1546:5;:12;1542:1;:16;1522:514;;;1579:20;1602:5;1608:1;1602:8;;;;;;;;:::i;:::-;;;;;;;1579:31;;1644:12;1628;:28;1624:402;;1779:44;;;;;;31496:19:14;;;31531:12;;;31524:28;;;31568:12;;1779:44:11;;;;;;;;;;;;1769:55;;;;;;1754:70;;1624:402;;;1966:44;;;;;;31496:19:14;;;31531:12;;;31524:28;;;31568:12;;1966:44:11;;;;;;;;;;;;1956:55;;;;;;1941:70;;1624:402;-1:-1:-1;1560:3:11;;;;:::i;:::-;;;;1522:514;;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:14;-1:-1:-1;;;;;89:31:14;;79:42;;69:70;;135:1;132;125:12;150:383;227:6;235;243;296:2;284:9;275:7;271:23;267:32;264:52;;;312:1;309;302:12;264:52;351:9;338:23;370:31;395:5;370:31;:::i;:::-;420:5;472:2;457:18;;444:32;;-1:-1:-1;523:2:14;508:18;;;495:32;;150:383;-1:-1:-1;;;150:383:14:o;538:315::-;606:6;614;667:2;655:9;646:7;642:23;638:32;635:52;;;683:1;680;673:12;635:52;722:9;709:23;741:31;766:5;741:31;:::i;:::-;791:5;843:2;828:18;;;;815:32;;-1:-1:-1;;;538:315:14:o;1040:131::-;-1:-1:-1;;;;;;1114:32:14;;1104:43;;1094:71;;1161:1;1158;1151:12;1176:245;1234:6;1287:2;1275:9;1266:7;1262:23;1258:32;1255:52;;;1303:1;1300;1293:12;1255:52;1342:9;1329:23;1361:30;1385:5;1361:30;:::i;:::-;1410:5;1176:245;-1:-1:-1;;;1176:245:14:o;1618:180::-;1677:6;1730:2;1718:9;1709:7;1705:23;1701:32;1698:52;;;1746:1;1743;1736:12;1698:52;-1:-1:-1;1769:23:14;;1618:180;-1:-1:-1;1618:180:14:o;1803:258::-;1875:1;1885:113;1899:6;1896:1;1893:13;1885:113;;;1975:11;;;1969:18;1956:11;;;1949:39;1921:2;1914:10;1885:113;;;2016:6;2013:1;2010:13;2007:48;;;2051:1;2042:6;2037:3;2033:16;2026:27;2007:48;;1803:258;;;:::o;2066:269::-;2119:3;2157:5;2151:12;2184:6;2179:3;2172:19;2200:63;2256:6;2249:4;2244:3;2240:14;2233:4;2226:5;2222:16;2200:63;:::i;:::-;2317:2;2296:15;-1:-1:-1;;2292:29:14;2283:39;;;;2324:4;2279:50;;2066:269;-1:-1:-1;;2066:269:14:o;2340:231::-;2489:2;2478:9;2471:21;2452:4;2509:56;2561:2;2550:9;2546:18;2538:6;2509:56;:::i;2981:127::-;3042:10;3037:3;3033:20;3030:1;3023:31;3073:4;3070:1;3063:15;3097:4;3094:1;3087:15;3113:249;3223:2;3204:13;;-1:-1:-1;;3200:27:14;3188:40;;3258:18;3243:34;;3279:22;;;3240:62;3237:88;;;3305:18;;:::i;:::-;3341:2;3334:22;-1:-1:-1;;3113:249:14:o;3367:183::-;3427:4;3460:18;3452:6;3449:30;3446:56;;;3482:18;;:::i;:::-;-1:-1:-1;3527:1:14;3523:14;3539:4;3519:25;;3367:183::o;3555:724::-;3609:5;3662:3;3655:4;3647:6;3643:17;3639:27;3629:55;;3680:1;3677;3670:12;3629:55;3716:6;3703:20;3742:4;3765:43;3805:2;3765:43;:::i;:::-;3837:2;3831:9;3849:31;3877:2;3869:6;3849:31;:::i;:::-;3915:18;;;4007:1;4003:10;;;;3991:23;;3987:32;;;3949:15;;;;-1:-1:-1;4031:15:14;;;4028:35;;;4059:1;4056;4049:12;4028:35;4095:2;4087:6;4083:15;4107:142;4123:6;4118:3;4115:15;4107:142;;;4189:17;;4177:30;;4227:12;;;;4140;;4107:142;;;-1:-1:-1;4267:6:14;3555:724;-1:-1:-1;;;;;;3555:724:14:o;4284:468::-;4348:5;4382:18;4374:6;4371:30;4368:56;;;4404:18;;:::i;:::-;4453:2;4447:9;4465:69;4522:2;4501:15;;-1:-1:-1;;4497:29:14;4528:4;4493:40;4447:9;4465:69;:::i;:::-;4552:6;4543:15;;4582:6;4574;4567:22;4622:3;4613:6;4608:3;4604:16;4601:25;4598:45;;;4639:1;4636;4629:12;4598:45;4689:6;4684:3;4677:4;4669:6;4665:17;4652:44;4744:1;4737:4;4728:6;4720;4716:19;4712:30;4705:41;;4284:468;;;;;:::o;4757:220::-;4799:5;4852:3;4845:4;4837:6;4833:17;4829:27;4819:55;;4870:1;4867;4860:12;4819:55;4892:79;4967:3;4958:6;4945:20;4938:4;4930:6;4926:17;4892:79;:::i;4982:1071::-;5136:6;5144;5152;5160;5168;5221:3;5209:9;5200:7;5196:23;5192:33;5189:53;;;5238:1;5235;5228:12;5189:53;5277:9;5264:23;5296:31;5321:5;5296:31;:::i;:::-;5346:5;-1:-1:-1;5403:2:14;5388:18;;5375:32;5416:33;5375:32;5416:33;:::i;:::-;5468:7;-1:-1:-1;5526:2:14;5511:18;;5498:32;5549:18;5579:14;;;5576:34;;;5606:1;5603;5596:12;5576:34;5629:61;5682:7;5673:6;5662:9;5658:22;5629:61;:::i;:::-;5619:71;;5743:2;5732:9;5728:18;5715:32;5699:48;;5772:2;5762:8;5759:16;5756:36;;;5788:1;5785;5778:12;5756:36;5811:63;5866:7;5855:8;5844:9;5840:24;5811:63;:::i;:::-;5801:73;;5927:3;5916:9;5912:19;5899:33;5883:49;;5957:2;5947:8;5944:16;5941:36;;;5973:1;5970;5963:12;5941:36;;5996:51;6039:7;6028:8;6017:9;6013:24;5996:51;:::i;:::-;5986:61;;;4982:1071;;;;;;;;:::o;6058:248::-;6126:6;6134;6187:2;6175:9;6166:7;6162:23;6158:32;6155:52;;;6203:1;6200;6193:12;6155:52;-1:-1:-1;;6226:23:14;;;6296:2;6281:18;;;6268:32;;-1:-1:-1;6058:248:14:o;6311:1277::-;6429:6;6437;6490:2;6478:9;6469:7;6465:23;6461:32;6458:52;;;6506:1;6503;6496:12;6458:52;6546:9;6533:23;6575:18;6616:2;6608:6;6605:14;6602:34;;;6632:1;6629;6622:12;6602:34;6670:6;6659:9;6655:22;6645:32;;6715:7;6708:4;6704:2;6700:13;6696:27;6686:55;;6737:1;6734;6727:12;6686:55;6773:2;6760:16;6795:4;6818:43;6858:2;6818:43;:::i;:::-;6890:2;6884:9;6902:31;6930:2;6922:6;6902:31;:::i;:::-;6968:18;;;7056:1;7052:10;;;;7044:19;;7040:28;;;7002:15;;;;-1:-1:-1;7080:19:14;;;7077:39;;;7112:1;7109;7102:12;7077:39;7136:11;;;;7156:217;7172:6;7167:3;7164:15;7156:217;;;7252:3;7239:17;7269:31;7294:5;7269:31;:::i;:::-;7313:18;;7189:12;;;;7351;;;;7156:217;;;7392:6;-1:-1:-1;;7436:18:14;;7423:32;;-1:-1:-1;;7467:16:14;;;7464:36;;;7496:1;7493;7486:12;7464:36;;7519:63;7574:7;7563:8;7552:9;7548:24;7519:63;:::i;:::-;7509:73;;;6311:1277;;;;;:::o;7593:435::-;7646:3;7684:5;7678:12;7711:6;7706:3;7699:19;7737:4;7766:2;7761:3;7757:12;7750:19;;7803:2;7796:5;7792:14;7824:1;7834:169;7848:6;7845:1;7842:13;7834:169;;;7909:13;;7897:26;;7943:12;;;;7978:15;;;;7870:1;7863:9;7834:169;;;-1:-1:-1;8019:3:14;;7593:435;-1:-1:-1;;;;;7593:435:14:o;8033:261::-;8212:2;8201:9;8194:21;8175:4;8232:56;8284:2;8273:9;8269:18;8261:6;8232:56;:::i;8299:450::-;8368:6;8421:2;8409:9;8400:7;8396:23;8392:32;8389:52;;;8437:1;8434;8427:12;8389:52;8477:9;8464:23;8510:18;8502:6;8499:30;8496:50;;;8542:1;8539;8532:12;8496:50;8565:22;;8618:4;8610:13;;8606:27;-1:-1:-1;8596:55:14;;8647:1;8644;8637:12;8596:55;8670:73;8735:7;8730:2;8717:16;8712:2;8708;8704:11;8670:73;:::i;:::-;8660:83;8299:450;-1:-1:-1;;;;8299:450:14:o;9275:262::-;9349:6;9402:2;9390:9;9381:7;9377:23;9373:32;9370:52;;;9418:1;9415;9408:12;9370:52;9457:9;9444:23;9476:31;9501:5;9476:31;:::i;9750:118::-;9836:5;9829:13;9822:21;9815:5;9812:32;9802:60;;9858:1;9855;9848:12;9873:382;9938:6;9946;9999:2;9987:9;9978:7;9974:23;9970:32;9967:52;;;10015:1;10012;10005:12;9967:52;10054:9;10041:23;10073:31;10098:5;10073:31;:::i;:::-;10123:5;-1:-1:-1;10180:2:14;10165:18;;10152:32;10193:30;10152:32;10193:30;:::i;:::-;10242:7;10232:17;;;9873:382;;;;;:::o;10260:1156::-;10362:6;10370;10378;10431:2;10419:9;10410:7;10406:23;10402:32;10399:52;;;10447:1;10444;10437:12;10399:52;10486:9;10473:23;10505:31;10530:5;10505:31;:::i;:::-;10555:5;-1:-1:-1;10579:2:14;10613:18;;;10600:32;;-1:-1:-1;10683:2:14;10668:18;;10655:32;10710:18;10699:30;;10696:50;;;10742:1;10739;10732:12;10696:50;10765:22;;10818:4;10810:13;;10806:27;-1:-1:-1;10796:55:14;;10847:1;10844;10837:12;10796:55;10883:2;10870:16;10905:43;10945:2;10905:43;:::i;:::-;10977:2;10971:9;10989:31;11017:2;11009:6;10989:31;:::i;:::-;11055:18;;;11143:1;11139:10;;;;11131:19;;11127:28;;;11089:15;;;;-1:-1:-1;11167:19:14;;;11164:39;;;11199:1;11196;11189:12;11164:39;11223:11;;;;11243:142;11259:6;11254:3;11251:15;11243:142;;;11325:17;;11313:30;;11276:12;;;;11363;;;;11243:142;;;11404:6;11394:16;;;;;;;10260:1156;;;;;:::o;11421:820::-;11534:6;11542;11550;11558;11566;11619:3;11607:9;11598:7;11594:23;11590:33;11587:53;;;11636:1;11633;11626:12;11587:53;11672:9;11659:23;11649:33;;11729:2;11718:9;11714:18;11701:32;11691:42;;11780:2;11769:9;11765:18;11752:32;11742:42;;11835:2;11824:9;11820:18;11807:32;11858:18;11899:2;11891:6;11888:14;11885:34;;;11915:1;11912;11905:12;11885:34;11953:6;11942:9;11938:22;11928:32;;11998:7;11991:4;11987:2;11983:13;11979:27;11969:55;;12020:1;12017;12010:12;11969:55;12060:2;12047:16;12086:2;12078:6;12075:14;12072:34;;;12102:1;12099;12092:12;12072:34;12155:7;12150:2;12140:6;12137:1;12133:14;12129:2;12125:23;12121:32;12118:45;12115:65;;;12176:1;12173;12166:12;12115:65;11421:820;;;;-1:-1:-1;11421:820:14;;-1:-1:-1;12207:2:14;12199:11;;12229:6;11421:820;-1:-1:-1;;;11421:820:14:o;12498:388::-;12566:6;12574;12627:2;12615:9;12606:7;12602:23;12598:32;12595:52;;;12643:1;12640;12633:12;12595:52;12682:9;12669:23;12701:31;12726:5;12701:31;:::i;:::-;12751:5;-1:-1:-1;12808:2:14;12793:18;;12780:32;12821:33;12780:32;12821:33;:::i;13073:734::-;13177:6;13185;13193;13201;13209;13262:3;13250:9;13241:7;13237:23;13233:33;13230:53;;;13279:1;13276;13269:12;13230:53;13318:9;13305:23;13337:31;13362:5;13337:31;:::i;:::-;13387:5;-1:-1:-1;13444:2:14;13429:18;;13416:32;13457:33;13416:32;13457:33;:::i;:::-;13509:7;-1:-1:-1;13563:2:14;13548:18;;13535:32;;-1:-1:-1;13614:2:14;13599:18;;13586:32;;-1:-1:-1;13669:3:14;13654:19;;13641:33;13697:18;13686:30;;13683:50;;;13729:1;13726;13719:12;13683:50;13752:49;13793:7;13784:6;13773:9;13769:22;13752:49;:::i;13812:356::-;14014:2;13996:21;;;14033:18;;;14026:30;14092:34;14087:2;14072:18;;14065:62;14159:2;14144:18;;13812:356::o;14173:341::-;14375:2;14357:21;;;14414:2;14394:18;;;14387:30;-1:-1:-1;;;14448:2:14;14433:18;;14426:47;14505:2;14490:18;;14173:341::o;14519:127::-;14580:10;14575:3;14571:20;14568:1;14561:31;14611:4;14608:1;14601:15;14635:4;14632:1;14625:15;14651:128;14691:3;14722:1;14718:6;14715:1;14712:13;14709:39;;;14728:18;;:::i;:::-;-1:-1:-1;14764:9:14;;14651:128::o;14784:341::-;14986:2;14968:21;;;15025:2;15005:18;;;14998:30;-1:-1:-1;;;15059:2:14;15044:18;;15037:47;15116:2;15101:18;;14784:341::o;15130:336::-;15332:2;15314:21;;;15371:2;15351:18;;;15344:30;-1:-1:-1;;;15405:2:14;15390:18;;15383:42;15457:2;15442:18;;15130:336::o;15883:380::-;15962:1;15958:12;;;;16005;;;16026:61;;16080:4;16072:6;16068:17;16058:27;;16026:61;16133:2;16125:6;16122:14;16102:18;16099:38;16096:161;;;16179:10;16174:3;16170:20;16167:1;16160:31;16214:4;16211:1;16204:15;16242:4;16239:1;16232:15;16096:161;;15883:380;;;:::o;16394:185::-;16436:3;16474:5;16468:12;16489:52;16534:6;16529:3;16522:4;16515:5;16511:16;16489:52;:::i;:::-;16557:16;;;;;16394:185;-1:-1:-1;;16394:185:14:o;16584:1174::-;16760:3;16789:1;16822:6;16816:13;16852:3;16874:1;16902:9;16898:2;16894:18;16884:28;;16962:2;16951:9;16947:18;16984;16974:61;;17028:4;17020:6;17016:17;17006:27;;16974:61;17054:2;17102;17094:6;17091:14;17071:18;17068:38;17065:165;;;-1:-1:-1;;;17129:33:14;;17185:4;17182:1;17175:15;17215:4;17136:3;17203:17;17065:165;17246:18;17273:104;;;;17391:1;17386:320;;;;17239:467;;17273:104;-1:-1:-1;;17306:24:14;;17294:37;;17351:16;;;;-1:-1:-1;17273:104:14;;17386:320;16341:1;16334:14;;;16378:4;16365:18;;17481:1;17495:165;17509:6;17506:1;17503:13;17495:165;;;17587:14;;17574:11;;;17567:35;17630:16;;;;17524:10;;17495:165;;;17499:3;;17689:6;17684:3;17680:16;17673:23;;17239:467;;;;;;;17722:30;17748:3;17740:6;17722:30;:::i;18814:168::-;18854:7;18920:1;18916;18912:6;18908:14;18905:1;18902:21;18897:1;18890:9;18883:17;18879:45;18876:71;;;18927:18;;:::i;:::-;-1:-1:-1;18967:9:14;;18814:168::o;20429:127::-;20490:10;20485:3;20481:20;20478:1;20471:31;20521:4;20518:1;20511:15;20545:4;20542:1;20535:15;20561:135;20600:3;-1:-1:-1;;20621:17:14;;20618:43;;;20641:18;;:::i;:::-;-1:-1:-1;20688:1:14;20677:13;;20561:135::o;22128:184::-;22198:6;22251:2;22239:9;22230:7;22226:23;22222:32;22219:52;;;22267:1;22264;22257:12;22219:52;-1:-1:-1;22290:16:14;;22128:184;-1:-1:-1;22128:184:14:o;22596:245::-;22663:6;22716:2;22704:9;22695:7;22691:23;22687:32;22684:52;;;22732:1;22729;22722:12;22684:52;22764:9;22758:16;22783:28;22805:5;22783:28;:::i;25308:217::-;25348:1;25374;25364:132;;25418:10;25413:3;25409:20;25406:1;25399:31;25453:4;25450:1;25443:15;25481:4;25478:1;25471:15;25364:132;-1:-1:-1;25510:9:14;;25308:217::o;25530:125::-;25570:4;25598:1;25595;25592:8;25589:34;;;25603:18;;:::i;:::-;-1:-1:-1;25640:9:14;;25530:125::o;25660:204::-;25698:3;25734:4;25731:1;25727:12;25766:4;25763:1;25759:12;25801:3;25795:4;25791:14;25786:3;25783:23;25780:49;;;25809:18;;:::i;:::-;25845:13;;25660:204;-1:-1:-1;;;25660:204:14:o;26278:401::-;26480:2;26462:21;;;26519:2;26499:18;;;26492:30;26558:34;26553:2;26538:18;;26531:62;-1:-1:-1;;;26624:2:14;26609:18;;26602:35;26669:3;26654:19;;26278:401::o;26684:406::-;26886:2;26868:21;;;26925:2;26905:18;;;26898:30;26964:34;26959:2;26944:18;;26937:62;-1:-1:-1;;;27030:2:14;27015:18;;27008:40;27080:3;27065:19;;26684:406::o;27095:465::-;27352:2;27341:9;27334:21;27315:4;27378:56;27430:2;27419:9;27415:18;27407:6;27378:56;:::i;:::-;27482:9;27474:6;27470:22;27465:2;27454:9;27450:18;27443:50;27510:44;27547:6;27539;27510:44;:::i;27975:572::-;-1:-1:-1;;;;;28272:15:14;;;28254:34;;28324:15;;28319:2;28304:18;;28297:43;28371:2;28356:18;;28349:34;;;28414:2;28399:18;;28392:34;;;28234:3;28457;28442:19;;28435:32;;;28197:4;;28484:57;;28521:19;;28513:6;28484:57;:::i;:::-;28476:65;27975:572;-1:-1:-1;;;;;;;27975:572:14:o;28552:249::-;28621:6;28674:2;28662:9;28653:7;28649:23;28645:32;28642:52;;;28690:1;28687;28680:12;28642:52;28722:9;28716:16;28741:30;28765:5;28741:30;:::i;28806:179::-;28841:3;28883:1;28865:16;28862:23;28859:120;;;28929:1;28926;28923;28908:23;-1:-1:-1;28966:1:14;28960:8;28955:3;28951:18;28859:120;28806:179;:::o;28990:671::-;29029:3;29071:4;29053:16;29050:26;29047:39;;;28990:671;:::o;29047:39::-;29113:2;29107:9;-1:-1:-1;;29178:16:14;29174:25;;29171:1;29107:9;29150:50;29229:4;29223:11;29253:16;29288:18;29359:2;29352:4;29344:6;29340:17;29337:25;29332:2;29324:6;29321:14;29318:45;29315:58;;;29366:5;;;;;28990:671;:::o;29315:58::-;29403:6;29397:4;29393:17;29382:28;;29439:3;29433:10;29466:2;29458:6;29455:14;29452:27;;;29472:5;;;;;;28990:671;:::o;29452:27::-;29556:2;29537:16;29531:4;29527:27;29523:36;29516:4;29507:6;29502:3;29498:16;29494:27;29491:69;29488:82;;;29563:5;;;;;;28990:671;:::o;29488:82::-;29579:57;29630:4;29621:6;29613;29609:19;29605:30;29599:4;29579:57;:::i;:::-;-1:-1:-1;29652:3:14;;28990:671;-1:-1:-1;;;;;28990:671:14:o;30087:404::-;30289:2;30271:21;;;30328:2;30308:18;;;30301:30;30367:34;30362:2;30347:18;;30340:62;-1:-1:-1;;;30433:2:14;30418:18;;30411:38;30481:3;30466:19;;30087:404::o;30496:838::-;-1:-1:-1;;;;;30893:15:14;;;30875:34;;30945:15;;30940:2;30925:18;;30918:43;30855:3;30992:2;30977:18;;30970:31;;;30818:4;;31024:57;;31061:19;;31053:6;31024:57;:::i;:::-;31129:9;31121:6;31117:22;31112:2;31101:9;31097:18;31090:50;31163:44;31200:6;31192;31163:44;:::i;:::-;31149:58;;31256:9;31248:6;31244:22;31238:3;31227:9;31223:19;31216:51;31284:44;31321:6;31313;31284:44;:::i;:::-;31276:52;30496:838;-1:-1:-1;;;;;;;;30496:838:14:o

Swarm Source

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