ETH Price: $3,255.00 (-0.88%)
Gas: 2 Gwei

Token

DEEMO THE MOVIE NFT (DEEMO)
 

Overview

Max Total Supply

3,280 DEEMO

Holders

862

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
miraken.eth
Balance
3 DEEMO
0x3c173e3d1e6eaf8f697daea05a39ff0c067743a4
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:
Collection

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-11-21
*/

/**
 *Submitted for verification at Etherscan.io on 2022-11-20
*/

// File: contracts\IERC721A.sol


// ERC721A Contracts v4.2.3
// Creator: Chiru Labs

pragma solidity ^0.8.4;

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

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

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

    /**
     * The `quantity` minted with ERC2309 exceeds the safety limit.
     */
    error MintERC2309QuantityExceedsLimit();

    /**
     * The `extraData` cannot be set on an unintialized ownership slot.
     */
    error OwnershipNotInitializedForExtraData();

    // =============================================================
    //                            STRUCTS
    // =============================================================

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Stores the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
        // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}.
        uint24 extraData;
    }

    // =============================================================
    //                         TOKEN COUNTERS
    // =============================================================

    /**
     * @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() external view returns (uint256);

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);

    // =============================================================
    //                            IERC721
    // =============================================================

    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

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

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

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

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

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

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external payable;

    /**
     * @dev Transfers `tokenId` 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 payable;

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

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

    // =============================================================
    //                        IERC721Metadata
    // =============================================================

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

    // =============================================================
    //                           IERC2309
    // =============================================================

    /**
     * @dev Emitted when tokens in `fromTokenId` to `toTokenId`
     * (inclusive) is transferred from `from` to `to`, as defined in the
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard.
     *
     * See {_mintERC2309} for more details.
     */
    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}

// File: contracts\ERC721A.sol


// ERC721A Contracts v4.2.3
// Creator: Chiru Labs

pragma solidity ^0.8.4;

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

/**
 * @title ERC721A
 *
 * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721)
 * Non-Fungible Token Standard, including the Metadata extension.
 * Optimized for lower gas during batch mints.
 *
 * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...)
 * starting from `_startTokenId()`.
 *
 * Assumptions:
 *
 * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364).
    struct TokenApprovalRef {
        address value;
    }

    // =============================================================
    //                           CONSTANTS
    // =============================================================

    // 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 bit position of `extraData` in packed ownership.
    uint256 private constant _BITPOS_EXTRA_DATA = 232;

    // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`.
    uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;

    // The mask of the lower 160 bits for addresses.
    uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1;

    // The maximum `quantity` that can be minted with {_mintERC2309}.
    // This limit is to prevent overflows on the address data entries.
    // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309}
    // is required to cause an overflow, which is unrealistic.
    uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;

    // The `Transfer` event signature is given by:
    // `keccak256(bytes("Transfer(address,address,uint256)"))`.
    bytes32 private constant _TRANSFER_EVENT_SIGNATURE =
        0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;

    // =============================================================
    //                            STORAGE
    // =============================================================

    // The next token ID to be minted.
    uint256 internal _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`
    // - [232..255] `extraData`
    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 => TokenApprovalRef) private _tokenApprovals;

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

    // =============================================================
    //                          CONSTRUCTOR
    // =============================================================

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

    // =============================================================
    //                   TOKEN COUNTING OPERATIONS
    // =============================================================

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

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

    /**
     * @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 virtual override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than `_currentIndex - _startTokenId()` times.
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * @dev Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view virtual 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 virtual returns (uint256) {
        return _burnCounter;
    }

    // =============================================================
    //                    ADDRESS DATA OPERATIONS
    // =============================================================

    /**
     * @dev Returns the number of tokens in `owner`'s account.
     */
    function balanceOf(address owner) public view virtual 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 auxiliary 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 auxiliary 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 virtual {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        // Cast `aux` with assembly to avoid redundant masking.
        assembly {
            auxCasted := aux
        }
        packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes
        // of the XOR of all function selectors in the interface.
        // See: [ERC165](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.
    }

    // =============================================================
    //                        IERC721Metadata
    // =============================================================

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

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    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, it can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    // =============================================================
    //                     OWNERSHIPS OPERATIONS
    // =============================================================

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

    /**
     * @dev Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around over time.
     */
    function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

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

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

    /**
     * Returns the packed ownership data of `tokenId`.
     */
    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256 packed) {
        if (_startTokenId() <= tokenId) {
            packed = _packedOwnerships[tokenId];
            // If not burned.
            if (packed & _BITMASK_BURNED == 0) {
                // If the data at the starting slot does not exist, start the scan.
                if (packed == 0) {
                    if (tokenId >= _currentIndex) revert OwnerQueryForNonexistentToken();
                    // Invariant:
                    // There will always be an initialized ownership slot
                    // (i.e. `ownership.addr != address(0) && ownership.burned == false`)
                    // before an unintialized ownership slot
                    // (i.e. `ownership.addr == address(0) && ownership.burned == false`)
                    // Hence, `tokenId` will not underflow.
                    //
                    // We can directly compare the packed value.
                    // If the address is zero, packed will be zero.
                    for (;;) {
                        unchecked {
                            packed = _packedOwnerships[--tokenId];
                        }
                        if (packed == 0) continue;
                        return packed;
                    }
                }
                // Otherwise, the data exists and is not burned. We can skip the scan.
                // This is possible because we have already achieved the target condition.
                // This saves 2143 gas on transfers of initialized tokens.
                return packed;
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev 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;
        ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA);
    }

    /**
     * @dev Packs ownership data into a single uint256.
     */
    function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`.
            result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags))
        }
    }

    /**
     * @dev Returns the `nextInitialized` flag set if `quantity` equals 1.
     */
    function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) {
        // For branchless setting of the `nextInitialized` flag.
        assembly {
            // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`.
            result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
        }
    }

    // =============================================================
    //                      APPROVAL OPERATIONS
    // =============================================================

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account. See {ERC721A-_approve}.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     */
    function approve(address to, uint256 tokenId) public payable virtual override {
        _approve(to, tokenId, true);
    }

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId].value;
    }

    /**
     * @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) public virtual override {
        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
    }

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

    /**
     * @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. See {_mint}.
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned.
    }

    /**
     * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`.
     */
    function _isSenderApprovedOrOwner(
        address approvedAddress,
        address owner,
        address msgSender
    ) private pure returns (bool result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean.
            msgSender := and(msgSender, _BITMASK_ADDRESS)
            // `msgSender == owner || msgSender == approvedAddress`.
            result := or(eq(msgSender, owner), eq(msgSender, approvedAddress))
        }
    }

    /**
     * @dev Returns the storage slot and value for the approved address of `tokenId`.
     */
    function _getApprovedSlotAndAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId];
        // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`.
        assembly {
            approvedAddressSlot := tokenApproval.slot
            approvedAddress := sload(approvedAddressSlot)
        }
    }

    // =============================================================
    //                      TRANSFER OPERATIONS
    // =============================================================

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) public payable virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

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

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        // The nested ifs save around 20+ gas over a compound boolean condition.
        if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
            if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();

        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // 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] = _packOwnershipData(
                to,
                _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
            );

            // 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 `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @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 memory _data
    ) public payable virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

    /**
     * @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 Private function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * `from` - Previous owner of the given token ID.
     * `to` - Target address that will receive the token.
     * `tokenId` - Token ID to be transferred.
     * `_data` - Optional data to send along with the call.
     *
     * Returns 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))
                }
            }
        }
    }

    // =============================================================
    //                        MINT OPERATIONS
    // =============================================================

    /**
     * @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 for each mint.
     */
    function _mint(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // `balance` and `numberMinted` have a maximum limit of 2**64.
        // `tokenId` has a maximum limit of 2**256.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _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] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            uint256 toMasked;
            uint256 end = startTokenId + quantity;

            // Use assembly to loop and emit the `Transfer` event for gas savings.
            // The duplicated `log4` removes an extra check and reduces stack juggling.
            // The assembly, together with the surrounding Solidity code, have been
            // delicately arranged to nudge the compiler into producing optimized opcodes.
            assembly {
                // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
                toMasked := and(to, _BITMASK_ADDRESS)
                // Emit the `Transfer` event.
                log4(
                    0, // Start of data (0, since no data).
                    0, // End of data (0, since no data).
                    _TRANSFER_EVENT_SIGNATURE, // Signature.
                    0, // `address(0)`.
                    toMasked, // `to`.
                    startTokenId // `tokenId`.
                )

                // The `iszero(eq(,))` check ensures that large values of `quantity`
                // that overflows uint256 will make the loop run out of gas.
                // The compiler will optimize the `iszero` away for performance.
                for {
                    let tokenId := add(startTokenId, 1)
                } iszero(eq(tokenId, end)) {
                    tokenId := add(tokenId, 1)
                } {
                    // Emit the `Transfer` event. Similar to above.
                    log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
                }
            }
            if (toMasked == 0) revert MintToZeroAddress();

            _currentIndex = end;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * This function is intended for efficient minting only during contract creation.
     *
     * It emits only one {ConsecutiveTransfer} as defined in
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309),
     * instead of a sequence of {Transfer} event(s).
     *
     * Calling this function outside of contract creation WILL make your contract
     * non-compliant with the ERC721 standard.
     * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309
     * {ConsecutiveTransfer} event is only permissible during contract creation.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {ConsecutiveTransfer} event.
     */
    function _mintERC2309(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();
        if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit();

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

        // Overflows are unrealistic due to the above check for `quantity` to be below the limit.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _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] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to);

            _currentIndex = startTokenId + quantity;
        }
        _afterTokenTransfers(address(0), to, startTokenId, 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.
     *
     * See {_mint}.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal virtual {
        _mint(to, quantity);

        unchecked {
            if (to.code.length != 0) {
                uint256 end = _currentIndex;
                uint256 index = end - quantity;
                do {
                    if (!_checkContractOnERC721Received(address(0), to, index++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (index < end);
                // Reentrancy protection.
                if (_currentIndex != end) revert();
            }
        }
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal virtual {
        _safeMint(to, quantity, '');
    }

    // =============================================================
    //                       APPROVAL OPERATIONS
    // =============================================================

    /**
     * @dev Equivalent to `_approve(to, tokenId, false)`.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _approve(to, tokenId, false);
    }

    /**
     * @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:
     *
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function _approve(
        address to,
        uint256 tokenId,
        bool approvalCheck
    ) internal virtual {
        address owner = ownerOf(tokenId);

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

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

    // =============================================================
    //                        BURN OPERATIONS
    // =============================================================

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

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        if (approvalCheck) {
            // The nested ifs save around 20+ gas over a compound boolean condition.
            if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
                if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
        }

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

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // 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] = _packOwnershipData(
                from,
                (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
            );

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

    // =============================================================
    //                     EXTRA DATA OPERATIONS
    // =============================================================

    /**
     * @dev Directly sets the extra data for the ownership data `index`.
     */
    function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual {
        uint256 packed = _packedOwnerships[index];
        if (packed == 0) revert OwnershipNotInitializedForExtraData();
        uint256 extraDataCasted;
        // Cast `extraData` with assembly to avoid redundant masking.
        assembly {
            extraDataCasted := extraData
        }
        packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA);
        _packedOwnerships[index] = packed;
    }

    /**
     * @dev Called during each token transfer to set the 24bit `extraData` field.
     * Intended to be overridden by the cosumer contract.
     *
     * `previousExtraData` - the value of `extraData` before transfer.
     *
     * 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 _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

    /**
     * @dev Returns the next extra data for the packed ownership data.
     * The returned result is shifted into position.
     */
    function _nextExtraData(
        address from,
        address to,
        uint256 prevOwnershipPacked
    ) private view returns (uint256) {
        uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA);
        return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA;
    }

    // =============================================================
    //                       OTHER OPERATIONS
    // =============================================================

    /**
     * @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 virtual returns (string memory str) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit), but
            // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned.
            // We will need 1 word for the trailing zeros padding, 1 word for the length,
            // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0.
            let m := add(mload(0x40), 0xa0)
            // Update the free memory pointer to allocate.
            mstore(0x40, m)
            // Assign the `str` to the end.
            str := sub(m, 0x20)
            // Zeroize the slot after the string.
            mstore(str, 0)

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

            // We write the string from rightmost digit to leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // prettier-ignore
            for { let temp := value } 1 {} {
                str := sub(str, 1)
                // Write the character to the pointer.
                // The ASCII index of the '0' character is 48.
                mstore8(str, add(48, mod(temp, 10)))
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
                // prettier-ignore
                if iszero(temp) { break }
            }

            let length := sub(end, str)
            // Move the pointer 32 bytes leftwards to make room for the length.
            str := sub(str, 0x20)
            // Store the length.
            mstore(str, length)
        }
    }
}

// File: contracts\OpenseaStandard\IOperatorFilterRegistry.sol


pragma solidity ^0.8.13;

interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);
    function register(address registrant) external;
    function registerAndSubscribe(address registrant, address subscription) external;
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;
    function unregister(address addr) external;
    function updateOperator(address registrant, address operator, bool filtered) external;
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
    function subscribe(address registrant, address registrantToSubscribe) external;
    function unsubscribe(address registrant, bool copyExistingEntries) external;
    function subscriptionOf(address addr) external returns (address registrant);
    function subscribers(address registrant) external returns (address[] memory);
    function subscriberAt(address registrant, uint256 index) external returns (address);
    function copyEntriesOf(address registrant, address registrantToCopy) external;
    function isOperatorFiltered(address registrant, address operator) external returns (bool);
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
    function filteredOperators(address addr) external returns (address[] memory);
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
    function isRegistered(address addr) external returns (bool);
    function codeHashOf(address addr) external returns (bytes32);
}

// File: contracts\OpenseaStandard\OperatorFilterer.sol


pragma solidity ^0.8.13;

/**
 * @title  OperatorFilterer
 * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another
 *         registrant's entries in the OperatorFilterRegistry.
 * @dev    This smart contract is meant to be inherited by token contracts so they can use the following:
 *         - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods.
 *         - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods.
 */
abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (subscribe) {
                OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    OPERATOR_FILTER_REGISTRY.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator(address from) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            // Allow spending tokens from addresses with balance
            // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
            // from an EOA.
            if (from == msg.sender) {
                _;
                return;
            }
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), msg.sender)) {
                revert OperatorNotAllowed(msg.sender);
            }
        }
        _;
    }

    modifier onlyAllowedOperatorApproval(address operator) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
                revert OperatorNotAllowed(operator);
            }
        }
        _;
    }
}

// File: contracts\OpenseaStandard\DefaultOperatorFilterer.sol


pragma solidity ^0.8.13;

/**
 * @title  DefaultOperatorFilterer
 * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription.
 */
abstract contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}

// File: contracts\CollectionProxy\CollectionStorage.sol

pragma solidity ^0.8.13;

contract CollectionStorage {

// Counters.Counter tokenIds;
string public baseURI;
mapping(address => bool) public _allowAddress;


 mapping(uint256 => bytes32) internal whiteListRoot;

 uint256 internal MaxSupply;

 uint256 public status;

 uint256 internal mainPrice;

 address internal seller;

 uint256 internal royalty;

 mapping(uint256 => uint256) public supplyPerRarity;
 mapping(uint256 => uint256) public mintedPerRarity;

 uint256 internal seed;

 

 mapping(uint256 => uint256)public tokenRarity; 

 uint256[] rarity;

 struct SaleDetail {
    uint256 startTime;
    uint256 endTime;
    uint256 price;
 }

 mapping (uint256=>SaleDetail) internal _saleDetails;
 mapping(address => mapping(uint256 => uint256)) internal userBought;
 mapping(uint256 => bool) internal isReserveWhitelist;

}

// File: @openzeppelin\contracts\utils\Context.sol


// 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: contracts\CollectionProxy\Ownable.sol



pragma solidity ^0.8.0;
/**
 * @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() {
        _setOwner(_msgSender());
    }

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

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

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) internal {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: @openzeppelin\contracts\utils\Strings.sol


// 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: @openzeppelin\contracts\utils\Address.sol


// 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: @openzeppelin\contracts\utils\math\SafeMath.sol


// OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

// File: contracts\MerkleProof.sol



pragma solidity ^0.8.13;

library MerkleProof {
    
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

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

// File: contracts\Collection.sol


pragma solidity ^0.8.13;
/**
> Collection
@notice this contract is standard ERC721 to used as xanalia user's collection managing his NFTs
 */
contract Collection is ERC721A, DefaultOperatorFilterer, Ownable, CollectionStorage{
using Strings for uint256;
using SafeMath for uint256;
using Address for address;
using Strings for address;


  constructor() ERC721A("DEEMO THE MOVIE NFT", "DEEMO")   {
    _setOwner(msg.sender);
    _allowAddress[msg.sender] = true;
    setAuthor(0x0A48Bc1E082e6f923f9A5b1C044c1780DD2A8821);
    setTransferAllowed(msg.sender, true);
    setWhitelistRoot(0xaaf83cc9f706b3a917bb1d952f10234215acfc29e118ceb18a935081f0bda7f1, 2,true);
    baseURI = "https://testapi.xanalia.com/xanalia/get-nft-meta?tokenId=";
  
  }
modifier isValid() {
  require(_allowAddress[msg.sender], "not authorize");
  _;
}

 mapping(address => bool) public isTransferAllowed;
    mapping(uint256 => bool) public nftLock;

     modifier  onlyTransferAllowed(address from) {
        require(isTransferAllowed[from],"ERC721: transfer not allowed");
        _;
    }

     modifier  isNFTLock(uint256 tokenId) {
        require(!nftLock[tokenId],"ERC721: NFT is locked");
        _;
    }

     function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) {
        require(isTransferAllowed[operator],"ERC721: transfer not allowed");
        super.setApprovalForAll(operator, approved);
    }

    function approve(address operator, uint256 tokenId) public payable  override onlyAllowedOperatorApproval(operator) {
        require(isTransferAllowed[operator],"ERC721: transfer not allowed");
        super.approve(operator, tokenId);
    }

    


     // OpenSea Enforcer functions
    function transferFrom(address from, address to, uint256 tokenId) public payable override  onlyAllowedOperator(from) {
        require(isTransferAllowed[msg.sender],"ERC721: transfer not allowed");
        require(!nftLock[tokenId],"ERC721: NFT is locked");
        super.transferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId) public payable override   onlyAllowedOperator(from) {
        require(isTransferAllowed[msg.sender],"ERC721: transfer not allowed");
        require(!nftLock[tokenId],"ERC721: NFT is locked");
        super.safeTransferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public payable override onlyAllowedOperator(from) {
        require(isTransferAllowed[msg.sender],"ERC721: transfer not allowed");
        require(!nftLock[tokenId],"ERC721: NFT is locked");
        super.safeTransferFrom(from, to, tokenId, data);
    }



function getUserBoughtCount( address _add, uint256 whitelistType) public view returns(uint256) {
  return userBought[_add][whitelistType];
}
function isWhitelisted(address account, bytes32[] calldata proof, uint256 quantity, uint256 whiteListType) public view returns (bool) {
        return _verify(_leaf(account, quantity), proof, whiteListRoot[whiteListType]);
    }
    function _leaf(address account, uint256 quantity) public pure returns (bytes32) {
        return keccak256(abi.encode(account, quantity));
    }
    function _verify(bytes32 leaf,bytes32[] memory proof,bytes32 root) internal pure returns (bool) {
        return MerkleProof.verify(proof, root, leaf);
    }

    /**
@notice function resposible of minting new NFTs of the collection.
 @param to_ address of account to whom newely created NFT's ownership to be passed
 @param countNFTs_ URI of newely created NFT
 Note only owner can mint NFT
 */
  function mint(address to_, uint256 countNFTs_) isValid() public returns(uint256, uint256) {
    require(MaxSupply >= totalSupply()+ countNFTs_, "exceeding supply");
    uint256 start = _currentIndex;
     _safeMint(to_, countNFTs_);
    uint256 end = _currentIndex - 1;
      uint256 rand;
    uint256 percentageRare = supplyPerRarity[2].mul(100).div(MaxSupply);
    for (uint256 index = start; index <= end; index++) {
        if(supplyPerRarity[1] <= mintedPerRarity[1] + 1){
          rand = 2;
          
        } else if (supplyPerRarity[2] <= mintedPerRarity[2] + 1 ){
          rand = 1;
        }else {
          rand = uint256(keccak256(abi.encode(seed + countNFTs_ + totalSupply(),seed + index, block.timestamp,tx.origin, owner()))) % 100;
          if(percentageRare >= rand){
            rand = 1;
          }else {
            rand = 2;
          }
        }
        mintedPerRarity[rand]++;
        tokenRarity[index] = rand;
        rarity.push(rand);
       }
    emit Mint(start, end, countNFTs_, to_, rarity);
    delete rarity;
    return (start, end);
  }

  function setSeed(uint256 _seed) onlyOwner public {
    seed = _seed;
  }
 

   

  function preOrderDeemoNFT(bytes32[] calldata proof, uint256 limit)  payable external {
    require(msg.sender == tx.origin, "101");
    uint256 whiteListType = 2;
    require(_saleDetails[whiteListType].startTime <= block.timestamp, "sale not started yet");
    require(_saleDetails[whiteListType].endTime > block.timestamp, "sale has ended");
    uint256 quantity =  getUserBoughtCount(msg.sender,whiteListType) + limit;
    require(isWhitelisted(msg.sender, proof, quantity,whiteListType), "not authorize");
    require(MaxSupply >=   mintedPerRarity[4], "soldout");
    uint256 depositAmount = msg.value;
    uint256 price = mainPrice;
    price = price * limit;
    require(price <= depositAmount, "NFT 108");
    mintedPerRarity[4]+=limit;
    (bool success,) = payable(seller).call{value: price}("");
    if(!success) revert("unable to receive eth");
    if(depositAmount - price > 0) {
        ( success,) = payable(msg.sender).call{value: (depositAmount - price)}("");
        if(!success) revert("unable to send eth");
    } 

    userBought[msg.sender][whiteListType] += limit;

    emit ReserverNFT(mainPrice, price, seller, msg.sender, limit);

  }
  function claimDeemoNFT() external {
    require(msg.sender == tx.origin, "101");
    require(userBought[msg.sender][2] >  userBought[msg.sender][3], "can't claim");
     require(_saleDetails[3].startTime <= block.timestamp, "sale not started yet");
    require(_saleDetails[3].endTime > block.timestamp, "sale has ended");
    uint256 limit = userBought[msg.sender][2] -  userBought[msg.sender][3];
    uint256 rand;
    uint256 percentageRare = supplyPerRarity[2].mul(100).div(MaxSupply);
    uint256 from = _currentIndex;
     _safeMint(msg.sender, limit);
    uint256 to = _currentIndex - 1;
    for (uint256 index = from; index <= to; index++) {
        if(supplyPerRarity[1] <= mintedPerRarity[1] + 1){
          rand = 2;
          
        } else if (supplyPerRarity[2] <= mintedPerRarity[2] + 1 ){
          rand = 1;
        }else {
          rand = uint256(keccak256(abi.encode(seed + limit + totalSupply(),seed + index, block.timestamp, tx.origin, owner()))) % 100;
          if(percentageRare >= rand){
            rand = 1;
          }else {
            rand = 2;
          }
        }
        mintedPerRarity[rand]++;
        tokenRarity[index] = rand;
        rarity.push(rand);
       }
     userBought[msg.sender][3] += limit; 
     mintedPerRarity[4] -= limit; 
     mintedPerRarity[5] += limit; 
     emit ClaimNFT( from,  to,   msg.sender, rarity);
    
    delete rarity;
  }

   function buyDeemoNFT(bytes32[] calldata proof, uint256 limit, bool isLimit, uint256 whiteListType)  payable external {
    require(msg.sender == tx.origin, "101");
    require(_saleDetails[whiteListType].startTime <= block.timestamp, "sale not started yet");
    require(_saleDetails[whiteListType].endTime > block.timestamp, "sale has ended");
    require(!isReserveWhitelist[whiteListType], "no valid type");
    uint256 quantity = isLimit ? getUserBoughtCount(msg.sender,whiteListType) + limit : 0;
   if (status == 1) require(isWhitelisted(msg.sender, proof, quantity,whiteListType), "not authorize");
    require(status != 0, "sales not started");  
    
    require((MaxSupply - mintedPerRarity[4]) >=   totalSupply() + limit, "soldout");
    require(supplyPerRarity[1] + supplyPerRarity[2] >=  totalSupply() + limit, "limit reach");
    uint256 rand;

    uint256 depositAmount = msg.value;
    uint256 price = mainPrice;

    uint256 percentageRare = supplyPerRarity[2].mul(100).div(MaxSupply);

    price = price * limit;
    require(price <= depositAmount, "NFT 108");
        
      uint256 from = _currentIndex;
     _safeMint(msg.sender, limit);
    uint256 to = _currentIndex -1;

       for (uint256 index = from; index <= to; index++) {

        if(supplyPerRarity[1] <= mintedPerRarity[1] + 1){
          rand = 2;
          
        } else if (supplyPerRarity[2] <= mintedPerRarity[2] + 1 ){
          rand = 1;
        }else {
          rand = uint256(keccak256(abi.encode(seed + limit + totalSupply(),seed + index, block.timestamp, tx.origin, owner()))) % 100;
          if(percentageRare >= rand){
            rand = 1;
          }else {
            rand = 2;
          }
        }
        mintedPerRarity[rand]++;
        tokenRarity[index] = rand;
        rarity.push(rand);
       }
        
        userBought[msg.sender][whiteListType] =userBought[msg.sender][whiteListType]+ limit ;
        (bool success,) = payable(seller).call{value: price}("");
        if(!success) revert("unable to receive eth");
        if(depositAmount - price > 0) {
            ( success,) = payable(msg.sender).call{value: (depositAmount - price)}("");
            if(!success) revert("unable to send eth");
        } 
    emit PurchaseNFT(from, to, mainPrice, price, seller, msg.sender, rarity);

    delete rarity;
  }

  function validate(uint256[] memory tokenIds) internal returns(bool validTrans) {
    validTrans = true;
    uint256 tokenId;
    for (uint256 index = 0; index < tokenIds.length; index++) {
      tokenId = tokenIds[index];
      if(tokenRarity[tokenId] != 1){
        validTrans = false;
        break;
      }else {
        _burn(tokenId, true);
      }
    }
    
  }
  function craftDeemo(uint256[] memory tokenIds) public {
    require(tokenIds.length == 5, "need 5 common nfts to craft");
    require(supplyPerRarity[3] >= mintedPerRarity[3] + 1, "Max supply reached for craft rare");
    bool check = validate(tokenIds);
    if(!check) revert("One or more token id is not valid type");
    uint256 from = _currentIndex + 1;
     _safeMint(msg.sender, 1);
    tokenRarity[from] = 2;
     mintedPerRarity[3]++;
    emit CraftNFT(from, tokenIds, msg.sender);
  }

  function burnAdmin(uint256 tokenId) isValid() public {
    _burn(tokenId);
    emit Burn(tokenId);
  }

  function adminTransfer(address to, uint256 tokenId) isValid() public {
      address owner = ownerOf(tokenId);
      _operatorApprovals[owner][_msgSenderERC721A()] = true;
      if(nftLock[tokenId]){
          nftLock[tokenId] = false;
          transferFrom(owner, to, tokenId);
          nftLock[tokenId] = true;
      }else {
          transferFrom(owner, to, tokenId);
      }
      
  }

 

  function addAllowAddress(address _add) onlyOwner() public {
    _allowAddress[_add] = true;
    isTransferAllowed[_add] = true;
  }
  function removeAllowAddress(address _add) onlyOwner() public {
    _allowAddress[_add] = false;
    isTransferAllowed[_add] = false;
  }

  function setWhitelistRoot(bytes32 _root, uint256 whitelistType, bool isReserve) onlyOwner() public {
    whiteListRoot[whitelistType] = _root;
    isReserveWhitelist[whitelistType] = isReserve;
  }

  



  function setAuthor(address _add) onlyOwner() public {
    seller= _add;
  }

  function setMaxSupply(uint256 supply) onlyOwner() public {
    MaxSupply= supply;
  }

  function setTransferAllowed(address _add, bool status) onlyOwner public {
        require(isTransferAllowed[_add] != status, "Xanaland: status already set");
        isTransferAllowed[_add] = status;
    }

  function setSupply(uint256 rarity, uint256 supply) onlyOwner public {
    supplyPerRarity[rarity] = supply;
  }

  function setStatus(uint256 _status) onlyOwner public {
    status= _status;
  }

  function setSaleDetails(uint256 _startTime, uint256 _endTime, uint256 whitelistType) onlyOwner public {
    _saleDetails[whitelistType] = SaleDetail(_startTime, _endTime, 0);
  }

  function getSaleDetails( uint256 whitelistType)  public view returns(uint256 _startTime, uint256 _endTime) {
    _startTime = _saleDetails[whitelistType].startTime;
    _endTime = _saleDetails[whitelistType].endTime;
  }

  function setPrice(uint256 price) onlyOwner public {
      mainPrice = price;
  }

  function getPrice() public view returns(uint256) {
      return mainPrice;
  }

  function getMaxSupply() public view returns(uint256) {
    return MaxSupply;
  }

  function getRootHash(uint256 whitelisType) public  view returns(bytes32){
      return whiteListRoot[whitelisType];
  }

  function getLocked(uint256 tokenId) public view returns(bool) {
      return nftLock[tokenId];
  }

  function getIsTransferAllowed(address operator) public view returns(bool) {
      return isTransferAllowed[operator];
  }

  function resetReserveSupply(uint256 amount) onlyOwner external  {
      mintedPerRarity[4] =amount;
  }

  function setlockStatusNFT(uint256 tokenId, bool status) isValid external {
    require(nftLock[tokenId] != status, "status already set");
    nftLock[tokenId] = status;
  }

  function lockNFTBulk(uint256[] memory tokenIds, bool status) isValid external {
    for (uint256 index = 0; index < tokenIds.length; index++) {
      nftLock[tokenIds[index]] = status;
    }
  }

  function setRoyalty(uint256 _amount) onlyOwner public {
      royalty = _amount;
  }

  function getAuthor(uint256 tokenId) public view returns(address){
      return seller;
  }

  function getRoyaltyFee(uint256 tokenId) public view returns(uint256){
      return royalty;
  }

  function getCreator(uint256 tokenId) public view returns(address){
      return seller;
  }


  


  
  function setBaseURI(string memory baseURI_) external onlyOwner {
    baseURI = baseURI_;
    emit BaseURI(baseURI);
  }
   function _baseURI() internal view virtual override returns (string memory) {
      return baseURI;
    }

 /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

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

    

    fallback() payable external {}
    receive() payable external {}

  // events
  event BaseURI(string uri);
  event Burn(uint256 tokenId);
  event AdminTransfer(address from, address to, uint256 indexed tokenId);
  event AddRound(uint256 indexed roundId, uint256 price, address seller, uint256 perPurchaseLimit, uint256 userPurchaseLimit, bool isPublic, uint256 startTime, uint256 endTime, uint256 maxSupply );
  event EditRound(uint256 indexed roundId, uint256 price, address seller, uint256 perPurchaseLimit, uint256 userPurchaseLimit, bool isPublic, uint256 startTime, uint256 endTime, uint256 maxSupply );
  event PurchaseNFT(uint256 from, uint256 to, uint256 price, uint256 paid, address seller, address buyer, uint256[] rarityArray);
  event ClaimNFT(uint256 from, uint256 to, address buyer, uint256[] rarityArray);
  event ReserverNFT( uint256 price, uint256 paid, address seller, address buyer, uint256 limit);
  event CraftNFT(uint256 tokenId, uint256[] tokenIds, address to);
  event Mint(uint256 start, uint256 end, uint256 total, address to, uint256[] rarityArray);
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","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":"uint256","name":"roundId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"address","name":"seller","type":"address"},{"indexed":false,"internalType":"uint256","name":"perPurchaseLimit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"userPurchaseLimit","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isPublic","type":"bool"},{"indexed":false,"internalType":"uint256","name":"startTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxSupply","type":"uint256"}],"name":"AddRound","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"AdminTransfer","type":"event"},{"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":"BaseURI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"from","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"to","type":"uint256"},{"indexed":false,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"rarityArray","type":"uint256[]"}],"name":"ClaimNFT","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"address","name":"to","type":"address"}],"name":"CraftNFT","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"roundId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"address","name":"seller","type":"address"},{"indexed":false,"internalType":"uint256","name":"perPurchaseLimit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"userPurchaseLimit","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isPublic","type":"bool"},{"indexed":false,"internalType":"uint256","name":"startTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxSupply","type":"uint256"}],"name":"EditRound","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"start","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"end","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"total","type":"uint256"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"rarityArray","type":"uint256[]"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"from","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"to","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"paid","type":"uint256"},{"indexed":false,"internalType":"address","name":"seller","type":"address"},{"indexed":false,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"rarityArray","type":"uint256[]"}],"name":"PurchaseNFT","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"paid","type":"uint256"},{"indexed":false,"internalType":"address","name":"seller","type":"address"},{"indexed":false,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"limit","type":"uint256"}],"name":"ReserverNFT","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"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_allowAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"_leaf","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_add","type":"address"}],"name":"addAllowAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"adminTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burnAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"uint256","name":"limit","type":"uint256"},{"internalType":"bool","name":"isLimit","type":"bool"},{"internalType":"uint256","name":"whiteListType","type":"uint256"}],"name":"buyDeemoNFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"claimDeemoNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"craftDeemo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getAuthor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getCreator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"getIsTransferAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"whitelisType","type":"uint256"}],"name":"getRootHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getRoyaltyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"whitelistType","type":"uint256"}],"name":"getSaleDetails","outputs":[{"internalType":"uint256","name":"_startTime","type":"uint256"},{"internalType":"uint256","name":"_endTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_add","type":"address"},{"internalType":"uint256","name":"whitelistType","type":"uint256"}],"name":"getUserBoughtCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isTransferAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint256","name":"whiteListType","type":"uint256"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"bool","name":"status","type":"bool"}],"name":"lockNFTBulk","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to_","type":"address"},{"internalType":"uint256","name":"countNFTs_","type":"uint256"}],"name":"mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mintedPerRarity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nftLock","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"preOrderDeemoNFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_add","type":"address"}],"name":"removeAllowAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"resetReserveSupply","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":"safeTransferFrom","outputs":[],"stateMutability":"payable","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_add","type":"address"}],"name":"setAuthor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"supply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startTime","type":"uint256"},{"internalType":"uint256","name":"_endTime","type":"uint256"},{"internalType":"uint256","name":"whitelistType","type":"uint256"}],"name":"setSaleDetails","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_seed","type":"uint256"}],"name":"setSeed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_status","type":"uint256"}],"name":"setStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"rarity","type":"uint256"},{"internalType":"uint256","name":"supply","type":"uint256"}],"name":"setSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_add","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"setTransferAllowed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"},{"internalType":"uint256","name":"whitelistType","type":"uint256"},{"internalType":"bool","name":"isReserve","type":"bool"}],"name":"setWhitelistRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bool","name":"status","type":"bool"}],"name":"setlockStatusNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"status","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"supplyPerRarity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenRarity","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":"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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040523480156200001157600080fd5b50604080518082018252601381527f4445454d4f20544845204d4f564945204e4654000000000000000000000000006020808301918252835180850190945260058452644445454d4f60d81b908401528151733cc6cdda760b79bafa08df41ecfa224f810dceb6936001939290916200008d91600291620004d8565b508051620000a3906003906020840190620004d8565b50600160005550506daaeb6d7670e522a718067333cd4e3b15620001f05780156200013e57604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b1580156200011f57600080fd5b505af115801562000134573d6000803e3d6000fd5b50505050620001f0565b6001600160a01b038216156200018f5760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af29039060440162000104565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401600060405180830381600087803b158015620001d657600080fd5b505af1158015620001eb573d6000803e3d6000fd5b505050505b50620001fe905033620002b5565b6200020933620002b5565b336000908152600a60205260409020805460ff1916600117905562000242730a48bc1e082e6f923f9a5b1c044c1780dd2a882162000307565b6200024f33600162000378565b6200027e7faaf83cc9f706b3a917bb1d952f10234215acfc29e118ceb18a935081f0bda7f16002600162000460565b60405180606001604052806039815260200162004db3603991398051620002ae91600991602090910190620004d8565b50620005ba565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6008546001600160a01b03163314620003565760405162461bcd60e51b8152602060048201819052602482015260008051602062004dec83398151915260448201526064015b60405180910390fd5b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b6008546001600160a01b03163314620003c35760405162461bcd60e51b8152602060048201819052602482015260008051602062004dec83398151915260448201526064016200034d565b6001600160a01b03821660009081526019602052604090205481151560ff909116151503620004355760405162461bcd60e51b815260206004820152601c60248201527f58616e616c616e643a2073746174757320616c7265616479207365740000000060448201526064016200034d565b6001600160a01b03919091166000908152601960205260409020805460ff1916911515919091179055565b6008546001600160a01b03163314620004ab5760405162461bcd60e51b8152602060048201819052602482015260008051602062004dec83398151915260448201526064016200034d565b6000918252600b602090815260408084209490945560189052919020805460ff1916911515919091179055565b828054620004e6906200057e565b90600052602060002090601f0160209004810192826200050a576000855562000555565b82601f106200052557805160ff191683800117855562000555565b8280016001018555821562000555579182015b828111156200055557825182559160200191906001019062000538565b506200056392915062000567565b5090565b5b8082111562000563576000815560010162000568565b600181811c908216806200059357607f821691505b602082108103620005b457634e487b7160e01b600052602260045260246000fd5b50919050565b6147e980620005ca6000396000f3fe6080604052600436106103765760003560e01c806370a08231116101cf578063a8b8042811610101578063d1f8e7731161009a578063f17e48ec1161006c578063f17e48ec14610af7578063f2fde38b14610b17578063f854c89814610b37578063fc784d4914610b6457005b8063d1f8e77314610a6e578063d48e638a146108e1578063e02f8e1f14610a8e578063e985e9c514610aae57005b8063b88d4fde116100d3578063b88d4fde146109fb578063bc8d4cd614610a0e578063c32a50f914610a2e578063c87b56dd14610a4e57005b8063a8b804281461096e578063afb0a3691461098e578063b481630d146109bb578063b61d0c63146109db57005b80638f868a16116101735780639e2b8488116101455780639e2b8488146108e15780639e4c01411461090c578063a05f41a41461092e578063a22cb4651461094e57005b80638f868a161461088457806391b7f5ed1461089757806395d89b41146108b757806398d5fdca146108cc57005b80638101090d116101ac5780638101090d146107e15780638822048e146108015780638c746d8b146108315780638da5cb5b1461086657005b806370a082311461078c578063715018a6146107ac57806374f32b3e146107c157005b806340c10f19116102a857806355f804b31161024c57806369ba1a751161021e57806369ba1a751461071757806369ff1a81146107375780636c0360eb146107575780636f8b44b01461076c57005b806355f804b3146106a457806357a9d3bc146106c45780636352211e146106e4578063666c00aa1461070457005b806342842e0e1161028557806342842e0e1461061c578063495d81511461062f5780634c0f38c21461065f578063521b52a41461067457005b806340c10f19146105a557806341f43434146105da5780634209a2e1146105fc57005b8063118aa48b1161031a57806323922f86116102ec57806323922f861461052257806323b872dd1461054257806331a365de146105555780633b035df61461057557005b8063118aa48b146104c2578063126fe62d146104d757806318160ddd146104f7578063200d2ed21461050c57005b806306fdde031161035357806306fdde0314610428578063081812fc1461044a578063093abc8614610482578063095ea7b3146104af57005b806301ffc9a71461037f578063038bddfa146103b4578063057c2c6a146103ef57005b3661037d57005b005b34801561038b57600080fd5b5061039f61039a366004613c1f565b610b84565b60405190151581526020015b60405180910390f35b3480156103c057600080fd5b506103e16103cf366004613c3c565b60116020526000908152604090205481565b6040519081526020016103ab565b3480156103fb57600080fd5b5061039f61040a366004613c6c565b6001600160a01b031660009081526019602052604090205460ff1690565b34801561043457600080fd5b5061043d610bd6565b6040516103ab9190613cdf565b34801561045657600080fd5b5061046a610465366004613c3c565b610c68565b6040516001600160a01b0390911681526020016103ab565b34801561048e57600080fd5b506103e161049d366004613c3c565b6000908152600b602052604090205490565b61037d6104bd366004613cf2565b610cac565b3480156104ce57600080fd5b5061037d610db2565b3480156104e357600080fd5b5061037d6104f2366004613c6c565b611212565b34801561050357600080fd5b506103e1611272565b34801561051857600080fd5b506103e1600d5481565b34801561052e57600080fd5b5061037d61053d366004613d2a565b611280565b61037d610550366004613d5a565b61132a565b34801561056157600080fd5b5061037d610570366004613d96565b6114bf565b34801561058157600080fd5b5061039f610590366004613c3c565b6000908152601a602052604090205460ff1690565b3480156105b157600080fd5b506105c56105c0366004613cf2565b611516565b604080519283526020830191909152016103ab565b3480156105e657600080fd5b5061046a6daaeb6d7670e522a718067333cd4e81565b34801561060857600080fd5b5061037d610617366004613c3c565b61181a565b61037d61062a366004613d5a565b611849565b34801561063b57600080fd5b5061039f61064a366004613c3c565b601a6020526000908152604090205460ff1681565b34801561066b57600080fd5b50600c546103e1565b34801561068057600080fd5b5061039f61068f366004613c6c565b600a6020526000908152604090205460ff1681565b3480156106b057600080fd5b5061037d6106bf366004613e6c565b6119d3565b3480156106d057600080fd5b506103e16106df366004613cf2565b611a4c565b3480156106f057600080fd5b5061046a6106ff366004613c3c565b611a74565b61037d610712366004613ef8565b611a7f565b34801561072357600080fd5b5061037d610732366004613c3c565b61213f565b34801561074357600080fd5b5061037d610752366004613c6c565b61216e565b34801561076357600080fd5b5061043d6121d4565b34801561077857600080fd5b5061037d610787366004613c3c565b612262565b34801561079857600080fd5b506103e16107a7366004613c6c565b612291565b3480156107b857600080fd5b5061037d6122df565b3480156107cd57600080fd5b5061039f6107dc366004613f5e565b612315565b3480156107ed57600080fd5b5061037d6107fc366004614041565b612374565b34801561080d57600080fd5b5061039f61081c366004613c6c565b60196020526000908152604090205460ff1681565b34801561083d57600080fd5b506105c561084c366004613c3c565b600090815260166020526040902080546001909101549091565b34801561087257600080fd5b506008546001600160a01b031661046a565b61037d610892366004614075565b612593565b3480156108a357600080fd5b5061037d6108b2366004613c3c565b612916565b3480156108c357600080fd5b5061043d612945565b3480156108d857600080fd5b50600e546103e1565b3480156108ed57600080fd5b5061046a6108fc366004613c3c565b50600f546001600160a01b031690565b34801561091857600080fd5b506103e1610927366004613c3c565b5060105490565b34801561093a57600080fd5b5061037d610949366004613c6c565b612954565b34801561095a57600080fd5b5061037d6109693660046140c0565b6129a0565b34801561097a57600080fd5b5061037d6109893660046140c0565b612a9c565b34801561099a57600080fd5b506103e16109a9366004613c3c565b60146020526000908152604090205481565b3480156109c757600080fd5b5061037d6109d63660046140ec565b612b61565b3480156109e757600080fd5b506103e16109f6366004613cf2565b612bc5565b61037d610a09366004614118565b612c02565b348015610a1a57600080fd5b5061037d610a29366004614193565b612d93565b348015610a3a57600080fd5b5061037d610a49366004613c3c565b612e25565b348015610a5a57600080fd5b5061043d610a69366004613c3c565b612e54565b348015610a7a57600080fd5b5061037d610a89366004613c3c565b612f1f565b348015610a9a57600080fd5b5061037d610aa9366004613c3c565b612f65565b348015610aba57600080fd5b5061039f610ac93660046141d9565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b348015610b0357600080fd5b5061037d610b12366004613cf2565b612fcd565b348015610b2357600080fd5b5061037d610b32366004613c6c565b613095565b348015610b4357600080fd5b506103e1610b52366004613c3c565b60126020526000908152604090205481565b348015610b7057600080fd5b5061037d610b7f36600461420c565b613130565b60006301ffc9a760e01b6001600160e01b031983161480610bb557506380ac58cd60e01b6001600160e01b03198316145b80610bd05750635b5e139f60e01b6001600160e01b03198316145b92915050565b606060028054610be59061422e565b80601f0160208091040260200160405190810160405280929190818152602001828054610c119061422e565b8015610c5e5780601f10610c3357610100808354040283529160200191610c5e565b820191906000526020600020905b815481529060010190602001808311610c4157829003601f168201915b5050505050905090565b6000610c738261316c565b610c90576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b816daaeb6d7670e522a718067333cd4e3b15610d6b57604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610d1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d3e9190614268565b610d6b57604051633b79c77360e21b81526001600160a01b03821660048201526024015b60405180910390fd5b6001600160a01b03831660009081526019602052604090205460ff16610da35760405162461bcd60e51b8152600401610d6290614285565b610dad83836131a1565b505050565b333214610dd15760405162461bcd60e51b8152600401610d62906142bc565b33600090815260176020908152604080832060038452909152808220546002835291205411610e305760405162461bcd60e51b815260206004820152600b60248201526a63616e277420636c61696d60a81b6044820152606401610d62565b600360005260166020527ff06d282f967055cb1eee17e04aa005b9682a620f4bbcfaee55ba78607a3d87ae54421015610e7b5760405162461bcd60e51b8152600401610d62906142d9565b600360005260166020527ff06d282f967055cb1eee17e04aa005b9682a620f4bbcfaee55ba78607a3d87af544210610ec55760405162461bcd60e51b8152600401610d6290614307565b33600090815260176020908152604080832060038452909152808220546002835290822054610ef49190614345565b600c5460026000908152601160205260008051602061473483398151915254929350918291610f2e91610f289060646131b1565b906131bd565b600054909150610f3e33856131c9565b60006001600054610f4f9190614345565b9050815b81811161111d576001600081905260126020527f71a67924699a20698523213e55fe499d539379d7769cd5567e2c45d583f815a354610f919161435c565b600160005260116020526000805160206147948339815191525411610fb957600294506110aa565b600260005260126020527f8e1fee8c88a9e04123b21e90cae2727a7715bf522a1e46eb5934ccd05203a6b254610ff090600161435c565b60026000526011602052600080516020614734833981519152541161101857600194506110aa565b6064611022611272565b87601354611030919061435c565b61103a919061435c565b82601354611048919061435c565b423261105c6008546001600160a01b031690565b604051602001611070959493929190614374565b6040516020818303038152906040528051906020012060001c61109391906143b9565b94508484106110a557600194506110aa565b600294505b60008581526012602052604081208054916110c4836143cd565b909155505060008181526014602052604081208690556015805460018101825591527f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec4750185905580611115816143cd565b915050610f53565b50336000908152601760209081526040808320600384529091528120805487929061114990849061435c565b90915550506004600090815260126020526000805160206147548339815191528054879290611179908490614345565b90915550506005600090815260126020527f45429b9195d4ec5c0cf6c69e9c21a4ca0ea773b702c2de5735f85d2631f2674680548792906111bb90849061435c565b90915550506040517f1792056aee2ac57eeca1667413b6b31a2ae948a883ac44b1333f251fcfe45144906111f790849084903390601590614426565b60405180910390a161120b60156000613b52565b5050505050565b6008546001600160a01b0316331461123c5760405162461bcd60e51b8152600401610d6290614453565b6001600160a01b03166000908152600a60209081526040808320805460ff19908116909155601990925290912080549091169055565b600154600054036000190190565b336000908152600a602052604090205460ff166112af5760405162461bcd60e51b8152600401610d6290614488565b6000828152601a602052604090205481151560ff90911615150361130a5760405162461bcd60e51b81526020600482015260126024820152711cdd185d1d5cc8185b1c9958591e481cd95d60721b6044820152606401610d62565b6000918252601a6020526040909120805460ff1916911515919091179055565b826daaeb6d7670e522a718067333cd4e3b1561145057336001600160a01b038216036113be573360009081526019602052604090205460ff1661137f5760405162461bcd60e51b8152600401610d6290614285565b6000828152601a602052604090205460ff16156113ae5760405162461bcd60e51b8152600401610d62906144af565b6113b98484846131e3565b6114b9565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa15801561140d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114319190614268565b61145057604051633b79c77360e21b8152336004820152602401610d62565b3360009081526019602052604090205460ff1661147f5760405162461bcd60e51b8152600401610d6290614285565b6000828152601a602052604090205460ff16156114ae5760405162461bcd60e51b8152600401610d62906144af565b6114b98484846131e3565b50505050565b6008546001600160a01b031633146114e95760405162461bcd60e51b8152600401610d6290614453565b6000918252600b602090815260408084209490945560189052919020805460ff1916911515919091179055565b336000908152600a6020526040812054819060ff166115475760405162461bcd60e51b8152600401610d6290614488565b82611550611272565b61155a919061435c565b600c54101561159e5760405162461bcd60e51b815260206004820152601060248201526f657863656564696e6720737570706c7960801b6044820152606401610d62565b6000546115ab85856131c9565b600060016000546115bc9190614345565b600c54600260009081526011602052600080516020614734833981519152549293509182916115f091610f289060646131b1565b9050835b8381116117be576001600081905260126020527f71a67924699a20698523213e55fe499d539379d7769cd5567e2c45d583f815a3546116329161435c565b60016000526011602052600080516020614794833981519152541161165a576002925061174b565b600260005260126020527f8e1fee8c88a9e04123b21e90cae2727a7715bf522a1e46eb5934ccd05203a6b25461169190600161435c565b6002600052601160205260008051602061473483398151915254116116b9576001925061174b565b60646116c3611272565b896013546116d1919061435c565b6116db919061435c565b826013546116e9919061435c565b42326116fd6008546001600160a01b031690565b604051602001611711959493929190614374565b6040516020818303038152906040528051906020012060001c61173491906143b9565b9250828210611746576001925061174b565b600292505b6000838152601260205260408120805491611765836143cd565b909155505060008181526014602052604081208490556015805460018101825591527f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec47501839055806117b6816143cd565b9150506115f4565b507ff211e5fddaaec6aa0c1783f48763e1358d822b2b483652026f1c4100d2b79d198484898b60156040516117f79594939291906144de565b60405180910390a161180b60156000613b52565b509193509150505b9250929050565b6008546001600160a01b031633146118445760405162461bcd60e51b8152600401610d6290614453565b601055565b826daaeb6d7670e522a718067333cd4e3b1561196a57336001600160a01b038216036118d8573360009081526019602052604090205460ff1661189e5760405162461bcd60e51b8152600401610d6290614285565b6000828152601a602052604090205460ff16156118cd5760405162461bcd60e51b8152600401610d62906144af565b6113b9848484613373565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611927573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061194b9190614268565b61196a57604051633b79c77360e21b8152336004820152602401610d62565b3360009081526019602052604090205460ff166119995760405162461bcd60e51b8152600401610d6290614285565b6000828152601a602052604090205460ff16156119c85760405162461bcd60e51b8152600401610d62906144af565b6114b9848484613373565b6008546001600160a01b031633146119fd5760405162461bcd60e51b8152600401610d6290614453565b8051611a10906009906020840190613b70565b507f01e56a02aca7f26a28165a040851ba78f30282b55ca81c63a804cdc1e2dcea726009604051611a419190614511565b60405180910390a150565b6001600160a01b03919091166000908152601760209081526040808320938352929052205490565b6000610bd08261338e565b333214611a9e5760405162461bcd60e51b8152600401610d62906142bc565b600081815260166020526040902054421015611acc5760405162461bcd60e51b8152600401610d62906142d9565b6000818152601660205260409020600101544210611afc5760405162461bcd60e51b8152600401610d6290614307565b60008181526018602052604090205460ff1615611b4b5760405162461bcd60e51b815260206004820152600d60248201526c6e6f2076616c6964207479706560981b6044820152606401610d62565b600082611b59576000611b6e565b83611b643384611a4c565b611b6e919061435c565b9050600d54600103611ba357611b873387878486612315565b611ba35760405162461bcd60e51b8152600401610d6290614488565b600d54600003611be95760405162461bcd60e51b81526020600482015260116024820152701cd85b195cc81b9bdd081cdd185c9d1959607a1b6044820152606401610d62565b83611bf2611272565b611bfc919061435c565b6004600052601260205260008051602061475483398151915254600c54611c239190614345565b1015611c5b5760405162461bcd60e51b81526020600482015260076024820152661cdbdb191bdd5d60ca1b6044820152606401610d62565b83611c64611272565b611c6e919061435c565b601160205260008051602061473483398151915254600160005260008051602061479483398151915254611ca2919061435c565b1015611cde5760405162461bcd60e51b815260206004820152600b60248201526a0d8d2dad2e840e4cac2c6d60ab1b6044820152606401610d62565b600e54600c54600260009081526011602052600080516020614734833981519152549092349290918491611d1791610f289060646131b1565b9050611d2388836145b8565b915082821115611d5f5760405162461bcd60e51b815260206004820152600760248201526609c8ca8406260760cb1b6044820152606401610d62565b600054611d6c338a6131c9565b60006001600054611d7d9190614345565b9050815b818111611f4b576001600081905260126020527f71a67924699a20698523213e55fe499d539379d7769cd5567e2c45d583f815a354611dbf9161435c565b600160005260116020526000805160206147948339815191525411611de75760029650611ed8565b600260005260126020527f8e1fee8c88a9e04123b21e90cae2727a7715bf522a1e46eb5934ccd05203a6b254611e1e90600161435c565b600260005260116020526000805160206147348339815191525411611e465760019650611ed8565b6064611e50611272565b8c601354611e5e919061435c565b611e68919061435c565b82601354611e76919061435c565b4232611e8a6008546001600160a01b031690565b604051602001611e9e959493929190614374565b6040516020818303038152906040528051906020012060001c611ec191906143b9565b9650868410611ed35760019650611ed8565b600296505b6000878152601260205260408120805491611ef2836143cd565b909155505060008181526014602052604081208890556015805460018101825591527f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec4750187905580611f43816143cd565b915050611d81565b503360009081526017602090815260408083208b8452909152902054611f72908b9061435c565b3360009081526017602090815260408083208c845290915280822092909255600f54915190916001600160a01b03169086908381818185875af1925050503d8060008114611fdc576040519150601f19603f3d011682016040523d82523d6000602084013e611fe1565b606091505b505090508061202a5760405162461bcd60e51b81526020600482015260156024820152740eadcc2c4d8ca40e8de40e4cac6cad2ecca40cae8d605b1b6044820152606401610d62565b60006120368688614345565b11156120d057336120478688614345565b604051600081818185875af1925050503d8060008114612083576040519150601f19603f3d011682016040523d82523d6000602084013e612088565b606091505b505080915050806120d05760405162461bcd60e51b81526020600482015260126024820152710eadcc2c4d8ca40e8de40e6cadcc840cae8d60731b6044820152606401610d62565b600e54600f546040517fcaf4d10f77a1e37f464f6b74bd3d60d54e92ee3fc9b6151ff0910774cde689d09261211c9287928792918b916001600160a01b039091169033906015906145d7565b60405180910390a161213060156000613b52565b50505050505050505050505050565b6008546001600160a01b031633146121695760405162461bcd60e51b8152600401610d6290614453565b600d55565b6008546001600160a01b031633146121985760405162461bcd60e51b8152600401610d6290614453565b6001600160a01b03166000908152600a602090815260408083208054600160ff1991821681179092556019909352922080549091169091179055565b600980546121e19061422e565b80601f016020809104026020016040519081016040528092919081815260200182805461220d9061422e565b801561225a5780601f1061222f5761010080835404028352916020019161225a565b820191906000526020600020905b81548152906001019060200180831161223d57829003601f168201915b505050505081565b6008546001600160a01b0316331461228c5760405162461bcd60e51b8152600401610d6290614453565b600c55565b60006001600160a01b0382166122ba576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b031633146123095760405162461bcd60e51b8152600401610d6290614453565b612313600061341a565b565b600061236a6123248785612bc5565b8686808060200260200160405190810160405280939291908181526020018383602002808284376000920182905250888152600b6020526040902054925061346c915050565b9695505050505050565b80516005146123c55760405162461bcd60e51b815260206004820152601b60248201527f6e656564203520636f6d6d6f6e206e66747320746f20637261667400000000006044820152606401610d62565b600360005260126020527f0f36ad39aee03e7108cc48f54934702a5f0d4066f10344cebf8198978d86976a546123fc90600161435c565b600360005260116020527f9bfbaa59f8e10e7868f8b402de9d605a390c45ddaebd8c9de3c6f31e733c87ff5410156124805760405162461bcd60e51b815260206004820152602160248201527f4d617820737570706c79207265616368656420666f72206372616674207261726044820152606560f81b6064820152608401610d62565b600061248b82613481565b9050806124e95760405162461bcd60e51b815260206004820152602660248201527f4f6e65206f72206d6f726520746f6b656e206964206973206e6f742076616c6960448201526564207479706560d01b6064820152608401610d62565b600080546124f890600161435c565b90506125053360016131c9565b600081815260146020908152604082206002905560038252601290527f0f36ad39aee03e7108cc48f54934702a5f0d4066f10344cebf8198978d86976a80549161254e836143cd565b91905055507f815a6b801d6f526f9c991ab39f19a3d9d45e21169f8ad53b728ca266d578e6bb81843360405161258693929190614627565b60405180910390a1505050565b3332146125b25760405162461bcd60e51b8152600401610d62906142bc565b6002600081905260166020527fcaff291fe014adc6b72a172705750b4cabe8f8667664d2924a166caab2885648544210156125ff5760405162461bcd60e51b8152600401610d62906142d9565b600081815260166020526040902060010154421061262f5760405162461bcd60e51b8152600401610d6290614307565b60008261263c3384611a4c565b612646919061435c565b90506126553386868486612315565b6126715760405162461bcd60e51b8152600401610d6290614488565b6004600052601260205260008051602061475483398151915254600c5410156126c65760405162461bcd60e51b81526020600482015260076024820152661cdbdb191bdd5d60ca1b6044820152606401610d62565b600e5434906126d585826145b8565b9050818111156127115760405162461bcd60e51b815260206004820152600760248201526609c8ca8406260760cb1b6044820152606401610d62565b600460009081526012602052600080516020614754833981519152805487929061273c90849061435c565b9091555050600f546040516000916001600160a01b03169083908381818185875af1925050503d806000811461278e576040519150601f19603f3d011682016040523d82523d6000602084013e612793565b606091505b50509050806127dc5760405162461bcd60e51b81526020600482015260156024820152740eadcc2c4d8ca40e8de40e4cac6cad2ecca40cae8d605b1b6044820152606401610d62565b60006127e88385614345565b111561288257336127f98385614345565b604051600081818185875af1925050503d8060008114612835576040519150601f19603f3d011682016040523d82523d6000602084013e61283a565b606091505b505080915050806128825760405162461bcd60e51b81526020600482015260126024820152710eadcc2c4d8ca40e8de40e6cadcc840cae8d60731b6044820152606401610d62565b336000908152601760209081526040808320888452909152812080548892906128ac90849061435c565b9091555050600e54600f5460408051928352602083018590526001600160a01b039091168282015233606083015260808201889052517f9592d3701341da076dc734011f1448f436d27721edd662a432632e455e6873d89181900360a00190a15050505050505050565b6008546001600160a01b031633146129405760405162461bcd60e51b8152600401610d6290614453565b600e55565b606060038054610be59061422e565b6008546001600160a01b0316331461297e5760405162461bcd60e51b8152600401610d6290614453565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b816daaeb6d7670e522a718067333cd4e3b15612a5a57604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015612a0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a329190614268565b612a5a57604051633b79c77360e21b81526001600160a01b0382166004820152602401610d62565b6001600160a01b03831660009081526019602052604090205460ff16612a925760405162461bcd60e51b8152600401610d6290614285565b610dad83836134f4565b6008546001600160a01b03163314612ac65760405162461bcd60e51b8152600401610d6290614453565b6001600160a01b03821660009081526019602052604090205481151560ff909116151503612b365760405162461bcd60e51b815260206004820152601c60248201527f58616e616c616e643a2073746174757320616c726561647920736574000000006044820152606401610d62565b6001600160a01b03919091166000908152601960205260409020805460ff1916911515919091179055565b6008546001600160a01b03163314612b8b5760405162461bcd60e51b8152600401610d6290614453565b6040805160608101825293845260208085019384526000858301818152938152601690915220925183559051600183015551600290910155565b604080516001600160a01b038416602082015290810182905260009060600160405160208183030381529060405280519060200120905092915050565b836daaeb6d7670e522a718067333cd4e3b15612d2957336001600160a01b03821603612c97573360009081526019602052604090205460ff16612c575760405162461bcd60e51b8152600401610d6290614285565b6000838152601a602052604090205460ff1615612c865760405162461bcd60e51b8152600401610d62906144af565b612c9285858585613560565b61120b565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015612ce6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d0a9190614268565b612d2957604051633b79c77360e21b8152336004820152602401610d62565b3360009081526019602052604090205460ff16612d585760405162461bcd60e51b8152600401610d6290614285565b6000838152601a602052604090205460ff1615612d875760405162461bcd60e51b8152600401610d62906144af565b61120b85858585613560565b336000908152600a602052604090205460ff16612dc25760405162461bcd60e51b8152600401610d6290614488565b60005b8251811015610dad5781601a6000858481518110612de557612de561468a565b6020026020010151815260200190815260200160002060006101000a81548160ff0219169083151502179055508080612e1d906143cd565b915050612dc5565b6008546001600160a01b03163314612e4f5760405162461bcd60e51b8152600401610d6290614453565b601355565b6060612e5f8261316c565b612ec35760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610d62565b6000612ecd6135a4565b90506000815111612eed5760405180602001604052806000815250612f18565b80612ef7846135b3565b604051602001612f089291906146a0565b6040516020818303038152906040525b9392505050565b6008546001600160a01b03163314612f495760405162461bcd60e51b8152600401610d6290614453565b6004600052601260205260008051602061475483398151915255565b336000908152600a602052604090205460ff16612f945760405162461bcd60e51b8152600401610d6290614488565b612f9d816136b3565b6040518181527fb90306ad06b2a6ff86ddc9327db583062895ef6540e62dc50add009db5b356eb90602001611a41565b336000908152600a602052604090205460ff16612ffc5760405162461bcd60e51b8152600401610d6290614488565b600061300782611a74565b6001600160a01b03811660009081526007602090815260408083203384528252808320805460ff19166001179055858352601a90915290205490915060ff161561308a576000828152601a60205260409020805460ff1916905561306c81848461132a565b6000828152601a60205260409020805460ff19166001179055505050565b610dad81848461132a565b6008546001600160a01b031633146130bf5760405162461bcd60e51b8152600401610d6290614453565b6001600160a01b0381166131245760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d62565b61312d8161341a565b50565b6008546001600160a01b0316331461315a5760405162461bcd60e51b8152600401610d6290614453565b60009182526011602052604090912055565b600081600111158015613180575060005482105b8015610bd0575050600090815260046020526040902054600160e01b161590565b6131ad828260016136be565b5050565b6000612f1882846145b8565b6000612f1882846146cf565b6131ad828260405180602001604052806000815250613765565b60006131ee8261338e565b9050836001600160a01b0316816001600160a01b0316146132215760405162a1148160e81b815260040160405180910390fd5b6000828152600660205260409020805461324d8187335b6001600160a01b039081169116811491141790565b6132785761325b8633610ac9565b61327857604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03851661329f57604051633a954ecd60e21b815260040160405180910390fd5b80156132aa57600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040812091909155600160e11b8416900361333c5760018401600081815260046020526040812054900361333a57600054811461333a5760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b031660008051602061477483398151915260405160405180910390a4505050505050565b610dad83838360405180602001604052806000815250612c02565b600081600111613401575060008181526004602052604081205490600160e01b8216900361340157806000036133fc5760005482106133e057604051636f96cda160e11b815260040160405180910390fd5b5b506000190160008181526004602052604090205480156133e1575b919050565b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006134798383866137cb565b949350505050565b60016000805b83518110156134ed578381815181106134a2576134a261468a565b6020026020010151915060146000838152602001908152602001600020546001146134d057600092506134ed565b6134db8260016137e1565b806134e5816143cd565b915050613487565b5050919050565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61356b84848461132a565b6001600160a01b0383163b156114b95761358784848484613919565b6114b9576040516368d2bf6b60e11b815260040160405180910390fd5b606060098054610be59061422e565b6060816000036135da5750506040805180820190915260018152600360fc1b602082015290565b8160005b811561360457806135ee816143cd565b91506135fd9050600a836146cf565b91506135de565b6000816001600160401b0381111561361e5761361e613dcf565b6040519080825280601f01601f191660200182016040528015613648576020820181803683370190505b5090505b84156134795761365d600183614345565b915061366a600a866143b9565b61367590603061435c565b60f81b81838151811061368a5761368a61468a565b60200101906001600160f81b031916908160001a9053506136ac600a866146cf565b945061364c565b61312d8160006137e1565b60006136c983611a74565b9050811561370857336001600160a01b03821614613708576136eb8133610ac9565b613708576040516367d9dca160e11b815260040160405180910390fd5b60008381526006602052604080822080546001600160a01b0319166001600160a01b0388811691821790925591518693918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a450505050565b61376f8383613a04565b6001600160a01b0383163b15610dad576000548281035b6137996000868380600101945086613919565b6137b6576040516368d2bf6b60e11b815260040160405180910390fd5b81811061378657816000541461120b57600080fd5b6000826137d88584613ade565b14949350505050565b60006137ec8361338e565b90508060008061380a86600090815260066020526040902080549091565b91509150841561384a5761381f818433613238565b61384a5761382d8333610ac9565b61384a57604051632ce44b5f60e11b815260040160405180910390fd5b801561385557600082555b6001600160a01b038316600081815260056020526040902080546fffffffffffffffffffffffffffffffff0190554260a01b17600360e01b17600087815260046020526040812091909155600160e11b851690036138e3576001860160008181526004602052604081205490036138e15760005481146138e15760008181526004602052604090208590555b505b60405186906000906001600160a01b03861690600080516020614774833981519152908390a45050600180548101905550505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a029061394e9033908990889088906004016146e3565b6020604051808303816000875af1925050508015613989575060408051601f3d908101601f1916820190925261398691810190614716565b60015b6139e7573d8080156139b7576040519150601f19603f3d011682016040523d82523d6000602084013e6139bc565b606091505b5080516000036139df576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6000805490829003613a295760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083906000805160206147748339815191528180a4600183015b818114613ab45780836000600080516020614774833981519152600080a4600101613a8e565b5081600003613ad557604051622e076360e81b815260040160405180910390fd5b60005550505050565b600081815b8451811015613b4a576000858281518110613b0057613b0061468a565b60200260200101519050808311613b265760008381526020829052604090209250613b37565b600081815260208490526040902092505b5080613b42816143cd565b915050613ae3565b509392505050565b508054600082559060005260206000209081019061312d9190613bf4565b828054613b7c9061422e565b90600052602060002090601f016020900481019282613b9e5760008555613be4565b82601f10613bb757805160ff1916838001178555613be4565b82800160010185558215613be4579182015b82811115613be4578251825591602001919060010190613bc9565b50613bf0929150613bf4565b5090565b5b80821115613bf05760008155600101613bf5565b6001600160e01b03198116811461312d57600080fd5b600060208284031215613c3157600080fd5b8135612f1881613c09565b600060208284031215613c4e57600080fd5b5035919050565b80356001600160a01b03811681146133fc57600080fd5b600060208284031215613c7e57600080fd5b612f1882613c55565b60005b83811015613ca2578181015183820152602001613c8a565b838111156114b95750506000910152565b60008151808452613ccb816020860160208601613c87565b601f01601f19169290920160200192915050565b602081526000612f186020830184613cb3565b60008060408385031215613d0557600080fd5b613d0e83613c55565b946020939093013593505050565b801515811461312d57600080fd5b60008060408385031215613d3d57600080fd5b823591506020830135613d4f81613d1c565b809150509250929050565b600080600060608486031215613d6f57600080fd5b613d7884613c55565b9250613d8660208501613c55565b9150604084013590509250925092565b600080600060608486031215613dab57600080fd5b83359250602084013591506040840135613dc481613d1c565b809150509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715613e0d57613e0d613dcf565b604052919050565b60006001600160401b03831115613e2e57613e2e613dcf565b613e41601f8401601f1916602001613de5565b9050828152838383011115613e5557600080fd5b828260208301376000602084830101529392505050565b600060208284031215613e7e57600080fd5b81356001600160401b03811115613e9457600080fd5b8201601f81018413613ea557600080fd5b61347984823560208401613e15565b60008083601f840112613ec657600080fd5b5081356001600160401b03811115613edd57600080fd5b6020830191508360208260051b850101111561181357600080fd5b600080600080600060808688031215613f1057600080fd5b85356001600160401b03811115613f2657600080fd5b613f3288828901613eb4565b909650945050602086013592506040860135613f4d81613d1c565b949793965091946060013592915050565b600080600080600060808688031215613f7657600080fd5b613f7f86613c55565b945060208601356001600160401b03811115613f9a57600080fd5b613fa688828901613eb4565b9699909850959660408101359660609091013595509350505050565b600082601f830112613fd357600080fd5b813560206001600160401b03821115613fee57613fee613dcf565b8160051b613ffd828201613de5565b928352848101820192828101908785111561401757600080fd5b83870192505b848310156140365782358252918301919083019061401d565b979650505050505050565b60006020828403121561405357600080fd5b81356001600160401b0381111561406957600080fd5b61347984828501613fc2565b60008060006040848603121561408a57600080fd5b83356001600160401b038111156140a057600080fd5b6140ac86828701613eb4565b909790965060209590950135949350505050565b600080604083850312156140d357600080fd5b6140dc83613c55565b91506020830135613d4f81613d1c565b60008060006060848603121561410157600080fd5b505081359360208301359350604090920135919050565b6000806000806080858703121561412e57600080fd5b61413785613c55565b935061414560208601613c55565b92506040850135915060608501356001600160401b0381111561416757600080fd5b8501601f8101871361417857600080fd5b61418787823560208401613e15565b91505092959194509250565b600080604083850312156141a657600080fd5b82356001600160401b038111156141bc57600080fd5b6141c885828601613fc2565b9250506020830135613d4f81613d1c565b600080604083850312156141ec57600080fd5b6141f583613c55565b915061420360208401613c55565b90509250929050565b6000806040838503121561421f57600080fd5b50508035926020909101359150565b600181811c9082168061424257607f821691505b60208210810361426257634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561427a57600080fd5b8151612f1881613d1c565b6020808252601c908201527f4552433732313a207472616e73666572206e6f7420616c6c6f77656400000000604082015260600190565b60208082526003908201526231303160e81b604082015260600190565b6020808252601490820152731cd85b19481b9bdd081cdd185c9d1959081e595d60621b604082015260600190565b6020808252600e908201526d1cd85b19481a185cc8195b99195960921b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000828210156143575761435761432f565b500390565b6000821982111561436f5761436f61432f565b500190565b948552602085019390935260408401919091526001600160a01b03908116606084015216608082015260a00190565b634e487b7160e01b600052601260045260246000fd5b6000826143c8576143c86143a3565b500690565b6000600182016143df576143df61432f565b5060010190565b6000815480845260208085019450836000528060002060005b8381101561441b578154875295820195600191820191016143ff565b509495945050505050565b84815283602082015260018060a01b038316604082015260806060820152600061236a60808301846143e6565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252600d908201526c6e6f7420617574686f72697a6560981b604082015260600190565b602080825260159082015274115490cdcc8c4e88139195081a5cc81b1bd8dad959605a1b604082015260600190565b85815284602082015283604082015260018060a01b038316606082015260a06080820152600061403660a08301846143e6565b600060208083526000845481600182811c91508083168061453357607f831692505b858310810361455057634e487b7160e01b85526022600452602485fd5b87860183815260200181801561456d576001811461457e576145a9565b60ff198616825287820196506145a9565b60008b81526020902060005b868110156145a35781548482015290850190890161458a565b83019750505b50949998505050505050505050565b60008160001904831182151516156145d2576145d261432f565b500290565b878152866020820152856040820152846060820152600060018060a01b03808616608084015280851660a08401525060e060c083015261461a60e08301846143e6565b9998505050505050505050565b6000606082018583526020606081850152818651808452608086019150828801935060005b818110156146685784518352938301939183019160010161464c565b50506001600160a01b0395909516604094909401939093525091949350505050565b634e487b7160e01b600052603260045260246000fd5b600083516146b2818460208801613c87565b8351908301906146c6818360208801613c87565b01949350505050565b6000826146de576146de6143a3565b500490565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061236a90830184613cb3565b60006020828403121561472857600080fd5b8151612f1881613c0956fe08037d7b151cc412d25674a4e66b334d9ae9d2e5517a7feaae5cdb828bf1c628b4fcd034df3d20faa1c133b66d862ce92732727d40916b48ffb4020cb00fe053ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef17bc176d2408558f6e4111feebc3cab4e16b63e967be91cde721f4c8a488b552a2646970667358221220af0ce3025bf233a8284e4bc8d1d8c4db4c59a8d888c7cb63690f314c5086355364736f6c634300080d003368747470733a2f2f746573746170692e78616e616c69612e636f6d2f78616e616c69612f6765742d6e66742d6d6574613f746f6b656e49643d4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572

Deployed Bytecode

0x6080604052600436106103765760003560e01c806370a08231116101cf578063a8b8042811610101578063d1f8e7731161009a578063f17e48ec1161006c578063f17e48ec14610af7578063f2fde38b14610b17578063f854c89814610b37578063fc784d4914610b6457005b8063d1f8e77314610a6e578063d48e638a146108e1578063e02f8e1f14610a8e578063e985e9c514610aae57005b8063b88d4fde116100d3578063b88d4fde146109fb578063bc8d4cd614610a0e578063c32a50f914610a2e578063c87b56dd14610a4e57005b8063a8b804281461096e578063afb0a3691461098e578063b481630d146109bb578063b61d0c63146109db57005b80638f868a16116101735780639e2b8488116101455780639e2b8488146108e15780639e4c01411461090c578063a05f41a41461092e578063a22cb4651461094e57005b80638f868a161461088457806391b7f5ed1461089757806395d89b41146108b757806398d5fdca146108cc57005b80638101090d116101ac5780638101090d146107e15780638822048e146108015780638c746d8b146108315780638da5cb5b1461086657005b806370a082311461078c578063715018a6146107ac57806374f32b3e146107c157005b806340c10f19116102a857806355f804b31161024c57806369ba1a751161021e57806369ba1a751461071757806369ff1a81146107375780636c0360eb146107575780636f8b44b01461076c57005b806355f804b3146106a457806357a9d3bc146106c45780636352211e146106e4578063666c00aa1461070457005b806342842e0e1161028557806342842e0e1461061c578063495d81511461062f5780634c0f38c21461065f578063521b52a41461067457005b806340c10f19146105a557806341f43434146105da5780634209a2e1146105fc57005b8063118aa48b1161031a57806323922f86116102ec57806323922f861461052257806323b872dd1461054257806331a365de146105555780633b035df61461057557005b8063118aa48b146104c2578063126fe62d146104d757806318160ddd146104f7578063200d2ed21461050c57005b806306fdde031161035357806306fdde0314610428578063081812fc1461044a578063093abc8614610482578063095ea7b3146104af57005b806301ffc9a71461037f578063038bddfa146103b4578063057c2c6a146103ef57005b3661037d57005b005b34801561038b57600080fd5b5061039f61039a366004613c1f565b610b84565b60405190151581526020015b60405180910390f35b3480156103c057600080fd5b506103e16103cf366004613c3c565b60116020526000908152604090205481565b6040519081526020016103ab565b3480156103fb57600080fd5b5061039f61040a366004613c6c565b6001600160a01b031660009081526019602052604090205460ff1690565b34801561043457600080fd5b5061043d610bd6565b6040516103ab9190613cdf565b34801561045657600080fd5b5061046a610465366004613c3c565b610c68565b6040516001600160a01b0390911681526020016103ab565b34801561048e57600080fd5b506103e161049d366004613c3c565b6000908152600b602052604090205490565b61037d6104bd366004613cf2565b610cac565b3480156104ce57600080fd5b5061037d610db2565b3480156104e357600080fd5b5061037d6104f2366004613c6c565b611212565b34801561050357600080fd5b506103e1611272565b34801561051857600080fd5b506103e1600d5481565b34801561052e57600080fd5b5061037d61053d366004613d2a565b611280565b61037d610550366004613d5a565b61132a565b34801561056157600080fd5b5061037d610570366004613d96565b6114bf565b34801561058157600080fd5b5061039f610590366004613c3c565b6000908152601a602052604090205460ff1690565b3480156105b157600080fd5b506105c56105c0366004613cf2565b611516565b604080519283526020830191909152016103ab565b3480156105e657600080fd5b5061046a6daaeb6d7670e522a718067333cd4e81565b34801561060857600080fd5b5061037d610617366004613c3c565b61181a565b61037d61062a366004613d5a565b611849565b34801561063b57600080fd5b5061039f61064a366004613c3c565b601a6020526000908152604090205460ff1681565b34801561066b57600080fd5b50600c546103e1565b34801561068057600080fd5b5061039f61068f366004613c6c565b600a6020526000908152604090205460ff1681565b3480156106b057600080fd5b5061037d6106bf366004613e6c565b6119d3565b3480156106d057600080fd5b506103e16106df366004613cf2565b611a4c565b3480156106f057600080fd5b5061046a6106ff366004613c3c565b611a74565b61037d610712366004613ef8565b611a7f565b34801561072357600080fd5b5061037d610732366004613c3c565b61213f565b34801561074357600080fd5b5061037d610752366004613c6c565b61216e565b34801561076357600080fd5b5061043d6121d4565b34801561077857600080fd5b5061037d610787366004613c3c565b612262565b34801561079857600080fd5b506103e16107a7366004613c6c565b612291565b3480156107b857600080fd5b5061037d6122df565b3480156107cd57600080fd5b5061039f6107dc366004613f5e565b612315565b3480156107ed57600080fd5b5061037d6107fc366004614041565b612374565b34801561080d57600080fd5b5061039f61081c366004613c6c565b60196020526000908152604090205460ff1681565b34801561083d57600080fd5b506105c561084c366004613c3c565b600090815260166020526040902080546001909101549091565b34801561087257600080fd5b506008546001600160a01b031661046a565b61037d610892366004614075565b612593565b3480156108a357600080fd5b5061037d6108b2366004613c3c565b612916565b3480156108c357600080fd5b5061043d612945565b3480156108d857600080fd5b50600e546103e1565b3480156108ed57600080fd5b5061046a6108fc366004613c3c565b50600f546001600160a01b031690565b34801561091857600080fd5b506103e1610927366004613c3c565b5060105490565b34801561093a57600080fd5b5061037d610949366004613c6c565b612954565b34801561095a57600080fd5b5061037d6109693660046140c0565b6129a0565b34801561097a57600080fd5b5061037d6109893660046140c0565b612a9c565b34801561099a57600080fd5b506103e16109a9366004613c3c565b60146020526000908152604090205481565b3480156109c757600080fd5b5061037d6109d63660046140ec565b612b61565b3480156109e757600080fd5b506103e16109f6366004613cf2565b612bc5565b61037d610a09366004614118565b612c02565b348015610a1a57600080fd5b5061037d610a29366004614193565b612d93565b348015610a3a57600080fd5b5061037d610a49366004613c3c565b612e25565b348015610a5a57600080fd5b5061043d610a69366004613c3c565b612e54565b348015610a7a57600080fd5b5061037d610a89366004613c3c565b612f1f565b348015610a9a57600080fd5b5061037d610aa9366004613c3c565b612f65565b348015610aba57600080fd5b5061039f610ac93660046141d9565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b348015610b0357600080fd5b5061037d610b12366004613cf2565b612fcd565b348015610b2357600080fd5b5061037d610b32366004613c6c565b613095565b348015610b4357600080fd5b506103e1610b52366004613c3c565b60126020526000908152604090205481565b348015610b7057600080fd5b5061037d610b7f36600461420c565b613130565b60006301ffc9a760e01b6001600160e01b031983161480610bb557506380ac58cd60e01b6001600160e01b03198316145b80610bd05750635b5e139f60e01b6001600160e01b03198316145b92915050565b606060028054610be59061422e565b80601f0160208091040260200160405190810160405280929190818152602001828054610c119061422e565b8015610c5e5780601f10610c3357610100808354040283529160200191610c5e565b820191906000526020600020905b815481529060010190602001808311610c4157829003601f168201915b5050505050905090565b6000610c738261316c565b610c90576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b816daaeb6d7670e522a718067333cd4e3b15610d6b57604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610d1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d3e9190614268565b610d6b57604051633b79c77360e21b81526001600160a01b03821660048201526024015b60405180910390fd5b6001600160a01b03831660009081526019602052604090205460ff16610da35760405162461bcd60e51b8152600401610d6290614285565b610dad83836131a1565b505050565b333214610dd15760405162461bcd60e51b8152600401610d62906142bc565b33600090815260176020908152604080832060038452909152808220546002835291205411610e305760405162461bcd60e51b815260206004820152600b60248201526a63616e277420636c61696d60a81b6044820152606401610d62565b600360005260166020527ff06d282f967055cb1eee17e04aa005b9682a620f4bbcfaee55ba78607a3d87ae54421015610e7b5760405162461bcd60e51b8152600401610d62906142d9565b600360005260166020527ff06d282f967055cb1eee17e04aa005b9682a620f4bbcfaee55ba78607a3d87af544210610ec55760405162461bcd60e51b8152600401610d6290614307565b33600090815260176020908152604080832060038452909152808220546002835290822054610ef49190614345565b600c5460026000908152601160205260008051602061473483398151915254929350918291610f2e91610f289060646131b1565b906131bd565b600054909150610f3e33856131c9565b60006001600054610f4f9190614345565b9050815b81811161111d576001600081905260126020527f71a67924699a20698523213e55fe499d539379d7769cd5567e2c45d583f815a354610f919161435c565b600160005260116020526000805160206147948339815191525411610fb957600294506110aa565b600260005260126020527f8e1fee8c88a9e04123b21e90cae2727a7715bf522a1e46eb5934ccd05203a6b254610ff090600161435c565b60026000526011602052600080516020614734833981519152541161101857600194506110aa565b6064611022611272565b87601354611030919061435c565b61103a919061435c565b82601354611048919061435c565b423261105c6008546001600160a01b031690565b604051602001611070959493929190614374565b6040516020818303038152906040528051906020012060001c61109391906143b9565b94508484106110a557600194506110aa565b600294505b60008581526012602052604081208054916110c4836143cd565b909155505060008181526014602052604081208690556015805460018101825591527f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec4750185905580611115816143cd565b915050610f53565b50336000908152601760209081526040808320600384529091528120805487929061114990849061435c565b90915550506004600090815260126020526000805160206147548339815191528054879290611179908490614345565b90915550506005600090815260126020527f45429b9195d4ec5c0cf6c69e9c21a4ca0ea773b702c2de5735f85d2631f2674680548792906111bb90849061435c565b90915550506040517f1792056aee2ac57eeca1667413b6b31a2ae948a883ac44b1333f251fcfe45144906111f790849084903390601590614426565b60405180910390a161120b60156000613b52565b5050505050565b6008546001600160a01b0316331461123c5760405162461bcd60e51b8152600401610d6290614453565b6001600160a01b03166000908152600a60209081526040808320805460ff19908116909155601990925290912080549091169055565b600154600054036000190190565b336000908152600a602052604090205460ff166112af5760405162461bcd60e51b8152600401610d6290614488565b6000828152601a602052604090205481151560ff90911615150361130a5760405162461bcd60e51b81526020600482015260126024820152711cdd185d1d5cc8185b1c9958591e481cd95d60721b6044820152606401610d62565b6000918252601a6020526040909120805460ff1916911515919091179055565b826daaeb6d7670e522a718067333cd4e3b1561145057336001600160a01b038216036113be573360009081526019602052604090205460ff1661137f5760405162461bcd60e51b8152600401610d6290614285565b6000828152601a602052604090205460ff16156113ae5760405162461bcd60e51b8152600401610d62906144af565b6113b98484846131e3565b6114b9565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa15801561140d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114319190614268565b61145057604051633b79c77360e21b8152336004820152602401610d62565b3360009081526019602052604090205460ff1661147f5760405162461bcd60e51b8152600401610d6290614285565b6000828152601a602052604090205460ff16156114ae5760405162461bcd60e51b8152600401610d62906144af565b6114b98484846131e3565b50505050565b6008546001600160a01b031633146114e95760405162461bcd60e51b8152600401610d6290614453565b6000918252600b602090815260408084209490945560189052919020805460ff1916911515919091179055565b336000908152600a6020526040812054819060ff166115475760405162461bcd60e51b8152600401610d6290614488565b82611550611272565b61155a919061435c565b600c54101561159e5760405162461bcd60e51b815260206004820152601060248201526f657863656564696e6720737570706c7960801b6044820152606401610d62565b6000546115ab85856131c9565b600060016000546115bc9190614345565b600c54600260009081526011602052600080516020614734833981519152549293509182916115f091610f289060646131b1565b9050835b8381116117be576001600081905260126020527f71a67924699a20698523213e55fe499d539379d7769cd5567e2c45d583f815a3546116329161435c565b60016000526011602052600080516020614794833981519152541161165a576002925061174b565b600260005260126020527f8e1fee8c88a9e04123b21e90cae2727a7715bf522a1e46eb5934ccd05203a6b25461169190600161435c565b6002600052601160205260008051602061473483398151915254116116b9576001925061174b565b60646116c3611272565b896013546116d1919061435c565b6116db919061435c565b826013546116e9919061435c565b42326116fd6008546001600160a01b031690565b604051602001611711959493929190614374565b6040516020818303038152906040528051906020012060001c61173491906143b9565b9250828210611746576001925061174b565b600292505b6000838152601260205260408120805491611765836143cd565b909155505060008181526014602052604081208490556015805460018101825591527f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec47501839055806117b6816143cd565b9150506115f4565b507ff211e5fddaaec6aa0c1783f48763e1358d822b2b483652026f1c4100d2b79d198484898b60156040516117f79594939291906144de565b60405180910390a161180b60156000613b52565b509193509150505b9250929050565b6008546001600160a01b031633146118445760405162461bcd60e51b8152600401610d6290614453565b601055565b826daaeb6d7670e522a718067333cd4e3b1561196a57336001600160a01b038216036118d8573360009081526019602052604090205460ff1661189e5760405162461bcd60e51b8152600401610d6290614285565b6000828152601a602052604090205460ff16156118cd5760405162461bcd60e51b8152600401610d62906144af565b6113b9848484613373565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611927573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061194b9190614268565b61196a57604051633b79c77360e21b8152336004820152602401610d62565b3360009081526019602052604090205460ff166119995760405162461bcd60e51b8152600401610d6290614285565b6000828152601a602052604090205460ff16156119c85760405162461bcd60e51b8152600401610d62906144af565b6114b9848484613373565b6008546001600160a01b031633146119fd5760405162461bcd60e51b8152600401610d6290614453565b8051611a10906009906020840190613b70565b507f01e56a02aca7f26a28165a040851ba78f30282b55ca81c63a804cdc1e2dcea726009604051611a419190614511565b60405180910390a150565b6001600160a01b03919091166000908152601760209081526040808320938352929052205490565b6000610bd08261338e565b333214611a9e5760405162461bcd60e51b8152600401610d62906142bc565b600081815260166020526040902054421015611acc5760405162461bcd60e51b8152600401610d62906142d9565b6000818152601660205260409020600101544210611afc5760405162461bcd60e51b8152600401610d6290614307565b60008181526018602052604090205460ff1615611b4b5760405162461bcd60e51b815260206004820152600d60248201526c6e6f2076616c6964207479706560981b6044820152606401610d62565b600082611b59576000611b6e565b83611b643384611a4c565b611b6e919061435c565b9050600d54600103611ba357611b873387878486612315565b611ba35760405162461bcd60e51b8152600401610d6290614488565b600d54600003611be95760405162461bcd60e51b81526020600482015260116024820152701cd85b195cc81b9bdd081cdd185c9d1959607a1b6044820152606401610d62565b83611bf2611272565b611bfc919061435c565b6004600052601260205260008051602061475483398151915254600c54611c239190614345565b1015611c5b5760405162461bcd60e51b81526020600482015260076024820152661cdbdb191bdd5d60ca1b6044820152606401610d62565b83611c64611272565b611c6e919061435c565b601160205260008051602061473483398151915254600160005260008051602061479483398151915254611ca2919061435c565b1015611cde5760405162461bcd60e51b815260206004820152600b60248201526a0d8d2dad2e840e4cac2c6d60ab1b6044820152606401610d62565b600e54600c54600260009081526011602052600080516020614734833981519152549092349290918491611d1791610f289060646131b1565b9050611d2388836145b8565b915082821115611d5f5760405162461bcd60e51b815260206004820152600760248201526609c8ca8406260760cb1b6044820152606401610d62565b600054611d6c338a6131c9565b60006001600054611d7d9190614345565b9050815b818111611f4b576001600081905260126020527f71a67924699a20698523213e55fe499d539379d7769cd5567e2c45d583f815a354611dbf9161435c565b600160005260116020526000805160206147948339815191525411611de75760029650611ed8565b600260005260126020527f8e1fee8c88a9e04123b21e90cae2727a7715bf522a1e46eb5934ccd05203a6b254611e1e90600161435c565b600260005260116020526000805160206147348339815191525411611e465760019650611ed8565b6064611e50611272565b8c601354611e5e919061435c565b611e68919061435c565b82601354611e76919061435c565b4232611e8a6008546001600160a01b031690565b604051602001611e9e959493929190614374565b6040516020818303038152906040528051906020012060001c611ec191906143b9565b9650868410611ed35760019650611ed8565b600296505b6000878152601260205260408120805491611ef2836143cd565b909155505060008181526014602052604081208890556015805460018101825591527f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec4750187905580611f43816143cd565b915050611d81565b503360009081526017602090815260408083208b8452909152902054611f72908b9061435c565b3360009081526017602090815260408083208c845290915280822092909255600f54915190916001600160a01b03169086908381818185875af1925050503d8060008114611fdc576040519150601f19603f3d011682016040523d82523d6000602084013e611fe1565b606091505b505090508061202a5760405162461bcd60e51b81526020600482015260156024820152740eadcc2c4d8ca40e8de40e4cac6cad2ecca40cae8d605b1b6044820152606401610d62565b60006120368688614345565b11156120d057336120478688614345565b604051600081818185875af1925050503d8060008114612083576040519150601f19603f3d011682016040523d82523d6000602084013e612088565b606091505b505080915050806120d05760405162461bcd60e51b81526020600482015260126024820152710eadcc2c4d8ca40e8de40e6cadcc840cae8d60731b6044820152606401610d62565b600e54600f546040517fcaf4d10f77a1e37f464f6b74bd3d60d54e92ee3fc9b6151ff0910774cde689d09261211c9287928792918b916001600160a01b039091169033906015906145d7565b60405180910390a161213060156000613b52565b50505050505050505050505050565b6008546001600160a01b031633146121695760405162461bcd60e51b8152600401610d6290614453565b600d55565b6008546001600160a01b031633146121985760405162461bcd60e51b8152600401610d6290614453565b6001600160a01b03166000908152600a602090815260408083208054600160ff1991821681179092556019909352922080549091169091179055565b600980546121e19061422e565b80601f016020809104026020016040519081016040528092919081815260200182805461220d9061422e565b801561225a5780601f1061222f5761010080835404028352916020019161225a565b820191906000526020600020905b81548152906001019060200180831161223d57829003601f168201915b505050505081565b6008546001600160a01b0316331461228c5760405162461bcd60e51b8152600401610d6290614453565b600c55565b60006001600160a01b0382166122ba576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b031633146123095760405162461bcd60e51b8152600401610d6290614453565b612313600061341a565b565b600061236a6123248785612bc5565b8686808060200260200160405190810160405280939291908181526020018383602002808284376000920182905250888152600b6020526040902054925061346c915050565b9695505050505050565b80516005146123c55760405162461bcd60e51b815260206004820152601b60248201527f6e656564203520636f6d6d6f6e206e66747320746f20637261667400000000006044820152606401610d62565b600360005260126020527f0f36ad39aee03e7108cc48f54934702a5f0d4066f10344cebf8198978d86976a546123fc90600161435c565b600360005260116020527f9bfbaa59f8e10e7868f8b402de9d605a390c45ddaebd8c9de3c6f31e733c87ff5410156124805760405162461bcd60e51b815260206004820152602160248201527f4d617820737570706c79207265616368656420666f72206372616674207261726044820152606560f81b6064820152608401610d62565b600061248b82613481565b9050806124e95760405162461bcd60e51b815260206004820152602660248201527f4f6e65206f72206d6f726520746f6b656e206964206973206e6f742076616c6960448201526564207479706560d01b6064820152608401610d62565b600080546124f890600161435c565b90506125053360016131c9565b600081815260146020908152604082206002905560038252601290527f0f36ad39aee03e7108cc48f54934702a5f0d4066f10344cebf8198978d86976a80549161254e836143cd565b91905055507f815a6b801d6f526f9c991ab39f19a3d9d45e21169f8ad53b728ca266d578e6bb81843360405161258693929190614627565b60405180910390a1505050565b3332146125b25760405162461bcd60e51b8152600401610d62906142bc565b6002600081905260166020527fcaff291fe014adc6b72a172705750b4cabe8f8667664d2924a166caab2885648544210156125ff5760405162461bcd60e51b8152600401610d62906142d9565b600081815260166020526040902060010154421061262f5760405162461bcd60e51b8152600401610d6290614307565b60008261263c3384611a4c565b612646919061435c565b90506126553386868486612315565b6126715760405162461bcd60e51b8152600401610d6290614488565b6004600052601260205260008051602061475483398151915254600c5410156126c65760405162461bcd60e51b81526020600482015260076024820152661cdbdb191bdd5d60ca1b6044820152606401610d62565b600e5434906126d585826145b8565b9050818111156127115760405162461bcd60e51b815260206004820152600760248201526609c8ca8406260760cb1b6044820152606401610d62565b600460009081526012602052600080516020614754833981519152805487929061273c90849061435c565b9091555050600f546040516000916001600160a01b03169083908381818185875af1925050503d806000811461278e576040519150601f19603f3d011682016040523d82523d6000602084013e612793565b606091505b50509050806127dc5760405162461bcd60e51b81526020600482015260156024820152740eadcc2c4d8ca40e8de40e4cac6cad2ecca40cae8d605b1b6044820152606401610d62565b60006127e88385614345565b111561288257336127f98385614345565b604051600081818185875af1925050503d8060008114612835576040519150601f19603f3d011682016040523d82523d6000602084013e61283a565b606091505b505080915050806128825760405162461bcd60e51b81526020600482015260126024820152710eadcc2c4d8ca40e8de40e6cadcc840cae8d60731b6044820152606401610d62565b336000908152601760209081526040808320888452909152812080548892906128ac90849061435c565b9091555050600e54600f5460408051928352602083018590526001600160a01b039091168282015233606083015260808201889052517f9592d3701341da076dc734011f1448f436d27721edd662a432632e455e6873d89181900360a00190a15050505050505050565b6008546001600160a01b031633146129405760405162461bcd60e51b8152600401610d6290614453565b600e55565b606060038054610be59061422e565b6008546001600160a01b0316331461297e5760405162461bcd60e51b8152600401610d6290614453565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b816daaeb6d7670e522a718067333cd4e3b15612a5a57604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015612a0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a329190614268565b612a5a57604051633b79c77360e21b81526001600160a01b0382166004820152602401610d62565b6001600160a01b03831660009081526019602052604090205460ff16612a925760405162461bcd60e51b8152600401610d6290614285565b610dad83836134f4565b6008546001600160a01b03163314612ac65760405162461bcd60e51b8152600401610d6290614453565b6001600160a01b03821660009081526019602052604090205481151560ff909116151503612b365760405162461bcd60e51b815260206004820152601c60248201527f58616e616c616e643a2073746174757320616c726561647920736574000000006044820152606401610d62565b6001600160a01b03919091166000908152601960205260409020805460ff1916911515919091179055565b6008546001600160a01b03163314612b8b5760405162461bcd60e51b8152600401610d6290614453565b6040805160608101825293845260208085019384526000858301818152938152601690915220925183559051600183015551600290910155565b604080516001600160a01b038416602082015290810182905260009060600160405160208183030381529060405280519060200120905092915050565b836daaeb6d7670e522a718067333cd4e3b15612d2957336001600160a01b03821603612c97573360009081526019602052604090205460ff16612c575760405162461bcd60e51b8152600401610d6290614285565b6000838152601a602052604090205460ff1615612c865760405162461bcd60e51b8152600401610d62906144af565b612c9285858585613560565b61120b565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015612ce6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d0a9190614268565b612d2957604051633b79c77360e21b8152336004820152602401610d62565b3360009081526019602052604090205460ff16612d585760405162461bcd60e51b8152600401610d6290614285565b6000838152601a602052604090205460ff1615612d875760405162461bcd60e51b8152600401610d62906144af565b61120b85858585613560565b336000908152600a602052604090205460ff16612dc25760405162461bcd60e51b8152600401610d6290614488565b60005b8251811015610dad5781601a6000858481518110612de557612de561468a565b6020026020010151815260200190815260200160002060006101000a81548160ff0219169083151502179055508080612e1d906143cd565b915050612dc5565b6008546001600160a01b03163314612e4f5760405162461bcd60e51b8152600401610d6290614453565b601355565b6060612e5f8261316c565b612ec35760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610d62565b6000612ecd6135a4565b90506000815111612eed5760405180602001604052806000815250612f18565b80612ef7846135b3565b604051602001612f089291906146a0565b6040516020818303038152906040525b9392505050565b6008546001600160a01b03163314612f495760405162461bcd60e51b8152600401610d6290614453565b6004600052601260205260008051602061475483398151915255565b336000908152600a602052604090205460ff16612f945760405162461bcd60e51b8152600401610d6290614488565b612f9d816136b3565b6040518181527fb90306ad06b2a6ff86ddc9327db583062895ef6540e62dc50add009db5b356eb90602001611a41565b336000908152600a602052604090205460ff16612ffc5760405162461bcd60e51b8152600401610d6290614488565b600061300782611a74565b6001600160a01b03811660009081526007602090815260408083203384528252808320805460ff19166001179055858352601a90915290205490915060ff161561308a576000828152601a60205260409020805460ff1916905561306c81848461132a565b6000828152601a60205260409020805460ff19166001179055505050565b610dad81848461132a565b6008546001600160a01b031633146130bf5760405162461bcd60e51b8152600401610d6290614453565b6001600160a01b0381166131245760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d62565b61312d8161341a565b50565b6008546001600160a01b0316331461315a5760405162461bcd60e51b8152600401610d6290614453565b60009182526011602052604090912055565b600081600111158015613180575060005482105b8015610bd0575050600090815260046020526040902054600160e01b161590565b6131ad828260016136be565b5050565b6000612f1882846145b8565b6000612f1882846146cf565b6131ad828260405180602001604052806000815250613765565b60006131ee8261338e565b9050836001600160a01b0316816001600160a01b0316146132215760405162a1148160e81b815260040160405180910390fd5b6000828152600660205260409020805461324d8187335b6001600160a01b039081169116811491141790565b6132785761325b8633610ac9565b61327857604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03851661329f57604051633a954ecd60e21b815260040160405180910390fd5b80156132aa57600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040812091909155600160e11b8416900361333c5760018401600081815260046020526040812054900361333a57600054811461333a5760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b031660008051602061477483398151915260405160405180910390a4505050505050565b610dad83838360405180602001604052806000815250612c02565b600081600111613401575060008181526004602052604081205490600160e01b8216900361340157806000036133fc5760005482106133e057604051636f96cda160e11b815260040160405180910390fd5b5b506000190160008181526004602052604090205480156133e1575b919050565b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006134798383866137cb565b949350505050565b60016000805b83518110156134ed578381815181106134a2576134a261468a565b6020026020010151915060146000838152602001908152602001600020546001146134d057600092506134ed565b6134db8260016137e1565b806134e5816143cd565b915050613487565b5050919050565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61356b84848461132a565b6001600160a01b0383163b156114b95761358784848484613919565b6114b9576040516368d2bf6b60e11b815260040160405180910390fd5b606060098054610be59061422e565b6060816000036135da5750506040805180820190915260018152600360fc1b602082015290565b8160005b811561360457806135ee816143cd565b91506135fd9050600a836146cf565b91506135de565b6000816001600160401b0381111561361e5761361e613dcf565b6040519080825280601f01601f191660200182016040528015613648576020820181803683370190505b5090505b84156134795761365d600183614345565b915061366a600a866143b9565b61367590603061435c565b60f81b81838151811061368a5761368a61468a565b60200101906001600160f81b031916908160001a9053506136ac600a866146cf565b945061364c565b61312d8160006137e1565b60006136c983611a74565b9050811561370857336001600160a01b03821614613708576136eb8133610ac9565b613708576040516367d9dca160e11b815260040160405180910390fd5b60008381526006602052604080822080546001600160a01b0319166001600160a01b0388811691821790925591518693918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a450505050565b61376f8383613a04565b6001600160a01b0383163b15610dad576000548281035b6137996000868380600101945086613919565b6137b6576040516368d2bf6b60e11b815260040160405180910390fd5b81811061378657816000541461120b57600080fd5b6000826137d88584613ade565b14949350505050565b60006137ec8361338e565b90508060008061380a86600090815260066020526040902080549091565b91509150841561384a5761381f818433613238565b61384a5761382d8333610ac9565b61384a57604051632ce44b5f60e11b815260040160405180910390fd5b801561385557600082555b6001600160a01b038316600081815260056020526040902080546fffffffffffffffffffffffffffffffff0190554260a01b17600360e01b17600087815260046020526040812091909155600160e11b851690036138e3576001860160008181526004602052604081205490036138e15760005481146138e15760008181526004602052604090208590555b505b60405186906000906001600160a01b03861690600080516020614774833981519152908390a45050600180548101905550505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a029061394e9033908990889088906004016146e3565b6020604051808303816000875af1925050508015613989575060408051601f3d908101601f1916820190925261398691810190614716565b60015b6139e7573d8080156139b7576040519150601f19603f3d011682016040523d82523d6000602084013e6139bc565b606091505b5080516000036139df576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6000805490829003613a295760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083906000805160206147748339815191528180a4600183015b818114613ab45780836000600080516020614774833981519152600080a4600101613a8e565b5081600003613ad557604051622e076360e81b815260040160405180910390fd5b60005550505050565b600081815b8451811015613b4a576000858281518110613b0057613b0061468a565b60200260200101519050808311613b265760008381526020829052604090209250613b37565b600081815260208490526040902092505b5080613b42816143cd565b915050613ae3565b509392505050565b508054600082559060005260206000209081019061312d9190613bf4565b828054613b7c9061422e565b90600052602060002090601f016020900481019282613b9e5760008555613be4565b82601f10613bb757805160ff1916838001178555613be4565b82800160010185558215613be4579182015b82811115613be4578251825591602001919060010190613bc9565b50613bf0929150613bf4565b5090565b5b80821115613bf05760008155600101613bf5565b6001600160e01b03198116811461312d57600080fd5b600060208284031215613c3157600080fd5b8135612f1881613c09565b600060208284031215613c4e57600080fd5b5035919050565b80356001600160a01b03811681146133fc57600080fd5b600060208284031215613c7e57600080fd5b612f1882613c55565b60005b83811015613ca2578181015183820152602001613c8a565b838111156114b95750506000910152565b60008151808452613ccb816020860160208601613c87565b601f01601f19169290920160200192915050565b602081526000612f186020830184613cb3565b60008060408385031215613d0557600080fd5b613d0e83613c55565b946020939093013593505050565b801515811461312d57600080fd5b60008060408385031215613d3d57600080fd5b823591506020830135613d4f81613d1c565b809150509250929050565b600080600060608486031215613d6f57600080fd5b613d7884613c55565b9250613d8660208501613c55565b9150604084013590509250925092565b600080600060608486031215613dab57600080fd5b83359250602084013591506040840135613dc481613d1c565b809150509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715613e0d57613e0d613dcf565b604052919050565b60006001600160401b03831115613e2e57613e2e613dcf565b613e41601f8401601f1916602001613de5565b9050828152838383011115613e5557600080fd5b828260208301376000602084830101529392505050565b600060208284031215613e7e57600080fd5b81356001600160401b03811115613e9457600080fd5b8201601f81018413613ea557600080fd5b61347984823560208401613e15565b60008083601f840112613ec657600080fd5b5081356001600160401b03811115613edd57600080fd5b6020830191508360208260051b850101111561181357600080fd5b600080600080600060808688031215613f1057600080fd5b85356001600160401b03811115613f2657600080fd5b613f3288828901613eb4565b909650945050602086013592506040860135613f4d81613d1c565b949793965091946060013592915050565b600080600080600060808688031215613f7657600080fd5b613f7f86613c55565b945060208601356001600160401b03811115613f9a57600080fd5b613fa688828901613eb4565b9699909850959660408101359660609091013595509350505050565b600082601f830112613fd357600080fd5b813560206001600160401b03821115613fee57613fee613dcf565b8160051b613ffd828201613de5565b928352848101820192828101908785111561401757600080fd5b83870192505b848310156140365782358252918301919083019061401d565b979650505050505050565b60006020828403121561405357600080fd5b81356001600160401b0381111561406957600080fd5b61347984828501613fc2565b60008060006040848603121561408a57600080fd5b83356001600160401b038111156140a057600080fd5b6140ac86828701613eb4565b909790965060209590950135949350505050565b600080604083850312156140d357600080fd5b6140dc83613c55565b91506020830135613d4f81613d1c565b60008060006060848603121561410157600080fd5b505081359360208301359350604090920135919050565b6000806000806080858703121561412e57600080fd5b61413785613c55565b935061414560208601613c55565b92506040850135915060608501356001600160401b0381111561416757600080fd5b8501601f8101871361417857600080fd5b61418787823560208401613e15565b91505092959194509250565b600080604083850312156141a657600080fd5b82356001600160401b038111156141bc57600080fd5b6141c885828601613fc2565b9250506020830135613d4f81613d1c565b600080604083850312156141ec57600080fd5b6141f583613c55565b915061420360208401613c55565b90509250929050565b6000806040838503121561421f57600080fd5b50508035926020909101359150565b600181811c9082168061424257607f821691505b60208210810361426257634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561427a57600080fd5b8151612f1881613d1c565b6020808252601c908201527f4552433732313a207472616e73666572206e6f7420616c6c6f77656400000000604082015260600190565b60208082526003908201526231303160e81b604082015260600190565b6020808252601490820152731cd85b19481b9bdd081cdd185c9d1959081e595d60621b604082015260600190565b6020808252600e908201526d1cd85b19481a185cc8195b99195960921b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000828210156143575761435761432f565b500390565b6000821982111561436f5761436f61432f565b500190565b948552602085019390935260408401919091526001600160a01b03908116606084015216608082015260a00190565b634e487b7160e01b600052601260045260246000fd5b6000826143c8576143c86143a3565b500690565b6000600182016143df576143df61432f565b5060010190565b6000815480845260208085019450836000528060002060005b8381101561441b578154875295820195600191820191016143ff565b509495945050505050565b84815283602082015260018060a01b038316604082015260806060820152600061236a60808301846143e6565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252600d908201526c6e6f7420617574686f72697a6560981b604082015260600190565b602080825260159082015274115490cdcc8c4e88139195081a5cc81b1bd8dad959605a1b604082015260600190565b85815284602082015283604082015260018060a01b038316606082015260a06080820152600061403660a08301846143e6565b600060208083526000845481600182811c91508083168061453357607f831692505b858310810361455057634e487b7160e01b85526022600452602485fd5b87860183815260200181801561456d576001811461457e576145a9565b60ff198616825287820196506145a9565b60008b81526020902060005b868110156145a35781548482015290850190890161458a565b83019750505b50949998505050505050505050565b60008160001904831182151516156145d2576145d261432f565b500290565b878152866020820152856040820152846060820152600060018060a01b03808616608084015280851660a08401525060e060c083015261461a60e08301846143e6565b9998505050505050505050565b6000606082018583526020606081850152818651808452608086019150828801935060005b818110156146685784518352938301939183019160010161464c565b50506001600160a01b0395909516604094909401939093525091949350505050565b634e487b7160e01b600052603260045260246000fd5b600083516146b2818460208801613c87565b8351908301906146c6818360208801613c87565b01949350505050565b6000826146de576146de6143a3565b500490565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061236a90830184613cb3565b60006020828403121561472857600080fd5b8151612f1881613c0956fe08037d7b151cc412d25674a4e66b334d9ae9d2e5517a7feaae5cdb828bf1c628b4fcd034df3d20faa1c133b66d862ce92732727d40916b48ffb4020cb00fe053ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef17bc176d2408558f6e4111feebc3cab4e16b63e967be91cde721f4c8a488b552a2646970667358221220af0ce3025bf233a8284e4bc8d1d8c4db4c59a8d888c7cb63690f314c5086355364736f6c634300080d0033

Deployed Bytecode Sourcemap

81942:16000:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18459:639;;;;;;;;;;-1:-1:-1;18459:639:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;18459:639:0;;;;;;;;58789:50;;;;;;;;;;-1:-1:-1;58789:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;923:25:1;;;911:2;896:18;58789:50:0;777:177:1;95168:123:0;;;;;;;;;;-1:-1:-1;95168:123:0;;;;;:::i;:::-;-1:-1:-1;;;;;95258:27:0;95236:4;95258:27;;;:17;:27;;;;;;;;;95168:123;19361:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;25761:218::-;;;;;;;;;;-1:-1:-1;25761:218:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2398:32:1;;;2380:51;;2368:2;2353:18;25761:218:0;2234:203:1;94935:121:0;;;;;;;;;;-1:-1:-1;94935:121:0;;;;;:::i;:::-;94999:7;95023:27;;;:13;:27;;;;;;;94935:121;83291:244;;;;;;:::i;:::-;;:::i;87921:1431::-;;;;;;;;;;;;;:::i;93301:139::-;;;;;;;;;;-1:-1:-1;93301:139:0;;;;;:::i;:::-;;:::i;15112:323::-;;;;;;;;;;;;;:::i;58671:21::-;;;;;;;;;;;;;;;;95408:175;;;;;;;;;;-1:-1:-1;95408:175:0;;;;;:::i;:::-;;:::i;83589:313::-;;;;;;:::i;:::-;;:::i;93446:200::-;;;;;;;;;;-1:-1:-1;93446:200:0;;;;;:::i;:::-;;:::i;95062:100::-;;;;;;;;;;-1:-1:-1;95062:100:0;;;;;:::i;:::-;95118:4;95140:16;;;:7;:16;;;;;;;;;95062:100;85533:1104;;;;;;;;;;-1:-1:-1;85533:1104:0;;;;;:::i;:::-;;:::i;:::-;;;;4209:25:1;;;4265:2;4250:18;;4243:34;;;;4182:18;85533:1104:0;4035:248:1;55626:143:0;;;;;;;;;;;;55726:42;55626:143;;95793:86;;;;;;;;;;-1:-1:-1;95793:86:0;;;;;:::i;:::-;;:::i;83910:322::-;;;;;;:::i;:::-;;:::i;82706:39::-;;;;;;;;;;-1:-1:-1;82706:39:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;94847:82;;;;;;;;;;-1:-1:-1;94914:9:0;;94847:82;;58530:45;;;;;;;;;;-1:-1:-1;58530:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;96199:122;;;;;;;;;;-1:-1:-1;96199:122:0;;;;;:::i;:::-;;:::i;84593:142::-;;;;;;;;;;-1:-1:-1;84593:142:0;;;;;:::i;:::-;;:::i;20754:152::-;;;;;;;;;;-1:-1:-1;20754:152:0;;;;;:::i;:::-;;:::i;89359:2380::-;;;;;;:::i;:::-;;:::i;94171:81::-;;;;;;;;;;-1:-1:-1;94171:81:0;;;;;:::i;:::-;;:::i;93163:134::-;;;;;;;;;;-1:-1:-1;93163:134:0;;;;;:::i;:::-;;:::i;58506:21::-;;;;;;;;;;;;;:::i;93745:87::-;;;;;;;;;;-1:-1:-1;93745:87:0;;;;;:::i;:::-;;:::i;16296:233::-;;;;;;;;;;-1:-1:-1;16296:233:0;;;;;:::i;:::-;;:::i;61820:94::-;;;;;;;;;;;;;:::i;84737:230::-;;;;;;;;;;-1:-1:-1;84737:230:0;;;;;:::i;:::-;;:::i;92130:503::-;;;;;;;;;;-1:-1:-1;92130:503:0;;;;;:::i;:::-;;:::i;82650:49::-;;;;;;;;;;-1:-1:-1;82650:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;94444:223;;;;;;;;;;-1:-1:-1;94444:223:0;;;;;:::i;:::-;94513:18;94571:27;;;:12;:27;;;;;:37;;94626:35;;;;;94571:37;;94444:223;61169:87;;;;;;;;;;-1:-1:-1;61242:6:0;;-1:-1:-1;;;;;61242:6:0;61169:87;;86733:1184;;;;;;:::i;:::-;;:::i;94673:82::-;;;;;;;;;;-1:-1:-1;94673:82:0;;;;;:::i;:::-;;:::i;19537:104::-;;;;;;;;;;;;;:::i;94761:80::-;;;;;;;;;;-1:-1:-1;94826:9:0;;94761:80;;95885:92;;;;;;;;;;-1:-1:-1;95885:92:0;;;;;:::i;:::-;-1:-1:-1;95965:6:0;;-1:-1:-1;;;;;95965:6:0;;95885:92;95983:97;;;;;;;;;;-1:-1:-1;95983:97:0;;;;;:::i;:::-;-1:-1:-1;96067:7:0;;;95983:97;93662:77;;;;;;;;;;-1:-1:-1;93662:77:0;;;;;:::i;:::-;;:::i;83029:254::-;;;;;;;;;;-1:-1:-1;83029:254:0;;;;;:::i;:::-;;:::i;93838:208::-;;;;;;;;;;-1:-1:-1;93838:208:0;;;;;:::i;:::-;;:::i;58931:45::-;;;;;;;;;;-1:-1:-1;58931:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;94258:180;;;;;;;;;;-1:-1:-1;94258:180:0;;;;;:::i;:::-;;:::i;84973:146::-;;;;;;;;;;-1:-1:-1;84973:146:0;;;;;:::i;:::-;;:::i;84240:345::-;;;;;;:::i;:::-;;:::i;95589:198::-;;;;;;;;;;-1:-1:-1;95589:198:0;;;;;:::i;:::-;;:::i;86643:74::-;;;;;;;;;;-1:-1:-1;86643:74:0;;;;;:::i;:::-;;:::i;96500:334::-;;;;;;;;;;-1:-1:-1;96500:334:0;;;;;:::i;:::-;;:::i;95297:105::-;;;;;;;;;;-1:-1:-1;95297:105:0;;;;;:::i;:::-;;:::i;92639:::-;;;;;;;;;;-1:-1:-1;92639:105:0;;;;;:::i;:::-;;:::i;26710:164::-;;;;;;;;;;-1:-1:-1;26710:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;26831:25:0;;;26807:4;26831:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;26710:164;92750:402;;;;;;;;;;-1:-1:-1;92750:402:0;;;;;:::i;:::-;;:::i;62069:192::-;;;;;;;;;;-1:-1:-1;62069:192:0;;;;;:::i;:::-;;:::i;58843:50::-;;;;;;;;;;-1:-1:-1;58843:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;94052:113;;;;;;;;;;-1:-1:-1;94052:113:0;;;;;:::i;:::-;;:::i;18459:639::-;18544:4;-1:-1:-1;;;;;;;;;18868:25:0;;;;:102;;-1:-1:-1;;;;;;;;;;18945:25:0;;;18868:102;:179;;;-1:-1:-1;;;;;;;;;;19022:25:0;;;18868:179;18848:199;18459:639;-1:-1:-1;;18459:639:0:o;19361:100::-;19415:13;19448:5;19441:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19361:100;:::o;25761:218::-;25837:7;25862:16;25870:7;25862;:16::i;:::-;25857:64;;25887:34;;-1:-1:-1;;;25887:34:0;;;;;;;;;;;25857:64;-1:-1:-1;25941:24:0;;;;:15;:24;;;;;:30;-1:-1:-1;;;;;25941:30:0;;25761:218::o;83291:244::-;83396:8;55726:42;57620:45;:49;57616:225;;57691:67;;-1:-1:-1;;;57691:67:0;;57742:4;57691:67;;;12031:34:1;-1:-1:-1;;;;;12101:15:1;;12081:18;;;12074:43;55726:42:0;;57691;;11966:18:1;;57691:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57686:144;;57786:28;;-1:-1:-1;;;57786:28:0;;-1:-1:-1;;;;;2398:32:1;;57786:28:0;;;2380:51:1;2353:18;;57786:28:0;;;;;;;;57686:144;-1:-1:-1;;;;;83425:27:0;::::1;;::::0;;;:17:::1;:27;::::0;;;;;::::1;;83417:67;;;;-1:-1:-1::0;;;83417:67:0::1;;;;;;;:::i;:::-;83495:32;83509:8;83519:7;83495:13;:32::i;:::-;83291:244:::0;;;:::o;87921:1431::-;87970:10;87984:9;87970:23;87962:39;;;;-1:-1:-1;;;87962:39:0;;;;;;;:::i;:::-;88056:10;88045:22;;;;:10;:22;;;;;;;;88068:1;88045:25;;;;;;;;;88039:1;88016:25;;;;;:54;88008:78;;;;-1:-1:-1;;;88008:78:0;;13268:2:1;88008:78:0;;;13250:21:1;13307:2;13287:18;;;13280:30;-1:-1:-1;;;13326:18:1;;;13319:41;13377:18;;88008:78:0;13066:335:1;88008:78:0;88115:1;88102:15;;:12;:15;;;:25;88131:15;-1:-1:-1;88102:44:0;88094:77;;;;-1:-1:-1;;;88094:77:0;;;;;;;:::i;:::-;88199:1;88186:15;;:12;:15;;:23;;88212:15;-1:-1:-1;88178:68:0;;;;-1:-1:-1;;;88178:68:0;;;;;;;:::i;:::-;88309:10;88253:13;88298:22;;;:10;:22;;;;;;;;88321:1;88298:25;;;;;;;;;88292:1;88269:25;;;;;;:54;;88298:25;88269:54;:::i;:::-;88406:9;;88390:1;88330:12;88374:18;;;:15;:18;;-1:-1:-1;;;;;;;;;;;88374:18:0;88253:70;;-1:-1:-1;88330:12:0;;;88374:42;;:27;;88397:3;88374:22;:27::i;:::-;:31;;:42::i;:::-;88423:12;88438:13;88349:67;;-1:-1:-1;88459:28:0;88469:10;88481:5;88459:9;:28::i;:::-;88494:10;88523:1;88507:13;;:17;;;;:::i;:::-;88494:30;-1:-1:-1;88552:4:0;88531:620;88567:2;88558:5;:11;88531:620;;88632:1;88616:18;;;;:15;:18;;;;:22;;;:::i;:::-;88610:1;88594:18;;:15;:18;;-1:-1:-1;;;;;;;;;;;88594:18:0;:44;88591:452;;88659:1;88652:8;;88591:452;;;88732:1;88716:18;;:15;:18;;;;:22;;88737:1;88716:22;:::i;:::-;88710:1;88694:18;;:15;:18;;-1:-1:-1;;;;;;;;;;;88694:18:0;:44;88690:353;;88760:1;88753:8;;88690:353;;;88911:3;88842:13;:11;:13::i;:::-;88834:5;88827:4;;:12;;;;:::i;:::-;:28;;;;:::i;:::-;88863:5;88856:4;;:12;;;;:::i;:::-;88870:15;88887:9;88898:7;61242:6;;-1:-1:-1;;;;;61242:6:0;;61169:87;88898:7;88816:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;88806:101;;;;;;88798:110;;:116;;;;:::i;:::-;88791:123;;88948:4;88930:14;:22;88927:105;;88975:1;88968:8;;88927:105;;;89017:1;89010:8;;88927:105;89053:21;;;;:15;:21;;;;;:23;;;;;;:::i;:::-;;;;-1:-1:-1;;89087:18:0;;;;:11;:18;;;;;:25;;;89123:6;:17;;;;;;;;;;;;;;89099:5;88571:7;89099:5;88571:7;:::i;:::-;;;;88531:620;;;-1:-1:-1;89169:10:0;89158:22;;;;:10;:22;;;;;;;;89181:1;89158:25;;;;;;;:34;;89187:5;;89158:22;:34;;89187:5;;89158:34;:::i;:::-;;;;-1:-1:-1;;89217:1:0;89201:18;;;;:15;:18;;-1:-1:-1;;;;;;;;;;;89201:27:0;;89223:5;;89201:18;:27;;89223:5;;89201:27;:::i;:::-;;;;-1:-1:-1;;89253:1:0;89237:18;;;;:15;:18;;;:27;;89259:5;;89237:18;:27;;89259:5;;89237:27;:::i;:::-;;;;-1:-1:-1;;89278:42:0;;;;;;89288:4;;89295:2;;89301:10;;89313:6;;89278:42;:::i;:::-;;;;;;;;89333:13;89340:6;;89333:13;:::i;:::-;87955:1397;;;;;87921:1431::o;93301:139::-;61242:6;;-1:-1:-1;;;;;61242:6:0;60046:10;61389:23;61381:68;;;;-1:-1:-1;;;61381:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;93369:19:0::1;93391:5;93369:19:::0;;;:13:::1;:19;::::0;;;;;;;:27;;-1:-1:-1;;93369:27:0;;::::1;::::0;;;93403:17:::1;:23:::0;;;;;;:31;;;;::::1;::::0;;93301:139::o;15112:323::-;14711:1;15386:12;15173:7;15370:13;:28;-1:-1:-1;;15370:46:0;;15112:323::o;95408:175::-;82606:10;82592:25;;;;:13;:25;;;;;;;;82584:51;;;;-1:-1:-1;;;82584:51:0;;;;;;;:::i;:::-;95496:16:::1;::::0;;;:7:::1;:16;::::0;;;;;:26;::::1;;:16;::::0;;::::1;:26;;::::0;95488:57:::1;;;::::0;-1:-1:-1;;;95488:57:0;;17434:2:1;95488:57:0::1;::::0;::::1;17416:21:1::0;17473:2;17453:18;;;17446:30;-1:-1:-1;;;17492:18:1;;;17485:48;17550:18;;95488:57:0::1;17232:342:1::0;95488:57:0::1;95552:16;::::0;;;:7:::1;:16;::::0;;;;;:25;;-1:-1:-1;;95552:25:0::1;::::0;::::1;;::::0;;;::::1;::::0;;95408:175::o;83589:313::-;83699:4;55726:42;56874:45;:49;56870:539;;57163:10;-1:-1:-1;;;;;57155:18:0;;;57151:85;;83742:10:::1;83724:29;::::0;;;:17:::1;:29;::::0;;;;;::::1;;83716:69;;;;-1:-1:-1::0;;;83716:69:0::1;;;;;;;:::i;:::-;83805:16;::::0;;;:7:::1;:16;::::0;;;;;::::1;;83804:17;83796:50;;;;-1:-1:-1::0;;;83796:50:0::1;;;;;;;:::i;:::-;83857:37;83876:4;83882:2;83886:7;83857:18;:37::i;:::-;57214:7:::0;;57151:85;57255:69;;-1:-1:-1;;;57255:69:0;;57306:4;57255:69;;;12031:34:1;57313:10:0;12081:18:1;;;12074:43;55726:42:0;;57255;;11966:18:1;;57255:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57250:148;;57352:30;;-1:-1:-1;;;57352:30:0;;57371:10;57352:30;;;2380:51:1;2353:18;;57352:30:0;2234:203:1;57250:148:0;83742:10:::1;83724:29;::::0;;;:17:::1;:29;::::0;;;;;::::1;;83716:69;;;;-1:-1:-1::0;;;83716:69:0::1;;;;;;;:::i;:::-;83805:16;::::0;;;:7:::1;:16;::::0;;;;;::::1;;83804:17;83796:50;;;;-1:-1:-1::0;;;83796:50:0::1;;;;;;;:::i;:::-;83857:37;83876:4;83882:2;83886:7;83857:18;:37::i;:::-;83589:313:::0;;;;:::o;93446:200::-;61242:6;;-1:-1:-1;;;;;61242:6:0;60046:10;61389:23;61381:68;;;;-1:-1:-1;;;61381:68:0;;;;;;;:::i;:::-;93552:28:::1;::::0;;;:13:::1;:28;::::0;;;;;;;:36;;;;93595:18:::1;:33:::0;;;;;:45;;-1:-1:-1;;93595:45:0::1;::::0;::::1;;::::0;;;::::1;::::0;;93446:200::o;85533:1104::-;82606:10;85605:7;82592:25;;;:13;:25;;;;;;85605:7;;82592:25;;82584:51;;;;-1:-1:-1;;;82584:51:0;;;;;;;:::i;:::-;85666:10:::1;85651:13;:11;:13::i;:::-;:25;;;;:::i;:::-;85638:9;;:38;;85630:67;;;::::0;-1:-1:-1;;;85630:67:0;;18131:2:1;85630:67:0::1;::::0;::::1;18113:21:1::0;18170:2;18150:18;;;18143:30;-1:-1:-1;;;18189:18:1;;;18182:46;18245:18;;85630:67:0::1;17929:340:1::0;85630:67:0::1;85704:13;85720::::0;85741:26:::1;85751:3:::0;85756:10;85741:9:::1;:26::i;:::-;85774:11;85804:1;85788:13;;:17;;;;:::i;:::-;85890:9;::::0;85874:1:::1;85814:12;85858:18:::0;;;:15:::1;:18;::::0;-1:-1:-1;;;;;;;;;;;85858:18:0;85774:31;;-1:-1:-1;85814:12:0;;;85858:42:::1;::::0;:27:::1;::::0;85881:3:::1;85858:22;:27::i;:42::-;85833:67:::0;-1:-1:-1;85928:5:0;85907:626:::1;85944:3;85935:5;:12;85907:626;;86010:1;85994:18;::::0;;;:15:::1;:18;::::0;;;:22:::1;::::0;::::1;:::i;:::-;85988:1;85972:18;::::0;:15:::1;:18;::::0;-1:-1:-1;;;;;;;;;;;85972:18:0;:44:::1;85969:456;;86037:1;86030:8;;85969:456;;;86110:1;86094:18;::::0;:15:::1;:18;::::0;;;:22:::1;::::0;86115:1:::1;86094:22;:::i;:::-;86088:1;86072:18;::::0;:15:::1;:18;::::0;-1:-1:-1;;;;;;;;;;;86072:18:0;:44:::1;86068:357;;86138:1;86131:8;;86068:357;;;86293:3;86225:13;:11;:13::i;:::-;86212:10;86205:4;;:17;;;;:::i;:::-;:33;;;;:::i;:::-;86246:5;86239:4;;:12;;;;:::i;:::-;86253:15;86269:9;86280:7;61242:6:::0;;-1:-1:-1;;;;;61242:6:0;;61169:87;86280:7:::1;86194:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;86184:105;;;;;;86176:114;;:120;;;;:::i;:::-;86169:127;;86330:4;86312:14;:22;86309:105;;86357:1;86350:8;;86309:105;;;86399:1;86392:8;;86309:105;86435:21;::::0;;;:15:::1;:21;::::0;;;;:23;;;::::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;86469:18:0::1;::::0;;;:11:::1;:18;::::0;;;;:25;;;86505:6:::1;:17:::0;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;86481:5;85949:7:::1;86481:5:::0;85949:7:::1;:::i;:::-;;;;85907:626;;;;86544:41;86549:5;86556:3;86561:10;86573:3;86578:6;86544:41;;;;;;;;;;:::i;:::-;;;;;;;;86592:13;86599:6;;86592:13;:::i;:::-;-1:-1:-1::0;86620:5:0;;-1:-1:-1;86627:3:0;-1:-1:-1;;82640:1:0::1;85533:1104:::0;;;;;:::o;95793:86::-;61242:6;;-1:-1:-1;;;;;61242:6:0;60046:10;61389:23;61381:68;;;;-1:-1:-1;;;61381:68:0;;;;;;;:::i;:::-;95856:7:::1;:17:::0;95793:86::o;83910:322::-;84025:4;55726:42;56874:45;:49;56870:539;;57163:10;-1:-1:-1;;;;;57155:18:0;;;57151:85;;84068:10:::1;84050:29;::::0;;;:17:::1;:29;::::0;;;;;::::1;;84042:69;;;;-1:-1:-1::0;;;84042:69:0::1;;;;;;;:::i;:::-;84131:16;::::0;;;:7:::1;:16;::::0;;;;;::::1;;84130:17;84122:50;;;;-1:-1:-1::0;;;84122:50:0::1;;;;;;;:::i;:::-;84183:41;84206:4;84212:2;84216:7;84183:22;:41::i;57151:85::-:0;57255:69;;-1:-1:-1;;;57255:69:0;;57306:4;57255:69;;;12031:34:1;57313:10:0;12081:18:1;;;12074:43;55726:42:0;;57255;;11966:18:1;;57255:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57250:148;;57352:30;;-1:-1:-1;;;57352:30:0;;57371:10;57352:30;;;2380:51:1;2353:18;;57352:30:0;2234:203:1;57250:148:0;84068:10:::1;84050:29;::::0;;;:17:::1;:29;::::0;;;;;::::1;;84042:69;;;;-1:-1:-1::0;;;84042:69:0::1;;;;;;;:::i;:::-;84131:16;::::0;;;:7:::1;:16;::::0;;;;;::::1;;84130:17;84122:50;;;;-1:-1:-1::0;;;84122:50:0::1;;;;;;;:::i;:::-;84183:41;84206:4;84212:2;84216:7;84183:22;:41::i;96199:122::-:0;61242:6;;-1:-1:-1;;;;;61242:6:0;60046:10;61389:23;61381:68;;;;-1:-1:-1;;;61381:68:0;;;;;;;:::i;:::-;96269:18;;::::1;::::0;:7:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;:::-;;96299:16;96307:7;96299:16;;;;;;:::i;:::-;;;;;;;;96199:122:::0;:::o;84593:142::-;-1:-1:-1;;;;;84700:16:0;;;;84679:7;84700:16;;;:10;:16;;;;;;;;:31;;;;;;;;;84593:142::o;20754:152::-;20826:7;20869:27;20888:7;20869:18;:27::i;89359:2380::-;89491:10;89505:9;89491:23;89483:39;;;;-1:-1:-1;;;89483:39:0;;;;;;;:::i;:::-;89537:27;;;;:12;:27;;;;;:37;89578:15;-1:-1:-1;89537:56:0;89529:89;;;;-1:-1:-1;;;89529:89:0;;;;;;;:::i;:::-;89633:27;;;;:12;:27;;;;;:35;;;89671:15;-1:-1:-1;89625:80:0;;;;-1:-1:-1;;;89625:80:0;;;;;;;:::i;:::-;89721:33;;;;:18;:33;;;;;;;;89720:34;89712:60;;;;-1:-1:-1;;;89712:60:0;;20262:2:1;89712:60:0;;;20244:21:1;20301:2;20281:18;;;20274:30;-1:-1:-1;;;20320:18:1;;;20313:43;20373:18;;89712:60:0;20060:337:1;89712:60:0;89779:16;89798:7;:66;;89863:1;89798:66;;;89855:5;89808:44;89827:10;89838:13;89808:18;:44::i;:::-;:52;;;;:::i;:::-;89779:85;;89874:6;;89884:1;89874:11;89870:99;;89895:56;89909:10;89921:5;;89928:8;89937:13;89895;:56::i;:::-;89887:82;;;;-1:-1:-1;;;89887:82:0;;;;;;;:::i;:::-;89984:6;;89994:1;89984:11;89976:41;;;;-1:-1:-1;;;89976:41:0;;20604:2:1;89976:41:0;;;20586:21:1;20643:2;20623:18;;;20616:30;-1:-1:-1;;;20662:18:1;;;20655:47;20719:18;;89976:41:0;20402:341:1;89976:41:0;90094:5;90078:13;:11;:13::i;:::-;:21;;;;:::i;:::-;90069:1;90053:18;;:15;:18;;-1:-1:-1;;;;;;;;;;;90053:18:0;90041:9;;:30;;90053:18;90041:30;:::i;:::-;90040:59;;90032:79;;;;-1:-1:-1;;;90032:79:0;;20950:2:1;90032:79:0;;;20932:21:1;20989:1;20969:18;;;20962:29;-1:-1:-1;;;21007:18:1;;;21000:37;21054:18;;90032:79:0;20748:330:1;90032:79:0;90186:5;90170:13;:11;:13::i;:::-;:21;;;;:::i;:::-;90147:15;:18;;-1:-1:-1;;;;;;;;;;;90147:18:0;90142:1;90147:18;90126;-1:-1:-1;;;;;;;;;;;90126:18:0;:39;;90147:18;90126:39;:::i;:::-;:65;;90118:89;;;;-1:-1:-1;;;90118:89:0;;21285:2:1;90118:89:0;;;21267:21:1;21324:2;21304:18;;;21297:30;-1:-1:-1;;;21343:18:1;;;21336:41;21394:18;;90118:89:0;21083:335:1;90118:89:0;90291:9;;90366;;90350:1;90214:12;90334:18;;;:15;:18;;-1:-1:-1;;;;;;;;;;;90334:18:0;90214:12;;90259:9;;90291;;90214:12;;90334:42;;:27;;90357:3;90334:22;:27::i;:42::-;90309:67;-1:-1:-1;90393:13:0;90401:5;90393;:13;:::i;:::-;90385:21;;90430:13;90421:5;:22;;90413:42;;;;-1:-1:-1;;;90413:42:0;;21798:2:1;90413:42:0;;;21780:21:1;21837:1;21817:18;;;21810:29;-1:-1:-1;;;21855:18:1;;;21848:37;21902:18;;90413:42:0;21596:330:1;90413:42:0;90474:12;90489:13;90510:28;90520:10;90532:5;90510:9;:28::i;:::-;90545:10;90573:1;90558:13;;:16;;;;:::i;:::-;90545:29;-1:-1:-1;90607:4:0;90586:622;90622:2;90613:5;:11;90586:622;;90689:1;90673:18;;;;:15;:18;;;;:22;;;:::i;:::-;90667:1;90651:18;;:15;:18;;-1:-1:-1;;;;;;;;;;;90651:18:0;:44;90648:452;;90716:1;90709:8;;90648:452;;;90789:1;90773:18;;:15;:18;;;;:22;;90794:1;90773:22;:::i;:::-;90767:1;90751:18;;:15;:18;;-1:-1:-1;;;;;;;;;;;90751:18:0;:44;90747:353;;90817:1;90810:8;;90747:353;;;90968:3;90899:13;:11;:13::i;:::-;90891:5;90884:4;;:12;;;;:::i;:::-;:28;;;;:::i;:::-;90920:5;90913:4;;:12;;;;:::i;:::-;90927:15;90944:9;90955:7;61242:6;;-1:-1:-1;;;;;61242:6:0;;61169:87;90955:7;90873:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;90863:101;;;;;;90855:110;;:116;;;;:::i;:::-;90848:123;;91005:4;90987:14;:22;90984:105;;91032:1;91025:8;;90984:105;;;91074:1;91067:8;;90984:105;91110:21;;;;:15;:21;;;;;:23;;;;;;:::i;:::-;;;;-1:-1:-1;;91144:18:0;;;;:11;:18;;;;;:25;;;91180:6;:17;;;;;;;;;;;;;;91156:5;90626:7;91156:5;90626:7;:::i;:::-;;;;90586:622;;;-1:-1:-1;91278:10:0;91267:22;;;;:10;:22;;;;;;;;:37;;;;;;;;;:44;;91306:5;;91267:44;:::i;:::-;91239:10;91228:22;;;;:10;:22;;;;;;;;:37;;;;;;;;;:83;;;;91349:6;;91341:38;;91228:22;;-1:-1:-1;;;;;91349:6:0;;91369:5;;91228:22;91341:38;91228:22;91341:38;91369:5;91349:6;91341:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;91323:56;;;91394:7;91390:44;;91403:31;;-1:-1:-1;;;91403:31:0;;22343:2:1;91403:31:0;;;22325:21:1;22382:2;22362:18;;;22355:30;-1:-1:-1;;;22401:18:1;;;22394:51;22462:18;;91403:31:0;22141:345:1;91390:44:0;91472:1;91448:21;91464:5;91448:13;:21;:::i;:::-;:25;91445:187;;;91512:10;91537:21;91553:5;91537:13;:21;:::i;:::-;91504:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;91490:74;;;;;91583:7;91579:41;;91592:28;;-1:-1:-1;;;91592:28:0;;22693:2:1;91592:28:0;;;22675:21:1;22732:2;22712:18;;;22705:30;-1:-1:-1;;;22751:18:1;;;22744:48;22809:18;;91592:28:0;22491:342:1;91579:41:0;91666:9;;91684:6;;91644:67;;;;;;91656:4;;91662:2;;91666:9;91677:5;;-1:-1:-1;;;;;91684:6:0;;;;91692:10;;91704:6;;91644:67;:::i;:::-;;;;;;;;91720:13;91727:6;;91720:13;:::i;:::-;89476:2263;;;;;;;;89359:2380;;;;;:::o;94171:81::-;61242:6;;-1:-1:-1;;;;;61242:6:0;60046:10;61389:23;61381:68;;;;-1:-1:-1;;;61381:68:0;;;;;;;:::i;:::-;94231:6:::1;:15:::0;94171:81::o;93163:134::-;61242:6;;-1:-1:-1;;;;;61242:6:0;60046:10;61389:23;61381:68;;;;-1:-1:-1;;;61381:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;93228:19:0::1;;::::0;;;:13:::1;:19;::::0;;;;;;;:26;;93250:4:::1;-1:-1:-1::0;;93228:26:0;;::::1;::::0;::::1;::::0;;;93261:17:::1;:23:::0;;;;;:30;;;;::::1;::::0;;::::1;::::0;;93163:134::o;58506:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;93745:87::-;61242:6;;-1:-1:-1;;;;;61242:6:0;60046:10;61389:23;61381:68;;;;-1:-1:-1;;;61381:68:0;;;;;;;:::i;:::-;93809:9:::1;:17:::0;93745:87::o;16296:233::-;16368:7;-1:-1:-1;;;;;16392:19:0;;16388:60;;16420:28;;-1:-1:-1;;;16420:28:0;;;;;;;;;;;16388:60;-1:-1:-1;;;;;;16466:25:0;;;;;:18;:25;;;;;;-1:-1:-1;;;;;16466:55:0;;16296:233::o;61820:94::-;61242:6;;-1:-1:-1;;;;;61242:6:0;60046:10;61389:23;61381:68;;;;-1:-1:-1;;;61381:68:0;;;;;;;:::i;:::-;61885:21:::1;61903:1;61885:9;:21::i;:::-;61820:94::o:0;84737:230::-;84865:4;84889:70;84897:24;84903:7;84912:8;84897:5;:24::i;:::-;84923:5;;84889:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;84930:28:0;;;:13;:28;;;;;;;-1:-1:-1;84889:7:0;;-1:-1:-1;;84889:70:0:i;:::-;84882:77;84737:230;-1:-1:-1;;;;;;84737:230:0:o;92130:503::-;92199:8;:15;92218:1;92199:20;92191:60;;;;-1:-1:-1;;;92191:60:0;;23798:2:1;92191:60:0;;;23780:21:1;23837:2;23817:18;;;23810:30;23876:29;23856:18;;;23849:57;23923:18;;92191:60:0;23596:351:1;92191:60:0;92304:1;92288:18;;:15;:18;;;;:22;;92309:1;92288:22;:::i;:::-;92282:1;92266:18;;:15;:18;;;;:44;;92258:90;;;;-1:-1:-1;;;92258:90:0;;24154:2:1;92258:90:0;;;24136:21:1;24193:2;24173:18;;;24166:30;24232:34;24212:18;;;24205:62;-1:-1:-1;;;24283:18:1;;;24276:31;24324:19;;92258:90:0;23952:397:1;92258:90:0;92355:10;92368:18;92377:8;92368;:18::i;:::-;92355:31;;92397:5;92393:59;;92404:48;;-1:-1:-1;;;92404:48:0;;24556:2:1;92404:48:0;;;24538:21:1;24595:2;24575:18;;;24568:30;24634:34;24614:18;;;24607:62;-1:-1:-1;;;24685:18:1;;;24678:36;24731:19;;92404:48:0;24354:402:1;92393:59:0;92459:12;92474:13;;:17;;92490:1;92474:17;:::i;:::-;92459:32;;92499:24;92509:10;92521:1;92499:9;:24::i;:::-;92530:17;;;;:11;:17;;;;;;;92550:1;92530:21;;92575:1;92559:18;;:15;:18;;;:20;;;;;;:::i;:::-;;;;;;92591:36;92600:4;92606:8;92616:10;92591:36;;;;;;;;:::i;:::-;;;;;;;;92184:449;;92130:503;:::o;86733:1184::-;86833:10;86847:9;86833:23;86825:39;;;;-1:-1:-1;;;86825:39:0;;;;;;;:::i;:::-;86895:1;86871:21;86911:27;;;:12;:27;;;:37;86952:15;-1:-1:-1;86911:56:0;86903:89;;;;-1:-1:-1;;;86903:89:0;;;;;;;:::i;:::-;87007:27;;;;:12;:27;;;;;:35;;;87045:15;-1:-1:-1;86999:80:0;;;;-1:-1:-1;;;86999:80:0;;;;;;;:::i;:::-;87086:16;87153:5;87106:44;87125:10;87136:13;87106:18;:44::i;:::-;:52;;;;:::i;:::-;87086:72;;87173:56;87187:10;87199:5;;87206:8;87215:13;87173;:56::i;:::-;87165:82;;;;-1:-1:-1;;;87165:82:0;;;;;;;:::i;:::-;87293:1;87277:18;;:15;:18;;-1:-1:-1;;;;;;;;;;;87277:18:0;87262:9;;:33;;87254:53;;;;-1:-1:-1;;;87254:53:0;;20950:2:1;87254:53:0;;;20932:21:1;20989:1;20969:18;;;20962:29;-1:-1:-1;;;21007:18:1;;;21000:37;21054:18;;87254:53:0;20748:330:1;87254:53:0;87370:9;;87338;;87394:13;87402:5;87370:9;87394:13;:::i;:::-;87386:21;;87431:13;87422:5;:22;;87414:42;;;;-1:-1:-1;;;87414:42:0;;21798:2:1;87414:42:0;;;21780:21:1;21837:1;21817:18;;;21810:29;-1:-1:-1;;;21855:18:1;;;21848:37;21902:18;;87414:42:0;21596:330:1;87414:42:0;87479:1;87463:18;;;;:15;:18;;-1:-1:-1;;;;;;;;;;;87463:25:0;;87483:5;;87463:18;:25;;87483:5;;87463:25;:::i;:::-;;;;-1:-1:-1;;87521:6:0;;87513:38;;87496:12;;-1:-1:-1;;;;;87521:6:0;;87541:5;;87496:12;87513:38;87496:12;87513:38;87541:5;87521:6;87513:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;87495:56;;;87562:7;87558:44;;87571:31;;-1:-1:-1;;;87571:31:0;;22343:2:1;87571:31:0;;;22325:21:1;22382:2;22362:18;;;22355:30;-1:-1:-1;;;22401:18:1;;;22394:51;22462:18;;87571:31:0;22141:345:1;87558:44:0;87636:1;87612:21;87628:5;87612:13;:21;:::i;:::-;:25;87609:175;;;87672:10;87697:21;87713:5;87697:13;:21;:::i;:::-;87664:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;87650:74;;;;;87739:7;87735:41;;87748:28;;-1:-1:-1;;;87748:28:0;;22693:2:1;87748:28:0;;;22675:21:1;22732:2;22712:18;;;22705:30;-1:-1:-1;;;22751:18:1;;;22744:48;22809:18;;87748:28:0;22491:342:1;87735:41:0;87804:10;87793:22;;;;:10;:22;;;;;;;;:37;;;;;;;;:46;;87834:5;;87793:22;:46;;87834:5;;87793:46;:::i;:::-;;;;-1:-1:-1;;87865:9:0;;87883:6;;87853:56;;;25826:25:1;;;25882:2;25867:18;;25860:34;;;-1:-1:-1;;;;;87883:6:0;;;25948:18:1;;;25941:43;87891:10:0;26015:2:1;26000:18;;25993:43;26067:3;26052:19;;26045:35;;;87853:56:0;;;;;;25813:3:1;87853:56:0;;;86818:1099;;;;;86733:1184;;;:::o;94673:82::-;61242:6;;-1:-1:-1;;;;;61242:6:0;60046:10;61389:23;61381:68;;;;-1:-1:-1;;;61381:68:0;;;;;;;:::i;:::-;94732:9:::1;:17:::0;94673:82::o;19537:104::-;19593:13;19626:7;19619:14;;;;;:::i;93662:77::-;61242:6;;-1:-1:-1;;;;;61242:6:0;60046:10;61389:23;61381:68;;;;-1:-1:-1;;;61381:68:0;;;;;;;:::i;:::-;93721:6:::1;:12:::0;;-1:-1:-1;;;;;;93721:12:0::1;-1:-1:-1::0;;;;;93721:12:0;;;::::1;::::0;;;::::1;::::0;;93662:77::o;83029:254::-;83133:8;55726:42;57620:45;:49;57616:225;;57691:67;;-1:-1:-1;;;57691:67:0;;57742:4;57691:67;;;12031:34:1;-1:-1:-1;;;;;12101:15:1;;12081:18;;;12074:43;55726:42:0;;57691;;11966:18:1;;57691:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57686:144;;57786:28;;-1:-1:-1;;;57786:28:0;;-1:-1:-1;;;;;2398:32:1;;57786:28:0;;;2380:51:1;2353:18;;57786:28:0;2234:203:1;57686:144:0;-1:-1:-1;;;;;83162:27:0;::::1;;::::0;;;:17:::1;:27;::::0;;;;;::::1;;83154:67;;;;-1:-1:-1::0;;;83154:67:0::1;;;;;;;:::i;:::-;83232:43;83256:8;83266;83232:23;:43::i;93838:208::-:0;61242:6;;-1:-1:-1;;;;;61242:6:0;60046:10;61389:23;61381:68;;;;-1:-1:-1;;;61381:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;93929:23:0;::::1;;::::0;;;:17:::1;:23;::::0;;;;;:33;::::1;;:23;::::0;;::::1;:33;;::::0;93921:74:::1;;;::::0;-1:-1:-1;;;93921:74:0;;26293:2:1;93921:74:0::1;::::0;::::1;26275:21:1::0;26332:2;26312:18;;;26305:30;26371;26351:18;;;26344:58;26419:18;;93921:74:0::1;26091:352:1::0;93921:74:0::1;-1:-1:-1::0;;;;;94006:23:0;;;::::1;;::::0;;;:17:::1;:23;::::0;;;;:32;;-1:-1:-1;;94006:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;93838:208::o;94258:180::-;61242:6;;-1:-1:-1;;;;;61242:6:0;60046:10;61389:23;61381:68;;;;-1:-1:-1;;;61381:68:0;;;;;;;:::i;:::-;94397:35:::1;::::0;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;94397:35:0;;;;;;94367:27;;;:12:::1;:27:::0;;;;:65;;;;;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;94258:180::o;84973:146::-;85081:29;;;-1:-1:-1;;;;;26640:32:1;;85081:29:0;;;26622:51:1;26689:18;;;26682:34;;;85044:7:0;;26595:18:1;;85081:29:0;;;;;;;;;;;;85071:40;;;;;;85064:47;;84973:146;;;;:::o;84240:345::-;84372:4;55726:42;56874:45;:49;56870:539;;57163:10;-1:-1:-1;;;;;57155:18:0;;;57151:85;;84415:10:::1;84397:29;::::0;;;:17:::1;:29;::::0;;;;;::::1;;84389:69;;;;-1:-1:-1::0;;;84389:69:0::1;;;;;;;:::i;:::-;84478:16;::::0;;;:7:::1;:16;::::0;;;;;::::1;;84477:17;84469:50;;;;-1:-1:-1::0;;;84469:50:0::1;;;;;;;:::i;:::-;84530:47;84553:4;84559:2;84563:7;84572:4;84530:22;:47::i;:::-;57214:7:::0;;57151:85;57255:69;;-1:-1:-1;;;57255:69:0;;57306:4;57255:69;;;12031:34:1;57313:10:0;12081:18:1;;;12074:43;55726:42:0;;57255;;11966:18:1;;57255:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57250:148;;57352:30;;-1:-1:-1;;;57352:30:0;;57371:10;57352:30;;;2380:51:1;2353:18;;57352:30:0;2234:203:1;57250:148:0;84415:10:::1;84397:29;::::0;;;:17:::1;:29;::::0;;;;;::::1;;84389:69;;;;-1:-1:-1::0;;;84389:69:0::1;;;;;;;:::i;:::-;84478:16;::::0;;;:7:::1;:16;::::0;;;;;::::1;;84477:17;84469:50;;;;-1:-1:-1::0;;;84469:50:0::1;;;;;;;:::i;:::-;84530:47;84553:4;84559:2;84563:7;84572:4;84530:22;:47::i;95589:198::-:0;82606:10;82592:25;;;;:13;:25;;;;;;;;82584:51;;;;-1:-1:-1;;;82584:51:0;;;;;;;:::i;:::-;95679:13:::1;95674:108;95706:8;:15;95698:5;:23;95674:108;;;95768:6;95741:7;:24;95749:8;95758:5;95749:15;;;;;;;;:::i;:::-;;;;;;;95741:24;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;95723:7;;;;;:::i;:::-;;;;95674:108;;86643:74:::0;61242:6;;-1:-1:-1;;;;;61242:6:0;60046:10;61389:23;61381:68;;;;-1:-1:-1;;;61381:68:0;;;;;;;:::i;:::-;86699:4:::1;:12:::0;86643:74::o;96500:334::-;96573:13;96607:16;96615:7;96607;:16::i;:::-;96599:76;;;;-1:-1:-1;;;96599:76:0;;27061:2:1;96599:76:0;;;27043:21:1;27100:2;27080:18;;;27073:30;27139:34;27119:18;;;27112:62;-1:-1:-1;;;27190:18:1;;;27183:45;27245:19;;96599:76:0;26859:411:1;96599:76:0;96688:21;96712:10;:8;:10::i;:::-;96688:34;;96764:1;96746:7;96740:21;:25;:86;;;;;;;;;;;;;;;;;96792:7;96801:18;:7;:16;:18::i;:::-;96775:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;96740:86;96733:93;96500:334;-1:-1:-1;;;96500:334:0:o;95297:105::-;61242:6;;-1:-1:-1;;;;;61242:6:0;60046:10;61389:23;61381:68;;;;-1:-1:-1;;;61381:68:0;;;;;;;:::i;:::-;95386:1:::1;95370:18;::::0;:15:::1;:18;::::0;-1:-1:-1;;;;;;;;;;;95370:26:0;95297:105::o;92639:::-;82606:10;82592:25;;;;:13;:25;;;;;;;;82584:51;;;;-1:-1:-1;;;82584:51:0;;;;;;;:::i;:::-;92699:14:::1;92705:7;92699:5;:14::i;:::-;92725:13;::::0;923:25:1;;;92725:13:0::1;::::0;911:2:1;896:18;92725:13:0::1;777:177:1::0;92750:402:0;82606:10;82592:25;;;;:13;:25;;;;;;;;82584:51;;;;-1:-1:-1;;;82584:51:0;;;;;;;:::i;:::-;92828:13:::1;92844:16;92852:7;92844;:16::i;:::-;-1:-1:-1::0;;;;;92869:25:0;::::1;;::::0;;;:18:::1;:25;::::0;;;;;;;60046:10;92869:46;;;;;;;:53;;-1:-1:-1;;92869:53:0::1;92918:4;92869:53;::::0;;92934:16;;;:7:::1;:16:::0;;;;;;92869:25;;-1:-1:-1;92869:53:0::1;92934:16;92931:208;;;92983:5;92964:16:::0;;;:7:::1;:16;::::0;;;;:24;;-1:-1:-1;;92964:24:0::1;::::0;;93001:32:::1;93014:5:::0;93021:2;92972:7;93001:12:::1;:32::i;:::-;93046:16;::::0;;;:7:::1;:16;::::0;;;;:23;;-1:-1:-1;;93046:23:0::1;93065:4;93046:23;::::0;;83291:244;;;:::o;92931:208::-:1;93097:32;93110:5;93117:2;93121:7;93097:12;:32::i;62069:192::-:0;61242:6;;-1:-1:-1;;;;;61242:6:0;60046:10;61389:23;61381:68;;;;-1:-1:-1;;;61381:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;62158:22:0;::::1;62150:73;;;::::0;-1:-1:-1;;;62150:73:0;;27952:2:1;62150:73:0::1;::::0;::::1;27934:21:1::0;27991:2;27971:18;;;27964:30;28030:34;28010:18;;;28003:62;-1:-1:-1;;;28081:18:1;;;28074:36;28127:19;;62150:73:0::1;27750:402:1::0;62150:73:0::1;62234:19;62244:8;62234:9;:19::i;:::-;62069:192:::0;:::o;94052:113::-;61242:6;;-1:-1:-1;;;;;61242:6:0;60046:10;61389:23;61381:68;;;;-1:-1:-1;;;61381:68:0;;;;;;;:::i;:::-;94127:23:::1;::::0;;;:15:::1;:23;::::0;;;;;:32;94052:113::o;27132:282::-;27197:4;27253:7;14711:1;27234:26;;:66;;;;;27287:13;;27277:7;:23;27234:66;:153;;;;-1:-1:-1;;27338:26:0;;;;:17;:26;;;;;;-1:-1:-1;;;27338:44:0;:49;;27132:282::o;25478:124::-;25567:27;25576:2;25580:7;25589:4;25567:8;:27::i;:::-;25478:124;;:::o;77114:98::-;77172:7;77199:5;77203:1;77199;:5;:::i;77513:98::-;77571:7;77598:5;77602:1;77598;:5;:::i;43282:112::-;43359:27;43369:2;43373:8;43359:27;;;;;;;;;;;;:9;:27::i;29400:2825::-;29542:27;29572;29591:7;29572:18;:27::i;:::-;29542:57;;29657:4;-1:-1:-1;;;;;29616:45:0;29632:19;-1:-1:-1;;;;;29616:45:0;;29612:86;;29670:28;;-1:-1:-1;;;29670:28:0;;;;;;;;;;;29612:86;29712:27;28508:24;;;:15;:24;;;;;28736:26;;29903:68;28736:26;29945:4;60046:10;29951:19;-1:-1:-1;;;;;27982:32:0;;;27826:28;;28111:20;;28133:30;;28108:56;;27523:659;29903:68;29898:180;;29991:43;30008:4;60046:10;26710:164;:::i;29991:43::-;29986:92;;30043:35;;-1:-1:-1;;;30043:35:0;;;;;;;;;;;29986:92;-1:-1:-1;;;;;30095:16:0;;30091:52;;30120:23;;-1:-1:-1;;;30120:23:0;;;;;;;;;;;30091:52;30292:15;30289:160;;;30432:1;30411:19;30404:30;30289:160;-1:-1:-1;;;;;30829:24:0;;;;;;;:18;:24;;;;;;30827:26;;-1:-1:-1;;30827:26:0;;;30898:22;;;;;;;;;30896:24;;-1:-1:-1;30896:24:0;;;24580:11;24555:23;24551:41;24538:63;-1:-1:-1;;;24538:63:0;31191:26;;;;:17;:26;;;;;:175;;;;-1:-1:-1;;;31486:47:0;;:52;;31482:627;;31591:1;31581:11;;31559:19;31714:30;;;:17;:30;;;;;;:35;;31710:384;;31852:13;;31837:11;:28;31833:242;;31999:30;;;;:17;:30;;;;;:52;;;31833:242;31540:569;31482:627;32156:7;32152:2;-1:-1:-1;;;;;32137:27:0;32146:4;-1:-1:-1;;;;;32137:27:0;-1:-1:-1;;;;;;;;;;;32137:27:0;;;;;;;;;29531:2694;;;29400:2825;;;:::o;32331:193::-;32477:39;32494:4;32500:2;32504:7;32477:39;;;;;;;;;;;;:16;:39::i;21909:1712::-;21976:14;22026:7;14711:1;22007:26;22003:1562;;-1:-1:-1;22059:26:0;;;;:17;:26;;;;;;;-1:-1:-1;;;22135:24:0;;:29;;22131:1423;;22274:6;22284:1;22274:11;22270:981;;22325:13;;22314:7;:24;22310:68;;22347:31;;-1:-1:-1;;;22347:31:0;;;;;;;;;;;22310:68;22975:257;-1:-1:-1;;;23079:9:0;23061:28;;;;:17;:28;;;;;;23143:25;;22975:257;23143:25;;21909:1712;;;:::o;22131:1423::-;23582:31;;-1:-1:-1;;;23582:31:0;;;;;;;;;;;62269:174;62345:6;;;-1:-1:-1;;;;;62362:17:0;;;-1:-1:-1;;;;;;62362:17:0;;;;;;;62395:40;;62345:6;;;62362:17;62345:6;;62395:40;;62326:16;;62395:40;62315:128;62269:174;:::o;85125:159::-;85215:4;85239:37;85258:5;85265:4;85271;85239:18;:37::i;:::-;85232:44;85125:159;-1:-1:-1;;;;85125:159:0:o;91745:381::-;91844:4;91807:15;;91877:238;91909:8;:15;91901:5;:23;91877:238;;;91954:8;91963:5;91954:15;;;;;;;;:::i;:::-;;;;;;;91944:25;;91981:11;:20;91993:7;91981:20;;;;;;;;;;;;92005:1;91981:25;91978:130;;92031:5;92018:18;;92047:5;;91978:130;92078:20;92084:7;92093:4;92078:5;:20::i;:::-;91926:7;;;;:::i;:::-;;;;91877:238;;;;91824:302;91745:381;;;:::o;26319:234::-;60046:10;26414:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;26414:49:0;;;;;;;;;;;;:60;;-1:-1:-1;;26414:60:0;;;;;;;;;;26490:55;;540:41:1;;;26414:49:0;;60046:10;26490:55;;513:18:1;26490:55:0;;;;;;;26319:234;;:::o;33122:407::-;33297:31;33310:4;33316:2;33320:7;33297:12;:31::i;:::-;-1:-1:-1;;;;;33343:14:0;;;:19;33339:183;;33382:56;33413:4;33419:2;33423:7;33432:5;33382:30;:56::i;:::-;33377:145;;33466:40;;-1:-1:-1;;;33466:40:0;;;;;;;;;;;96326:106;96386:13;96417:7;96410:14;;;;;:::i;62880:723::-;62936:13;63157:5;63166:1;63157:10;63153:53;;-1:-1:-1;;63184:10:0;;;;;;;;;;;;-1:-1:-1;;;63184:10:0;;;;;62880:723::o;63153:53::-;63231:5;63216:12;63272:78;63279:9;;63272:78;;63305:8;;;;:::i;:::-;;-1:-1:-1;63328:10:0;;-1:-1:-1;63336:2:0;63328:10;;:::i;:::-;;;63272:78;;;63360:19;63392:6;-1:-1:-1;;;;;63382:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;63382:17:0;;63360:39;;63410:154;63417:10;;63410:154;;63444:11;63454:1;63444:11;;:::i;:::-;;-1:-1:-1;63513:10:0;63521:2;63513:5;:10;:::i;:::-;63500:24;;:2;:24;:::i;:::-;63487:39;;63470:6;63477;63470:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;63470:56:0;;;;;;;;-1:-1:-1;63541:11:0;63550:2;63541:11;;:::i;:::-;;;63410:154;;44959:89;45019:21;45025:7;45034:5;45019;:21::i;44200:492::-;44329:13;44345:16;44353:7;44345;:16::i;:::-;44329:32;;44378:13;44374:219;;;60046:10;-1:-1:-1;;;;;44410:28:0;;;44406:187;;44462:44;44479:5;60046:10;26710:164;:::i;44462:44::-;44457:136;;44538:35;;-1:-1:-1;;;44538:35:0;;;;;;;;;;;44457:136;44605:24;;;;:15;:24;;;;;;:35;;-1:-1:-1;;;;;;44605:35:0;-1:-1:-1;;;;;44605:35:0;;;;;;;;;44656:28;;44605:24;;44656:28;;;;;;;44318:374;44200:492;;;:::o;42509:689::-;42640:19;42646:2;42650:8;42640:5;:19::i;:::-;-1:-1:-1;;;;;42701:14:0;;;:19;42697:483;;42741:11;42755:13;42803:14;;;42836:233;42867:62;42906:1;42910:2;42914:7;;;;;;42923:5;42867:30;:62::i;:::-;42862:167;;42965:40;;-1:-1:-1;;;42965:40:0;;;;;;;;;;;42862:167;43064:3;43056:5;:11;42836:233;;43151:3;43134:13;;:20;43130:34;;43156:8;;;80644:190;80769:4;80822;80793:25;80806:5;80813:4;80793:12;:25::i;:::-;:33;;80644:190;-1:-1:-1;;;;80644:190:0:o;45277:3081::-;45357:27;45387;45406:7;45387:18;:27::i;:::-;45357:57;-1:-1:-1;45357:57:0;45427:12;;45549:35;45576:7;28397:27;28508:24;;;:15;:24;;;;;28736:26;;28508:24;;28295:485;45549:35;45492:92;;;;45601:13;45597:316;;;45722:68;45747:15;45764:4;60046:10;45770:19;59966:98;45722:68;45717:184;;45814:43;45831:4;60046:10;26710:164;:::i;45814:43::-;45809:92;;45866:35;;-1:-1:-1;;;45866:35:0;;;;;;;;;;;45809:92;46069:15;46066:160;;;46209:1;46188:19;46181:30;46066:160;-1:-1:-1;;;;;46828:24:0;;;;;;:18;:24;;;;;:60;;46856:32;46828:60;;;24580:11;24555:23;24551:41;24538:63;-1:-1:-1;;;24538:63:0;47126:26;;;;:17;:26;;;;;:205;;;;-1:-1:-1;;;47451:47:0;;:52;;47447:627;;47556:1;47546:11;;47524:19;47679:30;;;:17;:30;;;;;;:35;;47675:384;;47817:13;;47802:11;:28;47798:242;;47964:30;;;;:17;:30;;;;;:52;;;47798:242;47505:569;47447:627;48102:35;;48129:7;;48125:1;;-1:-1:-1;;;;;48102:35:0;;;-1:-1:-1;;;;;;;;;;;48102:35:0;48125:1;;48102:35;-1:-1:-1;;48325:12:0;:14;;;;;;-1:-1:-1;;;;45277:3081:0:o;35613:716::-;35797:88;;-1:-1:-1;;;35797:88:0;;35776:4;;-1:-1:-1;;;;;35797:45:0;;;;;:88;;60046:10;;35864:4;;35870:7;;35879:5;;35797:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35797:88:0;;;;;;;;-1:-1:-1;;35797:88:0;;;;;;;;;;;;:::i;:::-;;;35793:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36080:6;:13;36097:1;36080:18;36076:235;;36126:40;;-1:-1:-1;;;36126:40:0;;;;;;;;;;;36076:235;36269:6;36263:13;36254:6;36250:2;36246:15;36239:38;35793:529;-1:-1:-1;;;;;;35956:64:0;-1:-1:-1;;;35956:64:0;;-1:-1:-1;35613:716:0;;;;;;:::o;36791:2966::-;36864:20;36887:13;;;36915;;;36911:44;;36937:18;;-1:-1:-1;;;36937:18:0;;;;;;;;;;;36911:44;-1:-1:-1;;;;;37443:22:0;;;;;;:18;:22;;;;10591:2;37443:22;;;:71;;37481:32;37469:45;;37443:71;;;37757:31;;;:17;:31;;;;;-1:-1:-1;25011:15:0;;24985:24;24981:46;24580:11;24555:23;24551:41;24548:52;24538:63;;37757:173;;37992:23;;;;37757:31;;37443:22;;-1:-1:-1;;;;;;;;;;;37443:22:0;;38610:335;39271:1;39257:12;39253:20;39211:346;39312:3;39303:7;39300:16;39211:346;;39530:7;39520:8;39517:1;-1:-1:-1;;;;;;;;;;;39487:1:0;39484;39479:59;39365:1;39352:15;39211:346;;;39215:77;39590:8;39602:1;39590:13;39586:45;;39612:19;;-1:-1:-1;;;39612:19:0;;;;;;;;;;;39586:45;39648:13;:19;-1:-1:-1;83291:244:0;;;:::o;80842:675::-;80925:7;80968:4;80925:7;80983:497;81007:5;:12;81003:1;:16;80983:497;;;81041:20;81064:5;81070:1;81064:8;;;;;;;;:::i;:::-;;;;;;;81041:31;;81107:12;81091;:28;81087:382;;81593:13;81643:15;;;81679:4;81672:15;;;81726:4;81710:21;;81219:57;;81087:382;;;81593:13;81643:15;;;81679:4;81672:15;;;81726:4;81710:21;;81396:57;;81087:382;-1:-1:-1;81021:3:0;;;;:::i;:::-;;;;80983:497;;;-1:-1:-1;81497:12:0;80842:675;-1:-1:-1;;;80842:675:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;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:180::-;651:6;704:2;692:9;683:7;679:23;675:32;672:52;;;720:1;717;710:12;672:52;-1:-1:-1;743:23:1;;592:180;-1:-1:-1;592:180:1:o;959:173::-;1027:20;;-1:-1:-1;;;;;1076:31:1;;1066:42;;1056:70;;1122:1;1119;1112:12;1137:186;1196:6;1249:2;1237:9;1228:7;1224:23;1220:32;1217:52;;;1265:1;1262;1255:12;1217:52;1288:29;1307:9;1288:29;:::i;1483:258::-;1555:1;1565:113;1579:6;1576:1;1573:13;1565:113;;;1655:11;;;1649:18;1636:11;;;1629:39;1601:2;1594:10;1565:113;;;1696:6;1693:1;1690:13;1687:48;;;-1:-1:-1;;1731:1:1;1713:16;;1706:27;1483:258::o;1746:::-;1788:3;1826:5;1820:12;1853:6;1848:3;1841:19;1869:63;1925:6;1918:4;1913:3;1909:14;1902:4;1895:5;1891:16;1869:63;:::i;:::-;1986:2;1965:15;-1:-1:-1;;1961:29:1;1952:39;;;;1993:4;1948:50;;1746:258;-1:-1:-1;;1746:258:1:o;2009:220::-;2158:2;2147:9;2140:21;2121:4;2178:45;2219:2;2208:9;2204:18;2196:6;2178:45;:::i;2624:254::-;2692:6;2700;2753:2;2741:9;2732:7;2728:23;2724:32;2721:52;;;2769:1;2766;2759:12;2721:52;2792:29;2811:9;2792:29;:::i;:::-;2782:39;2868:2;2853:18;;;;2840:32;;-1:-1:-1;;;2624:254:1:o;2883:118::-;2969:5;2962:13;2955:21;2948:5;2945:32;2935:60;;2991:1;2988;2981:12;3006:309;3071:6;3079;3132:2;3120:9;3111:7;3107:23;3103:32;3100:52;;;3148:1;3145;3138:12;3100:52;3184:9;3171:23;3161:33;;3244:2;3233:9;3229:18;3216:32;3257:28;3279:5;3257:28;:::i;:::-;3304:5;3294:15;;;3006:309;;;;;:::o;3320:328::-;3397:6;3405;3413;3466:2;3454:9;3445:7;3441:23;3437:32;3434:52;;;3482:1;3479;3472:12;3434:52;3505:29;3524:9;3505:29;:::i;:::-;3495:39;;3553:38;3587:2;3576:9;3572:18;3553:38;:::i;:::-;3543:48;;3638:2;3627:9;3623:18;3610:32;3600:42;;3320:328;;;;;:::o;3653:377::-;3727:6;3735;3743;3796:2;3784:9;3775:7;3771:23;3767:32;3764:52;;;3812:1;3809;3802:12;3764:52;3848:9;3835:23;3825:33;;3905:2;3894:9;3890:18;3877:32;3867:42;;3959:2;3948:9;3944:18;3931:32;3972:28;3994:5;3972:28;:::i;:::-;4019:5;4009:15;;;3653:377;;;;;:::o;4528:127::-;4589:10;4584:3;4580:20;4577:1;4570:31;4620:4;4617:1;4610:15;4644:4;4641:1;4634:15;4660:275;4731:2;4725:9;4796:2;4777:13;;-1:-1:-1;;4773:27:1;4761:40;;-1:-1:-1;;;;;4816:34:1;;4852:22;;;4813:62;4810:88;;;4878:18;;:::i;:::-;4914:2;4907:22;4660:275;;-1:-1:-1;4660:275:1:o;4940:407::-;5005:5;-1:-1:-1;;;;;5031:6:1;5028:30;5025:56;;;5061:18;;:::i;:::-;5099:57;5144:2;5123:15;;-1:-1:-1;;5119:29:1;5150:4;5115:40;5099:57;:::i;:::-;5090:66;;5179:6;5172:5;5165:21;5219:3;5210:6;5205:3;5201:16;5198:25;5195:45;;;5236:1;5233;5226:12;5195:45;5285:6;5280:3;5273:4;5266:5;5262:16;5249:43;5339:1;5332:4;5323:6;5316:5;5312:18;5308:29;5301:40;4940:407;;;;;:::o;5352:451::-;5421:6;5474:2;5462:9;5453:7;5449:23;5445:32;5442:52;;;5490:1;5487;5480:12;5442:52;5530:9;5517:23;-1:-1:-1;;;;;5555:6:1;5552:30;5549:50;;;5595:1;5592;5585:12;5549:50;5618:22;;5671:4;5663:13;;5659:27;-1:-1:-1;5649:55:1;;5700:1;5697;5690:12;5649:55;5723:74;5789:7;5784:2;5771:16;5766:2;5762;5758:11;5723:74;:::i;5808:367::-;5871:8;5881:6;5935:3;5928:4;5920:6;5916:17;5912:27;5902:55;;5953:1;5950;5943:12;5902:55;-1:-1:-1;5976:20:1;;-1:-1:-1;;;;;6008:30:1;;6005:50;;;6051:1;6048;6041:12;6005:50;6088:4;6080:6;6076:17;6064:29;;6148:3;6141:4;6131:6;6128:1;6124:14;6116:6;6112:27;6108:38;6105:47;6102:67;;;6165:1;6162;6155:12;6180:703;6290:6;6298;6306;6314;6322;6375:3;6363:9;6354:7;6350:23;6346:33;6343:53;;;6392:1;6389;6382:12;6343:53;6432:9;6419:23;-1:-1:-1;;;;;6457:6:1;6454:30;6451:50;;;6497:1;6494;6487:12;6451:50;6536:70;6598:7;6589:6;6578:9;6574:22;6536:70;:::i;:::-;6625:8;;-1:-1:-1;6510:96:1;-1:-1:-1;;6707:2:1;6692:18;;6679:32;;-1:-1:-1;6761:2:1;6746:18;;6733:32;6774:28;6733:32;6774:28;:::i;:::-;6180:703;;;;-1:-1:-1;6180:703:1;;6873:2;6858:18;6845:32;;6180:703;-1:-1:-1;;6180:703:1:o;6888:648::-;7001:6;7009;7017;7025;7033;7086:3;7074:9;7065:7;7061:23;7057:33;7054:53;;;7103:1;7100;7093:12;7054:53;7126:29;7145:9;7126:29;:::i;:::-;7116:39;;7206:2;7195:9;7191:18;7178:32;-1:-1:-1;;;;;7225:6:1;7222:30;7219:50;;;7265:1;7262;7255:12;7219:50;7304:70;7366:7;7357:6;7346:9;7342:22;7304:70;:::i;:::-;6888:648;;7393:8;;-1:-1:-1;7278:96:1;;7475:2;7460:18;;7447:32;;7526:2;7511:18;;;7498:32;;-1:-1:-1;6888:648:1;-1:-1:-1;;;;6888:648:1:o;7541:712::-;7595:5;7648:3;7641:4;7633:6;7629:17;7625:27;7615:55;;7666:1;7663;7656:12;7615:55;7702:6;7689:20;7728:4;-1:-1:-1;;;;;7747:2:1;7744:26;7741:52;;;7773:18;;:::i;:::-;7819:2;7816:1;7812:10;7842:28;7866:2;7862;7858:11;7842:28;:::i;:::-;7904:15;;;7974;;;7970:24;;;7935:12;;;;8006:15;;;8003:35;;;8034:1;8031;8024:12;8003:35;8070:2;8062:6;8058:15;8047:26;;8082:142;8098:6;8093:3;8090:15;8082:142;;;8164:17;;8152:30;;8115:12;;;;8202;;;;8082:142;;;8242:5;7541:712;-1:-1:-1;;;;;;;7541:712:1:o;8258:348::-;8342:6;8395:2;8383:9;8374:7;8370:23;8366:32;8363:52;;;8411:1;8408;8401:12;8363:52;8451:9;8438:23;-1:-1:-1;;;;;8476:6:1;8473:30;8470:50;;;8516:1;8513;8506:12;8470:50;8539:61;8592:7;8583:6;8572:9;8568:22;8539:61;:::i;8611:505::-;8706:6;8714;8722;8775:2;8763:9;8754:7;8750:23;8746:32;8743:52;;;8791:1;8788;8781:12;8743:52;8831:9;8818:23;-1:-1:-1;;;;;8856:6:1;8853:30;8850:50;;;8896:1;8893;8886:12;8850:50;8935:70;8997:7;8988:6;8977:9;8973:22;8935:70;:::i;:::-;9024:8;;8909:96;;-1:-1:-1;9106:2:1;9091:18;;;;9078:32;;8611:505;-1:-1:-1;;;;8611:505:1:o;9121:315::-;9186:6;9194;9247:2;9235:9;9226:7;9222:23;9218:32;9215:52;;;9263:1;9260;9253:12;9215:52;9286:29;9305:9;9286:29;:::i;:::-;9276:39;;9365:2;9354:9;9350:18;9337:32;9378:28;9400:5;9378:28;:::i;9441:316::-;9518:6;9526;9534;9587:2;9575:9;9566:7;9562:23;9558:32;9555:52;;;9603:1;9600;9593:12;9555:52;-1:-1:-1;;9626:23:1;;;9696:2;9681:18;;9668:32;;-1:-1:-1;9747:2:1;9732:18;;;9719:32;;9441:316;-1:-1:-1;9441:316:1:o;9762:667::-;9857:6;9865;9873;9881;9934:3;9922:9;9913:7;9909:23;9905:33;9902:53;;;9951:1;9948;9941:12;9902:53;9974:29;9993:9;9974:29;:::i;:::-;9964:39;;10022:38;10056:2;10045:9;10041:18;10022:38;:::i;:::-;10012:48;;10107:2;10096:9;10092:18;10079:32;10069:42;;10162:2;10151:9;10147:18;10134:32;-1:-1:-1;;;;;10181:6:1;10178:30;10175:50;;;10221:1;10218;10211:12;10175:50;10244:22;;10297:4;10289:13;;10285:27;-1:-1:-1;10275:55:1;;10326:1;10323;10316:12;10275:55;10349:74;10415:7;10410:2;10397:16;10392:2;10388;10384:11;10349:74;:::i;:::-;10339:84;;;9762:667;;;;;;;:::o;10434:477::-;10524:6;10532;10585:2;10573:9;10564:7;10560:23;10556:32;10553:52;;;10601:1;10598;10591:12;10553:52;10641:9;10628:23;-1:-1:-1;;;;;10666:6:1;10663:30;10660:50;;;10706:1;10703;10696:12;10660:50;10729:61;10782:7;10773:6;10762:9;10758:22;10729:61;:::i;:::-;10719:71;;;10840:2;10829:9;10825:18;10812:32;10853:28;10875:5;10853:28;:::i;10916:260::-;10984:6;10992;11045:2;11033:9;11024:7;11020:23;11016:32;11013:52;;;11061:1;11058;11051:12;11013:52;11084:29;11103:9;11084:29;:::i;:::-;11074:39;;11132:38;11166:2;11155:9;11151:18;11132:38;:::i;:::-;11122:48;;10916:260;;;;;:::o;11181:248::-;11249:6;11257;11310:2;11298:9;11289:7;11285:23;11281:32;11278:52;;;11326:1;11323;11316:12;11278:52;-1:-1:-1;;11349:23:1;;;11419:2;11404:18;;;11391:32;;-1:-1:-1;11181:248:1:o;11434:380::-;11513:1;11509:12;;;;11556;;;11577:61;;11631:4;11623:6;11619:17;11609:27;;11577:61;11684:2;11676:6;11673:14;11653:18;11650:38;11647:161;;11730:10;11725:3;11721:20;11718:1;11711:31;11765:4;11762:1;11755:15;11793:4;11790:1;11783:15;11647:161;;11434:380;;;:::o;12128:245::-;12195:6;12248:2;12236:9;12227:7;12223:23;12219:32;12216:52;;;12264:1;12261;12254:12;12216:52;12296:9;12290:16;12315:28;12337:5;12315:28;:::i;12378:352::-;12580:2;12562:21;;;12619:2;12599:18;;;12592:30;12658;12653:2;12638:18;;12631:58;12721:2;12706:18;;12378:352::o;12735:326::-;12937:2;12919:21;;;12976:1;12956:18;;;12949:29;-1:-1:-1;;;13009:2:1;12994:18;;12987:33;13052:2;13037:18;;12735:326::o;13406:344::-;13608:2;13590:21;;;13647:2;13627:18;;;13620:30;-1:-1:-1;;;13681:2:1;13666:18;;13659:50;13741:2;13726:18;;13406:344::o;13755:338::-;13957:2;13939:21;;;13996:2;13976:18;;;13969:30;-1:-1:-1;;;14030:2:1;14015:18;;14008:44;14084:2;14069:18;;13755:338::o;14098:127::-;14159:10;14154:3;14150:20;14147:1;14140:31;14190:4;14187:1;14180:15;14214:4;14211:1;14204:15;14230:125;14270:4;14298:1;14295;14292:8;14289:34;;;14303:18;;:::i;:::-;-1:-1:-1;14340:9:1;;14230:125::o;14360:128::-;14400:3;14431:1;14427:6;14424:1;14421:13;14418:39;;;14437:18;;:::i;:::-;-1:-1:-1;14473:9:1;;14360:128::o;14493:519::-;14752:25;;;14808:2;14793:18;;14786:34;;;;14851:2;14836:18;;14829:34;;;;-1:-1:-1;;;;;14937:15:1;;;14932:2;14917:18;;14910:43;14990:15;14984:3;14969:19;;14962:44;14739:3;14724:19;;14493:519::o;15017:127::-;15078:10;15073:3;15069:20;15066:1;15059:31;15109:4;15106:1;15099:15;15133:4;15130:1;15123:15;15149:112;15181:1;15207;15197:35;;15212:18;;:::i;:::-;-1:-1:-1;15246:9:1;;15149:112::o;15266:135::-;15305:3;15326:17;;;15323:43;;15346:18;;:::i;:::-;-1:-1:-1;15393:1:1;15382:13;;15266:135::o;15543:469::-;15604:3;15642:5;15636:12;15669:6;15664:3;15657:19;15695:4;15724:2;15719:3;15715:12;15708:19;;15746:5;15743:1;15736:16;15788:2;15785:1;15775:16;15809:1;15819:168;15833:6;15830:1;15827:13;15819:168;;;15894:13;;15882:26;;15928:12;;;;15975:1;15963:14;;;;15848:9;15819:168;;;-1:-1:-1;16003:3:1;;15543:469;-1:-1:-1;;;;;15543:469:1:o;16017:507::-;16277:6;16266:9;16259:25;16320:6;16315:2;16304:9;16300:18;16293:34;16392:1;16388;16383:3;16379:11;16375:19;16367:6;16363:32;16358:2;16347:9;16343:18;16336:60;16432:3;16427:2;16416:9;16412:18;16405:31;16240:4;16453:65;16513:3;16502:9;16498:19;16490:6;16453:65;:::i;16529:356::-;16731:2;16713:21;;;16750:18;;;16743:30;16809:34;16804:2;16789:18;;16782:62;16876:2;16861:18;;16529:356::o;16890:337::-;17092:2;17074:21;;;17131:2;17111:18;;;17104:30;-1:-1:-1;;;17165:2:1;17150:18;;17143:43;17218:2;17203:18;;16890:337::o;17579:345::-;17781:2;17763:21;;;17820:2;17800:18;;;17793:30;-1:-1:-1;;;17854:2:1;17839:18;;17832:51;17915:2;17900:18;;17579:345::o;18274:579::-;18562:6;18551:9;18544:25;18605:6;18600:2;18589:9;18585:18;18578:34;18648:6;18643:2;18632:9;18628:18;18621:34;18720:1;18716;18711:3;18707:11;18703:19;18695:6;18691:32;18686:2;18675:9;18671:18;18664:60;18761:3;18755;18744:9;18740:19;18733:32;18525:4;18782:65;18842:3;18831:9;18827:19;18819:6;18782:65;:::i;18858:1197::-;18967:4;18996:2;19025;19014:9;19007:21;19048:1;19081:6;19075:13;19111:3;19133:1;19161:9;19157:2;19153:18;19143:28;;19221:2;19210:9;19206:18;19243;19233:61;;19287:4;19279:6;19275:17;19265:27;;19233:61;19340:2;19332:6;19329:14;19309:18;19306:38;19303:165;;-1:-1:-1;;;19367:33:1;;19423:4;19420:1;19413:15;19453:4;19374:3;19441:17;19303:165;19524:18;;;1415:19;;;1467:4;1458:14;19567:18;19594:100;;;;19708:1;19703:326;;;;19560:469;;19594:100;-1:-1:-1;;19627:24:1;;19615:37;;19672:12;;;;-1:-1:-1;19594:100:1;;19703:326;15490:1;15483:14;;;15527:4;15514:18;;19809:1;19823:165;19837:6;19834:1;19831:13;19823:165;;;19915:14;;19902:11;;;19895:35;19958:16;;;;19852:10;;19823:165;;;20008:11;;;-1:-1:-1;;19560:469:1;-1:-1:-1;20046:3:1;;18858:1197;-1:-1:-1;;;;;;;;;18858:1197:1:o;21423:168::-;21463:7;21529:1;21525;21521:6;21517:14;21514:1;21511:21;21506:1;21499:9;21492:17;21488:45;21485:71;;;21536:18;;:::i;:::-;-1:-1:-1;21576:9:1;;21423:168::o;22838:753::-;23182:6;23171:9;23164:25;23225:6;23220:2;23209:9;23205:18;23198:34;23268:6;23263:2;23252:9;23248:18;23241:34;23311:6;23306:2;23295:9;23291:18;23284:34;23145:4;23354:1;23350;23345:3;23341:11;23337:19;23405:2;23397:6;23393:15;23387:3;23376:9;23372:19;23365:44;23458:2;23450:6;23446:15;23440:3;23429:9;23425:19;23418:44;;23499:3;23493;23482:9;23478:19;23471:32;23520:65;23580:3;23569:9;23565:19;23557:6;23520:65;:::i;:::-;23512:73;22838:753;-1:-1:-1;;;;;;;;;22838:753:1:o;24761:801::-;24959:4;25007:2;24996:9;24992:18;25037:6;25026:9;25019:25;25063:2;25101;25096;25085:9;25081:18;25074:30;25124:6;25159;25153:13;25190:6;25182;25175:22;25228:3;25217:9;25213:19;25206:26;;25267:2;25259:6;25255:15;25241:29;;25288:1;25298:169;25312:6;25309:1;25306:13;25298:169;;;25373:13;;25361:26;;25442:15;;;;25407:12;;;;25334:1;25327:9;25298:169;;;-1:-1:-1;;;;;;;25523:32:1;;;;25518:2;25503:18;;;;25496:60;;;;-1:-1:-1;25484:3:1;;24761:801;-1:-1:-1;;;;24761:801:1:o;26727:127::-;26788:10;26783:3;26779:20;26776:1;26769:31;26819:4;26816:1;26809:15;26843:4;26840:1;26833:15;27275:470;27454:3;27492:6;27486:13;27508:53;27554:6;27549:3;27542:4;27534:6;27530:17;27508:53;:::i;:::-;27624:13;;27583:16;;;;27646:57;27624:13;27583:16;27680:4;27668:17;;27646:57;:::i;:::-;27719:20;;27275:470;-1:-1:-1;;;;27275:470:1:o;28157:120::-;28197:1;28223;28213:35;;28228:18;;:::i;:::-;-1:-1:-1;28262:9:1;;28157:120::o;28282:489::-;-1:-1:-1;;;;;28551:15:1;;;28533:34;;28603:15;;28598:2;28583:18;;28576:43;28650:2;28635:18;;28628:34;;;28698:3;28693:2;28678:18;;28671:31;;;28476:4;;28719:46;;28745:19;;28737:6;28719:46;:::i;28776:249::-;28845:6;28898:2;28886:9;28877:7;28873:23;28869:32;28866:52;;;28914:1;28911;28904:12;28866:52;28946:9;28940:16;28965:30;28989:5;28965:30;:::i

Swarm Source

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