ETH Price: $2,626.83 (+7.48%)

Token

WeirdElves (WRDELVS)
 

Overview

Max Total Supply

210 WRDELVS

Holders

57

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
4 WRDELVS
0x7c23b1174d22d18964f80e0cc1b77dbb02582d06
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:
WeirdElves

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 10000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-12-11
*/

// File: @openzeppelin/contracts/access/Ownable.sol

// SPDX-License-Identifier: MIT

// File: @openzeppelin/contracts/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: @openzeppelin/contracts/utils/introspection/IERC165.sol

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol

pragma solidity ^0.8.0;


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

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

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

pragma solidity ^0.8.0;

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

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

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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC721/ERC721.sol

pragma solidity ^0.8.0;

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

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

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

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

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

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

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

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @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.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

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

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

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

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

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * 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, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * 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, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

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

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/utils/Address.sol

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol

pragma solidity ^0.8.0;

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

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) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: Cybermon

abstract contract CybermonValues{
    enum Generation{ GEND, GENC, GENB, GENA }
    struct creatureStat { 
       bool gender;
       Generation generation;
       uint256 tokenId;
    }
}

abstract contract Cybermon is CybermonValues {
    function walletOfOwner(address _owner) public virtual returns (creatureStat[] memory);
}

// File: weirdelves.sol

pragma solidity ^0.8.0;

contract WeirdElves is ERC721Enumerable, Ownable, CybermonValues {
    using Address for address;
    using Strings for uint256;
    
    uint256 public NFT_PRICE_PUBLIC = 35000000000000000; // 0.035 ETH
    uint256 public NFT_PRICE_WHITELIST = 30000000000000000; // 0.03 ETH
    uint256 public constant MAX_NFT_PURCHASE = 20;
    uint256 public constant MAX_NFT_WHITELIST = 10;
     uint256 public constant MAX_SUPPLY = 10000;
    
    bool public whitelistPhase = false;
    bool public freePhase = false;    
    bool public publicSalePhase = false;
    bool public fusionPhase = false;

    string private _baseTokenURI;
    address private cybermonContract;
    uint256 public mintedEliteElves = 0;
    mapping(uint256 => bool) _cybermonTokensMinted;
    mapping (uint256 => string) _tokenURIs;
    mapping(address => bool) _whiteList;
   
    constructor() ERC721("WeirdElves","WRDELVS"){
        cybermonContract = 0x31e88992C8F25417B11c72E1344941c9113b4998;
    }
    
    function toggleWhitelistPhase() public onlyOwner {
        whitelistPhase = !whitelistPhase;
    }
    
    function toggleFreePhase() public onlyOwner {
        freePhase = !freePhase;
    } 
    
    function togglePublicSalePhase() public onlyOwner {
        publicSalePhase = !publicSalePhase;
    }
    
    function toggleFusionPhase() public onlyOwner {
        fusionPhase = !fusionPhase;
    }
    
    function airdrop(address to, uint256 numberOfTokens) public onlyOwner {
        uint256 totalSupply = totalSupply();
        
        for (uint256 i = 0; i < numberOfTokens; i++) {
            _safeMint(to, totalSupply + i);
        }
    }

    function mintChecks(uint256 numberOfTokens, uint256 msgVal, address sender, bool whiteList) private view {
        uint256 totalSupply = totalSupply();
        require(numberOfTokens > 0, "Amount too small");
        require((totalSupply + numberOfTokens) <= MAX_SUPPLY, "Purchase exceeding max supply");        

        if(whiteList) {
            require(whitelistPhase, "You are not able to mint");
            require(isWhitelisted(sender), "You are not whitelisted");
            require((MAX_NFT_WHITELIST - balanceOf(msg.sender)) >= numberOfTokens, "Cant mint that much");
            require(NFT_PRICE_WHITELIST * numberOfTokens == msgVal, "Sent ether val is incorrect");
        }
        else {
            require(publicSalePhase, "You are not able to mint");
            require(numberOfTokens <= MAX_NFT_PURCHASE, "Max 20 tokens per trx");     
            require(NFT_PRICE_PUBLIC * numberOfTokens == msgVal, "Sent ether val is incorrect");       
        }
    }
    
    function freeMint(uint256 numberOfTokens) public {
        uint256 totalSupply = totalSupply();
        require(freePhase, "Free sale not started yet");
        require(numberOfTokens > 0, "Amount too small");
        require((totalSupply + numberOfTokens) <= MAX_SUPPLY, "Purchase exceeding max supply");
        
        uint256[] memory mintableTokens = getMintableTokens(msg.sender, numberOfTokens);
        
        for (uint256 i = 0; i < numberOfTokens; i++) {
           _safeMint(msg.sender, totalSupply + i);
           _cybermonTokensMinted[mintableTokens[i]] = true;
        }
    }

    function mint(uint256 numberOfTokens, bool whitelist) public payable {
        uint256 totalSupply = totalSupply();
        mintChecks(numberOfTokens, msg.value, msg.sender, whitelist);        

        for (uint256 i = 0; i < numberOfTokens; i++) {
            _safeMint(msg.sender, totalSupply + i);
        }
    }
    
    function fuse(uint256 tokenId1, uint256 tokenId2) public {
       require(fusionPhase, "Cant fuse elves at the moment");
       require(msg.sender == ownerOf(tokenId1), "This isnt your NFT");
       require(msg.sender == ownerOf(tokenId2), "This isnt your NFT");
       require(tokenId1 < MAX_SUPPLY , "Cant fuse elite elve");
       require(tokenId2 < MAX_SUPPLY , "Cant fuse elite elve");
       
       _burn(tokenId1);
       _burn(tokenId2);
       
       _safeMint(msg.sender, MAX_SUPPLY + mintedEliteElves);
       mintedEliteElves++;
    }
    
    function getMintableTokens(address sender, uint256 numberOfTokens) private returns(uint256[] memory) {
        Cybermon c = Cybermon(cybermonContract);
        creatureStat[] memory creatures = c.walletOfOwner(sender);
        uint256[] memory mintableTokens = new uint256[](creatures.length);
        
        uint256 idx = 0;
        for (uint256 i = 0; i < creatures.length; i++) {
            if(_cybermonTokensMinted[creatures[i].tokenId] == false) {
                mintableTokens[idx] = creatures[i].tokenId;
                idx++;
            }
        }
        require(idx >= numberOfTokens, "You dont own enough Cybereggs");
        return mintableTokens;
    }
    
    function isWhitelisted(address sender) public view returns (bool) {
        if(_whiteList[sender] && whitelistPhase)
            return true;
        
        return false;
    }
   
    function walletOfOwner(address _owner) public view returns (uint256[] memory)
    {
        uint256 tokenCount = balanceOf(_owner);
        uint256[] memory tokenIds = new uint256[](tokenCount);
        for (uint256 i = 0; i < tokenCount; i++) {
            tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokenIds;
    }

    function eliteHolders() public view onlyOwner returns (address[] memory)
    {
        uint256 tokenCount = totalSupply() - MAX_SUPPLY;
        address[] memory owners = new address[](tokenCount);
        for (uint256 i = 0; i < tokenCount; i++) {
            owners[i] = ownerOf(MAX_SUPPLY + i);
        }
        return owners;
    }
    
    function addToWhiteList(address[] memory accounts) external onlyOwner{
        require(accounts.length > 0, "Invalid input");
        for(uint256 index = 0; index < accounts.length; index++){
            _whiteList[accounts[index]] = true;
        }
    }
    
    function removeFromWhiteList(address[] memory accounts) external onlyOwner{
        require(accounts.length > 0, "Invalid input");
        for(uint256 index = 0; index < accounts.length; index++){           
            _whiteList[accounts[index]] = false;
        }
    }
    
    function withdraw() public payable onlyOwner {
        uint256 balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }    

    function setPrice(uint256 price, bool whitelist) public onlyOwner {
        if(whitelist)
            NFT_PRICE_WHITELIST = price;
        else
            NFT_PRICE_PUBLIC = price;
    }
    
    function getBalance() public view onlyOwner returns (uint256){
        return address(this).balance;
    } 

    // Sets base URI for all tokens, only able to be called by contract owner
    function setBaseURI(string memory baseURI_) public onlyOwner {
        _baseTokenURI = baseURI_;
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        // Concatenate the tokenID to the baseURI.
        return string(abi.encodePacked(_baseTokenURI, tokenId.toString()));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"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":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_NFT_PURCHASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_NFT_WHITELIST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NFT_PRICE_PUBLIC","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NFT_PRICE_WHITELIST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"addToWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eliteHolders","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"freeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freePhase","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId1","type":"uint256"},{"internalType":"uint256","name":"tokenId2","type":"uint256"}],"name":"fuse","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fusionPhase","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBalance","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":"sender","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"},{"internalType":"bool","name":"whitelist","type":"bool"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintedEliteElves","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSalePhase","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"removeFromWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","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":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"bool","name":"whitelist","type":"bool"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleFreePhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleFusionPhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePublicSalePhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleWhitelistPhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistPhase","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

6080604052667c585087238000600b55666a94d74f430000600c55600d805463ffffffff1916905560006010553480156200003957600080fd5b50604080518082018252600a8152695765697264456c76657360b01b602080830191825283518085019094526007845266575244454c565360c81b9084015281519192916200008b9160009162000140565b508051620000a190600190602084019062000140565b505050620000be620000b8620000ea60201b60201c565b620000ee565b600f80546001600160a01b0319167331e88992c8f25417b11c72e1344941c9113b499817905562000223565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200014e90620001e6565b90600052602060002090601f016020900481019282620001725760008555620001bd565b82601f106200018d57805160ff1916838001178555620001bd565b82800160010185558215620001bd579182015b82811115620001bd578251825591602001919060010190620001a0565b50620001cb929150620001cf565b5090565b5b80821115620001cb5760008155600101620001d0565b600181811c90821680620001fb57607f821691505b602082108114156200021d57634e487b7160e01b600052602260045260246000fd5b50919050565b613b3180620002336000396000f3fe6080604052600436106102fd5760003560e01c8063715018a61161018f578063afe1b799116100e1578063d6202c0d1161008a578063f2fde38b11610064578063f2fde38b14610821578063f5052f5114610841578063f68858e41461085657600080fd5b8063d6202c0d146107ad578063e985e9c5146107c3578063efd12de61461080c57600080fd5b8063b88d4fde116100bb578063b88d4fde1461074e578063c371932a1461076e578063c87b56dd1461078d57600080fd5b8063afe1b799146106f7578063b11560c514610719578063b62b30401461073957600080fd5b806384bc98f7116101435780638da5cb5b1161011d5780638da5cb5b146106a457806395d89b41146106c2578063a22cb465146106d757600080fd5b806384bc98f71461064e5780638adf1bbc146106635780638ba4cc3c1461068457600080fd5b8063740d73f311610174578063740d73f3146105f45780637c928fe914610614578063815d544c1461063457600080fd5b8063715018a6146105c9578063735018b0146105de57600080fd5b80633af32abf11610253578063553f174f116101fc5780636352211e116101d65780636352211e1461057657806367f68fac1461059657806370a08231146105a957600080fd5b8063553f174f1461052b57806355f804b3146105405780635d158c911461056057600080fd5b8063438b63001161022d578063438b6300146104be5780634f6ccce7146104eb57806352e94beb1461050b57600080fd5b80633af32abf146104765780633ccfd60b1461049657806342842e0e1461049e57600080fd5b806312065fe0116102b55780632f745c591161028f5780632f745c591461042057806332cb6b0c146104405780633394dd061461045657600080fd5b806312065fe0146103d657806318160ddd146103eb57806323b872dd1461040057600080fd5b806306fdde03116102e657806306fdde031461035a578063081812fc1461037c578063095ea7b3146103b457600080fd5b806301ffc9a714610302578063020b39cc14610337575b600080fd5b34801561030e57600080fd5b5061032261031d3660046134f0565b610876565b60405190151581526020015b60405180910390f35b34801561034357600080fd5b5061034c601481565b60405190815260200161032e565b34801561036657600080fd5b5061036f6108d2565b60405161032e91906137d8565b34801561038857600080fd5b5061039c610397366004613573565b610964565b6040516001600160a01b03909116815260200161032e565b3480156103c057600080fd5b506103d46103cf366004613346565b610a0f565b005b3480156103e257600080fd5b5061034c610b41565b3480156103f757600080fd5b5060085461034c565b34801561040c57600080fd5b506103d461041b366004613257565b610ba3565b34801561042c57600080fd5b5061034c61043b366004613346565b610c2a565b34801561044c57600080fd5b5061034c61271081565b34801561046257600080fd5b50600d546103229062010000900460ff1681565b34801561048257600080fd5b50610322610491366004613202565b610cd2565b6103d4610d11565b3480156104aa57600080fd5b506103d46104b9366004613257565b610d9e565b3480156104ca57600080fd5b506104de6104d9366004613202565b610db9565b60405161032e91906137a0565b3480156104f757600080fd5b5061034c610506366004613573565b610e5b565b34801561051757600080fd5b506103d461052636600461358c565b610eff565b34801561053757600080fd5b506103d4610f6b565b34801561054c57600080fd5b506103d461055b36600461352a565b610fff565b34801561056c57600080fd5b5061034c600b5481565b34801561058257600080fd5b5061039c610591366004613573565b61106c565b6103d46105a436600461358c565b6110f7565b3480156105b557600080fd5b5061034c6105c4366004613202565b611146565b3480156105d557600080fd5b506103d46111e0565b3480156105ea57600080fd5b5061034c60105481565b34801561060057600080fd5b506103d461060f366004613370565b611246565b34801561062057600080fd5b506103d461062f366004613573565b611377565b34801561064057600080fd5b50600d546103229060ff1681565b34801561065a57600080fd5b5061034c600a81565b34801561066f57600080fd5b50600d54610322906301000000900460ff1681565b34801561069057600080fd5b506103d461069f366004613346565b611506565b3480156106b057600080fd5b50600a546001600160a01b031661039c565b3480156106ce57600080fd5b5061036f611598565b3480156106e357600080fd5b506103d46106f236600461330f565b6115a7565b34801561070357600080fd5b5061070c61168a565b60405161032e9190613753565b34801561072557600080fd5b506103d4610734366004613370565b6117a5565b34801561074557600080fd5b506103d46118d6565b34801561075a57600080fd5b506103d4610769366004613293565b61196b565b34801561077a57600080fd5b50600d5461032290610100900460ff1681565b34801561079957600080fd5b5061036f6107a8366004613573565b6119f3565b3480156107b957600080fd5b5061034c600c5481565b3480156107cf57600080fd5b506103226107de366004613224565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561081857600080fd5b506103d4611a27565b34801561082d57600080fd5b506103d461083c366004613202565b611abd565b34801561084d57600080fd5b506103d4611b9f565b34801561086257600080fd5b506103d46108713660046135b1565b611c2b565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d630000000000000000000000000000000000000000000000000000000014806108cc57506108cc82611e37565b92915050565b6060600080546108e190613933565b80601f016020809104026020016040519081016040528092919081815260200182805461090d90613933565b801561095a5780601f1061092f5761010080835404028352916020019161095a565b820191906000526020600020905b81548152906001019060200180831161093d57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109f35760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610a1a8261106c565b9050806001600160a01b0316836001600160a01b03161415610aa45760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084016109ea565b336001600160a01b0382161480610ac05750610ac081336107de565b610b325760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016109ea565b610b3c8383611f1a565b505050565b600a546000906001600160a01b03163314610b9e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ea565b504790565b610bad3382611fa0565b610c1f5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016109ea565b610b3c8383836120a8565b6000610c3583611146565b8210610ca95760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e647300000000000000000000000000000000000000000060648201526084016109ea565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6001600160a01b03811660009081526013602052604081205460ff168015610cfc5750600d5460ff165b15610d0957506001919050565b506000919050565b600a546001600160a01b03163314610d6b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ea565b6040514790339082156108fc029083906000818181858888f19350505050158015610d9a573d6000803e3d6000fd5b5050565b610b3c8383836040518060200160405280600081525061196b565b60606000610dc683611146565b905060008167ffffffffffffffff811115610de357610de3613a90565b604051908082528060200260200182016040528015610e0c578160200160208202803683370190505b50905060005b82811015610e5357610e248582610c2a565b828281518110610e3657610e36613a61565b602090810291909101015280610e4b81613987565b915050610e12565b509392505050565b6000610e6660085490565b8210610eda5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e6473000000000000000000000000000000000000000060648201526084016109ea565b60088281548110610eed57610eed613a61565b90600052602060002001549050919050565b600a546001600160a01b03163314610f595760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ea565b8015610f655750600c55565b50600b55565b600a546001600160a01b03163314610fc55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ea565b600d80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff81166101009182900460ff1615909102179055565b600a546001600160a01b031633146110595760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ea565b8051610d9a90600e9060208401906130d7565b6000818152600260205260408120546001600160a01b0316806108cc5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e000000000000000000000000000000000000000000000060648201526084016109ea565b600061110260085490565b905061111083343385612298565b60005b838110156111405761112e336111298385613887565b6125cd565b8061113881613987565b915050611113565b50505050565b60006001600160a01b0382166111c45760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f20616464726573730000000000000000000000000000000000000000000060648201526084016109ea565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b0316331461123a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ea565b61124460006125e7565b565b600a546001600160a01b031633146112a05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ea565b60008151116112f15760405162461bcd60e51b815260206004820152600d60248201527f496e76616c696420696e7075740000000000000000000000000000000000000060448201526064016109ea565b60005b8151811015610d9a5760016013600084848151811061131557611315613a61565b6020908102919091018101516001600160a01b0316825281019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169115159190911790558061136f81613987565b9150506112f4565b600061138260085490565b600d54909150610100900460ff166113dc5760405162461bcd60e51b815260206004820152601960248201527f467265652073616c65206e6f742073746172746564207965740000000000000060448201526064016109ea565b6000821161142c5760405162461bcd60e51b815260206004820152601060248201527f416d6f756e7420746f6f20736d616c6c0000000000000000000000000000000060448201526064016109ea565b6127106114398383613887565b11156114875760405162461bcd60e51b815260206004820152601d60248201527f507572636861736520657863656564696e67206d617820737570706c7900000060448201526064016109ea565b60006114933384612651565b905060005b83811015611140576114ae336111298386613887565b6001601160008484815181106114c6576114c6613a61565b6020026020010151815260200190815260200160002060006101000a81548160ff02191690831515021790555080806114fe90613987565b915050611498565b600a546001600160a01b031633146115605760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ea565b600061156b60085490565b905060005b8281101561114057611586846111298385613887565b8061159081613987565b915050611570565b6060600180546108e190613933565b6001600160a01b0382163314156116005760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016109ea565b3360008181526005602090815260408083206001600160a01b0387168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546060906001600160a01b031633146116e75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ea565b60006127106116f560085490565b6116ff91906138f0565b905060008167ffffffffffffffff81111561171c5761171c613a90565b604051908082528060200260200182016040528015611745578160200160208202803683370190505b50905060005b8281101561179e5761176261059182612710613887565b82828151811061177457611774613a61565b6001600160a01b03909216602092830291909101909101528061179681613987565b91505061174b565b5091505090565b600a546001600160a01b031633146117ff5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ea565b60008151116118505760405162461bcd60e51b815260206004820152600d60248201527f496e76616c696420696e7075740000000000000000000000000000000000000060448201526064016109ea565b60005b8151811015610d9a5760006013600084848151811061187457611874613a61565b6020908102919091018101516001600160a01b0316825281019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055806118ce81613987565b915050611853565b600a546001600160a01b031633146119305760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ea565b600d80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff8116620100009182900460ff1615909102179055565b6119753383611fa0565b6119e75760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016109ea565b6111408484848461285b565b6060600e611a00836128e4565b604051602001611a11929190613639565b6040516020818303038152906040529050919050565b600a546001600160a01b03163314611a815760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ea565b600d80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff811663010000009182900460ff1615909102179055565b600a546001600160a01b03163314611b175760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ea565b6001600160a01b038116611b935760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016109ea565b611b9c816125e7565b50565b600a546001600160a01b03163314611bf95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ea565b600d80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00811660ff90911615179055565b600d546301000000900460ff16611c845760405162461bcd60e51b815260206004820152601d60248201527f43616e74206675736520656c76657320617420746865206d6f6d656e7400000060448201526064016109ea565b611c8d8261106c565b6001600160a01b0316336001600160a01b031614611ced5760405162461bcd60e51b815260206004820152601260248201527f546869732069736e7420796f7572204e4654000000000000000000000000000060448201526064016109ea565b611cf68161106c565b6001600160a01b0316336001600160a01b031614611d565760405162461bcd60e51b815260206004820152601260248201527f546869732069736e7420796f7572204e4654000000000000000000000000000060448201526064016109ea565b6127108210611da75760405162461bcd60e51b815260206004820152601460248201527f43616e74206675736520656c69746520656c766500000000000000000000000060448201526064016109ea565b6127108110611df85760405162461bcd60e51b815260206004820152601460248201527f43616e74206675736520656c69746520656c766500000000000000000000000060448201526064016109ea565b611e0182612a16565b611e0a81612a16565b611e1e336010546127106111299190613887565b60108054906000611e2e83613987565b91905055505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd000000000000000000000000000000000000000000000000000000001480611eca57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806108cc57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146108cc565b600081815260046020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0384169081179091558190611f678261106c565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b031661202a5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084016109ea565b60006120358361106c565b9050806001600160a01b0316846001600160a01b031614806120705750836001600160a01b031661206584610964565b6001600160a01b0316145b806120a057506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166120bb8261106c565b6001600160a01b0316146121375760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e000000000000000000000000000000000000000000000060648201526084016109ea565b6001600160a01b0382166121b25760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016109ea565b6121bd838383612ad5565b6121c8600082611f1a565b6001600160a01b03831660009081526003602052604081208054600192906121f19084906138f0565b90915550506001600160a01b038216600090815260036020526040812080546001929061221f908490613887565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60006122a360085490565b9050600085116122f55760405162461bcd60e51b815260206004820152601060248201527f416d6f756e7420746f6f20736d616c6c0000000000000000000000000000000060448201526064016109ea565b6127106123028683613887565b11156123505760405162461bcd60e51b815260206004820152601d60248201527f507572636861736520657863656564696e67206d617820737570706c7900000060448201526064016109ea565b81156124c157600d5460ff166123a85760405162461bcd60e51b815260206004820152601860248201527f596f7520617265206e6f742061626c6520746f206d696e74000000000000000060448201526064016109ea565b6123b183610cd2565b6123fd5760405162461bcd60e51b815260206004820152601760248201527f596f7520617265206e6f742077686974656c697374656400000000000000000060448201526064016109ea565b8461240733611146565b61241290600a6138f0565b10156124605760405162461bcd60e51b815260206004820152601360248201527f43616e74206d696e742074686174206d7563680000000000000000000000000060448201526064016109ea565b8385600c5461246f91906138b3565b146124bc5760405162461bcd60e51b815260206004820152601b60248201527f53656e742065746865722076616c20697320696e636f7272656374000000000060448201526064016109ea565b6125c6565b600d5462010000900460ff166125195760405162461bcd60e51b815260206004820152601860248201527f596f7520617265206e6f742061626c6520746f206d696e74000000000000000060448201526064016109ea565b601485111561256a5760405162461bcd60e51b815260206004820152601560248201527f4d617820323020746f6b656e732070657220747278000000000000000000000060448201526064016109ea565b8385600b5461257991906138b3565b146125c65760405162461bcd60e51b815260206004820152601b60248201527f53656e742065746865722076616c20697320696e636f7272656374000000000060448201526064016109ea565b5050505050565b610d9a828260405180602001604052806000815250612b8d565b600a80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600f546040517f438b63000000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301526060921690600090829063438b630090602401600060405180830381600087803b1580156126b757600080fd5b505af11580156126cb573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526127119190810190613414565b90506000815167ffffffffffffffff81111561272f5761272f613a90565b604051908082528060200260200182016040528015612758578160200160208202803683370190505b5090506000805b8351811015612800576011600085838151811061277e5761277e613a61565b602090810291909101810151604090810151835290820192909252016000205460ff166127ee578381815181106127b7576127b7613a61565b6020026020010151604001518383815181106127d5576127d5613a61565b6020908102919091010152816127ea81613987565b9250505b806127f881613987565b91505061275f565b50858110156128515760405162461bcd60e51b815260206004820152601d60248201527f596f7520646f6e74206f776e20656e6f7567682043796265726567677300000060448201526064016109ea565b5095945050505050565b6128668484846120a8565b61287284848484612c16565b6111405760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016109ea565b60608161292457505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561294e578061293881613987565b91506129479050600a8361389f565b9150612928565b60008167ffffffffffffffff81111561296957612969613a90565b6040519080825280601f01601f191660200182016040528015612993576020820181803683370190505b5090505b84156120a0576129a86001836138f0565b91506129b5600a866139c0565b6129c0906030613887565b60f81b8183815181106129d5576129d5613a61565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612a0f600a8661389f565b9450612997565b6000612a218261106c565b9050612a2f81600084612ad5565b612a3a600083611f1a565b6001600160a01b0381166000908152600360205260408120805460019290612a639084906138f0565b909155505060008281526002602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6001600160a01b038316612b3057612b2b81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612b53565b816001600160a01b0316836001600160a01b031614612b5357612b538382612de1565b6001600160a01b038216612b6a57610b3c81612e7e565b826001600160a01b0316826001600160a01b031614610b3c57610b3c8282612f2d565b612b978383612f71565b612ba46000848484612c16565b610b3c5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016109ea565b60006001600160a01b0384163b15612dd6576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a0290612c73903390899088908890600401613717565b602060405180830381600087803b158015612c8d57600080fd5b505af1925050508015612cdb575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252612cd89181019061350d565b60015b612d8b573d808015612d09576040519150601f19603f3d011682016040523d82523d6000602084013e612d0e565b606091505b508051612d835760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016109ea565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a02000000000000000000000000000000000000000000000000000000001490506120a0565b506001949350505050565b60006001612dee84611146565b612df891906138f0565b600083815260076020526040902054909150808214612e4b576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612e90906001906138f0565b60008381526009602052604081205460088054939450909284908110612eb857612eb8613a61565b906000526020600020015490508060088381548110612ed957612ed9613a61565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612f1157612f11613a32565b6001900381819060005260206000200160009055905550505050565b6000612f3883611146565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b038216612fc75760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016109ea565b6000818152600260205260409020546001600160a01b03161561302c5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016109ea565b61303860008383612ad5565b6001600160a01b0382166000908152600360205260408120805460019290613061908490613887565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546130e390613933565b90600052602060002090601f016020900481019282613105576000855561314b565b82601f1061311e57805160ff191683800117855561314b565b8280016001018555821561314b579182015b8281111561314b578251825591602001919060010190613130565b5061315792915061315b565b5090565b5b80821115613157576000815560010161315c565b600067ffffffffffffffff83111561318a5761318a613a90565b6131bb60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601613814565b90508281528383830111156131cf57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146131fd57600080fd5b919050565b60006020828403121561321457600080fd5b61321d826131e6565b9392505050565b6000806040838503121561323757600080fd5b613240836131e6565b915061324e602084016131e6565b90509250929050565b60008060006060848603121561326c57600080fd5b613275846131e6565b9250613283602085016131e6565b9150604084013590509250925092565b600080600080608085870312156132a957600080fd5b6132b2856131e6565b93506132c0602086016131e6565b925060408501359150606085013567ffffffffffffffff8111156132e357600080fd5b8501601f810187136132f457600080fd5b61330387823560208401613170565b91505092959194509250565b6000806040838503121561332257600080fd5b61332b836131e6565b9150602083013561333b81613abf565b809150509250929050565b6000806040838503121561335957600080fd5b613362836131e6565b946020939093013593505050565b6000602080838503121561338357600080fd5b823567ffffffffffffffff81111561339a57600080fd5b8301601f810185136133ab57600080fd5b80356133be6133b982613863565b613814565b80828252848201915084840188868560051b87010111156133de57600080fd5b600094505b83851015613408576133f4816131e6565b8352600194909401939185019185016133e3565b50979650505050505050565b6000602080838503121561342757600080fd5b825167ffffffffffffffff81111561343e57600080fd5b8301601f8101851361344f57600080fd5b805161345d6133b982613863565b818152838101908385016060808502860187018a101561347c57600080fd5b600095505b848610156134e25780828b03121561349857600080fd5b6134a06137eb565b82516134ab81613abf565b815282880151600481106134be57600080fd5b81890152604083810151908201528452600195909501949286019290810190613481565b509098975050505050505050565b60006020828403121561350257600080fd5b813561321d81613acd565b60006020828403121561351f57600080fd5b815161321d81613acd565b60006020828403121561353c57600080fd5b813567ffffffffffffffff81111561355357600080fd5b8201601f8101841361356457600080fd5b6120a084823560208401613170565b60006020828403121561358557600080fd5b5035919050565b6000806040838503121561359f57600080fd5b82359150602083013561333b81613abf565b600080604083850312156135c457600080fd5b50508035926020909101359150565b600081518084526135eb816020860160208601613907565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000815161362f818560208601613907565b9290920192915050565b600080845481600182811c91508083168061365557607f831692505b602080841082141561368e577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b8180156136a257600181146136d1576136fe565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008616895284890196506136fe565b60008b81526020902060005b868110156136f65781548b8201529085019083016136dd565b505084890196505b50505050505061370e818561361d565b95945050505050565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261374960808301846135d3565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156137945783516001600160a01b03168352928401929184019160010161376f565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015613794578351835292840192918401916001016137bc565b60208152600061321d60208301846135d3565b6040516060810167ffffffffffffffff8111828210171561380e5761380e613a90565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561385b5761385b613a90565b604052919050565b600067ffffffffffffffff82111561387d5761387d613a90565b5060051b60200190565b6000821982111561389a5761389a6139d4565b500190565b6000826138ae576138ae613a03565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156138eb576138eb6139d4565b500290565b600082821015613902576139026139d4565b500390565b60005b8381101561392257818101518382015260200161390a565b838111156111405750506000910152565b600181811c9082168061394757607f821691505b60208210811415613981577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156139b9576139b96139d4565b5060010190565b6000826139cf576139cf613a03565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8015158114611b9c57600080fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081168114611b9c57600080fdfea26469706673582212207d99f0dd1ffc942aa50d039072fbeb188ddcd33e0287dc11bfa19a07cc3a41e564736f6c63430008070033

Deployed Bytecode

0x6080604052600436106102fd5760003560e01c8063715018a61161018f578063afe1b799116100e1578063d6202c0d1161008a578063f2fde38b11610064578063f2fde38b14610821578063f5052f5114610841578063f68858e41461085657600080fd5b8063d6202c0d146107ad578063e985e9c5146107c3578063efd12de61461080c57600080fd5b8063b88d4fde116100bb578063b88d4fde1461074e578063c371932a1461076e578063c87b56dd1461078d57600080fd5b8063afe1b799146106f7578063b11560c514610719578063b62b30401461073957600080fd5b806384bc98f7116101435780638da5cb5b1161011d5780638da5cb5b146106a457806395d89b41146106c2578063a22cb465146106d757600080fd5b806384bc98f71461064e5780638adf1bbc146106635780638ba4cc3c1461068457600080fd5b8063740d73f311610174578063740d73f3146105f45780637c928fe914610614578063815d544c1461063457600080fd5b8063715018a6146105c9578063735018b0146105de57600080fd5b80633af32abf11610253578063553f174f116101fc5780636352211e116101d65780636352211e1461057657806367f68fac1461059657806370a08231146105a957600080fd5b8063553f174f1461052b57806355f804b3146105405780635d158c911461056057600080fd5b8063438b63001161022d578063438b6300146104be5780634f6ccce7146104eb57806352e94beb1461050b57600080fd5b80633af32abf146104765780633ccfd60b1461049657806342842e0e1461049e57600080fd5b806312065fe0116102b55780632f745c591161028f5780632f745c591461042057806332cb6b0c146104405780633394dd061461045657600080fd5b806312065fe0146103d657806318160ddd146103eb57806323b872dd1461040057600080fd5b806306fdde03116102e657806306fdde031461035a578063081812fc1461037c578063095ea7b3146103b457600080fd5b806301ffc9a714610302578063020b39cc14610337575b600080fd5b34801561030e57600080fd5b5061032261031d3660046134f0565b610876565b60405190151581526020015b60405180910390f35b34801561034357600080fd5b5061034c601481565b60405190815260200161032e565b34801561036657600080fd5b5061036f6108d2565b60405161032e91906137d8565b34801561038857600080fd5b5061039c610397366004613573565b610964565b6040516001600160a01b03909116815260200161032e565b3480156103c057600080fd5b506103d46103cf366004613346565b610a0f565b005b3480156103e257600080fd5b5061034c610b41565b3480156103f757600080fd5b5060085461034c565b34801561040c57600080fd5b506103d461041b366004613257565b610ba3565b34801561042c57600080fd5b5061034c61043b366004613346565b610c2a565b34801561044c57600080fd5b5061034c61271081565b34801561046257600080fd5b50600d546103229062010000900460ff1681565b34801561048257600080fd5b50610322610491366004613202565b610cd2565b6103d4610d11565b3480156104aa57600080fd5b506103d46104b9366004613257565b610d9e565b3480156104ca57600080fd5b506104de6104d9366004613202565b610db9565b60405161032e91906137a0565b3480156104f757600080fd5b5061034c610506366004613573565b610e5b565b34801561051757600080fd5b506103d461052636600461358c565b610eff565b34801561053757600080fd5b506103d4610f6b565b34801561054c57600080fd5b506103d461055b36600461352a565b610fff565b34801561056c57600080fd5b5061034c600b5481565b34801561058257600080fd5b5061039c610591366004613573565b61106c565b6103d46105a436600461358c565b6110f7565b3480156105b557600080fd5b5061034c6105c4366004613202565b611146565b3480156105d557600080fd5b506103d46111e0565b3480156105ea57600080fd5b5061034c60105481565b34801561060057600080fd5b506103d461060f366004613370565b611246565b34801561062057600080fd5b506103d461062f366004613573565b611377565b34801561064057600080fd5b50600d546103229060ff1681565b34801561065a57600080fd5b5061034c600a81565b34801561066f57600080fd5b50600d54610322906301000000900460ff1681565b34801561069057600080fd5b506103d461069f366004613346565b611506565b3480156106b057600080fd5b50600a546001600160a01b031661039c565b3480156106ce57600080fd5b5061036f611598565b3480156106e357600080fd5b506103d46106f236600461330f565b6115a7565b34801561070357600080fd5b5061070c61168a565b60405161032e9190613753565b34801561072557600080fd5b506103d4610734366004613370565b6117a5565b34801561074557600080fd5b506103d46118d6565b34801561075a57600080fd5b506103d4610769366004613293565b61196b565b34801561077a57600080fd5b50600d5461032290610100900460ff1681565b34801561079957600080fd5b5061036f6107a8366004613573565b6119f3565b3480156107b957600080fd5b5061034c600c5481565b3480156107cf57600080fd5b506103226107de366004613224565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561081857600080fd5b506103d4611a27565b34801561082d57600080fd5b506103d461083c366004613202565b611abd565b34801561084d57600080fd5b506103d4611b9f565b34801561086257600080fd5b506103d46108713660046135b1565b611c2b565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d630000000000000000000000000000000000000000000000000000000014806108cc57506108cc82611e37565b92915050565b6060600080546108e190613933565b80601f016020809104026020016040519081016040528092919081815260200182805461090d90613933565b801561095a5780601f1061092f5761010080835404028352916020019161095a565b820191906000526020600020905b81548152906001019060200180831161093d57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109f35760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610a1a8261106c565b9050806001600160a01b0316836001600160a01b03161415610aa45760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084016109ea565b336001600160a01b0382161480610ac05750610ac081336107de565b610b325760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016109ea565b610b3c8383611f1a565b505050565b600a546000906001600160a01b03163314610b9e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ea565b504790565b610bad3382611fa0565b610c1f5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016109ea565b610b3c8383836120a8565b6000610c3583611146565b8210610ca95760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e647300000000000000000000000000000000000000000060648201526084016109ea565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6001600160a01b03811660009081526013602052604081205460ff168015610cfc5750600d5460ff165b15610d0957506001919050565b506000919050565b600a546001600160a01b03163314610d6b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ea565b6040514790339082156108fc029083906000818181858888f19350505050158015610d9a573d6000803e3d6000fd5b5050565b610b3c8383836040518060200160405280600081525061196b565b60606000610dc683611146565b905060008167ffffffffffffffff811115610de357610de3613a90565b604051908082528060200260200182016040528015610e0c578160200160208202803683370190505b50905060005b82811015610e5357610e248582610c2a565b828281518110610e3657610e36613a61565b602090810291909101015280610e4b81613987565b915050610e12565b509392505050565b6000610e6660085490565b8210610eda5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e6473000000000000000000000000000000000000000060648201526084016109ea565b60088281548110610eed57610eed613a61565b90600052602060002001549050919050565b600a546001600160a01b03163314610f595760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ea565b8015610f655750600c55565b50600b55565b600a546001600160a01b03163314610fc55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ea565b600d80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff81166101009182900460ff1615909102179055565b600a546001600160a01b031633146110595760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ea565b8051610d9a90600e9060208401906130d7565b6000818152600260205260408120546001600160a01b0316806108cc5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e000000000000000000000000000000000000000000000060648201526084016109ea565b600061110260085490565b905061111083343385612298565b60005b838110156111405761112e336111298385613887565b6125cd565b8061113881613987565b915050611113565b50505050565b60006001600160a01b0382166111c45760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f20616464726573730000000000000000000000000000000000000000000060648201526084016109ea565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b0316331461123a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ea565b61124460006125e7565b565b600a546001600160a01b031633146112a05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ea565b60008151116112f15760405162461bcd60e51b815260206004820152600d60248201527f496e76616c696420696e7075740000000000000000000000000000000000000060448201526064016109ea565b60005b8151811015610d9a5760016013600084848151811061131557611315613a61565b6020908102919091018101516001600160a01b0316825281019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169115159190911790558061136f81613987565b9150506112f4565b600061138260085490565b600d54909150610100900460ff166113dc5760405162461bcd60e51b815260206004820152601960248201527f467265652073616c65206e6f742073746172746564207965740000000000000060448201526064016109ea565b6000821161142c5760405162461bcd60e51b815260206004820152601060248201527f416d6f756e7420746f6f20736d616c6c0000000000000000000000000000000060448201526064016109ea565b6127106114398383613887565b11156114875760405162461bcd60e51b815260206004820152601d60248201527f507572636861736520657863656564696e67206d617820737570706c7900000060448201526064016109ea565b60006114933384612651565b905060005b83811015611140576114ae336111298386613887565b6001601160008484815181106114c6576114c6613a61565b6020026020010151815260200190815260200160002060006101000a81548160ff02191690831515021790555080806114fe90613987565b915050611498565b600a546001600160a01b031633146115605760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ea565b600061156b60085490565b905060005b8281101561114057611586846111298385613887565b8061159081613987565b915050611570565b6060600180546108e190613933565b6001600160a01b0382163314156116005760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016109ea565b3360008181526005602090815260408083206001600160a01b0387168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546060906001600160a01b031633146116e75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ea565b60006127106116f560085490565b6116ff91906138f0565b905060008167ffffffffffffffff81111561171c5761171c613a90565b604051908082528060200260200182016040528015611745578160200160208202803683370190505b50905060005b8281101561179e5761176261059182612710613887565b82828151811061177457611774613a61565b6001600160a01b03909216602092830291909101909101528061179681613987565b91505061174b565b5091505090565b600a546001600160a01b031633146117ff5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ea565b60008151116118505760405162461bcd60e51b815260206004820152600d60248201527f496e76616c696420696e7075740000000000000000000000000000000000000060448201526064016109ea565b60005b8151811015610d9a5760006013600084848151811061187457611874613a61565b6020908102919091018101516001600160a01b0316825281019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055806118ce81613987565b915050611853565b600a546001600160a01b031633146119305760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ea565b600d80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff8116620100009182900460ff1615909102179055565b6119753383611fa0565b6119e75760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016109ea565b6111408484848461285b565b6060600e611a00836128e4565b604051602001611a11929190613639565b6040516020818303038152906040529050919050565b600a546001600160a01b03163314611a815760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ea565b600d80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff811663010000009182900460ff1615909102179055565b600a546001600160a01b03163314611b175760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ea565b6001600160a01b038116611b935760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016109ea565b611b9c816125e7565b50565b600a546001600160a01b03163314611bf95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ea565b600d80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00811660ff90911615179055565b600d546301000000900460ff16611c845760405162461bcd60e51b815260206004820152601d60248201527f43616e74206675736520656c76657320617420746865206d6f6d656e7400000060448201526064016109ea565b611c8d8261106c565b6001600160a01b0316336001600160a01b031614611ced5760405162461bcd60e51b815260206004820152601260248201527f546869732069736e7420796f7572204e4654000000000000000000000000000060448201526064016109ea565b611cf68161106c565b6001600160a01b0316336001600160a01b031614611d565760405162461bcd60e51b815260206004820152601260248201527f546869732069736e7420796f7572204e4654000000000000000000000000000060448201526064016109ea565b6127108210611da75760405162461bcd60e51b815260206004820152601460248201527f43616e74206675736520656c69746520656c766500000000000000000000000060448201526064016109ea565b6127108110611df85760405162461bcd60e51b815260206004820152601460248201527f43616e74206675736520656c69746520656c766500000000000000000000000060448201526064016109ea565b611e0182612a16565b611e0a81612a16565b611e1e336010546127106111299190613887565b60108054906000611e2e83613987565b91905055505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd000000000000000000000000000000000000000000000000000000001480611eca57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806108cc57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146108cc565b600081815260046020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0384169081179091558190611f678261106c565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b031661202a5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084016109ea565b60006120358361106c565b9050806001600160a01b0316846001600160a01b031614806120705750836001600160a01b031661206584610964565b6001600160a01b0316145b806120a057506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166120bb8261106c565b6001600160a01b0316146121375760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e000000000000000000000000000000000000000000000060648201526084016109ea565b6001600160a01b0382166121b25760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016109ea565b6121bd838383612ad5565b6121c8600082611f1a565b6001600160a01b03831660009081526003602052604081208054600192906121f19084906138f0565b90915550506001600160a01b038216600090815260036020526040812080546001929061221f908490613887565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60006122a360085490565b9050600085116122f55760405162461bcd60e51b815260206004820152601060248201527f416d6f756e7420746f6f20736d616c6c0000000000000000000000000000000060448201526064016109ea565b6127106123028683613887565b11156123505760405162461bcd60e51b815260206004820152601d60248201527f507572636861736520657863656564696e67206d617820737570706c7900000060448201526064016109ea565b81156124c157600d5460ff166123a85760405162461bcd60e51b815260206004820152601860248201527f596f7520617265206e6f742061626c6520746f206d696e74000000000000000060448201526064016109ea565b6123b183610cd2565b6123fd5760405162461bcd60e51b815260206004820152601760248201527f596f7520617265206e6f742077686974656c697374656400000000000000000060448201526064016109ea565b8461240733611146565b61241290600a6138f0565b10156124605760405162461bcd60e51b815260206004820152601360248201527f43616e74206d696e742074686174206d7563680000000000000000000000000060448201526064016109ea565b8385600c5461246f91906138b3565b146124bc5760405162461bcd60e51b815260206004820152601b60248201527f53656e742065746865722076616c20697320696e636f7272656374000000000060448201526064016109ea565b6125c6565b600d5462010000900460ff166125195760405162461bcd60e51b815260206004820152601860248201527f596f7520617265206e6f742061626c6520746f206d696e74000000000000000060448201526064016109ea565b601485111561256a5760405162461bcd60e51b815260206004820152601560248201527f4d617820323020746f6b656e732070657220747278000000000000000000000060448201526064016109ea565b8385600b5461257991906138b3565b146125c65760405162461bcd60e51b815260206004820152601b60248201527f53656e742065746865722076616c20697320696e636f7272656374000000000060448201526064016109ea565b5050505050565b610d9a828260405180602001604052806000815250612b8d565b600a80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600f546040517f438b63000000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301526060921690600090829063438b630090602401600060405180830381600087803b1580156126b757600080fd5b505af11580156126cb573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526127119190810190613414565b90506000815167ffffffffffffffff81111561272f5761272f613a90565b604051908082528060200260200182016040528015612758578160200160208202803683370190505b5090506000805b8351811015612800576011600085838151811061277e5761277e613a61565b602090810291909101810151604090810151835290820192909252016000205460ff166127ee578381815181106127b7576127b7613a61565b6020026020010151604001518383815181106127d5576127d5613a61565b6020908102919091010152816127ea81613987565b9250505b806127f881613987565b91505061275f565b50858110156128515760405162461bcd60e51b815260206004820152601d60248201527f596f7520646f6e74206f776e20656e6f7567682043796265726567677300000060448201526064016109ea565b5095945050505050565b6128668484846120a8565b61287284848484612c16565b6111405760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016109ea565b60608161292457505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561294e578061293881613987565b91506129479050600a8361389f565b9150612928565b60008167ffffffffffffffff81111561296957612969613a90565b6040519080825280601f01601f191660200182016040528015612993576020820181803683370190505b5090505b84156120a0576129a86001836138f0565b91506129b5600a866139c0565b6129c0906030613887565b60f81b8183815181106129d5576129d5613a61565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612a0f600a8661389f565b9450612997565b6000612a218261106c565b9050612a2f81600084612ad5565b612a3a600083611f1a565b6001600160a01b0381166000908152600360205260408120805460019290612a639084906138f0565b909155505060008281526002602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6001600160a01b038316612b3057612b2b81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612b53565b816001600160a01b0316836001600160a01b031614612b5357612b538382612de1565b6001600160a01b038216612b6a57610b3c81612e7e565b826001600160a01b0316826001600160a01b031614610b3c57610b3c8282612f2d565b612b978383612f71565b612ba46000848484612c16565b610b3c5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016109ea565b60006001600160a01b0384163b15612dd6576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a0290612c73903390899088908890600401613717565b602060405180830381600087803b158015612c8d57600080fd5b505af1925050508015612cdb575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252612cd89181019061350d565b60015b612d8b573d808015612d09576040519150601f19603f3d011682016040523d82523d6000602084013e612d0e565b606091505b508051612d835760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016109ea565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a02000000000000000000000000000000000000000000000000000000001490506120a0565b506001949350505050565b60006001612dee84611146565b612df891906138f0565b600083815260076020526040902054909150808214612e4b576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612e90906001906138f0565b60008381526009602052604081205460088054939450909284908110612eb857612eb8613a61565b906000526020600020015490508060088381548110612ed957612ed9613a61565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612f1157612f11613a32565b6001900381819060005260206000200160009055905550505050565b6000612f3883611146565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b038216612fc75760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016109ea565b6000818152600260205260409020546001600160a01b03161561302c5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016109ea565b61303860008383612ad5565b6001600160a01b0382166000908152600360205260408120805460019290613061908490613887565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546130e390613933565b90600052602060002090601f016020900481019282613105576000855561314b565b82601f1061311e57805160ff191683800117855561314b565b8280016001018555821561314b579182015b8281111561314b578251825591602001919060010190613130565b5061315792915061315b565b5090565b5b80821115613157576000815560010161315c565b600067ffffffffffffffff83111561318a5761318a613a90565b6131bb60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601613814565b90508281528383830111156131cf57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146131fd57600080fd5b919050565b60006020828403121561321457600080fd5b61321d826131e6565b9392505050565b6000806040838503121561323757600080fd5b613240836131e6565b915061324e602084016131e6565b90509250929050565b60008060006060848603121561326c57600080fd5b613275846131e6565b9250613283602085016131e6565b9150604084013590509250925092565b600080600080608085870312156132a957600080fd5b6132b2856131e6565b93506132c0602086016131e6565b925060408501359150606085013567ffffffffffffffff8111156132e357600080fd5b8501601f810187136132f457600080fd5b61330387823560208401613170565b91505092959194509250565b6000806040838503121561332257600080fd5b61332b836131e6565b9150602083013561333b81613abf565b809150509250929050565b6000806040838503121561335957600080fd5b613362836131e6565b946020939093013593505050565b6000602080838503121561338357600080fd5b823567ffffffffffffffff81111561339a57600080fd5b8301601f810185136133ab57600080fd5b80356133be6133b982613863565b613814565b80828252848201915084840188868560051b87010111156133de57600080fd5b600094505b83851015613408576133f4816131e6565b8352600194909401939185019185016133e3565b50979650505050505050565b6000602080838503121561342757600080fd5b825167ffffffffffffffff81111561343e57600080fd5b8301601f8101851361344f57600080fd5b805161345d6133b982613863565b818152838101908385016060808502860187018a101561347c57600080fd5b600095505b848610156134e25780828b03121561349857600080fd5b6134a06137eb565b82516134ab81613abf565b815282880151600481106134be57600080fd5b81890152604083810151908201528452600195909501949286019290810190613481565b509098975050505050505050565b60006020828403121561350257600080fd5b813561321d81613acd565b60006020828403121561351f57600080fd5b815161321d81613acd565b60006020828403121561353c57600080fd5b813567ffffffffffffffff81111561355357600080fd5b8201601f8101841361356457600080fd5b6120a084823560208401613170565b60006020828403121561358557600080fd5b5035919050565b6000806040838503121561359f57600080fd5b82359150602083013561333b81613abf565b600080604083850312156135c457600080fd5b50508035926020909101359150565b600081518084526135eb816020860160208601613907565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000815161362f818560208601613907565b9290920192915050565b600080845481600182811c91508083168061365557607f831692505b602080841082141561368e577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b8180156136a257600181146136d1576136fe565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008616895284890196506136fe565b60008b81526020902060005b868110156136f65781548b8201529085019083016136dd565b505084890196505b50505050505061370e818561361d565b95945050505050565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261374960808301846135d3565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156137945783516001600160a01b03168352928401929184019160010161376f565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015613794578351835292840192918401916001016137bc565b60208152600061321d60208301846135d3565b6040516060810167ffffffffffffffff8111828210171561380e5761380e613a90565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561385b5761385b613a90565b604052919050565b600067ffffffffffffffff82111561387d5761387d613a90565b5060051b60200190565b6000821982111561389a5761389a6139d4565b500190565b6000826138ae576138ae613a03565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156138eb576138eb6139d4565b500290565b600082821015613902576139026139d4565b500390565b60005b8381101561392257818101518382015260200161390a565b838111156111405750506000910152565b600181811c9082168061394757607f821691505b60208210811415613981577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156139b9576139b96139d4565b5060010190565b6000826139cf576139cf613a03565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8015158114611b9c57600080fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081168114611b9c57600080fdfea26469706673582212207d99f0dd1ffc942aa50d039072fbeb188ddcd33e0287dc11bfa19a07cc3a41e564736f6c63430008070033

Deployed Bytecode Sourcemap

43093:7288:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23409:224;;;;;;;;;;-1:-1:-1;23409:224:0;;;;;:::i;:::-;;:::i;:::-;;;10784:14:1;;10777:22;10759:41;;10747:2;10732:18;23409:224:0;;;;;;;;43379:45;;;;;;;;;;;;43422:2;43379:45;;;;;22542:25:1;;;22530:2;22515:18;43379:45:0;22396:177:1;11413:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;12972:221::-;;;;;;;;;;-1:-1:-1;12972:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;8713:55:1;;;8695:74;;8683:2;8668:18;12972:221:0;8549:226:1;12495:411:0;;;;;;;;;;-1:-1:-1;12495:411:0;;;;;:::i;:::-;;:::i;:::-;;49845:108;;;;;;;;;;;;;:::i;24049:113::-;;;;;;;;;;-1:-1:-1;24137:10:0;:17;24049:113;;13862:339;;;;;;;;;;-1:-1:-1;13862:339:0;;;;;:::i;:::-;;:::i;23717:256::-;;;;;;;;;;-1:-1:-1;23717:256:0;;;;;:::i;:::-;;:::i;43485:42::-;;;;;;;;;;;;43522:5;43485:42;;43621:35;;;;;;;;;;-1:-1:-1;43621:35:0;;;;;;;;;;;48008:183;;;;;;;;;;-1:-1:-1;48008:183:0;;;;;:::i;:::-;;:::i;49478:151::-;;;:::i;14272:185::-;;;;;;;;;;-1:-1:-1;14272:185:0;;;;;:::i;:::-;;:::i;48202:352::-;;;;;;;;;;-1:-1:-1;48202:352:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;24239:233::-;;;;;;;;;;-1:-1:-1;24239:233:0;;;;;:::i;:::-;;:::i;49641:192::-;;;;;;;;;;-1:-1:-1;49641:192:0;;;;;:::i;:::-;;:::i;44212:85::-;;;;;;;;;;;;;:::i;50041:104::-;;;;;;;;;;-1:-1:-1;50041:104:0;;;;;:::i;:::-;;:::i;43235:51::-;;;;;;;;;;;;;;;;11107:239;;;;;;;;;;-1:-1:-1;11107:239:0;;;;;:::i;:::-;;:::i;46402:324::-;;;;;;:::i;:::-;;:::i;10837:208::-;;;;;;;;;;-1:-1:-1;10837:208:0;;;;;:::i;:::-;;:::i;42045:94::-;;;;;;;;;;;;;:::i;43777:35::-;;;;;;;;;;;;;;;;48917:260;;;;;;;;;;-1:-1:-1;48917:260:0;;;;;:::i;:::-;;:::i;45788:606::-;;;;;;;;;;-1:-1:-1;45788:606:0;;;;;:::i;:::-;;:::i;43540:34::-;;;;;;;;;;-1:-1:-1;43540:34:0;;;;;;;;43431:46;;;;;;;;;;;;43475:2;43431:46;;43663:31;;;;;;;;;;-1:-1:-1;43663:31:0;;;;;;;;;;;44528:246;;;;;;;;;;-1:-1:-1;44528:246:0;;;;;:::i;:::-;;:::i;41394:87::-;;;;;;;;;;-1:-1:-1;41467:6:0;;-1:-1:-1;;;;;41467:6:0;41394:87;;11582:104;;;;;;;;;;;;;:::i;13265:295::-;;;;;;;;;;-1:-1:-1;13265:295:0;;;;;:::i;:::-;;:::i;48562:343::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;49189:277::-;;;;;;;;;;-1:-1:-1;49189:277:0;;;;;:::i;:::-;;:::i;44310:103::-;;;;;;;;;;;;;:::i;14528:328::-;;;;;;;;;;-1:-1:-1;14528:328:0;;;;;:::i;:::-;;:::i;43581:29::-;;;;;;;;;;-1:-1:-1;43581:29:0;;;;;;;;;;;50153:225;;;;;;;;;;-1:-1:-1;50153:225:0;;;;;:::i;:::-;;:::i;43306:54::-;;;;;;;;;;;;;;;;13631:164;;;;;;;;;;-1:-1:-1;13631:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;13752:25:0;;;13728:4;13752:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;13631:164;44425:91;;;;;;;;;;;;;:::i;42294:192::-;;;;;;;;;;-1:-1:-1;42294:192:0;;;;;:::i;:::-;;:::i;44100:100::-;;;;;;;;;;;;;:::i;46738:560::-;;;;;;;;;;-1:-1:-1;46738:560:0;;;;;:::i;:::-;;:::i;23409:224::-;23511:4;23535:50;;;23550:35;23535:50;;:90;;;23589:36;23613:11;23589:23;:36::i;:::-;23528:97;23409:224;-1:-1:-1;;23409:224:0:o;11413:100::-;11467:13;11500:5;11493:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11413:100;:::o;12972:221::-;13048:7;16455:16;;;:7;:16;;;;;;-1:-1:-1;;;;;16455:16:0;13068:73;;;;-1:-1:-1;;;13068:73:0;;17726:2:1;13068:73:0;;;17708:21:1;17765:2;17745:18;;;17738:30;17804:34;17784:18;;;17777:62;17875:14;17855:18;;;17848:42;17907:19;;13068:73:0;;;;;;;;;-1:-1:-1;13161:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;13161:24:0;;12972:221::o;12495:411::-;12576:13;12592:23;12607:7;12592:14;:23::i;:::-;12576:39;;12640:5;-1:-1:-1;;;;;12634:11:0;:2;-1:-1:-1;;;;;12634:11:0;;;12626:57;;;;-1:-1:-1;;;12626:57:0;;19954:2:1;12626:57:0;;;19936:21:1;19993:2;19973:18;;;19966:30;20032:34;20012:18;;;20005:62;20103:3;20083:18;;;20076:31;20124:19;;12626:57:0;19752:397:1;12626:57:0;790:10;-1:-1:-1;;;;;12718:21:0;;;;:62;;-1:-1:-1;12743:37:0;12760:5;790:10;13631:164;:::i;12743:37::-;12696:168;;;;-1:-1:-1;;;12696:168:0;;15413:2:1;12696:168:0;;;15395:21:1;15452:2;15432:18;;;15425:30;15491:34;15471:18;;;15464:62;15562:26;15542:18;;;15535:54;15606:19;;12696:168:0;15211:420:1;12696:168:0;12877:21;12886:2;12890:7;12877:8;:21::i;:::-;12565:341;12495:411;;:::o;49845:108::-;41467:6;;49898:7;;-1:-1:-1;;;;;41467:6:0;790:10;41614:23;41606:68;;;;-1:-1:-1;;;41606:68:0;;18488:2:1;41606:68:0;;;18470:21:1;;;18507:18;;;18500:30;18566:34;18546:18;;;18539:62;18618:18;;41606:68:0;18286:356:1;41606:68:0;-1:-1:-1;49924:21:0::1;49845:108:::0;:::o;13862:339::-;14057:41;790:10;14090:7;14057:18;:41::i;:::-;14049:103;;;;-1:-1:-1;;;14049:103:0;;20356:2:1;14049:103:0;;;20338:21:1;20395:2;20375:18;;;20368:30;20434:34;20414:18;;;20407:62;20505:19;20485:18;;;20478:47;20542:19;;14049:103:0;20154:413:1;14049:103:0;14165:28;14175:4;14181:2;14185:7;14165:9;:28::i;23717:256::-;23814:7;23850:23;23867:5;23850:16;:23::i;:::-;23842:5;:31;23834:87;;;;-1:-1:-1;;;23834:87:0;;11582:2:1;23834:87:0;;;11564:21:1;11621:2;11601:18;;;11594:30;11660:34;11640:18;;;11633:62;11731:13;11711:18;;;11704:41;11762:19;;23834:87:0;11380:407:1;23834:87:0;-1:-1:-1;;;;;;23939:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;23717:256::o;48008:183::-;-1:-1:-1;;;;;48088:18:0;;48068:4;48088:18;;;:10;:18;;;;;;;;:36;;;;-1:-1:-1;48110:14:0;;;;48088:36;48085:65;;;-1:-1:-1;48146:4:0;;48008:183;-1:-1:-1;48008:183:0:o;48085:65::-;-1:-1:-1;48178:5:0;;48008:183;-1:-1:-1;48008:183:0:o;49478:151::-;41467:6;;-1:-1:-1;;;;;41467:6:0;790:10;41614:23;41606:68;;;;-1:-1:-1;;;41606:68:0;;18488:2:1;41606:68:0;;;18470:21:1;;;18507:18;;;18500:30;18566:34;18546:18;;;18539:62;18618:18;;41606:68:0;18286:356:1;41606:68:0;49584:37:::1;::::0;49552:21:::1;::::0;49592:10:::1;::::0;49584:37;::::1;;;::::0;49552:21;;49534:15:::1;49584:37:::0;49534:15;49584:37;49552:21;49592:10;49584:37;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;49523:106;49478:151::o:0;14272:185::-;14410:39;14427:4;14433:2;14437:7;14410:39;;;;;;;;;;;;:16;:39::i;48202:352::-;48262:16;48296:18;48317:17;48327:6;48317:9;:17::i;:::-;48296:38;;48345:25;48387:10;48373:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48373:25:0;;48345:53;;48414:9;48409:112;48433:10;48429:1;:14;48409:112;;;48479:30;48499:6;48507:1;48479:19;:30::i;:::-;48465:8;48474:1;48465:11;;;;;;;;:::i;:::-;;;;;;;;;;:44;48445:3;;;;:::i;:::-;;;;48409:112;;;-1:-1:-1;48538:8:0;48202:352;-1:-1:-1;;;48202:352:0:o;24239:233::-;24314:7;24350:30;24137:10;:17;;24049:113;24350:30;24342:5;:38;24334:95;;;;-1:-1:-1;;;24334:95:0;;20774:2:1;24334:95:0;;;20756:21:1;20813:2;20793:18;;;20786:30;20852:34;20832:18;;;20825:62;20923:14;20903:18;;;20896:42;20955:19;;24334:95:0;20572:408:1;24334:95:0;24447:10;24458:5;24447:17;;;;;;;;:::i;:::-;;;;;;;;;24440:24;;24239:233;;;:::o;49641:192::-;41467:6;;-1:-1:-1;;;;;41467:6:0;790:10;41614:23;41606:68;;;;-1:-1:-1;;;41606:68:0;;18488:2:1;41606:68:0;;;18470:21:1;;;18507:18;;;18500:30;18566:34;18546:18;;;18539:62;18618:18;;41606:68:0;18286:356:1;41606:68:0;49721:9:::1;49718:107;;;-1:-1:-1::0;49745:19:0::1;:27:::0;49478:151::o;49718:107::-:1;-1:-1:-1::0;49801:16:0::1;:24:::0;49641:192::o;44212:85::-;41467:6;;-1:-1:-1;;;;;41467:6:0;790:10;41614:23;41606:68;;;;-1:-1:-1;;;41606:68:0;;18488:2:1;41606:68:0;;;18470:21:1;;;18507:18;;;18500:30;18566:34;18546:18;;;18539:62;18618:18;;41606:68:0;18286:356:1;41606:68:0;44280:9:::1;::::0;;44267:22;;::::1;44280:9;::::0;;;::::1;;;44279:10;44267:22:::0;;::::1;;::::0;;44212:85::o;50041:104::-;41467:6;;-1:-1:-1;;;;;41467:6:0;790:10;41614:23;41606:68;;;;-1:-1:-1;;;41606:68:0;;18488:2:1;41606:68:0;;;18470:21:1;;;18507:18;;;18500:30;18566:34;18546:18;;;18539:62;18618:18;;41606:68:0;18286:356:1;41606:68:0;50113:24;;::::1;::::0;:13:::1;::::0;:24:::1;::::0;::::1;::::0;::::1;:::i;11107:239::-:0;11179:7;11215:16;;;:7;:16;;;;;;-1:-1:-1;;;;;11215:16:0;11250:19;11242:73;;;;-1:-1:-1;;;11242:73:0;;16249:2:1;11242:73:0;;;16231:21:1;16288:2;16268:18;;;16261:30;16327:34;16307:18;;;16300:62;16398:11;16378:18;;;16371:39;16427:19;;11242:73:0;16047:405:1;46402:324:0;46482:19;46504:13;24137:10;:17;;24049:113;46504:13;46482:35;;46528:60;46539:14;46555:9;46566:10;46578:9;46528:10;:60::i;:::-;46614:9;46609:110;46633:14;46629:1;:18;46609:110;;;46669:38;46679:10;46691:15;46705:1;46691:11;:15;:::i;:::-;46669:9;:38::i;:::-;46649:3;;;;:::i;:::-;;;;46609:110;;;;46471:255;46402:324;;:::o;10837:208::-;10909:7;-1:-1:-1;;;;;10937:19:0;;10929:74;;;;-1:-1:-1;;;10929:74:0;;15838:2:1;10929:74:0;;;15820:21:1;15877:2;15857:18;;;15850:30;15916:34;15896:18;;;15889:62;15987:12;15967:18;;;15960:40;16017:19;;10929:74:0;15636:406:1;10929:74:0;-1:-1:-1;;;;;;11021:16:0;;;;;:9;:16;;;;;;;10837:208::o;42045:94::-;41467:6;;-1:-1:-1;;;;;41467:6:0;790:10;41614:23;41606:68;;;;-1:-1:-1;;;41606:68:0;;18488:2:1;41606:68:0;;;18470:21:1;;;18507:18;;;18500:30;18566:34;18546:18;;;18539:62;18618:18;;41606:68:0;18286:356:1;41606:68:0;42110:21:::1;42128:1;42110:9;:21::i;:::-;42045:94::o:0;48917:260::-;41467:6;;-1:-1:-1;;;;;41467:6:0;790:10;41614:23;41606:68;;;;-1:-1:-1;;;41606:68:0;;18488:2:1;41606:68:0;;;18470:21:1;;;18507:18;;;18500:30;18566:34;18546:18;;;18539:62;18618:18;;41606:68:0;18286:356:1;41606:68:0;49023:1:::1;49005:8;:15;:19;48997:45;;;::::0;-1:-1:-1;;;48997:45:0;;19612:2:1;48997:45:0::1;::::0;::::1;19594:21:1::0;19651:2;19631:18;;;19624:30;19690:15;19670:18;;;19663:43;19723:18;;48997:45:0::1;19410:337:1::0;48997:45:0::1;49057:13;49053:117;49084:8;:15;49076:5;:23;49053:117;;;49154:4;49124:10;:27;49135:8;49144:5;49135:15;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;49124:27:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;49124:27:0;:34;;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;49101:7;::::1;::::0;::::1;:::i;:::-;;;;49053:117;;45788:606:::0;45848:19;45870:13;24137:10;:17;;24049:113;45870:13;45902:9;;45848:35;;-1:-1:-1;45902:9:0;;;;;45894:47;;;;-1:-1:-1;;;45894:47:0;;16659:2:1;45894:47:0;;;16641:21:1;16698:2;16678:18;;;16671:30;16737:27;16717:18;;;16710:55;16782:18;;45894:47:0;16457:349:1;45894:47:0;45977:1;45960:14;:18;45952:47;;;;-1:-1:-1;;;45952:47:0;;11237:2:1;45952:47:0;;;11219:21:1;11276:2;11256:18;;;11249:30;11315:18;11295;;;11288:46;11351:18;;45952:47:0;11035:340:1;45952:47:0;43522:5;46019:28;46033:14;46019:11;:28;:::i;:::-;46018:44;;46010:86;;;;-1:-1:-1;;;46010:86:0;;14292:2:1;46010:86:0;;;14274:21:1;14331:2;14311:18;;;14304:30;14370:31;14350:18;;;14343:59;14419:18;;46010:86:0;14090:353:1;46010:86:0;46117:31;46151:45;46169:10;46181:14;46151:17;:45::i;:::-;46117:79;;46222:9;46217:170;46241:14;46237:1;:18;46217:170;;;46276:38;46286:10;46298:15;46312:1;46298:11;:15;:::i;46276:38::-;46371:4;46328:21;:40;46350:14;46365:1;46350:17;;;;;;;;:::i;:::-;;;;;;;46328:40;;;;;;;;;;;;:47;;;;;;;;;;;;;;;;;;46257:3;;;;;:::i;:::-;;;;46217:170;;44528:246;41467:6;;-1:-1:-1;;;;;41467:6:0;790:10;41614:23;41606:68;;;;-1:-1:-1;;;41606:68:0;;18488:2:1;41606:68:0;;;18470:21:1;;;18507:18;;;18500:30;18566:34;18546:18;;;18539:62;18618:18;;41606:68:0;18286:356:1;41606:68:0;44609:19:::1;44631:13;24137:10:::0;:17;;24049:113;44631:13:::1;44609:35;;44670:9;44665:102;44689:14;44685:1;:18;44665:102;;;44725:30;44735:2:::0;44739:15:::1;44753:1:::0;44739:11;:15:::1;:::i;44725:30::-;44705:3:::0;::::1;::::0;::::1;:::i;:::-;;;;44665:102;;11582:104:::0;11638:13;11671:7;11664:14;;;;;:::i;13265:295::-;-1:-1:-1;;;;;13368:24:0;;790:10;13368:24;;13360:62;;;;-1:-1:-1;;;13360:62:0;;13938:2:1;13360:62:0;;;13920:21:1;13977:2;13957:18;;;13950:30;14016:27;13996:18;;;13989:55;14061:18;;13360:62:0;13736:349:1;13360:62:0;790:10;13435:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;13435:42:0;;;;;;;;;;;;:53;;;;;;;;;;;;;13504:48;;10759:41:1;;;13435:42:0;;790:10;13504:48;;10732:18:1;13504:48:0;;;;;;;13265:295;;:::o;48562:343::-;41467:6;;48617:16;;-1:-1:-1;;;;;41467:6:0;790:10;41614:23;41606:68;;;;-1:-1:-1;;;41606:68:0;;18488:2:1;41606:68:0;;;18470:21:1;;;18507:18;;;18500:30;18566:34;18546:18;;;18539:62;18618:18;;41606:68:0;18286:356:1;41606:68:0;48651:18:::1;43522:5;48672:13;24137:10:::0;:17;;24049:113;48672:13:::1;:26;;;;:::i;:::-;48651:47;;48709:23;48749:10;48735:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;48735:25:0::1;;48709:51;;48776:9;48771:103;48795:10;48791:1;:14;48771:103;;;48839:23;48847:14;48860:1:::0;43522:5:::1;48847:14;:::i;48839:23::-;48827:6;48834:1;48827:9;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;48827:35:0;;::::1;:9;::::0;;::::1;::::0;;;;;;;:35;48807:3;::::1;::::0;::::1;:::i;:::-;;;;48771:103;;;-1:-1:-1::0;48891:6:0;-1:-1:-1;;48562:343:0;:::o;49189:277::-;41467:6;;-1:-1:-1;;;;;41467:6:0;790:10;41614:23;41606:68;;;;-1:-1:-1;;;41606:68:0;;18488:2:1;41606:68:0;;;18470:21:1;;;18507:18;;;18500:30;18566:34;18546:18;;;18539:62;18618:18;;41606:68:0;18286:356:1;41606:68:0;49300:1:::1;49282:8;:15;:19;49274:45;;;::::0;-1:-1:-1;;;49274:45:0;;19612:2:1;49274:45:0::1;::::0;::::1;19594:21:1::0;19651:2;19631:18;;;19624:30;19690:15;19670:18;;;19663:43;19723:18;;49274:45:0::1;19410:337:1::0;49274:45:0::1;49334:13;49330:129;49361:8;:15;49353:5;:23;49330:129;;;49442:5;49412:10;:27;49423:8;49432:5;49423:15;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;49412:27:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;49412:27:0;:35;;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;49378:7;::::1;::::0;::::1;:::i;:::-;;;;49330:129;;44310:103:::0;41467:6;;-1:-1:-1;;;;;41467:6:0;790:10;41614:23;41606:68;;;;-1:-1:-1;;;41606:68:0;;18488:2:1;41606:68:0;;;18470:21:1;;;18507:18;;;18500:30;18566:34;18546:18;;;18539:62;18618:18;;41606:68:0;18286:356:1;41606:68:0;44390:15:::1;::::0;;44371:34;;::::1;44390:15:::0;;;;::::1;;;44389:16;44371:34:::0;;::::1;;::::0;;44310:103::o;14528:328::-;14703:41;790:10;14736:7;14703:18;:41::i;:::-;14695:103;;;;-1:-1:-1;;;14695:103:0;;20356:2:1;14695:103:0;;;20338:21:1;20395:2;20375:18;;;20368:30;20434:34;20414:18;;;20407:62;20505:19;20485:18;;;20478:47;20542:19;;14695:103:0;20154:413:1;14695:103:0;14809:39;14823:4;14829:2;14833:7;14842:5;14809:13;:39::i;50153:225::-;50226:13;50335;50350:18;:7;:16;:18::i;:::-;50318:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50304:66;;50153:225;;;:::o;44425:91::-;41467:6;;-1:-1:-1;;;;;41467:6:0;790:10;41614:23;41606:68;;;;-1:-1:-1;;;41606:68:0;;18488:2:1;41606:68:0;;;18470:21:1;;;18507:18;;;18500:30;18566:34;18546:18;;;18539:62;18618:18;;41606:68:0;18286:356:1;41606:68:0;44497:11:::1;::::0;;44482:26;;::::1;44497:11:::0;;;;::::1;;;44496:12;44482:26:::0;;::::1;;::::0;;44425:91::o;42294:192::-;41467:6;;-1:-1:-1;;;;;41467:6:0;790:10;41614:23;41606:68;;;;-1:-1:-1;;;41606:68:0;;18488:2:1;41606:68:0;;;18470:21:1;;;18507:18;;;18500:30;18566:34;18546:18;;;18539:62;18618:18;;41606:68:0;18286:356:1;41606:68:0;-1:-1:-1;;;;;42383:22:0;::::1;42375:73;;;::::0;-1:-1:-1;;;42375:73:0;;12413:2:1;42375:73:0::1;::::0;::::1;12395:21:1::0;12452:2;12432:18;;;12425:30;12491:34;12471:18;;;12464:62;12562:8;12542:18;;;12535:36;12588:19;;42375:73:0::1;12211:402:1::0;42375:73:0::1;42459:19;42469:8;42459:9;:19::i;:::-;42294:192:::0;:::o;44100:100::-;41467:6;;-1:-1:-1;;;;;41467:6:0;790:10;41614:23;41606:68;;;;-1:-1:-1;;;41606:68:0;;18488:2:1;41606:68:0;;;18470:21:1;;;18507:18;;;18500:30;18566:34;18546:18;;;18539:62;18618:18;;41606:68:0;18286:356:1;41606:68:0;44178:14:::1;::::0;;44160:32;;::::1;44178:14;::::0;;::::1;44177:15;44160:32;::::0;;44100:100::o;46738:560::-;46813:11;;;;;;;46805:53;;;;-1:-1:-1;;;46805:53:0;;22240:2:1;46805:53:0;;;22222:21:1;22279:2;22259:18;;;22252:30;22318:31;22298:18;;;22291:59;22367:18;;46805:53:0;22038:353:1;46805:53:0;46890:17;46898:8;46890:7;:17::i;:::-;-1:-1:-1;;;;;46876:31:0;:10;-1:-1:-1;;;;;46876:31:0;;46868:62;;;;-1:-1:-1;;;46868:62:0;;21535:2:1;46868:62:0;;;21517:21:1;21574:2;21554:18;;;21547:30;21613:20;21593:18;;;21586:48;21651:18;;46868:62:0;21333:342:1;46868:62:0;46962:17;46970:8;46962:7;:17::i;:::-;-1:-1:-1;;;;;46948:31:0;:10;-1:-1:-1;;;;;46948:31:0;;46940:62;;;;-1:-1:-1;;;46940:62:0;;21535:2:1;46940:62:0;;;21517:21:1;21574:2;21554:18;;;21547:30;21613:20;21593:18;;;21586:48;21651:18;;46940:62:0;21333:342:1;46940:62:0;43522:5;47020:8;:21;47012:55;;;;-1:-1:-1;;;47012:55:0;;18139:2:1;47012:55:0;;;18121:21:1;18178:2;18158:18;;;18151:30;18217:22;18197:18;;;18190:50;18257:18;;47012:55:0;17937:344:1;47012:55:0;43522:5;47085:8;:21;47077:55;;;;-1:-1:-1;;;47077:55:0;;18139:2:1;47077:55:0;;;18121:21:1;18178:2;18158:18;;;18151:30;18217:22;18197:18;;;18190:50;18257:18;;47077:55:0;17937:344:1;47077:55:0;47151:15;47157:8;47151:5;:15::i;:::-;47176;47182:8;47176:5;:15::i;:::-;47210:52;47220:10;47245:16;;43522:5;47232:29;;;;:::i;47210:52::-;47272:16;:18;;;:16;:18;;;:::i;:::-;;;;;;46738:560;;:::o;10468:305::-;10570:4;10607:40;;;10622:25;10607:40;;:105;;-1:-1:-1;10664:48:0;;;10679:33;10664:48;10607:105;:158;;;-1:-1:-1;9114:25:0;9099:40;;;;10729:36;8990:157;20348:174;20423:24;;;;:15;:24;;;;;:29;;;;-1:-1:-1;;;;;20423:29:0;;;;;;;;:24;;20477:23;20423:24;20477:14;:23::i;:::-;-1:-1:-1;;;;;20468:46:0;;;;;;;;;;;20348:174;;:::o;16660:348::-;16753:4;16455:16;;;:7;:16;;;;;;-1:-1:-1;;;;;16455:16:0;16770:73;;;;-1:-1:-1;;;16770:73:0;;14650:2:1;16770:73:0;;;14632:21:1;14689:2;14669:18;;;14662:30;14728:34;14708:18;;;14701:62;14799:14;14779:18;;;14772:42;14831:19;;16770:73:0;14448:408:1;16770:73:0;16854:13;16870:23;16885:7;16870:14;:23::i;:::-;16854:39;;16923:5;-1:-1:-1;;;;;16912:16:0;:7;-1:-1:-1;;;;;16912:16:0;;:51;;;;16956:7;-1:-1:-1;;;;;16932:31:0;:20;16944:7;16932:11;:20::i;:::-;-1:-1:-1;;;;;16932:31:0;;16912:51;:87;;;-1:-1:-1;;;;;;13752:25:0;;;13728:4;13752:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;16967:32;16904:96;16660:348;-1:-1:-1;;;;16660:348:0:o;19652:578::-;19811:4;-1:-1:-1;;;;;19784:31:0;:23;19799:7;19784:14;:23::i;:::-;-1:-1:-1;;;;;19784:31:0;;19776:85;;;;-1:-1:-1;;;19776:85:0;;19202:2:1;19776:85:0;;;19184:21:1;19241:2;19221:18;;;19214:30;19280:34;19260:18;;;19253:62;19351:11;19331:18;;;19324:39;19380:19;;19776:85:0;19000:405:1;19776:85:0;-1:-1:-1;;;;;19880:16:0;;19872:65;;;;-1:-1:-1;;;19872:65:0;;13533:2:1;19872:65:0;;;13515:21:1;13572:2;13552:18;;;13545:30;13611:34;13591:18;;;13584:62;13682:6;13662:18;;;13655:34;13706:19;;19872:65:0;13331:400:1;19872:65:0;19950:39;19971:4;19977:2;19981:7;19950:20;:39::i;:::-;20054:29;20071:1;20075:7;20054:8;:29::i;:::-;-1:-1:-1;;;;;20096:15:0;;;;;;:9;:15;;;;;:20;;20115:1;;20096:15;:20;;20115:1;;20096:20;:::i;:::-;;;;-1:-1:-1;;;;;;;20127:13:0;;;;;;:9;:13;;;;;:18;;20144:1;;20127:13;:18;;20144:1;;20127:18;:::i;:::-;;;;-1:-1:-1;;20156:16:0;;;;:7;:16;;;;;;:21;;;;-1:-1:-1;;;;;20156:21:0;;;;;;;;;20195:27;;20156:16;;20195:27;;;;;;;19652:578;;;:::o;44782:994::-;44898:19;44920:13;24137:10;:17;;24049:113;44920:13;44898:35;;44969:1;44952:14;:18;44944:47;;;;-1:-1:-1;;;44944:47:0;;11237:2:1;44944:47:0;;;11219:21:1;11276:2;11256:18;;;11249:30;11315:18;11295;;;11288:46;11351:18;;44944:47:0;11035:340:1;44944:47:0;43522:5;45011:28;45025:14;45011:11;:28;:::i;:::-;45010:44;;45002:86;;;;-1:-1:-1;;;45002:86:0;;14292:2:1;45002:86:0;;;14274:21:1;14331:2;14311:18;;;14304:30;14370:31;14350:18;;;14343:59;14419:18;;45002:86:0;14090:353:1;45002:86:0;45112:9;45109:660;;;45146:14;;;;45138:51;;;;-1:-1:-1;;;45138:51:0;;18849:2:1;45138:51:0;;;18831:21:1;18888:2;18868:18;;;18861:30;18927:26;18907:18;;;18900:54;18971:18;;45138:51:0;18647:348:1;45138:51:0;45212:21;45226:6;45212:13;:21::i;:::-;45204:57;;;;-1:-1:-1;;;45204:57:0;;17374:2:1;45204:57:0;;;17356:21:1;17413:2;17393:18;;;17386:30;17452:25;17432:18;;;17425:53;17495:18;;45204:57:0;17172:347:1;45204:57:0;45331:14;45305:21;45315:10;45305:9;:21::i;:::-;45285:41;;43475:2;45285:41;:::i;:::-;45284:61;;45276:93;;;;-1:-1:-1;;;45276:93:0;;21187:2:1;45276:93:0;;;21169:21:1;21226:2;21206:18;;;21199:30;21265:21;21245:18;;;21238:49;21304:18;;45276:93:0;20985:343:1;45276:93:0;45432:6;45414:14;45392:19;;:36;;;;:::i;:::-;:46;45384:86;;;;-1:-1:-1;;;45384:86:0;;13177:2:1;45384:86:0;;;13159:21:1;13216:2;13196:18;;;13189:30;13255:29;13235:18;;;13228:57;13302:18;;45384:86:0;12975:351:1;45384:86:0;45109:660;;;45520:15;;;;;;;45512:52;;;;-1:-1:-1;;;45512:52:0;;18849:2:1;45512:52:0;;;18831:21:1;18888:2;18868:18;;;18861:30;18927:26;18907:18;;;18900:54;18971:18;;45512:52:0;18647:348:1;45512:52:0;43422:2;45587:14;:34;;45579:68;;;;-1:-1:-1;;;45579:68:0;;15063:2:1;45579:68:0;;;15045:21:1;15102:2;15082:18;;;15075:30;15141:23;15121:18;;;15114:51;15182:18;;45579:68:0;14861:345:1;45579:68:0;45712:6;45694:14;45675:16;;:33;;;;:::i;:::-;:43;45667:83;;;;-1:-1:-1;;;45667:83:0;;13177:2:1;45667:83:0;;;13159:21:1;13216:2;13196:18;;;13189:30;13255:29;13235:18;;;13228:57;13302:18;;45667:83:0;12975:351:1;45667:83:0;44887:889;44782:994;;;;:::o;17350:110::-;17426:26;17436:2;17440:7;17426:26;;;;;;;;;;;;:9;:26::i;42494:173::-;42569:6;;;-1:-1:-1;;;;;42586:17:0;;;;;;;;;;;42619:40;;42569:6;;;42586:17;42569:6;;42619:40;;42550:16;;42619:40;42539:128;42494:173;:::o;47310:686::-;47444:16;;47506:23;;;;;-1:-1:-1;;;;;8713:55:1;;;47506:23:0;;;8695:74:1;47393:16:0;;47444;;47422:10;;47444:16;;47506:15;;8668:18:1;;47506:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47472:57;;47540:31;47588:9;:16;47574:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47574:31:0;;47540:65;;47626:11;47657:9;47652:231;47676:9;:16;47672:1;:20;47652:231;;;47717:21;:43;47739:9;47749:1;47739:12;;;;;;;;:::i;:::-;;;;;;;;;;;;:20;;;;;47717:43;;;;;;;;;;-1:-1:-1;47717:43:0;;;;47714:158;;47812:9;47822:1;47812:12;;;;;;;;:::i;:::-;;;;;;;:20;;;47790:14;47805:3;47790:19;;;;;;;;:::i;:::-;;;;;;;;;;:42;47851:5;;;;:::i;:::-;;;;47714:158;47694:3;;;;:::i;:::-;;;;47652:231;;;;47908:14;47901:3;:21;;47893:63;;;;-1:-1:-1;;;47893:63:0;;21882:2:1;47893:63:0;;;21864:21:1;21921:2;21901:18;;;21894:30;21960:31;21940:18;;;21933:59;22009:18;;47893:63:0;21680:353:1;47893:63:0;-1:-1:-1;47974:14:0;47310:686;-1:-1:-1;;;;;47310:686:0:o;15738:315::-;15895:28;15905:4;15911:2;15915:7;15895:9;:28::i;:::-;15942:48;15965:4;15971:2;15975:7;15984:5;15942:22;:48::i;:::-;15934:111;;;;-1:-1:-1;;;15934:111:0;;11994:2:1;15934:111:0;;;11976:21:1;12033:2;12013:18;;;12006:30;12072:34;12052:18;;;12045:62;12143:20;12123:18;;;12116:48;12181:19;;15934:111:0;11792:414:1;29864:723:0;29920:13;30141:10;30137:53;;-1:-1:-1;;30168:10:0;;;;;;;;;;;;;;;;;;29864:723::o;30137:53::-;30215:5;30200:12;30256:78;30263:9;;30256:78;;30289:8;;;;:::i;:::-;;-1:-1:-1;30312:10:0;;-1:-1:-1;30320:2:0;30312:10;;:::i;:::-;;;30256:78;;;30344:19;30376:6;30366:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30366:17:0;;30344:39;;30394:154;30401:10;;30394:154;;30428:11;30438:1;30428:11;;:::i;:::-;;-1:-1:-1;30497:10:0;30505:2;30497:5;:10;:::i;:::-;30484:24;;:2;:24;:::i;:::-;30471:39;;30454:6;30461;30454:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;30525:11:0;30534:2;30525:11;;:::i;:::-;;;30394:154;;18955:360;19015:13;19031:23;19046:7;19031:14;:23::i;:::-;19015:39;;19067:48;19088:5;19103:1;19107:7;19067:20;:48::i;:::-;19156:29;19173:1;19177:7;19156:8;:29::i;:::-;-1:-1:-1;;;;;19198:16:0;;;;;;:9;:16;;;;;:21;;19218:1;;19198:16;:21;;19218:1;;19198:21;:::i;:::-;;;;-1:-1:-1;;19237:16:0;;;;:7;:16;;;;;;19230:23;;;;;;19271:36;19245:7;;19237:16;-1:-1:-1;;;;;19271:36:0;;;;;19237:16;;19271:36;19004:311;18955:360;:::o;25085:589::-;-1:-1:-1;;;;;25291:18:0;;25287:187;;25326:40;25358:7;26501:10;:17;;26474:24;;;;:15;:24;;;;;:44;;;26529:24;;;;;;;;;;;;26397:164;25326:40;25287:187;;;25396:2;-1:-1:-1;;;;;25388:10:0;:4;-1:-1:-1;;;;;25388:10:0;;25384:90;;25415:47;25448:4;25454:7;25415:32;:47::i;:::-;-1:-1:-1;;;;;25488:16:0;;25484:183;;25521:45;25558:7;25521:36;:45::i;25484:183::-;25594:4;-1:-1:-1;;;;;25588:10:0;:2;-1:-1:-1;;;;;25588:10:0;;25584:83;;25615:40;25643:2;25647:7;25615:27;:40::i;17687:321::-;17817:18;17823:2;17827:7;17817:5;:18::i;:::-;17868:54;17899:1;17903:2;17907:7;17916:5;17868:22;:54::i;:::-;17846:154;;;;-1:-1:-1;;;17846:154:0;;11994:2:1;17846:154:0;;;11976:21:1;12033:2;12013:18;;;12006:30;12072:34;12052:18;;;12045:62;12143:20;12123:18;;;12116:48;12181:19;;17846:154:0;11792:414:1;21087:803:0;21242:4;-1:-1:-1;;;;;21263:13:0;;32708:20;32756:8;21259:624;;21299:72;;;;;-1:-1:-1;;;;;21299:36:0;;;;;:72;;790:10;;21350:4;;21356:7;;21365:5;;21299:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21299:72:0;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;21295:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21545:13:0;;21541:272;;21588:60;;-1:-1:-1;;;21588:60:0;;11994:2:1;21588:60:0;;;11976:21:1;12033:2;12013:18;;;12006:30;12072:34;12052:18;;;12045:62;12143:20;12123:18;;;12116:48;12181:19;;21588:60:0;11792:414:1;21541:272:0;21763:6;21757:13;21748:6;21744:2;21740:15;21733:38;21295:533;21422:55;;21432:45;21422:55;;-1:-1:-1;21415:62:0;;21259:624;-1:-1:-1;21867:4:0;21087:803;;;;;;:::o;27188:988::-;27454:22;27504:1;27479:22;27496:4;27479:16;:22::i;:::-;:26;;;;:::i;:::-;27516:18;27537:26;;;:17;:26;;;;;;27454:51;;-1:-1:-1;27670:28:0;;;27666:328;;-1:-1:-1;;;;;27737:18:0;;27715:19;27737:18;;;:12;:18;;;;;;;;:34;;;;;;;;;27788:30;;;;;;:44;;;27905:30;;:17;:30;;;;;:43;;;27666:328;-1:-1:-1;28090:26:0;;;;:17;:26;;;;;;;;28083:33;;;-1:-1:-1;;;;;28134:18:0;;;;;:12;:18;;;;;:34;;;;;;;28127:41;27188:988::o;28471:1079::-;28749:10;:17;28724:22;;28749:21;;28769:1;;28749:21;:::i;:::-;28781:18;28802:24;;;:15;:24;;;;;;29175:10;:26;;28724:46;;-1:-1:-1;28802:24:0;;28724:46;;29175:26;;;;;;:::i;:::-;;;;;;;;;29153:48;;29239:11;29214:10;29225;29214:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;29319:28;;;:15;:28;;;;;;;:41;;;29491:24;;;;;29484:31;29526:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;28542:1008;;;28471:1079;:::o;25975:221::-;26060:14;26077:20;26094:2;26077:16;:20::i;:::-;-1:-1:-1;;;;;26108:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;26153:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;25975:221:0:o;18344:382::-;-1:-1:-1;;;;;18424:16:0;;18416:61;;;;-1:-1:-1;;;18416:61:0;;17013:2:1;18416:61:0;;;16995:21:1;;;17032:18;;;17025:30;17091:34;17071:18;;;17064:62;17143:18;;18416:61:0;16811:356:1;18416:61:0;16431:4;16455:16;;;:7;:16;;;;;;-1:-1:-1;;;;;16455:16:0;:30;18488:58;;;;-1:-1:-1;;;18488:58:0;;12820:2:1;18488:58:0;;;12802:21:1;12859:2;12839:18;;;12832:30;12898;12878:18;;;12871:58;12946:18;;18488:58:0;12618:352:1;18488:58:0;18559:45;18588:1;18592:2;18596:7;18559:20;:45::i;:::-;-1:-1:-1;;;;;18617:13:0;;;;;;:9;:13;;;;;:18;;18634:1;;18617:13;:18;;18634:1;;18617:18;:::i;:::-;;;;-1:-1:-1;;18646:16:0;;;;:7;:16;;;;;;:21;;;;-1:-1:-1;;;;;18646:21:0;;;;;;;;18685:33;;18646:16;;;18685:33;;18646:16;;18685:33;18344:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:465:1;78:5;112:18;104:6;101:30;98:56;;;134:18;;:::i;:::-;172:116;282:4;213:66;208:2;200:6;196:15;192:88;188:99;172:116;:::i;:::-;163:125;;311:6;304:5;297:21;351:3;342:6;337:3;333:16;330:25;327:45;;;368:1;365;358:12;327:45;417:6;412:3;405:4;398:5;394:16;381:43;471:1;464:4;455:6;448:5;444:18;440:29;433:40;14:465;;;;;:::o;484:196::-;552:20;;-1:-1:-1;;;;;601:54:1;;591:65;;581:93;;670:1;667;660:12;581:93;484:196;;;:::o;685:186::-;744:6;797:2;785:9;776:7;772:23;768:32;765:52;;;813:1;810;803:12;765:52;836:29;855:9;836:29;:::i;:::-;826:39;685:186;-1:-1:-1;;;685:186:1:o;876:260::-;944:6;952;1005:2;993:9;984:7;980:23;976:32;973:52;;;1021:1;1018;1011:12;973:52;1044:29;1063:9;1044:29;:::i;:::-;1034:39;;1092:38;1126:2;1115:9;1111:18;1092:38;:::i;:::-;1082:48;;876:260;;;;;:::o;1141:328::-;1218:6;1226;1234;1287:2;1275:9;1266:7;1262:23;1258:32;1255:52;;;1303:1;1300;1293:12;1255:52;1326:29;1345:9;1326:29;:::i;:::-;1316:39;;1374:38;1408:2;1397:9;1393:18;1374:38;:::i;:::-;1364:48;;1459:2;1448:9;1444:18;1431:32;1421:42;;1141:328;;;;;:::o;1474:666::-;1569:6;1577;1585;1593;1646:3;1634:9;1625:7;1621:23;1617:33;1614:53;;;1663:1;1660;1653:12;1614:53;1686:29;1705:9;1686:29;:::i;:::-;1676:39;;1734:38;1768:2;1757:9;1753:18;1734:38;:::i;:::-;1724:48;;1819:2;1808:9;1804:18;1791:32;1781:42;;1874:2;1863:9;1859:18;1846:32;1901:18;1893:6;1890:30;1887:50;;;1933:1;1930;1923:12;1887:50;1956:22;;2009:4;2001:13;;1997:27;-1:-1:-1;1987:55:1;;2038:1;2035;2028:12;1987:55;2061:73;2126:7;2121:2;2108:16;2103:2;2099;2095:11;2061:73;:::i;:::-;2051:83;;;1474:666;;;;;;;:::o;2145:315::-;2210:6;2218;2271:2;2259:9;2250:7;2246:23;2242:32;2239:52;;;2287:1;2284;2277:12;2239:52;2310:29;2329:9;2310:29;:::i;:::-;2300:39;;2389:2;2378:9;2374:18;2361:32;2402:28;2424:5;2402:28;:::i;:::-;2449:5;2439:15;;;2145:315;;;;;:::o;2465:254::-;2533:6;2541;2594:2;2582:9;2573:7;2569:23;2565:32;2562:52;;;2610:1;2607;2600:12;2562:52;2633:29;2652:9;2633:29;:::i;:::-;2623:39;2709:2;2694:18;;;;2681:32;;-1:-1:-1;;;2465:254:1:o;2724:908::-;2808:6;2839:2;2882;2870:9;2861:7;2857:23;2853:32;2850:52;;;2898:1;2895;2888:12;2850:52;2938:9;2925:23;2971:18;2963:6;2960:30;2957:50;;;3003:1;3000;2993:12;2957:50;3026:22;;3079:4;3071:13;;3067:27;-1:-1:-1;3057:55:1;;3108:1;3105;3098:12;3057:55;3144:2;3131:16;3167:60;3183:43;3223:2;3183:43;:::i;:::-;3167:60;:::i;:::-;3249:3;3273:2;3268:3;3261:15;3301:2;3296:3;3292:12;3285:19;;3332:2;3328;3324:11;3380:7;3375:2;3369;3366:1;3362:10;3358:2;3354:19;3350:28;3347:41;3344:61;;;3401:1;3398;3391:12;3344:61;3423:1;3414:10;;3433:169;3447:2;3444:1;3441:9;3433:169;;;3504:23;3523:3;3504:23;:::i;:::-;3492:36;;3465:1;3458:9;;;;;3548:12;;;;3580;;3433:169;;;-1:-1:-1;3621:5:1;2724:908;-1:-1:-1;;;;;;;2724:908:1:o;3637:1391::-;3762:6;3793:2;3836;3824:9;3815:7;3811:23;3807:32;3804:52;;;3852:1;3849;3842:12;3804:52;3885:9;3879:16;3918:18;3910:6;3907:30;3904:50;;;3950:1;3947;3940:12;3904:50;3973:22;;4026:4;4018:13;;4014:27;-1:-1:-1;4004:55:1;;4055:1;4052;4045:12;4004:55;4084:2;4078:9;4107:60;4123:43;4163:2;4123:43;:::i;4107:60::-;4201:15;;;4232:12;;;;4264:11;;;4294:4;4325:11;;;4317:20;;4313:29;;4310:42;-1:-1:-1;4307:62:1;;;4365:1;4362;4355:12;4307:62;4387:1;4378:10;;4397:601;4411:2;4408:1;4405:9;4397:601;;;4482:2;4476:3;4467:7;4463:17;4459:26;4456:46;;;4498:1;4495;4488:12;4456:46;4528:22;;:::i;:::-;4584:3;4578:10;4601:30;4623:7;4601:30;:::i;:::-;4644:22;;4700:12;;;4694:19;4748:1;4736:14;;4726:42;;4764:1;4761;4754:12;4726:42;4788:14;;;4781:31;4835:2;4879:12;;;4873:19;4857:14;;;4850:43;4906:18;;4429:1;4422:9;;;;;4944:12;;;;4976;;;;4397:601;;;-1:-1:-1;5017:5:1;;3637:1391;-1:-1:-1;;;;;;;;3637:1391:1:o;5033:245::-;5091:6;5144:2;5132:9;5123:7;5119:23;5115:32;5112:52;;;5160:1;5157;5150:12;5112:52;5199:9;5186:23;5218:30;5242:5;5218:30;:::i;5283:249::-;5352:6;5405:2;5393:9;5384:7;5380:23;5376:32;5373:52;;;5421:1;5418;5411:12;5373:52;5453:9;5447:16;5472:30;5496:5;5472:30;:::i;5537:450::-;5606:6;5659:2;5647:9;5638:7;5634:23;5630:32;5627:52;;;5675:1;5672;5665:12;5627:52;5715:9;5702:23;5748:18;5740:6;5737:30;5734:50;;;5780:1;5777;5770:12;5734:50;5803:22;;5856:4;5848:13;;5844:27;-1:-1:-1;5834:55:1;;5885:1;5882;5875:12;5834:55;5908:73;5973:7;5968:2;5955:16;5950:2;5946;5942:11;5908:73;:::i;5992:180::-;6051:6;6104:2;6092:9;6083:7;6079:23;6075:32;6072:52;;;6120:1;6117;6110:12;6072:52;-1:-1:-1;6143:23:1;;5992:180;-1:-1:-1;5992:180:1:o;6177:309::-;6242:6;6250;6303:2;6291:9;6282:7;6278:23;6274:32;6271:52;;;6319:1;6316;6309:12;6271:52;6355:9;6342:23;6332:33;;6415:2;6404:9;6400:18;6387:32;6428:28;6450:5;6428:28;:::i;6491:248::-;6559:6;6567;6620:2;6608:9;6599:7;6595:23;6591:32;6588:52;;;6636:1;6633;6626:12;6588:52;-1:-1:-1;;6659:23:1;;;6729:2;6714:18;;;6701:32;;-1:-1:-1;6491:248:1:o;6744:316::-;6785:3;6823:5;6817:12;6850:6;6845:3;6838:19;6866:63;6922:6;6915:4;6910:3;6906:14;6899:4;6892:5;6888:16;6866:63;:::i;:::-;6974:2;6962:15;6979:66;6958:88;6949:98;;;;7049:4;6945:109;;6744:316;-1:-1:-1;;6744:316:1:o;7065:185::-;7107:3;7145:5;7139:12;7160:52;7205:6;7200:3;7193:4;7186:5;7182:16;7160:52;:::i;:::-;7228:16;;;;;7065:185;-1:-1:-1;;7065:185:1:o;7255:1289::-;7431:3;7460:1;7493:6;7487:13;7523:3;7545:1;7573:9;7569:2;7565:18;7555:28;;7633:2;7622:9;7618:18;7655;7645:61;;7699:4;7691:6;7687:17;7677:27;;7645:61;7725:2;7773;7765:6;7762:14;7742:18;7739:38;7736:222;;;7812:77;7807:3;7800:90;7913:4;7910:1;7903:15;7943:4;7938:3;7931:17;7736:222;7974:18;8001:162;;;;8177:1;8172:320;;;;7967:525;;8001:162;8049:66;8038:9;8034:82;8029:3;8022:95;8146:6;8141:3;8137:16;8130:23;;8001:162;;8172:320;23436:1;23429:14;;;23473:4;23460:18;;8267:1;8281:165;8295:6;8292:1;8289:13;8281:165;;;8373:14;;8360:11;;;8353:35;8416:16;;;;8310:10;;8281:165;;;8285:3;;8475:6;8470:3;8466:16;8459:23;;7967:525;;;;;;;8508:30;8534:3;8526:6;8508:30;:::i;:::-;8501:37;7255:1289;-1:-1:-1;;;;;7255:1289:1:o;8780:511::-;8974:4;-1:-1:-1;;;;;9084:2:1;9076:6;9072:15;9061:9;9054:34;9136:2;9128:6;9124:15;9119:2;9108:9;9104:18;9097:43;;9176:6;9171:2;9160:9;9156:18;9149:34;9219:3;9214:2;9203:9;9199:18;9192:31;9240:45;9280:3;9269:9;9265:19;9257:6;9240:45;:::i;:::-;9232:53;8780:511;-1:-1:-1;;;;;;8780:511:1:o;9296:681::-;9467:2;9519:21;;;9589:13;;9492:18;;;9611:22;;;9438:4;;9467:2;9690:15;;;;9664:2;9649:18;;;9438:4;9733:218;9747:6;9744:1;9741:13;9733:218;;;9812:13;;-1:-1:-1;;;;;9808:62:1;9796:75;;9926:15;;;;9891:12;;;;9769:1;9762:9;9733:218;;;-1:-1:-1;9968:3:1;;9296:681;-1:-1:-1;;;;;;9296:681:1:o;9982:632::-;10153:2;10205:21;;;10275:13;;10178:18;;;10297:22;;;10124:4;;10153:2;10376:15;;;;10350:2;10335:18;;;10124:4;10419:169;10433:6;10430:1;10427:13;10419:169;;;10494:13;;10482:26;;10563:15;;;;10528:12;;;;10455:1;10448:9;10419:169;;10811:219;10960:2;10949:9;10942:21;10923:4;10980:44;11020:2;11009:9;11005:18;10997:6;10980:44;:::i;22578:253::-;22650:2;22644:9;22692:4;22680:17;;22727:18;22712:34;;22748:22;;;22709:62;22706:88;;;22774:18;;:::i;:::-;22810:2;22803:22;22578:253;:::o;22836:334::-;22907:2;22901:9;22963:2;22953:13;;22968:66;22949:86;22937:99;;23066:18;23051:34;;23087:22;;;23048:62;23045:88;;;23113:18;;:::i;:::-;23149:2;23142:22;22836:334;;-1:-1:-1;22836:334:1:o;23175:183::-;23235:4;23268:18;23260:6;23257:30;23254:56;;;23290:18;;:::i;:::-;-1:-1:-1;23335:1:1;23331:14;23347:4;23327:25;;23175:183::o;23489:128::-;23529:3;23560:1;23556:6;23553:1;23550:13;23547:39;;;23566:18;;:::i;:::-;-1:-1:-1;23602:9:1;;23489:128::o;23622:120::-;23662:1;23688;23678:35;;23693:18;;:::i;:::-;-1:-1:-1;23727:9:1;;23622:120::o;23747:228::-;23787:7;23913:1;23845:66;23841:74;23838:1;23835:81;23830:1;23823:9;23816:17;23812:105;23809:131;;;23920:18;;:::i;:::-;-1:-1:-1;23960:9:1;;23747:228::o;23980:125::-;24020:4;24048:1;24045;24042:8;24039:34;;;24053:18;;:::i;:::-;-1:-1:-1;24090:9:1;;23980:125::o;24110:258::-;24182:1;24192:113;24206:6;24203:1;24200:13;24192:113;;;24282:11;;;24276:18;24263:11;;;24256:39;24228:2;24221:10;24192:113;;;24323:6;24320:1;24317:13;24314:48;;;-1:-1:-1;;24358:1:1;24340:16;;24333:27;24110:258::o;24373:437::-;24452:1;24448:12;;;;24495;;;24516:61;;24570:4;24562:6;24558:17;24548:27;;24516:61;24623:2;24615:6;24612:14;24592:18;24589:38;24586:218;;;24660:77;24657:1;24650:88;24761:4;24758:1;24751:15;24789:4;24786:1;24779:15;24586:218;;24373:437;;;:::o;24815:195::-;24854:3;24885:66;24878:5;24875:77;24872:103;;;24955:18;;:::i;:::-;-1:-1:-1;25002:1:1;24991:13;;24815:195::o;25015:112::-;25047:1;25073;25063:35;;25078:18;;:::i;:::-;-1:-1:-1;25112:9:1;;25015:112::o;25132:184::-;25184:77;25181:1;25174:88;25281:4;25278:1;25271:15;25305:4;25302:1;25295:15;25321:184;25373:77;25370:1;25363:88;25470:4;25467:1;25460:15;25494:4;25491:1;25484:15;25510:184;25562:77;25559:1;25552:88;25659:4;25656:1;25649:15;25683:4;25680:1;25673:15;25699:184;25751:77;25748:1;25741:88;25848:4;25845:1;25838:15;25872:4;25869:1;25862:15;25888:184;25940:77;25937:1;25930:88;26037:4;26034:1;26027:15;26061:4;26058:1;26051:15;26077:118;26163:5;26156:13;26149:21;26142:5;26139:32;26129:60;;26185:1;26182;26175:12;26200:177;26285:66;26278:5;26274:78;26267:5;26264:89;26254:117;;26367:1;26364;26357:12

Swarm Source

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