ETH Price: $3,410.34 (+1.75%)
Gas: 6 Gwei

Token

YING: Hello New World (YING)
 

Overview

Max Total Supply

2,062 YING

Holders

380

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 YING
0x96236077bef8c1B9A91Ed92fe90694c2925c69f0
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:
YINGHelloNewWorld

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
File 1 of 22 : YINGHelloNewWorld.sol
// SPDX-License-Identifier: MIT
/*
+ + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + +
+                                                                                                                 +
+                                                                                                                 +
.                        .^!!~:                                                 .^!!^.                            .
.                            :7Y5Y7^.                                       .^!J5Y7^.                             .
.                              :!5B#GY7^.                             .^!JP##P7:                                  .
.   7777??!         ~????7.        :5@@@@&GY7^.                    .^!JG#@@@@G^        7????????????^ ~????77     .
.   @@@@@G          P@@@@@:       J#@@@@@@@@@@&G57~.          .^7YG#@@@@@@@@@@&5:      #@@@@@@@@@@@@@? P@@@@@@    .
.   @@@@@G          5@@@@@:     :B@@@@@BJG@@@@@@@@@&B5?~:^7YG#@@@@@@@@BJP@@@ @@&!!     #@@@@@@@@@@@@@? P@@@@@@    .
.   @@@@@G          5@@@@@:    .B@@@@#!!J@@@@@@@@@@@@@@@&@@@@@@@@@@@@@@@P   ^G@@@@@~.   ^~~~~~^J@ @@@@??:~~~~~    .
.   @@@@@B^^^^^^^^. 5@@@@@:   J@@@@&^   G@7?@@@@@@&@@@@@@@@@@@&@J7&@@@@@#.   .B@@@@P           !@@@@@?            .
.   @@@@@@@@@@@@@@! 5@@@@@:   5@@@@B   ^B&&@@@@@#!#@@@@@@@@@@7G&&@@@@@#!     Y@@@@#.           !@@@@@?            .
.   @@@@@@@@@@@@@@! P@@@@@:   ?@@@@&^    !YPGPY!  !@@@@@Y&@@@@Y  ~YPGP57.    .B@@@@P           !@@@@@?            .
.   @@@@@B~~~~~~~!!.?GPPGP:   .B@@@@&7           ?&@@@@P ?@@@@@5.          ~B@@@@&^            !@@@@@?            .
.   @@@@@G          ^~~~~~.    :G@@@@@BY7~^^~75#@@@@@5.    J@@@@@&P?~^^^!JG@@@@@#~             !@@@@@?            .
.   @@@@@G          5@@@@@:      ?B@@@@@@@@@@@@@@@@B!!      ^P@@@@@@@@@@@@@@@@&Y               !@@@@@?            .
.   @@@@@G.         P@@@@@:        !YB&@@@@@@@@&BY~           ^JG#@@@@@@@@&#P7.                !@@@@@?            .
.   YYYYY7          !YJJJJ.            :~!7??7!^:                 .^!7??7!~:                   ^YJJJY~            .
.                                                                                                                 .
.                                                                                                                 .
.                                                                                                                 .
.                                  ………………               …………………………………………                  …………………………………………        .
.   PBGGB??                      7&######&5            :B##############&5               .G#################^      .
.   &@@@@5                      ?@@@@@@@@@@           :@@@@@@@@@@@@@@@@@G               &@@@@@@@@@@@@ @@@@@^      .
.   PBBBBJ                 !!!!!JPPPPPPPPPY !!!!!     :&@@@@P?JJJJJJJJJJJJJJ?      :JJJJJJJJJJJJJJJJJJJJJJ.       .
.   ~~~~~:                .#@@@@Y          ~@@@@@~    :&@@@@7           ~@@@&.      ^@@@@.                        .
.   #@@@@Y                .#@@@@G?JJJJJJJJ?5@@@@@~    :&@@@@7   !JJJJJJJJJJJJ?     :JJJJJJJJJJJJJJJJJ!!           .
.   #@@@@Y                .#@@@@@@@@@@@@@@@@@@@@@@~   :&@@@@7   G@@@@@@@@G &@@             @@@@@@@@@@P            .
.   #@@@@Y                .#@@@@&##########&@@@@@~    :&@@@@7   7YYYYYYYYJ???7             JYYYYYYYYYYYYJ???7     .
.   #@@@@Y                .#@@@@5 ........ !@@@@@~    :&@@@@7            ~@@@&.                         !@@@#     .
.   #@@@@#5PPPPPPPPPJJ    .#@@@@Y          !@@@@@~    :&@@@@P7??????????JYY5J      .?????????? ???????JYY5J       .
.   &@@@@@@@@@@@@@@@@@    .#@@@@Y          !@@@@@~    :&@@@@@@@@@@@@@@@@@G         ^@@@@@@@@@@@@@@@@@P            .
.   PBBBBBBBBBBBBBBBBY    .#@@@@Y          !@@@@@~    :&@@@@@@@@@@@@@@@@@G         ^@@@@@@@@@@@@@@@ @@5           .
+                                                                                                                 +
+                                                                                                                 +
+ + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + +
*/

pragma solidity ^0.8.0;

import "../hootbase/base/erc721/HootERC721A.sol";
import "../hootbase/base/erc721/features/HootBaseERC721Raising.sol";
import "../hootbase/base/erc721/features/HootBaseERC721Refund.sol";
import "../hootbase/base/erc721/features/HootBaseERC721URISample.sol";
import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol";

abstract contract ERC721 {
    function ownerOf(uint256 tokenId) public view virtual returns (address);
}

abstract contract YINGInterface {
    function mintTransfer(address address_, uint256 blindTokenId_)
        public
        virtual
        returns (uint256);

    function mintTransferBatch(
        address address_,
        uint256[] calldata blindTokenIds_
    ) public virtual returns (uint256[] memory);
}

/**
 * @title HootAirdropBox
 * @author HootLabs
 */
contract YINGHelloNewWorld is
    HootBaseERC721Raising,
    HootBaseERC721Refund,
    HootBaseERC721URISample,
    HootERC721A
{
    event YINGConfigChanged(YINGConfig cfg);
    event HolderMintConfigChanged(address contractAddr, HolderMintConfig cfg);
    event WhitelistSaleConfigChanged(SaleConfig cfg);
    event PartnerContractAdded(address partnerContract, uint256 maxSupply);
    event PublicSaleConfigChanged(SaleConfig cfg);
    event RevealConfigChanged(RevealConfig cfg);

    event PartnerSaled(
        address partnerContract,
        address receiver,
        uint64 amount_
    );
    /**
     * used to mark the contract, each contract have to make a different CONTRACT_SHIELD
     */
    uint256 public constant CONTRACT_SHIELD = 1942123432145421;

    struct YINGConfig {
        uint256 maxSupply;
        uint256 maxSaleSupply;
        uint256 maxSelfSupply;
        bool rejectFreeMintRefund;
    }
    struct SaleConfig {
        uint256 price;
        uint256 startTime;
        uint256 stopTime;
        uint64 supplyOfOwner;
    }
    struct HolderMintConfig {
        uint256 price;
        uint256 startTime;
        uint256 stopTime;
        uint64 supplyOfHolder;
    }
    struct RevealConfig {
        uint256 startTime;
        uint256 stopTime;
        address yingAddress;
    }

    YINGConfig public yingCfg;
    mapping(address => HolderMintConfig) _holderMintCfg;
    SaleConfig public whitelistSaleCfg;
    SaleConfig public publicSaleCfg;
    RevealConfig public revealCfg;
    mapping(address => uint64) _partnerMaxSupply;

    // contract_address => contract_token_id => amount
    mapping(address => mapping(uint256 => uint256)) _holderMintedAmounts;
    mapping(uint256 => bool) _freeMintTokens;
    mapping(uint256 => bool) _freeMintYINGTokens;
    bytes32 public merkleRoot; // merkle root for whitelist checking
    uint64 public selfMinted;

    constructor() HootERC721A("YING: Hello New World", "YING") {}

    /***********************************|
    |               Config              |
    |__________________________________*/
    function setYINGConfig(YINGConfig calldata cfg_) external onlyOwner {
        yingCfg = cfg_;
        emit YINGConfigChanged(cfg_);
    }

    function setHolderMintConfig(
        address contractAddr_,
        HolderMintConfig calldata cfg_
    ) external onlyOwner {
        _holderMintCfg[contractAddr_] = cfg_;
        emit HolderMintConfigChanged(contractAddr_, cfg_);
    }

    function setWhitelistSaleConfig(SaleConfig calldata cfg_, bytes32 root_)
        external
        onlyOwner
    {
        whitelistSaleCfg = cfg_;
        merkleRoot = root_;
        emit WhitelistSaleConfigChanged(cfg_);
    }

    function addPartnerContract(address partnerContract_, uint64 maxSupply_)
        external
        onlyOwner
    {
        _partnerMaxSupply[partnerContract_] = maxSupply_;
        emit PartnerContractAdded(partnerContract_, maxSupply_);
    }

    function setPublicSaleConfig(SaleConfig calldata cfg_) external onlyOwner {
        publicSaleCfg = cfg_;
        emit PublicSaleConfigChanged(cfg_);
    }

    // Set authorized contract address for minting the ERC-721 token
    function setRevealConfig(RevealConfig calldata cfg_) external onlyOwner {
        revealCfg = cfg_;
        emit RevealConfigChanged(cfg_);
    }

    function isWhitelistSaleEnabled() public view returns (bool) {
        return
            block.timestamp > whitelistSaleCfg.startTime &&
            block.timestamp < whitelistSaleCfg.stopTime;
    }

    function isPublicSaleEnabled() public view returns (bool) {
        return
            block.timestamp > publicSaleCfg.startTime &&
            block.timestamp < publicSaleCfg.stopTime;
    }

    // whitelist sale config
    function isWhitelistAddress(address address_, bytes32[] calldata signature_)
        public
        view
        returns (bool)
    {
        if (merkleRoot == "") {
            return false;
        }
        return
            MerkleProof.verify(
                signature_,
                merkleRoot,
                keccak256(abi.encodePacked(address_))
            );
    }

    /**
     * @notice isRevealEnabled is used to return whether the reveal has been enabled.
     */
    function isRevealEnabled() public view returns (bool) {
        return
            block.timestamp > revealCfg.startTime &&
            block.timestamp < revealCfg.stopTime &&
            revealCfg.yingAddress != address(0);
    }

    /***********************************|
    |               Core                |
    |__________________________________*/
    // The maximum number of mint tokens allowed selfSupply
    function selfMint(uint64 numberOfTokens_) external onlyOwner nonReentrant {
        require(numberOfTokens_ > 0, "invalid number of tokens");
        unchecked {
            uint64 nextMinted = selfMinted + numberOfTokens_;
            require(
                nextMinted <= yingCfg.maxSelfSupply,
                "max self supply exceeded"
            );
            _mint(_msgSender(), numberOfTokens_);
            selfMinted = nextMinted;
        }
    }

    function checkAndGetHolderConfig(address contractAddr_)
        private
        view
        returns (HolderMintConfig memory)
    {
        require(contractAddr_ != address(0), "contract address is invalid");
        HolderMintConfig memory holderCfg = _holderMintCfg[contractAddr_];
        require(
            holderCfg.startTime > 0 && block.timestamp > holderCfg.startTime,
            "holder mint is not start"
        );
        require(
            block.timestamp < holderCfg.stopTime,
            "holder mint has been stoped"
        );
        require(
            holderCfg.supplyOfHolder > 0,
            "the input contract does not support to mint"
        );
        return holderCfg;
    }

    function holdersSale(
        address contractAddr_,
        uint256[] calldata tokenIDs_,
        uint64[] calldata amounts_
    ) external payable callerIsUser nonReentrant {
        require(
            tokenIDs_.length == amounts_.length,
            "the length of Listing TokenIDs is different from that of Listing Amounts"
        );
        HolderMintConfig memory holderCfg = checkAndGetHolderConfig(
            contractAddr_
        );
        require(
            tokenIDs_.length < yingCfg.maxSaleSupply,
            "max sale supply exceeded"
        );

        uint64 amountTotal = 0;
        unchecked {
            for (uint256 i = 0; i < tokenIDs_.length; i++) {
                uint64 amount = amounts_[i];
                require(amount < 3, "an token can only mint two tokens");
                require(amount > 0, "invalid number of tokens");

                uint256 nextSupply = _holderMintedAmounts[contractAddr_][
                    tokenIDs_[i]
                ] + amount;
                require(
                    nextSupply <= holderCfg.supplyOfHolder,
                    "max sale supply exceeded"
                );

                // 验证是否是 owner
                ERC721 contractAddress = ERC721(contractAddr_);
                require(
                    contractAddress.ownerOf(tokenIDs_[i]) == _msgSender(),
                    "doesn't own the token"
                );
                _holderMintedAmounts[contractAddr_][tokenIDs_[i]] = nextSupply;

                amountTotal += amount;
            }
            _sale(_msgSender(), amountTotal, holderCfg.price);
        }
    }

    // Only one token can be mint at a time
    function whitelistSale(bytes32[] calldata signature_, uint64 amount_)
        external
        payable
        callerIsUser
        nonReentrant
    {
        require(isWhitelistSaleEnabled(), "whitelist sale has not enabled");
        require(
            isWhitelistAddress(_msgSender(), signature_),
            "caller is not in whitelist or invalid signature"
        );
        require(amount_ > 0, "invalid number of tokens");
        require(amount_ < 3, "can only mint 2 tokens at a time");

        uint64 nextSupply = _getAux(_msgSender()) + amount_;
        require(
            nextSupply <= whitelistSaleCfg.supplyOfOwner,
            "out of max mint amount"
        );
        _sale(_msgSender(), amount_, whitelistSaleCfg.price);
        _setAux(_msgSender(), uint64(nextSupply));
    }

    function partnerSale(address receiver, uint64 amount_)
        external
        payable
        nonReentrant
    {
        require(isWhitelistSaleEnabled(), "whitelist sale has not enabled");
        require(amount_ > 0, "invalid number of tokens");
        require(amount_ < 3, "can only mint 2 tokens at a time");

        uint64 maxSupply = _partnerMaxSupply[_msgSender()];
        uint64 nextSupply = _getAux(_msgSender()) + amount_;
        require(nextSupply <= maxSupply, "out of max mint amount");

        _sale(receiver, amount_, whitelistSaleCfg.price);
        _setAux(_msgSender(), uint64(nextSupply));

        emit PartnerSaled(_msgSender(), receiver, amount_);
    }

    /**
     * @notice public sale.
     * @param amount_ sale amount
     */
    function publicSale(uint64 amount_)
        external
        payable
        callerIsUser
        nonReentrant
    {
        require(isPublicSaleEnabled(), "public sale has not enabled");
        require(amount_ > 0, "invalid number of tokens");
        require(amount_ < 3, "can only mint 2 tokens at a time");

        uint64 nextSupply = _getAux(_msgSender()) + amount_;
        require(
            nextSupply <= publicSaleCfg.supplyOfOwner,
            "out of max mint amount"
        );
        _sale(_msgSender(), amount_, publicSaleCfg.price);
        _setAux(_msgSender(), nextSupply);
    }

    // The maximum number of mint tokens allowed saleSupply
    function _sale(
        address receiver,
        uint64 numberOfTokens_,
        uint256 price_
    ) internal {
        require(
            _totalMinted() + numberOfTokens_ - selfMinted <= yingCfg.maxSaleSupply,
            "max sale supply exceeded"
        );
        uint256 amount = price_ * numberOfTokens_;
        require(amount <= msg.value, "ether value sent is not correct");
        _safeMint(receiver, numberOfTokens_);
        refundExcessPayment(amount);
        if (price_ == 0) {
            for (uint256 i = 0; i < numberOfTokens_; ++i) {
                _freeMintTokens[_totalMinted() - i] = true;
            }
        }
    }

    /**
     * @notice when the amount paid by the user exceeds the actual need, the refund logic will be executed.
     * @param amount_ the actual amount that should be paid
     */
    function refundExcessPayment(uint256 amount_) private {
        if (msg.value > amount_) {
            payable(_msgSender()).transfer(msg.value - amount_);
        }
    }

    /**
     * @notice Determine whether it is the Token of a FreeMint
     * @param tokenId_ YING: Hello New World token id
     */
    function isFreeMintToken(uint256 tokenId_)
        public
        view
        virtual
        returns (bool)
    {
        return _freeMintTokens[tokenId_];
    }

    /**
     * @notice Determine whether it is the Token of a FreeMint
     * @param tokenId_ YING token id
     */
    function isFreeMintYINGToken(uint256 tokenId_)
        public
        view
        virtual
        returns (bool)
    {
        return _freeMintYINGTokens[tokenId_];
    }

    /**
     * Gets the number of Mint of the holder
     */
    function getHolderMinted(
        address contractAddr_,
        uint256[] calldata tokenIDs_
    ) external view returns (uint256[] memory) {
        mapping(uint256 => uint256) storage tokenAmount = _holderMintedAmounts[
            contractAddr_
        ];
        uint256[] memory amounts = new uint256[](tokenIDs_.length);
        for (uint256 i = 0; i < tokenIDs_.length; i++) {
            amounts[i] = tokenAmount[tokenIDs_[i]];
        }
        return amounts;
    }

    /**
     * gets the number of Mint during the whitelist and the public sale
     */
    function getSaleBalanceOf(address owner) public view returns (uint256) {
       return _getAux(owner);
    }

    /**
     * @notice reveal is used to open the blind box.
     * @param tokenId_ tokenId of the blind box to be revealed.
     * @return tokenId after revealing the blind box.
     */
    function reveal(uint256 tokenId_)
        external
        callerIsUser
        nonReentrant
        returns (uint256)
    {
        require(isRevealEnabled(), "reveal has not enabled");
        require(ownerOf(tokenId_) == _msgSender(), "caller is not owner");
        _burn(tokenId_);
        YINGInterface yingContract = YINGInterface(revealCfg.yingAddress);
        uint256 yingTokenId = yingContract.mintTransfer(_msgSender(), tokenId_);
        if (isFreeMintToken(tokenId_)) {
            _freeMintYINGTokens[yingTokenId] = true;
        }
        return yingTokenId;
    }

    function revealBatch(uint256[] calldata tokenIds_)
        external
        callerIsUser
        nonReentrant
        returns (uint256[] memory)
    {
        require(isRevealEnabled(), "reveal has not enabled");
        for (uint256 i = 0; i < tokenIds_.length; i++) {
            uint256 tokenId = tokenIds_[i];
            require(ownerOf(tokenId) == _msgSender(), "caller is not owner");
            _burn(tokenId);
        }
        YINGInterface yingContract = YINGInterface(revealCfg.yingAddress);
        uint256[] memory yingTokenIds = yingContract.mintTransferBatch(
            _msgSender(),
            tokenIds_
        );
        for (uint256 i = 0; i < yingTokenIds.length; i++) {
            if (isFreeMintToken(tokenIds_[i])) {
                _freeMintYINGTokens[yingTokenIds[i]] = true;
            }
        }
        return yingTokenIds;
    }

    /***********************************|
    |        HootBaseERC721Refund       |
    |__________________________________*/
    function _refundPrice(uint256 tokenId_)
        internal
        view
        virtual
        override
        returns (uint256)
    {
        if (yingCfg.rejectFreeMintRefund) {
            require(
                !_freeMintTokens[tokenId_],
                "No refunds are allowed for free mint token"
            );
        }
        return super._refundPrice(tokenId_);
    }

    /***********************************|
    | HootBaseERC721URIStorageWithLevel |
    |__________________________________*/
    function tokenURI(uint256 tokenId_)
        public
        view
        virtual
        override(ERC721A, HootBaseERC721URISample)
        returns (string memory)
    {
        return HootBaseERC721URISample.tokenURI(tokenId_);
    }

    /***********************************|
    |               ERC721A             |
    |__________________________________*/
    /**
     * @notice hook function, used to intercept the transfer of token.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual override(HootBaseERC721Raising, HootERC721A) {
        HootBaseERC721Raising._beforeTokenTransfers(
            from,
            to,
            startTokenId,
            quantity
        );
        super._beforeTokenTransfers(from, to, startTokenId, quantity);
    }
}

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

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Tree 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.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
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 Calldata version of {verify}
     *
     * _Available since v4.7._
     */
    function verifyCalldata(
        bytes32[] calldata proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle 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++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Calldata version of {processProof}
     *
     * _Available since v4.7._
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`,
     * consuming from one or the other at each step according to the instructions given by
     * `proofFlags`.
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}
     *
     * _Available since v4.7._
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

File 3 of 22 : HootBaseERC721URISample.sol
// SPDX-License-Identifier: MIT
/*
+ + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + +
+                                                                                                                 +
+                                                                                                                 +
.                        .^!!~:                                                 .^!!^.                            .
.                            :7Y5Y7^.                                       .^!J5Y7^.                             .
.                              :!5B#GY7^.                             .^!JP##P7:                                  .
.   7777??!         ~????7.        :5@@@@&GY7^.                    .^!JG#@@@@G^        7????????????^ ~????77     .
.   @@@@@G          P@@@@@:       J#@@@@@@@@@@&G57~.          .^7YG#@@@@@@@@@@&5:      #@@@@@@@@@@@@@? P@@@@@@    .
.   @@@@@G          5@@@@@:     :B@@@@@BJG@@@@@@@@@&B5?~:^7YG#@@@@@@@@BJP@@@ @@&!!     #@@@@@@@@@@@@@? P@@@@@@    .
.   @@@@@G          5@@@@@:    .B@@@@#!!J@@@@@@@@@@@@@@@&@@@@@@@@@@@@@@@P   ^G@@@@@~.   ^~~~~~^J@ @@@@??:~~~~~    .
.   @@@@@B^^^^^^^^. 5@@@@@:   J@@@@&^   G@7?@@@@@@&@@@@@@@@@@@&@J7&@@@@@#.   .B@@@@P           !@@@@@?            .
.   @@@@@@@@@@@@@@! 5@@@@@:   5@@@@B   ^B&&@@@@@#!#@@@@@@@@@@7G&&@@@@@#!     Y@@@@#.           !@@@@@?            .
.   @@@@@@@@@@@@@@! P@@@@@:   ?@@@@&^    !YPGPY!  !@@@@@Y&@@@@Y  ~YPGP57.    .B@@@@P           !@@@@@?            .
.   @@@@@B~~~~~~~!!.?GPPGP:   .B@@@@&7           ?&@@@@P ?@@@@@5.          ~B@@@@&^            !@@@@@?            .
.   @@@@@G          ^~~~~~.    :G@@@@@BY7~^^~75#@@@@@5.    J@@@@@&P?~^^^!JG@@@@@#~             !@@@@@?            .
.   @@@@@G          5@@@@@:      ?B@@@@@@@@@@@@@@@@B!!      ^P@@@@@@@@@@@@@@@@&Y               !@@@@@?            .
.   @@@@@G.         P@@@@@:        !YB&@@@@@@@@&BY~           ^JG#@@@@@@@@&#P7.                !@@@@@?            .
.   YYYYY7          !YJJJJ.            :~!7??7!^:                 .^!7??7!~:                   ^YJJJY~            .
.                                                                                                                 .
.                                                                                                                 .
.                                                                                                                 .
.                                  ………………               …………………………………………                  …………………………………………        .
.   PBGGB??                      7&######&5            :B##############&5               .G#################^      .
.   &@@@@5                      ?@@@@@@@@@@           :@@@@@@@@@@@@@@@@@G               &@@@@@@@@@@@@ @@@@@^      .
.   PBBBBJ                 !!!!!JPPPPPPPPPY !!!!!     :&@@@@P?JJJJJJJJJJJJJJ?      :JJJJJJJJJJJJJJJJJJJJJJ.       .
.   ~~~~~:                .#@@@@Y          ~@@@@@~    :&@@@@7           ~@@@&.      ^@@@@.                        .
.   #@@@@Y                .#@@@@G?JJJJJJJJ?5@@@@@~    :&@@@@7   !JJJJJJJJJJJJ?     :JJJJJJJJJJJJJJJJJ!!           .
.   #@@@@Y                .#@@@@@@@@@@@@@@@@@@@@@@~   :&@@@@7   G@@@@@@@@G &@@             @@@@@@@@@@P            .
.   #@@@@Y                .#@@@@&##########&@@@@@~    :&@@@@7   7YYYYYYYYJ???7             JYYYYYYYYYYYYJ???7     .
.   #@@@@Y                .#@@@@5 ........ !@@@@@~    :&@@@@7            ~@@@&.                         !@@@#     .
.   #@@@@#5PPPPPPPPPJJ    .#@@@@Y          !@@@@@~    :&@@@@P7??????????JYY5J      .?????????? ???????JYY5J       .
.   &@@@@@@@@@@@@@@@@@    .#@@@@Y          !@@@@@~    :&@@@@@@@@@@@@@@@@@G         ^@@@@@@@@@@@@@@@@@P            .
.   PBBBBBBBBBBBBBBBBY    .#@@@@Y          !@@@@@~    :&@@@@@@@@@@@@@@@@@G         ^@@@@@@@@@@@@@@@ @@5           .
+                                                                                                                 +
+                                                                                                                 +
+ + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + +
*/

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/utils/Strings.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol";
import "../../common/HootBase.sol";
import "../extensions/HootBaseERC721Owners.sol";

/**
 * @title HootBaseERC721URISample
 * @author HootLabs
 */
abstract contract HootBaseERC721URISample is
    HootBase,
    HootBaseERC721Owners,
    IERC721,
    IERC721Metadata
{
    using Strings for uint256;

    event BaseURIChanged(string uri);

    string private _preURI;

    function _baseURI(
        uint256 /* tokenId_*/
    ) internal view virtual returns (string memory) {
        return _preURI;
    }

    function setBaseURI(string calldata uri_) external onlyOwner {
        _preURI = uri_;
        emit BaseURIChanged(uri_);
    }

    function tokenURI(uint256 tokenId_)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(this.exists(tokenId_), "token is not exist");

        string memory baseURI = _baseURI(tokenId_);
        return
            bytes(baseURI).length > 0
                ? string(abi.encodePacked(baseURI, tokenId_.toString()))
                : "";
    }

    function unsafeTokenURIBatch(uint256[] calldata tokenIds_)
        public
        view
        virtual
        returns (string[] memory)
    {
        string[] memory uris = new string[](tokenIds_.length);
        for (uint256 i = 0; i < tokenIds_.length; ++i) {
            uint256 tokenId = tokenIds_[i];
            if(!this.exists(tokenId)){
                uris[i]="";
                continue;
            }
            string memory baseURI = _baseURI(tokenId);
            uris[i] = bytes(baseURI).length > 0
                ? string(abi.encodePacked(baseURI, tokenId.toString()))
                : "";
        }
        return uris;
    }
}

File 4 of 22 : HootBaseERC721Refund.sol
// SPDX-License-Identifier: MIT
/*
+ + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + +
+                                                                                                                 +
+                                                                                                                 +
.                        .^!!~:                                                 .^!!^.                            .
.                            :7Y5Y7^.                                       .^!J5Y7^.                             .
.                              :!5B#GY7^.                             .^!JP##P7:                                  .
.   7777??!         ~????7.        :5@@@@&GY7^.                    .^!JG#@@@@G^        7????????????^ ~????77     .
.   @@@@@G          P@@@@@:       J#@@@@@@@@@@&G57~.          .^7YG#@@@@@@@@@@&5:      #@@@@@@@@@@@@@? P@@@@@@    .
.   @@@@@G          5@@@@@:     :B@@@@@BJG@@@@@@@@@&B5?~:^7YG#@@@@@@@@BJP@@@ @@&!!     #@@@@@@@@@@@@@? P@@@@@@    .
.   @@@@@G          5@@@@@:    .B@@@@#!!J@@@@@@@@@@@@@@@&@@@@@@@@@@@@@@@P   ^G@@@@@~.   ^~~~~~^J@ @@@@??:~~~~~    .
.   @@@@@B^^^^^^^^. 5@@@@@:   J@@@@&^   G@7?@@@@@@&@@@@@@@@@@@&@J7&@@@@@#.   .B@@@@P           !@@@@@?            .
.   @@@@@@@@@@@@@@! 5@@@@@:   5@@@@B   ^B&&@@@@@#!#@@@@@@@@@@7G&&@@@@@#!     Y@@@@#.           !@@@@@?            .
.   @@@@@@@@@@@@@@! P@@@@@:   ?@@@@&^    !YPGPY!  !@@@@@Y&@@@@Y  ~YPGP57.    .B@@@@P           !@@@@@?            .
.   @@@@@B~~~~~~~!!.?GPPGP:   .B@@@@&7           ?&@@@@P ?@@@@@5.          ~B@@@@&^            !@@@@@?            .
.   @@@@@G          ^~~~~~.    :G@@@@@BY7~^^~75#@@@@@5.    J@@@@@&P?~^^^!JG@@@@@#~             !@@@@@?            .
.   @@@@@G          5@@@@@:      ?B@@@@@@@@@@@@@@@@B!!      ^P@@@@@@@@@@@@@@@@&Y               !@@@@@?            .
.   @@@@@G.         P@@@@@:        !YB&@@@@@@@@&BY~           ^JG#@@@@@@@@&#P7.                !@@@@@?            .
.   YYYYY7          !YJJJJ.            :~!7??7!^:                 .^!7??7!~:                   ^YJJJY~            .
.                                                                                                                 .
.                                                                                                                 .
.                                                                                                                 .
.                                  ………………               …………………………………………                  …………………………………………        .
.   PBGGB??                      7&######&5            :B##############&5               .G#################^      .
.   &@@@@5                      ?@@@@@@@@@@           :@@@@@@@@@@@@@@@@@G               &@@@@@@@@@@@@ @@@@@^      .
.   PBBBBJ                 !!!!!JPPPPPPPPPY !!!!!     :&@@@@P?JJJJJJJJJJJJJJ?      :JJJJJJJJJJJJJJJJJJJJJJ.       .
.   ~~~~~:                .#@@@@Y          ~@@@@@~    :&@@@@7           ~@@@&.      ^@@@@.                        .
.   #@@@@Y                .#@@@@G?JJJJJJJJ?5@@@@@~    :&@@@@7   !JJJJJJJJJJJJ?     :JJJJJJJJJJJJJJJJJ!!           .
.   #@@@@Y                .#@@@@@@@@@@@@@@@@@@@@@@~   :&@@@@7   G@@@@@@@@G &@@             @@@@@@@@@@P            .
.   #@@@@Y                .#@@@@&##########&@@@@@~    :&@@@@7   7YYYYYYYYJ???7             JYYYYYYYYYYYYJ???7     .
.   #@@@@Y                .#@@@@5 ........ !@@@@@~    :&@@@@7            ~@@@&.                         !@@@#     .
.   #@@@@#5PPPPPPPPPJJ    .#@@@@Y          !@@@@@~    :&@@@@P7??????????JYY5J      .?????????? ???????JYY5J       .
.   &@@@@@@@@@@@@@@@@@    .#@@@@Y          !@@@@@~    :&@@@@@@@@@@@@@@@@@G         ^@@@@@@@@@@@@@@@@@P            .
.   PBBBBBBBBBBBBBBBBY    .#@@@@Y          !@@@@@~    :&@@@@@@@@@@@@@@@@@G         ^@@@@@@@@@@@@@@@ @@5           .
+                                                                                                                 +
+                                                                                                                 +
+ + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + +
*/

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
import "@openzeppelin/contracts/utils/Address.sol";
import "../../common/HootBase.sol";

/**
 * @title HootBaseERC721Refund
 * @author HootLabs
 */
abstract contract HootBaseERC721Refund is HootBase, IERC721 {
    using Address for address;

    event RefundConfigChanged(RefundConfig config);
    event RefundAddressChanged(address indexed refundAddress);
    event Refunded(address indexed from, address indexed to, uint256 tokenId, uint256 amount);

    constructor(){
        refundAddress = _msgSender();
    }
    // mint State Variables
    address public refundAddress;

    struct RefundConfig {
        uint256 startTime;
        uint256 stopTime;
        uint256 price;
    }
    RefundConfig public refundConfig;

    // refund config
    function isRefundEnabled() public view virtual returns (bool) {
        return block.timestamp > refundConfig.startTime && block.timestamp < refundConfig.stopTime;
    }
    function setRefundAddress(address refundAddress_) external onlyOwner {
        refundAddress = refundAddress_;
        emit RefundAddressChanged(refundAddress_);
    }
    function setRefundConfig(RefundConfig calldata cfg_) external onlyOwner {
        refundConfig = cfg_;
        emit RefundConfigChanged(refundConfig);
    }

    function _refundPrice(uint256 /*tokenId_*/) internal view virtual returns (uint256) {
        return refundConfig.price;
    }

    // refund
    function refund(uint256 tokenId_) external callerIsUser nonReentrant {
        require(_msgSender() == this.ownerOf(tokenId_), "not token owner");
        require(_msgSender() != refundAddress, "stock account refunds are not allowed");
        require(isRefundEnabled(), "outside the refundable period");

        uint256 refundPrice = _refundPrice(tokenId_);
        require(refundPrice > 0, "only sale NFT can be refunded");
        require(address(this).balance >= refundPrice, "insufficient contract funds");

        this.safeTransferFrom(_msgSender(), refundAddress, tokenId_);
        //Address.sendValue(payable(_msgSender()), refundPrice);
        payable(_msgSender()).transfer(refundPrice);

        emit Refunded(_msgSender(), refundAddress, tokenId_, refundPrice);
    }
}

File 5 of 22 : HootBaseERC721Raising.sol
// SPDX-License-Identifier: MIT
/*
+ + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + +
+                                                                                                                 +
+                                                                                                                 +
.                        .^!!~:                                                 .^!!^.                            .
.                            :7Y5Y7^.                                       .^!J5Y7^.                             .
.                              :!5B#GY7^.                             .^!JP##P7:                                  .
.   7777??!         ~????7.        :5@@@@&GY7^.                    .^!JG#@@@@G^        7????????????^ ~????77     .
.   @@@@@G          P@@@@@:       J#@@@@@@@@@@&G57~.          .^7YG#@@@@@@@@@@&5:      #@@@@@@@@@@@@@? P@@@@@@    .
.   @@@@@G          5@@@@@:     :B@@@@@BJG@@@@@@@@@&B5?~:^7YG#@@@@@@@@BJP@@@ @@&!!     #@@@@@@@@@@@@@? P@@@@@@    .
.   @@@@@G          5@@@@@:    .B@@@@#!!J@@@@@@@@@@@@@@@&@@@@@@@@@@@@@@@P   ^G@@@@@~.   ^~~~~~^J@ @@@@??:~~~~~    .
.   @@@@@B^^^^^^^^. 5@@@@@:   J@@@@&^   G@7?@@@@@@&@@@@@@@@@@@&@J7&@@@@@#.   .B@@@@P           !@@@@@?            .
.   @@@@@@@@@@@@@@! 5@@@@@:   5@@@@B   ^B&&@@@@@#!#@@@@@@@@@@7G&&@@@@@#!     Y@@@@#.           !@@@@@?            .
.   @@@@@@@@@@@@@@! P@@@@@:   ?@@@@&^    !YPGPY!  !@@@@@Y&@@@@Y  ~YPGP57.    .B@@@@P           !@@@@@?            .
.   @@@@@B~~~~~~~!!.?GPPGP:   .B@@@@&7           ?&@@@@P ?@@@@@5.          ~B@@@@&^            !@@@@@?            .
.   @@@@@G          ^~~~~~.    :G@@@@@BY7~^^~75#@@@@@5.    J@@@@@&P?~^^^!JG@@@@@#~             !@@@@@?            .
.   @@@@@G          5@@@@@:      ?B@@@@@@@@@@@@@@@@B!!      ^P@@@@@@@@@@@@@@@@&Y               !@@@@@?            .
.   @@@@@G.         P@@@@@:        !YB&@@@@@@@@&BY~           ^JG#@@@@@@@@&#P7.                !@@@@@?            .
.   YYYYY7          !YJJJJ.            :~!7??7!^:                 .^!7??7!~:                   ^YJJJY~            .
.                                                                                                                 .
.                                                                                                                 .
.                                                                                                                 .
.                                  ………………               …………………………………………                  …………………………………………        .
.   PBGGB??                      7&######&5            :B##############&5               .G#################^      .
.   &@@@@5                      ?@@@@@@@@@@           :@@@@@@@@@@@@@@@@@G               &@@@@@@@@@@@@ @@@@@^      .
.   PBBBBJ                 !!!!!JPPPPPPPPPY !!!!!     :&@@@@P?JJJJJJJJJJJJJJ?      :JJJJJJJJJJJJJJJJJJJJJJ.       .
.   ~~~~~:                .#@@@@Y          ~@@@@@~    :&@@@@7           ~@@@&.      ^@@@@.                        .
.   #@@@@Y                .#@@@@G?JJJJJJJJ?5@@@@@~    :&@@@@7   !JJJJJJJJJJJJ?     :JJJJJJJJJJJJJJJJJ!!           .
.   #@@@@Y                .#@@@@@@@@@@@@@@@@@@@@@@~   :&@@@@7   G@@@@@@@@G &@@             @@@@@@@@@@P            .
.   #@@@@Y                .#@@@@&##########&@@@@@~    :&@@@@7   7YYYYYYYYJ???7             JYYYYYYYYYYYYJ???7     .
.   #@@@@Y                .#@@@@5 ........ !@@@@@~    :&@@@@7            ~@@@&.                         !@@@#     .
.   #@@@@#5PPPPPPPPPJJ    .#@@@@Y          !@@@@@~    :&@@@@P7??????????JYY5J      .?????????? ???????JYY5J       .
.   &@@@@@@@@@@@@@@@@@    .#@@@@Y          !@@@@@~    :&@@@@@@@@@@@@@@@@@G         ^@@@@@@@@@@@@@@@@@P            .
.   PBBBBBBBBBBBBBBBBY    .#@@@@Y          !@@@@@~    :&@@@@@@@@@@@@@@@@@G         ^@@@@@@@@@@@@@@@ @@5           .
+                                                                                                                 +
+                                                                                                                 +
+ + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + +
*/

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
import "../../common/HootBase.sol";
import "../extensions/HootBaseERC721Owners.sol";

/**
 * @title HootBaseERC721Raising
 * @author HootLabs
 */
abstract contract HootBaseERC721Raising is
    HootBase,
    HootBaseERC721Owners,
    IERC721
{
    event RaisingStatusChanged(
        uint256 indexed tokenId,
        address indexed owner,
        uint16 indexed raisingType,
        bool isStart
    );
    event RaisingInterrupted(uint256 indexed tokenId, address indexed operator);
    event RaisingTokenTransfered(
        address indexed from,
        address indexed to,
        uint256 indexed tokenId
    );
    event RaisingAllowedFlagChanged(
        bool isRaisingAllowed,
        bool isRaisingTransferAllowed
    );

    struct RaisingStatus {
        uint256 raisingStartTime;
        uint256 total;
        uint16 raisingType;
        bool provisionalFree;
    }
    struct RaisingCurrentStatus {
        uint256 total;
        uint256 current;
        uint16 raisingType;
        bool isRaising;
    }
    mapping(uint256 => RaisingStatus) private _raisingStatuses;
    bool public isRaisingAllowed;
    bool public isRaisingTransferAllowed;

    /***********************************|
    |               Raising Config      |
    |__________________________________*/
    /**
     * @notice setIsRaisingAllowed is used to set the global switch to control whether users are allowed to brew.
     * @param isRaisingAllowed_ set to true to allow
     */
    function setIsRaisingAllowed(
        bool isRaisingAllowed_,
        bool isRaisingTransferAllowed_
    ) external atLeastMaintainer {
        isRaisingAllowed = isRaisingAllowed_;
        isRaisingTransferAllowed = isRaisingTransferAllowed_;
        emit RaisingAllowedFlagChanged(
            isRaisingAllowed_,
            isRaisingTransferAllowed_
        );
    }

    /***********************************|
    |               Raising Core        |
    |__________________________________*/
    /**
     * @notice safeTransferWhileRaising is used to safely transfer tokens while raising
     * @param from_ transfer from address, cannot be the zero.
     * @param to_ transfer to address, cannot be the zero.
     * @param tokenId_ token must exist and be owned by `from`.
     */
    function safeTransferWhileRaising(
        address from_,
        address to_,
        uint256 tokenId_
    ) external nonReentrant {
        require(this.ownerOf(tokenId_) == _msgSender(), "caller is not owner");
        require(
            isRaisingTransferAllowed,
            "transfer while raising is not enabled"
        );
        _raisingStatuses[tokenId_].provisionalFree = true;
        this.safeTransferFrom(from_, to_, tokenId_);
        _raisingStatuses[tokenId_].provisionalFree = false;
        if (_raisingStatuses[tokenId_].raisingStartTime != 0) {
            emit RaisingTokenTransfered(from_, to_, tokenId_);
        }
    }

    /**
     * @notice getTokenRaisingStatus is used to get the detailed raising status of a specific token.
     * @param tokenIDs_ token id
     * @return RaisingCurrentStatus[] how long the token has been raising in the hands of the current hodler.
     */
    function getTokenRaisingStatus(uint256[] calldata tokenIDs_)
        external
        view
        returns (RaisingCurrentStatus[] memory)
    {
        RaisingCurrentStatus[] memory statusList = new RaisingCurrentStatus[](tokenIDs_.length);
        for (uint256 i = 0; i < tokenIDs_.length; ++i) {
            uint256 tokenId = tokenIDs_[i];
            if(!this.exists(tokenId)){
                continue;
            }
            RaisingStatus memory status = _raisingStatuses[tokenId];
            if (status.raisingStartTime != 0) {
                statusList[i].isRaising = true;
                statusList[i].raisingType = status.raisingType;
                statusList[i].current = block.timestamp - status.raisingStartTime;
            }
            statusList[i].total = status.total + statusList[i].current;
        }
        return statusList;
    }

    function _isTokenRaising(uint256 tokenId_) internal view returns (bool) {
        return _raisingStatuses[tokenId_].raisingStartTime != 0;
    }

    /**
     * @notice setTokenRaisingState is used to modify the Raising state of the Token,
     * only the Owner of the Token has this permission.
     * @param tokenIds_ list of tokenId
     */
    function doTokenRaising(
        uint256[] calldata tokenIds_,
        uint16 raisingType_,
        bool isStart_
    ) external nonReentrant {
        if (isStart_) {
            require(isRaisingAllowed, "raising is not allowed");
        }
        unchecked {
            for (uint256 i = 0; i < tokenIds_.length; i++) {
                uint256 tokenId = tokenIds_[i];
                require(
                    this.ownerOf(tokenId) == _msgSender(),
                    "caller is not owner"
                );

                RaisingStatus storage status = _raisingStatuses[tokenId];
                uint256 raisingStartTime = status.raisingStartTime;
                if (isStart_) {
                    if (raisingStartTime == 0) {
                        status.raisingStartTime = block.timestamp;
                        status.raisingType = raisingType_;
                        emit RaisingStatusChanged(
                            tokenId,
                            _msgSender(),
                            raisingType_,
                            isStart_
                        );
                    } else {
                        require(
                            status.raisingType == raisingType_,
                            "raising is already started, but with a different raising type set"
                        );
                    }
                } else {
                    if (raisingStartTime > 0) {
                        status.total += block.timestamp - raisingStartTime;
                        status.raisingStartTime = 0;
                        emit RaisingStatusChanged(
                            tokenId,
                            _msgSender(),
                            raisingType_,
                            isStart_
                        );
                    }
                }
            }
        }
    }

    /**
     * @notice interruptTokenRaising gives the issuer the right to forcibly interrupt the raising state of the token.
     * One scenario of using it is: someone may maliciously place low-priced raising tokens on
     * the secondary market (because raising tokens cannot be traded).
     * @param tokenIds_ the tokenId list to operate
     */
    function interruptTokenRaising(uint256[] calldata tokenIds_)
        external
        nonReentrant
        atLeastMaintainer
    {
        unchecked {
            for (uint256 i = 0; i < tokenIds_.length; i++) {
                uint256 tokenId = tokenIds_[i];
                address owner = this.ownerOf(tokenId);
                RaisingStatus storage status = _raisingStatuses[tokenId];
                if (status.raisingStartTime == 0) {
                    continue;
                }
                status.total += block.timestamp - status.raisingStartTime;
                status.raisingStartTime = 0;
                emit RaisingStatusChanged(
                    tokenId,
                    owner,
                    status.raisingType,
                    false
                );
                emit RaisingInterrupted(tokenId, _msgSender());
            }
        }
    }

    function _beforeTokenTransfer(
        address, /*from_*/
        address, /*to_*/
        uint256 tokenId_
    ) internal virtual {
        if (_isTokenRaising(tokenId_)) {
            require(
                _raisingStatuses[tokenId_].provisionalFree,
                "token is raising"
            );
        }
    }

    function _beforeTokenTransfers(
        address, /*from_*/
        address, /*to_*/
        uint256 startTokenId_,
        uint256 quantity_
    ) internal virtual {
        for (uint256 i = 0; i < quantity_; ++i) {
            if (_isTokenRaising(startTokenId_ + i)) {
                require(
                    _raisingStatuses[startTokenId_ + i].provisionalFree,
                    "token is raising"
                );
            }
        }
    }
}

File 6 of 22 : HootERC721A.sol
// SPDX-License-Identifier: MIT
/*
+ + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + +
+                                                                                                                 +
+                                                                                                                 +
.                        .^!!~:                                                 .^!!^.                            .
.                            :7Y5Y7^.                                       .^!J5Y7^.                             .
.                              :!5B#GY7^.                             .^!JP##P7:                                  .
.   7777??!         ~????7.        :5@@@@&GY7^.                    .^!JG#@@@@G^        7????????????^ ~????77     .
.   @@@@@G          P@@@@@:       J#@@@@@@@@@@&G57~.          .^7YG#@@@@@@@@@@&5:      #@@@@@@@@@@@@@? P@@@@@@    .
.   @@@@@G          5@@@@@:     :B@@@@@BJG@@@@@@@@@&B5?~:^7YG#@@@@@@@@BJP@@@ @@&!!     #@@@@@@@@@@@@@? P@@@@@@    .
.   @@@@@G          5@@@@@:    .B@@@@#!!J@@@@@@@@@@@@@@@&@@@@@@@@@@@@@@@P   ^G@@@@@~.   ^~~~~~^J@ @@@@??:~~~~~    .
.   @@@@@B^^^^^^^^. 5@@@@@:   J@@@@&^   G@7?@@@@@@&@@@@@@@@@@@&@J7&@@@@@#.   .B@@@@P           !@@@@@?            .
.   @@@@@@@@@@@@@@! 5@@@@@:   5@@@@B   ^B&&@@@@@#!#@@@@@@@@@@7G&&@@@@@#!     Y@@@@#.           !@@@@@?            .
.   @@@@@@@@@@@@@@! P@@@@@:   ?@@@@&^    !YPGPY!  !@@@@@Y&@@@@Y  ~YPGP57.    .B@@@@P           !@@@@@?            .
.   @@@@@B~~~~~~~!!.?GPPGP:   .B@@@@&7           ?&@@@@P ?@@@@@5.          ~B@@@@&^            !@@@@@?            .
.   @@@@@G          ^~~~~~.    :G@@@@@BY7~^^~75#@@@@@5.    J@@@@@&P?~^^^!JG@@@@@#~             !@@@@@?            .
.   @@@@@G          5@@@@@:      ?B@@@@@@@@@@@@@@@@B!!      ^P@@@@@@@@@@@@@@@@&Y               !@@@@@?            .
.   @@@@@G.         P@@@@@:        !YB&@@@@@@@@&BY~           ^JG#@@@@@@@@&#P7.                !@@@@@?            .
.   YYYYY7          !YJJJJ.            :~!7??7!^:                 .^!7??7!~:                   ^YJJJY~            .
.                                                                                                                 .
.                                                                                                                 .
.                                                                                                                 .
.                                  ………………               …………………………………………                  …………………………………………        .
.   PBGGB??                      7&######&5            :B##############&5               .G#################^      .
.   &@@@@5                      ?@@@@@@@@@@           :@@@@@@@@@@@@@@@@@G               &@@@@@@@@@@@@ @@@@@^      .
.   PBBBBJ                 !!!!!JPPPPPPPPPY !!!!!     :&@@@@P?JJJJJJJJJJJJJJ?      :JJJJJJJJJJJJJJJJJJJJJJ.       .
.   ~~~~~:                .#@@@@Y          ~@@@@@~    :&@@@@7           ~@@@&.      ^@@@@.                        .
.   #@@@@Y                .#@@@@G?JJJJJJJJ?5@@@@@~    :&@@@@7   !JJJJJJJJJJJJ?     :JJJJJJJJJJJJJJJJJ!!           .
.   #@@@@Y                .#@@@@@@@@@@@@@@@@@@@@@@~   :&@@@@7   G@@@@@@@@G &@@             @@@@@@@@@@P            .
.   #@@@@Y                .#@@@@&##########&@@@@@~    :&@@@@7   7YYYYYYYYJ???7             JYYYYYYYYYYYYJ???7     .
.   #@@@@Y                .#@@@@5 ........ !@@@@@~    :&@@@@7            ~@@@&.                         !@@@#     .
.   #@@@@#5PPPPPPPPPJJ    .#@@@@Y          !@@@@@~    :&@@@@P7??????????JYY5J      .?????????? ???????JYY5J       .
.   &@@@@@@@@@@@@@@@@@    .#@@@@Y          !@@@@@~    :&@@@@@@@@@@@@@@@@@G         ^@@@@@@@@@@@@@@@@@P            .
.   PBBBBBBBBBBBBBBBBY    .#@@@@Y          !@@@@@~    :&@@@@@@@@@@@@@@@@@G         ^@@@@@@@@@@@@@@@ @@5           .
+                                                                                                                 +
+                                                                                                                 +
+ + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + +
*/

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol";
import "@openzeppelin/contracts/utils/Strings.sol";
import "../../standard/erc721a/ERC721A.sol";
import "../../base/common/HootBase.sol";
import "./extensions/HootBaseERC721Owners.sol";

/**
 * @title Hootbirds
 * @author HootLabs
 */
contract HootERC721A is
    HootBase,
    HootBaseERC721Owners,
    ERC721A,
    IERC721Enumerable
{
    using Strings for uint256;

    constructor(string memory name_, string memory symbol_)
        ERC721A(name_, symbol_)
    {}

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

    /***********************************|
    |               Config              |
    |__________________________________*/
    function _startTokenId() internal view virtual override returns (uint256) {
        return 1;
    }

    /***********************************|
    |               Core                |
    |__________________________________*/

    /**
     * @notice issuer have permission to burn token.
     * @param tokenIds_ list of tokenId
     */
    function burn(uint256[] calldata tokenIds_)
        external
        onlyOwner
        nonReentrant
    {
        for (uint256 i = 0; i < tokenIds_.length; i++) {
            uint256 tokenId = tokenIds_[i];
            require(ownerOf(tokenId) == _msgSender(), "caller is not owner");
            _burn(tokenId);
        }
    }

    function totalBurned() external view returns (uint256) {
        return _totalBurned();
    }
    function totalMinted() external view returns (uint256) {
        return _totalMinted();
    }

    /***********************************|
    |        IERC721Enumerable          |
    |__________________________________*/
    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see `_totalMinted`.
     */
    function totalSupply() public view override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than `_currentIndex - _startTokenId()` times.
        unchecked {
            return _totalMinted() - _totalBurned();
        }
    }

    function tokenOfOwnerByIndex(address owner, uint256 index)
        external
        view
        override
        returns (uint256)
    {
        require(owner != address(0), "invalid owner");
        uint256 stopTokenId = _startTokenId() + _totalMinted();
        uint256 scanIndex = 0;
        for (uint256 tokenId = _startTokenId(); tokenId < stopTokenId; tokenId++) {
            if (unsafeOwnerOf(tokenId) != owner) {
                continue;
            }
            if (scanIndex == index) {
                return tokenId;
            }
            ++scanIndex;
        }
        return 0;
    }

    function tokenByIndex(uint256 index) external view override returns (uint256) {
        require(index < _totalMinted(), "out of range");
        return _startTokenId() + index;
    }

    /***********************************|
    |        HootBaseERC721Owners       |
    |__________________________________*/
    function _unsafeOwnerOf(uint256 tokenId_) internal view virtual override returns (address){
        return unsafeOwnerOf(tokenId_);
    }

    /***********************************|
    |               ERC721A             |
    |__________________________________*/
    /**
     * @notice hook function, used to intercept the transfer of token.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual override {
        require(!paused(), "token transfer paused");
        super._beforeTokenTransfers(from, to, startTokenId, quantity);
    }
}

File 7 of 22 : HootBaseERC721Owners.sol
// SPDX-License-Identifier: MIT
/*
+ + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + +
+                                                                                                                 +
+                                                                                                                 +
.                        .^!!~:                                                 .^!!^.                            .
.                            :7Y5Y7^.                                       .^!J5Y7^.                             .
.                              :!5B#GY7^.                             .^!JP##P7:                                  .
.   7777??!         ~????7.        :5@@@@&GY7^.                    .^!JG#@@@@G^        7????????????^ ~????77     .
.   @@@@@G          P@@@@@:       J#@@@@@@@@@@&G57~.          .^7YG#@@@@@@@@@@&5:      #@@@@@@@@@@@@@? P@@@@@@    .
.   @@@@@G          5@@@@@:     :B@@@@@BJG@@@@@@@@@&B5?~:^7YG#@@@@@@@@BJP@@@ @@&!!     #@@@@@@@@@@@@@? P@@@@@@    .
.   @@@@@G          5@@@@@:    .B@@@@#!!J@@@@@@@@@@@@@@@&@@@@@@@@@@@@@@@P   ^G@@@@@~.   ^~~~~~^J@ @@@@??:~~~~~    .
.   @@@@@B^^^^^^^^. 5@@@@@:   J@@@@&^   G@7?@@@@@@&@@@@@@@@@@@&@J7&@@@@@#.   .B@@@@P           !@@@@@?            .
.   @@@@@@@@@@@@@@! 5@@@@@:   5@@@@B   ^B&&@@@@@#!#@@@@@@@@@@7G&&@@@@@#!     Y@@@@#.           !@@@@@?            .
.   @@@@@@@@@@@@@@! P@@@@@:   ?@@@@&^    !YPGPY!  !@@@@@Y&@@@@Y  ~YPGP57.    .B@@@@P           !@@@@@?            .
.   @@@@@B~~~~~~~!!.?GPPGP:   .B@@@@&7           ?&@@@@P ?@@@@@5.          ~B@@@@&^            !@@@@@?            .
.   @@@@@G          ^~~~~~.    :G@@@@@BY7~^^~75#@@@@@5.    J@@@@@&P?~^^^!JG@@@@@#~             !@@@@@?            .
.   @@@@@G          5@@@@@:      ?B@@@@@@@@@@@@@@@@B!!      ^P@@@@@@@@@@@@@@@@&Y               !@@@@@?            .
.   @@@@@G.         P@@@@@:        !YB&@@@@@@@@&BY~           ^JG#@@@@@@@@&#P7.                !@@@@@?            .
.   YYYYY7          !YJJJJ.            :~!7??7!^:                 .^!7??7!~:                   ^YJJJY~            .
.                                                                                                                 .
.                                                                                                                 .
.                                                                                                                 .
.                                  ………………               …………………………………………                  …………………………………………        .
.   PBGGB??                      7&######&5            :B##############&5               .G#################^      .
.   &@@@@5                      ?@@@@@@@@@@           :@@@@@@@@@@@@@@@@@G               &@@@@@@@@@@@@ @@@@@^      .
.   PBBBBJ                 !!!!!JPPPPPPPPPY !!!!!     :&@@@@P?JJJJJJJJJJJJJJ?      :JJJJJJJJJJJJJJJJJJJJJJ.       .
.   ~~~~~:                .#@@@@Y          ~@@@@@~    :&@@@@7           ~@@@&.      ^@@@@.                        .
.   #@@@@Y                .#@@@@G?JJJJJJJJ?5@@@@@~    :&@@@@7   !JJJJJJJJJJJJ?     :JJJJJJJJJJJJJJJJJ!!           .
.   #@@@@Y                .#@@@@@@@@@@@@@@@@@@@@@@~   :&@@@@7   G@@@@@@@@G &@@             @@@@@@@@@@P            .
.   #@@@@Y                .#@@@@&##########&@@@@@~    :&@@@@7   7YYYYYYYYJ???7             JYYYYYYYYYYYYJ???7     .
.   #@@@@Y                .#@@@@5 ........ !@@@@@~    :&@@@@7            ~@@@&.                         !@@@#     .
.   #@@@@#5PPPPPPPPPJJ    .#@@@@Y          !@@@@@~    :&@@@@P7??????????JYY5J      .?????????? ???????JYY5J       .
.   &@@@@@@@@@@@@@@@@@    .#@@@@Y          !@@@@@~    :&@@@@@@@@@@@@@@@@@G         ^@@@@@@@@@@@@@@@@@P            .
.   PBBBBBBBBBBBBBBBBY    .#@@@@Y          !@@@@@~    :&@@@@@@@@@@@@@@@@@G         ^@@@@@@@@@@@@@@@ @@5           .
+                                                                                                                 +
+                                                                                                                 +
+ + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + +
*/

pragma solidity ^0.8.0;

/**
 * @title HootBaseERC721Refund
 * @author HootLabs
 */
abstract contract HootBaseERC721Owners {
    /***********************************|
    |               abstract            |
    |__________________________________*/
    function _unsafeOwnerOf(uint256 tokenId_)
        internal
        view
        virtual
        returns (address);

    /***********************************|
    |               Core                |
    |__________________________________*/
    function exists(uint256 tokenId_) public view virtual returns (bool) {
        return _unsafeOwnerOf(tokenId_) != address(0);
    }

    function ownersOf(uint256[] calldata tokenIDs_)
        external
        view
        virtual
        returns (address[] memory)
    {
        address[] memory owners = new address[](tokenIDs_.length);
        for (uint256 i = 0; i < tokenIDs_.length; ++i) {
            owners[i] = _unsafeOwnerOf(tokenIDs_[i]);
        }
        return owners;
    }
}

File 8 of 22 : HootBase.sol
// SPDX-License-Identifier: MIT
/*
+ + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + +
+                                                                                                                 +
+                                                                                                                 +
.                        .^!!~:                                                 .^!!^.                            .
.                            :7Y5Y7^.                                       .^!J5Y7^.                             .
.                              :!5B#GY7^.                             .^!JP##P7:                                  .
.   7777??!         ~????7.        :5@@@@&GY7^.                    .^!JG#@@@@G^        7????????????^ ~????77     .
.   @@@@@G          P@@@@@:       J#@@@@@@@@@@&G57~.          .^7YG#@@@@@@@@@@&5:      #@@@@@@@@@@@@@? P@@@@@@    .
.   @@@@@G          5@@@@@:     :B@@@@@BJG@@@@@@@@@&B5?~:^7YG#@@@@@@@@BJP@@@ @@&!!     #@@@@@@@@@@@@@? P@@@@@@    .
.   @@@@@G          5@@@@@:    .B@@@@#!!J@@@@@@@@@@@@@@@&@@@@@@@@@@@@@@@P   ^G@@@@@~.   ^~~~~~^J@ @@@@??:~~~~~    .
.   @@@@@B^^^^^^^^. 5@@@@@:   J@@@@&^   G@7?@@@@@@&@@@@@@@@@@@&@J7&@@@@@#.   .B@@@@P           !@@@@@?            .
.   @@@@@@@@@@@@@@! 5@@@@@:   5@@@@B   ^B&&@@@@@#!#@@@@@@@@@@7G&&@@@@@#!     Y@@@@#.           !@@@@@?            .
.   @@@@@@@@@@@@@@! P@@@@@:   ?@@@@&^    !YPGPY!  !@@@@@Y&@@@@Y  ~YPGP57.    .B@@@@P           !@@@@@?            .
.   @@@@@B~~~~~~~!!.?GPPGP:   .B@@@@&7           ?&@@@@P ?@@@@@5.          ~B@@@@&^            !@@@@@?            .
.   @@@@@G          ^~~~~~.    :G@@@@@BY7~^^~75#@@@@@5.    J@@@@@&P?~^^^!JG@@@@@#~             !@@@@@?            .
.   @@@@@G          5@@@@@:      ?B@@@@@@@@@@@@@@@@B!!      ^P@@@@@@@@@@@@@@@@&Y               !@@@@@?            .
.   @@@@@G.         P@@@@@:        !YB&@@@@@@@@&BY~           ^JG#@@@@@@@@&#P7.                !@@@@@?            .
.   YYYYY7          !YJJJJ.            :~!7??7!^:                 .^!7??7!~:                   ^YJJJY~            .
.                                                                                                                 .
.                                                                                                                 .
.                                                                                                                 .
.                                  ………………               …………………………………………                  …………………………………………        .
.   PBGGB??                      7&######&5            :B##############&5               .G#################^      .
.   &@@@@5                      ?@@@@@@@@@@           :@@@@@@@@@@@@@@@@@G               &@@@@@@@@@@@@ @@@@@^      .
.   PBBBBJ                 !!!!!JPPPPPPPPPY !!!!!     :&@@@@P?JJJJJJJJJJJJJJ?      :JJJJJJJJJJJJJJJJJJJJJJ.       .
.   ~~~~~:                .#@@@@Y          ~@@@@@~    :&@@@@7           ~@@@&.      ^@@@@.                        .
.   #@@@@Y                .#@@@@G?JJJJJJJJ?5@@@@@~    :&@@@@7   !JJJJJJJJJJJJ?     :JJJJJJJJJJJJJJJJJ!!           .
.   #@@@@Y                .#@@@@@@@@@@@@@@@@@@@@@@~   :&@@@@7   G@@@@@@@@G &@@             @@@@@@@@@@P            .
.   #@@@@Y                .#@@@@&##########&@@@@@~    :&@@@@7   7YYYYYYYYJ???7             JYYYYYYYYYYYYJ???7     .
.   #@@@@Y                .#@@@@5 ........ !@@@@@~    :&@@@@7            ~@@@&.                         !@@@#     .
.   #@@@@#5PPPPPPPPPJJ    .#@@@@Y          !@@@@@~    :&@@@@P7??????????JYY5J      .?????????? ???????JYY5J       .
.   &@@@@@@@@@@@@@@@@@    .#@@@@Y          !@@@@@~    :&@@@@@@@@@@@@@@@@@G         ^@@@@@@@@@@@@@@@@@P            .
.   PBBBBBBBBBBBBBBBBY    .#@@@@Y          !@@@@@~    :&@@@@@@@@@@@@@@@@@G         ^@@@@@@@@@@@@@@@ @@5           .
+                                                                                                                 +
+                                                                                                                 +
+ + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + +
*/

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/security/Pausable.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/introspection/IERC165.sol";

contract HootBase is ReentrancyGuard, Pausable, Ownable {
    event PermissionChanged(address indexed addr, uint8 permission);

    event Deposit(address indexed account, uint256 amount);
    event Withdraw(address indexed account, uint256 amount);
    event ContractParsed();
    event ContractUnparsed();
    event ContractSealed();

    uint8 public constant NO_PERMISSION = 0;
    uint8 public constant MANAGER = 1;
    uint8 public constant MAINTAINER = 2;
    uint8 public constant OPERATOR = 3;

    mapping(address => uint8) private _permissions;
    address[] maintainers;

    bool public contractSealed = false;

    /***********************************|
    |               Config              |
    |__________________________________*/
    /**
     * @notice setManagerAddress is used to allow the issuer to modify the maintainerAddress
     */
    function setPermission(address address_, uint8 permission_)
        external
        onlyOwner
    {
        if (permission_ == NO_PERMISSION) {
            delete _permissions[address_];
        } else {
            _permissions[address_] = permission_;
        }

        emit PermissionChanged(address_, permission_);
    }

    function getPermissions()
        external
        view
        atLeastManager
        returns (address[] memory, uint8[] memory)
    {
        uint8[] memory permissions = new uint8[](maintainers.length);
        unchecked {
            for (uint256 i = 0; i < maintainers.length; i++) {
                permissions[i] = _permissions[maintainers[i]];
            }
        }
        return (maintainers, permissions);
    }

    function getPermission(address address_) external view returns (uint8) {
        return _permissions[address_];
    }

    /***********************************|
    |               Core                |
    |__________________________________*/
    /**
     * @notice issuer deposit ETH into the contract. only issuer have permission
     */
    function deposit() external payable atLeastMaintainer nonReentrant {
        emit Deposit(_msgSender(), msg.value);
    }

    /**
     * issuer withdraws the ETH temporarily stored in the contract through this method.
     */
    function withdraw() external onlyOwner nonReentrant {
        uint256 balance = address(this).balance;
        payable(_msgSender()).transfer(balance);
        emit Withdraw(_msgSender(), balance);
    }

    /***********************************|
    |               Basic               |
    |__________________________________*/
    /**
     * @notice for the purpose of protecting user assets, under extreme conditions,
     * the circulation of all tokens in the contract needs to be frozen.
     * This process is under the supervision of the community.
     */
    function emergencyPause() external atLeastManager notSealed {
        _pause();
        emit ContractParsed();
    }

    /**
     * @notice unpause the contract
     */
    function unpause() external atLeastManager notSealed {
        _unpause();
        emit ContractUnparsed();
    }

    /**
     * @notice when the project is stable enough, the issuer will call sealContract
     * to give up the permission to call emergencyPause and unpause.
     */
    function sealContract() external onlyOwner {
        contractSealed = true;
        emit ContractSealed();
    }

    /***********************************|
    |               Modifier            |
    |__________________________________*/
    /**
     * @notice only owner or manager has the permission to call this method
     */
    modifier atLeastManager() {
        uint8 permission = _permissions[_msgSender()];
        require(
            owner() == _msgSender() || permission == MANAGER,
            "not authorized"
        );
        _;
    }
    /**
     * @notice only owner, manager or maintainer has the permission to call this method
     */
    modifier atLeastMaintainer() {
        uint8 permission = _permissions[_msgSender()];
        require(
            owner() == _msgSender() ||
                permission == MAINTAINER ||
                permission == MANAGER,
            "not authorized"
        );
        _;
    }
    /**
     * @notice only owner, manager or maintainer or operator has the permission to call this method
     */
    modifier atLeastOperator() {
        uint8 permission = _permissions[_msgSender()];
        require(
            owner() == _msgSender() ||
                permission == MAINTAINER ||
                permission == MANAGER ||
                permission == OPERATOR,
            "not authorized"
        );
        _;
    }

    /**
     * @notice for security reasons, CA is not allowed to call sensitive methods.
     */
    modifier callerIsUser() {
        require(tx.origin == _msgSender(), "caller is another contract");
        _;
    }

    /**
     * @notice function call is only allowed when the contract has not been sealed
     */
    modifier notSealed() {
        require(!contractSealed, "contract sealed");
        _;
    }
}

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

pragma solidity ^0.8.0;

import "../IERC721.sol";

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

File 13 of 22 : ERC721A.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.0.0
// 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";
import "./IERC721Extra.sol";

/**
 * @dev ERC721 token receiver interface.
 */
interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

/**
 * @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, IERC721Extra {
    // Mask of an entry in packed address data.
    uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

    // The bit position of `numberMinted` in packed address data.
    uint256 private constant BITPOS_NUMBER_MINTED = 64;

    // The bit position of `numberBurned` in packed address data.
    uint256 private constant BITPOS_NUMBER_BURNED = 128;

    // The bit position of `aux` in packed address data.
    uint256 private constant BITPOS_AUX = 192;

    // Mask of all 256 bits in packed address data except the 64 bits for `aux`.
    uint256 private constant BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;

    // The bit position of `startTimestamp` in packed ownership.
    uint256 private constant BITPOS_START_TIMESTAMP = 160;

    // The bit mask of the `burned` bit in packed ownership.
    uint256 private constant BITMASK_BURNED = 1 << 224;
    
    // The bit position of the `nextInitialized` bit in packed ownership.
    uint256 private constant BITPOS_NEXT_INITIALIZED = 225;

    // The bit mask of the `nextInitialized` bit in packed ownership.
    uint256 private constant BITMASK_NEXT_INITIALIZED = 1 << 225;

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

    // The number of tokens burned.
    uint256 private _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 `_packedOwnershipOf` implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    mapping(uint256 => uint256) private _packedOwnerships;

    // Mapping owner address to address data.
    //
    // Bits Layout:
    // - [0..63]    `balance`
    // - [64..127]  `numberMinted`
    // - [128..191] `numberBurned`
    // - [192..255] `aux`
    mapping(address => uint256) private _packedAddressData;

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

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

    /**
     * @dev Returns the next token ID to be minted.
     */
    function _nextTokenId() internal view returns (uint256) {
        return _currentIndex;
    }

    /**
     * @dev 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 Returns the total number of tokens burned.
     */
    function _totalBurned() internal view returns (uint256) {
        return _burnCounter;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        // The interface IDs are constants representing the first 4 bytes of the XOR of
        // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165
        // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

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

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY;
    }

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

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return uint64(_packedAddressData[owner] >> BITPOS_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 {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        assembly { // Cast aux without masking.
            auxCasted := aux
        }
        packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

    /**
     * Returns the packed ownership data of `tokenId`.
     */
    function _unsafePackedOwnershipOf(uint256 tokenId) private view returns (uint256) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & BITMASK_BURNED == 0) {
                        // 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.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed is zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        return 0;
    }
    /**
     * Returns the packed ownership data of `tokenId`.
     */
    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
        uint256 packed = _unsafePackedOwnershipOf(tokenId);
        if(packed == 0){
            revert OwnerQueryForNonexistentToken();
        }
        return packed;
    }

    /**
     * Returns the unpacked `TokenOwnership` struct from `packed`.
     */
    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP);
        ownership.burned = packed & BITMASK_BURNED != 0;
    }

    /**
     * Returns the unpacked `TokenOwnership` struct at `index`.
     */
    function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnerships[index]);
    }

    /**
     * @dev Initializes the ownership slot minted at `index` for efficiency purposes.
     */
    function _initializeOwnershipAt(uint256 index) internal {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);
        }
    }

    /**
     * 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) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }
    function unsafeOwnerOf(uint256 tokenId) public view virtual returns (address) {
        return address(uint160(_unsafePackedOwnershipOf(tokenId)));
    }

    /**
     * @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, _toString(tokenId))) : '';
    }

    /**
     * @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 Casts the address to uint256 without masking.
     */
    function _addressToUint256(address value) private pure returns (uint256 result) {
        assembly {
            result := value
        }
    }

    /**
     * @dev Casts the boolean to uint256 without branching.
     */
    function _boolToUint256(bool value) private pure returns (uint256 result) {
        assembly {
            result := value
        }
    }

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

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

        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @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 == _msgSenderERC721A()) revert ApproveToCaller();

        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), 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.code.length != 0)
            if (!_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 && // If within bounds,
            _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned.
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    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 {
        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 {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

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

            if (to.code.length != 0) {
                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 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) 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 {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

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

            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 {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        delete _tokenApprovals[tokenId];

        // 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 {
            // We can directly increment and decrement the balances.
            --_packedAddressData[from]; // Updates: `balance -= 1`.
            ++_packedAddressData[to]; // Updates: `balance += 1`.

            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_NEXT_INITIALIZED;

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

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

    /**
     * @dev 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 {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        address from = address(uint160(prevOwnershipPacked));

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

        // Clear approvals from the previous owner.
        delete _tokenApprovals[tokenId];

        // 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 {
            // Updates:
            // - `balance -= 1`.
            // - `numberBurned += 1`.
            //
            // We can directly decrement the balance, and increment the number burned.
            // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`.
            _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1;

            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] =
                _addressToUint256(from) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_BURNED | 
                BITMASK_NEXT_INITIALIZED;

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

        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 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 ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
            bytes4 retval
        ) {
            return retval == ERC721A__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 {}

    /**
     * @dev Returns the message sender (defaults to `msg.sender`).
     *
     * If you are writing GSN compatible contracts, you need to override this function.
     */
    function _msgSenderERC721A() internal view virtual returns (address) {
        return msg.sender;
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function _toString(uint256 value) internal pure returns (string memory ptr) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit), 
            // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged.
            // We will need 1 32-byte word to store the length, 
            // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128.
            ptr := add(mload(0x40), 128)
            // Update the free memory pointer to allocate.
            mstore(0x40, ptr)

            // Cache the end of the memory to calculate the length later.
            let end := ptr

            // We write the string from the rightmost digit to the leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // Costs a bit more than early returning for the zero case,
            // but cheaper in terms of deployment and overall runtime costs.
            for { 
                // Initialize and perform the first pass without check.
                let temp := value
                // Move the pointer 1 byte leftwards to point to an empty character slot.
                ptr := sub(ptr, 1)
                // Write the character to the pointer. 48 is the ASCII index of '0'.
                mstore8(ptr, add(48, mod(temp, 10)))
                temp := div(temp, 10)
            } temp { 
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
            } { // Body of the for loop.
                ptr := sub(ptr, 1)
                mstore8(ptr, add(48, mod(temp, 10)))
            }
            
            let length := sub(end, ptr)
            // Move the pointer 32 bytes leftwards to make room for the length.
            ptr := sub(ptr, 32)
            // Store the length.
            mstore(ptr, length)
        }
    }
}

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

pragma solidity ^0.8.0;

import "../IERC721.sol";

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

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

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

File 15 of 22 : IERC721Extra.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.0.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

/**
 * @dev Interface of an ERC721A compliant contract.
 */
interface IERC721Extra {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * The caller cannot approve to their own address.
     */
    error ApproveToCaller();

    /**
     * The caller cannot approve to the current owner.
     */
    error ApprovalToCurrentOwner();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

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

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

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

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

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

File 21 of 22 : Pausable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (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 Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        _requireNotPaused();
        _;
    }

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

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

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        require(!paused(), "Pausable: paused");
    }

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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

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

Contract Security Audit

Contract ABI

[{"inputs":[],"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":"string","name":"uri","type":"string"}],"name":"BaseURIChanged","type":"event"},{"anonymous":false,"inputs":[],"name":"ContractParsed","type":"event"},{"anonymous":false,"inputs":[],"name":"ContractSealed","type":"event"},{"anonymous":false,"inputs":[],"name":"ContractUnparsed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"contractAddr","type":"address"},{"components":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"stopTime","type":"uint256"},{"internalType":"uint64","name":"supplyOfHolder","type":"uint64"}],"indexed":false,"internalType":"struct YINGHelloNewWorld.HolderMintConfig","name":"cfg","type":"tuple"}],"name":"HolderMintConfigChanged","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":"partnerContract","type":"address"},{"indexed":false,"internalType":"uint256","name":"maxSupply","type":"uint256"}],"name":"PartnerContractAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"partnerContract","type":"address"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint64","name":"amount_","type":"uint64"}],"name":"PartnerSaled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"uint8","name":"permission","type":"uint8"}],"name":"PermissionChanged","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"stopTime","type":"uint256"},{"internalType":"uint64","name":"supplyOfOwner","type":"uint64"}],"indexed":false,"internalType":"struct YINGHelloNewWorld.SaleConfig","name":"cfg","type":"tuple"}],"name":"PublicSaleConfigChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"isRaisingAllowed","type":"bool"},{"indexed":false,"internalType":"bool","name":"isRaisingTransferAllowed","type":"bool"}],"name":"RaisingAllowedFlagChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"operator","type":"address"}],"name":"RaisingInterrupted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint16","name":"raisingType","type":"uint16"},{"indexed":false,"internalType":"bool","name":"isStart","type":"bool"}],"name":"RaisingStatusChanged","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":"RaisingTokenTransfered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"refundAddress","type":"address"}],"name":"RefundAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"stopTime","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"}],"indexed":false,"internalType":"struct HootBaseERC721Refund.RefundConfig","name":"config","type":"tuple"}],"name":"RefundConfigChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Refunded","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"stopTime","type":"uint256"},{"internalType":"address","name":"yingAddress","type":"address"}],"indexed":false,"internalType":"struct YINGHelloNewWorld.RevealConfig","name":"cfg","type":"tuple"}],"name":"RevealConfigChanged","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":[{"components":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"stopTime","type":"uint256"},{"internalType":"uint64","name":"supplyOfOwner","type":"uint64"}],"indexed":false,"internalType":"struct YINGHelloNewWorld.SaleConfig","name":"cfg","type":"tuple"}],"name":"WhitelistSaleConfigChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"uint256","name":"maxSaleSupply","type":"uint256"},{"internalType":"uint256","name":"maxSelfSupply","type":"uint256"},{"internalType":"bool","name":"rejectFreeMintRefund","type":"bool"}],"indexed":false,"internalType":"struct YINGHelloNewWorld.YINGConfig","name":"cfg","type":"tuple"}],"name":"YINGConfigChanged","type":"event"},{"inputs":[],"name":"CONTRACT_SHIELD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAINTAINER","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MANAGER","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NO_PERMISSION","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"partnerContract_","type":"address"},{"internalType":"uint64","name":"maxSupply_","type":"uint64"}],"name":"addPartnerContract","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":[{"internalType":"uint256[]","name":"tokenIds_","type":"uint256[]"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractSealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds_","type":"uint256[]"},{"internalType":"uint16","name":"raisingType_","type":"uint16"},{"internalType":"bool","name":"isStart_","type":"bool"}],"name":"doTokenRaising","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencyPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"contractAddr_","type":"address"},{"internalType":"uint256[]","name":"tokenIDs_","type":"uint256[]"}],"name":"getHolderMinted","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"}],"name":"getPermission","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPermissions","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint8[]","name":"","type":"uint8[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"getSaleBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIDs_","type":"uint256[]"}],"name":"getTokenRaisingStatus","outputs":[{"components":[{"internalType":"uint256","name":"total","type":"uint256"},{"internalType":"uint256","name":"current","type":"uint256"},{"internalType":"uint16","name":"raisingType","type":"uint16"},{"internalType":"bool","name":"isRaising","type":"bool"}],"internalType":"struct HootBaseERC721Raising.RaisingCurrentStatus[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddr_","type":"address"},{"internalType":"uint256[]","name":"tokenIDs_","type":"uint256[]"},{"internalType":"uint64[]","name":"amounts_","type":"uint64[]"}],"name":"holdersSale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds_","type":"uint256[]"}],"name":"interruptTokenRaising","outputs":[],"stateMutability":"nonpayable","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":"tokenId_","type":"uint256"}],"name":"isFreeMintToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"isFreeMintYINGToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicSaleEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRaisingAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRaisingTransferAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRefundEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRevealEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"},{"internalType":"bytes32[]","name":"signature_","type":"bytes32[]"}],"name":"isWhitelistAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isWhitelistSaleEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIDs_","type":"uint256[]"}],"name":"ownersOf","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint64","name":"amount_","type":"uint64"}],"name":"partnerSale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"amount_","type":"uint64"}],"name":"publicSale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicSaleCfg","outputs":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"stopTime","type":"uint256"},{"internalType":"uint64","name":"supplyOfOwner","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"refund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"refundAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"refundConfig","outputs":[{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"stopTime","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"reveal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds_","type":"uint256[]"}],"name":"revealBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealCfg","outputs":[{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"stopTime","type":"uint256"},{"internalType":"address","name":"yingAddress","type":"address"}],"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":"from_","type":"address"},{"internalType":"address","name":"to_","type":"address"},{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"safeTransferWhileRaising","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sealContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"numberOfTokens_","type":"uint64"}],"name":"selfMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"selfMinted","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddr_","type":"address"},{"components":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"stopTime","type":"uint256"},{"internalType":"uint64","name":"supplyOfHolder","type":"uint64"}],"internalType":"struct YINGHelloNewWorld.HolderMintConfig","name":"cfg_","type":"tuple"}],"name":"setHolderMintConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isRaisingAllowed_","type":"bool"},{"internalType":"bool","name":"isRaisingTransferAllowed_","type":"bool"}],"name":"setIsRaisingAllowed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"},{"internalType":"uint8","name":"permission_","type":"uint8"}],"name":"setPermission","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"stopTime","type":"uint256"},{"internalType":"uint64","name":"supplyOfOwner","type":"uint64"}],"internalType":"struct YINGHelloNewWorld.SaleConfig","name":"cfg_","type":"tuple"}],"name":"setPublicSaleConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"refundAddress_","type":"address"}],"name":"setRefundAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"stopTime","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"}],"internalType":"struct HootBaseERC721Refund.RefundConfig","name":"cfg_","type":"tuple"}],"name":"setRefundConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"stopTime","type":"uint256"},{"internalType":"address","name":"yingAddress","type":"address"}],"internalType":"struct YINGHelloNewWorld.RevealConfig","name":"cfg_","type":"tuple"}],"name":"setRevealConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"stopTime","type":"uint256"},{"internalType":"uint64","name":"supplyOfOwner","type":"uint64"}],"internalType":"struct YINGHelloNewWorld.SaleConfig","name":"cfg_","type":"tuple"},{"internalType":"bytes32","name":"root_","type":"bytes32"}],"name":"setWhitelistSaleConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"uint256","name":"maxSaleSupply","type":"uint256"},{"internalType":"uint256","name":"maxSelfSupply","type":"uint256"},{"internalType":"bool","name":"rejectFreeMintRefund","type":"bool"}],"internalType":"struct YINGHelloNewWorld.YINGConfig","name":"cfg_","type":"tuple"}],"name":"setYINGConfig","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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"unsafeOwnerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds_","type":"uint256[]"}],"name":"unsafeTokenURIBatch","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"signature_","type":"bytes32[]"},{"internalType":"uint64","name":"amount_","type":"uint64"}],"name":"whitelistSale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"whitelistSaleCfg","outputs":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"stopTime","type":"uint256"},{"internalType":"uint64","name":"supplyOfOwner","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"yingCfg","outputs":[{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"uint256","name":"maxSaleSupply","type":"uint256"},{"internalType":"uint256","name":"maxSelfSupply","type":"uint256"},{"internalType":"bool","name":"rejectFreeMintRefund","type":"bool"}],"stateMutability":"view","type":"function"}]

60806040526004805460ff191690553480156200001b57600080fd5b50604080518082018252601581527f59494e473a2048656c6c6f204e657720576f726c6400000000000000000000006020808301919091528251808401909352600483526359494e4760e01b9083015260016000819055805460ff191690559081816200008833620000cf565b6006805462010000600160b01b031916620100003302179055600d620000af8382620001ce565b50600e620000be8282620001ce565b506001600b55506200029a92505050565b600180546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200015457607f821691505b6020821081036200017557634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620001c957600081815260208120601f850160051c81016020861015620001a45750805b601f850160051c820191505b81811015620001c557828155600101620001b0565b5050505b505050565b81516001600160401b03811115620001ea57620001ea62000129565b6200020281620001fb84546200013f565b846200017b565b602080601f8311600181146200023a5760008415620002215750858301515b600019600386901b1c1916600185901b178555620001c5565b600085815260208120601f198616915b828110156200026b578886015182559484019460019091019084016200024a565b50858210156200028a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b615e8780620002aa6000396000f3fe6080604052600436106104895760003560e01c8063763c1c9911610255578063c2ca0ac511610144578063dd5ddfe8116100c1578063e985e9c511610085578063e985e9c514610e9d578063ecbd68df14610ee6578063ef11e90514610efb578063f2fde38b14610f1b578063f37e20ba14610f3b578063f68dc5de14610f5657600080fd5b8063dd5ddfe814610e18578063de39782a14610e38578063df837ec214610e58578063e2bb193a14610e6b578063e697188f14610e7e57600080fd5b8063d41da0e011610108578063d41da0e014610d6a578063d5890fe814610d8a578063d5ef3a2214610daa578063d7d7dfb614610dd6578063d89135cd14610e0357600080fd5b8063c2ca0ac514610cc7578063c3a07df614610ce7578063c87b56dd14610d0a578063caeff92b14610d2a578063d0e30db014610d6257600080fd5b8063a22cb465116101d2578063b354bbb311610196578063b354bbb314610c12578063b650163714610c5a578063b7e0a77414610c74578063b80f55c914610c87578063b88d4fde14610ca757600080fd5b8063a22cb46514610b7b578063a2309ff814610b9b578063a2fafacd14610bb0578063a4b36c1c14610bdd578063aa21b38b14610bf257600080fd5b80638746475a116102195780638746475a14610ac45780638905896914610ad95780638da5cb5b14610b2e57806395d89b4114610b51578063983d273714610b6657600080fd5b8063763c1c99146109fb578063813ec0e814610a1b57806383c1cd8a14610a3b57806383d0703214610a7457806385b002a014610a9457600080fd5b80633ccfd60b1161037c57806355f804b3116102f957806368bd580e116102bd57806368bd580e1461092557806369e003061461093a5780636e5f0e731461094d57806370a0823114610999578063715018a6146109b957806375ef961f146109ce57600080fd5b806355f804b31461088057806356ab0648146108a05780635c975abb146108c05780635ff2f2e8146108d85780636352211e1461090557600080fd5b80634777a597116103405780634777a597146107d25780634f558e79146107f25780634f6ccce71461081257806351858e2714610832578063539090361461084757600080fd5b80633ccfd60b146107535780633f4ba83a146107685780634009920d1461077d57806342842e0e1461079257806345b57776146107b257600080fd5b8063205b18341161040a5780632ae0c8da116103ce5780632ae0c8da146106935780632e1dfd10146106c35780632eb4a7ab146106fd5780632f745c59146107135780633ae3c0201461073357600080fd5b8063205b18341461060457806323b872dd14610624578063278ecde11461064457806327ee47c7146106645780632aabb7261461067e57600080fd5b80630cb61f6c116104515780630cb61f6c1461055f57806315b75bea1461058557806318160ddd146105a55780631b2df850146105c85780631d63ff2b146105ef57600080fd5b806301ffc9a71461048e5780630282938e146104c357806306fdde03146104e5578063081812fc14610507578063095ea7b31461053f575b600080fd5b34801561049a57600080fd5b506104ae6104a9366004614e36565b610f76565b60405190151581526020015b60405180910390f35b3480156104cf57600080fd5b506104e36104de366004614e68565b610fa1565b005b3480156104f157600080fd5b506104fa6111c1565b6040516104ba9190614f01565b34801561051357600080fd5b50610527610522366004614f14565b611253565b6040516001600160a01b0390911681526020016104ba565b34801561054b57600080fd5b506104e361055a366004614f2d565b611297565b34801561056b57600080fd5b50600654610527906201000090046001600160a01b031681565b34801561059157600080fd5b506104e36105a0366004614f59565b611369565b3480156105b157600080fd5b506105ba6113c5565b6040519081526020016104ba565b3480156105d457600080fd5b506105dd600181565b60405160ff90911681526020016104ba565b3480156105fb57600080fd5b506105dd600081565b34801561061057600080fd5b506104e361061f366004614f8b565b6113dd565b34801561063057600080fd5b506104e361063f366004614e68565b6114d2565b34801561065057600080fd5b506104e361065f366004614f14565b6114e2565b34801561067057600080fd5b506006546104ae9060ff1681565b34801561068a57600080fd5b506105dd600281565b34801561069f57600080fd5b506104ae6106ae366004614f14565b60009081526025602052604090205460ff1690565b3480156106cf57600080fd5b506007546008546009546106e292919083565b604080519384526020840192909252908201526060016104ba565b34801561070957600080fd5b506105ba60275481565b34801561071f57600080fd5b506105ba61072e366004614f2d565b611864565b34801561073f57600080fd5b506104e361074e366004614fc0565b611931565b34801561075f57600080fd5b506104e3611983565b34801561077457600080fd5b506104e3611a21565b34801561078957600080fd5b506104ae611af6565b34801561079e57600080fd5b506104e36107ad366004614e68565b611b10565b3480156107be57600080fd5b506104e36107cd366004614fee565b611b2b565b3480156107de57600080fd5b506105276107ed366004614f14565b611b72565b3480156107fe57600080fd5b506104ae61080d366004614f14565b611b7d565b34801561081e57600080fd5b506105ba61082d366004614f14565b611b9a565b34801561083e57600080fd5b506104e3611bf1565b34801561085357600080fd5b506105ba610862366004614f59565b6001600160a01b031660009081526010602052604090205460c01c90565b34801561088c57600080fd5b506104e361089b36600461500a565b611cc6565b3480156108ac57600080fd5b506104e36108bb36600461507b565b611d19565b3480156108cc57600080fd5b5060015460ff166104ae565b3480156108e457600080fd5b506108f86108f33660046150f1565b611d65565b6040516104ba9190615176565b34801561091157600080fd5b50610527610920366004614f14565b611e1b565b34801561093157600080fd5b506104e3611e26565b6104e3610948366004615189565b611e66565b34801561095957600080fd5b506020546021546022546109759291906001600160a01b031683565b6040805193845260208401929092526001600160a01b0316908201526060016104ba565b3480156109a557600080fd5b506105ba6109b4366004614f59565b61205b565b3480156109c557600080fd5b506104e36120a9565b3480156109da57600080fd5b506109ee6109e93660046150f1565b6120bd565b6040516104ba91906151df565b348015610a0757600080fd5b506104e3610a16366004615223565b6122fc565b348015610a2757600080fd5b506104e3610a3636600461526a565b61236e565b348015610a4757600080fd5b506105dd610a56366004614f59565b6001600160a01b031660009081526002602052604090205460ff1690565b348015610a8057600080fd5b506109ee610a8f366004615298565b61243c565b348015610aa057600080fd5b506104ae610aaf366004614f14565b60009081526026602052604090205460ff1690565b348015610ad057600080fd5b506104ae61250c565b348015610ae557600080fd5b50601854601954601a54601b54610b05939291906001600160401b031684565b604080519485526020850193909352918301526001600160401b031660608201526080016104ba565b348015610b3a57600080fd5b5060015461010090046001600160a01b0316610527565b348015610b5d57600080fd5b506104fa612524565b348015610b7257600080fd5b506105dd600381565b348015610b8757600080fd5b506104e3610b963660046152ec565b612533565b348015610ba757600080fd5b506105ba6125c8565b348015610bbc57600080fd5b50610bd0610bcb3660046150f1565b6125d7565b6040516104ba919061530a565b348015610be957600080fd5b506104ae612772565b348015610bfe57600080fd5b506104e3610c0d36600461536c565b6127a0565b348015610c1e57600080fd5b50601354601454601554601654610c389392919060ff1684565b60408051948552602085019390935291830152151560608201526080016104ba565b348015610c6657600080fd5b506004546104ae9060ff1681565b6104e3610c82366004615223565b612800565b348015610c9357600080fd5b506104e3610ca23660046150f1565b6129a4565b348015610cb357600080fd5b506104e3610cc23660046153e8565b612a56565b348015610cd357600080fd5b506105ba610ce2366004614f14565b612aa0565b348015610cf357600080fd5b50610cfc612c34565b6040516104ba9291906154ab565b348015610d1657600080fd5b506104fa610d25366004614f14565b612db9565b348015610d3657600080fd5b50602854610d4a906001600160401b031681565b6040516001600160401b0390911681526020016104ba565b6104e3612dc4565b348015610d7657600080fd5b506104ae610d85366004615298565b612e87565b348015610d9657600080fd5b506104e3610da5366004615505565b612f19565b348015610db657600080fd5b50601c54601d54601e54601f54610b05939291906001600160401b031684565b348015610de257600080fd5b50610df6610df13660046150f1565b6131de565b6040516104ba9190615573565b348015610e0f57600080fd5b506105ba61341d565b348015610e2457600080fd5b506104e3610e333660046155dd565b613428565b348015610e4457600080fd5b506104e3610e53366004614fc0565b6134c8565b6104e3610e66366004615611565b61350f565b6104e3610e79366004614f8b565b613891565b348015610e8a57600080fd5b506006546104ae90610100900460ff1681565b348015610ea957600080fd5b506104ae610eb8366004615693565b6001600160a01b03918216600090815260126020908152604080832093909416825291909152205460ff1690565b348015610ef257600080fd5b506104ae6139e5565b348015610f0757600080fd5b506104e3610f16366004614fee565b6139fd565b348015610f2757600080fd5b506104e3610f36366004614f59565b613a5b565b348015610f4757600080fd5b506105ba6606e659d948720d81565b348015610f6257600080fd5b506104e3610f713660046150f1565b613ad4565b60006001600160e01b0319821663780e9d6360e01b1480610f9b5750610f9b82613cbb565b92915050565b600260005403610fcc5760405162461bcd60e51b8152600401610fc3906156c1565b60405180910390fd5b6002600055336040516331a9108f60e11b8152600481018390526001600160a01b0391909116903090636352211e90602401602060405180830381865afa15801561101b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061103f91906156f8565b6001600160a01b0316146110655760405162461bcd60e51b8152600401610fc390615715565b600654610100900460ff166110ca5760405162461bcd60e51b815260206004820152602560248201527f7472616e73666572207768696c652072616973696e67206973206e6f7420656e60448201526418589b195960da1b6064820152608401610fc3565b60008181526005602052604090819020600201805462ff000019166201000017905551632142170760e11b81526001600160a01b038481166004830152831660248201526044810182905230906342842e0e90606401600060405180830381600087803b15801561113a57600080fd5b505af115801561114e573d6000803e3d6000fd5b505050600082815260056020526040902060028101805462ff000019169055541590506111b75780826001600160a01b0316846001600160a01b03167ff315af4c34ce2407cc1da2405672c4c7387fd44d616401235c21ef22b9bbd13860405160405180910390a45b5050600160005550565b6060600d80546111d090615742565b80601f01602080910402602001604051908101604052809291908181526020018280546111fc90615742565b80156112495780601f1061121e57610100808354040283529160200191611249565b820191906000526020600020905b81548152906001019060200180831161122c57829003601f168201915b5050505050905090565b600061125e82613d09565b61127b576040516333d1c03960e21b815260040160405180910390fd5b506000908152601160205260409020546001600160a01b031690565b60006112a282613d3e565b9050806001600160a01b0316836001600160a01b0316036112d65760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b0382161461130d576112f08133610eb8565b61130d576040516367d9dca160e11b815260040160405180910390fd5b60008281526011602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b611371613d6d565b6006805462010000600160b01b031916620100006001600160a01b038416908102919091179091556040517fa7cb165192538768851363c5aa55b1ade75d692a51063730feccdd57d002a6ed90600090a250565b60006113d0600c5490565b600b546000190103905090565b6113e5613d6d565b6002600054036114075760405162461bcd60e51b8152600401610fc3906156c1565b60026000556001600160401b0381166114325760405162461bcd60e51b8152600401610fc390615776565b6028546015546001600160401b03918216830191821611156114965760405162461bcd60e51b815260206004820152601860248201527f6d61782073656c6620737570706c7920657863656564656400000000000000006044820152606401610fc3565b6114a933836001600160401b0316613dcd565b6028805467ffffffffffffffff19166001600160401b0392909216919091179055506001600055565b6114dd838383613ea9565b505050565b3233146115015760405162461bcd60e51b8152600401610fc3906157ad565b6002600054036115235760405162461bcd60e51b8152600401610fc3906156c1565b60026000556040516331a9108f60e11b8152600481018290523090636352211e90602401602060405180830381865afa158015611564573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061158891906156f8565b6001600160a01b0316336001600160a01b0316146115da5760405162461bcd60e51b815260206004820152600f60248201526e3737ba103a37b5b2b71037bbb732b960891b6044820152606401610fc3565b6006546201000090046001600160a01b031633036116485760405162461bcd60e51b815260206004820152602560248201527f73746f636b206163636f756e7420726566756e647320617265206e6f7420616c6044820152641b1bddd95960da1b6064820152608401610fc3565b61165061250c565b61169c5760405162461bcd60e51b815260206004820152601d60248201527f6f7574736964652074686520726566756e6461626c6520706572696f640000006044820152606401610fc3565b60006116a78261404c565b9050600081116116f95760405162461bcd60e51b815260206004820152601d60248201527f6f6e6c792073616c65204e46542063616e20626520726566756e6465640000006044820152606401610fc3565b804710156117495760405162461bcd60e51b815260206004820152601b60248201527f696e73756666696369656e7420636f6e74726163742066756e647300000000006044820152606401610fc3565b60065460408051632142170760e11b8152336004820152620100009092046001600160a01b03166024830152604482018490525130916342842e0e91606480830192600092919082900301818387803b1580156117a557600080fd5b505af11580156117b9573d6000803e3d6000fd5b505050506117c43390565b6001600160a01b03166108fc829081150290604051600060405180830381858888f193505050501580156117fc573d6000803e3d6000fd5b506006546201000090046001600160a01b0316336001600160a01b03167f88808afc48888c0e3ec9c545474e31ce16f177be8d0c8ba3922274893615750e8484604051611853929190918252602082015260400190565b60405180910390a350506001600055565b60006001600160a01b0383166118ac5760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b21037bbb732b960991b6044820152606401610fc3565b60006118bb600b546000190190565b6118c69060016157fa565b9050600060015b8281101561192557856001600160a01b03166118e882611b72565b6001600160a01b03160361191357848203611907579250610f9b915050565b61191082615812565b91505b8061191d81615812565b9150506118cd565b50600095945050505050565b611939613d6d565b806013611946828261582b565b9050507f61daa0037fa8284dbb12300102b63056769729f1f57a6869f4c33120ab30184481604051611978919061586b565b60405180910390a150565b61198b613d6d565b6002600054036119ad5760405162461bcd60e51b8152600401610fc3906156c1565b600260009081556040514791339183156108fc0291849190818181858888f193505050501580156119e2573d6000803e3d6000fd5b5060405181815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364906020015b60405180910390a2506001600055565b3360008181526002602052604090205460015460ff909116919061010090046001600160a01b03166001600160a01b03161480611a61575060ff81166001145b611a7d5760405162461bcd60e51b8152600401610fc3906158a4565b60045460ff1615611ac25760405162461bcd60e51b815260206004820152600f60248201526e18dbdb9d1c9858dd081cd9585b1959608a1b6044820152606401610fc3565b611aca6140d4565b6040517f092af66b0bd1c72d72f759dca6111b54869afce41de52c8b070daca48832ff3290600090a150565b601d5460009042118015611b0b5750601e5442105b905090565b6114dd83838360405180602001604052806000815250612a56565b611b33613d6d565b806020611b4082826158cc565b9050507f431e694f8be63a0f8198f1b736e5ee9835bc9708e0c7c78b64e9285eeac70c5b81604051611978919061590b565b6000610f9b82614126565b600080611b8983614185565b6001600160a01b0316141592915050565b6000611ba9600b546000190190565b8210611be65760405162461bcd60e51b815260206004820152600c60248201526b6f7574206f662072616e676560a01b6044820152606401610fc3565b610f9b8260016157fa565b3360008181526002602052604090205460015460ff909116919061010090046001600160a01b03166001600160a01b03161480611c31575060ff81166001145b611c4d5760405162461bcd60e51b8152600401610fc3906158a4565b60045460ff1615611c925760405162461bcd60e51b815260206004820152600f60248201526e18dbdb9d1c9858dd081cd9585b1959608a1b6044820152606401610fc3565b611c9a614190565b6040517f76ba3851df4b69972443b0c99bcba0f237d990fbc8cd7ab5c86537c15da180ca90600090a150565b611cce613d6d565b600a611cdb828483615991565b507f5411e8ebf1636d9e83d5fc4900bf80cbac82e8790da2a4c94db4895e889eedf68282604051611d0d929190615a50565b60405180910390a15050565b611d21613d6d565b816018611d2e8282615ac9565b505060278190556040517fc9656979c676a76fe44b28b5ffede1db973b4aaf427ffe84be012f3e2a81aae490611d0d908490615b0d565b60606000826001600160401b03811115611d8157611d816153a2565b604051908082528060200260200182016040528015611daa578160200160208202803683370190505b50905060005b83811015611e1357611dd9858583818110611dcd57611dcd615b1b565b90506020020135614185565b828281518110611deb57611deb615b1b565b6001600160a01b0390921660209283029190910190910152611e0c81615812565b9050611db0565b509392505050565b6000610f9b82613d3e565b611e2e613d6d565b6004805460ff191660011790556040517fa0058887862c892ade184993a48c672897bca2e36ebf7fa2b4703d4805fc3a0190600090a1565b323314611e855760405162461bcd60e51b8152600401610fc3906157ad565b600260005403611ea75760405162461bcd60e51b8152600401610fc3906156c1565b6002600055611eb46139e5565b611f005760405162461bcd60e51b815260206004820152601e60248201527f77686974656c6973742073616c6520686173206e6f7420656e61626c656400006044820152606401610fc3565b611f0b338484612e87565b611f6f5760405162461bcd60e51b815260206004820152602f60248201527f63616c6c6572206973206e6f7420696e2077686974656c697374206f7220696e60448201526e76616c6964207369676e617475726560881b6064820152608401610fc3565b6000816001600160401b031611611f985760405162461bcd60e51b8152600401610fc390615776565b6003816001600160401b031610611fc15760405162461bcd60e51b8152600401610fc390615b31565b33600090815260106020526040812054611fdf90839060c01c615b66565b601b549091506001600160401b0390811690821611156120115760405162461bcd60e51b8152600401610fc390615b91565b61201f3360185484906141cb565b612050335b6001600160a01b0316600090815260106020526040902080546001600160c01b031660c084901b179055565b505060016000555050565b60006001600160a01b038216612084576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152601060205260409020546001600160401b031690565b6120b1613d6d565b6120bb600061430a565b565b60603233146120de5760405162461bcd60e51b8152600401610fc3906157ad565b6002600054036121005760405162461bcd60e51b8152600401610fc3906156c1565b600260005561210d612772565b6121525760405162461bcd60e51b81526020600482015260166024820152751c995d99585b081a185cc81b9bdd08195b98589b195960521b6044820152606401610fc3565b60005b828110156121d557600084848381811061217157612171615b1b565b9050602002013590506121813390565b6001600160a01b031661219382611e1b565b6001600160a01b0316146121b95760405162461bcd60e51b8152600401610fc390615715565b6121c281614364565b50806121cd81615812565b915050612155565b506022546001600160a01b031660008163b54d1d9f3387876040518463ffffffff1660e01b815260040161220b93929190615bc1565b6000604051808303816000875af115801561222a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526122529190810190615c0e565b905060005b81518110156122ee5761229186868381811061227557612275615b1b565b9050602002013560009081526025602052604090205460ff1690565b156122dc576001602660008484815181106122ae576122ae615b1b565b6020026020010151815260200190815260200160002060006101000a81548160ff0219169083151502179055505b806122e681615812565b915050612257565b506001600055949350505050565b612304613d6d565b6001600160a01b038216600081815260236020908152604091829020805467ffffffffffffffff19166001600160401b0386169081179091558251938452908301527faa1ad7684dd9ce7c51324fb038f1c71dab01128b06529288e48080d079887dc79101611d0d565b3360008181526002602052604090205460015460ff909116919061010090046001600160a01b03166001600160a01b031614806123ae575060ff81166002145b806123bc575060ff81166001145b6123d85760405162461bcd60e51b8152600401610fc3906158a4565b60068054831515610100810261ff001987151590811661ffff1990941693909317179092556040805191825260208201929092527f8cb0f99e5929303cba6a2267864c0d25f5c818f7b99fa9e8d1d4d818690127dc910160405180910390a1505050565b6001600160a01b0383166000908152602460205260408120606091836001600160401b0381111561246f5761246f6153a2565b604051908082528060200260200182016040528015612498578160200160208202803683370190505b50905060005b84811015612500578260008787848181106124bb576124bb615b1b565b905060200201358152602001908152602001600020548282815181106124e3576124e3615b1b565b6020908102919091010152806124f881615812565b91505061249e565b509150505b9392505050565b60075460009042118015611b0b575050600854421090565b6060600e80546111d090615742565b336001600160a01b0383160361255c5760405163b06307db60e01b815260040160405180910390fd5b3360008181526012602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000611b0b600b546000190190565b60606000826001600160401b038111156125f3576125f36153a2565b60405190808252806020026020018201604052801561262657816020015b60608152602001906001900390816126115790505b50905060005b83811015611e1357600085858381811061264857612648615b1b565b604051634f558e7960e01b8152602090910292909201356004830181905292503091634f558e799150602401602060405180830381865afa158015612691573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126b59190615cb3565b6126ec57604051806020016040528060008152508383815181106126db576126db615b1b565b602002602001018190525050612762565b60006126f78261436f565b905060008151116127175760405180602001604052806000815250612742565b8061272183614403565b604051602001612732929190615cd0565b6040516020818303038152906040525b84848151811061275457612754615b1b565b602002602001018190525050505b61276b81615812565b905061262c565b60205460009042118015612787575060215442105b8015611b0b5750506022546001600160a01b0316151590565b6127a8613d6d565b6001600160a01b038216600090815260176020526040902081906127cc8282615ac9565b9050507f73e70037e9e3ec61c7046b971d0fd15c1fdf360fc4cdd7ec6ee00c7a190f5aaa8282604051611d0d929190615cf6565b6002600054036128225760405162461bcd60e51b8152600401610fc3906156c1565b600260005561282f6139e5565b61287b5760405162461bcd60e51b815260206004820152601e60248201527f77686974656c6973742073616c6520686173206e6f7420656e61626c656400006044820152606401610fc3565b6000816001600160401b0316116128a45760405162461bcd60e51b8152600401610fc390615776565b6003816001600160401b0316106128cd5760405162461bcd60e51b8152600401610fc390615b31565b336000818152602360205260408120546001600160401b03169183906128f290610862565b6128fc9190615b66565b9050816001600160401b0316816001600160401b031611156129305760405162461bcd60e51b8152600401610fc390615b91565b61294084846018600001546141cb565b61294933612024565b604080513381526001600160a01b03861660208201526001600160401b0385168183015290517f612921ceebb627f8747363a7fbd7cfa6c748e44a2f9b5e1234b20ee13957bbfc9181900360600190a1505060016000555050565b6129ac613d6d565b6002600054036129ce5760405162461bcd60e51b8152600401610fc3906156c1565b600260009081555b818110156111b75760008383838181106129f2576129f2615b1b565b905060200201359050612a023390565b6001600160a01b0316612a1482611e1b565b6001600160a01b031614612a3a5760405162461bcd60e51b8152600401610fc390615715565b612a4381614364565b5080612a4e81615812565b9150506129d6565b612a61848484613ea9565b6001600160a01b0383163b15612a9a57612a7d84848484614503565b612a9a576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6000323314612ac15760405162461bcd60e51b8152600401610fc3906157ad565b600260005403612ae35760405162461bcd60e51b8152600401610fc3906156c1565b6002600055612af0612772565b612b355760405162461bcd60e51b81526020600482015260166024820152751c995d99585b081a185cc81b9bdd08195b98589b195960521b6044820152606401610fc3565b33612b3f83611e1b565b6001600160a01b031614612b655760405162461bcd60e51b8152600401610fc390615715565b612b6e82614364565b6022546001600160a01b031660008163c349c93e336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018790526044016020604051808303816000875af1158015612bd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bf49190615d13565b60008581526025602052604090205490915060ff1615612c28576000818152602660205260409020805460ff191660011790555b60016000559392505050565b33600081815260026020526040902054600154606092839260ff169161010090046001600160a01b03161480612c6d575060ff81166001145b612c895760405162461bcd60e51b8152600401610fc3906158a4565b6003546000906001600160401b03811115612ca657612ca66153a2565b604051908082528060200260200182016040528015612ccf578160200160208202803683370190505b50905060005b600354811015612d4f576002600060038381548110612cf657612cf6615b1b565b60009182526020808320909101546001600160a01b03168352820192909252604001902054825160ff90911690839083908110612d3557612d35615b1b565b60ff90921660209283029190910190910152600101612cd5565b5060038181805480602002602001604051908101604052809291908181526020018280548015612da857602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612d8a575b505050505091509350935050509091565b6060610f9b826145ee565b3360008181526002602052604090205460015460ff909116919061010090046001600160a01b03166001600160a01b03161480612e04575060ff81166002145b80612e12575060ff81166001145b612e2e5760405162461bcd60e51b8152600401610fc3906158a4565b600260005403612e505760405162461bcd60e51b8152600401610fc3906156c1565b600260005560405134815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c90602001611a11565b6000602754600003612e9b57506000612505565b612f11838380806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506027546040516bffffffffffffffffffffffff1960608b901b1660208201529092506034019050604051602081830303815290604052805190602001206146ee565b949350505050565b600260005403612f3b5760405162461bcd60e51b8152600401610fc3906156c1565b60026000558015612f915760065460ff16612f915760405162461bcd60e51b81526020600482015260166024820152751c985a5cda5b99c81a5cc81b9bdd08185b1b1bddd95960521b6044820152606401610fc3565b60005b838110156131d2576000858583818110612fb057612fb0615b1b565b905060200201359050612fc03390565b6040516331a9108f60e11b8152600481018390526001600160a01b0391909116903090636352211e90602401602060405180830381865afa158015613009573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061302d91906156f8565b6001600160a01b0316146130535760405162461bcd60e51b8152600401610fc390615715565b60008181526005602052604090208054841561316457806000036130d55742825560028201805461ffff191661ffff8816908117909155336001600160a01b0316847fe4a8edd13500ed032855f3f65ba5d8ce672eca25bc115502ba9d6831acf34fd5886040516130c8911515815260200190565b60405180910390a46131c7565b600282015461ffff87811691161461315f5760405162461bcd60e51b815260206004820152604160248201527f72616973696e6720697320616c726561647920737461727465642c206275742060448201527f77697468206120646966666572656e742072616973696e6720747970652073656064820152601d60fa1b608482015260a401610fc3565b6131c7565b80156131c757600182018054428390030190556000825561ffff8616336001600160a01b0316847fe4a8edd13500ed032855f3f65ba5d8ce672eca25bc115502ba9d6831acf34fd5886040516131be911515815260200190565b60405180910390a45b505050600101612f94565b50506001600055505050565b60606000826001600160401b038111156131fa576131fa6153a2565b60405190808252806020026020018201604052801561324c57816020015b6040805160808101825260008082526020808301829052928201819052606082015282526000199092019101816132185790505b50905060005b83811015611e1357600085858381811061326e5761326e615b1b565b604051634f558e7960e01b8152602090910292909201356004830181905292503091634f558e799150602401602060405180830381865afa1580156132b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132db9190615cb3565b6132e5575061340d565b6000818152600560209081526040918290208251608081018452815480825260018301549382019390935260029091015461ffff8116938201939093526201000090920460ff1615156060830152156133bf57600184848151811061334c5761334c615b1b565b60200260200101516060019015159081151581525050806040015184848151811061337957613379615b1b565b602090810291909101015161ffff909116604090910152805161339c9042615d2c565b8484815181106133ae576133ae615b1b565b602002602001015160200181815250505b8383815181106133d1576133d1615b1b565b60200260200101516020015181602001516133ec91906157fa565b8484815181106133fe576133fe615b1b565b60209081029190910101515250505b61341681615812565b9050613252565b6000611b0b600c5490565b613430613d6d565b60ff811661345d576001600160a01b0382166000908152600260205260409020805460ff19169055613483565b6001600160a01b0382166000908152600260205260409020805460ff191660ff83161790555b60405160ff821681526001600160a01b038316907f02ab42f6b82517d797a585d5319a95696ea5167a6fbb0e0322c9ee66edec682c9060200160405180910390a25050565b6134d0613d6d565b80601c6134dd8282615ac9565b9050507f240c7d68bdedeaeef1d6da3749f9cb732a51e4f5a02cee97df848b7750b43204816040516119789190615b0d565b32331461352e5760405162461bcd60e51b8152600401610fc3906157ad565b6002600054036135505760405162461bcd60e51b8152600401610fc3906156c1565b60026000558281146135db5760405162461bcd60e51b815260206004820152604860248201527f746865206c656e677468206f66204c697374696e6720546f6b656e494473206960448201527f7320646966666572656e742066726f6d2074686174206f66204c697374696e6760648201526720416d6f756e747360c01b608482015260a401610fc3565b60006135e686614704565b601454909150841061360a5760405162461bcd60e51b8152600401610fc390615d43565b6000805b8581101561387557600085858381811061362a5761362a615b1b565b905060200201602081019061363f9190614f8b565b90506003816001600160401b0316106136a45760405162461bcd60e51b815260206004820152602160248201527f616e20746f6b656e2063616e206f6e6c79206d696e742074776f20746f6b656e6044820152607360f81b6064820152608401610fc3565b6000816001600160401b0316116136cd5760405162461bcd60e51b8152600401610fc390615776565b6001600160a01b03891660009081526024602052604081206001600160401b03831690828b8b8781811061370357613703615b1b565b9050602002013581526020019081526020016000205401905084606001516001600160401b03168111156137495760405162461bcd60e51b8152600401610fc390615d43565b89336001600160a01b038216636352211e8c8c8881811061376c5761376c615b1b565b905060200201356040518263ffffffff1660e01b815260040161379191815260200190565b602060405180830381865afa1580156137ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137d291906156f8565b6001600160a01b0316146138205760405162461bcd60e51b81526020600482015260156024820152743237b2b9b713ba1037bbb7103a3432903a37b5b2b760591b6044820152606401610fc3565b6001600160a01b038b16600090815260246020526040812083918c8c8881811061384c5761384c615b1b565b60209081029290920135835250810191909152604001600020555050919091019060010161360e565b5061388333835183906141cb565b505060016000555050505050565b3233146138b05760405162461bcd60e51b8152600401610fc3906157ad565b6002600054036138d25760405162461bcd60e51b8152600401610fc3906156c1565b60026000556138df611af6565b61392b5760405162461bcd60e51b815260206004820152601b60248201527f7075626c69632073616c6520686173206e6f7420656e61626c656400000000006044820152606401610fc3565b6000816001600160401b0316116139545760405162461bcd60e51b8152600401610fc390615776565b6003816001600160401b03161061397d5760405162461bcd60e51b8152600401610fc390615b31565b60008161398933610862565b6139939190615b66565b601f549091506001600160401b0390811690821611156139c55760405162461bcd60e51b8152600401610fc390615b91565b6139d333601c5484906141cb565b6139dc33612024565b50506001600055565b60195460009042118015611b0b575050601a54421090565b613a05613d6d565b80356007819055602080830135600881905560408085013560098190558151948552928401919091528201527f61467bd874c25765186e5d914938f0b7ac6f48d10b8d0a7f9d9b15dfe1b520f490606001611978565b613a63613d6d565b6001600160a01b038116613ac85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610fc3565b613ad18161430a565b50565b600260005403613af65760405162461bcd60e51b8152600401610fc3906156c1565b6002600081815533808252602092909252604090205460015460ff909116919061010090046001600160a01b03166001600160a01b03161480613b3c575060ff81166002145b80613b4a575060ff81166001145b613b665760405162461bcd60e51b8152600401610fc3906158a4565b60005b82811015612050576000848483818110613b8557613b85615b1b565b9050602002013590506000306001600160a01b0316636352211e836040518263ffffffff1660e01b8152600401613bbe91815260200190565b602060405180830381865afa158015613bdb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bff91906156f8565b60008381526005602052604081208054929350919003613c2157505050613cb3565b8054600182018054429290920390910190556000808255600282015460405191825261ffff16906001600160a01b0384169085907fe4a8edd13500ed032855f3f65ba5d8ce672eca25bc115502ba9d6831acf34fd59060200160405180910390a4604051339084907f376b2166c0aaa2fc263d60dbcf1a4fa8f55e709487fcc9073ba90faa78d5005790600090a35050505b600101613b69565b60006301ffc9a760e01b6001600160e01b031983161480613cec57506380ac58cd60e01b6001600160e01b03198316145b80610f9b5750506001600160e01b031916635b5e139f60e01b1490565b600081600111158015613d1d5750600b5482105b8015610f9b5750506000908152600f6020526040902054600160e01b161590565b600080613d4a83614126565b905080600003610f9b57604051636f96cda160e11b815260040160405180910390fd5b6001546001600160a01b036101009091041633146120bb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610fc3565b600b546001600160a01b038316613df657604051622e076360e81b815260040160405180910390fd5b81600003613e175760405163b562e8dd60e01b815260040160405180910390fd5b613e246000848385614900565b6001600160a01b03831660009081526010602090815260408083208054680100000000000000018702019055838352600f90915290204260a01b84176001841460e11b179055808083015b6040516001830192906001600160a01b03871690600090600080516020615e32833981519152908290a4808210613e6f5750600b55505050565b6000613eb482613d3e565b9050836001600160a01b0316816001600160a01b031614613ee75760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480613f055750613f058533610eb8565b80613f20575033613f1584611253565b6001600160a01b0316145b905080613f4057604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416613f6757604051633a954ecd60e21b815260040160405180910390fd5b613f748585856001614900565b600083815260116020908152604080832080546001600160a01b03191690556001600160a01b0388811684526010835281842080546000190190558716835280832080546001019055858352600f9091528120600160e11b4260a01b871781179091558316900361401557600183016000818152600f6020526040812054900361401357600b548114614013576000818152600f602052604090208390555b505b82846001600160a01b0316866001600160a01b0316600080516020615e3283398151915260405160405180910390a45b5050505050565b60165460009060ff16156140cc5760008281526025602052604090205460ff16156140cc5760405162461bcd60e51b815260206004820152602a60248201527f4e6f20726566756e64732061726520616c6c6f77656420666f7220667265652060448201526936b4b73a103a37b5b2b760b11b6064820152608401610fc3565b600954610f9b565b6140dc614918565b6001805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6000818060011161417c57600b5481101561417c576000818152600f602052604081205490600160e01b8216900361417a575b806000036125055750600019016000818152600f6020526040902054614159565b505b50600092915050565b6000610f9b82611b72565b614198614961565b6001805460ff1916811790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833614109565b6014546028546001600160401b039081169084166141ec600b546000190190565b6141f691906157fa565b6142009190615d2c565b111561421e5760405162461bcd60e51b8152600401610fc390615d43565b60006142336001600160401b03841683615d7a565b9050348111156142855760405162461bcd60e51b815260206004820152601f60248201527f65746865722076616c75652073656e74206973206e6f7420636f7272656374006044820152606401610fc3565b61429884846001600160401b03166149a7565b6142a1816149c5565b81600003612a9a5760005b836001600160401b031681101561404557600160256000836142d1600b546000190190565b6142db9190615d2c565b81526020810191909152604001600020805460ff191691151591909117905561430381615812565b90506142ac565b600180546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b613ad1816000614a03565b6060600a805461437e90615742565b80601f01602080910402602001604051908101604052809291908181526020018280546143aa90615742565b80156143f75780601f106143cc576101008083540402835291602001916143f7565b820191906000526020600020905b8154815290600101906020018083116143da57829003601f168201915b50505050509050919050565b60608160000361442a5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115614454578061443e81615812565b915061444d9050600a83615daf565b915061442e565b6000816001600160401b0381111561446e5761446e6153a2565b6040519080825280601f01601f191660200182016040528015614498576020820181803683370190505b5090505b8415612f11576144ad600183615d2c565b91506144ba600a86615dc3565b6144c59060306157fa565b60f81b8183815181106144da576144da615b1b565b60200101906001600160f81b031916908160001a9053506144fc600a86615daf565b945061449c565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290614538903390899088908890600401615dd7565b6020604051808303816000875af1925050508015614573575060408051601f3d908101601f1916820190925261457091810190615e14565b60015b6145d1573d8080156145a1576040519150601f19603f3d011682016040523d82523d6000602084013e6145a6565b606091505b5080516000036145c9576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b604051634f558e7960e01b8152600481018290526060903090634f558e7990602401602060405180830381865afa15801561462d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146519190615cb3565b6146925760405162461bcd60e51b81526020600482015260126024820152711d1bdad95b881a5cc81b9bdd08195e1a5cdd60721b6044820152606401610fc3565b600061469d8361436f565b905060008151116146bd5760405180602001604052806000815250612505565b806146c784614403565b6040516020016146d8929190615cd0565b6040516020818303038152906040529392505050565b6000826146fb8584614b58565b14949350505050565b614738604051806080016040528060008152602001600081526020016000815260200160006001600160401b031681525090565b6001600160a01b03821661478e5760405162461bcd60e51b815260206004820152601b60248201527f636f6e7472616374206164647265737320697320696e76616c696400000000006044820152606401610fc3565b6001600160a01b0382166000908152601760209081526040918290208251608081018452815481526001820154928101839052600282015493810193909352600301546001600160401b03166060830152158015906147f05750806020015142115b61483c5760405162461bcd60e51b815260206004820152601860248201527f686f6c646572206d696e74206973206e6f7420737461727400000000000000006044820152606401610fc3565b8060400151421061488f5760405162461bcd60e51b815260206004820152601b60248201527f686f6c646572206d696e7420686173206265656e2073746f70656400000000006044820152606401610fc3565b600081606001516001600160401b031611610f9b5760405162461bcd60e51b815260206004820152602b60248201527f74686520696e70757420636f6e747261637420646f6573206e6f74207375707060448201526a1bdc9d081d1bc81b5a5b9d60aa1b6064820152608401610fc3565b61490c84848484614b9d565b612a9a84848484614c48565b60015460ff166120bb5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610fc3565b60015460ff16156120bb5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610fc3565b6149c1828260405180602001604052806000815250614c98565b5050565b80341115613ad157336108fc6149db8334615d2c565b6040518115909202916000818181858888f193505050501580156149c1573d6000803e3d6000fd5b6000614a0e83613d3e565b9050808215614a72576000336001600160a01b0383161480614a355750614a358233610eb8565b80614a50575033614a4586611253565b6001600160a01b0316145b905080614a7057604051632ce44b5f60e11b815260040160405180910390fd5b505b614a80816000866001614900565b600084815260116020908152604080832080546001600160a01b03191690556001600160a01b03841683526010825280832080546fffffffffffffffffffffffffffffffff019055868352600f9091528120600360e01b4260a01b8417179055600160e11b83169003614b2357600184016000818152600f60205260408120549003614b2157600b548114614b21576000818152600f602052604090208390555b505b60405184906000906001600160a01b03841690600080516020615e32833981519152908390a45050600c805460010190555050565b600081815b8451811015611e1357614b8982868381518110614b7c57614b7c615b1b565b6020026020010151614df4565b915080614b9581615812565b915050614b5d565b60005b8181101561404557614bc9614bb582856157fa565b600090815260056020526040902054151590565b15614c385760056000614bdc83866157fa565b815260208101919091526040016000206002015462010000900460ff16614c385760405162461bcd60e51b815260206004820152601060248201526f746f6b656e2069732072616973696e6760801b6044820152606401610fc3565b614c4181615812565b9050614ba0565b60015460ff1615614c935760405162461bcd60e51b81526020600482015260156024820152741d1bdad95b881d1c985b9cd9995c881c185d5cd959605a1b6044820152606401610fc3565b612a9a565b600b546001600160a01b038416614cc157604051622e076360e81b815260040160405180910390fd5b82600003614ce25760405163b562e8dd60e01b815260040160405180910390fd5b614cef6000858386614900565b6001600160a01b03841660008181526010602090815260408083208054680100000000000000018902019055848352600f90915290204260a01b86176001861460e11b1790558190818501903b15614db2575b60405182906001600160a01b03881690600090600080516020615e32833981519152908290a4614d7b6000878480600101955087614503565b614d98576040516368d2bf6b60e11b815260040160405180910390fd5b808210614d425782600b5414614dad57600080fd5b614de5565b5b6040516001830192906001600160a01b03881690600090600080516020615e32833981519152908290a4808210614db3575b50600b55612a9a600085838684565b6000818310614e10576000828152602084905260409020612505565b5060009182526020526040902090565b6001600160e01b031981168114613ad157600080fd5b600060208284031215614e4857600080fd5b813561250581614e20565b6001600160a01b0381168114613ad157600080fd5b600080600060608486031215614e7d57600080fd5b8335614e8881614e53565b92506020840135614e9881614e53565b929592945050506040919091013590565b60005b83811015614ec4578181015183820152602001614eac565b83811115612a9a5750506000910152565b60008151808452614eed816020860160208601614ea9565b601f01601f19169290920160200192915050565b6020815260006125056020830184614ed5565b600060208284031215614f2657600080fd5b5035919050565b60008060408385031215614f4057600080fd5b8235614f4b81614e53565b946020939093013593505050565b600060208284031215614f6b57600080fd5b813561250581614e53565b6001600160401b0381168114613ad157600080fd5b600060208284031215614f9d57600080fd5b813561250581614f76565b600060808284031215614fba57600080fd5b50919050565b600060808284031215614fd257600080fd5b6125058383614fa8565b600060608284031215614fba57600080fd5b60006060828403121561500057600080fd5b6125058383614fdc565b6000806020838503121561501d57600080fd5b82356001600160401b038082111561503457600080fd5b818501915085601f83011261504857600080fd5b81358181111561505757600080fd5b86602082850101111561506957600080fd5b60209290920196919550909350505050565b60008060a0838503121561508e57600080fd5b6150988484614fa8565b946080939093013593505050565b60008083601f8401126150b857600080fd5b5081356001600160401b038111156150cf57600080fd5b6020830191508360208260051b85010111156150ea57600080fd5b9250929050565b6000806020838503121561510457600080fd5b82356001600160401b0381111561511a57600080fd5b615126858286016150a6565b90969095509350505050565b600081518084526020808501945080840160005b8381101561516b5781516001600160a01b031687529582019590820190600101615146565b509495945050505050565b6020815260006125056020830184615132565b60008060006040848603121561519e57600080fd5b83356001600160401b038111156151b457600080fd5b6151c0868287016150a6565b90945092505060208401356151d481614f76565b809150509250925092565b6020808252825182820181905260009190848201906040850190845b81811015615217578351835292840192918401916001016151fb565b50909695505050505050565b6000806040838503121561523657600080fd5b823561524181614e53565b9150602083013561525181614f76565b809150509250929050565b8015158114613ad157600080fd5b6000806040838503121561527d57600080fd5b82356152888161525c565b915060208301356152518161525c565b6000806000604084860312156152ad57600080fd5b83356152b881614e53565b925060208401356001600160401b038111156152d357600080fd5b6152df868287016150a6565b9497909650939450505050565b600080604083850312156152ff57600080fd5b823561528881614e53565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561535f57603f1988860301845261534d858351614ed5565b94509285019290850190600101615331565b5092979650505050505050565b60008060a0838503121561537f57600080fd5b823561538a81614e53565b91506153998460208501614fa8565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156153e0576153e06153a2565b604052919050565b600080600080608085870312156153fe57600080fd5b843561540981614e53565b935060208581013561541a81614e53565b93506040860135925060608601356001600160401b038082111561543d57600080fd5b818801915088601f83011261545157600080fd5b813581811115615463576154636153a2565b615475601f8201601f191685016153b8565b9150808252898482850101111561548b57600080fd5b808484018584013760008482840101525080935050505092959194509250565b6040815260006154be6040830185615132565b82810360208481019190915284518083528582019282019060005b818110156154f857845160ff16835293830193918301916001016154d9565b5090979650505050505050565b6000806000806060858703121561551b57600080fd5b84356001600160401b0381111561553157600080fd5b61553d878288016150a6565b909550935050602085013561ffff8116811461555857600080fd5b915060408501356155688161525c565b939692955090935050565b602080825282518282018190526000919060409081850190868401855b828110156155d05781518051855286810151878601528581015161ffff168686015260609081015115159085015260809093019290850190600101615590565b5091979650505050505050565b600080604083850312156155f057600080fd5b82356155fb81614e53565b9150602083013560ff8116811461525157600080fd5b60008060008060006060868803121561562957600080fd5b853561563481614e53565b945060208601356001600160401b038082111561565057600080fd5b61565c89838a016150a6565b9096509450604088013591508082111561567557600080fd5b50615682888289016150a6565b969995985093965092949392505050565b600080604083850312156156a657600080fd5b82356156b181614e53565b9150602083013561525181614e53565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60006020828403121561570a57600080fd5b815161250581614e53565b60208082526013908201527231b0b63632b91034b9903737ba1037bbb732b960691b604082015260600190565b600181811c9082168061575657607f821691505b602082108103614fba57634e487b7160e01b600052602260045260246000fd5b60208082526018908201527f696e76616c6964206e756d626572206f6620746f6b656e730000000000000000604082015260600190565b6020808252601a908201527f63616c6c657220697320616e6f7468657220636f6e7472616374000000000000604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000821982111561580d5761580d6157e4565b500190565b600060018201615824576158246157e4565b5060010190565b8135815560208201356001820155604082013560028201556003810160608301356158558161525c565b815490151560ff1660ff19919091161790555050565b8135815260208083013590820152604080830135908201526080810160608301356158958161525c565b80151560608401525092915050565b6020808252600e908201526d1b9bdd08185d5d1a1bdc9a5e995960921b604082015260600190565b81358155602082013560018201556002810160408301356158ec81614e53565b81546001600160a01b0319166001600160a01b03919091161790555050565b813581526020808301359082015260608101604083013561592b81614e53565b6001600160a01b031660409290920191909152919050565b601f8211156114dd57600081815260208120601f850160051c8101602086101561596a5750805b601f850160051c820191505b8181101561598957828155600101615976565b505050505050565b6001600160401b038311156159a8576159a86153a2565b6159bc836159b68354615742565b83615943565b6000601f8411600181146159f057600085156159d85750838201355b600019600387901b1c1916600186901b178355614045565b600083815260209020601f19861690835b82811015615a215786850135825560209485019460019092019101615a01565b5086821015615a3e5760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b813581556020820135600182015560408201356002820155600381016060830135615aa981614f76565b815467ffffffffffffffff19166001600160401b03919091161790555050565b6149c18282615a7f565b8035825260208101356020830152604081013560408301526060810135615af981614f76565b6001600160401b0381166060840152505050565b60808101610f9b8284615ad3565b634e487b7160e01b600052603260045260246000fd5b6020808252818101527f63616e206f6e6c79206d696e74203220746f6b656e7320617420612074696d65604082015260600190565b60006001600160401b03808316818516808303821115615b8857615b886157e4565b01949350505050565b6020808252601690820152751bdd5d081bd9881b585e081b5a5b9d08185b5bdd5b9d60521b604082015260600190565b6001600160a01b0384168152604060208201819052810182905260006001600160fb1b03831115615bf157600080fd5b8260051b8085606085013760009201606001918252509392505050565b60006020808385031215615c2157600080fd5b82516001600160401b0380821115615c3857600080fd5b818501915085601f830112615c4c57600080fd5b815181811115615c5e57615c5e6153a2565b8060051b9150615c6f8483016153b8565b8181529183018401918481019088841115615c8957600080fd5b938501935b83851015615ca757845182529385019390850190615c8e565b98975050505050505050565b600060208284031215615cc557600080fd5b81516125058161525c565b60008351615ce2818460208801614ea9565b835190830190615b88818360208801614ea9565b6001600160a01b038316815260a081016125056020830184615ad3565b600060208284031215615d2557600080fd5b5051919050565b600082821015615d3e57615d3e6157e4565b500390565b60208082526018908201527f6d61782073616c6520737570706c792065786365656465640000000000000000604082015260600190565b6000816000190483118215151615615d9457615d946157e4565b500290565b634e487b7160e01b600052601260045260246000fd5b600082615dbe57615dbe615d99565b500490565b600082615dd257615dd2615d99565b500690565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090615e0a90830184614ed5565b9695505050505050565b600060208284031215615e2657600080fd5b815161250581614e2056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220e463c2dbb0292fcfbc3de34317e6c84875d13c43e778890c5268ca5b29072a7364736f6c634300080f0033

Deployed Bytecode

0x6080604052600436106104895760003560e01c8063763c1c9911610255578063c2ca0ac511610144578063dd5ddfe8116100c1578063e985e9c511610085578063e985e9c514610e9d578063ecbd68df14610ee6578063ef11e90514610efb578063f2fde38b14610f1b578063f37e20ba14610f3b578063f68dc5de14610f5657600080fd5b8063dd5ddfe814610e18578063de39782a14610e38578063df837ec214610e58578063e2bb193a14610e6b578063e697188f14610e7e57600080fd5b8063d41da0e011610108578063d41da0e014610d6a578063d5890fe814610d8a578063d5ef3a2214610daa578063d7d7dfb614610dd6578063d89135cd14610e0357600080fd5b8063c2ca0ac514610cc7578063c3a07df614610ce7578063c87b56dd14610d0a578063caeff92b14610d2a578063d0e30db014610d6257600080fd5b8063a22cb465116101d2578063b354bbb311610196578063b354bbb314610c12578063b650163714610c5a578063b7e0a77414610c74578063b80f55c914610c87578063b88d4fde14610ca757600080fd5b8063a22cb46514610b7b578063a2309ff814610b9b578063a2fafacd14610bb0578063a4b36c1c14610bdd578063aa21b38b14610bf257600080fd5b80638746475a116102195780638746475a14610ac45780638905896914610ad95780638da5cb5b14610b2e57806395d89b4114610b51578063983d273714610b6657600080fd5b8063763c1c99146109fb578063813ec0e814610a1b57806383c1cd8a14610a3b57806383d0703214610a7457806385b002a014610a9457600080fd5b80633ccfd60b1161037c57806355f804b3116102f957806368bd580e116102bd57806368bd580e1461092557806369e003061461093a5780636e5f0e731461094d57806370a0823114610999578063715018a6146109b957806375ef961f146109ce57600080fd5b806355f804b31461088057806356ab0648146108a05780635c975abb146108c05780635ff2f2e8146108d85780636352211e1461090557600080fd5b80634777a597116103405780634777a597146107d25780634f558e79146107f25780634f6ccce71461081257806351858e2714610832578063539090361461084757600080fd5b80633ccfd60b146107535780633f4ba83a146107685780634009920d1461077d57806342842e0e1461079257806345b57776146107b257600080fd5b8063205b18341161040a5780632ae0c8da116103ce5780632ae0c8da146106935780632e1dfd10146106c35780632eb4a7ab146106fd5780632f745c59146107135780633ae3c0201461073357600080fd5b8063205b18341461060457806323b872dd14610624578063278ecde11461064457806327ee47c7146106645780632aabb7261461067e57600080fd5b80630cb61f6c116104515780630cb61f6c1461055f57806315b75bea1461058557806318160ddd146105a55780631b2df850146105c85780631d63ff2b146105ef57600080fd5b806301ffc9a71461048e5780630282938e146104c357806306fdde03146104e5578063081812fc14610507578063095ea7b31461053f575b600080fd5b34801561049a57600080fd5b506104ae6104a9366004614e36565b610f76565b60405190151581526020015b60405180910390f35b3480156104cf57600080fd5b506104e36104de366004614e68565b610fa1565b005b3480156104f157600080fd5b506104fa6111c1565b6040516104ba9190614f01565b34801561051357600080fd5b50610527610522366004614f14565b611253565b6040516001600160a01b0390911681526020016104ba565b34801561054b57600080fd5b506104e361055a366004614f2d565b611297565b34801561056b57600080fd5b50600654610527906201000090046001600160a01b031681565b34801561059157600080fd5b506104e36105a0366004614f59565b611369565b3480156105b157600080fd5b506105ba6113c5565b6040519081526020016104ba565b3480156105d457600080fd5b506105dd600181565b60405160ff90911681526020016104ba565b3480156105fb57600080fd5b506105dd600081565b34801561061057600080fd5b506104e361061f366004614f8b565b6113dd565b34801561063057600080fd5b506104e361063f366004614e68565b6114d2565b34801561065057600080fd5b506104e361065f366004614f14565b6114e2565b34801561067057600080fd5b506006546104ae9060ff1681565b34801561068a57600080fd5b506105dd600281565b34801561069f57600080fd5b506104ae6106ae366004614f14565b60009081526025602052604090205460ff1690565b3480156106cf57600080fd5b506007546008546009546106e292919083565b604080519384526020840192909252908201526060016104ba565b34801561070957600080fd5b506105ba60275481565b34801561071f57600080fd5b506105ba61072e366004614f2d565b611864565b34801561073f57600080fd5b506104e361074e366004614fc0565b611931565b34801561075f57600080fd5b506104e3611983565b34801561077457600080fd5b506104e3611a21565b34801561078957600080fd5b506104ae611af6565b34801561079e57600080fd5b506104e36107ad366004614e68565b611b10565b3480156107be57600080fd5b506104e36107cd366004614fee565b611b2b565b3480156107de57600080fd5b506105276107ed366004614f14565b611b72565b3480156107fe57600080fd5b506104ae61080d366004614f14565b611b7d565b34801561081e57600080fd5b506105ba61082d366004614f14565b611b9a565b34801561083e57600080fd5b506104e3611bf1565b34801561085357600080fd5b506105ba610862366004614f59565b6001600160a01b031660009081526010602052604090205460c01c90565b34801561088c57600080fd5b506104e361089b36600461500a565b611cc6565b3480156108ac57600080fd5b506104e36108bb36600461507b565b611d19565b3480156108cc57600080fd5b5060015460ff166104ae565b3480156108e457600080fd5b506108f86108f33660046150f1565b611d65565b6040516104ba9190615176565b34801561091157600080fd5b50610527610920366004614f14565b611e1b565b34801561093157600080fd5b506104e3611e26565b6104e3610948366004615189565b611e66565b34801561095957600080fd5b506020546021546022546109759291906001600160a01b031683565b6040805193845260208401929092526001600160a01b0316908201526060016104ba565b3480156109a557600080fd5b506105ba6109b4366004614f59565b61205b565b3480156109c557600080fd5b506104e36120a9565b3480156109da57600080fd5b506109ee6109e93660046150f1565b6120bd565b6040516104ba91906151df565b348015610a0757600080fd5b506104e3610a16366004615223565b6122fc565b348015610a2757600080fd5b506104e3610a3636600461526a565b61236e565b348015610a4757600080fd5b506105dd610a56366004614f59565b6001600160a01b031660009081526002602052604090205460ff1690565b348015610a8057600080fd5b506109ee610a8f366004615298565b61243c565b348015610aa057600080fd5b506104ae610aaf366004614f14565b60009081526026602052604090205460ff1690565b348015610ad057600080fd5b506104ae61250c565b348015610ae557600080fd5b50601854601954601a54601b54610b05939291906001600160401b031684565b604080519485526020850193909352918301526001600160401b031660608201526080016104ba565b348015610b3a57600080fd5b5060015461010090046001600160a01b0316610527565b348015610b5d57600080fd5b506104fa612524565b348015610b7257600080fd5b506105dd600381565b348015610b8757600080fd5b506104e3610b963660046152ec565b612533565b348015610ba757600080fd5b506105ba6125c8565b348015610bbc57600080fd5b50610bd0610bcb3660046150f1565b6125d7565b6040516104ba919061530a565b348015610be957600080fd5b506104ae612772565b348015610bfe57600080fd5b506104e3610c0d36600461536c565b6127a0565b348015610c1e57600080fd5b50601354601454601554601654610c389392919060ff1684565b60408051948552602085019390935291830152151560608201526080016104ba565b348015610c6657600080fd5b506004546104ae9060ff1681565b6104e3610c82366004615223565b612800565b348015610c9357600080fd5b506104e3610ca23660046150f1565b6129a4565b348015610cb357600080fd5b506104e3610cc23660046153e8565b612a56565b348015610cd357600080fd5b506105ba610ce2366004614f14565b612aa0565b348015610cf357600080fd5b50610cfc612c34565b6040516104ba9291906154ab565b348015610d1657600080fd5b506104fa610d25366004614f14565b612db9565b348015610d3657600080fd5b50602854610d4a906001600160401b031681565b6040516001600160401b0390911681526020016104ba565b6104e3612dc4565b348015610d7657600080fd5b506104ae610d85366004615298565b612e87565b348015610d9657600080fd5b506104e3610da5366004615505565b612f19565b348015610db657600080fd5b50601c54601d54601e54601f54610b05939291906001600160401b031684565b348015610de257600080fd5b50610df6610df13660046150f1565b6131de565b6040516104ba9190615573565b348015610e0f57600080fd5b506105ba61341d565b348015610e2457600080fd5b506104e3610e333660046155dd565b613428565b348015610e4457600080fd5b506104e3610e53366004614fc0565b6134c8565b6104e3610e66366004615611565b61350f565b6104e3610e79366004614f8b565b613891565b348015610e8a57600080fd5b506006546104ae90610100900460ff1681565b348015610ea957600080fd5b506104ae610eb8366004615693565b6001600160a01b03918216600090815260126020908152604080832093909416825291909152205460ff1690565b348015610ef257600080fd5b506104ae6139e5565b348015610f0757600080fd5b506104e3610f16366004614fee565b6139fd565b348015610f2757600080fd5b506104e3610f36366004614f59565b613a5b565b348015610f4757600080fd5b506105ba6606e659d948720d81565b348015610f6257600080fd5b506104e3610f713660046150f1565b613ad4565b60006001600160e01b0319821663780e9d6360e01b1480610f9b5750610f9b82613cbb565b92915050565b600260005403610fcc5760405162461bcd60e51b8152600401610fc3906156c1565b60405180910390fd5b6002600055336040516331a9108f60e11b8152600481018390526001600160a01b0391909116903090636352211e90602401602060405180830381865afa15801561101b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061103f91906156f8565b6001600160a01b0316146110655760405162461bcd60e51b8152600401610fc390615715565b600654610100900460ff166110ca5760405162461bcd60e51b815260206004820152602560248201527f7472616e73666572207768696c652072616973696e67206973206e6f7420656e60448201526418589b195960da1b6064820152608401610fc3565b60008181526005602052604090819020600201805462ff000019166201000017905551632142170760e11b81526001600160a01b038481166004830152831660248201526044810182905230906342842e0e90606401600060405180830381600087803b15801561113a57600080fd5b505af115801561114e573d6000803e3d6000fd5b505050600082815260056020526040902060028101805462ff000019169055541590506111b75780826001600160a01b0316846001600160a01b03167ff315af4c34ce2407cc1da2405672c4c7387fd44d616401235c21ef22b9bbd13860405160405180910390a45b5050600160005550565b6060600d80546111d090615742565b80601f01602080910402602001604051908101604052809291908181526020018280546111fc90615742565b80156112495780601f1061121e57610100808354040283529160200191611249565b820191906000526020600020905b81548152906001019060200180831161122c57829003601f168201915b5050505050905090565b600061125e82613d09565b61127b576040516333d1c03960e21b815260040160405180910390fd5b506000908152601160205260409020546001600160a01b031690565b60006112a282613d3e565b9050806001600160a01b0316836001600160a01b0316036112d65760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b0382161461130d576112f08133610eb8565b61130d576040516367d9dca160e11b815260040160405180910390fd5b60008281526011602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b611371613d6d565b6006805462010000600160b01b031916620100006001600160a01b038416908102919091179091556040517fa7cb165192538768851363c5aa55b1ade75d692a51063730feccdd57d002a6ed90600090a250565b60006113d0600c5490565b600b546000190103905090565b6113e5613d6d565b6002600054036114075760405162461bcd60e51b8152600401610fc3906156c1565b60026000556001600160401b0381166114325760405162461bcd60e51b8152600401610fc390615776565b6028546015546001600160401b03918216830191821611156114965760405162461bcd60e51b815260206004820152601860248201527f6d61782073656c6620737570706c7920657863656564656400000000000000006044820152606401610fc3565b6114a933836001600160401b0316613dcd565b6028805467ffffffffffffffff19166001600160401b0392909216919091179055506001600055565b6114dd838383613ea9565b505050565b3233146115015760405162461bcd60e51b8152600401610fc3906157ad565b6002600054036115235760405162461bcd60e51b8152600401610fc3906156c1565b60026000556040516331a9108f60e11b8152600481018290523090636352211e90602401602060405180830381865afa158015611564573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061158891906156f8565b6001600160a01b0316336001600160a01b0316146115da5760405162461bcd60e51b815260206004820152600f60248201526e3737ba103a37b5b2b71037bbb732b960891b6044820152606401610fc3565b6006546201000090046001600160a01b031633036116485760405162461bcd60e51b815260206004820152602560248201527f73746f636b206163636f756e7420726566756e647320617265206e6f7420616c6044820152641b1bddd95960da1b6064820152608401610fc3565b61165061250c565b61169c5760405162461bcd60e51b815260206004820152601d60248201527f6f7574736964652074686520726566756e6461626c6520706572696f640000006044820152606401610fc3565b60006116a78261404c565b9050600081116116f95760405162461bcd60e51b815260206004820152601d60248201527f6f6e6c792073616c65204e46542063616e20626520726566756e6465640000006044820152606401610fc3565b804710156117495760405162461bcd60e51b815260206004820152601b60248201527f696e73756666696369656e7420636f6e74726163742066756e647300000000006044820152606401610fc3565b60065460408051632142170760e11b8152336004820152620100009092046001600160a01b03166024830152604482018490525130916342842e0e91606480830192600092919082900301818387803b1580156117a557600080fd5b505af11580156117b9573d6000803e3d6000fd5b505050506117c43390565b6001600160a01b03166108fc829081150290604051600060405180830381858888f193505050501580156117fc573d6000803e3d6000fd5b506006546201000090046001600160a01b0316336001600160a01b03167f88808afc48888c0e3ec9c545474e31ce16f177be8d0c8ba3922274893615750e8484604051611853929190918252602082015260400190565b60405180910390a350506001600055565b60006001600160a01b0383166118ac5760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b21037bbb732b960991b6044820152606401610fc3565b60006118bb600b546000190190565b6118c69060016157fa565b9050600060015b8281101561192557856001600160a01b03166118e882611b72565b6001600160a01b03160361191357848203611907579250610f9b915050565b61191082615812565b91505b8061191d81615812565b9150506118cd565b50600095945050505050565b611939613d6d565b806013611946828261582b565b9050507f61daa0037fa8284dbb12300102b63056769729f1f57a6869f4c33120ab30184481604051611978919061586b565b60405180910390a150565b61198b613d6d565b6002600054036119ad5760405162461bcd60e51b8152600401610fc3906156c1565b600260009081556040514791339183156108fc0291849190818181858888f193505050501580156119e2573d6000803e3d6000fd5b5060405181815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364906020015b60405180910390a2506001600055565b3360008181526002602052604090205460015460ff909116919061010090046001600160a01b03166001600160a01b03161480611a61575060ff81166001145b611a7d5760405162461bcd60e51b8152600401610fc3906158a4565b60045460ff1615611ac25760405162461bcd60e51b815260206004820152600f60248201526e18dbdb9d1c9858dd081cd9585b1959608a1b6044820152606401610fc3565b611aca6140d4565b6040517f092af66b0bd1c72d72f759dca6111b54869afce41de52c8b070daca48832ff3290600090a150565b601d5460009042118015611b0b5750601e5442105b905090565b6114dd83838360405180602001604052806000815250612a56565b611b33613d6d565b806020611b4082826158cc565b9050507f431e694f8be63a0f8198f1b736e5ee9835bc9708e0c7c78b64e9285eeac70c5b81604051611978919061590b565b6000610f9b82614126565b600080611b8983614185565b6001600160a01b0316141592915050565b6000611ba9600b546000190190565b8210611be65760405162461bcd60e51b815260206004820152600c60248201526b6f7574206f662072616e676560a01b6044820152606401610fc3565b610f9b8260016157fa565b3360008181526002602052604090205460015460ff909116919061010090046001600160a01b03166001600160a01b03161480611c31575060ff81166001145b611c4d5760405162461bcd60e51b8152600401610fc3906158a4565b60045460ff1615611c925760405162461bcd60e51b815260206004820152600f60248201526e18dbdb9d1c9858dd081cd9585b1959608a1b6044820152606401610fc3565b611c9a614190565b6040517f76ba3851df4b69972443b0c99bcba0f237d990fbc8cd7ab5c86537c15da180ca90600090a150565b611cce613d6d565b600a611cdb828483615991565b507f5411e8ebf1636d9e83d5fc4900bf80cbac82e8790da2a4c94db4895e889eedf68282604051611d0d929190615a50565b60405180910390a15050565b611d21613d6d565b816018611d2e8282615ac9565b505060278190556040517fc9656979c676a76fe44b28b5ffede1db973b4aaf427ffe84be012f3e2a81aae490611d0d908490615b0d565b60606000826001600160401b03811115611d8157611d816153a2565b604051908082528060200260200182016040528015611daa578160200160208202803683370190505b50905060005b83811015611e1357611dd9858583818110611dcd57611dcd615b1b565b90506020020135614185565b828281518110611deb57611deb615b1b565b6001600160a01b0390921660209283029190910190910152611e0c81615812565b9050611db0565b509392505050565b6000610f9b82613d3e565b611e2e613d6d565b6004805460ff191660011790556040517fa0058887862c892ade184993a48c672897bca2e36ebf7fa2b4703d4805fc3a0190600090a1565b323314611e855760405162461bcd60e51b8152600401610fc3906157ad565b600260005403611ea75760405162461bcd60e51b8152600401610fc3906156c1565b6002600055611eb46139e5565b611f005760405162461bcd60e51b815260206004820152601e60248201527f77686974656c6973742073616c6520686173206e6f7420656e61626c656400006044820152606401610fc3565b611f0b338484612e87565b611f6f5760405162461bcd60e51b815260206004820152602f60248201527f63616c6c6572206973206e6f7420696e2077686974656c697374206f7220696e60448201526e76616c6964207369676e617475726560881b6064820152608401610fc3565b6000816001600160401b031611611f985760405162461bcd60e51b8152600401610fc390615776565b6003816001600160401b031610611fc15760405162461bcd60e51b8152600401610fc390615b31565b33600090815260106020526040812054611fdf90839060c01c615b66565b601b549091506001600160401b0390811690821611156120115760405162461bcd60e51b8152600401610fc390615b91565b61201f3360185484906141cb565b612050335b6001600160a01b0316600090815260106020526040902080546001600160c01b031660c084901b179055565b505060016000555050565b60006001600160a01b038216612084576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152601060205260409020546001600160401b031690565b6120b1613d6d565b6120bb600061430a565b565b60603233146120de5760405162461bcd60e51b8152600401610fc3906157ad565b6002600054036121005760405162461bcd60e51b8152600401610fc3906156c1565b600260005561210d612772565b6121525760405162461bcd60e51b81526020600482015260166024820152751c995d99585b081a185cc81b9bdd08195b98589b195960521b6044820152606401610fc3565b60005b828110156121d557600084848381811061217157612171615b1b565b9050602002013590506121813390565b6001600160a01b031661219382611e1b565b6001600160a01b0316146121b95760405162461bcd60e51b8152600401610fc390615715565b6121c281614364565b50806121cd81615812565b915050612155565b506022546001600160a01b031660008163b54d1d9f3387876040518463ffffffff1660e01b815260040161220b93929190615bc1565b6000604051808303816000875af115801561222a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526122529190810190615c0e565b905060005b81518110156122ee5761229186868381811061227557612275615b1b565b9050602002013560009081526025602052604090205460ff1690565b156122dc576001602660008484815181106122ae576122ae615b1b565b6020026020010151815260200190815260200160002060006101000a81548160ff0219169083151502179055505b806122e681615812565b915050612257565b506001600055949350505050565b612304613d6d565b6001600160a01b038216600081815260236020908152604091829020805467ffffffffffffffff19166001600160401b0386169081179091558251938452908301527faa1ad7684dd9ce7c51324fb038f1c71dab01128b06529288e48080d079887dc79101611d0d565b3360008181526002602052604090205460015460ff909116919061010090046001600160a01b03166001600160a01b031614806123ae575060ff81166002145b806123bc575060ff81166001145b6123d85760405162461bcd60e51b8152600401610fc3906158a4565b60068054831515610100810261ff001987151590811661ffff1990941693909317179092556040805191825260208201929092527f8cb0f99e5929303cba6a2267864c0d25f5c818f7b99fa9e8d1d4d818690127dc910160405180910390a1505050565b6001600160a01b0383166000908152602460205260408120606091836001600160401b0381111561246f5761246f6153a2565b604051908082528060200260200182016040528015612498578160200160208202803683370190505b50905060005b84811015612500578260008787848181106124bb576124bb615b1b565b905060200201358152602001908152602001600020548282815181106124e3576124e3615b1b565b6020908102919091010152806124f881615812565b91505061249e565b509150505b9392505050565b60075460009042118015611b0b575050600854421090565b6060600e80546111d090615742565b336001600160a01b0383160361255c5760405163b06307db60e01b815260040160405180910390fd5b3360008181526012602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000611b0b600b546000190190565b60606000826001600160401b038111156125f3576125f36153a2565b60405190808252806020026020018201604052801561262657816020015b60608152602001906001900390816126115790505b50905060005b83811015611e1357600085858381811061264857612648615b1b565b604051634f558e7960e01b8152602090910292909201356004830181905292503091634f558e799150602401602060405180830381865afa158015612691573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126b59190615cb3565b6126ec57604051806020016040528060008152508383815181106126db576126db615b1b565b602002602001018190525050612762565b60006126f78261436f565b905060008151116127175760405180602001604052806000815250612742565b8061272183614403565b604051602001612732929190615cd0565b6040516020818303038152906040525b84848151811061275457612754615b1b565b602002602001018190525050505b61276b81615812565b905061262c565b60205460009042118015612787575060215442105b8015611b0b5750506022546001600160a01b0316151590565b6127a8613d6d565b6001600160a01b038216600090815260176020526040902081906127cc8282615ac9565b9050507f73e70037e9e3ec61c7046b971d0fd15c1fdf360fc4cdd7ec6ee00c7a190f5aaa8282604051611d0d929190615cf6565b6002600054036128225760405162461bcd60e51b8152600401610fc3906156c1565b600260005561282f6139e5565b61287b5760405162461bcd60e51b815260206004820152601e60248201527f77686974656c6973742073616c6520686173206e6f7420656e61626c656400006044820152606401610fc3565b6000816001600160401b0316116128a45760405162461bcd60e51b8152600401610fc390615776565b6003816001600160401b0316106128cd5760405162461bcd60e51b8152600401610fc390615b31565b336000818152602360205260408120546001600160401b03169183906128f290610862565b6128fc9190615b66565b9050816001600160401b0316816001600160401b031611156129305760405162461bcd60e51b8152600401610fc390615b91565b61294084846018600001546141cb565b61294933612024565b604080513381526001600160a01b03861660208201526001600160401b0385168183015290517f612921ceebb627f8747363a7fbd7cfa6c748e44a2f9b5e1234b20ee13957bbfc9181900360600190a1505060016000555050565b6129ac613d6d565b6002600054036129ce5760405162461bcd60e51b8152600401610fc3906156c1565b600260009081555b818110156111b75760008383838181106129f2576129f2615b1b565b905060200201359050612a023390565b6001600160a01b0316612a1482611e1b565b6001600160a01b031614612a3a5760405162461bcd60e51b8152600401610fc390615715565b612a4381614364565b5080612a4e81615812565b9150506129d6565b612a61848484613ea9565b6001600160a01b0383163b15612a9a57612a7d84848484614503565b612a9a576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6000323314612ac15760405162461bcd60e51b8152600401610fc3906157ad565b600260005403612ae35760405162461bcd60e51b8152600401610fc3906156c1565b6002600055612af0612772565b612b355760405162461bcd60e51b81526020600482015260166024820152751c995d99585b081a185cc81b9bdd08195b98589b195960521b6044820152606401610fc3565b33612b3f83611e1b565b6001600160a01b031614612b655760405162461bcd60e51b8152600401610fc390615715565b612b6e82614364565b6022546001600160a01b031660008163c349c93e336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018790526044016020604051808303816000875af1158015612bd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bf49190615d13565b60008581526025602052604090205490915060ff1615612c28576000818152602660205260409020805460ff191660011790555b60016000559392505050565b33600081815260026020526040902054600154606092839260ff169161010090046001600160a01b03161480612c6d575060ff81166001145b612c895760405162461bcd60e51b8152600401610fc3906158a4565b6003546000906001600160401b03811115612ca657612ca66153a2565b604051908082528060200260200182016040528015612ccf578160200160208202803683370190505b50905060005b600354811015612d4f576002600060038381548110612cf657612cf6615b1b565b60009182526020808320909101546001600160a01b03168352820192909252604001902054825160ff90911690839083908110612d3557612d35615b1b565b60ff90921660209283029190910190910152600101612cd5565b5060038181805480602002602001604051908101604052809291908181526020018280548015612da857602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612d8a575b505050505091509350935050509091565b6060610f9b826145ee565b3360008181526002602052604090205460015460ff909116919061010090046001600160a01b03166001600160a01b03161480612e04575060ff81166002145b80612e12575060ff81166001145b612e2e5760405162461bcd60e51b8152600401610fc3906158a4565b600260005403612e505760405162461bcd60e51b8152600401610fc3906156c1565b600260005560405134815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c90602001611a11565b6000602754600003612e9b57506000612505565b612f11838380806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506027546040516bffffffffffffffffffffffff1960608b901b1660208201529092506034019050604051602081830303815290604052805190602001206146ee565b949350505050565b600260005403612f3b5760405162461bcd60e51b8152600401610fc3906156c1565b60026000558015612f915760065460ff16612f915760405162461bcd60e51b81526020600482015260166024820152751c985a5cda5b99c81a5cc81b9bdd08185b1b1bddd95960521b6044820152606401610fc3565b60005b838110156131d2576000858583818110612fb057612fb0615b1b565b905060200201359050612fc03390565b6040516331a9108f60e11b8152600481018390526001600160a01b0391909116903090636352211e90602401602060405180830381865afa158015613009573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061302d91906156f8565b6001600160a01b0316146130535760405162461bcd60e51b8152600401610fc390615715565b60008181526005602052604090208054841561316457806000036130d55742825560028201805461ffff191661ffff8816908117909155336001600160a01b0316847fe4a8edd13500ed032855f3f65ba5d8ce672eca25bc115502ba9d6831acf34fd5886040516130c8911515815260200190565b60405180910390a46131c7565b600282015461ffff87811691161461315f5760405162461bcd60e51b815260206004820152604160248201527f72616973696e6720697320616c726561647920737461727465642c206275742060448201527f77697468206120646966666572656e742072616973696e6720747970652073656064820152601d60fa1b608482015260a401610fc3565b6131c7565b80156131c757600182018054428390030190556000825561ffff8616336001600160a01b0316847fe4a8edd13500ed032855f3f65ba5d8ce672eca25bc115502ba9d6831acf34fd5886040516131be911515815260200190565b60405180910390a45b505050600101612f94565b50506001600055505050565b60606000826001600160401b038111156131fa576131fa6153a2565b60405190808252806020026020018201604052801561324c57816020015b6040805160808101825260008082526020808301829052928201819052606082015282526000199092019101816132185790505b50905060005b83811015611e1357600085858381811061326e5761326e615b1b565b604051634f558e7960e01b8152602090910292909201356004830181905292503091634f558e799150602401602060405180830381865afa1580156132b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132db9190615cb3565b6132e5575061340d565b6000818152600560209081526040918290208251608081018452815480825260018301549382019390935260029091015461ffff8116938201939093526201000090920460ff1615156060830152156133bf57600184848151811061334c5761334c615b1b565b60200260200101516060019015159081151581525050806040015184848151811061337957613379615b1b565b602090810291909101015161ffff909116604090910152805161339c9042615d2c565b8484815181106133ae576133ae615b1b565b602002602001015160200181815250505b8383815181106133d1576133d1615b1b565b60200260200101516020015181602001516133ec91906157fa565b8484815181106133fe576133fe615b1b565b60209081029190910101515250505b61341681615812565b9050613252565b6000611b0b600c5490565b613430613d6d565b60ff811661345d576001600160a01b0382166000908152600260205260409020805460ff19169055613483565b6001600160a01b0382166000908152600260205260409020805460ff191660ff83161790555b60405160ff821681526001600160a01b038316907f02ab42f6b82517d797a585d5319a95696ea5167a6fbb0e0322c9ee66edec682c9060200160405180910390a25050565b6134d0613d6d565b80601c6134dd8282615ac9565b9050507f240c7d68bdedeaeef1d6da3749f9cb732a51e4f5a02cee97df848b7750b43204816040516119789190615b0d565b32331461352e5760405162461bcd60e51b8152600401610fc3906157ad565b6002600054036135505760405162461bcd60e51b8152600401610fc3906156c1565b60026000558281146135db5760405162461bcd60e51b815260206004820152604860248201527f746865206c656e677468206f66204c697374696e6720546f6b656e494473206960448201527f7320646966666572656e742066726f6d2074686174206f66204c697374696e6760648201526720416d6f756e747360c01b608482015260a401610fc3565b60006135e686614704565b601454909150841061360a5760405162461bcd60e51b8152600401610fc390615d43565b6000805b8581101561387557600085858381811061362a5761362a615b1b565b905060200201602081019061363f9190614f8b565b90506003816001600160401b0316106136a45760405162461bcd60e51b815260206004820152602160248201527f616e20746f6b656e2063616e206f6e6c79206d696e742074776f20746f6b656e6044820152607360f81b6064820152608401610fc3565b6000816001600160401b0316116136cd5760405162461bcd60e51b8152600401610fc390615776565b6001600160a01b03891660009081526024602052604081206001600160401b03831690828b8b8781811061370357613703615b1b565b9050602002013581526020019081526020016000205401905084606001516001600160401b03168111156137495760405162461bcd60e51b8152600401610fc390615d43565b89336001600160a01b038216636352211e8c8c8881811061376c5761376c615b1b565b905060200201356040518263ffffffff1660e01b815260040161379191815260200190565b602060405180830381865afa1580156137ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137d291906156f8565b6001600160a01b0316146138205760405162461bcd60e51b81526020600482015260156024820152743237b2b9b713ba1037bbb7103a3432903a37b5b2b760591b6044820152606401610fc3565b6001600160a01b038b16600090815260246020526040812083918c8c8881811061384c5761384c615b1b565b60209081029290920135835250810191909152604001600020555050919091019060010161360e565b5061388333835183906141cb565b505060016000555050505050565b3233146138b05760405162461bcd60e51b8152600401610fc3906157ad565b6002600054036138d25760405162461bcd60e51b8152600401610fc3906156c1565b60026000556138df611af6565b61392b5760405162461bcd60e51b815260206004820152601b60248201527f7075626c69632073616c6520686173206e6f7420656e61626c656400000000006044820152606401610fc3565b6000816001600160401b0316116139545760405162461bcd60e51b8152600401610fc390615776565b6003816001600160401b03161061397d5760405162461bcd60e51b8152600401610fc390615b31565b60008161398933610862565b6139939190615b66565b601f549091506001600160401b0390811690821611156139c55760405162461bcd60e51b8152600401610fc390615b91565b6139d333601c5484906141cb565b6139dc33612024565b50506001600055565b60195460009042118015611b0b575050601a54421090565b613a05613d6d565b80356007819055602080830135600881905560408085013560098190558151948552928401919091528201527f61467bd874c25765186e5d914938f0b7ac6f48d10b8d0a7f9d9b15dfe1b520f490606001611978565b613a63613d6d565b6001600160a01b038116613ac85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610fc3565b613ad18161430a565b50565b600260005403613af65760405162461bcd60e51b8152600401610fc3906156c1565b6002600081815533808252602092909252604090205460015460ff909116919061010090046001600160a01b03166001600160a01b03161480613b3c575060ff81166002145b80613b4a575060ff81166001145b613b665760405162461bcd60e51b8152600401610fc3906158a4565b60005b82811015612050576000848483818110613b8557613b85615b1b565b9050602002013590506000306001600160a01b0316636352211e836040518263ffffffff1660e01b8152600401613bbe91815260200190565b602060405180830381865afa158015613bdb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bff91906156f8565b60008381526005602052604081208054929350919003613c2157505050613cb3565b8054600182018054429290920390910190556000808255600282015460405191825261ffff16906001600160a01b0384169085907fe4a8edd13500ed032855f3f65ba5d8ce672eca25bc115502ba9d6831acf34fd59060200160405180910390a4604051339084907f376b2166c0aaa2fc263d60dbcf1a4fa8f55e709487fcc9073ba90faa78d5005790600090a35050505b600101613b69565b60006301ffc9a760e01b6001600160e01b031983161480613cec57506380ac58cd60e01b6001600160e01b03198316145b80610f9b5750506001600160e01b031916635b5e139f60e01b1490565b600081600111158015613d1d5750600b5482105b8015610f9b5750506000908152600f6020526040902054600160e01b161590565b600080613d4a83614126565b905080600003610f9b57604051636f96cda160e11b815260040160405180910390fd5b6001546001600160a01b036101009091041633146120bb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610fc3565b600b546001600160a01b038316613df657604051622e076360e81b815260040160405180910390fd5b81600003613e175760405163b562e8dd60e01b815260040160405180910390fd5b613e246000848385614900565b6001600160a01b03831660009081526010602090815260408083208054680100000000000000018702019055838352600f90915290204260a01b84176001841460e11b179055808083015b6040516001830192906001600160a01b03871690600090600080516020615e32833981519152908290a4808210613e6f5750600b55505050565b6000613eb482613d3e565b9050836001600160a01b0316816001600160a01b031614613ee75760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480613f055750613f058533610eb8565b80613f20575033613f1584611253565b6001600160a01b0316145b905080613f4057604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416613f6757604051633a954ecd60e21b815260040160405180910390fd5b613f748585856001614900565b600083815260116020908152604080832080546001600160a01b03191690556001600160a01b0388811684526010835281842080546000190190558716835280832080546001019055858352600f9091528120600160e11b4260a01b871781179091558316900361401557600183016000818152600f6020526040812054900361401357600b548114614013576000818152600f602052604090208390555b505b82846001600160a01b0316866001600160a01b0316600080516020615e3283398151915260405160405180910390a45b5050505050565b60165460009060ff16156140cc5760008281526025602052604090205460ff16156140cc5760405162461bcd60e51b815260206004820152602a60248201527f4e6f20726566756e64732061726520616c6c6f77656420666f7220667265652060448201526936b4b73a103a37b5b2b760b11b6064820152608401610fc3565b600954610f9b565b6140dc614918565b6001805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6000818060011161417c57600b5481101561417c576000818152600f602052604081205490600160e01b8216900361417a575b806000036125055750600019016000818152600f6020526040902054614159565b505b50600092915050565b6000610f9b82611b72565b614198614961565b6001805460ff1916811790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833614109565b6014546028546001600160401b039081169084166141ec600b546000190190565b6141f691906157fa565b6142009190615d2c565b111561421e5760405162461bcd60e51b8152600401610fc390615d43565b60006142336001600160401b03841683615d7a565b9050348111156142855760405162461bcd60e51b815260206004820152601f60248201527f65746865722076616c75652073656e74206973206e6f7420636f7272656374006044820152606401610fc3565b61429884846001600160401b03166149a7565b6142a1816149c5565b81600003612a9a5760005b836001600160401b031681101561404557600160256000836142d1600b546000190190565b6142db9190615d2c565b81526020810191909152604001600020805460ff191691151591909117905561430381615812565b90506142ac565b600180546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b613ad1816000614a03565b6060600a805461437e90615742565b80601f01602080910402602001604051908101604052809291908181526020018280546143aa90615742565b80156143f75780601f106143cc576101008083540402835291602001916143f7565b820191906000526020600020905b8154815290600101906020018083116143da57829003601f168201915b50505050509050919050565b60608160000361442a5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115614454578061443e81615812565b915061444d9050600a83615daf565b915061442e565b6000816001600160401b0381111561446e5761446e6153a2565b6040519080825280601f01601f191660200182016040528015614498576020820181803683370190505b5090505b8415612f11576144ad600183615d2c565b91506144ba600a86615dc3565b6144c59060306157fa565b60f81b8183815181106144da576144da615b1b565b60200101906001600160f81b031916908160001a9053506144fc600a86615daf565b945061449c565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290614538903390899088908890600401615dd7565b6020604051808303816000875af1925050508015614573575060408051601f3d908101601f1916820190925261457091810190615e14565b60015b6145d1573d8080156145a1576040519150601f19603f3d011682016040523d82523d6000602084013e6145a6565b606091505b5080516000036145c9576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b604051634f558e7960e01b8152600481018290526060903090634f558e7990602401602060405180830381865afa15801561462d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146519190615cb3565b6146925760405162461bcd60e51b81526020600482015260126024820152711d1bdad95b881a5cc81b9bdd08195e1a5cdd60721b6044820152606401610fc3565b600061469d8361436f565b905060008151116146bd5760405180602001604052806000815250612505565b806146c784614403565b6040516020016146d8929190615cd0565b6040516020818303038152906040529392505050565b6000826146fb8584614b58565b14949350505050565b614738604051806080016040528060008152602001600081526020016000815260200160006001600160401b031681525090565b6001600160a01b03821661478e5760405162461bcd60e51b815260206004820152601b60248201527f636f6e7472616374206164647265737320697320696e76616c696400000000006044820152606401610fc3565b6001600160a01b0382166000908152601760209081526040918290208251608081018452815481526001820154928101839052600282015493810193909352600301546001600160401b03166060830152158015906147f05750806020015142115b61483c5760405162461bcd60e51b815260206004820152601860248201527f686f6c646572206d696e74206973206e6f7420737461727400000000000000006044820152606401610fc3565b8060400151421061488f5760405162461bcd60e51b815260206004820152601b60248201527f686f6c646572206d696e7420686173206265656e2073746f70656400000000006044820152606401610fc3565b600081606001516001600160401b031611610f9b5760405162461bcd60e51b815260206004820152602b60248201527f74686520696e70757420636f6e747261637420646f6573206e6f74207375707060448201526a1bdc9d081d1bc81b5a5b9d60aa1b6064820152608401610fc3565b61490c84848484614b9d565b612a9a84848484614c48565b60015460ff166120bb5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610fc3565b60015460ff16156120bb5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610fc3565b6149c1828260405180602001604052806000815250614c98565b5050565b80341115613ad157336108fc6149db8334615d2c565b6040518115909202916000818181858888f193505050501580156149c1573d6000803e3d6000fd5b6000614a0e83613d3e565b9050808215614a72576000336001600160a01b0383161480614a355750614a358233610eb8565b80614a50575033614a4586611253565b6001600160a01b0316145b905080614a7057604051632ce44b5f60e11b815260040160405180910390fd5b505b614a80816000866001614900565b600084815260116020908152604080832080546001600160a01b03191690556001600160a01b03841683526010825280832080546fffffffffffffffffffffffffffffffff019055868352600f9091528120600360e01b4260a01b8417179055600160e11b83169003614b2357600184016000818152600f60205260408120549003614b2157600b548114614b21576000818152600f602052604090208390555b505b60405184906000906001600160a01b03841690600080516020615e32833981519152908390a45050600c805460010190555050565b600081815b8451811015611e1357614b8982868381518110614b7c57614b7c615b1b565b6020026020010151614df4565b915080614b9581615812565b915050614b5d565b60005b8181101561404557614bc9614bb582856157fa565b600090815260056020526040902054151590565b15614c385760056000614bdc83866157fa565b815260208101919091526040016000206002015462010000900460ff16614c385760405162461bcd60e51b815260206004820152601060248201526f746f6b656e2069732072616973696e6760801b6044820152606401610fc3565b614c4181615812565b9050614ba0565b60015460ff1615614c935760405162461bcd60e51b81526020600482015260156024820152741d1bdad95b881d1c985b9cd9995c881c185d5cd959605a1b6044820152606401610fc3565b612a9a565b600b546001600160a01b038416614cc157604051622e076360e81b815260040160405180910390fd5b82600003614ce25760405163b562e8dd60e01b815260040160405180910390fd5b614cef6000858386614900565b6001600160a01b03841660008181526010602090815260408083208054680100000000000000018902019055848352600f90915290204260a01b86176001861460e11b1790558190818501903b15614db2575b60405182906001600160a01b03881690600090600080516020615e32833981519152908290a4614d7b6000878480600101955087614503565b614d98576040516368d2bf6b60e11b815260040160405180910390fd5b808210614d425782600b5414614dad57600080fd5b614de5565b5b6040516001830192906001600160a01b03881690600090600080516020615e32833981519152908290a4808210614db3575b50600b55612a9a600085838684565b6000818310614e10576000828152602084905260409020612505565b5060009182526020526040902090565b6001600160e01b031981168114613ad157600080fd5b600060208284031215614e4857600080fd5b813561250581614e20565b6001600160a01b0381168114613ad157600080fd5b600080600060608486031215614e7d57600080fd5b8335614e8881614e53565b92506020840135614e9881614e53565b929592945050506040919091013590565b60005b83811015614ec4578181015183820152602001614eac565b83811115612a9a5750506000910152565b60008151808452614eed816020860160208601614ea9565b601f01601f19169290920160200192915050565b6020815260006125056020830184614ed5565b600060208284031215614f2657600080fd5b5035919050565b60008060408385031215614f4057600080fd5b8235614f4b81614e53565b946020939093013593505050565b600060208284031215614f6b57600080fd5b813561250581614e53565b6001600160401b0381168114613ad157600080fd5b600060208284031215614f9d57600080fd5b813561250581614f76565b600060808284031215614fba57600080fd5b50919050565b600060808284031215614fd257600080fd5b6125058383614fa8565b600060608284031215614fba57600080fd5b60006060828403121561500057600080fd5b6125058383614fdc565b6000806020838503121561501d57600080fd5b82356001600160401b038082111561503457600080fd5b818501915085601f83011261504857600080fd5b81358181111561505757600080fd5b86602082850101111561506957600080fd5b60209290920196919550909350505050565b60008060a0838503121561508e57600080fd5b6150988484614fa8565b946080939093013593505050565b60008083601f8401126150b857600080fd5b5081356001600160401b038111156150cf57600080fd5b6020830191508360208260051b85010111156150ea57600080fd5b9250929050565b6000806020838503121561510457600080fd5b82356001600160401b0381111561511a57600080fd5b615126858286016150a6565b90969095509350505050565b600081518084526020808501945080840160005b8381101561516b5781516001600160a01b031687529582019590820190600101615146565b509495945050505050565b6020815260006125056020830184615132565b60008060006040848603121561519e57600080fd5b83356001600160401b038111156151b457600080fd5b6151c0868287016150a6565b90945092505060208401356151d481614f76565b809150509250925092565b6020808252825182820181905260009190848201906040850190845b81811015615217578351835292840192918401916001016151fb565b50909695505050505050565b6000806040838503121561523657600080fd5b823561524181614e53565b9150602083013561525181614f76565b809150509250929050565b8015158114613ad157600080fd5b6000806040838503121561527d57600080fd5b82356152888161525c565b915060208301356152518161525c565b6000806000604084860312156152ad57600080fd5b83356152b881614e53565b925060208401356001600160401b038111156152d357600080fd5b6152df868287016150a6565b9497909650939450505050565b600080604083850312156152ff57600080fd5b823561528881614e53565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561535f57603f1988860301845261534d858351614ed5565b94509285019290850190600101615331565b5092979650505050505050565b60008060a0838503121561537f57600080fd5b823561538a81614e53565b91506153998460208501614fa8565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156153e0576153e06153a2565b604052919050565b600080600080608085870312156153fe57600080fd5b843561540981614e53565b935060208581013561541a81614e53565b93506040860135925060608601356001600160401b038082111561543d57600080fd5b818801915088601f83011261545157600080fd5b813581811115615463576154636153a2565b615475601f8201601f191685016153b8565b9150808252898482850101111561548b57600080fd5b808484018584013760008482840101525080935050505092959194509250565b6040815260006154be6040830185615132565b82810360208481019190915284518083528582019282019060005b818110156154f857845160ff16835293830193918301916001016154d9565b5090979650505050505050565b6000806000806060858703121561551b57600080fd5b84356001600160401b0381111561553157600080fd5b61553d878288016150a6565b909550935050602085013561ffff8116811461555857600080fd5b915060408501356155688161525c565b939692955090935050565b602080825282518282018190526000919060409081850190868401855b828110156155d05781518051855286810151878601528581015161ffff168686015260609081015115159085015260809093019290850190600101615590565b5091979650505050505050565b600080604083850312156155f057600080fd5b82356155fb81614e53565b9150602083013560ff8116811461525157600080fd5b60008060008060006060868803121561562957600080fd5b853561563481614e53565b945060208601356001600160401b038082111561565057600080fd5b61565c89838a016150a6565b9096509450604088013591508082111561567557600080fd5b50615682888289016150a6565b969995985093965092949392505050565b600080604083850312156156a657600080fd5b82356156b181614e53565b9150602083013561525181614e53565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60006020828403121561570a57600080fd5b815161250581614e53565b60208082526013908201527231b0b63632b91034b9903737ba1037bbb732b960691b604082015260600190565b600181811c9082168061575657607f821691505b602082108103614fba57634e487b7160e01b600052602260045260246000fd5b60208082526018908201527f696e76616c6964206e756d626572206f6620746f6b656e730000000000000000604082015260600190565b6020808252601a908201527f63616c6c657220697320616e6f7468657220636f6e7472616374000000000000604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000821982111561580d5761580d6157e4565b500190565b600060018201615824576158246157e4565b5060010190565b8135815560208201356001820155604082013560028201556003810160608301356158558161525c565b815490151560ff1660ff19919091161790555050565b8135815260208083013590820152604080830135908201526080810160608301356158958161525c565b80151560608401525092915050565b6020808252600e908201526d1b9bdd08185d5d1a1bdc9a5e995960921b604082015260600190565b81358155602082013560018201556002810160408301356158ec81614e53565b81546001600160a01b0319166001600160a01b03919091161790555050565b813581526020808301359082015260608101604083013561592b81614e53565b6001600160a01b031660409290920191909152919050565b601f8211156114dd57600081815260208120601f850160051c8101602086101561596a5750805b601f850160051c820191505b8181101561598957828155600101615976565b505050505050565b6001600160401b038311156159a8576159a86153a2565b6159bc836159b68354615742565b83615943565b6000601f8411600181146159f057600085156159d85750838201355b600019600387901b1c1916600186901b178355614045565b600083815260209020601f19861690835b82811015615a215786850135825560209485019460019092019101615a01565b5086821015615a3e5760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b813581556020820135600182015560408201356002820155600381016060830135615aa981614f76565b815467ffffffffffffffff19166001600160401b03919091161790555050565b6149c18282615a7f565b8035825260208101356020830152604081013560408301526060810135615af981614f76565b6001600160401b0381166060840152505050565b60808101610f9b8284615ad3565b634e487b7160e01b600052603260045260246000fd5b6020808252818101527f63616e206f6e6c79206d696e74203220746f6b656e7320617420612074696d65604082015260600190565b60006001600160401b03808316818516808303821115615b8857615b886157e4565b01949350505050565b6020808252601690820152751bdd5d081bd9881b585e081b5a5b9d08185b5bdd5b9d60521b604082015260600190565b6001600160a01b0384168152604060208201819052810182905260006001600160fb1b03831115615bf157600080fd5b8260051b8085606085013760009201606001918252509392505050565b60006020808385031215615c2157600080fd5b82516001600160401b0380821115615c3857600080fd5b818501915085601f830112615c4c57600080fd5b815181811115615c5e57615c5e6153a2565b8060051b9150615c6f8483016153b8565b8181529183018401918481019088841115615c8957600080fd5b938501935b83851015615ca757845182529385019390850190615c8e565b98975050505050505050565b600060208284031215615cc557600080fd5b81516125058161525c565b60008351615ce2818460208801614ea9565b835190830190615b88818360208801614ea9565b6001600160a01b038316815260a081016125056020830184615ad3565b600060208284031215615d2557600080fd5b5051919050565b600082821015615d3e57615d3e6157e4565b500390565b60208082526018908201527f6d61782073616c6520737570706c792065786365656465640000000000000000604082015260600190565b6000816000190483118215151615615d9457615d946157e4565b500290565b634e487b7160e01b600052601260045260246000fd5b600082615dbe57615dbe615d99565b500490565b600082615dd257615dd2615d99565b500690565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090615e0a90830184614ed5565b9695505050505050565b600060208284031215615e2657600080fd5b815161250581614e2056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220e463c2dbb0292fcfbc3de34317e6c84875d13c43e778890c5268ca5b29072a7364736f6c634300080f0033

Deployed Bytecode Sourcemap

5116:15293:21:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4929:291:14;;;;;;;;;;-1:-1:-1;4929:291:14;;;;;:::i;:::-;;:::i;:::-;;;565:14:22;;558:22;540:41;;528:2;513:18;4929:291:14;;;;;;;;6637:646:16;;;;;;;;;;-1:-1:-1;6637:646:16;;;;;:::i;:::-;;:::i;:::-;;10211:98:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;12212:200::-;;;;;;;;;;-1:-1:-1;12212:200:19;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2289:32:22;;;2271:51;;2259:2;2244:18;12212:200:19;2125:203:22;11688:463:19;;;;;;;;;;-1:-1:-1;11688:463:19;;;;;:::i;:::-;;:::i;4923:28:17:-;;;;;;;;;;-1:-1:-1;4923:28:17;;;;;;;-1:-1:-1;;;;;4923:28:17;;;5300:167;;;;;;;;;;-1:-1:-1;5300:167:17;;;;;:::i;:::-;;:::i;6547:294:14:-;;;;;;;;;;;;;:::i;:::-;;;3051:25:22;;;3039:2;3024:18;6547:294:14;2905:177:22;4940:33:13;;;;;;;;;;;;4972:1;4940:33;;;;;3259:4:22;3247:17;;;3229:36;;3217:2;3202:18;4940:33:13;3087:184:22;4895:39:13;;;;;;;;;;;;4933:1;4895:39;;9794:458:21;;;;;;;;;;-1:-1:-1;9794:458:21;;;;;:::i;:::-;;:::i;13072:164:19:-;;;;;;;;;;-1:-1:-1;13072:164:19;;;;;:::i;:::-;;:::i;5780:783:17:-;;;;;;;;;;-1:-1:-1;5780:783:17;;;;;:::i;:::-;;:::i;5460:28:16:-;;;;;;;;;;-1:-1:-1;5460:28:16;;;;;;;;4979:36:13;;;;;;;;;;;;5014:1;4979:36;;16047:163:21;;;;;;;;;;-1:-1:-1;16047:163:21;;;;;:::i;:::-;16151:4;16178:25;;;:15;:25;;;;;;;;;16047:163;5066:32:17;;;;;;;;;;-1:-1:-1;5066:32:17;;;;;;;;;;;;;;;;3862:25:22;;;3918:2;3903:18;;3896:34;;;;3946:18;;;3939:34;3850:2;3835:18;5066:32:17;3660:319:22;6912:25:21;;;;;;;;;;;;;;;;6847:605:14;;;;;;;;;;-1:-1:-1;6847:605:14;;;;;:::i;:::-;;:::i;7205:137:21:-;;;;;;;;;;-1:-1:-1;7205:137:21;;;;;:::i;:::-;;:::i;6757:203:13:-;;;;;;;;;;;;;:::i;7502:113::-;;;;;;;;;;;;;:::i;8659:191:21:-;;;;;;;;;;;;;:::i;13302:179:19:-;;;;;;;;;;-1:-1:-1;13302:179:19;;;;;:::i;:::-;;:::i;8302:145:21:-;;;;;;;;;;-1:-1:-1;8302:145:21;;;;;:::i;:::-;;:::i;9996:153:19:-;;;;;;;;;;-1:-1:-1;9996:153:19;;;;;:::i;:::-;;:::i;4792:131:15:-;;;;;;;;;;-1:-1:-1;4792:131:15;;;;;:::i;:::-;;:::i;7458:182:14:-;;;;;;;;;;-1:-1:-1;7458:182:14;;;;;:::i;:::-;;:::i;7328:116:13:-;;;;;;;;;;;;;:::i;17140:108:21:-;;;;;;;;;;-1:-1:-1;17140:108:21;;;;;:::i;:::-;-1:-1:-1;;;;;6465:25:19;17202:7:21;6465:25:19;;;:18;:25;;;;;;1855:3;6465:39;;17140:108:21;4956:127:18;;;;;;;;;;-1:-1:-1;4956:127:18;;;;;:::i;:::-;;:::i;7591:227:21:-;;;;;;;;;;-1:-1:-1;7591:227:21;;;;;:::i;:::-;;:::i;1615:84:1:-;;;;;;;;;;-1:-1:-1;1685:7:1;;;;1615:84;;4929:351:15;;;;;;;;;;-1:-1:-1;4929:351:15;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;9849:142:19:-;;;;;;;;;;-1:-1:-1;9849:142:19;;;;;:::i;:::-;;:::i;7790:112:13:-;;;;;;;;;;;;;:::i;12657:803:21:-;;;;;;:::i;:::-;;:::i;6601:29::-;;;;;;;;;;-1:-1:-1;6601:29:21;;;;;;;;;;-1:-1:-1;;;;;6601:29:21;;;;;;;8237:25:22;;;8293:2;8278:18;;8271:34;;;;-1:-1:-1;;;;;8341:32:22;8321:18;;;8314:60;8225:2;8210:18;6601:29:21;8035:345:22;5526:221:19;;;;;;;;;;-1:-1:-1;5526:221:19;;;;;:::i;:::-;;:::i;1831:101:0:-;;;;;;;;;;;;;:::i;18027:864:21:-;;;;;;;;;;-1:-1:-1;18027:864:21;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;7824:242::-;;;;;;;;;;-1:-1:-1;7824:242:21;;;;;:::i;:::-;;:::i;5846:369:16:-;;;;;;;;;;-1:-1:-1;5846:369:16;;;;;:::i;:::-;;:::i;6180:117:13:-;;;;;;;;;;-1:-1:-1;6180:117:13;;;;;:::i;:::-;-1:-1:-1;;;;;6268:22:13;6244:5;6268:22;;;:12;:22;;;;;;;;;6180:117;16570:476:21;;;;;;;;;;-1:-1:-1;16570:476:21;;;;;:::i;:::-;;:::i;16332:171::-;;;;;;;;;;-1:-1:-1;16332:171:21;;;;;:::i;:::-;16440:4;16467:29;;;:19;:29;;;;;;;;;16332:171;5126:169:17;;;;;;;;;;;;;:::i;6524:34:21:-;;;;;;;;;;-1:-1:-1;6524:34:21;;;;;;;;;;;;;-1:-1:-1;;;;;6524:34:21;;;;;;;10723:25:22;;;10779:2;10764:18;;10757:34;;;;10807:18;;;10800:34;-1:-1:-1;;;;;10870:31:22;10865:2;10850:18;;10843:59;10710:3;10695:19;6524:34:21;10494:414:22;1201:85:0;;;;;;;;;;-1:-1:-1;1273:6:0;;;;;-1:-1:-1;;;;;1273:6:0;1201:85;;10373:102:19;;;;;;;;;;;;;:::i;5021:34:13:-;;;;;;;;;;;;5054:1;5021:34;;12479:303:19;;;;;;;;;;-1:-1:-1;12479:303:19;;;;;:::i;:::-;;:::i;6125:93:14:-;;;;;;;;;;;;;:::i;5498:647:18:-;;;;;;;;;;-1:-1:-1;5498:647:18;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;9372:230:21:-;;;;;;;;;;;;;:::i;7348:237::-;;;;;;;;;;-1:-1:-1;7348:237:21;;;;;:::i;:::-;;:::i;6436:25::-;;;;;;;;;;-1:-1:-1;6436:25:21;;;;;;;;;;;;;;;;;;;;;12724::22;;;12780:2;12765:18;;12758:34;;;;12808:18;;;12801:34;12878:14;12871:22;12866:2;12851:18;;12844:50;12711:3;12696:19;6436:25:21;12499:401:22;5142:34:13;;;;;;;;;;-1:-1:-1;5142:34:13;;;;;;;;13466:682:21;;;;;;:::i;:::-;;:::i;5693:328:14:-;;;;;;;;;;-1:-1:-1;5693:328:14;;;;;:::i;:::-;;:::i;13547:385:19:-;;;;;;;;;;-1:-1:-1;13547:385:19;;;;;:::i;:::-;;:::i;17441:580:21:-;;;;;;;;;;-1:-1:-1;17441:580:21;;;;;:::i;:::-;;:::i;5750:424:13:-;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;19535:233:21:-;;;;;;;;;;-1:-1:-1;19535:233:21;;;;;:::i;:::-;;:::i;6981:24::-;;;;;;;;;;-1:-1:-1;6981:24:21;;;;-1:-1:-1;;;;;6981:24:21;;;;;;-1:-1:-1;;;;;15408:31:22;;;15390:50;;15378:2;15363:18;6981:24:21;15246:200:22;6526:121:13;;;:::i;8885:379:21:-;;;;;;;;;;-1:-1:-1;8885:379:21;;;;;:::i;:::-;;:::i;8765:1881:16:-;;;;;;;;;;-1:-1:-1;8765:1881:16;;;;;:::i;:::-;;:::i;6564:31:21:-;;;;;;;;;;-1:-1:-1;6564:31:21;;;;;;;;;;;;;-1:-1:-1;;;;;6564:31:21;;;7549:862:16;;;;;;;;;;-1:-1:-1;7549:862:16;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;6027:93:14:-;;;;;;;;;;;;;:::i;5418:326:13:-;;;;;;;;;;-1:-1:-1;5418:326:13;;;;;:::i;:::-;;:::i;8072:155:21:-;;;;;;;;;;-1:-1:-1;8072:155:21;;;;;:::i;:::-;;:::i;10973:1634::-;;;;;;:::i;:::-;;:::i;14232:601::-;;;;;;:::i;:::-;;:::i;5494:36:16:-;;;;;;;;;;-1:-1:-1;5494:36:16;;;;;;;;;;;12848:162:19;;;;;;;;;;-1:-1:-1;12848:162:19;;;;;:::i;:::-;-1:-1:-1;;;;;12968:25:19;;;12945:4;12968:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;12848:162;8453:200:21;;;;;;;;;;;;;:::i;5472:156:17:-;;;;;;;;;;-1:-1:-1;5472:156:17;;;;;:::i;:::-;;:::i;2081:198:0:-;;;;;;;;;;-1:-1:-1;2081:198:0;;;;;:::i;:::-;;:::i;5823:58:21:-;;;;;;;;;;;;5865:16;5823:58;;11004:886:16;;;;;;;;;;-1:-1:-1;11004:886:16;;;;;:::i;:::-;;:::i;4929:291:14:-;5072:4;-1:-1:-1;;;;;;5111:50:14;;-1:-1:-1;;;5111:50:14;;:102;;;5177:36;5201:11;5177:23;:36::i;:::-;5092:121;4929:291;-1:-1:-1;;4929:291:14:o;6637:646:16:-;1744:1:2;2325:7;;:19;2317:63;;;;-1:-1:-1;;;2317:63:2;;;;;;;:::i;:::-;;;;;;;;;1744:1;2455:7;:18;719:10:8;6787:22:16::1;::::0;-1:-1:-1;;;6787:22:16;;::::1;::::0;::::1;3051:25:22::0;;;-1:-1:-1;;;;;6787:38:16;;;::::1;::::0;:4:::1;::::0;:12:::1;::::0;3024:18:22;;6787:22:16::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;6787:38:16::1;;6779:70;;;;-1:-1:-1::0;;;6779:70:16::1;;;;;;;:::i;:::-;6880:24;::::0;::::1;::::0;::::1;;;6859:108;;;::::0;-1:-1:-1;;;6859:108:16;;21139:2:22;6859:108:16::1;::::0;::::1;21121:21:22::0;21178:2;21158:18;;;21151:30;21217:34;21197:18;;;21190:62;-1:-1:-1;;;21268:18:22;;;21261:35;21313:19;;6859:108:16::1;20937:401:22::0;6859:108:16::1;6977:26;::::0;;;:16:::1;:26;::::0;;;;;;:42:::1;;:49:::0;;-1:-1:-1;;6977:49:16::1;::::0;::::1;::::0;;7036:43;-1:-1:-1;;;7036:43:16;;-1:-1:-1;;;;;21601:15:22;;;7036:43:16::1;::::0;::::1;21583:34:22::0;21653:15;;21633:18;;;21626:43;21685:18;;;21678:34;;;7036:4:16::1;::::0;:21:::1;::::0;21518:18:22;;7036:43:16::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;;7134:5:16::1;7089:26:::0;;;:16:::1;:26;::::0;;;;:42:::1;::::0;::::1;:50:::0;;-1:-1:-1;;7089:50:16::1;::::0;;7153:43;:48;;-1:-1:-1;7149:128:16::1;;7257:8;7252:3;-1:-1:-1::0;;;;;7222:44:16::1;7245:5;-1:-1:-1::0;;;;;7222:44:16::1;;;;;;;;;;;7149:128;-1:-1:-1::0;;1701:1:2;2628:7;:22;-1:-1:-1;6637:646:16:o;10211:98:19:-;10265:13;10297:5;10290:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10211:98;:::o;12212:200::-;12280:7;12304:16;12312:7;12304;:16::i;:::-;12299:64;;12329:34;;-1:-1:-1;;;12329:34:19;;;;;;;;;;;12299:64;-1:-1:-1;12381:24:19;;;;:15;:24;;;;;;-1:-1:-1;;;;;12381:24:19;;12212:200::o;11688:463::-;11760:13;11792:27;11811:7;11792:18;:27::i;:::-;11760:61;;11841:5;-1:-1:-1;;;;;11835:11:19;:2;-1:-1:-1;;;;;11835:11:19;;11831:48;;11855:24;;-1:-1:-1;;;11855:24:19;;;;;;;;;;;11831:48;719:10:8;-1:-1:-1;;;;;11894:28:19;;;11890:172;;11941:44;11958:5;719:10:8;12848:162:19;:::i;11941:44::-;11936:126;;12012:35;;-1:-1:-1;;;12012:35:19;;;;;;;;;;;11936:126;12072:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;12072:29:19;-1:-1:-1;;;;;12072:29:19;;;;;;;;;12116:28;;12072:24;;12116:28;;;;;;;11750:401;11688:463;;:::o;5300:167:17:-;1094:13:0;:11;:13::i;:::-;5379::17::1;:30:::0;;-1:-1:-1;;;;;;5379:30:17::1;::::0;-1:-1:-1;;;;;5379:30:17;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;5424:36:::1;::::0;::::1;::::0;-1:-1:-1;;5424:36:17::1;5300:167:::0;:::o;6547:294:14:-;6600:7;6810:14;4757:12:19;;;4684:92;6810:14:14;4559:13:19;;-1:-1:-1;;4559:31:19;6793::14;6786:38;;6547:294;:::o;9794:458:21:-;1094:13:0;:11;:13::i;:::-;1744:1:2::1;2325:7;;:19:::0;2317:63:::1;;;;-1:-1:-1::0;;;2317:63:2::1;;;;;;;:::i;:::-;1744:1;2455:7;:18:::0;-1:-1:-1;;;;;9886:19:21;::::2;9878:56;;;;-1:-1:-1::0;;;9878:56:21::2;;;;;;;:::i;:::-;9988:10;::::0;10069:21;;-1:-1:-1;;;;;9988:10:21;;::::2;:28:::0;::::2;::::0;10055:35;::::2;;;10030:118;;;::::0;-1:-1:-1;;;10030:118:21;;22663:2:22;10030:118:21::2;::::0;::::2;22645:21:22::0;22702:2;22682:18;;;22675:30;22741:26;22721:18;;;22714:54;22785:18;;10030:118:21::2;22461:348:22::0;10030:118:21::2;10162:36;719:10:8::0;10182:15:21::2;-1:-1:-1::0;;;;;10162:36:21::2;:5;:36::i;:::-;10212:10;:23:::0;;-1:-1:-1;;10212:23:21::2;-1:-1:-1::0;;;;;10212:23:21;;;::::2;::::0;;;::::2;::::0;;-1:-1:-1;;;2628:22:2;9794:458:21:o;13072:164:19:-;13201:28;13211:4;13217:2;13221:7;13201:9;:28::i;:::-;13072:164;;;:::o;5780:783:17:-;9322:9:13;719:10:8;9322:25:13;9314:64;;;;-1:-1:-1;;;9314:64:13;;;;;;;:::i;:::-;1744:1:2::1;2325:7;;:19:::0;2317:63:::1;;;;-1:-1:-1::0;;;2317:63:2::1;;;;;;;:::i;:::-;1744:1;2455:7;:18:::0;5883:22:17::2;::::0;-1:-1:-1;;;5883:22:17;;::::2;::::0;::::2;3051:25:22::0;;;5883:4:17::2;::::0;:12:::2;::::0;3024:18:22;;5883:22:17::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;5867:38:17::2;719:10:8::0;-1:-1:-1;;;;;5867:38:17::2;;5859:66;;;::::0;-1:-1:-1;;;5859:66:17;;23371:2:22;5859:66:17::2;::::0;::::2;23353:21:22::0;23410:2;23390:18;;;23383:30;-1:-1:-1;;;23429:18:22;;;23422:45;23484:18;;5859:66:17::2;23169:339:22::0;5859:66:17::2;5959:13;::::0;;;::::2;-1:-1:-1::0;;;;;5959:13:17::2;719:10:8::0;5943:29:17;5935:79:::2;;;::::0;-1:-1:-1;;;5935:79:17;;23715:2:22;5935:79:17::2;::::0;::::2;23697:21:22::0;23754:2;23734:18;;;23727:30;23793:34;23773:18;;;23766:62;-1:-1:-1;;;23844:18:22;;;23837:35;23889:19;;5935:79:17::2;23513:401:22::0;5935:79:17::2;6032:17;:15;:17::i;:::-;6024:59;;;::::0;-1:-1:-1;;;6024:59:17;;24121:2:22;6024:59:17::2;::::0;::::2;24103:21:22::0;24160:2;24140:18;;;24133:30;24199:31;24179:18;;;24172:59;24248:18;;6024:59:17::2;23919:353:22::0;6024:59:17::2;6094:19;6116:22;6129:8;6116:12;:22::i;:::-;6094:44;;6170:1;6156:11;:15;6148:57;;;::::0;-1:-1:-1;;;6148:57:17;;24479:2:22;6148:57:17::2;::::0;::::2;24461:21:22::0;24518:2;24498:18;;;24491:30;24557:31;24537:18;;;24530:59;24606:18;;6148:57:17::2;24277:353:22::0;6148:57:17::2;6248:11;6223:21;:36;;6215:76;;;::::0;-1:-1:-1;;;6215:76:17;;24837:2:22;6215:76:17::2;::::0;::::2;24819:21:22::0;24876:2;24856:18;;;24849:30;24915:29;24895:18;;;24888:57;24962:18;;6215:76:17::2;24635:351:22::0;6215:76:17::2;6338:13;::::0;6302:60:::2;::::0;;-1:-1:-1;;;6302:60:17;;719:10:8;6302:60:17::2;::::0;::::2;21583:34:22::0;6338:13:17;;;::::2;-1:-1:-1::0;;;;;6338:13:17::2;21633:18:22::0;;;21626:43;21685:18;;;21678:34;;;6302:60:17;:4:::2;::::0;:21:::2;::::0;21518:18:22;;;;;-1:-1:-1;;6302:60:17;;;;;;;-1:-1:-1;6302:4:17;:60;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;6445:12;719:10:8::0;;640:96;6445:12:17::2;-1:-1:-1::0;;;;;6437:30:17::2;:43;6468:11;6437:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;6519:13:17::2;::::0;;;::::2;-1:-1:-1::0;;;;;6519:13:17::2;719:10:8::0;-1:-1:-1;;;;;6496:60:17::2;;6534:8;6544:11;6496:60;;;;;;25165:25:22::0;;;25221:2;25206:18;;25199:34;25153:2;25138:18;;24991:248;6496:60:17::2;;;;;;;;-1:-1:-1::0;;1701:1:2::1;2628:7;:22:::0;5780:783:17:o;6847:605:14:-;6970:7;-1:-1:-1;;;;;7001:19:14;;6993:45;;;;-1:-1:-1;;;6993:45:14;;25446:2:22;6993:45:14;;;25428:21:22;25485:2;25465:18;;;25458:30;-1:-1:-1;;;25504:18:22;;;25497:43;25557:18;;6993:45:14;25244:337:22;6993:45:14;7048:19;7088:14;4559:13:19;;-1:-1:-1;;4559:31:19;;4328:279;7088:14:14;7070:32;;5443:1;7070:32;:::i;:::-;7048:54;-1:-1:-1;7112:17:14;5443:1;7143:285;7193:11;7183:7;:21;7143:285;;;7261:5;-1:-1:-1;;;;;7235:31:14;:22;7249:7;7235:13;:22::i;:::-;-1:-1:-1;;;;;7235:31:14;;7286:8;7231:78;7339:5;7326:9;:18;7322:71;;7371:7;-1:-1:-1;7364:14:14;;-1:-1:-1;;7364:14:14;7322:71;7406:11;;;:::i;:::-;;;7143:285;7206:9;;;;:::i;:::-;;;;7143:285;;;-1:-1:-1;7444:1:14;;6847:605;-1:-1:-1;;;;;6847:605:14:o;7205:137:21:-;1094:13:0;:11;:13::i;:::-;7293:4:21;7283:7:::1;:14;7293:4:::0;7283:7;:14:::1;:::i;:::-;;;;7312:23;7330:4;7312:23;;;;;;:::i;:::-;;;;;;;;7205:137:::0;:::o;6757:203:13:-;1094:13:0;:11;:13::i;:::-;1744:1:2::1;2325:7;;:19:::0;2317:63:::1;;;;-1:-1:-1::0;;;2317:63:2::1;;;;;;;:::i;:::-;1744:1;2455:7;:18:::0;;;6868:39:13::2;::::0;6837:21:::2;::::0;719:10:8;;6868:39:13;::::2;;;::::0;6837:21;;6868:39;;2455:7:2;6868:39:13;6837:21;719:10:8;6868:39:13;::::2;;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;6922:31:13::2;::::0;3051:25:22;;;719:10:8;;6922:31:13::2;::::0;3039:2:22;3024:18;6922:31:13::2;;;;;;;;-1:-1:-1::0;1701:1:2::1;2628:7;:22:::0;6757:203:13:o;7502:113::-;719:10:8;8162:16:13;8181:26;;;:12;:26;;;;;;1273:6:0;;8181:26:13;;;;;719:10:8;1273:6:0;;;-1:-1:-1;;;;;1273:6:0;-1:-1:-1;;;;;8238:23:13;;:48;;;-1:-1:-1;8265:21:13;;;4972:1;8265:21;8238:48;8217:109;;;;-1:-1:-1;;;8217:109:13;;;;;;;:::i;:::-;9541:14:::1;::::0;::::1;;9540:15;9532:43;;;::::0;-1:-1:-1;;;9532:43:13;;27647:2:22;9532:43:13::1;::::0;::::1;27629:21:22::0;27686:2;27666:18;;;27659:30;-1:-1:-1;;;27705:18:22;;;27698:45;27760:18;;9532:43:13::1;27445:339:22::0;9532:43:13::1;7565:10:::2;:8;:10::i;:::-;7590:18;::::0;::::2;::::0;;;::::2;8152:192:::0;7502:113::o;8659:191:21:-;8764:23;;8711:4;;8746:15;:41;:97;;;;-1:-1:-1;8821:22:21;;8803:15;:40;8746:97;8727:116;;8659:191;:::o;13302:179:19:-;13435:39;13452:4;13458:2;13462:7;13435:39;;;;;;;;;;;;:16;:39::i;8302:145:21:-;1094:13:0;:11;:13::i;:::-;8396:4:21;8384:9:::1;:16;8396:4:::0;8384:9;:16:::1;:::i;:::-;;;;8415:25;8435:4;8415:25;;;;;;:::i;9996:153:19:-:0;10065:7;10107:33;10132:7;10107:24;:33::i;4792:131:15:-;4855:4;;4878:24;4893:8;4878:14;:24::i;:::-;-1:-1:-1;;;;;4878:38:15;;;;4792:131;-1:-1:-1;;4792:131:15:o;7458:182:14:-;7527:7;7562:14;4559:13:19;;-1:-1:-1;;4559:31:19;;4328:279;7562:14:14;7554:5;:22;7546:47;;;;-1:-1:-1;;;7546:47:14;;28993:2:22;7546:47:14;;;28975:21:22;29032:2;29012:18;;;29005:30;-1:-1:-1;;;29051:18:22;;;29044:42;29103:18;;7546:47:14;28791:336:22;7546:47:14;7610:23;7628:5;5443:1;7610:23;:::i;7328:116:13:-;719:10:8;8162:16:13;8181:26;;;:12;:26;;;;;;1273:6:0;;8181:26:13;;;;;719:10:8;1273:6:0;;;-1:-1:-1;;;;;1273:6:0;-1:-1:-1;;;;;8238:23:13;;:48;;;-1:-1:-1;8265:21:13;;;4972:1;8265:21;8238:48;8217:109;;;;-1:-1:-1;;;8217:109:13;;;;;;;:::i;:::-;9541:14:::1;::::0;::::1;;9540:15;9532:43;;;::::0;-1:-1:-1;;;9532:43:13;;27647:2:22;9532:43:13::1;::::0;::::1;27629:21:22::0;27686:2;27666:18;;;27659:30;-1:-1:-1;;;27705:18:22;;;27698:45;27760:18;;9532:43:13::1;27445:339:22::0;9532:43:13::1;7398:8:::2;:6;:8::i;:::-;7421:16;::::0;::::2;::::0;;;::::2;8152:192:::0;7328:116::o;4956:127:18:-;1094:13:0;:11;:13::i;:::-;5027:7:18::1;:14;5037:4:::0;;5027:7;:14:::1;:::i;:::-;;5056:20;5071:4;;5056:20;;;;;;;:::i;:::-;;;;;;;;4956:127:::0;;:::o;7591:227:21:-;1094:13:0;:11;:13::i;:::-;7732:4:21;7713:16:::1;:23;7732:4:::0;7713:16;:23:::1;:::i;:::-;-1:-1:-1::0;;7746:10:21::1;:18:::0;;;7779:32:::1;::::0;::::1;::::0;::::1;::::0;7806:4;;7779:32:::1;:::i;4929:351:15:-:0;5040:16;5072:23;5112:9;-1:-1:-1;;;;;5098:31:15;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5098:31:15;;5072:57;;5144:9;5139:112;5159:20;;;5139:112;;;5212:28;5227:9;;5237:1;5227:12;;;;;;;:::i;:::-;;;;;;;5212:14;:28::i;:::-;5200:6;5207:1;5200:9;;;;;;;;:::i;:::-;-1:-1:-1;;;;;5200:40:15;;;:9;;;;;;;;;;;:40;5181:3;;;:::i;:::-;;;5139:112;;;-1:-1:-1;5267:6:15;4929:351;-1:-1:-1;;;4929:351:15:o;9849:142:19:-;9913:7;9955:27;9974:7;9955:18;:27::i;7790:112:13:-;1094:13:0;:11;:13::i;:::-;7843:14:13::1;:21:::0;;-1:-1:-1;;7843:21:13::1;7860:4;7843:21;::::0;;7879:16:::1;::::0;::::1;::::0;7843:14:::1;::::0;7879:16:::1;7790:112::o:0;12657:803:21:-;9322:9:13;719:10:8;9322:25:13;9314:64;;;;-1:-1:-1;;;9314:64:13;;;;;;;:::i;:::-;1744:1:2::1;2325:7;;:19:::0;2317:63:::1;;;;-1:-1:-1::0;;;2317:63:2::1;;;;;;;:::i;:::-;1744:1;2455:7;:18:::0;12824:24:21::2;:22;:24::i;:::-;12816:67;;;::::0;-1:-1:-1;;;12816:67:21;;33355:2:22;12816:67:21::2;::::0;::::2;33337:21:22::0;33394:2;33374:18;;;33367:30;33433:32;33413:18;;;33406:60;33483:18;;12816:67:21::2;33153:354:22::0;12816:67:21::2;12914:44;719:10:8::0;12947::21::2;;12914:18;:44::i;:::-;12893:138;;;::::0;-1:-1:-1;;;12893:138:21;;33714:2:22;12893:138:21::2;::::0;::::2;33696:21:22::0;33753:2;33733:18;;;33726:30;33792:34;33772:18;;;33765:62;-1:-1:-1;;;33843:18:22;;;33836:45;33898:19;;12893:138:21::2;33512:411:22::0;12893:138:21::2;13059:1;13049:7;-1:-1:-1::0;;;;;13049:11:21::2;;13041:48;;;;-1:-1:-1::0;;;13041:48:21::2;;;;;;;:::i;:::-;13117:1;13107:7;-1:-1:-1::0;;;;;13107:11:21::2;;13099:56;;;;-1:-1:-1::0;;;13099:56:21::2;;;;;;;:::i;:::-;719:10:8::0;13166:17:21::2;6465:25:19::0;;;:18;:25;;;;;;13186:31:21::2;::::0;13210:7;;1855:3:19;6465:39;13186:31:21::2;:::i;:::-;13262:30:::0;;13166:51;;-1:-1:-1;;;;;;13262:30:21;;::::2;13248:44:::0;;::::2;;;13227:113;;;;-1:-1:-1::0;;;13227:113:21::2;;;;;;;:::i;:::-;13350:52;719:10:8::0;13379:16:21::2;:22:::0;13370:7;;13350:5:::2;:52::i;:::-;13412:41;719:10:8::0;13420:12:21::2;-1:-1:-1::0;;;;;6774:25:19;6757:14;6774:25;;;:18;:25;;;;;;;-1:-1:-1;;;;;6933:31:19;1855:3;6969:23;;;6932:61;7003:34;;6694:350;13412:41:21::2;-1:-1:-1::0;;1701:1:2::1;2628:7;:22:::0;-1:-1:-1;;12657:803:21:o;5526:221:19:-;5590:7;-1:-1:-1;;;;;5613:19:19;;5609:60;;5641:28;;-1:-1:-1;;;5641:28:19;;;;;;;;;;;5609:60;-1:-1:-1;;;;;;5686:25:19;;;;;:18;:25;;;;;;-1:-1:-1;;;;;5686:54:19;;5526:221::o;1831:101:0:-;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;:::-;1831:101::o:0;18027:864:21:-;18154:16;9322:9:13;719:10:8;9322:25:13;9314:64;;;;-1:-1:-1;;;9314:64:13;;;;;;;:::i;:::-;1744:1:2::1;2325:7;;:19:::0;2317:63:::1;;;;-1:-1:-1::0;;;2317:63:2::1;;;;;;;:::i;:::-;1744:1;2455:7;:18:::0;18194:17:21::2;:15;:17::i;:::-;18186:52;;;::::0;-1:-1:-1;;;18186:52:21;;35083:2:22;18186:52:21::2;::::0;::::2;35065:21:22::0;35122:2;35102:18;;;35095:30;-1:-1:-1;;;35141:18:22;;;35134:52;35203:18;;18186:52:21::2;34881:346:22::0;18186:52:21::2;18253:9;18248:208;18268:20:::0;;::::2;18248:208;;;18309:15;18327:9;;18337:1;18327:12;;;;;;;:::i;:::-;;;;;;;18309:30;;18381:12;719:10:8::0;;640:96;18381:12:21::2;-1:-1:-1::0;;;;;18361:32:21::2;:16;18369:7;18361;:16::i;:::-;-1:-1:-1::0;;;;;18361:32:21::2;;18353:64;;;;-1:-1:-1::0;;;18353:64:21::2;;;;;;;:::i;:::-;18431:14;18437:7;18431:5;:14::i;:::-;-1:-1:-1::0;18290:3:21;::::2;::::0;::::2;:::i;:::-;;;;18248:208;;;-1:-1:-1::0;18508:21:21;;-1:-1:-1;;;;;18508:21:21::2;18465:26;18508:21:::0;18572:30:::2;719:10:8::0;18642:9:21::2;;18572:89;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;::::0;;::::2;-1:-1:-1::0;;18572:89:21::2;::::0;::::2;;::::0;::::2;::::0;;;::::2;::::0;::::2;:::i;:::-;18540:121;;18676:9;18671:185;18695:12;:19;18691:1;:23;18671:185;;;18739:29;18755:9;;18765:1;18755:12;;;;;;;:::i;:::-;;;;;;;16151:4:::0;16178:25;;;:15;:25;;;;;;;;;16047:163;18739:29:::2;18735:111;;;18827:4;18788:19;:36;18808:12;18821:1;18808:15;;;;;;;;:::i;:::-;;;;;;;18788:36;;;;;;;;;;;;:43;;;;;;;;;;;;;;;;;;18735:111;18716:3:::0;::::2;::::0;::::2;:::i;:::-;;;;18671:185;;;-1:-1:-1::0;1701:1:2::1;2628:7;:22:::0;18872:12:21;18027:864;-1:-1:-1;;;;18027:864:21:o;7824:242::-;1094:13:0;:11;:13::i;:::-;-1:-1:-1;;;;;7946:35:21;::::1;;::::0;;;:17:::1;:35;::::0;;;;;;;;:48;;-1:-1:-1;;7946:48:21::1;-1:-1:-1::0;;;;;7946:48:21;::::1;::::0;;::::1;::::0;;;8009:50;;36934:51:22;;;37001:18;;;36994:59;8009:50:21::1;::::0;36907:18:22;8009:50:21::1;36761:298:22::0;5846:369:16;719:10:8;8492:16:13;8511:26;;;:12;:26;;;;;;1273:6:0;;8511:26:13;;;;;719:10:8;1273:6:0;;;-1:-1:-1;;;;;1273:6:0;-1:-1:-1;;;;;8568:23:13;;:67;;;-1:-1:-1;8611:24:13;;;5014:1;8611:24;8568:67;:108;;;-1:-1:-1;8655:21:13;;;4972:1;8655:21;8568:108;8547:169;;;;-1:-1:-1;;;8547:169:13;;;;;;;:::i;:::-;5990:16:16::1;:36:::0;;6036:52;::::1;;5990:36;6036:52:::0;::::1;-1:-1:-1::0;;5990:36:16;::::1;;6036:52:::0;;;-1:-1:-1;;6036:52:16;;;;;;;::::1;::::0;;;6103:105:::1;::::0;;37226:41:22;;;37298:2;37283:18;;37276:50;;;;6103:105:16::1;::::0;37199:18:22;6103:105:16::1;;;;;;;8482:252:13::0;5846:369:16;;:::o;16570:476:21:-;-1:-1:-1;;;;;16771:57:21;;16721:47;16771:57;;;:20;:57;;;;;16693:16;;16879:9;-1:-1:-1;;;;;16865:31:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16865:31:21;;16838:58;;16911:9;16906:110;16926:20;;;16906:110;;;16980:11;:25;16992:9;;17002:1;16992:12;;;;;;;:::i;:::-;;;;;;;16980:25;;;;;;;;;;;;16967:7;16975:1;16967:10;;;;;;;;:::i;:::-;;;;;;;;;;:38;16948:3;;;;:::i;:::-;;;;16906:110;;;-1:-1:-1;17032:7:21;-1:-1:-1;;16570:476:21;;;;;;:::o;5126:169:17:-;5223:12;:22;5182:4;;5205:15;:40;:83;;;;-1:-1:-1;;5267:21:17;;5249:15;:39;;5126:169::o;10373:102:19:-;10429:13;10461:7;10454:14;;;;;:::i;12479:303::-;719:10:8;-1:-1:-1;;;;;12577:31:19;;;12573:61;;12617:17;;-1:-1:-1;;;12617:17:19;;;;;;;;;;;12573:61;719:10:8;12645:39:19;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;12645:49:19;;;;;;;;;;;;:60;;-1:-1:-1;;12645:60:19;;;;;;;;;;12720:55;;540:41:22;;;12645:49:19;;719:10:8;12720:55:19;;513:18:22;12720:55:19;;;;;;;12479:303;;:::o;6125:93:14:-;6171:7;6197:14;4559:13:19;;-1:-1:-1;;4559:31:19;;4328:279;5498:647:18;5618:15;5649:20;5685:9;-1:-1:-1;;;;;5672:30:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5649:53;;5717:9;5712:406;5732:20;;;5712:406;;;5773:15;5791:9;;5801:1;5791:12;;;;;;;:::i;:::-;5821:20;;-1:-1:-1;;;5821:20:18;;5791:12;;;;;;;;;5821:20;;;3051:25:22;;;5791:12:18;-1:-1:-1;5821:4:18;;:11;;-1:-1:-1;3024:18:22;;5821:20:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5817:94;;5860:10;;;;;;;;;;;;:4;5865:1;5860:7;;;;;;;;:::i;:::-;;;;;;:10;;;;5888:8;;;5817:94;5924:21;5948:17;5957:7;5948:8;:17::i;:::-;5924:41;;6013:1;5995:7;5989:21;:25;:118;;;;;;;;;;;;;;;;;6057:7;6066:18;:7;:16;:18::i;:::-;6040:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5989:118;5979:4;5984:1;5979:7;;;;;;;;:::i;:::-;;;;;;:128;;;;5759:359;;5712:406;5754:3;;;:::i;:::-;;;5712:406;;9372:230:21;9473:9;:19;9420:4;;9455:15;:37;:89;;;;-1:-1:-1;9526:18:21;;9508:15;:36;9455:89;:140;;;;-1:-1:-1;;9560:21:21;;-1:-1:-1;;;;;9560:21:21;:35;;;9372:230::o;7348:237::-;1094:13:0;:11;:13::i;:::-;-1:-1:-1;;;;;7483:29:21;::::1;;::::0;;;:14:::1;:29;::::0;;;;7515:4;;7483:36:::1;7515:4:::0;7483:29;:36:::1;:::i;:::-;;;;7534:44;7558:13;7573:4;7534:44;;;;;;;:::i;13466:682::-:0;1744:1:2;2325:7;;:19;2317:63;;;;-1:-1:-1;;;2317:63:2;;;;;;;:::i;:::-;1744:1;2455:7;:18;13597:24:21::1;:22;:24::i;:::-;13589:67;;;::::0;-1:-1:-1;;;13589:67:21;;33355:2:22;13589:67:21::1;::::0;::::1;33337:21:22::0;33394:2;33374:18;;;33367:30;33433:32;33413:18;;;33406:60;33483:18;;13589:67:21::1;33153:354:22::0;13589:67:21::1;13684:1;13674:7;-1:-1:-1::0;;;;;13674:11:21::1;;13666:48;;;;-1:-1:-1::0;;;13666:48:21::1;;;;;;;:::i;:::-;13742:1;13732:7;-1:-1:-1::0;;;;;13732:11:21::1;;13724:56;;;;-1:-1:-1::0;;;13724:56:21::1;;;;;;;:::i;:::-;719:10:8::0;13791:16:21::1;13810:31:::0;;;:17:::1;:31;::::0;;;;;-1:-1:-1;;;;;13810:31:21::1;::::0;13895:7;;13871:21:::1;::::0;13879:12:::1;640:96:8::0;13871:21:21::1;:31;;;;:::i;:::-;13851:51;;13934:9;-1:-1:-1::0;;;;;13920:23:21::1;:10;-1:-1:-1::0;;;;;13920:23:21::1;;;13912:58;;;;-1:-1:-1::0;;;13912:58:21::1;;;;;;;:::i;:::-;13981:48;13987:8;13997:7;14006:16;:22;;;13981:5;:48::i;:::-;14039:41;719:10:8::0;14047:12:21::1;640:96:8::0;14039:41:21::1;14096:45;::::0;;719:10:8;38935:34:22;;-1:-1:-1;;;;;39005:15:22;;39000:2;38985:18;;38978:43;-1:-1:-1;;;;;39057:31:22;;39037:18;;;39030:59;14096:45:21;;::::1;::::0;;;;38885:2:22;14096:45:21;;::::1;-1:-1:-1::0;;1701:1:2;2628:7;:22;-1:-1:-1;;13466:682:21:o;5693:328:14:-;1094:13:0;:11;:13::i;:::-;1744:1:2::1;2325:7;;:19:::0;2317:63:::1;;;;-1:-1:-1::0;;;2317:63:2::1;;;;;;;:::i;:::-;1744:1;2455:7;:18:::0;;;5807:208:14::2;5827:20:::0;;::::2;5807:208;;;5868:15;5886:9;;5896:1;5886:12;;;;;;;:::i;:::-;;;;;;;5868:30;;5940:12;719:10:8::0;;640:96;5940:12:14::2;-1:-1:-1::0;;;;;5920:32:14::2;:16;5928:7;5920;:16::i;:::-;-1:-1:-1::0;;;;;5920:32:14::2;;5912:64;;;;-1:-1:-1::0;;;5912:64:14::2;;;;;;;:::i;:::-;5990:14;5996:7;5990:5;:14::i;:::-;-1:-1:-1::0;5849:3:14;::::2;::::0;::::2;:::i;:::-;;;;5807:208;;13547:385:19::0;13708:28;13718:4;13724:2;13728:7;13708:9;:28::i;:::-;-1:-1:-1;;;;;13750:14:19;;;:19;13746:180;;13788:56;13819:4;13825:2;13829:7;13838:5;13788:30;:56::i;:::-;13783:143;;13871:40;;-1:-1:-1;;;13871:40:19;;;;;;;;;;;13783:143;13547:385;;;;:::o;17441:580:21:-;17551:7;9322:9:13;719:10:8;9322:25:13;9314:64;;;;-1:-1:-1;;;9314:64:13;;;;;;;:::i;:::-;1744:1:2::1;2325:7;;:19:::0;2317:63:::1;;;;-1:-1:-1::0;;;2317:63:2::1;;;;;;;:::i;:::-;1744:1;2455:7;:18:::0;17582:17:21::2;:15;:17::i;:::-;17574:52;;;::::0;-1:-1:-1;;;17574:52:21;;35083:2:22;17574:52:21::2;::::0;::::2;35065:21:22::0;35122:2;35102:18;;;35095:30;-1:-1:-1;;;35141:18:22;;;35134:52;35203:18;;17574:52:21::2;34881:346:22::0;17574:52:21::2;719:10:8::0;17644:17:21::2;17652:8:::0;17644:7:::2;:17::i;:::-;-1:-1:-1::0;;;;;17644:33:21::2;;17636:65;;;;-1:-1:-1::0;;;17636:65:21::2;;;;;;;:::i;:::-;17711:15;17717:8;17711:5;:15::i;:::-;17779:21:::0;;-1:-1:-1;;;;;17779:21:21::2;17736:26;17779:21:::0;17833:25:::2;719:10:8::0;17833:49:21::2;::::0;-1:-1:-1;;;;;;17833:49:21::2;::::0;;;;;;-1:-1:-1;;;;;39292:32:22;;;17833:49:21::2;::::0;::::2;39274:51:22::0;39341:18;;;39334:34;;;39247:18;;17833:49:21::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16151:4:::0;16178:25;;;:15;:25;;;;;;17811:71;;-1:-1:-1;16178:25:21;;17892:95:::2;;;17937:32;::::0;;;:19:::2;:32;::::0;;;;:39;;-1:-1:-1;;17937:39:21::2;17972:4;17937:39;::::0;;17892:95:::2;1701:1:2::1;2628:7;:22:::0;18003:11:21;17441:580;-1:-1:-1;;;17441:580:21:o;5750:424:13:-;719:10:8;8162:16:13;8181:26;;;:12;:26;;;;;;1273:6:0;;5846:16:13;;;;8181:26;;;1273:6:0;;;-1:-1:-1;;;;;1273:6:0;8238:23:13;;:48;;-1:-1:-1;8265:21:13;;;4972:1;8265:21;8238:48;8217:109;;;;-1:-1:-1;;;8217:109:13;;;;;;;:::i;:::-;5935:11:::1;:18:::0;5894:26:::1;::::0;-1:-1:-1;;;;;5923:31:13;::::1;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;5923:31:13::1;;5894:60;;5993:9;5988:127;6012:11;:18:::0;6008:22;::::1;5988:127;;;6072:12;:28;6085:11;6097:1;6085:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;6085:14:13::1;6072:28:::0;;;::::1;::::0;;;;;;;;;6055:14;;6072:28:::1;::::0;;::::1;::::0;6055:11;;6067:1;;6055:14;::::1;;;;;:::i;:::-;:45;::::0;;::::1;:14;::::0;;::::1;::::0;;;;;;;:45;6032:3:::1;;5988:127;;;;6142:11;6155;6134:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;-1:-1:-1;;;;;6134:33:13::1;::::0;;;;;::::1;::::0;::::1;;::::0;;::::1;;;;;;;;;;;;;;;;8152:192:::0;5750:424;;:::o;19535:233:21:-;19683:13;19719:42;19752:8;19719:32;:42::i;6526:121:13:-;719:10:8;8492:16:13;8511:26;;;:12;:26;;;;;;1273:6:0;;8511:26:13;;;;;719:10:8;1273:6:0;;;-1:-1:-1;;;;;1273:6:0;-1:-1:-1;;;;;8568:23:13;;:67;;;-1:-1:-1;8611:24:13;;;5014:1;8611:24;8568:67;:108;;;-1:-1:-1;8655:21:13;;;4972:1;8655:21;8568:108;8547:169;;;;-1:-1:-1;;;8547:169:13;;;;;;;:::i;:::-;1744:1:2::1;2325:7;;:19:::0;2317:63:::1;;;;-1:-1:-1::0;;;2317:63:2::1;;;;;;;:::i;:::-;1744:1;2455:7;:18:::0;6608:32:13::2;::::0;6630:9:::2;3051:25:22::0;;719:10:8;;6608:32:13::2;::::0;3039:2:22;3024:18;6608:32:13::2;2905:177:22::0;8885:379:21;9007:4;9031:10;;:16;;9027:59;;-1:-1:-1;9070:5:21;9063:12;;9027:59;9114:143;9150:10;;9114:143;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9178:10:21;;9216:26;;-1:-1:-1;;39717:2:22;39713:15;;;39709:53;9216:26:21;;;39697:66:22;9178:10:21;;-1:-1:-1;39779:12:22;;;-1:-1:-1;9216:26:21;;;;;;;;;;;;9206:37;;;;;;9114:18;:143::i;:::-;9095:162;8885:379;-1:-1:-1;;;;8885:379:21:o;8765:1881:16:-;1744:1:2;2325:7;;:19;2317:63;;;;-1:-1:-1;;;2317:63:2;;;;;;;:::i;:::-;1744:1;2455:7;:18;8917:90:16;::::1;;;8953:16;::::0;::::1;;8945:51;;;::::0;-1:-1:-1;;;8945:51:16;;40004:2:22;8945:51:16::1;::::0;::::1;39986:21:22::0;40043:2;40023:18;;;40016:30;-1:-1:-1;;;40062:18:22;;;40055:52;40124:18;;8945:51:16::1;39802:346:22::0;8945:51:16::1;9045:9;9040:1590;9060:20:::0;;::::1;9040:1590;;;9105:15;9123:9;;9133:1;9123:12;;;;;;;:::i;:::-;;;;;;;9105:30;;9207:12;719:10:8::0;;640:96;9207:12:16::1;9182:21;::::0;-1:-1:-1;;;9182:21:16;;::::1;::::0;::::1;3051:25:22::0;;;-1:-1:-1;;;;;9182:37:16;;;::::1;::::0;:4:::1;::::0;:12:::1;::::0;3024:18:22;;9182:21:16::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;9182:37:16::1;;9153:127;;;;-1:-1:-1::0;;;9153:127:16::1;;;;;;;:::i;:::-;9299:28;9330:25:::0;;;:16:::1;:25;::::0;;;;9400:23;;9441:1175;::::1;;;9481:16;9501:1;9481:21:::0;9477:661:::1;;9556:15;9530:41:::0;;9597:18:::1;::::0;::::1;:33:::0;;-1:-1:-1;;9597:33:16::1;;::::0;::::1;::::0;;::::1;::::0;;;719:10:8;-1:-1:-1;;;;;9661:205:16::1;9711:7;9661:205;9832:8;9661:205;;;;565:14:22::0;558:22;540:41;;528:2;513:18;;400:187;9661:205:16::1;;;;;;;;9441:1175;;9477:661;9958:18;::::0;::::1;::::0;:34:::1;::::0;;::::1;:18:::0;::::1;:34;9921:194;;;::::0;-1:-1:-1;;;9921:194:16;;40355:2:22;9921:194:16::1;::::0;::::1;40337:21:22::0;40394:2;40374:18;;;40367:30;40433:34;40413:18;;;40406:62;40504:34;40484:18;;;40477:62;-1:-1:-1;;;40555:19:22;;;40548:32;40597:19;;9921:194:16::1;40153:469:22::0;9921:194:16::1;9441:1175;;;10188:20:::0;;10184:414:::1;;10236:12;::::0;::::1;:50:::0;;10252:15:::1;:34:::0;;::::1;10236:50;::::0;;-1:-1:-1;10312:27:16;;10370:205:::1;::::0;::::1;719:10:8::0;-1:-1:-1;;;;;10370:205:16::1;10420:7;10370:205;10541:8;10370:205;;;;565:14:22::0;558:22;540:41;;528:2;513:18;;400:187;10370:205:16::1;;;;;;;;10184:414;-1:-1:-1::0;;;9082:3:16::1;;9040:1590;;;-1:-1:-1::0;;1701:1:2;2628:7;:22;-1:-1:-1;;;8765:1881:16:o;7549:862::-;7657:29;7702:40;7772:9;-1:-1:-1;;;;;7745:44:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7745:44:16;;-1:-1:-1;;7745:44:16;;;;;;;;;;;;7702:87;;7804:9;7799:579;7819:20;;;7799:579;;;7860:15;7878:9;;7888:1;7878:12;;;;;;;:::i;:::-;7908:20;;-1:-1:-1;;;7908:20:16;;7878:12;;;;;;;;;7908:20;;;3051:25:22;;;7878:12:16;-1:-1:-1;7908:4:16;;:11;;-1:-1:-1;3024:18:22;;7908:20:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7904:66;;7947:8;;;7904:66;7983:27;8013:25;;;:16;:25;;;;;;;;;7983:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8056:28;8052:244;;8130:4;8104:10;8115:1;8104:13;;;;;;;;:::i;:::-;;;;;;;:23;;:30;;;;;;;;;;;8180:6;:18;;;8152:10;8163:1;8152:13;;;;;;;;:::i;:::-;;;;;;;;;;;:46;;;;:25;;;;:46;8258:23;;8240:41;;:15;:41;:::i;:::-;8216:10;8227:1;8216:13;;;;;;;;:::i;:::-;;;;;;;:21;;:65;;;;;8052:244;8346:10;8357:1;8346:13;;;;;;;;:::i;:::-;;;;;;;:21;;;8331:6;:12;;;:36;;;;:::i;:::-;8309:10;8320:1;8309:13;;;;;;;;:::i;:::-;;;;;;;;;;;:58;-1:-1:-1;;7799:579:16;7841:3;;;:::i;:::-;;;7799:579;;6027:93:14;6073:7;6099:14;4757:12:19;;;4684:92;5418:326:13;1094:13:0;:11;:13::i;:::-;5531:28:13::1;::::0;::::1;5527:155;;-1:-1:-1::0;;;;;5582:22:13;::::1;;::::0;;;:12:::1;:22;::::0;;;;5575:29;;-1:-1:-1;;5575:29:13::1;::::0;;5527:155:::1;;;-1:-1:-1::0;;;;;5635:22:13;::::1;;::::0;;;:12:::1;:22;::::0;;;;:36;;-1:-1:-1;;5635:36:13::1;;::::0;::::1;;::::0;;5527:155:::1;5697:40;::::0;3259:4:22;3247:17;;3229:36;;-1:-1:-1;;;;;5697:40:13;::::1;::::0;::::1;::::0;3217:2:22;3202:18;5697:40:13::1;;;;;;;5418:326:::0;;:::o;8072:155:21:-;1094:13:0;:11;:13::i;:::-;8172:4:21;8156:13:::1;:20;8172:4:::0;8156:13;:20:::1;:::i;:::-;;;;8191:29;8215:4;8191:29;;;;;;:::i;10973:1634::-:0;9322:9:13;719:10:8;9322:25:13;9314:64;;;;-1:-1:-1;;;9314:64:13;;;;;;;:::i;:::-;1744:1:2::1;2325:7;;:19:::0;2317:63:::1;;;;-1:-1:-1::0;;;2317:63:2::1;;;;;;;:::i;:::-;1744:1;2455:7;:18:::0;11179:35:21;;::::2;11158:154;;;::::0;-1:-1:-1;;;11158:154:21;;40959:2:22;11158:154:21::2;::::0;::::2;40941:21:22::0;40998:2;40978:18;;;40971:30;41037:34;41017:18;;;41010:62;41108:34;41088:18;;;41081:62;-1:-1:-1;;;41159:19:22;;;41152:39;41208:19;;11158:154:21::2;40757:476:22::0;11158:154:21::2;11322:33;11358:60;11395:13;11358:23;:60::i;:::-;11468:21:::0;;11322:96;;-1:-1:-1;11449:40:21;::::2;11428:111;;;;-1:-1:-1::0;;;11428:111:21::2;;;;;;;:::i;:::-;11550:18;11611:9:::0;11606:922:::2;11626:20:::0;;::::2;11606:922;;;11671:13;11687:8;;11696:1;11687:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;11671:27;;11733:1;11724:6;-1:-1:-1::0;;;;;11724:10:21::2;;11716:56;;;::::0;-1:-1:-1;;;11716:56:21;;41793:2:22;11716:56:21::2;::::0;::::2;41775:21:22::0;41832:2;41812:18;;;41805:30;41871:34;41851:18;;;41844:62;-1:-1:-1;;;41922:18:22;;;41915:31;41963:19;;11716:56:21::2;41591:397:22::0;11716:56:21::2;11807:1;11798:6;-1:-1:-1::0;;;;;11798:10:21::2;;11790:47;;;;-1:-1:-1::0;;;11790:47:21::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;11877:35:21;::::2;11856:18;11877:35:::0;;;:20:::2;:35;::::0;;;;-1:-1:-1;;;;;11877:96:21;::::2;::::0;11856:18;11934:9;;11944:1;11934:12;;::::2;;;;;:::i;:::-;;;;;;;11877:87;;;;;;;;;;;;:96;11856:117;;12034:9;:24;;;-1:-1:-1::0;;;;;12020:38:21::2;:10;:38;;11991:133;;;;-1:-1:-1::0;;;11991:133:21::2;;;;;;;:::i;:::-;12216:13:::0;719:10:8;-1:-1:-1;;;;;12277:23:21;::::2;;12301:9:::0;;12311:1;12301:12;;::::2;;;;;:::i;:::-;;;;;;;12277:37;;;;;;;;;;;;;3051:25:22::0;;3039:2;3024:18;;2905:177;12277:37:21::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;12277:53:21::2;;12248:145;;;::::0;-1:-1:-1;;;12248:145:21;;42195:2:22;12248:145:21::2;::::0;::::2;42177:21:22::0;42234:2;42214:18;;;42207:30;-1:-1:-1;;;42253:18:22;;;42246:51;42314:18;;12248:145:21::2;41993:345:22::0;12248:145:21::2;-1:-1:-1::0;;;;;12411:35:21;::::2;;::::0;;;:20:::2;:35;::::0;;;;12463:10;;12447:9;;12457:1;12447:12;;::::2;;;;;:::i;:::-;;::::0;;::::2;::::0;;;::::2;;12411:49:::0;;-1:-1:-1;12411:49:21;::::2;::::0;;;;;;-1:-1:-1;12411:49:21;:62;-1:-1:-1;;12492:21:21;;;::::2;::::0;11648:3:::2;;11606:922;;;-1:-1:-1::0;12541:49:21::2;719:10:8::0;12574:15:21;;12561:11;;12541:5:::2;:49::i;:::-;-1:-1:-1::0;;1701:1:2::1;2628:7;:22:::0;-1:-1:-1;;;;;10973:1634:21:o;14232:601::-;9322:9:13;719:10:8;9322:25:13;9314:64;;;;-1:-1:-1;;;9314:64:13;;;;;;;:::i;:::-;1744:1:2::1;2325:7;;:19:::0;2317:63:::1;;;;-1:-1:-1::0;;;2317:63:2::1;;;;;;;:::i;:::-;1744:1;2455:7;:18:::0;14365:21:21::2;:19;:21::i;:::-;14357:61;;;::::0;-1:-1:-1;;;14357:61:21;;42545:2:22;14357:61:21::2;::::0;::::2;42527:21:22::0;42584:2;42564:18;;;42557:30;42623:29;42603:18;;;42596:57;42670:18;;14357:61:21::2;42343:351:22::0;14357:61:21::2;14446:1;14436:7;-1:-1:-1::0;;;;;14436:11:21::2;;14428:48;;;;-1:-1:-1::0;;;14428:48:21::2;;;;;;;:::i;:::-;14504:1;14494:7;-1:-1:-1::0;;;;;14494:11:21::2;;14486:56;;;;-1:-1:-1::0;;;14486:56:21::2;;;;;;;:::i;:::-;14553:17;14597:7:::0;14573:21:::2;719:10:8::0;14581:12:21::2;640:96:8::0;14573:21:21::2;:31;;;;:::i;:::-;14649:27:::0;;14553:51;;-1:-1:-1;;;;;;14649:27:21;;::::2;14635:41:::0;;::::2;;;14614:110;;;;-1:-1:-1::0;;;14614:110:21::2;;;;;;;:::i;:::-;14734:49;719:10:8::0;14763:13:21::2;:19:::0;14754:7;;14734:5:::2;:49::i;:::-;14793:33;719:10:8::0;14801:12:21::2;640:96:8::0;14793:33:21::2;-1:-1:-1::0;;1701:1:2::1;2628:7;:22:::0;14232:601:21:o;8453:200::-;8561:26;;8508:4;;8543:15;:44;:103;;;;-1:-1:-1;;8621:25:21;;8603:15;:43;;8453:200::o;5472:156:17:-;1094:13:0;:11;:13::i;:::-;42859:19:22;;5554:12:17::1;42846:33:22::0;;;42933:2;42922:14;;;42909:28;42895:12;42888:50;;;42992:2;42981:14;;;42968:28;42954:12;42947:50;;;5588:33:17;;43211:32:22;;;43259:20;;;43252:54;;;;43322:20;;43315:54;5588:33:17::1;::::0;43199:2:22;43184:18;5588:33:17::1;43008:367:22::0;2081:198:0;1094:13;:11;:13::i;:::-;-1:-1:-1;;;;;2169:22:0;::::1;2161:73;;;::::0;-1:-1:-1;;;2161:73:0;;43582:2:22;2161:73:0::1;::::0;::::1;43564:21:22::0;43621:2;43601:18;;;43594:30;43660:34;43640:18;;;43633:62;-1:-1:-1;;;43711:18:22;;;43704:36;43757:19;;2161:73:0::1;43380:402:22::0;2161:73:0::1;2244:28;2263:8;2244:18;:28::i;:::-;2081:198:::0;:::o;11004:886:16:-;1744:1:2;2325:7;;:19;2317:63;;;;-1:-1:-1;;;2317:63:2;;;;;;;:::i;:::-;1744:1;2455:7;:18;;;719:10:8;8511:26:13;;;::::1;::::0;;;;;;;;1273:6:0;;8511:26:13::1;::::0;;::::1;::::0;719:10:8;1273:6:0;;;-1:-1:-1;;;;;1273:6:0;-1:-1:-1;;;;;8568:23:13::1;;:67;;;-1:-1:-1::0;8611:24:13::1;::::0;::::1;5014:1;8611:24;8568:67;:108;;;-1:-1:-1::0;8655:21:13::1;::::0;::::1;4972:1;8655:21;8568:108;8547:169;;;;-1:-1:-1::0;;;8547:169:13::1;;;;;;;:::i;:::-;11172:9:16::2;11167:707;11187:20:::0;;::::2;11167:707;;;11232:15;11250:9;;11260:1;11250:12;;;;;;;:::i;:::-;;;;;;;11232:30;;11280:13;11296:4;-1:-1:-1::0;;;;;11296:12:16::2;;11309:7;11296:21;;;;;;;;;;;;;3051:25:22::0;;3039:2;3024:18;;2905:177;11296:21:16::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11335:28;11366:25:::0;;;:16:::2;:25;::::0;;;;11413:23;;11280:37;;-1:-1:-1;11366:25:16;11413:28;;11409:83:::2;;11465:8;;;;;11409:83;11543:23:::0;;11509:12:::2;::::0;::::2;:57:::0;;11525:15:::2;:41:::0;;;::::2;11509:57:::0;;::::2;::::0;;-1:-1:-1;11584:27:16;;;11732:18:::2;::::0;::::2;::::0;11634:161:::2;::::0;540:41:22;;;11732:18:16::2;;::::0;-1:-1:-1;;;;;11634:161:16;::::2;::::0;11676:7;;11634:161:::2;::::0;528:2:22;513:18;11634:161:16::2;;;;;;;11818:41;::::0;719:10:8;;11837:7:16;;11818:41:::2;::::0;;;::::2;11214:660;;;11167:707;11209:3;;11167:707;;4843:624:19::0;4945:4;-1:-1:-1;;;;;;;;;5240:25:19;;;;:101;;-1:-1:-1;;;;;;;;;;5316:25:19;;;5240:101;:177;;;-1:-1:-1;;;;;;;;5392:25:19;-1:-1:-1;;;5392:25:19;;4843:624::o;14178:268::-;14235:4;14289:7;5443:1:14;14270:26:19;;:65;;;;;14322:13;;14312:7;:23;14270:65;:150;;;;-1:-1:-1;;14372:26:19;;;;:17;:26;;;;;;-1:-1:-1;;;14372:43:19;:48;;14178:268::o;8278:253::-;8345:7;8364:14;8381:33;8406:7;8381:24;:33::i;:::-;8364:50;;8427:6;8437:1;8427:11;8424:78;;8460:31;;-1:-1:-1;;;8460:31:19;;;;;;;;;;;1359:130:0;1273:6;;-1:-1:-1;;;;;1273:6:0;;;;;719:10:8;1422:23:0;1414:68;;;;-1:-1:-1;;;1414:68:0;;43989:2:22;1414:68:0;;;43971:21:22;;;44008:18;;;44001:30;44067:34;44047:18;;;44040:62;44119:18;;1414:68:0;43787:356:22;17418:1618:19;17505:13;;-1:-1:-1;;;;;17532:16:19;;17528:48;;17557:19;;-1:-1:-1;;;17557:19:19;;;;;;;;;;;17528:48;17590:8;17602:1;17590:13;17586:44;;17612:18;;-1:-1:-1;;;17612:18:19;;;;;;;;;;;17586:44;17641:61;17671:1;17675:2;17679:12;17693:8;17641:21;:61::i;:::-;-1:-1:-1;;;;;18166:22:19;;;;;;:18;:22;;;;1627:2;18166:22;;;:70;;18204:31;18192:44;;18166:70;;;18472:31;;;:17;:31;;;;;18563:15;2132:3;18563:41;18522:83;;-1:-1:-1;18640:13:19;;2389:3;18625:56;18522:160;18472:210;;:31;18760:23;;;18798:109;18824:40;;18849:14;;;;;-1:-1:-1;;;;;18824:40:19;;;18841:1;;-1:-1:-1;;;;;;;;;;;18824:40:19;18841:1;;18824:40;18902:3;18887:12;:18;18798:109;;-1:-1:-1;18921:13:19;:28;13072:164;;;:::o;19278:2460::-;19388:27;19418;19437:7;19418:18;:27::i;:::-;19388:57;;19501:4;-1:-1:-1;;;;;19460:45:19;19476:19;-1:-1:-1;;;;;19460:45:19;;19456:86;;19514:28;;-1:-1:-1;;;19514:28:19;;;;;;;;;;;19456:86;19553:22;719:10:8;-1:-1:-1;;;;;19579:27:19;;;;:86;;-1:-1:-1;19622:43:19;19639:4;719:10:8;12848:162:19;:::i;19622:43::-;19579:145;;;-1:-1:-1;719:10:8;19681:20:19;19693:7;19681:11;:20::i;:::-;-1:-1:-1;;;;;19681:43:19;;19579:145;19553:172;;19741:17;19736:66;;19767:35;;-1:-1:-1;;;19767:35:19;;;;;;;;;;;19736:66;-1:-1:-1;;;;;19816:16:19;;19812:52;;19841:23;;-1:-1:-1;;;19841:23:19;;;;;;;;;;;19812:52;19875:43;19897:4;19903:2;19907:7;19916:1;19875:21;:43::i;:::-;19988:24;;;;:15;:24;;;;;;;;19981:31;;-1:-1:-1;;;;;;19981:31:19;;;-1:-1:-1;;;;;20373:24:19;;;;;:18;:24;;;;;20371:26;;-1:-1:-1;;20371:26:19;;;20441:22;;;;;;;20439:24;;-1:-1:-1;20439:24:19;;;20727:26;;;:17;:26;;;;;-1:-1:-1;;;20813:15:19;2132:3;20813:41;20772:83;;:126;;20727:171;;;21015:46;;:51;;21011:616;;21118:1;21108:11;;21086:19;21239:30;;;:17;:30;;;;;;:35;;21235:378;;21375:13;;21360:11;:28;21356:239;;21520:30;;;;:17;:30;;;;;:52;;;21356:239;21068:559;21011:616;21671:7;21667:2;-1:-1:-1;;;;;21652:27:19;21661:4;-1:-1:-1;;;;;21652:27:19;-1:-1:-1;;;;;;;;;;;21652:27:19;;;;;;;;;21689:42;19378:2360;;19278:2460;;;:::o;19023:380:21:-;19170:28;;19143:7;;19170:28;;19166:186;;;19240:25;;;;:15;:25;;;;;;;;19239:26;19214:127;;;;-1:-1:-1;;;19214:127:21;;44350:2:22;19214:127:21;;;44332:21:22;44389:2;44369:18;;;44362:30;44428:34;44408:18;;;44401:62;-1:-1:-1;;;44479:18:22;;;44472:40;44529:19;;19214:127:21;44148:406:22;19214:127:21;5735:18:17;;19368:28:21;5634:126:17;2433:117:1;1486:16;:14;:16::i;:::-;2491:7:::1;:15:::0;;-1:-1:-1;;2491:15:1::1;::::0;;2521:22:::1;719:10:8::0;2530:12:1::1;2521:22;::::0;-1:-1:-1;;;;;2289:32:22;;;2271:51;;2259:2;2244:18;2521:22:1::1;;;;;;;2433:117::o:0;7121:1081:19:-;7194:7;7228;;5443:1:14;7274:23:19;7270:898;;7326:13;;7319:4;:20;7315:853;;;7363:14;7380:23;;;:17;:23;;;;;;;-1:-1:-1;;;7467:23:19;;:28;;7463:687;;7978:111;7985:6;7995:1;7985:11;7978:111;;-1:-1:-1;;;8055:6:19;8037:25;;;;:17;:25;;;;;;7978:111;;7463:687;7341:827;7315:853;-1:-1:-1;8194:1:19;;7121:1081;-1:-1:-1;;7121:1081:19:o;7772:137:14:-;7854:7;7879:23;7893:8;7879:13;:23::i;2186:115:1:-;1239:19;:17;:19::i;:::-;2255:4:::1;2245:14:::0;;-1:-1:-1;;2245:14:1::1;::::0;::::1;::::0;;2274:20:::1;719:10:8::0;2281:12:1::1;640:96:8::0;14899:648:21;15091:21;;15077:10;;-1:-1:-1;;;;;15077:10:21;;;;15042:32;;:14;4559:13:19;;-1:-1:-1;;4559:31:19;;4328:279;15042:14:21;:32;;;;:::i;:::-;:45;;;;:::i;:::-;:70;;15021:141;;;;-1:-1:-1;;;15021:141:21;;;;;;;:::i;:::-;15172:14;15189:24;-1:-1:-1;;;;;15189:24:21;;:6;:24;:::i;:::-;15172:41;;15241:9;15231:6;:19;;15223:63;;;;-1:-1:-1;;;15223:63:21;;44934:2:22;15223:63:21;;;44916:21:22;44973:2;44953:18;;;44946:30;45012:33;44992:18;;;44985:61;45063:18;;15223:63:21;44732:355:22;15223:63:21;15296:36;15306:8;15316:15;-1:-1:-1;;;;;15296:36:21;:9;:36::i;:::-;15342:27;15362:6;15342:19;:27::i;:::-;15383:6;15393:1;15383:11;15379:162;;15415:9;15410:121;15434:15;-1:-1:-1;;;;;15430:19:21;:1;:19;15410:121;;;15512:4;15474:15;:35;15507:1;15490:14;4559:13:19;;-1:-1:-1;;4559:31:19;;4328:279;15490:14:21;:18;;;;:::i;:::-;15474:35;;;;;;;;;;;-1:-1:-1;15474:35:21;:42;;-1:-1:-1;;15474:42:21;;;;;;;;;;15451:3;;;:::i;:::-;;;15410:121;;2433:187:0;2525:6;;;-1:-1:-1;;;;;2541:17:0;;;2525:6;2541:17;;;-1:-1:-1;;;;;;2541:17:0;;;;;;2573:40;;2525:6;;;;;;;;2573:40;;2506:16;;2573:40;2496:124;2433:187;:::o;21811:87:19:-;21870:21;21876:7;21885:5;21870;:21::i;4818:132:18:-;4904:13;4936:7;4929:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4818:132;;;:::o;392:703:9:-;448:13;665:5;674:1;665:10;661:51;;-1:-1:-1;;691:10:9;;;;;;;;;;;;-1:-1:-1;;;691:10:9;;;;;392:703::o;661:51::-;736:5;721:12;775:75;782:9;;775:75;;807:8;;;;:::i;:::-;;-1:-1:-1;829:10:9;;-1:-1:-1;837:2:9;829:10;;:::i;:::-;;;775:75;;;859:19;891:6;-1:-1:-1;;;;;881:17:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;881:17:9;;859:39;;908:150;915:10;;908:150;;941:11;951:1;941:11;;:::i;:::-;;-1:-1:-1;1009:10:9;1017:2;1009:5;:10;:::i;:::-;996:24;;:2;:24;:::i;:::-;983:39;;966:6;973;966:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;966:56:9;;;;;;;;-1:-1:-1;1036:11:9;1045:2;1036:11;;:::i;:::-;;;908:150;;25343:697:19;25521:88;;-1:-1:-1;;;25521:88:19;;25501:4;;-1:-1:-1;;;;;25521:45:19;;;;;:88;;719:10:8;;25588:4:19;;25594:7;;25603:5;;25521:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25521:88:19;;;;;;;;-1:-1:-1;;25521:88:19;;;;;;;;;;;;:::i;:::-;;;25517:517;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25799:6;:13;25816:1;25799:18;25795:229;;25844:40;;-1:-1:-1;;;25844:40:19;;;;;;;;;;;25795:229;25984:6;25978:13;25969:6;25965:2;25961:15;25954:38;25517:517;-1:-1:-1;;;;;;25677:64:19;-1:-1:-1;;;25677:64:19;;-1:-1:-1;25343:697:19;;;;;;:::o;5089:403:18:-;5240:21;;-1:-1:-1;;;5240:21:18;;;;;3051:25:22;;;5203:13:18;;5240:4;;:11;;3024:18:22;;5240:21:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5232:52;;;;-1:-1:-1;;;5232:52:18;;46416:2:22;5232:52:18;;;46398:21:22;46455:2;46435:18;;;46428:30;-1:-1:-1;;;46474:18:22;;;46467:48;46532:18;;5232:52:18;46214:342:22;5232:52:18;5295:21;5319:18;5328:8;5319;:18::i;:::-;5295:42;;5390:1;5372:7;5366:21;:25;:119;;;;;;;;;;;;;;;;;5434:7;5443:19;:8;:17;:19::i;:::-;5417:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5347:138;5089:403;-1:-1:-1;;;5089:403:18:o;1153:184:10:-;1274:4;1326;1297:25;1310:5;1317:4;1297:12;:25::i;:::-;:33;;1153:184;-1:-1:-1;;;;1153:184:10:o;10258:709:21:-;10360:23;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10360:23:21;-1:-1:-1;;;;;10407:27:21;;10399:67;;;;-1:-1:-1;;;10399:67:21;;46763:2:22;10399:67:21;;;46745:21:22;46802:2;46782:18;;;46775:30;46841:29;46821:18;;;46814:57;46888:18;;10399:67:21;46561:351:22;10399:67:21;-1:-1:-1;;;;;10512:29:21;;10476:33;10512:29;;;:14;:29;;;;;;;;;10476:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10476:65:21;;;;;10572:23;;;;:64;;;10617:9;:19;;;10599:15;:37;10572:64;10551:135;;;;-1:-1:-1;;;10551:135:21;;47119:2:22;10551:135:21;;;47101:21:22;47158:2;47138:18;;;47131:30;47197:26;47177:18;;;47170:54;47241:18;;10551:135:21;46917:348:22;10551:135:21;10735:9;:18;;;10717:15;:36;10696:110;;;;-1:-1:-1;;;10696:110:21;;47472:2:22;10696:110:21;;;47454:21:22;47511:2;47491:18;;;47484:30;47550:29;47530:18;;;47523:57;47597:18;;10696:110:21;47270:351:22;10696:110:21;10864:1;10837:9;:24;;;-1:-1:-1;;;;;10837:28:21;;10816:118;;;;-1:-1:-1;;;10816:118:21;;47828:2:22;10816:118:21;;;47810:21:22;47867:2;47847:18;;;47840:30;47906:34;47886:18;;;47879:62;-1:-1:-1;;;47957:18:22;;;47950:41;48008:19;;10816:118:21;47626:407:22;19987:420:21;20194:135;20251:4;20269:2;20285:12;20311:8;20194:43;:135::i;:::-;20339:61;20367:4;20373:2;20377:12;20391:8;20339:27;:61::i;1945:106:1:-;1685:7;;;;2003:41;;;;-1:-1:-1;;;2003:41:1;;48240:2:22;2003:41:1;;;48222:21:22;48279:2;48259:18;;;48252:30;-1:-1:-1;;;48298:18:22;;;48291:50;48358:18;;2003:41:1;48038:344:22;1767:106:1;1685:7;;;;1836:9;1828:38;;;;-1:-1:-1;;;1828:38:1;;48589:2:22;1828:38:1;;;48571:21:22;48628:2;48608:18;;;48601:30;-1:-1:-1;;;48647:18:22;;;48640:46;48703:18;;1828:38:1;48387:340:22;14525:102:19;14593:27;14603:2;14607:8;14593:27;;;;;;;;;;;;:9;:27::i;:::-;14525:102;;:::o;15737:171:21:-;15817:7;15805:9;:19;15801:101;;;719:10:8;15840:51:21;15871:19;15883:7;15871:9;:19;:::i;:::-;15840:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22115:2747:19;22194:27;22224;22243:7;22224:18;:27::i;:::-;22194:57;-1:-1:-1;22194:57:19;22325:305;;;;22358:22;719:10:8;-1:-1:-1;;;;;22384:27:19;;;;:90;;-1:-1:-1;22431:43:19;22448:4;719:10:8;12848:162:19;:::i;22431:43::-;22384:153;;;-1:-1:-1;719:10:8;22494:20:19;22506:7;22494:11;:20::i;:::-;-1:-1:-1;;;;;22494:43:19;;22384:153;22358:180;;22558:17;22553:66;;22584:35;;-1:-1:-1;;;22584:35:19;;;;;;;;;;;22553:66;22344:286;22325:305;22640:51;22662:4;22676:1;22680:7;22689:1;22640:21;:51::i;:::-;22761:24;;;;:15;:24;;;;;;;;22754:31;;-1:-1:-1;;;;;;22754:31:19;;;-1:-1:-1;;;;;23362:24:19;;;;:18;:24;;;;;:59;;23390:31;23362:59;;;23652:26;;;:17;:26;;;;;-1:-1:-1;;;23740:15:19;2132:3;23740:41;23697:85;;:162;23652:207;;-1:-1:-1;;;23976:46:19;;:51;;23972:616;;24079:1;24069:11;;24047:19;24200:30;;;:17;:30;;;;;;:35;;24196:378;;24336:13;;24321:11;:28;24317:239;;24481:30;;;;:17;:30;;;;;:52;;;24317:239;24029:559;23972:616;24613:35;;24640:7;;24636:1;;-1:-1:-1;;;;;24613:35:19;;;-1:-1:-1;;;;;;;;;;;24613:35:19;24636:1;;24613:35;-1:-1:-1;;24831:12:19;:14;;;;;;-1:-1:-1;;22115:2747:19:o;1991:290:10:-;2074:7;2116:4;2074:7;2130:116;2154:5;:12;2150:1;:16;2130:116;;;2202:33;2212:12;2226:5;2232:1;2226:8;;;;;;;;:::i;:::-;;;;;;;2202:9;:33::i;:::-;2187:48;-1:-1:-1;2168:3:10;;;;:::i;:::-;;;;2130:116;;12222:455:16;12401:9;12396:275;12420:9;12416:1;:13;12396:275;;;12454:34;12470:17;12486:1;12470:13;:17;:::i;:::-;8483:4;8506:26;;;:16;:26;;;;;:43;:48;;;8417:144;12454:34;12450:211;;;12537:16;:35;12554:17;12570:1;12554:13;:17;:::i;:::-;12537:35;;;;;;;;;;;-1:-1:-1;12537:35:16;:51;;;;;;;;12508:138;;;;-1:-1:-1;;;12508:138:16;;48934:2:22;12508:138:16;;;48916:21:22;48973:2;48953:18;;;48946:30;-1:-1:-1;;;48992:18:22;;;48985:46;49048:18;;12508:138:16;48732:340:22;12508:138:16;12431:3;;;:::i;:::-;;;12396:275;;8128:292:14;1685:7:1;;;;8307:9:14;8299:43;;;;-1:-1:-1;;;8299:43:14;;49279:2:22;8299:43:14;;;49261:21:22;49318:2;49298:18;;;49291:30;-1:-1:-1;;;49337:18:22;;;49330:51;49398:18;;8299:43:14;49077:345:22;8299:43:14;8352:61;13547:385:19;14987:2184;15128:13;;-1:-1:-1;;;;;15155:16:19;;15151:48;;15180:19;;-1:-1:-1;;;15180:19:19;;;;;;;;;;;15151:48;15213:8;15225:1;15213:13;15209:44;;15235:18;;-1:-1:-1;;;15235:18:19;;;;;;;;;;;15209:44;15264:61;15294:1;15298:2;15302:12;15316:8;15264:21;:61::i;:::-;-1:-1:-1;;;;;15789:22:19;;;;;;:18;:22;;;;1627:2;15789:22;;;:70;;15827:31;15815:44;;15789:70;;;16095:31;;;:17;:31;;;;;16186:15;2132:3;16186:41;16145:83;;-1:-1:-1;16263:13:19;;2389:3;16248:56;16145:160;16095:210;;:31;;16383:23;;;;16425:14;:19;16421:622;;16464:308;16494:38;;16519:12;;-1:-1:-1;;;;;16494:38:19;;;16511:1;;-1:-1:-1;;;;;;;;;;;16494:38:19;16511:1;;16494:38;16559:69;16598:1;16602:2;16606:14;;;;;;16622:5;16559:30;:69::i;:::-;16554:172;;16663:40;;-1:-1:-1;;;16663:40:19;;;;;;;;;;;16554:172;16767:3;16752:12;:18;16464:308;;16851:12;16834:13;;:29;16830:43;;16865:8;;;16830:43;16421:622;;;16912:117;16942:40;;16967:14;;;;;-1:-1:-1;;;;;16942:40:19;;;16959:1;;-1:-1:-1;;;;;;;;;;;16942:40:19;16959:1;;16942:40;17024:3;17009:12;:18;16912:117;;16421:622;-1:-1:-1;17056:13:19;:28;17104:60;17133:1;17137:2;17141:12;17155:8;17104:60;:::i;8054:147:10:-;8117:7;8147:1;8143;:5;:51;;8275:13;8366:15;;;8401:4;8394:15;;;8447:4;8431:21;;8143:51;;;-1:-1:-1;8275:13:10;8366:15;;;8401:4;8394:15;8447:4;8431:21;;;8054:147::o;14:131:22:-;-1:-1:-1;;;;;;88:32:22;;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;592:131::-;-1:-1:-1;;;;;667:31:22;;657:42;;647:70;;713:1;710;703:12;728:456;805:6;813;821;874:2;862:9;853:7;849:23;845:32;842:52;;;890:1;887;880:12;842:52;929:9;916:23;948:31;973:5;948:31;:::i;:::-;998:5;-1:-1:-1;1055:2:22;1040:18;;1027:32;1068:33;1027:32;1068:33;:::i;:::-;728:456;;1120:7;;-1:-1:-1;;;1174:2:22;1159:18;;;;1146:32;;728:456::o;1189:258::-;1261:1;1271:113;1285:6;1282:1;1279:13;1271:113;;;1361:11;;;1355:18;1342:11;;;1335:39;1307:2;1300:10;1271:113;;;1402:6;1399:1;1396:13;1393:48;;;-1:-1:-1;;1437:1:22;1419:16;;1412:27;1189:258::o;1452:::-;1494:3;1532:5;1526:12;1559:6;1554:3;1547:19;1575:63;1631:6;1624:4;1619:3;1615:14;1608:4;1601:5;1597:16;1575:63;:::i;:::-;1692:2;1671:15;-1:-1:-1;;1667:29:22;1658:39;;;;1699:4;1654:50;;1452:258;-1:-1:-1;;1452:258:22:o;1715:220::-;1864:2;1853:9;1846:21;1827:4;1884:45;1925:2;1914:9;1910:18;1902:6;1884:45;:::i;1940:180::-;1999:6;2052:2;2040:9;2031:7;2027:23;2023:32;2020:52;;;2068:1;2065;2058:12;2020:52;-1:-1:-1;2091:23:22;;1940:180;-1:-1:-1;1940:180:22:o;2333:315::-;2401:6;2409;2462:2;2450:9;2441:7;2437:23;2433:32;2430:52;;;2478:1;2475;2468:12;2430:52;2517:9;2504:23;2536:31;2561:5;2536:31;:::i;:::-;2586:5;2638:2;2623:18;;;;2610:32;;-1:-1:-1;;;2333:315:22:o;2653:247::-;2712:6;2765:2;2753:9;2744:7;2740:23;2736:32;2733:52;;;2781:1;2778;2771:12;2733:52;2820:9;2807:23;2839:31;2864:5;2839:31;:::i;3276:129::-;-1:-1:-1;;;;;3354:5:22;3350:30;3343:5;3340:41;3330:69;;3395:1;3392;3385:12;3410:245;3468:6;3521:2;3509:9;3500:7;3496:23;3492:32;3489:52;;;3537:1;3534;3527:12;3489:52;3576:9;3563:23;3595:30;3619:5;3595:30;:::i;4166:159::-;4229:5;4274:3;4265:6;4260:3;4256:16;4252:26;4249:46;;;4291:1;4288;4281:12;4249:46;-1:-1:-1;4313:6:22;4166:159;-1:-1:-1;4166:159:22:o;4330:245::-;4419:6;4472:3;4460:9;4451:7;4447:23;4443:33;4440:53;;;4489:1;4486;4479:12;4440:53;4512:57;4561:7;4550:9;4512:57;:::i;4580:160::-;4645:5;4690:2;4681:6;4676:3;4672:16;4668:25;4665:45;;;4706:1;4703;4696:12;4745:248;4836:6;4889:2;4877:9;4868:7;4864:23;4860:32;4857:52;;;4905:1;4902;4895:12;4857:52;4928:59;4979:7;4968:9;4928:59;:::i;4998:592::-;5069:6;5077;5130:2;5118:9;5109:7;5105:23;5101:32;5098:52;;;5146:1;5143;5136:12;5098:52;5186:9;5173:23;-1:-1:-1;;;;;5256:2:22;5248:6;5245:14;5242:34;;;5272:1;5269;5262:12;5242:34;5310:6;5299:9;5295:22;5285:32;;5355:7;5348:4;5344:2;5340:13;5336:27;5326:55;;5377:1;5374;5367:12;5326:55;5417:2;5404:16;5443:2;5435:6;5432:14;5429:34;;;5459:1;5456;5449:12;5429:34;5504:7;5499:2;5490:6;5486:2;5482:15;5478:24;5475:37;5472:57;;;5525:1;5522;5515:12;5472:57;5556:2;5548:11;;;;;5578:6;;-1:-1:-1;4998:592:22;;-1:-1:-1;;;;4998:592:22:o;5595:314::-;5693:6;5701;5754:3;5742:9;5733:7;5729:23;5725:33;5722:53;;;5771:1;5768;5761:12;5722:53;5794:57;5843:7;5832:9;5794:57;:::i;:::-;5784:67;5898:3;5883:19;;;;5870:33;;-1:-1:-1;;;5595:314:22:o;5914:367::-;5977:8;5987:6;6041:3;6034:4;6026:6;6022:17;6018:27;6008:55;;6059:1;6056;6049:12;6008:55;-1:-1:-1;6082:20:22;;-1:-1:-1;;;;;6114:30:22;;6111:50;;;6157:1;6154;6147:12;6111:50;6194:4;6186:6;6182:17;6170:29;;6254:3;6247:4;6237:6;6234:1;6230:14;6222:6;6218:27;6214:38;6211:47;6208:67;;;6271:1;6268;6261:12;6208:67;5914:367;;;;;:::o;6286:437::-;6372:6;6380;6433:2;6421:9;6412:7;6408:23;6404:32;6401:52;;;6449:1;6446;6439:12;6401:52;6489:9;6476:23;-1:-1:-1;;;;;6514:6:22;6511:30;6508:50;;;6554:1;6551;6544:12;6508:50;6593:70;6655:7;6646:6;6635:9;6631:22;6593:70;:::i;:::-;6682:8;;6567:96;;-1:-1:-1;6286:437:22;-1:-1:-1;;;;6286:437:22:o;6728:461::-;6781:3;6819:5;6813:12;6846:6;6841:3;6834:19;6872:4;6901:2;6896:3;6892:12;6885:19;;6938:2;6931:5;6927:14;6959:1;6969:195;6983:6;6980:1;6977:13;6969:195;;;7048:13;;-1:-1:-1;;;;;7044:39:22;7032:52;;7104:12;;;;7139:15;;;;7080:1;6998:9;6969:195;;;-1:-1:-1;7180:3:22;;6728:461;-1:-1:-1;;;;;6728:461:22:o;7194:261::-;7373:2;7362:9;7355:21;7336:4;7393:56;7445:2;7434:9;7430:18;7422:6;7393:56;:::i;7460:570::-;7554:6;7562;7570;7623:2;7611:9;7602:7;7598:23;7594:32;7591:52;;;7639:1;7636;7629:12;7591:52;7679:9;7666:23;-1:-1:-1;;;;;7704:6:22;7701:30;7698:50;;;7744:1;7741;7734:12;7698:50;7783:70;7845:7;7836:6;7825:9;7821:22;7783:70;:::i;:::-;7872:8;;-1:-1:-1;7757:96:22;-1:-1:-1;;7957:2:22;7942:18;;7929:32;7970:30;7929:32;7970:30;:::i;:::-;8019:5;8009:15;;;7460:570;;;;;:::o;8385:632::-;8556:2;8608:21;;;8678:13;;8581:18;;;8700:22;;;8527:4;;8556:2;8779:15;;;;8753:2;8738:18;;;8527:4;8822:169;8836:6;8833:1;8830:13;8822:169;;;8897:13;;8885:26;;8966:15;;;;8931:12;;;;8858:1;8851:9;8822:169;;;-1:-1:-1;9008:3:22;;8385:632;-1:-1:-1;;;;;;8385:632:22:o;9022:386::-;9089:6;9097;9150:2;9138:9;9129:7;9125:23;9121:32;9118:52;;;9166:1;9163;9156:12;9118:52;9205:9;9192:23;9224:31;9249:5;9224:31;:::i;:::-;9274:5;-1:-1:-1;9331:2:22;9316:18;;9303:32;9344;9303;9344;:::i;:::-;9395:7;9385:17;;;9022:386;;;;;:::o;9413:118::-;9499:5;9492:13;9485:21;9478:5;9475:32;9465:60;;9521:1;9518;9511:12;9536:376;9598:6;9606;9659:2;9647:9;9638:7;9634:23;9630:32;9627:52;;;9675:1;9672;9665:12;9627:52;9714:9;9701:23;9733:28;9755:5;9733:28;:::i;:::-;9780:5;-1:-1:-1;9837:2:22;9822:18;;9809:32;9850:30;9809:32;9850:30;:::i;9917:572::-;10012:6;10020;10028;10081:2;10069:9;10060:7;10056:23;10052:32;10049:52;;;10097:1;10094;10087:12;10049:52;10136:9;10123:23;10155:31;10180:5;10155:31;:::i;:::-;10205:5;-1:-1:-1;10261:2:22;10246:18;;10233:32;-1:-1:-1;;;;;10277:30:22;;10274:50;;;10320:1;10317;10310:12;10274:50;10359:70;10421:7;10412:6;10401:9;10397:22;10359:70;:::i;:::-;9917:572;;10448:8;;-1:-1:-1;10333:96:22;;-1:-1:-1;;;;9917:572:22:o;10913:382::-;10978:6;10986;11039:2;11027:9;11018:7;11014:23;11010:32;11007:52;;;11055:1;11052;11045:12;11007:52;11094:9;11081:23;11113:31;11138:5;11113:31;:::i;11300:803::-;11462:4;11491:2;11531;11520:9;11516:18;11561:2;11550:9;11543:21;11584:6;11619;11613:13;11650:6;11642;11635:22;11688:2;11677:9;11673:18;11666:25;;11750:2;11740:6;11737:1;11733:14;11722:9;11718:30;11714:39;11700:53;;11788:2;11780:6;11776:15;11809:1;11819:255;11833:6;11830:1;11827:13;11819:255;;;11926:2;11922:7;11910:9;11902:6;11898:22;11894:36;11889:3;11882:49;11954:40;11987:6;11978;11972:13;11954:40;:::i;:::-;11944:50;-1:-1:-1;12052:12:22;;;;12017:15;;;;11855:1;11848:9;11819:255;;;-1:-1:-1;12091:6:22;;11300:803;-1:-1:-1;;;;;;;11300:803:22:o;12108:386::-;12212:6;12220;12273:3;12261:9;12252:7;12248:23;12244:33;12241:53;;;12290:1;12287;12280:12;12241:53;12329:9;12316:23;12348:31;12373:5;12348:31;:::i;:::-;12398:5;-1:-1:-1;12422:66:22;12480:7;12475:2;12460:18;;12422:66;:::i;:::-;12412:76;;12108:386;;;;;:::o;12905:127::-;12966:10;12961:3;12957:20;12954:1;12947:31;12997:4;12994:1;12987:15;13021:4;13018:1;13011:15;13037:275;13108:2;13102:9;13173:2;13154:13;;-1:-1:-1;;13150:27:22;13138:40;;-1:-1:-1;;;;;13193:34:22;;13229:22;;;13190:62;13187:88;;;13255:18;;:::i;:::-;13291:2;13284:22;13037:275;;-1:-1:-1;13037:275:22:o;13317:1108::-;13412:6;13420;13428;13436;13489:3;13477:9;13468:7;13464:23;13460:33;13457:53;;;13506:1;13503;13496:12;13457:53;13545:9;13532:23;13564:31;13589:5;13564:31;:::i;:::-;13614:5;-1:-1:-1;13638:2:22;13677:18;;;13664:32;13705:33;13664:32;13705:33;:::i;:::-;13757:7;-1:-1:-1;13811:2:22;13796:18;;13783:32;;-1:-1:-1;13866:2:22;13851:18;;13838:32;-1:-1:-1;;;;;13919:14:22;;;13916:34;;;13946:1;13943;13936:12;13916:34;13984:6;13973:9;13969:22;13959:32;;14029:7;14022:4;14018:2;14014:13;14010:27;14000:55;;14051:1;14048;14041:12;14000:55;14087:2;14074:16;14109:2;14105;14102:10;14099:36;;;14115:18;;:::i;:::-;14157:53;14200:2;14181:13;;-1:-1:-1;;14177:27:22;14173:36;;14157:53;:::i;:::-;14144:66;;14233:2;14226:5;14219:17;14273:7;14268:2;14263;14259;14255:11;14251:20;14248:33;14245:53;;;14294:1;14291;14284:12;14245:53;14349:2;14344;14340;14336:11;14331:2;14324:5;14320:14;14307:45;14393:1;14388:2;14383;14376:5;14372:14;14368:23;14361:34;;14414:5;14404:15;;;;;13317:1108;;;;;;;:::o;14430:811::-;14683:2;14672:9;14665:21;14646:4;14709:56;14761:2;14750:9;14746:18;14738:6;14709:56;:::i;:::-;14822:22;;;14784:2;14802:18;;;14795:50;;;;14894:13;;14916:22;;;14992:15;;;;14954;;;15025:1;15035:180;15049:6;15046:1;15043:13;15035:180;;;15114:13;;15129:4;15110:24;15098:37;;15190:15;;;;15155:12;;;;15071:1;15064:9;15035:180;;;-1:-1:-1;15232:3:22;;14430:811;-1:-1:-1;;;;;;;14430:811:22:o;16028:732::-;16128:6;16136;16144;16152;16205:2;16193:9;16184:7;16180:23;16176:32;16173:52;;;16221:1;16218;16211:12;16173:52;16261:9;16248:23;-1:-1:-1;;;;;16286:6:22;16283:30;16280:50;;;16326:1;16323;16316:12;16280:50;16365:70;16427:7;16418:6;16407:9;16403:22;16365:70;:::i;:::-;16454:8;;-1:-1:-1;16339:96:22;-1:-1:-1;;16539:2:22;16524:18;;16511:32;16583:6;16572:18;;16562:29;;16552:57;;16605:1;16602;16595:12;16552:57;16628:5;-1:-1:-1;16685:2:22;16670:18;;16657:32;16698:30;16657:32;16698:30;:::i;:::-;16028:732;;;;-1:-1:-1;16028:732:22;;-1:-1:-1;;16028:732:22:o;16765:978::-;17012:2;17064:21;;;17134:13;;17037:18;;;17156:22;;;16983:4;;17012:2;17197;;17215:18;;;;17256:15;;;16983:4;17299:418;17313:6;17310:1;17307:13;17299:418;;;17372:13;;17410:9;;17398:22;;17460:11;;;17454:18;17440:12;;;17433:40;17517:11;;;17511:18;17531:6;17507:31;17493:12;;;17486:53;17562:4;17620:11;;;17614:18;17607:26;17600:34;17586:12;;;17579:56;17664:4;17655:14;;;;17692:15;;;;17335:1;17328:9;17299:418;;;-1:-1:-1;17734:3:22;;16765:978;-1:-1:-1;;;;;;;16765:978:22:o;17748:412::-;17814:6;17822;17875:2;17863:9;17854:7;17850:23;17846:32;17843:52;;;17891:1;17888;17881:12;17843:52;17930:9;17917:23;17949:31;17974:5;17949:31;:::i;:::-;17999:5;-1:-1:-1;18056:2:22;18041:18;;18028:32;18104:4;18091:18;;18079:31;;18069:59;;18124:1;18121;18114:12;18415:907;18545:6;18553;18561;18569;18577;18630:2;18618:9;18609:7;18605:23;18601:32;18598:52;;;18646:1;18643;18636:12;18598:52;18685:9;18672:23;18704:31;18729:5;18704:31;:::i;:::-;18754:5;-1:-1:-1;18810:2:22;18795:18;;18782:32;-1:-1:-1;;;;;18863:14:22;;;18860:34;;;18890:1;18887;18880:12;18860:34;18929:70;18991:7;18982:6;18971:9;18967:22;18929:70;:::i;:::-;19018:8;;-1:-1:-1;18903:96:22;-1:-1:-1;19106:2:22;19091:18;;19078:32;;-1:-1:-1;19122:16:22;;;19119:36;;;19151:1;19148;19141:12;19119:36;;19190:72;19254:7;19243:8;19232:9;19228:24;19190:72;:::i;:::-;18415:907;;;;-1:-1:-1;18415:907:22;;-1:-1:-1;19281:8:22;;19164:98;18415:907;-1:-1:-1;;;18415:907:22:o;19327:388::-;19395:6;19403;19456:2;19444:9;19435:7;19431:23;19427:32;19424:52;;;19472:1;19469;19462:12;19424:52;19511:9;19498:23;19530:31;19555:5;19530:31;:::i;:::-;19580:5;-1:-1:-1;19637:2:22;19622:18;;19609:32;19650:33;19609:32;19650:33;:::i;19973:355::-;20175:2;20157:21;;;20214:2;20194:18;;;20187:30;20253:33;20248:2;20233:18;;20226:61;20319:2;20304:18;;19973:355::o;20333:251::-;20403:6;20456:2;20444:9;20435:7;20431:23;20427:32;20424:52;;;20472:1;20469;20462:12;20424:52;20504:9;20498:16;20523:31;20548:5;20523:31;:::i;20589:343::-;20791:2;20773:21;;;20830:2;20810:18;;;20803:30;-1:-1:-1;;;20864:2:22;20849:18;;20842:49;20923:2;20908:18;;20589:343::o;21723:380::-;21802:1;21798:12;;;;21845;;;21866:61;;21920:4;21912:6;21908:17;21898:27;;21866:61;21973:2;21965:6;21962:14;21942:18;21939:38;21936:161;;22019:10;22014:3;22010:20;22007:1;22000:31;22054:4;22051:1;22044:15;22082:4;22079:1;22072:15;22108:348;22310:2;22292:21;;;22349:2;22329:18;;;22322:30;22388:26;22383:2;22368:18;;22361:54;22447:2;22432:18;;22108:348::o;22814:350::-;23016:2;22998:21;;;23055:2;23035:18;;;23028:30;23094:28;23089:2;23074:18;;23067:56;23155:2;23140:18;;22814:350::o;25586:127::-;25647:10;25642:3;25638:20;25635:1;25628:31;25678:4;25675:1;25668:15;25702:4;25699:1;25692:15;25718:128;25758:3;25789:1;25785:6;25782:1;25779:13;25776:39;;;25795:18;;:::i;:::-;-1:-1:-1;25831:9:22;;25718:128::o;25851:135::-;25890:3;25911:17;;;25908:43;;25931:18;;:::i;:::-;-1:-1:-1;25978:1:22;25967:13;;25851:135::o;25991:561::-;26160:5;26147:19;26141:4;26134:33;26221:2;26214:5;26210:14;26197:28;26193:1;26187:4;26183:12;26176:50;26280:2;26273:5;26269:14;26256:28;26252:1;26246:4;26242:12;26235:50;26322:1;26316:4;26312:12;26372:2;26365:5;26361:14;26348:28;26385:30;26407:7;26385:30;:::i;:::-;26443:17;;26522:15;;26515:23;26466:3;26511:33;-1:-1:-1;;26439:32:22;;;;26499:46;26480:66;;-1:-1:-1;;25991:561:22:o;26557:540::-;26780:20;;26762:39;;26864:4;26852:17;;;26839:31;26817:20;;;26810:61;26934:4;26922:17;;;26909:31;26887:20;;;26880:61;26749:3;26734:19;;26988:4;26976:17;;26963:31;27003:28;26963:31;27003:28;:::i;:::-;27083:5;27076:13;27069:21;27062:4;27051:9;27047:20;27040:51;;26557:540;;;;:::o;27102:338::-;27304:2;27286:21;;;27343:2;27323:18;;;27316:30;-1:-1:-1;;;27377:2:22;27362:18;;27355:44;27431:2;27416:18;;27102:338::o;27789:506::-;27962:5;27949:19;27943:4;27936:33;28023:2;28016:5;28012:14;27999:28;27995:1;27989:4;27985:12;27978:50;28065:1;28059:4;28055:12;28115:2;28108:5;28104:14;28091:28;28128:33;28153:7;28128:33;:::i;:::-;28196:17;;-1:-1:-1;;;;;;28192:60:22;-1:-1:-1;;;;;28254:33:22;;;;28189:99;28170:119;;-1:-1:-1;;27789:506:22:o;28300:486::-;28526:20;;28508:39;;28610:4;28598:17;;;28585:31;28563:20;;;28556:61;28496:2;28481:18;;28664:4;28652:17;;28639:31;28679;28639;28679;:::i;:::-;-1:-1:-1;;;;;28748:31:22;28741:4;28726:20;;;;28719:61;;;;28300:486;;-1:-1:-1;28300:486:22:o;29258:545::-;29360:2;29355:3;29352:11;29349:448;;;29396:1;29421:5;29417:2;29410:17;29466:4;29462:2;29452:19;29536:2;29524:10;29520:19;29517:1;29513:27;29507:4;29503:38;29572:4;29560:10;29557:20;29554:47;;;-1:-1:-1;29595:4:22;29554:47;29650:2;29645:3;29641:12;29638:1;29634:20;29628:4;29624:31;29614:41;;29705:82;29723:2;29716:5;29713:13;29705:82;;;29768:17;;;29749:1;29738:13;29705:82;;;29709:3;;;29258:545;;;:::o;29979:1206::-;-1:-1:-1;;;;;30098:3:22;30095:27;30092:53;;;30125:18;;:::i;:::-;30154:94;30244:3;30204:38;30236:4;30230:11;30204:38;:::i;:::-;30198:4;30154:94;:::i;:::-;30274:1;30299:2;30294:3;30291:11;30316:1;30311:616;;;;30971:1;30988:3;30985:93;;;-1:-1:-1;31044:19:22;;;31031:33;30985:93;-1:-1:-1;;29936:1:22;29932:11;;;29928:24;29924:29;29914:40;29960:1;29956:11;;;29911:57;31091:78;;30284:895;;30311:616;29205:1;29198:14;;;29242:4;29229:18;;-1:-1:-1;;30347:17:22;;;30448:9;30470:229;30484:7;30481:1;30478:14;30470:229;;;30573:19;;;30560:33;30545:49;;30680:4;30665:20;;;;30633:1;30621:14;;;;30500:12;30470:229;;;30474:3;30727;30718:7;30715:16;30712:159;;;30851:1;30847:6;30841:3;30835;30832:1;30828:11;30824:21;30820:34;30816:39;30803:9;30798:3;30794:19;30781:33;30777:79;30769:6;30762:95;30712:159;;;30914:1;30908:3;30905:1;30901:11;30897:19;30891:4;30884:33;30284:895;;29979:1206;;;:::o;31190:390::-;31349:2;31338:9;31331:21;31388:6;31383:2;31372:9;31368:18;31361:34;31445:6;31437;31432:2;31421:9;31417:18;31404:48;31501:1;31472:22;;;31496:2;31468:31;;;31461:42;;;;31564:2;31543:15;;;-1:-1:-1;;31539:29:22;31524:45;31520:54;;31190:390;-1:-1:-1;31190:390:22:o;31585:515::-;31723:5;31710:19;31704:4;31697:33;31784:2;31777:5;31773:14;31760:28;31756:1;31750:4;31746:12;31739:50;31843:2;31836:5;31832:14;31819:28;31815:1;31809:4;31805:12;31798:50;31885:1;31879:4;31875:12;31935:2;31928:5;31924:14;31911:28;31948:32;31972:7;31948:32;:::i;:::-;32015:17;;-1:-1:-1;;32011:47:22;-1:-1:-1;;;;;32060:32:22;;;;32008:85;31989:105;;-1:-1:-1;;31585:515:22:o;32105:237::-;32248:88;32330:5;32324:4;32248:88;:::i;32347:397::-;32445:5;32432:19;32427:3;32420:32;32508:4;32501:5;32497:16;32484:30;32477:4;32472:3;32468:14;32461:54;32571:4;32564:5;32560:16;32547:30;32540:4;32535:3;32531:14;32524:54;32626:4;32619:5;32615:16;32602:30;32641:32;32665:7;32641:32;:::i;:::-;-1:-1:-1;;;;;32709:7:22;32705:32;32698:4;32693:3;32689:14;32682:56;;32347:397;;:::o;32749:267::-;32941:3;32926:19;;32954:56;32930:9;32992:6;32954:56;:::i;33021:127::-;33082:10;33077:3;33073:20;33070:1;33063:31;33113:4;33110:1;33103:15;33137:4;33134:1;33127:15;33928:356;34130:2;34112:21;;;34149:18;;;34142:30;34208:34;34203:2;34188:18;;34181:62;34275:2;34260:18;;33928:356::o;34289:236::-;34328:3;-1:-1:-1;;;;;34401:2:22;34398:1;34394:10;34431:2;34428:1;34424:10;34462:3;34458:2;34454:12;34449:3;34446:21;34443:47;;;34470:18;;:::i;:::-;34506:13;;34289:236;-1:-1:-1;;;;34289:236:22:o;34530:346::-;34732:2;34714:21;;;34771:2;34751:18;;;34744:30;-1:-1:-1;;;34805:2:22;34790:18;;34783:52;34867:2;34852:18;;34530:346::o;35232:583::-;-1:-1:-1;;;;;35449:32:22;;35431:51;;35518:2;35513;35498:18;;35491:30;;;35537:18;;35530:34;;;-1:-1:-1;;;;;;35576:31:22;;35573:51;;;35620:1;35617;35610:12;35573:51;35654:6;35651:1;35647:14;35711:6;35703;35698:2;35687:9;35683:18;35670:48;35788:1;35741:22;;35765:2;35737:31;35777:13;;;-1:-1:-1;35737:31:22;35232:583;-1:-1:-1;;;35232:583:22:o;35820:936::-;35915:6;35946:2;35989;35977:9;35968:7;35964:23;35960:32;35957:52;;;36005:1;36002;35995:12;35957:52;36038:9;36032:16;-1:-1:-1;;;;;36108:2:22;36100:6;36097:14;36094:34;;;36124:1;36121;36114:12;36094:34;36162:6;36151:9;36147:22;36137:32;;36207:7;36200:4;36196:2;36192:13;36188:27;36178:55;;36229:1;36226;36219:12;36178:55;36258:2;36252:9;36280:2;36276;36273:10;36270:36;;;36286:18;;:::i;:::-;36332:2;36329:1;36325:10;36315:20;;36355:28;36379:2;36375;36371:11;36355:28;:::i;:::-;36417:15;;;36487:11;;;36483:20;;;36448:12;;;;36515:19;;;36512:39;;;36547:1;36544;36537:12;36512:39;36571:11;;;;36591:135;36607:6;36602:3;36599:15;36591:135;;;36673:10;;36661:23;;36624:12;;;;36704;;;;36591:135;;;36745:5;35820:936;-1:-1:-1;;;;;;;;35820:936:22:o;37337:245::-;37404:6;37457:2;37445:9;37436:7;37432:23;37428:32;37425:52;;;37473:1;37470;37463:12;37425:52;37505:9;37499:16;37524:28;37546:5;37524:28;:::i;37587:470::-;37766:3;37804:6;37798:13;37820:53;37866:6;37861:3;37854:4;37846:6;37842:17;37820:53;:::i;:::-;37936:13;;37895:16;;;;37958:57;37936:13;37895:16;37992:4;37980:17;;37958:57;:::i;38316:376::-;-1:-1:-1;;;;;38579:32:22;;38561:51;;38548:3;38533:19;;38621:65;38682:2;38667:18;;38659:6;38621:65;:::i;39379:184::-;39449:6;39502:2;39490:9;39481:7;39477:23;39473:32;39470:52;;;39518:1;39515;39508:12;39470:52;-1:-1:-1;39541:16:22;;39379:184;-1:-1:-1;39379:184:22:o;40627:125::-;40667:4;40695:1;40692;40689:8;40686:34;;;40700:18;;:::i;:::-;-1:-1:-1;40737:9:22;;40627:125::o;41238:348::-;41440:2;41422:21;;;41479:2;41459:18;;;41452:30;41518:26;41513:2;41498:18;;41491:54;41577:2;41562:18;;41238:348::o;44559:168::-;44599:7;44665:1;44661;44657:6;44653:14;44650:1;44647:21;44642:1;44635:9;44628:17;44624:45;44621:71;;;44672:18;;:::i;:::-;-1:-1:-1;44712:9:22;;44559:168::o;45092:127::-;45153:10;45148:3;45144:20;45141:1;45134:31;45184:4;45181:1;45174:15;45208:4;45205:1;45198:15;45224:120;45264:1;45290;45280:35;;45295:18;;:::i;:::-;-1:-1:-1;45329:9:22;;45224:120::o;45349:112::-;45381:1;45407;45397:35;;45412:18;;:::i;:::-;-1:-1:-1;45446:9:22;;45349:112::o;45466:489::-;-1:-1:-1;;;;;45735:15:22;;;45717:34;;45787:15;;45782:2;45767:18;;45760:43;45834:2;45819:18;;45812:34;;;45882:3;45877:2;45862:18;;45855:31;;;45660:4;;45903:46;;45929:19;;45921:6;45903:46;:::i;:::-;45895:54;45466:489;-1:-1:-1;;;;;;45466:489:22:o;45960:249::-;46029:6;46082:2;46070:9;46061:7;46057:23;46053:32;46050:52;;;46098:1;46095;46088:12;46050:52;46130:9;46124:16;46149:30;46173:5;46149:30;:::i

Swarm Source

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