ETH Price: $3,334.00 (-1.29%)

Token

996fubao (FUBAO)
 

Overview

Max Total Supply

1,713 FUBAO

Holders

633

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
kimi-dao.eth
Balance
1 FUBAO
0xb6ef43000a55747c7ca01d41a7a15fef56b66128
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Fubao

Compiler Version
v0.8.8+commit.dddeac2f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
File 1 of 14 : Fubao.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.8;

import "erc721a/contracts/ERC721A.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/Pausable.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol";

contract Fubao is ERC721A, Ownable, Pausable, ReentrancyGuard {
    // metadata
    string public baseURI;

    // collection info
    uint256 public constant collectionSize = 9960;
    uint256 public perAddressMaxMintAmount = 10;

    // for marketing etc.
    uint256 public reservedAmount;
    uint256 public reservedMintedAmount;
    mapping(uint256 => string) public mintChannelMap;

    // public mint config
    uint256 public publicAvailableAmount;
    uint256 public publicMintedAmount;
    uint256 public publicStartTime;
    uint256 public publicPrice;

    // white list mint config
    bytes32 public whiteListMerkleRoot;
    uint256 public whiteListMintedAmount;
    uint256 public whiteListStartTime;
    uint256 public whiteListEndTime;
    uint256 public whiteListPrice;

    // refund config
    mapping(uint256 => uint256) public refundPriceMap;
    mapping(uint256 => uint256) public refundEndTimeMap;
    uint256 public refundPeriod = 7 days;
    uint256 public refundLastEndTime;
    uint256 public refundedAmount;
    address public refundAddress;

    constructor(
        string memory baseURI_,
        uint256 reservedAmount_,
        uint256 publicAvailableAmount_,
        uint256 publicStartTime_,
        uint256 publicPrice_,
        bytes32 whiteListMerkleRoot_,
        uint256 whiteListStartTime_,
        uint256 whiteListEndTime_,
        uint256 whiteListPrice_
    ) ERC721A("996fubao", "FUBAO") {
        require(
            reservedAmount_ <= collectionSize &&
                publicAvailableAmount_ <= collectionSize - reservedAmount_ &&
                whiteListStartTime_ <= whiteListEndTime_,
            "invalid"
        );
        baseURI = baseURI_;
        reservedAmount = reservedAmount_;
        publicAvailableAmount = publicAvailableAmount_;
        publicStartTime = publicStartTime_;
        publicPrice = publicPrice_;
        whiteListMerkleRoot = whiteListMerkleRoot_;
        whiteListStartTime = whiteListStartTime_;
        whiteListEndTime = whiteListEndTime_;
        whiteListPrice = whiteListPrice_;
        refundAddress = msg.sender;
    }

    function setBaseURI(string calldata baseURI_) public onlyOwner {
        baseURI = baseURI_;
    }

    function setMintConfig(
        uint256 perAddressMaxMintAmount_,
        uint256 reservedAmount_,
        uint256 publicAvailableAmount_,
        uint256 publicStartTime_,
        uint256 publicPrice_,
        bytes32 whiteListMerkleRoot_,
        uint256 whiteListStartTime_,
        uint256 whiteListEndTime_,
        uint256 whiteListPrice_
    ) public onlyOwner {
        require(
            reservedAmount_ <= reservedAmount &&
                reservedAmount_ >= reservedMintedAmount &&
                publicAvailableAmount_ >= publicAvailableAmount &&
                publicAvailableAmount_ <= collectionSize - reservedAmount_ &&
                whiteListStartTime_ <= whiteListEndTime_,
            "invalid"
        );
        perAddressMaxMintAmount = perAddressMaxMintAmount_;
        reservedAmount = reservedAmount_;
        publicAvailableAmount = publicAvailableAmount_;
        publicStartTime = publicStartTime_;
        publicPrice = publicPrice_;
        whiteListMerkleRoot = whiteListMerkleRoot_;
        whiteListStartTime = whiteListStartTime_;
        whiteListEndTime = whiteListEndTime_;
        whiteListPrice = whiteListPrice_;
    }

    function setRefundConfig(uint256 refundPeriod_, address refundAddress_)
        public
        onlyOwner
    {
        refundPeriod = refundPeriod_;
        refundAddress = refundAddress_;
    }

    function mint(
        uint256 amount,
        uint256 whiteListTotalAmount,
        bytes32[] calldata whiteListMerkleProof,
        string calldata channel
    ) public payable callerIsUser nonReentrant {
        require(
            publicMintedAmount + amount <= publicAvailableAmount &&
                _numberMinted(msg.sender) + amount <= perAddressMaxMintAmount,
            "not enough amount"
        );
        require(bytes(channel).length <= 20, "channel too long");
        uint256 whiteListRemainAmount = 0;
        if (
            block.timestamp >= whiteListStartTime &&
            block.timestamp <= whiteListEndTime
        ) {
            whiteListRemainAmount = getWhiteListRemainAmount(
                msg.sender,
                whiteListTotalAmount,
                whiteListMerkleProof
            );
        }
        if (whiteListRemainAmount == 0) {
            require(
                block.timestamp >= publicStartTime,
                "public mint not started"
            );
            _publicMint(amount, channel);
            _refundIfOver(amount * publicPrice);
        } else {
            if (amount <= whiteListRemainAmount) {
                _whiteListMint(amount, channel);
                _refundIfOver(amount * whiteListPrice);
            } else {
                uint256 publicAmount = amount - whiteListRemainAmount;
                uint256 publicTotalPrice = publicAmount * publicPrice;
                uint256 whiteListTotalPrice = whiteListRemainAmount *
                    whiteListPrice;
                _publicMint(publicAmount, channel);
                _whiteListMint(whiteListRemainAmount, channel);
                _refundIfOver(publicTotalPrice + whiteListTotalPrice);
            }
        }
        emit Mint(msg.sender, amount, channel);
    }

    function getWhiteListRemainAmount(
        address user,
        uint256 totalAmount,
        bytes32[] calldata merkleProof
    ) public view returns (uint256) {
        if (totalAmount == 0) return 0;
        uint256 mintedAmount = _getAux(user);
        require(
            totalAmount >= mintedAmount &&
                MerkleProof.verify(
                    merkleProof,
                    whiteListMerkleRoot,
                    keccak256(abi.encodePacked(user, ":", totalAmount))
                ),
            "verify fail"
        );
        return totalAmount - mintedAmount;
    }

    function _publicMint(uint256 amount, string calldata channel) private {
        publicMintedAmount += amount;
        _setMintData(amount, publicPrice, channel);
        _safeMint(msg.sender, amount);
        emit PublicMint(msg.sender, amount, publicPrice, channel);
    }

    function _whiteListMint(uint256 amount, string calldata channel) private {
        publicMintedAmount += amount;
        whiteListMintedAmount += amount;
        _setAux(msg.sender, _getAux(msg.sender) + uint64(amount));
        _setMintData(amount, whiteListPrice, channel);
        _safeMint(msg.sender, amount);
        emit WhiteListMint(msg.sender, amount, whiteListPrice, channel);
    }

    function _setMintData(
        uint256 amount,
        uint256 price,
        string calldata channel
    ) private {
        uint256 index = _currentIndex;
        uint256 endIndex = index + amount;
        uint256 endTime = block.timestamp + refundPeriod;
        do {
            refundPriceMap[index] = price;
            refundEndTimeMap[index] = endTime;
            mintChannelMap[index] = channel;
            index++;
        } while (index != endIndex);
        if (endTime > refundLastEndTime) {
            refundLastEndTime = endTime;
        }
    }

    function refund(uint256[] calldata tokenIds)
        public
        callerIsUser
        nonReentrant
    {
        uint256 refundValue;
        for (uint256 i = 0; i < tokenIds.length; i++) {
            uint256 tokenId = tokenIds[i];
            require(msg.sender == ownerOf(tokenId), "not owner");
            require(
                block.timestamp <= refundEndTimeMap[tokenId],
                "refund expired"
            );
            transferFrom(msg.sender, refundAddress, tokenId);
            refundValue += refundPriceMap[tokenId];
        }
        refundedAmount += tokenIds.length;
        payable(msg.sender).transfer(refundValue);
        emit Refund(msg.sender, refundValue, tokenIds);
    }

    function airdrop(address user, uint256 amount) public onlyOwner {
        require(
            reservedMintedAmount + amount <= reservedAmount,
            "not enough amount"
        );
        reservedMintedAmount += amount;
        _safeMint(user, amount);
    }

    function airdropList(
        address[] calldata userList,
        uint256[] calldata amountList
    ) public onlyOwner {
        require(userList.length == amountList.length, "invalid");
        for (uint256 i = 0; i < userList.length; i++) {
            airdrop(userList[i], amountList[i]);
        }
    }

    // probably nothing

    bool public burnable = false;

    function setBurnable(bool burnable_) public onlyOwner {
        burnable = burnable_;
    }

    function burn(uint256[] calldata tokenIds) public callerIsUser {
        require(burnable, "not burnable");
        for (uint256 i = 0; i < tokenIds.length; i++) {
            uint256 tokenId = tokenIds[i];
            require(msg.sender == ownerOf(tokenId), "not owner");
            _burn(tokenId);
        }
        emit Burn(msg.sender, tokenIds);
    }

    // pausable

    function pause() public onlyOwner {
        _pause();
    }

    function unpause() public onlyOwner {
        _unpause();
    }

    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 amount
    ) internal override {
        super._beforeTokenTransfers(from, to, startTokenId, amount);
        require(!paused(), "paused");
    }

    // other

    modifier callerIsUser() {
        require(tx.origin == msg.sender, "not user");
        _;
    }

    function totalMinted() public view returns (uint256) {
        return _totalMinted();
    }

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

    function numberBurned(address user) public view returns (uint256) {
        return _numberBurned(user);
    }

    function withdraw() public onlyOwner nonReentrant {
        require(block.timestamp >= refundLastEndTime, "refund not end");
        (bool success, ) = msg.sender.call{value: address(this).balance}("");
        require(success, "fail");
    }

    function _refundIfOver(uint256 price) private {
        require(msg.value >= price, "not enough ETH");
        if (msg.value > price) {
            payable(msg.sender).transfer(msg.value - price);
        }
    }

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

    function _startTokenId() internal pure override returns (uint256) {
        return 1;
    }

    event PublicMint(
        address user,
        uint256 amount,
        uint256 price,
        string channel
    );
    event WhiteListMint(
        address user,
        uint256 amount,
        uint256 price,
        string channel
    );
    event Mint(address user, uint256 amount, string channel);
    event Refund(address user, uint256 value, uint256[] tokenIds);
    event Burn(address user, uint256[] tokenIds);
}

File 2 of 14 : ERC721A.sol
// SPDX-License-Identifier: MIT
// Creator: Chiru Labs

pragma solidity ^0.8.4;

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

error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        _addressData[owner].aux = aux;
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr && curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        string memory baseURI = _baseURI();
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : '';
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        if (operator == _msgSender()) revert ApproveToCaller();

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

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned;
    }

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

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (safe && to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex != end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex != end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

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

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

    /**
     * @dev This is equivalent to _burn(tokenId, false)
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            AddressData storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

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

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

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

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

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

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

File 5 of 14 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

File 6 of 14 : MerkleProof.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
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 = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

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

File 7 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 8 of 14 : IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

import "../IERC721.sol";

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

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

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

File 10 of 14 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 11 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 12 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 13 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 14 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);
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"},{"internalType":"uint256","name":"reservedAmount_","type":"uint256"},{"internalType":"uint256","name":"publicAvailableAmount_","type":"uint256"},{"internalType":"uint256","name":"publicStartTime_","type":"uint256"},{"internalType":"uint256","name":"publicPrice_","type":"uint256"},{"internalType":"bytes32","name":"whiteListMerkleRoot_","type":"bytes32"},{"internalType":"uint256","name":"whiteListStartTime_","type":"uint256"},{"internalType":"uint256","name":"whiteListEndTime_","type":"uint256"},{"internalType":"uint256","name":"whiteListPrice_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"string","name":"channel","type":"string"}],"name":"Mint","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"string","name":"channel","type":"string"}],"name":"PublicMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"Refund","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"string","name":"channel","type":"string"}],"name":"WhiteListMint","type":"event"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"userList","type":"address[]"},{"internalType":"uint256[]","name":"amountList","type":"uint256[]"}],"name":"airdropList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collectionSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"totalAmount","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"getWhiteListRemainAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"whiteListTotalAmount","type":"uint256"},{"internalType":"bytes32[]","name":"whiteListMerkleProof","type":"bytes32[]"},{"internalType":"string","name":"channel","type":"string"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mintChannelMap","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"numberBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"perAddressMaxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicAvailableAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMintedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"refund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"refundAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"refundEndTimeMap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"refundLastEndTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"refundPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"refundPriceMap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"refundedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reservedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reservedMintedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"burnable_","type":"bool"}],"name":"setBurnable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"perAddressMaxMintAmount_","type":"uint256"},{"internalType":"uint256","name":"reservedAmount_","type":"uint256"},{"internalType":"uint256","name":"publicAvailableAmount_","type":"uint256"},{"internalType":"uint256","name":"publicStartTime_","type":"uint256"},{"internalType":"uint256","name":"publicPrice_","type":"uint256"},{"internalType":"bytes32","name":"whiteListMerkleRoot_","type":"bytes32"},{"internalType":"uint256","name":"whiteListStartTime_","type":"uint256"},{"internalType":"uint256","name":"whiteListEndTime_","type":"uint256"},{"internalType":"uint256","name":"whiteListPrice_","type":"uint256"}],"name":"setMintConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"refundPeriod_","type":"uint256"},{"internalType":"address","name":"refundAddress_","type":"address"}],"name":"setRefundConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whiteListEndTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whiteListMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whiteListMintedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whiteListPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whiteListStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600a600b5562093a80601a55601d805460ff60a01b191690553480156200002a57600080fd5b50604051620036f2380380620036f28339810160408190526200004d916200029e565b6040805180820182526008815267393936667562616f60c01b602080830191825283518085019094526005845264465542414f60d81b9084015281519192916200009a91600291620001e2565b508051620000b0906003906020840190620001e2565b5050600160005550620000c33362000190565b6008805460ff60a01b1916905560016009556126e88811801590620000f55750620000f1886126e8620003cb565b8711155b8015620001025750818311155b6200013d5760405162461bcd60e51b81526020600482015260076024820152661a5b9d985b1a5960ca1b604482015260640160405180910390fd5b88516200015290600a9060208c0190620001e2565b50600c97909755600f9590955560119390935560129190915560135560155560165560175550601d80546001600160a01b031916331790556200042e565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001f090620003f1565b90600052602060002090601f0160209004810192826200021457600085556200025f565b82601f106200022f57805160ff19168380011785556200025f565b828001600101855582156200025f579182015b828111156200025f57825182559160200191906001019062000242565b506200026d92915062000271565b5090565b5b808211156200026d576000815560010162000272565b634e487b7160e01b600052604160045260246000fd5b60008060008060008060008060006101208a8c031215620002be57600080fd5b89516001600160401b0380821115620002d657600080fd5b818c0191508c601f830112620002eb57600080fd5b81518181111562000300576200030062000288565b604051601f8201601f19908116603f011681019083821181831017156200032b576200032b62000288565b81604052828152602093508f848487010111156200034857600080fd5b600091505b828210156200036c57848201840151818301850152908301906200034d565b828211156200037e5760008484830101525b809d50505050808c01519950505060408a0151965060608a0151955060808a0151945060a08a0151935060c08a0151925060e08a015191506101008a015190509295985092959850929598565b600082821015620003ec57634e487b7160e01b600052601160045260246000fd5b500390565b600181811c908216806200040657607f821691505b602082108114156200042857634e487b7160e01b600052602260045260246000fd5b50919050565b6132b4806200043e6000396000f3fe60806040526004361061036b5760003560e01c80638da5cb5b116101c6578063bb41be57116100f7578063e985e9c511610095578063f2fde38b1161006f578063f2fde38b14610995578063f92c45b7146109b5578063fa0770df146109cb578063fd3cdb74146109e157600080fd5b8063e985e9c5146108ff578063ef60327214610948578063f170666e1461097557600080fd5b8063c87b56dd116100d1578063c87b56dd14610893578063d08afb42146108b3578063dc33e681146108c9578063df90c98d146108e957600080fd5b8063bb41be571461083d578063bdf81ef514610853578063c0e548471461087357600080fd5b8063a945bf8011610164578063b259a3a41161013e578063b259a3a4146107b0578063b6c33da9146107dd578063b80f55c9146107fd578063b88d4fde1461081d57600080fd5b8063a945bf8014610764578063aa613df51461077a578063ad7c6ed11461079a57600080fd5b8063a22cb465116101a0578063a22cb465146106f5578063a2309ff814610715578063a3a154491461072e578063a6a3b5b41461074e57600080fd5b80638da5cb5b146106a157806395d89b41146106bf578063a07c7ce4146106d457600080fd5b806342842e0e116102a0578063685756851161023e578063715018a611610218578063715018a61461063757806380929e5b1461064c5780638456cb591461066c5780638ba4cc3c1461068157600080fd5b806368575685146105ec5780636c0360eb1461060257806370a082311461061757600080fd5b806355f804b31161027a57806355f804b3146105775780635c975abb146105975780635fd1bbc4146105b65780636352211e146105cc57600080fd5b806342842e0e1461052e57806345c0f5331461054e57806354141c751461056457600080fd5b806323b872dd1161030d57806338110563116102e757806338110563146104d85780633a08002e146104ee5780633ccfd60b146105045780633f4ba83a1461051957600080fd5b806323b872dd146104825780632478d639146104a257806334b6ab1a146104c257600080fd5b8063081812fc11610349578063081812fc146103eb578063095ea7b3146104235780630cb61f6c1461044557806318160ddd1461046557600080fd5b806301ffc9a714610370578063032438ed146103a557806306fdde03146103c9575b600080fd5b34801561037c57600080fd5b5061039061038b36600461298c565b6109f7565b60405190151581526020015b60405180910390f35b3480156103b157600080fd5b506103bb600b5481565b60405190815260200161039c565b3480156103d557600080fd5b506103de610a49565b60405161039c9190612a01565b3480156103f757600080fd5b5061040b610406366004612a14565b610adb565b6040516001600160a01b03909116815260200161039c565b34801561042f57600080fd5b5061044361043e366004612a49565b610b1f565b005b34801561045157600080fd5b50601d5461040b906001600160a01b031681565b34801561047157600080fd5b5060015460005403600019016103bb565b34801561048e57600080fd5b5061044361049d366004612a73565b610bad565b3480156104ae57600080fd5b506103bb6104bd366004612aaf565b610bb8565b3480156104ce57600080fd5b506103bb60135481565b3480156104e457600080fd5b506103bb60155481565b3480156104fa57600080fd5b506103bb601b5481565b34801561051057600080fd5b50610443610be6565b34801561052557600080fd5b50610443610d0d565b34801561053a57600080fd5b50610443610549366004612a73565b610d41565b34801561055a57600080fd5b506103bb6126e881565b610443610572366004612b56565b610d5c565b34801561058357600080fd5b50610443610592366004612bd8565b610fe1565b3480156105a357600080fd5b50600854600160a01b900460ff16610390565b3480156105c257600080fd5b506103bb60115481565b3480156105d857600080fd5b5061040b6105e7366004612a14565b611017565b3480156105f857600080fd5b506103bb60175481565b34801561060e57600080fd5b506103de611029565b34801561062357600080fd5b506103bb610632366004612aaf565b6110b7565b34801561064357600080fd5b50610443611105565b34801561065857600080fd5b50610443610667366004612c29565b611139565b34801561067857600080fd5b50610443611181565b34801561068d57600080fd5b5061044361069c366004612a49565b6111b3565b3480156106ad57600080fd5b506008546001600160a01b031661040b565b3480156106cb57600080fd5b506103de611256565b3480156106e057600080fd5b50601d5461039090600160a01b900460ff1681565b34801561070157600080fd5b50610443610710366004612c44565b611265565b34801561072157600080fd5b50600054600019016103bb565b34801561073a57600080fd5b50610443610749366004612c77565b6112fb565b34801561075a57600080fd5b506103bb601a5481565b34801561077057600080fd5b506103bb60125481565b34801561078657600080fd5b50610443610795366004612c9a565b61134c565b3480156107a657600080fd5b506103bb601c5481565b3480156107bc57600080fd5b506103bb6107cb366004612a14565b60196020526000908152604090205481565b3480156107e957600080fd5b506104436107f8366004612ccf565b611537565b34801561080957600080fd5b50610443610818366004612c9a565b611605565b34801561082957600080fd5b50610443610838366004612d44565b611745565b34801561084957600080fd5b506103bb600f5481565b34801561085f57600080fd5b506103de61086e366004612a14565b611796565b34801561087f57600080fd5b506103bb61088e366004612e1f565b6117af565b34801561089f57600080fd5b506103de6108ae366004612a14565b6118b6565b3480156108bf57600080fd5b506103bb600d5481565b3480156108d557600080fd5b506103bb6108e4366004612aaf565b61193b565b3480156108f557600080fd5b506103bb60165481565b34801561090b57600080fd5b5061039061091a366004612e78565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561095457600080fd5b506103bb610963366004612a14565b60186020526000908152604090205481565b34801561098157600080fd5b50610443610990366004612ea2565b611969565b3480156109a157600080fd5b506104436109b0366004612aaf565b611a38565b3480156109c157600080fd5b506103bb600c5481565b3480156109d757600080fd5b506103bb60105481565b3480156109ed57600080fd5b506103bb60145481565b60006001600160e01b031982166380ac58cd60e01b1480610a2857506001600160e01b03198216635b5e139f60e01b145b80610a4357506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060028054610a5890612f01565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8490612f01565b8015610ad15780601f10610aa657610100808354040283529160200191610ad1565b820191906000526020600020905b815481529060010190602001808311610ab457829003601f168201915b5050505050905090565b6000610ae682611ad3565b610b03576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610b2a82611017565b9050806001600160a01b0316836001600160a01b03161415610b5f5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610b7f5750610b7d813361091a565b155b15610b9d576040516367d9dca160e11b815260040160405180910390fd5b610ba8838383611b0c565b505050565b610ba8838383611b68565b6001600160a01b038116600090815260056020526040812054600160801b90046001600160401b0316610a43565b6008546001600160a01b03163314610c195760405162461bcd60e51b8152600401610c1090612f3c565b60405180910390fd5b60026009541415610c3c5760405162461bcd60e51b8152600401610c1090612f71565b6002600955601b54421015610c845760405162461bcd60e51b815260206004820152600e60248201526d1c99599d5b99081b9bdd08195b9960921b6044820152606401610c10565b604051600090339047908381818185875af1925050503d8060008114610cc6576040519150601f19603f3d011682016040523d82523d6000602084013e610ccb565b606091505b5050905080610d055760405162461bcd60e51b8152600401610c109060208082526004908201526319985a5b60e21b604082015260600190565b506001600955565b6008546001600160a01b03163314610d375760405162461bcd60e51b8152600401610c1090612f3c565b610d3f611d4e565b565b610ba883838360405180602001604052806000815250611745565b323314610d7b5760405162461bcd60e51b8152600401610c1090612fa8565b60026009541415610d9e5760405162461bcd60e51b8152600401610c1090612f71565b6002600955600f54601054610db4908890612fe0565b11158015610def5750600b54336000908152600560205260409020548790600160401b90046001600160401b0316610dec9190612fe0565b11155b610e2f5760405162461bcd60e51b81526020600482015260116024820152701b9bdd08195b9bdd59da08185b5bdd5b9d607a1b6044820152606401610c10565b6014811115610e735760405162461bcd60e51b815260206004820152601060248201526f6368616e6e656c20746f6f206c6f6e6760801b6044820152606401610c10565b60006015544210158015610e8957506016544211155b15610e9d57610e9a338787876117af565b90505b80610f1a57601154421015610ef45760405162461bcd60e51b815260206004820152601760248201527f7075626c6963206d696e74206e6f7420737461727465640000000000000000006044820152606401610c10565b610eff878484611deb565b610f1560125488610f109190612ff8565b611e62565b610f96565b808711610f3d57610f2c878484611ee1565b610f1560175488610f109190612ff8565b6000610f498289613017565b9050600060125482610f5b9190612ff8565b9050600060175484610f6d9190612ff8565b9050610f7a838787611deb565b610f85848787611ee1565b610f92610f108284612fe0565b5050505b7f85a66b9141978db9980f7e0ce3b468cebf4f7999f32b23091c5c03e798b1ba7a33888585604051610fcb9493929190613057565b60405180910390a1505060016009555050505050565b6008546001600160a01b0316331461100b5760405162461bcd60e51b8152600401610c1090612f3c565b610ba8600a83836128dd565b600061102282611fba565b5192915050565b600a805461103690612f01565b80601f016020809104026020016040519081016040528092919081815260200182805461106290612f01565b80156110af5780601f10611084576101008083540402835291602001916110af565b820191906000526020600020905b81548152906001019060200180831161109257829003601f168201915b505050505081565b60006001600160a01b0382166110e0576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b0316331461112f5760405162461bcd60e51b8152600401610c1090612f3c565b610d3f60006120e1565b6008546001600160a01b031633146111635760405162461bcd60e51b8152600401610c1090612f3c565b601d8054911515600160a01b0260ff60a01b19909216919091179055565b6008546001600160a01b031633146111ab5760405162461bcd60e51b8152600401610c1090612f3c565b610d3f612133565b6008546001600160a01b031633146111dd5760405162461bcd60e51b8152600401610c1090612f3c565b600c5481600d546111ee9190612fe0565b11156112305760405162461bcd60e51b81526020600482015260116024820152701b9bdd08195b9bdd59da08185b5bdd5b9d607a1b6044820152606401610c10565b80600d60008282546112429190612fe0565b90915550611252905082826121bb565b5050565b606060038054610a5890612f01565b6001600160a01b03821633141561128f5760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6008546001600160a01b031633146113255760405162461bcd60e51b8152600401610c1090612f3c565b601a91909155601d80546001600160a01b0319166001600160a01b03909216919091179055565b32331461136b5760405162461bcd60e51b8152600401610c1090612fa8565b6002600954141561138e5760405162461bcd60e51b8152600401610c1090612f71565b60026009556000805b828110156114a75760008484838181106113b3576113b3613089565b9050602002013590506113c581611017565b6001600160a01b0316336001600160a01b0316146114115760405162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b6044820152606401610c10565b6000818152601960205260409020544211156114605760405162461bcd60e51b815260206004820152600e60248201526d1c99599d5b9908195e1c1a5c995960921b6044820152606401610c10565b601d546114789033906001600160a01b031683610bad565b6000818152601860205260409020546114919084612fe0565b925050808061149f9061309f565b915050611397565b5082829050601c60008282546114bd9190612fe0565b9091555050604051339082156108fc029083906000818181858888f193505050501580156114ef573d6000803e3d6000fd5b507ff031ad8ae0fd4a05c3856c5c7f8bf71372937276828a5cbc1a32d78eb2320ecc3382858560405161152594939291906130f0565b60405180910390a15050600160095550565b6008546001600160a01b031633146115615760405162461bcd60e51b8152600401610c1090612f3c565b600c5488111580156115755750600d548810155b80156115835750600f548710155b801561159a5750611596886126e8613017565b8711155b80156115a65750818311155b6115dc5760405162461bcd60e51b81526020600482015260076024820152661a5b9d985b1a5960ca1b6044820152606401610c10565b600b98909855600c96909655600f94909455601192909255601255601355601555601655601755565b3233146116245760405162461bcd60e51b8152600401610c1090612fa8565b601d54600160a01b900460ff1661166c5760405162461bcd60e51b815260206004820152600c60248201526b6e6f74206275726e61626c6560a01b6044820152606401610c10565b60005b8181101561170557600083838381811061168b5761168b613089565b90506020020135905061169d81611017565b6001600160a01b0316336001600160a01b0316146116e95760405162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b6044820152606401610c10565b6116f2816121d5565b50806116fd8161309f565b91505061166f565b507f4c3f61bbac5dc8dc1f47677a57a23e312af5e0b7ce11ce20b40bb1ec82f8882233838360405161173993929190613118565b60405180910390a15050565b611750848484611b68565b6001600160a01b0383163b151580156117725750611770848484846121e0565b155b15611790576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b600e602052600090815260409020805461103690612f01565b6000836117be575060006118ae565b60006117c9866122d4565b6001600160401b031690508085101580156118665750611866848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506013546040516bffffffffffffffffffffffff1960608d901b166020820152601d60f91b6034820152603581018b90529092506055019050604051602081830303815290604052805190602001206122ff565b6118a05760405162461bcd60e51b815260206004820152600b60248201526a1d995c9a599e4819985a5b60aa1b6044820152606401610c10565b6118aa8186613017565b9150505b949350505050565b60606118c182611ad3565b6118de57604051630a14c4b560e41b815260040160405180910390fd5b60006118e8612315565b90508051600014156119095760405180602001604052806000815250611934565b8061191384612324565b604051602001611924929190613146565b6040516020818303038152906040525b9392505050565b6001600160a01b038116600090815260056020526040812054600160401b90046001600160401b0316610a43565b6008546001600160a01b031633146119935760405162461bcd60e51b8152600401610c1090612f3c565b8281146119cc5760405162461bcd60e51b81526020600482015260076024820152661a5b9d985b1a5960ca1b6044820152606401610c10565b60005b83811015611a3157611a1f8585838181106119ec576119ec613089565b9050602002016020810190611a019190612aaf565b848484818110611a1357611a13613089565b905060200201356111b3565b80611a298161309f565b9150506119cf565b5050505050565b6008546001600160a01b03163314611a625760405162461bcd60e51b8152600401610c1090612f3c565b6001600160a01b038116611ac75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c10565b611ad0816120e1565b50565b600081600111158015611ae7575060005482105b8015610a43575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611b7382611fba565b9050836001600160a01b031681600001516001600160a01b031614611baa5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480611bc85750611bc8853361091a565b80611be3575033611bd884610adb565b6001600160a01b0316145b905080611c0357604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416611c2a57604051633a954ecd60e21b815260040160405180910390fd5b611c378585856001612421565b611c4360008487611b0c565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116611d17576000548214611d1757805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b031660008051602061325f83398151915260405160405180910390a4611a31565b600854600160a01b900460ff16611d9e5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610c10565b6008805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b8260106000828254611dfd9190612fe0565b92505081905550611e12836012548484612464565b611e1c33846121bb565b7f7f9c8931cfbc299ecaa11e741eec91343b38cacaead98eb6c607394cbf30652f33846012548585604051611e55959493929190613175565b60405180910390a1505050565b80341015611ea35760405162461bcd60e51b815260206004820152600e60248201526d0dcdee840cadcdeeaced0408aa8960931b6044820152606401610c10565b80341115611ad057336108fc611eb98334613017565b6040518115909202916000818181858888f19350505050158015611252573d6000803e3d6000fd5b8260106000828254611ef39190612fe0565b925050819055508260146000828254611f0c9190612fe0565b90915550611f6990503384611f20826122d4565b611f2a91906131ae565b6001600160a01b03909116600090815260056020526040902080546001600160401b03909216600160c01b026001600160c01b03909216919091179055565b611f77836017548484612464565b611f8133846121bb565b7f3aedaf0943c081b563cedc91a17e2e77eed3cb6b83574b8a933d23bee44744ab33846017548585604051611e55959493929190613175565b60408051606081018252600080825260208201819052918101919091528180600111158015611fea575060005481105b156120c857600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906120c65780516001600160a01b03161561205d579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff16151592810192909252156120c1579392505050565b61205d565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600854600160a01b900460ff16156121805760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610c10565b6008805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611dce3390565b6112528282604051806020016040528060008152506124e7565b611ad08160006124f4565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906122159033908990889088906004016131d0565b602060405180830381600087803b15801561222f57600080fd5b505af192505050801561225f575060408051601f3d908101601f1916820190925261225c91810190613203565b60015b6122ba573d80801561228d576040519150601f19603f3d011682016040523d82523d6000602084013e612292565b606091505b5080516122b2576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506118ae565b6001600160a01b0316600090815260056020526040902054600160c01b90046001600160401b031690565b60008261230c85846126b5565b14949350505050565b6060600a8054610a5890612f01565b6060816123485750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612372578061235c8161309f565b915061236b9050600a83613236565b915061234c565b6000816001600160401b0381111561238c5761238c612d2e565b6040519080825280601f01601f1916602001820160405280156123b6576020820181803683370190505b5090505b84156118ae576123cb600183613017565b91506123d8600a8661324a565b6123e3906030612fe0565b60f81b8183815181106123f8576123f8613089565b60200101906001600160f81b031916908160001a90535061241a600a86613236565b94506123ba565b600854600160a01b900460ff16156117905760405162461bcd60e51b81526020600482015260066024820152651c185d5cd95960d21b6044820152606401610c10565b60008054906124738683612fe0565b90506000601a54426124859190612fe0565b90505b600083815260186020908152604080832089905560198252808320849055600e90915290206124b89086866128dd565b50826124c38161309f565b9350508183141561248857601b548111156124de57601b8190555b50505050505050565b610ba88383836001612729565b60006124ff83611fba565b80519091508215612565576000336001600160a01b03831614806125285750612528823361091a565b8061254357503361253886610adb565b6001600160a01b0316145b90508061256357604051632ce44b5f60e11b815260040160405180910390fd5b505b612573816000866001612421565b61257f60008583611b0c565b6001600160a01b0380821660008181526005602090815260408083208054600160801b6000196001600160401b0380841691909101811667ffffffffffffffff198416811783900482166001908101831690930277ffffffffffffffff0000000000000000ffffffffffffffff19909416179290921783558b86526004909452828520805460ff60e01b1942909316600160a01b026001600160e01b03199091169097179690961716600160e01b17855591890180845292208054919490911661267d57600054821461267d57805460208701516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038716171781555b5050604051869250600091506001600160a01b0384169060008051602061325f833981519152908390a4505060018054810190555050565b600081815b84518110156127215760008582815181106126d7576126d7613089565b602002602001015190508083116126fd576000838152602082905260409020925061270e565b600081815260208490526040902092505b50806127198161309f565b9150506126ba565b509392505050565b6000546001600160a01b03851661275257604051622e076360e81b815260040160405180910390fd5b836127705760405163b562e8dd60e01b815260040160405180910390fd5b61277d6000868387612421565b6001600160a01b038516600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168c018116918217600160401b67ffffffffffffffff1990941690921783900481168c01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b42909216919091021790558080850183801561282957506001600160a01b0387163b15155b156128a0575b60405182906001600160a01b0389169060009060008051602061325f833981519152908290a461286860008884806001019550886121e0565b612885576040516368d2bf6b60e11b815260040160405180910390fd5b8082141561282f57826000541461289b57600080fd5b6128d4565b5b6040516001830192906001600160a01b0389169060009060008051602061325f833981519152908290a4808214156128a1575b50600055611a31565b8280546128e990612f01565b90600052602060002090601f01602090048101928261290b5760008555612951565b82601f106129245782800160ff19823516178555612951565b82800160010185558215612951579182015b82811115612951578235825591602001919060010190612936565b5061295d929150612961565b5090565b5b8082111561295d5760008155600101612962565b6001600160e01b031981168114611ad057600080fd5b60006020828403121561299e57600080fd5b813561193481612976565b60005b838110156129c45781810151838201526020016129ac565b838111156117905750506000910152565b600081518084526129ed8160208601602086016129a9565b601f01601f19169290920160200192915050565b60208152600061193460208301846129d5565b600060208284031215612a2657600080fd5b5035919050565b80356001600160a01b0381168114612a4457600080fd5b919050565b60008060408385031215612a5c57600080fd5b612a6583612a2d565b946020939093013593505050565b600080600060608486031215612a8857600080fd5b612a9184612a2d565b9250612a9f60208501612a2d565b9150604084013590509250925092565b600060208284031215612ac157600080fd5b61193482612a2d565b60008083601f840112612adc57600080fd5b5081356001600160401b03811115612af357600080fd5b6020830191508360208260051b8501011115612b0e57600080fd5b9250929050565b60008083601f840112612b2757600080fd5b5081356001600160401b03811115612b3e57600080fd5b602083019150836020828501011115612b0e57600080fd5b60008060008060008060808789031215612b6f57600080fd5b863595506020870135945060408701356001600160401b0380821115612b9457600080fd5b612ba08a838b01612aca565b90965094506060890135915080821115612bb957600080fd5b50612bc689828a01612b15565b979a9699509497509295939492505050565b60008060208385031215612beb57600080fd5b82356001600160401b03811115612c0157600080fd5b612c0d85828601612b15565b90969095509350505050565b80358015158114612a4457600080fd5b600060208284031215612c3b57600080fd5b61193482612c19565b60008060408385031215612c5757600080fd5b612c6083612a2d565b9150612c6e60208401612c19565b90509250929050565b60008060408385031215612c8a57600080fd5b82359150612c6e60208401612a2d565b60008060208385031215612cad57600080fd5b82356001600160401b03811115612cc357600080fd5b612c0d85828601612aca565b60008060008060008060008060006101208a8c031215612cee57600080fd5b505087359960208901359950604089013598606081013598506080810135975060a0810135965060c0810135955060e08101359450610100013592509050565b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215612d5a57600080fd5b612d6385612a2d565b9350612d7160208601612a2d565b92506040850135915060608501356001600160401b0380821115612d9457600080fd5b818701915087601f830112612da857600080fd5b813581811115612dba57612dba612d2e565b604051601f8201601f19908116603f01168101908382118183101715612de257612de2612d2e565b816040528281528a6020848701011115612dfb57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060008060608587031215612e3557600080fd5b612e3e85612a2d565b93506020850135925060408501356001600160401b03811115612e6057600080fd5b612e6c87828801612aca565b95989497509550505050565b60008060408385031215612e8b57600080fd5b612e9483612a2d565b9150612c6e60208401612a2d565b60008060008060408587031215612eb857600080fd5b84356001600160401b0380821115612ecf57600080fd5b612edb88838901612aca565b90965094506020870135915080821115612ef457600080fd5b50612e6c87828801612aca565b600181811c90821680612f1557607f821691505b60208210811415612f3657634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252600890820152673737ba103ab9b2b960c11b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008219821115612ff357612ff3612fca565b500190565b600081600019048311821515161561301257613012612fca565b500290565b60008282101561302957613029612fca565b500390565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60018060a01b038516815283602082015260606040820152600061307f60608301848661302e565b9695505050505050565b634e487b7160e01b600052603260045260246000fd5b60006000198214156130b3576130b3612fca565b5060010190565b81835260006001600160fb1b038311156130d357600080fd5b8260051b8083602087013760009401602001938452509192915050565b60018060a01b038516815283602082015260606040820152600061307f6060830184866130ba565b6001600160a01b038416815260406020820181905260009061313d90830184866130ba565b95945050505050565b600083516131588184602088016129a9565b83519083019061316c8183602088016129a9565b01949350505050565b60018060a01b03861681528460208201528360408201526080606082015260006131a360808301848661302e565b979650505050505050565b60006001600160401b0380831681851680830382111561316c5761316c612fca565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061307f908301846129d5565b60006020828403121561321557600080fd5b815161193481612976565b634e487b7160e01b600052601260045260246000fd5b60008261324557613245613220565b500490565b60008261325957613259613220565b50069056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220d1fca989df07787a16719063e6bb0f44d8bb7abcddf69791312b0f01006f931e64736f6c63430008080033000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000003e400000000000000000000000000000000000000000000000000000000000003e4000000000000000000000000000000000000000000000000000000006268b1b00000000000000000000000000000000000000000000000000023629135f6800024c852a0c31676ab8b57ca77e4bb7f6387adaa52c68dcaf9de3287b518cdb9b10000000000000000000000000000000000000000000000000000000062621a3000000000000000000000000000000000000000000000000000000000626825100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e68747470733a2f2f393936667562616f2e696f2f6d6574612e6a736f6e230000

Deployed Bytecode

0x60806040526004361061036b5760003560e01c80638da5cb5b116101c6578063bb41be57116100f7578063e985e9c511610095578063f2fde38b1161006f578063f2fde38b14610995578063f92c45b7146109b5578063fa0770df146109cb578063fd3cdb74146109e157600080fd5b8063e985e9c5146108ff578063ef60327214610948578063f170666e1461097557600080fd5b8063c87b56dd116100d1578063c87b56dd14610893578063d08afb42146108b3578063dc33e681146108c9578063df90c98d146108e957600080fd5b8063bb41be571461083d578063bdf81ef514610853578063c0e548471461087357600080fd5b8063a945bf8011610164578063b259a3a41161013e578063b259a3a4146107b0578063b6c33da9146107dd578063b80f55c9146107fd578063b88d4fde1461081d57600080fd5b8063a945bf8014610764578063aa613df51461077a578063ad7c6ed11461079a57600080fd5b8063a22cb465116101a0578063a22cb465146106f5578063a2309ff814610715578063a3a154491461072e578063a6a3b5b41461074e57600080fd5b80638da5cb5b146106a157806395d89b41146106bf578063a07c7ce4146106d457600080fd5b806342842e0e116102a0578063685756851161023e578063715018a611610218578063715018a61461063757806380929e5b1461064c5780638456cb591461066c5780638ba4cc3c1461068157600080fd5b806368575685146105ec5780636c0360eb1461060257806370a082311461061757600080fd5b806355f804b31161027a57806355f804b3146105775780635c975abb146105975780635fd1bbc4146105b65780636352211e146105cc57600080fd5b806342842e0e1461052e57806345c0f5331461054e57806354141c751461056457600080fd5b806323b872dd1161030d57806338110563116102e757806338110563146104d85780633a08002e146104ee5780633ccfd60b146105045780633f4ba83a1461051957600080fd5b806323b872dd146104825780632478d639146104a257806334b6ab1a146104c257600080fd5b8063081812fc11610349578063081812fc146103eb578063095ea7b3146104235780630cb61f6c1461044557806318160ddd1461046557600080fd5b806301ffc9a714610370578063032438ed146103a557806306fdde03146103c9575b600080fd5b34801561037c57600080fd5b5061039061038b36600461298c565b6109f7565b60405190151581526020015b60405180910390f35b3480156103b157600080fd5b506103bb600b5481565b60405190815260200161039c565b3480156103d557600080fd5b506103de610a49565b60405161039c9190612a01565b3480156103f757600080fd5b5061040b610406366004612a14565b610adb565b6040516001600160a01b03909116815260200161039c565b34801561042f57600080fd5b5061044361043e366004612a49565b610b1f565b005b34801561045157600080fd5b50601d5461040b906001600160a01b031681565b34801561047157600080fd5b5060015460005403600019016103bb565b34801561048e57600080fd5b5061044361049d366004612a73565b610bad565b3480156104ae57600080fd5b506103bb6104bd366004612aaf565b610bb8565b3480156104ce57600080fd5b506103bb60135481565b3480156104e457600080fd5b506103bb60155481565b3480156104fa57600080fd5b506103bb601b5481565b34801561051057600080fd5b50610443610be6565b34801561052557600080fd5b50610443610d0d565b34801561053a57600080fd5b50610443610549366004612a73565b610d41565b34801561055a57600080fd5b506103bb6126e881565b610443610572366004612b56565b610d5c565b34801561058357600080fd5b50610443610592366004612bd8565b610fe1565b3480156105a357600080fd5b50600854600160a01b900460ff16610390565b3480156105c257600080fd5b506103bb60115481565b3480156105d857600080fd5b5061040b6105e7366004612a14565b611017565b3480156105f857600080fd5b506103bb60175481565b34801561060e57600080fd5b506103de611029565b34801561062357600080fd5b506103bb610632366004612aaf565b6110b7565b34801561064357600080fd5b50610443611105565b34801561065857600080fd5b50610443610667366004612c29565b611139565b34801561067857600080fd5b50610443611181565b34801561068d57600080fd5b5061044361069c366004612a49565b6111b3565b3480156106ad57600080fd5b506008546001600160a01b031661040b565b3480156106cb57600080fd5b506103de611256565b3480156106e057600080fd5b50601d5461039090600160a01b900460ff1681565b34801561070157600080fd5b50610443610710366004612c44565b611265565b34801561072157600080fd5b50600054600019016103bb565b34801561073a57600080fd5b50610443610749366004612c77565b6112fb565b34801561075a57600080fd5b506103bb601a5481565b34801561077057600080fd5b506103bb60125481565b34801561078657600080fd5b50610443610795366004612c9a565b61134c565b3480156107a657600080fd5b506103bb601c5481565b3480156107bc57600080fd5b506103bb6107cb366004612a14565b60196020526000908152604090205481565b3480156107e957600080fd5b506104436107f8366004612ccf565b611537565b34801561080957600080fd5b50610443610818366004612c9a565b611605565b34801561082957600080fd5b50610443610838366004612d44565b611745565b34801561084957600080fd5b506103bb600f5481565b34801561085f57600080fd5b506103de61086e366004612a14565b611796565b34801561087f57600080fd5b506103bb61088e366004612e1f565b6117af565b34801561089f57600080fd5b506103de6108ae366004612a14565b6118b6565b3480156108bf57600080fd5b506103bb600d5481565b3480156108d557600080fd5b506103bb6108e4366004612aaf565b61193b565b3480156108f557600080fd5b506103bb60165481565b34801561090b57600080fd5b5061039061091a366004612e78565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561095457600080fd5b506103bb610963366004612a14565b60186020526000908152604090205481565b34801561098157600080fd5b50610443610990366004612ea2565b611969565b3480156109a157600080fd5b506104436109b0366004612aaf565b611a38565b3480156109c157600080fd5b506103bb600c5481565b3480156109d757600080fd5b506103bb60105481565b3480156109ed57600080fd5b506103bb60145481565b60006001600160e01b031982166380ac58cd60e01b1480610a2857506001600160e01b03198216635b5e139f60e01b145b80610a4357506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060028054610a5890612f01565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8490612f01565b8015610ad15780601f10610aa657610100808354040283529160200191610ad1565b820191906000526020600020905b815481529060010190602001808311610ab457829003601f168201915b5050505050905090565b6000610ae682611ad3565b610b03576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610b2a82611017565b9050806001600160a01b0316836001600160a01b03161415610b5f5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610b7f5750610b7d813361091a565b155b15610b9d576040516367d9dca160e11b815260040160405180910390fd5b610ba8838383611b0c565b505050565b610ba8838383611b68565b6001600160a01b038116600090815260056020526040812054600160801b90046001600160401b0316610a43565b6008546001600160a01b03163314610c195760405162461bcd60e51b8152600401610c1090612f3c565b60405180910390fd5b60026009541415610c3c5760405162461bcd60e51b8152600401610c1090612f71565b6002600955601b54421015610c845760405162461bcd60e51b815260206004820152600e60248201526d1c99599d5b99081b9bdd08195b9960921b6044820152606401610c10565b604051600090339047908381818185875af1925050503d8060008114610cc6576040519150601f19603f3d011682016040523d82523d6000602084013e610ccb565b606091505b5050905080610d055760405162461bcd60e51b8152600401610c109060208082526004908201526319985a5b60e21b604082015260600190565b506001600955565b6008546001600160a01b03163314610d375760405162461bcd60e51b8152600401610c1090612f3c565b610d3f611d4e565b565b610ba883838360405180602001604052806000815250611745565b323314610d7b5760405162461bcd60e51b8152600401610c1090612fa8565b60026009541415610d9e5760405162461bcd60e51b8152600401610c1090612f71565b6002600955600f54601054610db4908890612fe0565b11158015610def5750600b54336000908152600560205260409020548790600160401b90046001600160401b0316610dec9190612fe0565b11155b610e2f5760405162461bcd60e51b81526020600482015260116024820152701b9bdd08195b9bdd59da08185b5bdd5b9d607a1b6044820152606401610c10565b6014811115610e735760405162461bcd60e51b815260206004820152601060248201526f6368616e6e656c20746f6f206c6f6e6760801b6044820152606401610c10565b60006015544210158015610e8957506016544211155b15610e9d57610e9a338787876117af565b90505b80610f1a57601154421015610ef45760405162461bcd60e51b815260206004820152601760248201527f7075626c6963206d696e74206e6f7420737461727465640000000000000000006044820152606401610c10565b610eff878484611deb565b610f1560125488610f109190612ff8565b611e62565b610f96565b808711610f3d57610f2c878484611ee1565b610f1560175488610f109190612ff8565b6000610f498289613017565b9050600060125482610f5b9190612ff8565b9050600060175484610f6d9190612ff8565b9050610f7a838787611deb565b610f85848787611ee1565b610f92610f108284612fe0565b5050505b7f85a66b9141978db9980f7e0ce3b468cebf4f7999f32b23091c5c03e798b1ba7a33888585604051610fcb9493929190613057565b60405180910390a1505060016009555050505050565b6008546001600160a01b0316331461100b5760405162461bcd60e51b8152600401610c1090612f3c565b610ba8600a83836128dd565b600061102282611fba565b5192915050565b600a805461103690612f01565b80601f016020809104026020016040519081016040528092919081815260200182805461106290612f01565b80156110af5780601f10611084576101008083540402835291602001916110af565b820191906000526020600020905b81548152906001019060200180831161109257829003601f168201915b505050505081565b60006001600160a01b0382166110e0576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b0316331461112f5760405162461bcd60e51b8152600401610c1090612f3c565b610d3f60006120e1565b6008546001600160a01b031633146111635760405162461bcd60e51b8152600401610c1090612f3c565b601d8054911515600160a01b0260ff60a01b19909216919091179055565b6008546001600160a01b031633146111ab5760405162461bcd60e51b8152600401610c1090612f3c565b610d3f612133565b6008546001600160a01b031633146111dd5760405162461bcd60e51b8152600401610c1090612f3c565b600c5481600d546111ee9190612fe0565b11156112305760405162461bcd60e51b81526020600482015260116024820152701b9bdd08195b9bdd59da08185b5bdd5b9d607a1b6044820152606401610c10565b80600d60008282546112429190612fe0565b90915550611252905082826121bb565b5050565b606060038054610a5890612f01565b6001600160a01b03821633141561128f5760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6008546001600160a01b031633146113255760405162461bcd60e51b8152600401610c1090612f3c565b601a91909155601d80546001600160a01b0319166001600160a01b03909216919091179055565b32331461136b5760405162461bcd60e51b8152600401610c1090612fa8565b6002600954141561138e5760405162461bcd60e51b8152600401610c1090612f71565b60026009556000805b828110156114a75760008484838181106113b3576113b3613089565b9050602002013590506113c581611017565b6001600160a01b0316336001600160a01b0316146114115760405162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b6044820152606401610c10565b6000818152601960205260409020544211156114605760405162461bcd60e51b815260206004820152600e60248201526d1c99599d5b9908195e1c1a5c995960921b6044820152606401610c10565b601d546114789033906001600160a01b031683610bad565b6000818152601860205260409020546114919084612fe0565b925050808061149f9061309f565b915050611397565b5082829050601c60008282546114bd9190612fe0565b9091555050604051339082156108fc029083906000818181858888f193505050501580156114ef573d6000803e3d6000fd5b507ff031ad8ae0fd4a05c3856c5c7f8bf71372937276828a5cbc1a32d78eb2320ecc3382858560405161152594939291906130f0565b60405180910390a15050600160095550565b6008546001600160a01b031633146115615760405162461bcd60e51b8152600401610c1090612f3c565b600c5488111580156115755750600d548810155b80156115835750600f548710155b801561159a5750611596886126e8613017565b8711155b80156115a65750818311155b6115dc5760405162461bcd60e51b81526020600482015260076024820152661a5b9d985b1a5960ca1b6044820152606401610c10565b600b98909855600c96909655600f94909455601192909255601255601355601555601655601755565b3233146116245760405162461bcd60e51b8152600401610c1090612fa8565b601d54600160a01b900460ff1661166c5760405162461bcd60e51b815260206004820152600c60248201526b6e6f74206275726e61626c6560a01b6044820152606401610c10565b60005b8181101561170557600083838381811061168b5761168b613089565b90506020020135905061169d81611017565b6001600160a01b0316336001600160a01b0316146116e95760405162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b6044820152606401610c10565b6116f2816121d5565b50806116fd8161309f565b91505061166f565b507f4c3f61bbac5dc8dc1f47677a57a23e312af5e0b7ce11ce20b40bb1ec82f8882233838360405161173993929190613118565b60405180910390a15050565b611750848484611b68565b6001600160a01b0383163b151580156117725750611770848484846121e0565b155b15611790576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b600e602052600090815260409020805461103690612f01565b6000836117be575060006118ae565b60006117c9866122d4565b6001600160401b031690508085101580156118665750611866848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506013546040516bffffffffffffffffffffffff1960608d901b166020820152601d60f91b6034820152603581018b90529092506055019050604051602081830303815290604052805190602001206122ff565b6118a05760405162461bcd60e51b815260206004820152600b60248201526a1d995c9a599e4819985a5b60aa1b6044820152606401610c10565b6118aa8186613017565b9150505b949350505050565b60606118c182611ad3565b6118de57604051630a14c4b560e41b815260040160405180910390fd5b60006118e8612315565b90508051600014156119095760405180602001604052806000815250611934565b8061191384612324565b604051602001611924929190613146565b6040516020818303038152906040525b9392505050565b6001600160a01b038116600090815260056020526040812054600160401b90046001600160401b0316610a43565b6008546001600160a01b031633146119935760405162461bcd60e51b8152600401610c1090612f3c565b8281146119cc5760405162461bcd60e51b81526020600482015260076024820152661a5b9d985b1a5960ca1b6044820152606401610c10565b60005b83811015611a3157611a1f8585838181106119ec576119ec613089565b9050602002016020810190611a019190612aaf565b848484818110611a1357611a13613089565b905060200201356111b3565b80611a298161309f565b9150506119cf565b5050505050565b6008546001600160a01b03163314611a625760405162461bcd60e51b8152600401610c1090612f3c565b6001600160a01b038116611ac75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c10565b611ad0816120e1565b50565b600081600111158015611ae7575060005482105b8015610a43575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611b7382611fba565b9050836001600160a01b031681600001516001600160a01b031614611baa5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480611bc85750611bc8853361091a565b80611be3575033611bd884610adb565b6001600160a01b0316145b905080611c0357604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416611c2a57604051633a954ecd60e21b815260040160405180910390fd5b611c378585856001612421565b611c4360008487611b0c565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116611d17576000548214611d1757805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b031660008051602061325f83398151915260405160405180910390a4611a31565b600854600160a01b900460ff16611d9e5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610c10565b6008805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b8260106000828254611dfd9190612fe0565b92505081905550611e12836012548484612464565b611e1c33846121bb565b7f7f9c8931cfbc299ecaa11e741eec91343b38cacaead98eb6c607394cbf30652f33846012548585604051611e55959493929190613175565b60405180910390a1505050565b80341015611ea35760405162461bcd60e51b815260206004820152600e60248201526d0dcdee840cadcdeeaced0408aa8960931b6044820152606401610c10565b80341115611ad057336108fc611eb98334613017565b6040518115909202916000818181858888f19350505050158015611252573d6000803e3d6000fd5b8260106000828254611ef39190612fe0565b925050819055508260146000828254611f0c9190612fe0565b90915550611f6990503384611f20826122d4565b611f2a91906131ae565b6001600160a01b03909116600090815260056020526040902080546001600160401b03909216600160c01b026001600160c01b03909216919091179055565b611f77836017548484612464565b611f8133846121bb565b7f3aedaf0943c081b563cedc91a17e2e77eed3cb6b83574b8a933d23bee44744ab33846017548585604051611e55959493929190613175565b60408051606081018252600080825260208201819052918101919091528180600111158015611fea575060005481105b156120c857600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906120c65780516001600160a01b03161561205d579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff16151592810192909252156120c1579392505050565b61205d565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600854600160a01b900460ff16156121805760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610c10565b6008805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611dce3390565b6112528282604051806020016040528060008152506124e7565b611ad08160006124f4565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906122159033908990889088906004016131d0565b602060405180830381600087803b15801561222f57600080fd5b505af192505050801561225f575060408051601f3d908101601f1916820190925261225c91810190613203565b60015b6122ba573d80801561228d576040519150601f19603f3d011682016040523d82523d6000602084013e612292565b606091505b5080516122b2576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506118ae565b6001600160a01b0316600090815260056020526040902054600160c01b90046001600160401b031690565b60008261230c85846126b5565b14949350505050565b6060600a8054610a5890612f01565b6060816123485750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612372578061235c8161309f565b915061236b9050600a83613236565b915061234c565b6000816001600160401b0381111561238c5761238c612d2e565b6040519080825280601f01601f1916602001820160405280156123b6576020820181803683370190505b5090505b84156118ae576123cb600183613017565b91506123d8600a8661324a565b6123e3906030612fe0565b60f81b8183815181106123f8576123f8613089565b60200101906001600160f81b031916908160001a90535061241a600a86613236565b94506123ba565b600854600160a01b900460ff16156117905760405162461bcd60e51b81526020600482015260066024820152651c185d5cd95960d21b6044820152606401610c10565b60008054906124738683612fe0565b90506000601a54426124859190612fe0565b90505b600083815260186020908152604080832089905560198252808320849055600e90915290206124b89086866128dd565b50826124c38161309f565b9350508183141561248857601b548111156124de57601b8190555b50505050505050565b610ba88383836001612729565b60006124ff83611fba565b80519091508215612565576000336001600160a01b03831614806125285750612528823361091a565b8061254357503361253886610adb565b6001600160a01b0316145b90508061256357604051632ce44b5f60e11b815260040160405180910390fd5b505b612573816000866001612421565b61257f60008583611b0c565b6001600160a01b0380821660008181526005602090815260408083208054600160801b6000196001600160401b0380841691909101811667ffffffffffffffff198416811783900482166001908101831690930277ffffffffffffffff0000000000000000ffffffffffffffff19909416179290921783558b86526004909452828520805460ff60e01b1942909316600160a01b026001600160e01b03199091169097179690961716600160e01b17855591890180845292208054919490911661267d57600054821461267d57805460208701516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038716171781555b5050604051869250600091506001600160a01b0384169060008051602061325f833981519152908390a4505060018054810190555050565b600081815b84518110156127215760008582815181106126d7576126d7613089565b602002602001015190508083116126fd576000838152602082905260409020925061270e565b600081815260208490526040902092505b50806127198161309f565b9150506126ba565b509392505050565b6000546001600160a01b03851661275257604051622e076360e81b815260040160405180910390fd5b836127705760405163b562e8dd60e01b815260040160405180910390fd5b61277d6000868387612421565b6001600160a01b038516600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168c018116918217600160401b67ffffffffffffffff1990941690921783900481168c01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b42909216919091021790558080850183801561282957506001600160a01b0387163b15155b156128a0575b60405182906001600160a01b0389169060009060008051602061325f833981519152908290a461286860008884806001019550886121e0565b612885576040516368d2bf6b60e11b815260040160405180910390fd5b8082141561282f57826000541461289b57600080fd5b6128d4565b5b6040516001830192906001600160a01b0389169060009060008051602061325f833981519152908290a4808214156128a1575b50600055611a31565b8280546128e990612f01565b90600052602060002090601f01602090048101928261290b5760008555612951565b82601f106129245782800160ff19823516178555612951565b82800160010185558215612951579182015b82811115612951578235825591602001919060010190612936565b5061295d929150612961565b5090565b5b8082111561295d5760008155600101612962565b6001600160e01b031981168114611ad057600080fd5b60006020828403121561299e57600080fd5b813561193481612976565b60005b838110156129c45781810151838201526020016129ac565b838111156117905750506000910152565b600081518084526129ed8160208601602086016129a9565b601f01601f19169290920160200192915050565b60208152600061193460208301846129d5565b600060208284031215612a2657600080fd5b5035919050565b80356001600160a01b0381168114612a4457600080fd5b919050565b60008060408385031215612a5c57600080fd5b612a6583612a2d565b946020939093013593505050565b600080600060608486031215612a8857600080fd5b612a9184612a2d565b9250612a9f60208501612a2d565b9150604084013590509250925092565b600060208284031215612ac157600080fd5b61193482612a2d565b60008083601f840112612adc57600080fd5b5081356001600160401b03811115612af357600080fd5b6020830191508360208260051b8501011115612b0e57600080fd5b9250929050565b60008083601f840112612b2757600080fd5b5081356001600160401b03811115612b3e57600080fd5b602083019150836020828501011115612b0e57600080fd5b60008060008060008060808789031215612b6f57600080fd5b863595506020870135945060408701356001600160401b0380821115612b9457600080fd5b612ba08a838b01612aca565b90965094506060890135915080821115612bb957600080fd5b50612bc689828a01612b15565b979a9699509497509295939492505050565b60008060208385031215612beb57600080fd5b82356001600160401b03811115612c0157600080fd5b612c0d85828601612b15565b90969095509350505050565b80358015158114612a4457600080fd5b600060208284031215612c3b57600080fd5b61193482612c19565b60008060408385031215612c5757600080fd5b612c6083612a2d565b9150612c6e60208401612c19565b90509250929050565b60008060408385031215612c8a57600080fd5b82359150612c6e60208401612a2d565b60008060208385031215612cad57600080fd5b82356001600160401b03811115612cc357600080fd5b612c0d85828601612aca565b60008060008060008060008060006101208a8c031215612cee57600080fd5b505087359960208901359950604089013598606081013598506080810135975060a0810135965060c0810135955060e08101359450610100013592509050565b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215612d5a57600080fd5b612d6385612a2d565b9350612d7160208601612a2d565b92506040850135915060608501356001600160401b0380821115612d9457600080fd5b818701915087601f830112612da857600080fd5b813581811115612dba57612dba612d2e565b604051601f8201601f19908116603f01168101908382118183101715612de257612de2612d2e565b816040528281528a6020848701011115612dfb57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060008060608587031215612e3557600080fd5b612e3e85612a2d565b93506020850135925060408501356001600160401b03811115612e6057600080fd5b612e6c87828801612aca565b95989497509550505050565b60008060408385031215612e8b57600080fd5b612e9483612a2d565b9150612c6e60208401612a2d565b60008060008060408587031215612eb857600080fd5b84356001600160401b0380821115612ecf57600080fd5b612edb88838901612aca565b90965094506020870135915080821115612ef457600080fd5b50612e6c87828801612aca565b600181811c90821680612f1557607f821691505b60208210811415612f3657634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252600890820152673737ba103ab9b2b960c11b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008219821115612ff357612ff3612fca565b500190565b600081600019048311821515161561301257613012612fca565b500290565b60008282101561302957613029612fca565b500390565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60018060a01b038516815283602082015260606040820152600061307f60608301848661302e565b9695505050505050565b634e487b7160e01b600052603260045260246000fd5b60006000198214156130b3576130b3612fca565b5060010190565b81835260006001600160fb1b038311156130d357600080fd5b8260051b8083602087013760009401602001938452509192915050565b60018060a01b038516815283602082015260606040820152600061307f6060830184866130ba565b6001600160a01b038416815260406020820181905260009061313d90830184866130ba565b95945050505050565b600083516131588184602088016129a9565b83519083019061316c8183602088016129a9565b01949350505050565b60018060a01b03861681528460208201528360408201526080606082015260006131a360808301848661302e565b979650505050505050565b60006001600160401b0380831681851680830382111561316c5761316c612fca565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061307f908301846129d5565b60006020828403121561321557600080fd5b815161193481612976565b634e487b7160e01b600052601260045260246000fd5b60008261324557613245613220565b500490565b60008261325957613259613220565b50069056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220d1fca989df07787a16719063e6bb0f44d8bb7abcddf69791312b0f01006f931e64736f6c63430008080033

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

000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000003e400000000000000000000000000000000000000000000000000000000000003e4000000000000000000000000000000000000000000000000000000006268b1b00000000000000000000000000000000000000000000000000023629135f6800024c852a0c31676ab8b57ca77e4bb7f6387adaa52c68dcaf9de3287b518cdb9b10000000000000000000000000000000000000000000000000000000062621a3000000000000000000000000000000000000000000000000000000000626825100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e68747470733a2f2f393936667562616f2e696f2f6d6574612e6a736f6e230000

-----Decoded View---------------
Arg [0] : baseURI_ (string): https://996fubao.io/meta.json#
Arg [1] : reservedAmount_ (uint256): 996
Arg [2] : publicAvailableAmount_ (uint256): 996
Arg [3] : publicStartTime_ (uint256): 1651028400
Arg [4] : publicPrice_ (uint256): 9960000000000000
Arg [5] : whiteListMerkleRoot_ (bytes32): 0x24c852a0c31676ab8b57ca77e4bb7f6387adaa52c68dcaf9de3287b518cdb9b1
Arg [6] : whiteListStartTime_ (uint256): 1650596400
Arg [7] : whiteListEndTime_ (uint256): 1650992400
Arg [8] : whiteListPrice_ (uint256): 0

-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [1] : 00000000000000000000000000000000000000000000000000000000000003e4
Arg [2] : 00000000000000000000000000000000000000000000000000000000000003e4
Arg [3] : 000000000000000000000000000000000000000000000000000000006268b1b0
Arg [4] : 0000000000000000000000000000000000000000000000000023629135f68000
Arg [5] : 24c852a0c31676ab8b57ca77e4bb7f6387adaa52c68dcaf9de3287b518cdb9b1
Arg [6] : 0000000000000000000000000000000000000000000000000000000062621a30
Arg [7] : 0000000000000000000000000000000000000000000000000000000062682510
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [9] : 000000000000000000000000000000000000000000000000000000000000001e
Arg [10] : 68747470733a2f2f393936667562616f2e696f2f6d6574612e6a736f6e230000


Deployed Bytecode Sourcemap

340:11027:12:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4551:300:13;;;;;;;;;;-1:-1:-1;4551:300:13;;;;;:::i;:::-;;:::i;:::-;;;565:14:14;;558:22;540:41;;528:2;513:18;4551:300:13;;;;;;;;526:43:12;;;;;;;;;;;;;;;;;;;738:25:14;;;726:2;711:18;526:43:12;592:177:14;7579:98:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;9035:200::-;;;;;;;;;;-1:-1:-1;9035:200:13;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1874:32:14;;;1856:51;;1844:2;1829:18;9035:200:13;1710:203:14;8612:362:13;;;;;;;;;;-1:-1:-1;8612:362:13;;;;;:::i;:::-;;:::i;:::-;;1381:28:12;;;;;;;;;;-1:-1:-1;1381:28:12;;;;-1:-1:-1;;;;;1381:28:12;;;3822:297:13;;;;;;;;;;-1:-1:-1;10932:1:12;4072:12:13;3866:7;4056:13;:28;-1:-1:-1;;4056:46:13;3822:297;;9874:164;;;;;;;;;;-1:-1:-1;9874:164:13;;;;;:::i;:::-;;:::i;10164:109:12:-;;;;;;;;;;-1:-1:-1;10164:109:12;;;;;:::i;:::-;;:::i;939:34::-;;;;;;;;;;;;;;;;1021:33;;;;;;;;;;;;;;;;1308:32;;;;;;;;;;;;;;;;10279:242;;;;;;;;;;;;;:::i;9496:63::-;;;;;;;;;;;;;:::i;10104:179:13:-;;;;;;;;;;-1:-1:-1;10104:179:13;;;;;:::i;:::-;;:::i;475:45:12:-;;;;;;;;;;;;516:4;475:45;;3929:1808;;;;;;:::i;:::-;;:::i;2455:98::-;;;;;;;;;;-1:-1:-1;2455:98:12;;;;;:::i;:::-;;:::i;1098:84:1:-;;;;;;;;;;-1:-1:-1;1168:7:1;;-1:-1:-1;;;1168:7:1;;;;1098:84;;840:30:12;;;;;;;;;;;;;;;;7394:123:13;;;;;;;;;;-1:-1:-1;7394:123:13;;;;;:::i;:::-;;:::i;1097:29:12:-;;;;;;;;;;;;;;;;424:21;;;;;;;;;;;;;:::i;4910:203:13:-;;;;;;;;;;-1:-1:-1;4910:203:13;;;;;:::i;:::-;;:::i;1668:101:0:-;;;;;;;;;;;;;:::i;8954:91:12:-;;;;;;;;;;-1:-1:-1;8954:91:12;;;;;:::i;:::-;;:::i;9431:59::-;;;;;;;;;;;;;:::i;8309:265::-;;;;;;;;;;-1:-1:-1;8309:265:12;;;;;:::i;:::-;;:::i;1036:85:0:-;;;;;;;;;;-1:-1:-1;1108:6:0;;-1:-1:-1;;;;;1108:6:0;1036:85;;7741:102:13;;;;;;;;;;;;;:::i;8919:28:12:-;;;;;;;;;;-1:-1:-1;8919:28:12;;;;-1:-1:-1;;;8919:28:12;;;;;;9302:282:13;;;;;;;;;;-1:-1:-1;9302:282:13;;;;;:::i;:::-;;:::i;9952:91:12:-;;;;;;;;;;-1:-1:-1;9996:7:12;4436:13:13;-1:-1:-1;;4436:31:13;9952:91:12;;3729:194;;;;;;;;;;-1:-1:-1;3729:194:12;;;;;:::i;:::-;;:::i;1266:36::-;;;;;;;;;;;;;;;;876:26;;;;;;;;;;;;;;;;7591:712;;;;;;;;;;-1:-1:-1;7591:712:12;;;;;:::i;:::-;;:::i;1346:29::-;;;;;;;;;;;;;;;;1209:51;;;;;;;;;;-1:-1:-1;1209:51:12;;;;;:::i;:::-;;;;;;;;;;;;;;2559:1164;;;;;;;;;;-1:-1:-1;2559:1164:12;;;;;:::i;:::-;;:::i;9051:357::-;;;;;;;;;;-1:-1:-1;9051:357:12;;;;;:::i;:::-;;:::i;10349:359:13:-;;;;;;;;;;-1:-1:-1;10349:359:13;;;;;:::i;:::-;;:::i;759:36:12:-;;;;;;;;;;;;;;;;678:48;;;;;;;;;;-1:-1:-1;678:48:12;;;;;:::i;:::-;;:::i;5743:595::-;;;;;;;;;;-1:-1:-1;5743:595:12;;;;;:::i;:::-;;:::i;7909:313:13:-;;;;;;;;;;-1:-1:-1;7909:313:13;;;;;:::i;:::-;;:::i;637:35:12:-;;;;;;;;;;;;;;;;10049:109;;;;;;;;;;-1:-1:-1;10049:109:12;;;;;:::i;:::-;;:::i;1060:31::-;;;;;;;;;;;;;;;;9650:162:13;;;;;;;;;;-1:-1:-1;9650:162:13;;;;;:::i;:::-;-1:-1:-1;;;;;9770:25:13;;;9747:4;9770:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;9650:162;1154:49:12;;;;;;;;;;-1:-1:-1;1154:49:12;;;;;:::i;:::-;;;;;;;;;;;;;;8580:308;;;;;;;;;;-1:-1:-1;8580:308:12;;;;;:::i;:::-;;:::i;1918:198:0:-;;;;;;;;;;-1:-1:-1;1918:198:0;;;;;:::i;:::-;;:::i;602:29:12:-;;;;;;;;;;;;;;;;801:33;;;;;;;;;;;;;;;;979:36;;;;;;;;;;;;;;;;4551:300:13;4653:4;-1:-1:-1;;;;;;4688:40:13;;-1:-1:-1;;;4688:40:13;;:104;;-1:-1:-1;;;;;;;4744:48:13;;-1:-1:-1;;;4744:48:13;4688:104;:156;;;-1:-1:-1;;;;;;;;;;937:40:10;;;4808:36:13;4669:175;4551:300;-1:-1:-1;;4551:300:13:o;7579:98::-;7633:13;7665:5;7658:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7579:98;:::o;9035:200::-;9103:7;9127:16;9135:7;9127;:16::i;:::-;9122:64;;9152:34;;-1:-1:-1;;;9152:34:13;;;;;;;;;;;9122:64;-1:-1:-1;9204:24:13;;;;:15;:24;;;;;;-1:-1:-1;;;;;9204:24:13;;9035:200::o;8612:362::-;8684:13;8700:24;8716:7;8700:15;:24::i;:::-;8684:40;;8744:5;-1:-1:-1;;;;;8738:11:13;:2;-1:-1:-1;;;;;8738:11:13;;8734:48;;;8758:24;;-1:-1:-1;;;8758:24:13;;;;;;;;;;;8734:48;719:10:7;-1:-1:-1;;;;;8797:21:13;;;;;;:63;;-1:-1:-1;8823:37:13;8840:5;719:10:7;9650:162:13;:::i;8823:37::-;8822:38;8797:63;8793:136;;;8883:35;;-1:-1:-1;;;8883:35:13;;;;;;;;;;;8793:136;8939:28;8948:2;8952:7;8961:5;8939:8;:28::i;:::-;8674:300;8612:362;;:::o;9874:164::-;10003:28;10013:4;10019:2;10023:7;10003:9;:28::i;10164:109:12:-;-1:-1:-1;;;;;5513:19:13;;10221:7:12;5513:19:13;;;:12;:19;;;;;:32;-1:-1:-1;;;5513:32:13;;-1:-1:-1;;;;;5513:32:13;10247:19:12;5418:135:13;10279:242:12;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:7;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;;;;;;;;;1744:1:2::1;2325:7;;:19;;2317:63;;;;-1:-1:-1::0;;;2317:63:2::1;;;;;;;:::i;:::-;1744:1;2455:7;:18:::0;10366:17:12::2;::::0;10347:15:::2;:36;;10339:63;;;::::0;-1:-1:-1;;;10339:63:12;;11346:2:14;10339:63:12::2;::::0;::::2;11328:21:14::0;11385:2;11365:18;;;11358:30;-1:-1:-1;;;11404:18:14;;;11397:44;11458:18;;10339:63:12::2;11144:338:14::0;10339:63:12::2;10431:49;::::0;10413:12:::2;::::0;10431:10:::2;::::0;10454:21:::2;::::0;10413:12;10431:49;10413:12;10431:49;10454:21;10431:10;:49:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10412:68;;;10498:7;10490:24;;;;-1:-1:-1::0;;;10490:24:12::2;;;;;;11899:2:14::0;11881:21;;;11938:1;11918:18;;;11911:29;-1:-1:-1;;;11971:2:14;11956:18;;11949:34;12015:2;12000:18;;11697:327;10490:24:12::2;-1:-1:-1::0;1701:1:2::1;2628:7;:22:::0;10279:242:12:o;9496:63::-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:7;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;9542:10:12::1;:8;:10::i;:::-;9496:63::o:0;10104:179:13:-;10237:39;10254:4;10260:2;10264:7;10237:39;;;;;;;;;;;;:16;:39::i;3929:1808:12:-;9892:9;9905:10;9892:23;9884:44;;;;-1:-1:-1;;;9884:44:12;;;;;;;:::i;:::-;1744:1:2::1;2325:7;;:19;;2317:63;;;;-1:-1:-1::0;;;2317:63:2::1;;;;;;;:::i;:::-;1744:1;2455:7;:18:::0;4196:21:12::2;::::0;4165:18:::2;::::0;:27:::2;::::0;4186:6;;4165:27:::2;:::i;:::-;:52;;:133;;;;-1:-1:-1::0;4275:23:12::2;::::0;4251:10:::2;5251:7:13::0;5285:19;;;:12;:19;;;;;:32;4265:6:12;;-1:-1:-1;;;5285:32:13;;-1:-1:-1;;;;;5285:32:13;4237:34:12::2;;;;:::i;:::-;:61;;4165:133;4144:197;;;::::0;-1:-1:-1;;;4144:197:12;;12832:2:14;4144:197:12::2;::::0;::::2;12814:21:14::0;12871:2;12851:18;;;12844:30;-1:-1:-1;;;12890:18:14;;;12883:47;12947:18;;4144:197:12::2;12630:341:14::0;4144:197:12::2;4384:2;4359:27:::0;::::2;;4351:56;;;::::0;-1:-1:-1;;;4351:56:12;;13178:2:14;4351:56:12::2;::::0;::::2;13160:21:14::0;13217:2;13197:18;;;13190:30;-1:-1:-1;;;13236:18:14;;;13229:46;13292:18;;4351:56:12::2;12976:340:14::0;4351:56:12::2;4417:29;4496:18;;4477:15;:37;;:88;;;;;4549:16;;4530:15;:35;;4477:88;4460:307;;;4614:142;4656:10;4684:20;4722;;4614:24;:142::i;:::-;4590:166;;4460:307;4780:26:::0;4776:907:::2;;4866:15;;4847;:34;;4822:116;;;::::0;-1:-1:-1;;;4822:116:12;;13523:2:14;4822:116:12::2;::::0;::::2;13505:21:14::0;13562:2;13542:18;;;13535:30;13601:25;13581:18;;;13574:53;13644:18;;4822:116:12::2;13321:347:14::0;4822:116:12::2;4952:28;4964:6;4972:7;;4952:11;:28::i;:::-;4994:35;5017:11;;5008:6;:20;;;;:::i;:::-;4994:13;:35::i;:::-;4776:907;;;5074:21;5064:6;:31;5060:613;;5115:31;5130:6;5138:7;;5115:14;:31::i;:::-;5164:38;5187:14;;5178:6;:23;;;;:::i;5060:613::-;5241:20;5264:30;5273:21:::0;5264:6;:30:::2;:::i;:::-;5241:53;;5312:24;5354:11;;5339:12;:26;;;;:::i;:::-;5312:53;;5383:27;5457:14;;5413:21;:58;;;;:::i;:::-;5383:88;;5489:34;5501:12;5515:7;;5489:11;:34::i;:::-;5541:46;5556:21;5579:7;;5541:14;:46::i;:::-;5605:53;5619:38;5638:19:::0;5619:16;:38:::2;:::i;5605:53::-;5223:450;;;5060:613;5697:33;5702:10;5714:6;5722:7;;5697:33;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;1701:1:2::1;2628:7;:22:::0;-1:-1:-1;;;;;3929:1808:12:o;2455:98::-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:7;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;2528:18:12::1;:7;2538:8:::0;;2528:18:::1;:::i;7394:123:13:-:0;7458:7;7484:21;7497:7;7484:12;:21::i;:::-;:26;;7394:123;-1:-1:-1;;7394:123:13:o;424:21:12:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4910:203:13:-;4974:7;-1:-1:-1;;;;;4997:19:13;;4993:60;;5025:28;;-1:-1:-1;;;5025:28:13;;;;;;;;;;;4993:60;-1:-1:-1;;;;;;5078:19:13;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;5078:27:13;;4910:203::o;1668:101:0:-;1108:6;;-1:-1:-1;;;;;1108:6:0;719:10:7;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;1732:30:::1;1759:1;1732:18;:30::i;8954:91:12:-:0;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:7;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;9018:8:12::1;:20:::0;;;::::1;;-1:-1:-1::0;;;9018:20:12::1;-1:-1:-1::0;;;;9018:20:12;;::::1;::::0;;;::::1;::::0;;8954:91::o;9431:59::-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:7;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;9475:8:12::1;:6;:8::i;8309:265::-:0;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:7;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;8437:14:12::1;;8427:6;8404:20;;:29;;;;:::i;:::-;:47;;8383:111;;;::::0;-1:-1:-1;;;8383:111:12;;12832:2:14;8383:111:12::1;::::0;::::1;12814:21:14::0;12871:2;12851:18;;;12844:30;-1:-1:-1;;;12890:18:14;;;12883:47;12947:18;;8383:111:12::1;12630:341:14::0;8383:111:12::1;8528:6;8504:20;;:30;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;8544:23:12::1;::::0;-1:-1:-1;8554:4:12;8560:6;8544:9:::1;:23::i;:::-;8309:265:::0;;:::o;7741:102:13:-;7797:13;7829:7;7822:14;;;;;:::i;9302:282::-;-1:-1:-1;;;;;9400:24:13;;719:10:7;9400:24:13;9396:54;;;9433:17;;-1:-1:-1;;;9433:17:13;;;;;;;;;;;9396:54;719:10:7;9461:32:13;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;9461:42:13;;;;;;;;;;;;:53;;-1:-1:-1;;9461:53:13;;;;;;;;;;9529:48;;540:41:14;;;9461:42:13;;719:10:7;9529:48:13;;513:18:14;9529:48:13;;;;;;;9302:282;;:::o;3729:194:12:-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:7;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;3848:12:12::1;:28:::0;;;;3886:13:::1;:30:::0;;-1:-1:-1;;;;;;3886:30:12::1;-1:-1:-1::0;;;;;3886:30:12;;::::1;::::0;;;::::1;::::0;;3729:194::o;7591:712::-;9892:9;9905:10;9892:23;9884:44;;;;-1:-1:-1;;;9884:44:12;;;;;;;:::i;:::-;1744:1:2::1;2325:7;;:19;;2317:63;;;;-1:-1:-1::0;;;2317:63:2::1;;;;;;;:::i;:::-;1744:1;2455:7;:18:::0;7707:19:12::2;::::0;7736:411:::2;7756:19:::0;;::::2;7736:411;;;7796:15;7814:8;;7823:1;7814:11;;;;;;;:::i;:::-;;;;;;;7796:29;;7861:16;7869:7;7861;:16::i;:::-;-1:-1:-1::0;;;;;7847:30:12::2;:10;-1:-1:-1::0;;;;;7847:30:12::2;;7839:52;;;::::0;-1:-1:-1;;;7839:52:12;;15002:2:14;7839:52:12::2;::::0;::::2;14984:21:14::0;15041:1;15021:18;;;15014:29;-1:-1:-1;;;15059:18:14;;;15052:39;15108:18;;7839:52:12::2;14800:332:14::0;7839:52:12::2;7949:25;::::0;;;:16:::2;:25;::::0;;;;;7930:15:::2;:44;;7905:117;;;::::0;-1:-1:-1;;;7905:117:12;;15339:2:14;7905:117:12::2;::::0;::::2;15321:21:14::0;15378:2;15358:18;;;15351:30;-1:-1:-1;;;15397:18:14;;;15390:44;15451:18;;7905:117:12::2;15137:338:14::0;7905:117:12::2;8061:13;::::0;8036:48:::2;::::0;8049:10:::2;::::0;-1:-1:-1;;;;;8061:13:12::2;8076:7:::0;8036:12:::2;:48::i;:::-;8113:23;::::0;;;:14:::2;:23;::::0;;;;;8098:38:::2;::::0;;::::2;:::i;:::-;;;7782:365;7777:3;;;;;:::i;:::-;;;;7736:411;;;;8174:8;;:15;;8156:14;;:33;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;8199:41:12::2;::::0;8207:10:::2;::::0;8199:41;::::2;;;::::0;8228:11;;8199:41:::2;::::0;;;8228:11;8207:10;8199:41;::::2;;;;;;;;;;;;;::::0;::::2;;;;;;8255;8262:10;8274:11;8287:8;;8255:41;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;1701:1:2::1;2628:7;:22:::0;-1:-1:-1;7591:712:12:o;2559:1164::-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:7;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;2977:14:12::1;;2958:15;:33;;:92;;;;;3030:20;;3011:15;:39;;2958:92;:159;;;;;3096:21;;3070:22;:47;;2958:159;:237;;;;-1:-1:-1::0;3163:32:12::1;3180:15:::0;516:4:::1;3163:32;:::i;:::-;3137:22;:58;;2958:237;:297;;;;;3238:17;3215:19;:40;;2958:297;2937:351;;;::::0;-1:-1:-1;;;2937:351:12;;16642:2:14;2937:351:12::1;::::0;::::1;16624:21:14::0;16681:1;16661:18;;;16654:29;-1:-1:-1;;;16699:18:14;;;16692:37;16746:18;;2937:351:12::1;16440:330:14::0;2937:351:12::1;3298:23;:50:::0;;;;3358:14:::1;:32:::0;;;;3400:21:::1;:46:::0;;;;3456:15:::1;:34:::0;;;;3500:11:::1;:26:::0;3536:19:::1;:42:::0;3588:18:::1;:40:::0;3638:16:::1;:36:::0;3684:14:::1;:32:::0;2559:1164::o;9051:357::-;9892:9;9905:10;9892:23;9884:44;;;;-1:-1:-1;;;9884:44:12;;;;;;;:::i;:::-;9132:8:::1;::::0;-1:-1:-1;;;9132:8:12;::::1;;;9124:33;;;::::0;-1:-1:-1;;;9124:33:12;;16977:2:14;9124:33:12::1;::::0;::::1;16959:21:14::0;17016:2;16996:18;;;16989:30;-1:-1:-1;;;17035:18:14;;;17028:42;17087:18;;9124:33:12::1;16775:336:14::0;9124:33:12::1;9172:9;9167:194;9187:19:::0;;::::1;9167:194;;;9227:15;9245:8;;9254:1;9245:11;;;;;;;:::i;:::-;;;;;;;9227:29;;9292:16;9300:7;9292;:16::i;:::-;-1:-1:-1::0;;;;;9278:30:12::1;:10;-1:-1:-1::0;;;;;9278:30:12::1;;9270:52;;;::::0;-1:-1:-1;;;9270:52:12;;15002:2:14;9270:52:12::1;::::0;::::1;14984:21:14::0;15041:1;15021:18;;;15014:29;-1:-1:-1;;;15059:18:14;;;15052:39;15108:18;;9270:52:12::1;14800:332:14::0;9270:52:12::1;9336:14;9342:7;9336:5;:14::i;:::-;-1:-1:-1::0;9208:3:12;::::1;::::0;::::1;:::i;:::-;;;;9167:194;;;;9375:26;9380:10;9392:8;;9375:26;;;;;;;;:::i;:::-;;;;;;;;9051:357:::0;;:::o;10349:359:13:-;10510:28;10520:4;10526:2;10530:7;10510:9;:28::i;:::-;-1:-1:-1;;;;;10552:13:13;;1465:19:6;:23;;10552:76:13;;;;;10572:56;10603:4;10609:2;10613:7;10622:5;10572:30;:56::i;:::-;10571:57;10552:76;10548:154;;;10651:40;;-1:-1:-1;;;10651:40:13;;;;;;;;;;;10548:154;10349:359;;;;:::o;678:48:12:-;;;;;;;;;;;;;;;;:::i;5743:595::-;5895:7;5918:16;5914:30;;-1:-1:-1;5943:1:12;5936:8;;5914:30;5954:20;5977:13;5985:4;5977:7;:13::i;:::-;-1:-1:-1;;;;;5954:36:12;;;6036:12;6021:11;:27;;:230;;;;;6068:183;6108:11;;6068:183;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6141:19:12;;6192:40;;-1:-1:-1;;17784:2:14;17780:15;;;17776:53;6192:40:12;;;17764:66:14;-1:-1:-1;;;17846:12:14;;;17839:25;17880:12;;;17873:28;;;6141:19:12;;-1:-1:-1;17917:12:14;;;-1:-1:-1;6192:40:12;;;;;;;;;;;;6182:51;;;;;;6068:18;:183::i;:::-;6000:288;;;;-1:-1:-1;;;6000:288:12;;18142:2:14;6000:288:12;;;18124:21:14;18181:2;18161:18;;;18154:30;-1:-1:-1;;;18200:18:14;;;18193:41;18251:18;;6000:288:12;17940:335:14;6000:288:12;6305:26;6319:12;6305:11;:26;:::i;:::-;6298:33;;;5743:595;;;;;;;:::o;7909:313:13:-;7982:13;8012:16;8020:7;8012;:16::i;:::-;8007:59;;8037:29;;-1:-1:-1;;;8037:29:13;;;;;;;;;;;8007:59;8077:21;8101:10;:8;:10::i;:::-;8077:34;;8134:7;8128:21;8153:1;8128:26;;:87;;;;;;;;;;;;;;;;;8181:7;8190:18;:7;:16;:18::i;:::-;8164:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;8128:87;8121:94;7909:313;-1:-1:-1;;;7909:313:13:o;10049:109:12:-;-1:-1:-1;;;;;5285:19:13;;10106:7:12;5285:19:13;;;:12;:19;;;;;:32;-1:-1:-1;;;5285:32:13;;-1:-1:-1;;;;;5285:32:13;10132:19:12;5190:135:13;8580:308:12;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:7;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;8718:36:12;;::::1;8710:56;;;::::0;-1:-1:-1;;;8710:56:12;;16642:2:14;8710:56:12::1;::::0;::::1;16624:21:14::0;16681:1;16661:18;;;16654:29;-1:-1:-1;;;16699:18:14;;;16692:37;16746:18;;8710:56:12::1;16440:330:14::0;8710:56:12::1;8781:9;8776:106;8796:19:::0;;::::1;8776:106;;;8836:35;8844:8;;8853:1;8844:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;8857:10;;8868:1;8857:13;;;;;;;:::i;:::-;;;;;;;8836:7;:35::i;:::-;8817:3:::0;::::1;::::0;::::1;:::i;:::-;;;;8776:106;;;;8580:308:::0;;;;:::o;1918:198:0:-;1108:6;;-1:-1:-1;;;;;1108:6:0;719:10:7;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2006:22:0;::::1;1998:73;;;::::0;-1:-1:-1;;;1998:73:0;;18957:2:14;1998:73:0::1;::::0;::::1;18939:21:14::0;18996:2;18976:18;;;18969:30;19035:34;19015:18;;;19008:62;-1:-1:-1;;;19086:18:14;;;19079:36;19132:19;;1998:73:0::1;18755:402:14::0;1998:73:0::1;2081:28;2100:8;2081:18;:28::i;:::-;1918:198:::0;:::o;10954:172:13:-;11011:4;11053:7;10932:1:12;11034:26:13;;:53;;;;;11074:13;;11064:7;:23;11034:53;:85;;;;-1:-1:-1;;11092:20:13;;;;:11;:20;;;;;:27;-1:-1:-1;;;11092:27:13;;;;11091:28;;10954:172::o;18894:189::-;19004:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;19004:29:13;-1:-1:-1;;;;;19004:29:13;;;;;;;;;19048:28;;19004:24;;19048:28;;;;;;;18894:189;;;:::o;13964:2082::-;14074:35;14112:21;14125:7;14112:12;:21::i;:::-;14074:59;;14170:4;-1:-1:-1;;;;;14148:26:13;:13;:18;;;-1:-1:-1;;;;;14148:26:13;;14144:67;;14183:28;;-1:-1:-1;;;14183:28:13;;;;;;;;;;;14144:67;14222:22;719:10:7;-1:-1:-1;;;;;14248:20:13;;;;:72;;-1:-1:-1;14284:36:13;14301:4;719:10:7;9650:162:13;:::i;14284:36::-;14248:124;;;-1:-1:-1;719:10:7;14336:20:13;14348:7;14336:11;:20::i;:::-;-1:-1:-1;;;;;14336:36:13;;14248:124;14222:151;;14389:17;14384:66;;14415:35;;-1:-1:-1;;;14415:35:13;;;;;;;;;;;14384:66;-1:-1:-1;;;;;14464:16:13;;14460:52;;14489:23;;-1:-1:-1;;;14489:23:13;;;;;;;;;;;14460:52;14523:43;14545:4;14551:2;14555:7;14564:1;14523:21;:43::i;:::-;14628:35;14645:1;14649:7;14658:4;14628:8;:35::i;:::-;-1:-1:-1;;;;;14953:18:13;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;14953:31:13;;;-1:-1:-1;;;;;14953:31:13;;;-1:-1:-1;;14953:31:13;;;;;;;14998:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;14998:29:13;;;;;;;;;;;15076:20;;;:11;:20;;;;;;15110:18;;-1:-1:-1;;;;;;15142:49:13;;;;-1:-1:-1;;;15175:15:13;15142:49;;;;;;;;;;15461:11;;15520:24;;;;;15562:13;;15076:20;;15520:24;;15562:13;15558:377;;15769:13;;15754:11;:28;15750:171;;15806:20;;15874:28;;;;-1:-1:-1;;;;;15848:54:13;-1:-1:-1;;;15848:54:13;-1:-1:-1;;;;;;15848:54:13;;;-1:-1:-1;;;;;15806:20:13;;15848:54;;;;15750:171;14929:1016;;;15979:7;15975:2;-1:-1:-1;;;;;15960:27:13;15969:4;-1:-1:-1;;;;;15960:27:13;-1:-1:-1;;;;;;;;;;;15960:27:13;;;;;;;;;15997:42;10349:359;2110:117:1;1168:7;;-1:-1:-1;;;1168:7:1;;;;1669:41;;;;-1:-1:-1;;;1669:41:1;;19364:2:14;1669:41:1;;;19346:21:14;19403:2;19383:18;;;19376:30;-1:-1:-1;;;19422:18:14;;;19415:50;19482:18;;1669:41:1;19162:344:14;1669:41:1;2168:7:::1;:15:::0;;-1:-1:-1;;;;2168:15:1::1;::::0;;2198:22:::1;719:10:7::0;2207:12:1::1;2198:22;::::0;-1:-1:-1;;;;;1874:32:14;;;1856:51;;1844:2;1829:18;2198:22:1::1;;;;;;;2110:117::o:0;6344:273:12:-;6446:6;6424:18;;:28;;;;;;;:::i;:::-;;;;;;;;6462:42;6475:6;6483:11;;6496:7;;6462:12;:42::i;:::-;6514:29;6524:10;6536:6;6514:9;:29::i;:::-;6558:52;6569:10;6581:6;6589:11;;6602:7;;6558:52;;;;;;;;;;:::i;:::-;;;;;;;;6344:273;;;:::o;10527:212::-;10604:5;10591:9;:18;;10583:45;;;;-1:-1:-1;;;10583:45:12;;20206:2:14;10583:45:12;;;20188:21:14;20245:2;20225:18;;;20218:30;-1:-1:-1;;;20264:18:14;;;20257:44;20318:18;;10583:45:12;20004:338:14;10583:45:12;10654:5;10642:9;:17;10638:95;;;10683:10;10675:47;10704:17;10716:5;10704:9;:17;:::i;:::-;10675:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6623:393;6728:6;6706:18;;:28;;;;;;;:::i;:::-;;;;;;;;6769:6;6744:21;;:31;;;;;;;:::i;:::-;;;;-1:-1:-1;6785:57:12;;-1:-1:-1;6793:10:12;6834:6;6805:19;6793:10;6805:7;:19::i;:::-;:36;;;;:::i;:::-;-1:-1:-1;;;;;6021:19:13;;;;;;;:12;:19;;;;;:29;;-1:-1:-1;;;;;6021:29:13;;;-1:-1:-1;;;6021:29:13;-1:-1:-1;;;;;6021:29:13;;;;;;;;;5958:99;6785:57:12;6852:45;6865:6;6873:14;;6889:7;;6852:12;:45::i;:::-;6907:29;6917:10;6929:6;6907:9;:29::i;:::-;6951:58;6965:10;6977:6;6985:14;;7001:7;;6951:58;;;;;;;;;;:::i;6253:1084:13:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;6363:7:13;;10932:1:12;6409:23:13;;:47;;;;;6443:13;;6436:4;:20;6409:47;6405:868;;;6476:31;6510:17;;;:11;:17;;;;;;;;;6476:51;;;;;;;;;-1:-1:-1;;;;;6476:51:13;;;;-1:-1:-1;;;6476:51:13;;-1:-1:-1;;;;;6476:51:13;;;;;;;;-1:-1:-1;;;6476:51:13;;;;;;;;;;;;;;6545:714;;6594:14;;-1:-1:-1;;;;;6594:28:13;;6590:99;;6657:9;6253:1084;-1:-1:-1;;;6253:1084:13:o;6590:99::-;-1:-1:-1;;;7025:6:13;7069:17;;;;:11;:17;;;;;;;;;7057:29;;;;;;;;;-1:-1:-1;;;;;7057:29:13;;;;;-1:-1:-1;;;7057:29:13;;-1:-1:-1;;;;;7057:29:13;;;;;;;;-1:-1:-1;;;7057:29:13;;;;;;;;;;;;;7116:28;7112:107;;7183:9;6253:1084;-1:-1:-1;;;6253:1084:13:o;7112:107::-;6986:255;;;6458:815;6405:868;7299:31;;-1:-1:-1;;;7299:31:13;;;;;;;;;;;2270:187:0;2362:6;;;-1:-1:-1;;;;;2378:17:0;;;-1:-1:-1;;;;;;2378:17:0;;;;;;;2410:40;;2362:6;;;2378:17;2362:6;;2410:40;;2343:16;;2410:40;2333:124;2270:187;:::o;1863:115:1:-;1168:7;;-1:-1:-1;;;1168:7:1;;;;1411:9;1403:38;;;;-1:-1:-1;;;1403:38:1;;20790:2:14;1403:38:1;;;20772:21:14;20829:2;20809:18;;;20802:30;-1:-1:-1;;;20848:18:14;;;20841:46;20904:18;;1403:38:1;20588:340:14;1403:38:1;1922:7:::1;:14:::0;;-1:-1:-1;;;;1922:14:1::1;-1:-1:-1::0;;;1922:14:1::1;::::0;;1951:20:::1;1958:12;719:10:7::0;;640:96;11132:102:13;11200:27;11210:2;11214:8;11200:27;;;;;;;;;;;;:9;:27::i;16124:87::-;16183:21;16189:7;16198:5;16183;:21::i;19564:650::-;19742:72;;-1:-1:-1;;;19742:72:13;;19722:4;;-1:-1:-1;;;;;19742:36:13;;;;;:72;;719:10:7;;19793:4:13;;19799:7;;19808:5;;19742:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19742:72:13;;;;;;;;-1:-1:-1;;19742:72:13;;;;;;;;;;;;:::i;:::-;;;19738:470;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19973:13:13;;19969:229;;20018:40;;-1:-1:-1;;;20018:40:13;;;;;;;;;;;19969:229;20158:6;20152:13;20143:6;20139:2;20135:15;20128:38;19738:470;-1:-1:-1;;;;;;19860:55:13;-1:-1:-1;;;19860:55:13;;-1:-1:-1;19853:62:13;;5666:110;-1:-1:-1;;;;;5746:19:13;5721:6;5746:19;;;:12;:19;;;;;:23;-1:-1:-1;;;5746:23:13;;-1:-1:-1;;;;;5746:23:13;;5666:110::o;862:184:9:-;983:4;1035;1006:25;1019:5;1026:4;1006:12;:25::i;:::-;:33;;862:184;-1:-1:-1;;;;862:184:9:o;10745:98:12:-;10797:13;10829:7;10822:14;;;;;:::i;328:703:8:-;384:13;601:10;597:51;;-1:-1:-1;;627:10:8;;;;;;;;;;;;-1:-1:-1;;;627:10:8;;;;;328:703::o;597:51::-;672:5;657:12;711:75;718:9;;711:75;;743:8;;;;:::i;:::-;;-1:-1:-1;765:10:8;;-1:-1:-1;773:2:8;765:10;;:::i;:::-;;;711:75;;;795:19;827:6;-1:-1:-1;;;;;817:17:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;817:17:8;;795:39;;844:150;851:10;;844:150;;877:11;887:1;877:11;;:::i;:::-;;-1:-1:-1;945:10:8;953:2;945:5;:10;:::i;:::-;932:24;;:2;:24;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;902:56:8;;;;;;;;-1:-1:-1;972:11:8;981:2;972:11;;:::i;:::-;;;844:150;;9565:265:12;1168:7:1;;-1:-1:-1;;;1168:7:1;;;;9803:9:12;9795:28;;;;-1:-1:-1;;;9795:28:12;;22257:2:14;9795:28:12;;;22239:21:14;22296:1;22276:18;;;22269:29;-1:-1:-1;;;22314:18:14;;;22307:36;22360:18;;9795:28:12;22055:329:14;7022:563:12;7148:13;7164;;;7206:14;7214:6;7164:13;7206:14;:::i;:::-;7187:33;;7230:15;7266:12;;7248:15;:30;;;;:::i;:::-;7230:48;;7288:197;7305:21;;;;:14;:21;;;;;;;;:29;;;7348:16;:23;;;;;:33;;;7395:14;:21;;;;;:31;;7419:7;;7395:31;:::i;:::-;-1:-1:-1;7440:7:12;;;;:::i;:::-;;;;7475:8;7466:5;:17;;7288:197;;7508:17;;7498:7;:27;7494:85;;;7541:17;:27;;;7494:85;7138:447;;;7022:563;;;;:::o;11585:157:13:-;11703:32;11709:2;11713:8;11723:5;11730:4;11703:5;:32::i;16428:2355::-;16507:35;16545:21;16558:7;16545:12;:21::i;:::-;16592:18;;16507:59;;-1:-1:-1;16621:284:13;;;;16654:22;719:10:7;-1:-1:-1;;;;;16680:20:13;;;;:76;;-1:-1:-1;16720:36:13;16737:4;719:10:7;9650:162:13;:::i;16720:36::-;16680:132;;;-1:-1:-1;719:10:7;16776:20:13;16788:7;16776:11;:20::i;:::-;-1:-1:-1;;;;;16776:36:13;;16680:132;16654:159;;16833:17;16828:66;;16859:35;;-1:-1:-1;;;16859:35:13;;;;;;;;;;;16828:66;16640:265;16621:284;16915:51;16937:4;16951:1;16955:7;16964:1;16915:21;:51::i;:::-;17028:35;17045:1;17049:7;17058:4;17028:8;:35::i;:::-;-1:-1:-1;;;;;17387:18:13;;;17353:31;17387:18;;;:12;:18;;;;;;;;17419:24;;-1:-1:-1;;;;;;;;;;17419:24:13;;;;;;;;;-1:-1:-1;;17419:24:13;;;;17457:29;;;;;17442:1;17457:29;;;;;;;;-1:-1:-1;;17457:29:13;;;;;;;;;;17616:20;;;:11;:20;;;;;;17650;;-1:-1:-1;;;;17717:15:13;17684:49;;;-1:-1:-1;;;17684:49:13;-1:-1:-1;;;;;;17684:49:13;;;;;;;;;;17747:22;-1:-1:-1;;;17747:22:13;;;18035:11;;;18094:24;;;;;18136:13;;17387:18;;18094:24;;18136:13;18132:377;;18343:13;;18328:11;:28;18324:171;;18380:20;;18448:28;;;;-1:-1:-1;;;;;18422:54:13;-1:-1:-1;;;18422:54:13;-1:-1:-1;;;;;;18422:54:13;;;-1:-1:-1;;;;;18380:20:13;;18422:54;;;;18324:171;-1:-1:-1;;18534:35:13;;18561:7;;-1:-1:-1;18557:1:13;;-1:-1:-1;;;;;;18534:35:13;;;-1:-1:-1;;;;;;;;;;;18534:35:13;18557:1;;18534:35;-1:-1:-1;;18752:12:13;:14;;;;;;-1:-1:-1;;16428:2355:13:o;1398:662:9:-;1481:7;1523:4;1481:7;1537:488;1561:5;:12;1557:1;:16;1537:488;;;1594:20;1617:5;1623:1;1617:8;;;;;;;;:::i;:::-;;;;;;;1594:31;;1659:12;1643;:28;1639:376;;2134:13;2182:15;;;2217:4;2210:15;;;2263:4;2247:21;;1769:57;;1639:376;;;2134:13;2182:15;;;2217:4;2210:15;;;2263:4;2247:21;;1943:57;;1639:376;-1:-1:-1;1575:3:9;;;;:::i;:::-;;;;1537:488;;;-1:-1:-1;2041:12:9;1398:662;-1:-1:-1;;;1398:662:9:o;11989:1733:13:-;12122:20;12145:13;-1:-1:-1;;;;;12172:16:13;;12168:48;;12197:19;;-1:-1:-1;;;12197:19:13;;;;;;;;;;;12168:48;12230:13;12226:44;;12252:18;;-1:-1:-1;;;12252:18:13;;;;;;;;;;;12226:44;12281:61;12311:1;12315:2;12319:12;12333:8;12281:21;:61::i;:::-;-1:-1:-1;;;;;12613:16:13;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;12671:49:13;;-1:-1:-1;;;;;12613:44:13;;;;;;;12671:49;;;-1:-1:-1;;;;;12613:44:13;;;;;;12671:49;;;;;;;;;;;;;;;;12735:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;12784:66:13;;;;-1:-1:-1;;;12834:15:13;12784:66;;;;;;;;;;12735:25;12928:23;;;12970:4;:23;;;;-1:-1:-1;;;;;;12978:13:13;;1465:19:6;:23;;12978:15:13;12966:628;;;13013:309;13043:38;;13068:12;;-1:-1:-1;;;;;13043:38:13;;;13060:1;;-1:-1:-1;;;;;;;;;;;13043:38:13;13060:1;;13043:38;13108:69;13147:1;13151:2;13155:14;;;;;;13171:5;13108:30;:69::i;:::-;13103:172;;13212:40;;-1:-1:-1;;;13212:40:13;;;;;;;;;;;13103:172;13317:3;13301:12;:19;;13013:309;;13401:12;13384:13;;:29;13380:43;;13415:8;;;13380:43;12966:628;;;13462:118;13492:40;;13517:14;;;;;-1:-1:-1;;;;;13492:40:13;;;13509:1;;-1:-1:-1;;;;;;;;;;;13492:40:13;13509:1;;13492:40;13575:3;13559:12;:19;;13462:118;;12966:628;-1:-1:-1;13607:13:13;:28;13655:60;10349:359;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:14;-1:-1:-1;;;;;;88:32:14;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;774:258::-;846:1;856:113;870:6;867:1;864:13;856:113;;;946:11;;;940:18;927:11;;;920:39;892:2;885:10;856:113;;;987:6;984:1;981:13;978:48;;;-1:-1:-1;;1022:1:14;1004:16;;997:27;774:258::o;1037:::-;1079:3;1117:5;1111:12;1144:6;1139:3;1132:19;1160:63;1216:6;1209:4;1204:3;1200:14;1193:4;1186:5;1182:16;1160:63;:::i;:::-;1277:2;1256:15;-1:-1:-1;;1252:29:14;1243:39;;;;1284:4;1239:50;;1037:258;-1:-1:-1;;1037:258:14:o;1300:220::-;1449:2;1438:9;1431:21;1412:4;1469:45;1510:2;1499:9;1495:18;1487:6;1469:45;:::i;1525:180::-;1584:6;1637:2;1625:9;1616:7;1612:23;1608:32;1605:52;;;1653:1;1650;1643:12;1605:52;-1:-1:-1;1676:23:14;;1525:180;-1:-1:-1;1525:180:14:o;1918:173::-;1986:20;;-1:-1:-1;;;;;2035:31:14;;2025:42;;2015:70;;2081:1;2078;2071:12;2015:70;1918:173;;;:::o;2096:254::-;2164:6;2172;2225:2;2213:9;2204:7;2200:23;2196:32;2193:52;;;2241:1;2238;2231:12;2193:52;2264:29;2283:9;2264:29;:::i;:::-;2254:39;2340:2;2325:18;;;;2312:32;;-1:-1:-1;;;2096:254:14:o;2355:328::-;2432:6;2440;2448;2501:2;2489:9;2480:7;2476:23;2472:32;2469:52;;;2517:1;2514;2507:12;2469:52;2540:29;2559:9;2540:29;:::i;:::-;2530:39;;2588:38;2622:2;2611:9;2607:18;2588:38;:::i;:::-;2578:48;;2673:2;2662:9;2658:18;2645:32;2635:42;;2355:328;;;;;:::o;2688:186::-;2747:6;2800:2;2788:9;2779:7;2775:23;2771:32;2768:52;;;2816:1;2813;2806:12;2768:52;2839:29;2858:9;2839:29;:::i;3061:367::-;3124:8;3134:6;3188:3;3181:4;3173:6;3169:17;3165:27;3155:55;;3206:1;3203;3196:12;3155:55;-1:-1:-1;3229:20:14;;-1:-1:-1;;;;;3261:30:14;;3258:50;;;3304:1;3301;3294:12;3258:50;3341:4;3333:6;3329:17;3317:29;;3401:3;3394:4;3384:6;3381:1;3377:14;3369:6;3365:27;3361:38;3358:47;3355:67;;;3418:1;3415;3408:12;3355:67;3061:367;;;;;:::o;3433:348::-;3485:8;3495:6;3549:3;3542:4;3534:6;3530:17;3526:27;3516:55;;3567:1;3564;3557:12;3516:55;-1:-1:-1;3590:20:14;;-1:-1:-1;;;;;3622:30:14;;3619:50;;;3665:1;3662;3655:12;3619:50;3702:4;3694:6;3690:17;3678:29;;3754:3;3747:4;3738:6;3730;3726:19;3722:30;3719:39;3716:59;;;3771:1;3768;3761:12;3786:884;3911:6;3919;3927;3935;3943;3951;4004:3;3992:9;3983:7;3979:23;3975:33;3972:53;;;4021:1;4018;4011:12;3972:53;4057:9;4044:23;4034:33;;4114:2;4103:9;4099:18;4086:32;4076:42;;4169:2;4158:9;4154:18;4141:32;-1:-1:-1;;;;;4233:2:14;4225:6;4222:14;4219:34;;;4249:1;4246;4239:12;4219:34;4288:70;4350:7;4341:6;4330:9;4326:22;4288:70;:::i;:::-;4377:8;;-1:-1:-1;4262:96:14;-1:-1:-1;4465:2:14;4450:18;;4437:32;;-1:-1:-1;4481:16:14;;;4478:36;;;4510:1;4507;4500:12;4478:36;;4549:61;4602:7;4591:8;4580:9;4576:24;4549:61;:::i;:::-;3786:884;;;;-1:-1:-1;3786:884:14;;-1:-1:-1;3786:884:14;;4629:8;;3786:884;-1:-1:-1;;;3786:884:14:o;4675:411::-;4746:6;4754;4807:2;4795:9;4786:7;4782:23;4778:32;4775:52;;;4823:1;4820;4813:12;4775:52;4863:9;4850:23;-1:-1:-1;;;;;4888:6:14;4885:30;4882:50;;;4928:1;4925;4918:12;4882:50;4967:59;5018:7;5009:6;4998:9;4994:22;4967:59;:::i;:::-;5045:8;;4941:85;;-1:-1:-1;4675:411:14;-1:-1:-1;;;;4675:411:14:o;5091:160::-;5156:20;;5212:13;;5205:21;5195:32;;5185:60;;5241:1;5238;5231:12;5256:180;5312:6;5365:2;5353:9;5344:7;5340:23;5336:32;5333:52;;;5381:1;5378;5371:12;5333:52;5404:26;5420:9;5404:26;:::i;5441:254::-;5506:6;5514;5567:2;5555:9;5546:7;5542:23;5538:32;5535:52;;;5583:1;5580;5573:12;5535:52;5606:29;5625:9;5606:29;:::i;:::-;5596:39;;5654:35;5685:2;5674:9;5670:18;5654:35;:::i;:::-;5644:45;;5441:254;;;;;:::o;5700:::-;5768:6;5776;5829:2;5817:9;5808:7;5804:23;5800:32;5797:52;;;5845:1;5842;5835:12;5797:52;5881:9;5868:23;5858:33;;5910:38;5944:2;5933:9;5929:18;5910:38;:::i;5959:437::-;6045:6;6053;6106:2;6094:9;6085:7;6081:23;6077:32;6074:52;;;6122:1;6119;6112:12;6074:52;6162:9;6149:23;-1:-1:-1;;;;;6187:6:14;6184:30;6181:50;;;6227:1;6224;6217:12;6181:50;6266:70;6328:7;6319:6;6308:9;6304:22;6266:70;:::i;6401:730::-;6532:6;6540;6548;6556;6564;6572;6580;6588;6596;6649:3;6637:9;6628:7;6624:23;6620:33;6617:53;;;6666:1;6663;6656:12;6617:53;-1:-1:-1;;6689:23:14;;;6759:2;6744:18;;6731:32;;-1:-1:-1;6810:2:14;6795:18;;6782:32;;6861:2;6846:18;;6833:32;;-1:-1:-1;6912:3:14;6897:19;;6884:33;;-1:-1:-1;6964:3:14;6949:19;;6936:33;;-1:-1:-1;7016:3:14;7001:19;;6988:33;;-1:-1:-1;7068:3:14;7053:19;;7040:33;;-1:-1:-1;7120:3:14;7105:19;7092:33;;-1:-1:-1;6401:730:14;-1:-1:-1;6401:730:14:o;7136:127::-;7197:10;7192:3;7188:20;7185:1;7178:31;7228:4;7225:1;7218:15;7252:4;7249:1;7242:15;7268:1138;7363:6;7371;7379;7387;7440:3;7428:9;7419:7;7415:23;7411:33;7408:53;;;7457:1;7454;7447:12;7408:53;7480:29;7499:9;7480:29;:::i;:::-;7470:39;;7528:38;7562:2;7551:9;7547:18;7528:38;:::i;:::-;7518:48;;7613:2;7602:9;7598:18;7585:32;7575:42;;7668:2;7657:9;7653:18;7640:32;-1:-1:-1;;;;;7732:2:14;7724:6;7721:14;7718:34;;;7748:1;7745;7738:12;7718:34;7786:6;7775:9;7771:22;7761:32;;7831:7;7824:4;7820:2;7816:13;7812:27;7802:55;;7853:1;7850;7843:12;7802:55;7889:2;7876:16;7911:2;7907;7904:10;7901:36;;;7917:18;;:::i;:::-;7992:2;7986:9;7960:2;8046:13;;-1:-1:-1;;8042:22:14;;;8066:2;8038:31;8034:40;8022:53;;;8090:18;;;8110:22;;;8087:46;8084:72;;;8136:18;;:::i;:::-;8176:10;8172:2;8165:22;8211:2;8203:6;8196:18;8251:7;8246:2;8241;8237;8233:11;8229:20;8226:33;8223:53;;;8272:1;8269;8262:12;8223:53;8328:2;8323;8319;8315:11;8310:2;8302:6;8298:15;8285:46;8373:1;8368:2;8363;8355:6;8351:15;8347:24;8340:35;8394:6;8384:16;;;;;;;7268:1138;;;;;;;:::o;8411:579::-;8515:6;8523;8531;8539;8592:2;8580:9;8571:7;8567:23;8563:32;8560:52;;;8608:1;8605;8598:12;8560:52;8631:29;8650:9;8631:29;:::i;:::-;8621:39;;8707:2;8696:9;8692:18;8679:32;8669:42;;8762:2;8751:9;8747:18;8734:32;-1:-1:-1;;;;;8781:6:14;8778:30;8775:50;;;8821:1;8818;8811:12;8775:50;8860:70;8922:7;8913:6;8902:9;8898:22;8860:70;:::i;:::-;8411:579;;;;-1:-1:-1;8949:8:14;-1:-1:-1;;;;8411:579:14:o;8995:260::-;9063:6;9071;9124:2;9112:9;9103:7;9099:23;9095:32;9092:52;;;9140:1;9137;9130:12;9092:52;9163:29;9182:9;9163:29;:::i;:::-;9153:39;;9211:38;9245:2;9234:9;9230:18;9211:38;:::i;9260:773::-;9382:6;9390;9398;9406;9459:2;9447:9;9438:7;9434:23;9430:32;9427:52;;;9475:1;9472;9465:12;9427:52;9515:9;9502:23;-1:-1:-1;;;;;9585:2:14;9577:6;9574:14;9571:34;;;9601:1;9598;9591:12;9571:34;9640:70;9702:7;9693:6;9682:9;9678:22;9640:70;:::i;:::-;9729:8;;-1:-1:-1;9614:96:14;-1:-1:-1;9817:2:14;9802:18;;9789:32;;-1:-1:-1;9833:16:14;;;9830:36;;;9862:1;9859;9852:12;9830:36;;9901:72;9965:7;9954:8;9943:9;9939:24;9901:72;:::i;10038:380::-;10117:1;10113:12;;;;10160;;;10181:61;;10235:4;10227:6;10223:17;10213:27;;10181:61;10288:2;10280:6;10277:14;10257:18;10254:38;10251:161;;;10334:10;10329:3;10325:20;10322:1;10315:31;10369:4;10366:1;10359:15;10397:4;10394:1;10387:15;10251:161;;10038:380;;;:::o;10423:356::-;10625:2;10607:21;;;10644:18;;;10637:30;10703:34;10698:2;10683:18;;10676:62;10770:2;10755:18;;10423:356::o;10784:355::-;10986:2;10968:21;;;11025:2;11005:18;;;10998:30;11064:33;11059:2;11044:18;;11037:61;11130:2;11115:18;;10784:355::o;12029:331::-;12231:2;12213:21;;;12270:1;12250:18;;;12243:29;-1:-1:-1;;;12303:2:14;12288:18;;12281:38;12351:2;12336:18;;12029:331::o;12365:127::-;12426:10;12421:3;12417:20;12414:1;12407:31;12457:4;12454:1;12447:15;12481:4;12478:1;12471:15;12497:128;12537:3;12568:1;12564:6;12561:1;12558:13;12555:39;;;12574:18;;:::i;:::-;-1:-1:-1;12610:9:14;;12497:128::o;13673:168::-;13713:7;13779:1;13775;13771:6;13767:14;13764:1;13761:21;13756:1;13749:9;13742:17;13738:45;13735:71;;;13786:18;;:::i;:::-;-1:-1:-1;13826:9:14;;13673:168::o;13846:125::-;13886:4;13914:1;13911;13908:8;13905:34;;;13919:18;;:::i;:::-;-1:-1:-1;13956:9:14;;13846:125::o;13976:267::-;14065:6;14060:3;14053:19;14117:6;14110:5;14103:4;14098:3;14094:14;14081:43;-1:-1:-1;14169:1:14;14144:16;;;14162:4;14140:27;;;14133:38;;;;14225:2;14204:15;;;-1:-1:-1;;14200:29:14;14191:39;;;14187:50;;13976:267::o;14248:415::-;14492:1;14488;14483:3;14479:11;14475:19;14467:6;14463:32;14452:9;14445:51;14532:6;14527:2;14516:9;14512:18;14505:34;14575:2;14570;14559:9;14555:18;14548:30;14426:4;14595:62;14653:2;14642:9;14638:18;14630:6;14622;14595:62;:::i;:::-;14587:70;14248:415;-1:-1:-1;;;;;;14248:415:14:o;14668:127::-;14729:10;14724:3;14720:20;14717:1;14710:31;14760:4;14757:1;14750:15;14784:4;14781:1;14774:15;15480:135;15519:3;-1:-1:-1;;15540:17:14;;15537:43;;;15560:18;;:::i;:::-;-1:-1:-1;15607:1:14;15596:13;;15480:135::o;15620:354::-;15708:19;;;15690:3;-1:-1:-1;;;;;15739:31:14;;15736:51;;;15783:1;15780;15773:12;15736:51;15819:6;15816:1;15812:14;15871:8;15864:5;15857:4;15852:3;15848:14;15835:45;15948:1;15903:18;;15923:4;15899:29;15937:13;;;-1:-1:-1;15899:29:14;;15620:354;-1:-1:-1;;15620:354:14:o;15979:456::-;16253:1;16249;16244:3;16240:11;16236:19;16228:6;16224:32;16213:9;16206:51;16293:6;16288:2;16277:9;16273:18;16266:34;16336:2;16331;16320:9;16316:18;16309:30;16187:4;16356:73;16425:2;16414:9;16410:18;16402:6;16394;16356:73;:::i;17116:385::-;-1:-1:-1;;;;;17333:32:14;;17315:51;;17402:2;17397;17382:18;;17375:30;;;-1:-1:-1;;17422:73:14;;17476:18;;17468:6;17460;17422:73;:::i;:::-;17414:81;17116:385;-1:-1:-1;;;;;17116:385:14:o;18280:470::-;18459:3;18497:6;18491:13;18513:53;18559:6;18554:3;18547:4;18539:6;18535:17;18513:53;:::i;:::-;18629:13;;18588:16;;;;18651:57;18629:13;18588:16;18685:4;18673:17;;18651:57;:::i;:::-;18724:20;;18280:470;-1:-1:-1;;;;18280:470:14:o;19511:488::-;19783:1;19779;19774:3;19770:11;19766:19;19758:6;19754:32;19743:9;19736:51;19823:6;19818:2;19807:9;19803:18;19796:34;19866:6;19861:2;19850:9;19846:18;19839:34;19909:3;19904:2;19893:9;19889:18;19882:31;19717:4;19930:63;19988:3;19977:9;19973:19;19965:6;19957;19930:63;:::i;:::-;19922:71;19511:488;-1:-1:-1;;;;;;;19511:488:14:o;20347:236::-;20386:3;-1:-1:-1;;;;;20459:2:14;20456:1;20452:10;20489:2;20486:1;20482:10;20520:3;20516:2;20512:12;20507:3;20504:21;20501:47;;;20528:18;;:::i;20933:489::-;-1:-1:-1;;;;;21202:15:14;;;21184:34;;21254:15;;21249:2;21234:18;;21227:43;21301:2;21286:18;;21279:34;;;21349:3;21344:2;21329:18;;21322:31;;;21127:4;;21370:46;;21396:19;;21388:6;21370:46;:::i;21427:249::-;21496:6;21549:2;21537:9;21528:7;21524:23;21520:32;21517:52;;;21565:1;21562;21555:12;21517:52;21597:9;21591:16;21616:30;21640:5;21616:30;:::i;21681:127::-;21742:10;21737:3;21733:20;21730:1;21723:31;21773:4;21770:1;21763:15;21797:4;21794:1;21787:15;21813:120;21853:1;21879;21869:35;;21884:18;;:::i;:::-;-1:-1:-1;21918:9:14;;21813:120::o;21938:112::-;21970:1;21996;21986:35;;22001:18;;:::i;:::-;-1:-1:-1;22035:9:14;;21938:112::o

Swarm Source

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