ETH Price: $2,937.68 (+4.67%)
 

Overview

TokenID

232

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Welcom to the B.Hive, a project led by a dynamic group of young professionals, with the goal of becoming the MENA region’s Web 3.0 hub.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
TheBHive

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-04-06
*/

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

// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

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

// OpenZeppelin Contracts v4.4.1 (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/IERC721Receiver.sol

// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

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

// OpenZeppelin Contracts v4.4.1 (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);
}

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

// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol)

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/Address.sol

// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

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

// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

// OpenZeppelin Contracts v4.4.1 (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: contracts/ERC721A.sol

// Creator: Chiru Labs

pragma solidity ^0.8.4;








error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintedQueryForZeroAddress();
error BurnedQueryForZeroAddress();
error AuxQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerIndexOutOfBounds();
error OwnerQueryForNonexistentToken();
error TokenIndexOutOfBounds();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            isApprovedForAll(prevOwnership.addr, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

    /**
     * @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 {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

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

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

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

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

        emit Transfer(prevOwnership.addr, address(0), tokenId);
        _afterTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

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

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

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

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

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

// File: contracts/extensions/ERC721ABurnable.sol

// Creator: Chiru Labs

pragma solidity ^0.8.7;


/**
 * @title ERC721A Burnable Token
 * @dev ERC721A Token that can be irreversibly burned (destroyed).
 */
abstract contract ERC721ABurnable is Context, ERC721A {

    /**
     * @dev Burns `tokenId`. See {ERC721A-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            isApprovedForAll(prevOwnership.addr, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();

        _burn(tokenId);
    }
}

// File: contracts/extensions/MessageSigning.sol


pragma solidity ^0.8.4;


abstract contract MessageSigning {
    // Signer Address
    address internal signerAddress; 

    constructor(address signerAddress_){
        signerAddress = signerAddress_;
    }

    /************
    * @dev message singing handling 
    ************/

    function isValidSignature(bytes memory message, bytes memory signature) public view returns (bool) {
        bytes32 _messageHash = keccak256(abi.encodePacked(message));
        bytes32 ethSignedMessageHash = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", _messageHash));

        return _recoverSigner(ethSignedMessageHash, signature) == signerAddress;
    }

    /**
    * @dev Set the _signerAddress just in case
    */
    function _setSignerAddress(address newSignerAddress) internal virtual {
        require(newSignerAddress != signerAddress, "New Signer Address cannot be the same as current one");
        signerAddress = newSignerAddress;
    }

    function _recoverSigner(bytes32 _ethSignedMessageHash, bytes memory _signature) private pure returns (address) {
        (bytes32 r, bytes32 s, uint8 v) = _splitSignature(_signature);
        return ecrecover(_ethSignedMessageHash, v, r, s);
    }

    function _splitSignature(bytes memory sig) private pure returns (bytes32 r, bytes32 s, uint8 v) {
        require(sig.length == 65, "invalid signature length");

        assembly {
            r := mload(add(sig, 32))
            s := mload(add(sig, 64))
            v := byte(0, mload(add(sig, 96)))
        }
    }
}

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

// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol

// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

// 
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}
// 
/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}
// 
// OpenZeppelin Contracts v4.4.1 (finance/PaymentSplitter.sol)

/**
 * @title PaymentSplitter
 * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware
 * that the Ether will be split in this way, since it is handled transparently by the contract.
 *
 * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each
 * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim
 * an amount proportional to the percentage of total shares they were assigned.
 *
 * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the
 * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release}
 * function.
 *
 * NOTE: This contract assumes that ERC20 tokens will behave similarly to native tokens (Ether). Rebasing tokens, and
 * tokens that apply fees during transfers, are likely to not be supported as expected. If in doubt, we encourage you
 * to run tests before sending real value to this contract.
 */
contract PaymentSplitter is Context {
    event PayeeAdded(address account, uint256 shares);
    event PaymentReleased(address to, uint256 amount);
    event ERC20PaymentReleased(IERC20 indexed token, address to, uint256 amount);
    event PaymentReceived(address from, uint256 amount);

    uint256 private _totalShares;
    uint256 private _totalReleased;

    mapping(address => uint256) private _shares;
    mapping(address => uint256) private _released;
    address[] private _payees;

    mapping(IERC20 => uint256) private _erc20TotalReleased;
    mapping(IERC20 => mapping(address => uint256)) private _erc20Released;

    /**
     * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at
     * the matching position in the `shares` array.
     *
     * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no
     * duplicates in `payees`.
     */
    constructor(address[] memory payees, uint256[] memory shares_) payable {
        require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch");
        require(payees.length > 0, "PaymentSplitter: no payees");

        for (uint256 i = 0; i < payees.length; i++) {
            _addPayee(payees[i], shares_[i]);
        }
    }

    /**
     * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully
     * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the
     * reliability of the events, and not the actual splitting of Ether.
     *
     * To learn more about this see the Solidity documentation for
     * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback
     * functions].
     */
    receive() external payable virtual {
        emit PaymentReceived(_msgSender(), msg.value);
    }

    /**
     * @dev Getter for the total shares held by payees.
     */
    function totalShares() public view returns (uint256) {
        return _totalShares;
    }

    /**
     * @dev Getter for the total amount of Ether already released.
     */
    function totalReleased() public view returns (uint256) {
        return _totalReleased;
    }

    /**
     * @dev Getter for the total amount of `token` already released. `token` should be the address of an IERC20
     * contract.
     */
    function totalReleased(IERC20 token) public view returns (uint256) {
        return _erc20TotalReleased[token];
    }

    /**
     * @dev Getter for the amount of shares held by an account.
     */
    function shares(address account) public view returns (uint256) {
        return _shares[account];
    }

    /**
     * @dev Getter for the amount of Ether already released to a payee.
     */
    function released(address account) public view returns (uint256) {
        return _released[account];
    }

    /**
     * @dev Getter for the amount of `token` tokens already released to a payee. `token` should be the address of an
     * IERC20 contract.
     */
    function released(IERC20 token, address account) public view returns (uint256) {
        return _erc20Released[token][account];
    }

    /**
     * @dev Getter for the address of the payee number `index`.
     */
    function payee(uint256 index) public view returns (address) {
        return _payees[index];
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the
     * total shares and their previous withdrawals.
     */
    function release(address payable account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 totalReceived = address(this).balance + totalReleased();
        uint256 payment = _pendingPayment(account, totalReceived, released(account));

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _released[account] += payment;
        _totalReleased += payment;

        Address.sendValue(account, payment);
        emit PaymentReleased(account, payment);
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of `token` tokens they are owed, according to their
     * percentage of the total shares and their previous withdrawals. `token` must be the address of an IERC20
     * contract.
     */
    function release(IERC20 token, address account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 totalReceived = token.balanceOf(address(this)) + totalReleased(token);
        uint256 payment = _pendingPayment(account, totalReceived, released(token, account));

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _erc20Released[token][account] += payment;
        _erc20TotalReleased[token] += payment;

        SafeERC20.safeTransfer(token, account, payment);
        emit ERC20PaymentReleased(token, account, payment);
    }

    /**
     * @dev internal logic for computing the pending payment of an `account` given the token historical balances and
     * already released amounts.
     */
    function _pendingPayment(
        address account,
        uint256 totalReceived,
        uint256 alreadyReleased
    ) private view returns (uint256) {
        return (totalReceived * _shares[account]) / _totalShares - alreadyReleased;
    }

    /**
     * @dev Add a new payee to the contract.
     * @param account The address of the payee to add.
     * @param shares_ The number of shares owned by the payee.
     */
    function _addPayee(address account, uint256 shares_) private {
        require(account != address(0), "PaymentSplitter: account is the zero address");
        require(shares_ > 0, "PaymentSplitter: shares are 0");
        require(_shares[account] == 0, "PaymentSplitter: account already has shares");

        _payees.push(account);
        _shares[account] = shares_;
        _totalShares = _totalShares + shares_;
        emit PayeeAdded(account, shares_);
    }
}


// File: contracts/B.Hive721a.sol

//SPDX-License-Identifier: MIT

pragma solidity ^0.8.7;
//t                    ___                                     ___     
//o     _____         /\  \                      ___          /\__\    
//n    /::\  \        \:\  \       ___          /\  \        /:/ _/_   
//y   /:/\:\  \        \:\  \     /\__\         \:\  \      /:/ /\__\  
//3  /:/ /::\__\   ___ /::\  \   /:/__/          \:\  \    /:/ /:/ _/_ 
//6 /:/_/:/\:|__| /\  /:/\:\__\ /::\  \      ___  \:\__\  /:/_/:/ /\__\
//5 \:\/:/ /:/  / \:\/:/  \/__/ \/\:\  \__  /\  \ |:|  |  \:\/:/ /:/  /
//.  \::/_/:/  /   \::/__/       ~~\:\/\__\ \:\  \|:|  |   \::/_/:/  / 
//x   \:\/:/  /     \:\  \          \::/  /  \:\__|:|__|    \:\/:/  /  
//     \::/  /       \:\__\         /:/  /    \::::/__/      \::/  /   
//      \/__/         \/__/         \/__/      ~~~~           \/__/    


/**
 * @title ERC721a Contract for B.Hive Collection 
*/


contract TheBHive is ERC721A, Ownable, ERC721ABurnable, ReentrancyGuard, MessageSigning, PaymentSplitter {

    using Strings for uint256;

    // Provenance Hash of the Bees
    string public constant BEES_PROVENANCE = "AB29DAFA2947EBF9E83C4DE85019EA386636F7EBF8D37C32E93EE97F18544AF3";  
   
    // Max supply 
    uint32 public maxSupply;
    
    // Amount of reserved token
    uint32 public remainingReserves;


    // Max amount of tokens that can be minted at the same time 
    uint32 public immutable maxBatchSize;

    // Price token in ether
    uint256 public price; 
    uint256 public constant startTokenId = 1;
    
    mapping(address => uint32) private _presale2MintTracking; 

    // Max token by wallet
    mapping(string => uint32)  private  _walletsLimit;
    
    // Contract status. If paused, only reserve minting is enabled 
    bool public paused = true; 
    
    // Sale Phase. Presale if true and public sale if false
    bool public presale = true;
    bool public isPresale2 = false;

    //Flag locking contract from URI changes
    bool public isLocked = false;

    // flag showing if the collection is revealed or not
    bool public revealed = false;

    // holds the metadata URI 
    string private _baseTokenURI;

    //payment splitter
	address[] private addressList = [
		0x06d7A7a8541EA1Ab7a24f179EDeBc0a1DFcAcE75,  // expenses wallet 
		0x586F844C396AEc480AE479EE8FE6Afe103e135E4 // Community Wallet 
	];
	uint256[] private shareList = [80, 20];

    /**
     * @dev Initializes tbe contract with: 
     * unrevealedURI_: the initial URI before the reveal, in a complete format eg: "ipfs://QmdsxxxxxxxxxxxxxxxxxxepJF/hidden.json"
     * signerAddress_: Whitelist Signer Address
     */
    constructor ( string memory name_, 
                    string memory symbol_,
                    address signerAddress_, 
                    uint32 maxSupply_,
                    uint32 remainingReserves_,
                    uint32 maxBatchSize_,
                    uint256 price_
                    ) ERC721A(name_, symbol_) MessageSigning(signerAddress_) PaymentSplitter(addressList, shareList) {    

        require(maxSupply_ >= remainingReserves_, "Maximum Supply should be greater than the reserves");
        
        maxSupply = maxSupply_;
        remainingReserves = remainingReserves_;
        maxBatchSize = maxBatchSize_;
        price = price_;


        _walletsLimit["OG"] = 3;
        _walletsLimit["BL"] = 2;
        _walletsLimit["PS2"] = 3;
        _walletsLimit["Pub"] = 20;

        setBaseURI("ipfs://QmV2enMdpu8cR6XtN11bHJaDM7TYoXvQ1Ex44DYM2s7R3X"); // unrevealedURI_
    }

    function _startTokenId() internal pure override returns (uint256) {
        return startTokenId;
    }
    
    /**
    * @dev change the signerAddress just in case
    */
    function setSignerAddress(address newsignerAddress) external onlyOwner{
        _setSignerAddress(newsignerAddress);
    }

    /**
    * @dev Switch the status of the contract
    */
    function switchPauseStatus() external onlyOwner{
        paused = !paused;
    }

    /**
    * @dev End the presale & sets the public Sales price
    */
    function endPresale(uint256 publicSalesPrice) external onlyOwner{
        require(presale, "Presale already ended");
        price = publicSalesPrice;
        presale = false;
        isPresale2 = false;
    }

    /**
    * @dev enables presale phase 2
    */
    function startPresale2() external onlyOwner{
        require(presale, "Presale already ended");
        require(!isPresale2, "Presale phase 3 already active");
        isPresale2 = true;
    }

    /**
    * @dev Change the `price` of the token for `newPrice`
    */
    function setNewPrice(uint newPrice) external onlyOwner{
        require(price != newPrice, "New Price should be different than current price");
        price = newPrice;
    }

    /**
    * @dev Updating the max allowed in each phase
    */

    function updateWalletsLimit (uint32 newWalletsLimit, string memory list) external onlyOwner{
        require(_walletsLimit[list] != newWalletsLimit, "New limit per wallet cannot be equal to the current one");
        _walletsLimit[list] = newWalletsLimit;
    }

    /**
    * @dev changes the base uri to the revealedURI and sets the revealed to true
    * @param revealedURI_: the final URI after reveal in a format eg: "ipfs://QmdsxxxxxxxxxxxxxxxxxxepJF/" 
    */
    function revealCollection(string memory revealedURI_) external onlyOwner {
        require(!revealed, "Collection already revealed");
        revealed = true;
        setBaseURI(revealedURI_);
    }

    /**
    * @dev Decreases the total supply
    */
    function decreaseSupply(uint32 newSupply, uint32 newRemainingReserves) external onlyOwner {
        require(newSupply < maxSupply,"Maximum supply can only be decreased");
        require(newRemainingReserves <= remainingReserves, "Reseves cannot be increased");
        require(newSupply >= newRemainingReserves + totalSupply(), "Maximum supply cannot be lower than the current supply + reserves");

        maxSupply = newSupply;
        remainingReserves  = newRemainingReserves;
    }

    /**
    * @dev ERC721 standard
    * @return baseURI value
    */
    function _baseURI() internal view virtual override returns (string memory) {
        return _baseTokenURI;
    }

    /**
    * @dev Set the base URI
    * 
    * The style MUST BE as follow : "ipfs://QmdsaXXXXXXXXXXXXXXXXXXXX7epJF/"
    */
    function setBaseURI(string memory newBaseTokenURI) public onlyOwner { 
        require (!isLocked, "Metadata is locked!");
        _baseTokenURI = newBaseTokenURI;
    }

    // minting

    /**
    * @dev Admin Mint of reserves 
    */
    function AirDrop (address to, uint32 amountToMint) external onlyOwner{
        require (to != address(0), "address 0 requested");
        require (amountToMint <= remainingReserves, "The requested amount is greater than the remaining reserves");
        require (amountToMint > 0, "Amount should be greater than 0");
        require (amountToMint <= maxBatchSize, "Quantity to mint too high");

        _safeMint(to, amountToMint);    
        remainingReserves -= amountToMint;
    }

    /**
    * @dev Minting for whitelisted addresses
    */
    function whitelistMinting(uint amountToMint, bytes memory WhitelistSignature, string memory presaleList) external payable {
        require (presale, "Presale over!");
        require (isValidSignature(abi.encodePacked(_msgSender(), presaleList), WhitelistSignature), "Wallet not whitelisted");

        if(!isPresale2){
            require (_getAux(msg.sender) + amountToMint <= _walletsLimit[presaleList], "max NFTs per address exceeded");
            _setAux(msg.sender, uint64(_getAux(msg.sender) + amountToMint));
        } else {
            require(_numberMinted(msg.sender) - _getAux(msg.sender) + amountToMint <= _walletsLimit[presaleList], "max NFTs per address exceeded");
            _presale2MintTracking[msg.sender] += uint32(amountToMint);                
        }

        _mintNFT(amountToMint);        
    }

    /**
    * @dev Minting for the public sale
    */
    function publicMint(uint amountToMint) external payable{
        require (!presale, "Presale on");
        require(_numberMinted(msg.sender) - _getAux(msg.sender) - _presale2MintTracking[msg.sender] + amountToMint <= _walletsLimit["Pub"] , "max NFTs per address exceeded");
        
        _mintNFT(amountToMint);        
    }
     
    /**
    * @dev Mint the amount of NFT requested
    */
    function _mintNFT(uint _amountToMint) internal nonReentrant {
        require (!paused, "Contract paused"); 
        require (_amountToMint > 0, "Amount should be greater than 0");
        require (_amountToMint + totalSupply() <= maxSupply - remainingReserves, "Request superior max Supply");
        require (msg.value == price*_amountToMint, "Incorrect Payment Amount");
        require (_amountToMint <= maxBatchSize, "Quantity to mint too high");
        
        _safeMint(msg.sender, _amountToMint);
    }

    /**
    * @dev Return the URI of the NFT
    * @notice return the hidden URI then the Revealed JSON when the Revealed param is true
    */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId),"ERC721Metadata: URI query for nonexistent token");
        
        if(!revealed) {
            return _baseURI();
        }
        
        string memory URI = _baseURI();
        return bytes(URI).length > 0 ? string(abi.encodePacked(URI, tokenId.toString(), ".json")) : "";
    }    

    /**
    * @dev Return the number of minted tokens for a wallet address
    * @param presalePhase 1 for presale phases 1 & 2, 3 for presale Phase 3, any other nbr for public sale
    */
    function getNbrOfMintedToken(address wallet, uint32 presalePhase) external view returns (uint256) {
        if(presalePhase == 1) {
            return _getAux(wallet);
        }
        if(presalePhase == 3) {
            return _presale2MintTracking[wallet];
        }

        return _numberMinted(wallet) - _getAux(wallet) - _presale2MintTracking[wallet];
    }

    function getWalletsLimit(string memory list) external view returns (uint32) {
        return _walletsLimit[list];
    }

    /**
    * @dev Return an array of token Id owned by `_owner`
    */
    
    function walletOfOwner(address _owner) external view returns (uint256[] memory) {
        uint256 tokenCount = balanceOf(_owner);

        if (tokenCount == 0) {
            // Return an empty arraya
            return new uint256[](0);
        } else {
            uint256[] memory result = new uint256[](tokenCount);
            uint256 currentTokenId = _startTokenId();
            uint256 index = 0;
            address lastOwner;
            
            while (index < tokenCount && currentTokenId < _currentIndex) {

                if (!_ownerships[currentTokenId].burned && _ownerships[currentTokenId].addr != address(0)) {
                    lastOwner = _ownerships[currentTokenId].addr;
                }

                if (lastOwner == _owner && !_ownerships[currentTokenId].burned) {
                    result[index] = currentTokenId;
                    unchecked {
                        index++;
                    }
                }
                unchecked {
                    currentTokenId++;
                }
            }       
            return result;
        }
    }

    /**
    * @dev  and for the eternity....
    **/
	function lockMetadata() external onlyOwner {
        require(!isLocked, "Metadata Already Locked");
        require(revealed, "Collection should be revealed before being locked");
		isLocked = true;
	}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"address","name":"signerAddress_","type":"address"},{"internalType":"uint32","name":"maxSupply_","type":"uint32"},{"internalType":"uint32","name":"remainingReserves_","type":"uint32"},{"internalType":"uint32","name":"maxBatchSize_","type":"uint32"},{"internalType":"uint256","name":"price_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"AuxQueryForZeroAddress","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"MintedQueryForZeroAddress","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"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":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","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":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint32","name":"amountToMint","type":"uint32"}],"name":"AirDrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"BEES_PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"newSupply","type":"uint32"},{"internalType":"uint32","name":"newRemainingReserves","type":"uint32"}],"name":"decreaseSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"publicSalesPrice","type":"uint256"}],"name":"endPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"uint32","name":"presalePhase","type":"uint32"}],"name":"getNbrOfMintedToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"list","type":"string"}],"name":"getWalletsLimit","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"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":[],"name":"isLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPresale2","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"message","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"isValidSignature","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxBatchSize","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"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":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountToMint","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"remainingReserves","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"revealedURI_","type":"string"}],"name":"revealCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseTokenURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setNewPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newsignerAddress","type":"address"}],"name":"setSignerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startPresale2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"switchPauseStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"newWalletsLimit","type":"uint32"},{"internalType":"string","name":"list","type":"string"}],"name":"updateWalletsLimit","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":[{"internalType":"uint256","name":"amountToMint","type":"uint256"},{"internalType":"bytes","name":"WhitelistSignature","type":"bytes"},{"internalType":"string","name":"presaleList","type":"string"}],"name":"whitelistMinting","outputs":[],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6016805464ffffffffff191661010117905560e06040527306d7a7a8541ea1ab7a24f179edebc0a1dfcace7560a090815273586f844c396aec480ae479ee8fe6afe103e135e460c05262000058906018906002620007a5565b506040805180820190915260508152601460208201526200007e9060199060026200080f565b503480156200008c57600080fd5b5060405162004a2b38038062004a2b833981016040819052620000af91620009b7565b60188054806020026020016040519081016040528092919081815260200182805480156200010757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311620000e8575b505050505060198054806020026020016040519081016040528092919081815260200182805480156200015a57602002820191906000526020600020905b81548152602001906001019080831162000145575b505050505086898981600290805190602001906200017a92919062000852565b5080516200019090600390602084019062000852565b5050600160005550620001a33362000494565b6001600955600a80546001600160a01b0319166001600160a01b039290921691909117905580518251146200023a5760405162461bcd60e51b815260206004820152603260248201527f5061796d656e7453706c69747465723a2070617965657320616e6420736861726044820152710cae640d8cadccee8d040dad2e6dac2e8c6d60731b60648201526084015b60405180910390fd5b60008251116200028d5760405162461bcd60e51b815260206004820152601a60248201527f5061796d656e7453706c69747465723a206e6f20706179656573000000000000604482015260640162000231565b60005b8251811015620002f957620002e4838281518110620002b357620002b362000b10565b6020026020010151838381518110620002d057620002d062000b10565b6020026020010151620004e660201b60201c565b80620002f08162000adc565b91505062000290565b5050508263ffffffff168463ffffffff161015620003755760405162461bcd60e51b815260206004820152603260248201527f4d6178696d756d20537570706c792073686f756c642062652067726561746572604482015271207468616e2074686520726573657276657360701b606482015260840162000231565b6012805463ffffffff858116640100000000026001600160401b0319909216908716171790556001600160e01b031960e083901b166080526013819055604051600390601590620003ce90614f4760f01b815260020190565b908152604080519182900360209081018320805463ffffffff9590951663ffffffff1995861617905561109360f21b83526015600280850182905283519485900360220185208054871690911790556228299960e91b8452600380850182905283519485900360239081018620805488168317905562283ab160e91b8652908501919091528251938490030183208054601495169490941790935560608201905260358082526200048792620049f690830139620006d4565b5050505050505062000b3c565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216620005535760405162461bcd60e51b815260206004820152602c60248201527f5061796d656e7453706c69747465723a206163636f756e74206973207468652060448201526b7a65726f206164647265737360a01b606482015260840162000231565b60008111620005a55760405162461bcd60e51b815260206004820152601d60248201527f5061796d656e7453706c69747465723a20736861726573206172652030000000604482015260640162000231565b6001600160a01b0382166000908152600d602052604090205415620006215760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960448201526a206861732073686172657360a81b606482015260840162000231565b600f8054600181019091557f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac8020180546001600160a01b0319166001600160a01b0384169081179091556000908152600d60205260409020819055600b546200068b90829062000a84565b600b55604080516001600160a01b0384168152602081018390527f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac910160405180910390a15050565b6008546001600160a01b03163314620007305760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000231565b6016546301000000900460ff16156200078c5760405162461bcd60e51b815260206004820152601360248201527f4d65746164617461206973206c6f636b65642100000000000000000000000000604482015260640162000231565b8051620007a190601790602084019062000852565b5050565b828054828255906000526020600020908101928215620007fd579160200282015b82811115620007fd57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190620007c6565b506200080b929150620008cf565b5090565b828054828255906000526020600020908101928215620007fd579160200282015b82811115620007fd578251829060ff1690559160200191906001019062000830565b828054620008609062000a9f565b90600052602060002090601f016020900481019282620008845760008555620007fd565b82601f106200089f57805160ff1916838001178555620007fd565b82800160010185558215620007fd579182015b82811115620007fd578251825591602001919060010190620008b2565b5b808211156200080b5760008155600101620008d0565b600082601f830112620008f857600080fd5b81516001600160401b038082111562000915576200091562000b26565b604051601f8301601f19908116603f0116810190828211818310171562000940576200094062000b26565b816040528381526020925086838588010111156200095d57600080fd5b600091505b8382101562000981578582018301518183018401529082019062000962565b83821115620009935760008385830101525b9695505050505050565b805163ffffffff81168114620009b257600080fd5b919050565b600080600080600080600060e0888a031215620009d357600080fd5b87516001600160401b0380821115620009eb57600080fd5b620009f98b838c01620008e6565b985060208a015191508082111562000a1057600080fd5b5062000a1f8a828b01620008e6565b60408a015190975090506001600160a01b038116811462000a3f57600080fd5b945062000a4f606089016200099d565b935062000a5f608089016200099d565b925062000a6f60a089016200099d565b915060c0880151905092959891949750929550565b6000821982111562000a9a5762000a9a62000afa565b500190565b600181811c9082168062000ab457607f821691505b6020821081141562000ad657634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141562000af35762000af362000afa565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b60805160e01c613e8d62000b6960003960008181610541015281816114080152612b440152613e8d6000f3fe6080604052600436106103545760003560e01c80636352211e116101c6578063aa8a31fb116100f7578063e33b7de311610095578063ee8cdd4e1161006f578063ee8cdd4e14610a75578063f2fde38b14610a95578063fdea8e0b14610ab5578063fe1d20b714610ad457600080fd5b8063e33b7de314610a02578063e6798baa14610a17578063e985e9c514610a2c57600080fd5b8063ce7c2ac2116100d1578063ce7c2ac214610959578063d5abeb011461098f578063d6bf8eeb146109ac578063d79779b2146109cc57600080fd5b8063aa8a31fb14610904578063b88d4fde14610919578063c87b56dd1461093957600080fd5b80639852595c11610164578063a035b1fe1161013e578063a035b1fe1461088d578063a22cb465146108a3578063a4e2d634146108c3578063a7fff4c4146108e457600080fd5b80639852595c14610822578063989bdbb6146108585780639edf96cb1461086d57600080fd5b80638b83209b116101a05780638b83209b146107af5780638da5cb5b146107cf5780638decc907146107ed57806395d89b411461080d57600080fd5b80636352211e1461075a57806370a082311461077a578063715018a61461079a57600080fd5b80632db11544116102a0578063438b63001161023e578063518302271161021857806351830227146106db57806355f804b3146106fc5780635c975abb1461071c57806361d6a4ce1461073657600080fd5b8063438b63001461066e57806348b750441461069b57806350179bae146106bb57600080fd5b80633a98ef391161027a5780633a98ef39146105d3578063406072a9146105e857806342842e0e1461062e57806342966c681461064e57600080fd5b80632db115441461058b5780632df2726f1461059e578063350759fe146105be57600080fd5b806318160ddd1161030d57806320c13b0b116102e757806320c13b0b146104ef57806323b872dd1461050f5780632913daa01461052f5780632b7c81e21461057857600080fd5b806318160ddd1461049357806319165587146104ba5780631d8c13bf146104da57600080fd5b806301ffc9a7146103a2578063046dc166146103d757806306fdde03146103f9578063081812fc1461041b578063095ea7b3146104535780630e3d6d221461047357600080fd5b3661039d577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b3480156103ae57600080fd5b506103c26103bd366004613809565b610af4565b60405190151581526020015b60405180910390f35b3480156103e357600080fd5b506103f76103f236600461365b565b610b46565b005b34801561040557600080fd5b5061040e610b85565b6040516103ce9190613b17565b34801561042757600080fd5b5061043b6104363660046138da565b610c17565b6040516001600160a01b0390911681526020016103ce565b34801561045f57600080fd5b506103f761046e36600461378b565b610c5b565b34801561047f57600080fd5b506016546103c29062010000900460ff1681565b34801561049f57600080fd5b5060015460005403600019015b6040519081526020016103ce565b3480156104c657600080fd5b506103f76104d536600461365b565b610ce9565b3480156104e657600080fd5b506103f7610e17565b3480156104fb57600080fd5b506103c261050a366004613843565b610efc565b34801561051b57600080fd5b506103f761052a3660046136b1565b610fab565b34801561053b57600080fd5b506105637f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff90911681526020016103ce565b6103f761058636600461390c565b610fb6565b6103f76105993660046138da565b6111ca565b3480156105aa57600080fd5b506103f76105b93660046137b7565b6112b1565b3480156105ca57600080fd5b5061040e6114d1565b3480156105df57600080fd5b50600b546104ac565b3480156105f457600080fd5b506104ac610603366004613678565b6001600160a01b03918216600090815260116020908152604080832093909416825291909152205490565b34801561063a57600080fd5b506103f76106493660046136b1565b6114ed565b34801561065a57600080fd5b506103f76106693660046138da565b611508565b34801561067a57600080fd5b5061068e61068936600461365b565b611585565b6040516103ce9190613ad3565b3480156106a757600080fd5b506103f76106b6366004613678565b6116e8565b3480156106c757600080fd5b506103f76106d63660046138a6565b6118d0565b3480156106e757600080fd5b506016546103c290600160201b900460ff1681565b34801561070857600080fd5b506103f76107173660046138a6565b61196d565b34801561072857600080fd5b506016546103c29060ff1681565b34801561074257600080fd5b5060125461056390600160201b900463ffffffff1681565b34801561076657600080fd5b5061043b6107753660046138da565b6119fe565b34801561078657600080fd5b506104ac61079536600461365b565b611a10565b3480156107a657600080fd5b506103f7611a5e565b3480156107bb57600080fd5b5061043b6107ca3660046138da565b611a94565b3480156107db57600080fd5b506008546001600160a01b031661043b565b3480156107f957600080fd5b506105636108083660046138a6565b611ac4565b34801561081957600080fd5b5061040e611af2565b34801561082e57600080fd5b506104ac61083d36600461365b565b6001600160a01b03166000908152600e602052604090205490565b34801561086457600080fd5b506103f7611b01565b34801561087957600080fd5b506103f76108883660046138da565b611c0d565b34801561089957600080fd5b506104ac60135481565b3480156108af57600080fd5b506103f76108be36600461375d565b611c97565b3480156108cf57600080fd5b506016546103c2906301000000900460ff1681565b3480156108f057600080fd5b506103f76108ff366004613978565b611d2d565b34801561091057600080fd5b506103f7611e36565b34801561092557600080fd5b506103f76109343660046136f2565b611e74565b34801561094557600080fd5b5061040e6109543660046138da565b611ec5565b34801561096557600080fd5b506104ac61097436600461365b565b6001600160a01b03166000908152600d602052604090205490565b34801561099b57600080fd5b506012546105639063ffffffff1681565b3480156109b857600080fd5b506103f76109c73660046139bb565b611fa9565b3480156109d857600080fd5b506104ac6109e736600461365b565b6001600160a01b031660009081526010602052604090205490565b348015610a0e57600080fd5b50600c546104ac565b348015610a2357600080fd5b506104ac600181565b348015610a3857600080fd5b506103c2610a47366004613678565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b348015610a8157600080fd5b506103f7610a903660046138da565b61216c565b348015610aa157600080fd5b506103f7610ab036600461365b565b612206565b348015610ac157600080fd5b506016546103c290610100900460ff1681565b348015610ae057600080fd5b506104ac610aef3660046137b7565b61229e565b60006001600160e01b031982166380ac58cd60e01b1480610b2557506001600160e01b03198216635b5e139f60e01b145b80610b4057506301ffc9a760e01b6001600160e01b03198316145b92915050565b6008546001600160a01b03163314610b795760405162461bcd60e51b8152600401610b7090613bf2565b60405180910390fd5b610b828161234a565b50565b606060028054610b9490613d02565b80601f0160208091040260200160405190810160405280929190818152602001828054610bc090613d02565b8015610c0d5780601f10610be257610100808354040283529160200191610c0d565b820191906000526020600020905b815481529060010190602001808311610bf057829003601f168201915b5050505050905090565b6000610c22826123e7565b610c3f576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610c66826119fe565b9050806001600160a01b0316836001600160a01b03161415610c9b5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610cbb5750610cb98133610a47565b155b15610cd9576040516367d9dca160e11b815260040160405180910390fd5b610ce4838383612420565b505050565b6001600160a01b0381166000908152600d6020526040902054610d1e5760405162461bcd60e51b8152600401610b7090613b2a565b6000610d29600c5490565b610d339047613c27565b90506000610d608383610d5b866001600160a01b03166000908152600e602052604090205490565b61247c565b905080610d7f5760405162461bcd60e51b8152600401610b7090613ba7565b6001600160a01b0383166000908152600e602052604081208054839290610da7908490613c27565b9250508190555080600c6000828254610dc09190613c27565b90915550610dd0905083826124c2565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a1505050565b6008546001600160a01b03163314610e415760405162461bcd60e51b8152600401610b7090613bf2565b601654610100900460ff16610e905760405162461bcd60e51b8152602060048201526015602482015274141c995cd85b1948185b1c9958591e48195b991959605a1b6044820152606401610b70565b60165462010000900460ff1615610ee95760405162461bcd60e51b815260206004820152601e60248201527f50726573616c65207068617365203320616c72656164792061637469766500006044820152606401610b70565b6016805462ff0000191662010000179055565b60008083604051602001610f109190613a3b565b604051602081830303815290604052805190602001209050600081604051602001610f6791907f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b60408051601f198184030181529190528051602090910120600a549091506001600160a01b0316610f9882866125db565b6001600160a01b03161495945050505050565b610ce483838361265a565b601654610100900460ff16610ffd5760405162461bcd60e51b815260206004820152600d60248201526c50726573616c65206f7665722160981b6044820152606401610b70565b6110283382604051602001611013929190613a03565b60405160208183030381529060405283610efc565b61106d5760405162461bcd60e51b815260206004820152601660248201527515d85b1b195d081b9bdd081dda1a5d195b1a5cdd195960521b6044820152606401610b70565b60165462010000900460ff166111095760158160405161108d9190613a3b565b9081526040519081900360200190205463ffffffff16836110ad3361285c565b6001600160401b03166110c09190613c27565b11156110de5760405162461bcd60e51b8152600401610b7090613b70565b61110433846110ec3361285c565b6001600160401b03166110ff9190613c27565b6128b1565b6111c1565b6015816040516111199190613a3b565b9081526040519081900360200190205463ffffffff16836111393361285c565b6001600160401b031661114b33612917565b6111559190613c9a565b61115f9190613c27565b111561117d5760405162461bcd60e51b8152600401610b7090613b70565b33600090815260146020526040812080548592906111a290849063ffffffff16613c3f565b92506101000a81548163ffffffff021916908363ffffffff1602179055505b610ce48361296c565b601654610100900460ff161561120f5760405162461bcd60e51b815260206004820152600a602482015269283932b9b0b6329037b760b11b6044820152606401610b70565b60405162283ab160e91b81526015906003019081526040805160209281900383019020543360008181526014909452919092205463ffffffff92831692849291169061125a9061285c565b6001600160401b031661126c33612917565b6112769190613c9a565b6112809190613c9a565b61128a9190613c27565b11156112a85760405162461bcd60e51b8152600401610b7090613b70565b610b828161296c565b6008546001600160a01b031633146112db5760405162461bcd60e51b8152600401610b7090613bf2565b6001600160a01b0382166113275760405162461bcd60e51b81526020600482015260136024820152721859191c995cdcc80c081c995c5d595cdd1959606a1b6044820152606401610b70565b60125463ffffffff600160201b909104811690821611156113b05760405162461bcd60e51b815260206004820152603b60248201527f5468652072657175657374656420616d6f756e7420697320677265617465722060448201527f7468616e207468652072656d61696e696e6720726573657276657300000000006064820152608401610b70565b60008163ffffffff16116114065760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e742073686f756c642062652067726561746572207468616e2030006044820152606401610b70565b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff168163ffffffff16111561147e5760405162461bcd60e51b81526020600482015260196024820152780a2eac2dce8d2e8f240e8de40dad2dce840e8dede40d0d2ced603b1b6044820152606401610b70565b61148e828263ffffffff16612bc6565b80601260048282829054906101000a900463ffffffff166114af9190613cb1565b92506101000a81548163ffffffff021916908363ffffffff1602179055505050565b604051806060016040528060408152602001613e186040913981565b610ce483838360405180602001604052806000815250611e74565b600061151382612be0565b80519091506000906001600160a01b0316336001600160a01b03161480611541575081516115419033610a47565b8061155c57503361155184610c17565b6001600160a01b0316145b90508061157c57604051632ce44b5f60e11b815260040160405180910390fd5b610ce483612d07565b6060600061159283611a10565b9050806115af575050604080516000815260208101909152919050565b6000816001600160401b038111156115c9576115c9613da8565b6040519080825280602002602001820160405280156115f2578160200160208202803683370190505b50905060016000805b848210801561160b575060005483105b156116d757600083815260046020526040902054600160e01b900460ff1615801561164c57506000838152600460205260409020546001600160a01b031615155b1561166b57506000828152600460205260409020546001600160a01b03165b866001600160a01b0316816001600160a01b03161480156116a25750600083815260046020526040902054600160e01b900460ff16155b156116cc57828483815181106116ba576116ba613d92565b60209081029190910101526001909101905b6001909201916115fb565b509195945050505050565b50919050565b6001600160a01b0381166000908152600d602052604090205461171d5760405162461bcd60e51b8152600401610b7090613b2a565b6001600160a01b0382166000908152601060205260408120546040516370a0823160e01b81523060048201526001600160a01b038516906370a082319060240160206040518083038186803b15801561177557600080fd5b505afa158015611789573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ad91906138f3565b6117b79190613c27565b905060006117f08383610d5b87876001600160a01b03918216600090815260116020908152604080832093909416825291909152205490565b90508061180f5760405162461bcd60e51b8152600401610b7090613ba7565b6001600160a01b03808516600090815260116020908152604080832093871683529290529081208054839290611846908490613c27565b90915550506001600160a01b03841660009081526010602052604081208054839290611873908490613c27565b909155506118849050848483612e71565b604080516001600160a01b038581168252602082018490528616917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a250505050565b6008546001600160a01b031633146118fa5760405162461bcd60e51b8152600401610b7090613bf2565b601654600160201b900460ff16156119545760405162461bcd60e51b815260206004820152601b60248201527f436f6c6c656374696f6e20616c72656164792072657665616c656400000000006044820152606401610b70565b6016805464ff000000001916600160201b179055610b82815b6008546001600160a01b031633146119975760405162461bcd60e51b8152600401610b7090613bf2565b6016546301000000900460ff16156119e75760405162461bcd60e51b81526020600482015260136024820152724d65746164617461206973206c6f636b65642160681b6044820152606401610b70565b80516119fa90601790602084019061351d565b5050565b6000611a0982612be0565b5192915050565b60006001600160a01b038216611a39576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b03163314611a885760405162461bcd60e51b8152600401610b7090613bf2565b611a926000612ec3565b565b6000600f8281548110611aa957611aa9613d92565b6000918252602090912001546001600160a01b031692915050565b6000601582604051611ad69190613a3b565b9081526040519081900360200190205463ffffffff1692915050565b606060038054610b9490613d02565b6008546001600160a01b03163314611b2b5760405162461bcd60e51b8152600401610b7090613bf2565b6016546301000000900460ff1615611b855760405162461bcd60e51b815260206004820152601760248201527f4d6574616461746120416c7265616479204c6f636b65640000000000000000006044820152606401610b70565b601654600160201b900460ff16611bf85760405162461bcd60e51b815260206004820152603160248201527f436f6c6c656374696f6e2073686f756c642062652072657665616c6564206265604482015270199bdc994818995a5b99c81b1bd8dad959607a1b6064820152608401610b70565b6016805463ff00000019166301000000179055565b6008546001600160a01b03163314611c375760405162461bcd60e51b8152600401610b7090613bf2565b601654610100900460ff16611c865760405162461bcd60e51b8152602060048201526015602482015274141c995cd85b1948185b1c9958591e48195b991959605a1b6044820152606401610b70565b6013556016805462ffff0019169055565b6001600160a01b038216331415611cc15760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6008546001600160a01b03163314611d575760405162461bcd60e51b8152600401610b7090613bf2565b8163ffffffff16601582604051611d6e9190613a3b565b9081526040519081900360200190205463ffffffff161415611df85760405162461bcd60e51b815260206004820152603760248201527f4e6577206c696d6974207065722077616c6c65742063616e6e6f74206265206560448201527f7175616c20746f207468652063757272656e74206f6e650000000000000000006064820152608401610b70565b81601582604051611e099190613a3b565b908152604051908190036020019020805463ffffffff9290921663ffffffff199092169190911790555050565b6008546001600160a01b03163314611e605760405162461bcd60e51b8152600401610b7090613bf2565b6016805460ff19811660ff90911615179055565b611e7f84848461265a565b6001600160a01b0383163b15158015611ea15750611e9f84848484612f15565b155b15611ebf576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6060611ed0826123e7565b611f345760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610b70565b601654600160201b900460ff16611f4d57610b4061300c565b6000611f5761300c565b90506000815111611f775760405180602001604052806000815250611fa2565b80611f818461301b565b604051602001611f92929190613a57565b6040516020818303038152906040525b9392505050565b6008546001600160a01b03163314611fd35760405162461bcd60e51b8152600401610b7090613bf2565b60125463ffffffff9081169083161061203a5760405162461bcd60e51b8152602060048201526024808201527f4d6178696d756d20737570706c792063616e206f6e6c79206265206465637265604482015263185cd95960e21b6064820152608401610b70565b60125463ffffffff600160201b9091048116908216111561209d5760405162461bcd60e51b815260206004820152601b60248201527f526573657665732063616e6e6f7420626520696e6372656173656400000000006044820152606401610b70565b60015460005403600019016120b89063ffffffff8316613c27565b8263ffffffff16101561213d5760405162461bcd60e51b815260206004820152604160248201527f4d6178696d756d20737570706c792063616e6e6f74206265206c6f776572207460448201527f68616e207468652063757272656e7420737570706c79202b20726573657276656064820152607360f81b608482015260a401610b70565b6012805463ffffffff928316600160201b0267ffffffffffffffff199091169290931691909117919091179055565b6008546001600160a01b031633146121965760405162461bcd60e51b8152600401610b7090613bf2565b8060135414156122015760405162461bcd60e51b815260206004820152603060248201527f4e65772050726963652073686f756c6420626520646966666572656e7420746860448201526f616e2063757272656e7420707269636560801b6064820152608401610b70565b601355565b6008546001600160a01b031633146122305760405162461bcd60e51b8152600401610b7090613bf2565b6001600160a01b0381166122955760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b70565b610b8281612ec3565b60008163ffffffff16600114156122c8576122b88361285c565b6001600160401b03169050610b40565b8163ffffffff16600314156122fc57506001600160a01b03821660009081526014602052604090205463ffffffff16610b40565b6001600160a01b03831660009081526014602052604090205463ffffffff166123248461285c565b6001600160401b031661233685612917565b6123409190613c9a565b611fa29190613c9a565b600a546001600160a01b03828116911614156123c55760405162461bcd60e51b815260206004820152603460248201527f4e6577205369676e657220416464726573732063616e6e6f74206265207468656044820152732073616d652061732063757272656e74206f6e6560601b6064820152608401610b70565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6000816001111580156123fb575060005482105b8015610b40575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600b546001600160a01b0384166000908152600d6020526040812054909183916124a69086613c7b565b6124b09190613c67565b6124ba9190613c9a565b949350505050565b804710156125125760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610b70565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461255f576040519150601f19603f3d011682016040523d82523d6000602084013e612564565b606091505b5050905080610ce45760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610b70565b6000806000806125ea85613118565b6040805160008152602081018083528b905260ff8316918101919091526060810184905260808101839052929550909350915060019060a0016020604051602081039080840390855afa158015612645573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b600061266582612be0565b80519091506000906001600160a01b0316336001600160a01b03161480612693575081516126939033610a47565b806126ae5750336126a384610c17565b6001600160a01b0316145b9050806126ce57604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b031682600001516001600160a01b0316146127035760405162a1148160e81b815260040160405180910390fd5b6001600160a01b03841661272a57604051633a954ecd60e21b815260040160405180910390fd5b61273a6000848460000151612420565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b4290921691909102179092559086018083529120549091166128245760005481101561282457825160008281526004602090815260409091208054918601516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b0316600080516020613df883398151915260405160405180910390a45b5050505050565b60006001600160a01b0382166128855760405163561b93dd60e11b815260040160405180910390fd5b506001600160a01b0316600090815260056020526040902054600160c01b90046001600160401b031690565b6001600160a01b0382166128d85760405163561b93dd60e11b815260040160405180910390fd5b6001600160a01b03909116600090815260056020526040902080546001600160401b03909216600160c01b026001600160c01b03909216919091179055565b60006001600160a01b038216612940576040516335ebb31960e01b815260040160405180910390fd5b506001600160a01b0316600090815260056020526040902054600160401b90046001600160401b031690565b600260095414156129bf5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b70565b600260095560165460ff1615612a095760405162461bcd60e51b815260206004820152600f60248201526e10dbdb9d1c9858dd081c185d5cd959608a1b6044820152606401610b70565b60008111612a595760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e742073686f756c642062652067726561746572207468616e2030006044820152606401610b70565b601254612a759063ffffffff600160201b820481169116613cb1565b63ffffffff16612a8e6001546000546000199190030190565b612a989083613c27565b1115612ae65760405162461bcd60e51b815260206004820152601b60248201527f52657175657374207375706572696f72206d617820537570706c7900000000006044820152606401610b70565b80601354612af49190613c7b565b3414612b425760405162461bcd60e51b815260206004820152601860248201527f496e636f7272656374205061796d656e7420416d6f756e7400000000000000006044820152606401610b70565b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff16811115612bb45760405162461bcd60e51b81526020600482015260196024820152780a2eac2dce8d2e8f240e8de40dad2dce840e8dede40d0d2ced603b1b6044820152606401610b70565b612bbe3382612bc6565b506001600955565b6119fa82826040518060200160405280600081525061318c565b60408051606081018252600080825260208201819052918101919091528180600111158015612c10575060005481105b15612cee57600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16151591810182905290612cec5780516001600160a01b031615612c83579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215612ce7579392505050565b612c83565b505b604051636f96cda160e11b815260040160405180910390fd5b6000612d1282612be0565b9050612d246000838360000151612420565b80516001600160a01b039081166000908152600560209081526040808320805467ffffffffffffffff1981166001600160401b0391821660001901821617909155855185168452818420805467ffffffffffffffff60801b198116600160801b9182900484166001908101851690920217909155865188865260049094528285208054600160e01b9588166001600160e01b031990911617600160a01b42909416939093029290921760ff60e01b1916939093179055908501808352912054909116612e3b57600054811015612e3b57815160008281526004602090815260409091208054918501516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b50805160405183916000916001600160a01b0390911690600080516020613df8833981519152908390a450506001805481019055565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610ce4908490613199565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290612f4a903390899088908890600401613a96565b602060405180830381600087803b158015612f6457600080fd5b505af1925050508015612f94575060408051601f3d908101601f19168201909252612f9191810190613826565b60015b612fef573d808015612fc2576040519150601f19603f3d011682016040523d82523d6000602084013e612fc7565b606091505b508051612fe7576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b606060178054610b9490613d02565b60608161303f5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115613069578061305381613d37565b91506130629050600a83613c67565b9150613043565b6000816001600160401b0381111561308357613083613da8565b6040519080825280601f01601f1916602001820160405280156130ad576020820181803683370190505b5090505b84156124ba576130c2600183613c9a565b91506130cf600a86613d52565b6130da906030613c27565b60f81b8183815181106130ef576130ef613d92565b60200101906001600160f81b031916908160001a905350613111600a86613c67565b94506130b1565b6000806000835160411461316e5760405162461bcd60e51b815260206004820152601860248201527f696e76616c6964207369676e6174757265206c656e67746800000000000000006044820152606401610b70565b50505060208101516040820151606090920151909260009190911a90565b610ce4838383600161326b565b60006131ee826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166134129092919063ffffffff16565b805190915015610ce4578080602001905181019061320c91906137ec565b610ce45760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610b70565b6000546001600160a01b03851661329457604051622e076360e81b815260040160405180910390fd5b836132b25760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168c018116918217600160401b67ffffffffffffffff1990941690921783900481168c01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b42909216919091021790558080850183801561335e57506001600160a01b0387163b15155b156133d5575b60405182906001600160a01b03891690600090600080516020613df8833981519152908290a461339d6000888480600101955088612f15565b6133ba576040516368d2bf6b60e11b815260040160405180910390fd5b808214156133645782600054146133d057600080fd5b613409565b5b6040516001830192906001600160a01b03891690600090600080516020613df8833981519152908290a4808214156133d6575b50600055612855565b60606124ba848460008585843b61346b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b70565b600080866001600160a01b031685876040516134879190613a3b565b60006040518083038185875af1925050503d80600081146134c4576040519150601f19603f3d011682016040523d82523d6000602084013e6134c9565b606091505b50915091506134d98282866134e4565b979650505050505050565b606083156134f3575081611fa2565b8251156135035782518084602001fd5b8160405162461bcd60e51b8152600401610b709190613b17565b82805461352990613d02565b90600052602060002090601f01602090048101928261354b5760008555613591565b82601f1061356457805160ff1916838001178555613591565b82800160010185558215613591579182015b82811115613591578251825591602001919060010190613576565b5061359d9291506135a1565b5090565b5b8082111561359d57600081556001016135a2565b600082601f8301126135c757600080fd5b81356001600160401b03808211156135e1576135e1613da8565b604051601f8301601f19908116603f0116810190828211818310171561360957613609613da8565b8160405283815286602085880101111561362257600080fd5b836020870160208301376000602085830101528094505050505092915050565b803563ffffffff8116811461365657600080fd5b919050565b60006020828403121561366d57600080fd5b8135611fa281613dbe565b6000806040838503121561368b57600080fd5b823561369681613dbe565b915060208301356136a681613dbe565b809150509250929050565b6000806000606084860312156136c657600080fd5b83356136d181613dbe565b925060208401356136e181613dbe565b929592945050506040919091013590565b6000806000806080858703121561370857600080fd5b843561371381613dbe565b9350602085013561372381613dbe565b92506040850135915060608501356001600160401b0381111561374557600080fd5b613751878288016135b6565b91505092959194509250565b6000806040838503121561377057600080fd5b823561377b81613dbe565b915060208301356136a681613dd3565b6000806040838503121561379e57600080fd5b82356137a981613dbe565b946020939093013593505050565b600080604083850312156137ca57600080fd5b82356137d581613dbe565b91506137e360208401613642565b90509250929050565b6000602082840312156137fe57600080fd5b8151611fa281613dd3565b60006020828403121561381b57600080fd5b8135611fa281613de1565b60006020828403121561383857600080fd5b8151611fa281613de1565b6000806040838503121561385657600080fd5b82356001600160401b038082111561386d57600080fd5b613879868387016135b6565b9350602085013591508082111561388f57600080fd5b5061389c858286016135b6565b9150509250929050565b6000602082840312156138b857600080fd5b81356001600160401b038111156138ce57600080fd5b6124ba848285016135b6565b6000602082840312156138ec57600080fd5b5035919050565b60006020828403121561390557600080fd5b5051919050565b60008060006060848603121561392157600080fd5b8335925060208401356001600160401b038082111561393f57600080fd5b61394b878388016135b6565b9350604086013591508082111561396157600080fd5b5061396e868287016135b6565b9150509250925092565b6000806040838503121561398b57600080fd5b61399483613642565b915060208301356001600160401b038111156139af57600080fd5b61389c858286016135b6565b600080604083850312156139ce57600080fd5b6137d583613642565b600081518084526139ef816020860160208601613cd6565b601f01601f19169290920160200192915050565b6bffffffffffffffffffffffff198360601b16815260008251613a2d816014850160208701613cd6565b919091016014019392505050565b60008251613a4d818460208701613cd6565b9190910192915050565b60008351613a69818460208801613cd6565b835190830190613a7d818360208801613cd6565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613ac9908301846139d7565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015613b0b57835183529284019291840191600101613aef565b50909695505050505050565b602081526000611fa260208301846139d7565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b6020808252601d908201527f6d6178204e465473207065722061646472657373206578636565646564000000604082015260600190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008219821115613c3a57613c3a613d66565b500190565b600063ffffffff808316818516808303821115613c5e57613c5e613d66565b01949350505050565b600082613c7657613c76613d7c565b500490565b6000816000190483118215151615613c9557613c95613d66565b500290565b600082821015613cac57613cac613d66565b500390565b600063ffffffff83811690831681811015613cce57613cce613d66565b039392505050565b60005b83811015613cf1578181015183820152602001613cd9565b83811115611ebf5750506000910152565b600181811c90821680613d1657607f821691505b602082108114156116e257634e487b7160e01b600052602260045260246000fd5b6000600019821415613d4b57613d4b613d66565b5060010190565b600082613d6157613d61613d7c565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610b8257600080fd5b8015158114610b8257600080fd5b6001600160e01b031981168114610b8257600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef41423239444146413239343745424639453833433444453835303139454133383636333646374542463844333743333245393345453937463138353434414633a26469706673582212200bd8836aee8367821d73a1feb5a6b3ad995b409f1625459fc391aa27f26f75c564736f6c63430008070033697066733a2f2f516d5632656e4d6470753863523658744e313162484a61444d3754596f587651314578343444594d32733752335800000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000089c414614a488b929d081367b1b9a31bb1e043690000000000000000000000000000000000000000000000000000000000001388000000000000000000000000000000000000000000000000000000000000012c0000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000016345785d8a00000000000000000000000000000000000000000000000000000000000000000008546865424869766500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035442480000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106103545760003560e01c80636352211e116101c6578063aa8a31fb116100f7578063e33b7de311610095578063ee8cdd4e1161006f578063ee8cdd4e14610a75578063f2fde38b14610a95578063fdea8e0b14610ab5578063fe1d20b714610ad457600080fd5b8063e33b7de314610a02578063e6798baa14610a17578063e985e9c514610a2c57600080fd5b8063ce7c2ac2116100d1578063ce7c2ac214610959578063d5abeb011461098f578063d6bf8eeb146109ac578063d79779b2146109cc57600080fd5b8063aa8a31fb14610904578063b88d4fde14610919578063c87b56dd1461093957600080fd5b80639852595c11610164578063a035b1fe1161013e578063a035b1fe1461088d578063a22cb465146108a3578063a4e2d634146108c3578063a7fff4c4146108e457600080fd5b80639852595c14610822578063989bdbb6146108585780639edf96cb1461086d57600080fd5b80638b83209b116101a05780638b83209b146107af5780638da5cb5b146107cf5780638decc907146107ed57806395d89b411461080d57600080fd5b80636352211e1461075a57806370a082311461077a578063715018a61461079a57600080fd5b80632db11544116102a0578063438b63001161023e578063518302271161021857806351830227146106db57806355f804b3146106fc5780635c975abb1461071c57806361d6a4ce1461073657600080fd5b8063438b63001461066e57806348b750441461069b57806350179bae146106bb57600080fd5b80633a98ef391161027a5780633a98ef39146105d3578063406072a9146105e857806342842e0e1461062e57806342966c681461064e57600080fd5b80632db115441461058b5780632df2726f1461059e578063350759fe146105be57600080fd5b806318160ddd1161030d57806320c13b0b116102e757806320c13b0b146104ef57806323b872dd1461050f5780632913daa01461052f5780632b7c81e21461057857600080fd5b806318160ddd1461049357806319165587146104ba5780631d8c13bf146104da57600080fd5b806301ffc9a7146103a2578063046dc166146103d757806306fdde03146103f9578063081812fc1461041b578063095ea7b3146104535780630e3d6d221461047357600080fd5b3661039d577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b3480156103ae57600080fd5b506103c26103bd366004613809565b610af4565b60405190151581526020015b60405180910390f35b3480156103e357600080fd5b506103f76103f236600461365b565b610b46565b005b34801561040557600080fd5b5061040e610b85565b6040516103ce9190613b17565b34801561042757600080fd5b5061043b6104363660046138da565b610c17565b6040516001600160a01b0390911681526020016103ce565b34801561045f57600080fd5b506103f761046e36600461378b565b610c5b565b34801561047f57600080fd5b506016546103c29062010000900460ff1681565b34801561049f57600080fd5b5060015460005403600019015b6040519081526020016103ce565b3480156104c657600080fd5b506103f76104d536600461365b565b610ce9565b3480156104e657600080fd5b506103f7610e17565b3480156104fb57600080fd5b506103c261050a366004613843565b610efc565b34801561051b57600080fd5b506103f761052a3660046136b1565b610fab565b34801561053b57600080fd5b506105637f000000000000000000000000000000000000000000000000000000000000000581565b60405163ffffffff90911681526020016103ce565b6103f761058636600461390c565b610fb6565b6103f76105993660046138da565b6111ca565b3480156105aa57600080fd5b506103f76105b93660046137b7565b6112b1565b3480156105ca57600080fd5b5061040e6114d1565b3480156105df57600080fd5b50600b546104ac565b3480156105f457600080fd5b506104ac610603366004613678565b6001600160a01b03918216600090815260116020908152604080832093909416825291909152205490565b34801561063a57600080fd5b506103f76106493660046136b1565b6114ed565b34801561065a57600080fd5b506103f76106693660046138da565b611508565b34801561067a57600080fd5b5061068e61068936600461365b565b611585565b6040516103ce9190613ad3565b3480156106a757600080fd5b506103f76106b6366004613678565b6116e8565b3480156106c757600080fd5b506103f76106d63660046138a6565b6118d0565b3480156106e757600080fd5b506016546103c290600160201b900460ff1681565b34801561070857600080fd5b506103f76107173660046138a6565b61196d565b34801561072857600080fd5b506016546103c29060ff1681565b34801561074257600080fd5b5060125461056390600160201b900463ffffffff1681565b34801561076657600080fd5b5061043b6107753660046138da565b6119fe565b34801561078657600080fd5b506104ac61079536600461365b565b611a10565b3480156107a657600080fd5b506103f7611a5e565b3480156107bb57600080fd5b5061043b6107ca3660046138da565b611a94565b3480156107db57600080fd5b506008546001600160a01b031661043b565b3480156107f957600080fd5b506105636108083660046138a6565b611ac4565b34801561081957600080fd5b5061040e611af2565b34801561082e57600080fd5b506104ac61083d36600461365b565b6001600160a01b03166000908152600e602052604090205490565b34801561086457600080fd5b506103f7611b01565b34801561087957600080fd5b506103f76108883660046138da565b611c0d565b34801561089957600080fd5b506104ac60135481565b3480156108af57600080fd5b506103f76108be36600461375d565b611c97565b3480156108cf57600080fd5b506016546103c2906301000000900460ff1681565b3480156108f057600080fd5b506103f76108ff366004613978565b611d2d565b34801561091057600080fd5b506103f7611e36565b34801561092557600080fd5b506103f76109343660046136f2565b611e74565b34801561094557600080fd5b5061040e6109543660046138da565b611ec5565b34801561096557600080fd5b506104ac61097436600461365b565b6001600160a01b03166000908152600d602052604090205490565b34801561099b57600080fd5b506012546105639063ffffffff1681565b3480156109b857600080fd5b506103f76109c73660046139bb565b611fa9565b3480156109d857600080fd5b506104ac6109e736600461365b565b6001600160a01b031660009081526010602052604090205490565b348015610a0e57600080fd5b50600c546104ac565b348015610a2357600080fd5b506104ac600181565b348015610a3857600080fd5b506103c2610a47366004613678565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b348015610a8157600080fd5b506103f7610a903660046138da565b61216c565b348015610aa157600080fd5b506103f7610ab036600461365b565b612206565b348015610ac157600080fd5b506016546103c290610100900460ff1681565b348015610ae057600080fd5b506104ac610aef3660046137b7565b61229e565b60006001600160e01b031982166380ac58cd60e01b1480610b2557506001600160e01b03198216635b5e139f60e01b145b80610b4057506301ffc9a760e01b6001600160e01b03198316145b92915050565b6008546001600160a01b03163314610b795760405162461bcd60e51b8152600401610b7090613bf2565b60405180910390fd5b610b828161234a565b50565b606060028054610b9490613d02565b80601f0160208091040260200160405190810160405280929190818152602001828054610bc090613d02565b8015610c0d5780601f10610be257610100808354040283529160200191610c0d565b820191906000526020600020905b815481529060010190602001808311610bf057829003601f168201915b5050505050905090565b6000610c22826123e7565b610c3f576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610c66826119fe565b9050806001600160a01b0316836001600160a01b03161415610c9b5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610cbb5750610cb98133610a47565b155b15610cd9576040516367d9dca160e11b815260040160405180910390fd5b610ce4838383612420565b505050565b6001600160a01b0381166000908152600d6020526040902054610d1e5760405162461bcd60e51b8152600401610b7090613b2a565b6000610d29600c5490565b610d339047613c27565b90506000610d608383610d5b866001600160a01b03166000908152600e602052604090205490565b61247c565b905080610d7f5760405162461bcd60e51b8152600401610b7090613ba7565b6001600160a01b0383166000908152600e602052604081208054839290610da7908490613c27565b9250508190555080600c6000828254610dc09190613c27565b90915550610dd0905083826124c2565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a1505050565b6008546001600160a01b03163314610e415760405162461bcd60e51b8152600401610b7090613bf2565b601654610100900460ff16610e905760405162461bcd60e51b8152602060048201526015602482015274141c995cd85b1948185b1c9958591e48195b991959605a1b6044820152606401610b70565b60165462010000900460ff1615610ee95760405162461bcd60e51b815260206004820152601e60248201527f50726573616c65207068617365203320616c72656164792061637469766500006044820152606401610b70565b6016805462ff0000191662010000179055565b60008083604051602001610f109190613a3b565b604051602081830303815290604052805190602001209050600081604051602001610f6791907f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b60408051601f198184030181529190528051602090910120600a549091506001600160a01b0316610f9882866125db565b6001600160a01b03161495945050505050565b610ce483838361265a565b601654610100900460ff16610ffd5760405162461bcd60e51b815260206004820152600d60248201526c50726573616c65206f7665722160981b6044820152606401610b70565b6110283382604051602001611013929190613a03565b60405160208183030381529060405283610efc565b61106d5760405162461bcd60e51b815260206004820152601660248201527515d85b1b195d081b9bdd081dda1a5d195b1a5cdd195960521b6044820152606401610b70565b60165462010000900460ff166111095760158160405161108d9190613a3b565b9081526040519081900360200190205463ffffffff16836110ad3361285c565b6001600160401b03166110c09190613c27565b11156110de5760405162461bcd60e51b8152600401610b7090613b70565b61110433846110ec3361285c565b6001600160401b03166110ff9190613c27565b6128b1565b6111c1565b6015816040516111199190613a3b565b9081526040519081900360200190205463ffffffff16836111393361285c565b6001600160401b031661114b33612917565b6111559190613c9a565b61115f9190613c27565b111561117d5760405162461bcd60e51b8152600401610b7090613b70565b33600090815260146020526040812080548592906111a290849063ffffffff16613c3f565b92506101000a81548163ffffffff021916908363ffffffff1602179055505b610ce48361296c565b601654610100900460ff161561120f5760405162461bcd60e51b815260206004820152600a602482015269283932b9b0b6329037b760b11b6044820152606401610b70565b60405162283ab160e91b81526015906003019081526040805160209281900383019020543360008181526014909452919092205463ffffffff92831692849291169061125a9061285c565b6001600160401b031661126c33612917565b6112769190613c9a565b6112809190613c9a565b61128a9190613c27565b11156112a85760405162461bcd60e51b8152600401610b7090613b70565b610b828161296c565b6008546001600160a01b031633146112db5760405162461bcd60e51b8152600401610b7090613bf2565b6001600160a01b0382166113275760405162461bcd60e51b81526020600482015260136024820152721859191c995cdcc80c081c995c5d595cdd1959606a1b6044820152606401610b70565b60125463ffffffff600160201b909104811690821611156113b05760405162461bcd60e51b815260206004820152603b60248201527f5468652072657175657374656420616d6f756e7420697320677265617465722060448201527f7468616e207468652072656d61696e696e6720726573657276657300000000006064820152608401610b70565b60008163ffffffff16116114065760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e742073686f756c642062652067726561746572207468616e2030006044820152606401610b70565b7f000000000000000000000000000000000000000000000000000000000000000563ffffffff168163ffffffff16111561147e5760405162461bcd60e51b81526020600482015260196024820152780a2eac2dce8d2e8f240e8de40dad2dce840e8dede40d0d2ced603b1b6044820152606401610b70565b61148e828263ffffffff16612bc6565b80601260048282829054906101000a900463ffffffff166114af9190613cb1565b92506101000a81548163ffffffff021916908363ffffffff1602179055505050565b604051806060016040528060408152602001613e186040913981565b610ce483838360405180602001604052806000815250611e74565b600061151382612be0565b80519091506000906001600160a01b0316336001600160a01b03161480611541575081516115419033610a47565b8061155c57503361155184610c17565b6001600160a01b0316145b90508061157c57604051632ce44b5f60e11b815260040160405180910390fd5b610ce483612d07565b6060600061159283611a10565b9050806115af575050604080516000815260208101909152919050565b6000816001600160401b038111156115c9576115c9613da8565b6040519080825280602002602001820160405280156115f2578160200160208202803683370190505b50905060016000805b848210801561160b575060005483105b156116d757600083815260046020526040902054600160e01b900460ff1615801561164c57506000838152600460205260409020546001600160a01b031615155b1561166b57506000828152600460205260409020546001600160a01b03165b866001600160a01b0316816001600160a01b03161480156116a25750600083815260046020526040902054600160e01b900460ff16155b156116cc57828483815181106116ba576116ba613d92565b60209081029190910101526001909101905b6001909201916115fb565b509195945050505050565b50919050565b6001600160a01b0381166000908152600d602052604090205461171d5760405162461bcd60e51b8152600401610b7090613b2a565b6001600160a01b0382166000908152601060205260408120546040516370a0823160e01b81523060048201526001600160a01b038516906370a082319060240160206040518083038186803b15801561177557600080fd5b505afa158015611789573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ad91906138f3565b6117b79190613c27565b905060006117f08383610d5b87876001600160a01b03918216600090815260116020908152604080832093909416825291909152205490565b90508061180f5760405162461bcd60e51b8152600401610b7090613ba7565b6001600160a01b03808516600090815260116020908152604080832093871683529290529081208054839290611846908490613c27565b90915550506001600160a01b03841660009081526010602052604081208054839290611873908490613c27565b909155506118849050848483612e71565b604080516001600160a01b038581168252602082018490528616917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a250505050565b6008546001600160a01b031633146118fa5760405162461bcd60e51b8152600401610b7090613bf2565b601654600160201b900460ff16156119545760405162461bcd60e51b815260206004820152601b60248201527f436f6c6c656374696f6e20616c72656164792072657665616c656400000000006044820152606401610b70565b6016805464ff000000001916600160201b179055610b82815b6008546001600160a01b031633146119975760405162461bcd60e51b8152600401610b7090613bf2565b6016546301000000900460ff16156119e75760405162461bcd60e51b81526020600482015260136024820152724d65746164617461206973206c6f636b65642160681b6044820152606401610b70565b80516119fa90601790602084019061351d565b5050565b6000611a0982612be0565b5192915050565b60006001600160a01b038216611a39576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b03163314611a885760405162461bcd60e51b8152600401610b7090613bf2565b611a926000612ec3565b565b6000600f8281548110611aa957611aa9613d92565b6000918252602090912001546001600160a01b031692915050565b6000601582604051611ad69190613a3b565b9081526040519081900360200190205463ffffffff1692915050565b606060038054610b9490613d02565b6008546001600160a01b03163314611b2b5760405162461bcd60e51b8152600401610b7090613bf2565b6016546301000000900460ff1615611b855760405162461bcd60e51b815260206004820152601760248201527f4d6574616461746120416c7265616479204c6f636b65640000000000000000006044820152606401610b70565b601654600160201b900460ff16611bf85760405162461bcd60e51b815260206004820152603160248201527f436f6c6c656374696f6e2073686f756c642062652072657665616c6564206265604482015270199bdc994818995a5b99c81b1bd8dad959607a1b6064820152608401610b70565b6016805463ff00000019166301000000179055565b6008546001600160a01b03163314611c375760405162461bcd60e51b8152600401610b7090613bf2565b601654610100900460ff16611c865760405162461bcd60e51b8152602060048201526015602482015274141c995cd85b1948185b1c9958591e48195b991959605a1b6044820152606401610b70565b6013556016805462ffff0019169055565b6001600160a01b038216331415611cc15760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6008546001600160a01b03163314611d575760405162461bcd60e51b8152600401610b7090613bf2565b8163ffffffff16601582604051611d6e9190613a3b565b9081526040519081900360200190205463ffffffff161415611df85760405162461bcd60e51b815260206004820152603760248201527f4e6577206c696d6974207065722077616c6c65742063616e6e6f74206265206560448201527f7175616c20746f207468652063757272656e74206f6e650000000000000000006064820152608401610b70565b81601582604051611e099190613a3b565b908152604051908190036020019020805463ffffffff9290921663ffffffff199092169190911790555050565b6008546001600160a01b03163314611e605760405162461bcd60e51b8152600401610b7090613bf2565b6016805460ff19811660ff90911615179055565b611e7f84848461265a565b6001600160a01b0383163b15158015611ea15750611e9f84848484612f15565b155b15611ebf576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6060611ed0826123e7565b611f345760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610b70565b601654600160201b900460ff16611f4d57610b4061300c565b6000611f5761300c565b90506000815111611f775760405180602001604052806000815250611fa2565b80611f818461301b565b604051602001611f92929190613a57565b6040516020818303038152906040525b9392505050565b6008546001600160a01b03163314611fd35760405162461bcd60e51b8152600401610b7090613bf2565b60125463ffffffff9081169083161061203a5760405162461bcd60e51b8152602060048201526024808201527f4d6178696d756d20737570706c792063616e206f6e6c79206265206465637265604482015263185cd95960e21b6064820152608401610b70565b60125463ffffffff600160201b9091048116908216111561209d5760405162461bcd60e51b815260206004820152601b60248201527f526573657665732063616e6e6f7420626520696e6372656173656400000000006044820152606401610b70565b60015460005403600019016120b89063ffffffff8316613c27565b8263ffffffff16101561213d5760405162461bcd60e51b815260206004820152604160248201527f4d6178696d756d20737570706c792063616e6e6f74206265206c6f776572207460448201527f68616e207468652063757272656e7420737570706c79202b20726573657276656064820152607360f81b608482015260a401610b70565b6012805463ffffffff928316600160201b0267ffffffffffffffff199091169290931691909117919091179055565b6008546001600160a01b031633146121965760405162461bcd60e51b8152600401610b7090613bf2565b8060135414156122015760405162461bcd60e51b815260206004820152603060248201527f4e65772050726963652073686f756c6420626520646966666572656e7420746860448201526f616e2063757272656e7420707269636560801b6064820152608401610b70565b601355565b6008546001600160a01b031633146122305760405162461bcd60e51b8152600401610b7090613bf2565b6001600160a01b0381166122955760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b70565b610b8281612ec3565b60008163ffffffff16600114156122c8576122b88361285c565b6001600160401b03169050610b40565b8163ffffffff16600314156122fc57506001600160a01b03821660009081526014602052604090205463ffffffff16610b40565b6001600160a01b03831660009081526014602052604090205463ffffffff166123248461285c565b6001600160401b031661233685612917565b6123409190613c9a565b611fa29190613c9a565b600a546001600160a01b03828116911614156123c55760405162461bcd60e51b815260206004820152603460248201527f4e6577205369676e657220416464726573732063616e6e6f74206265207468656044820152732073616d652061732063757272656e74206f6e6560601b6064820152608401610b70565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6000816001111580156123fb575060005482105b8015610b40575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600b546001600160a01b0384166000908152600d6020526040812054909183916124a69086613c7b565b6124b09190613c67565b6124ba9190613c9a565b949350505050565b804710156125125760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610b70565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461255f576040519150601f19603f3d011682016040523d82523d6000602084013e612564565b606091505b5050905080610ce45760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610b70565b6000806000806125ea85613118565b6040805160008152602081018083528b905260ff8316918101919091526060810184905260808101839052929550909350915060019060a0016020604051602081039080840390855afa158015612645573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b600061266582612be0565b80519091506000906001600160a01b0316336001600160a01b03161480612693575081516126939033610a47565b806126ae5750336126a384610c17565b6001600160a01b0316145b9050806126ce57604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b031682600001516001600160a01b0316146127035760405162a1148160e81b815260040160405180910390fd5b6001600160a01b03841661272a57604051633a954ecd60e21b815260040160405180910390fd5b61273a6000848460000151612420565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b4290921691909102179092559086018083529120549091166128245760005481101561282457825160008281526004602090815260409091208054918601516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b0316600080516020613df883398151915260405160405180910390a45b5050505050565b60006001600160a01b0382166128855760405163561b93dd60e11b815260040160405180910390fd5b506001600160a01b0316600090815260056020526040902054600160c01b90046001600160401b031690565b6001600160a01b0382166128d85760405163561b93dd60e11b815260040160405180910390fd5b6001600160a01b03909116600090815260056020526040902080546001600160401b03909216600160c01b026001600160c01b03909216919091179055565b60006001600160a01b038216612940576040516335ebb31960e01b815260040160405180910390fd5b506001600160a01b0316600090815260056020526040902054600160401b90046001600160401b031690565b600260095414156129bf5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b70565b600260095560165460ff1615612a095760405162461bcd60e51b815260206004820152600f60248201526e10dbdb9d1c9858dd081c185d5cd959608a1b6044820152606401610b70565b60008111612a595760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e742073686f756c642062652067726561746572207468616e2030006044820152606401610b70565b601254612a759063ffffffff600160201b820481169116613cb1565b63ffffffff16612a8e6001546000546000199190030190565b612a989083613c27565b1115612ae65760405162461bcd60e51b815260206004820152601b60248201527f52657175657374207375706572696f72206d617820537570706c7900000000006044820152606401610b70565b80601354612af49190613c7b565b3414612b425760405162461bcd60e51b815260206004820152601860248201527f496e636f7272656374205061796d656e7420416d6f756e7400000000000000006044820152606401610b70565b7f000000000000000000000000000000000000000000000000000000000000000563ffffffff16811115612bb45760405162461bcd60e51b81526020600482015260196024820152780a2eac2dce8d2e8f240e8de40dad2dce840e8dede40d0d2ced603b1b6044820152606401610b70565b612bbe3382612bc6565b506001600955565b6119fa82826040518060200160405280600081525061318c565b60408051606081018252600080825260208201819052918101919091528180600111158015612c10575060005481105b15612cee57600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16151591810182905290612cec5780516001600160a01b031615612c83579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215612ce7579392505050565b612c83565b505b604051636f96cda160e11b815260040160405180910390fd5b6000612d1282612be0565b9050612d246000838360000151612420565b80516001600160a01b039081166000908152600560209081526040808320805467ffffffffffffffff1981166001600160401b0391821660001901821617909155855185168452818420805467ffffffffffffffff60801b198116600160801b9182900484166001908101851690920217909155865188865260049094528285208054600160e01b9588166001600160e01b031990911617600160a01b42909416939093029290921760ff60e01b1916939093179055908501808352912054909116612e3b57600054811015612e3b57815160008281526004602090815260409091208054918501516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b50805160405183916000916001600160a01b0390911690600080516020613df8833981519152908390a450506001805481019055565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610ce4908490613199565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290612f4a903390899088908890600401613a96565b602060405180830381600087803b158015612f6457600080fd5b505af1925050508015612f94575060408051601f3d908101601f19168201909252612f9191810190613826565b60015b612fef573d808015612fc2576040519150601f19603f3d011682016040523d82523d6000602084013e612fc7565b606091505b508051612fe7576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b606060178054610b9490613d02565b60608161303f5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115613069578061305381613d37565b91506130629050600a83613c67565b9150613043565b6000816001600160401b0381111561308357613083613da8565b6040519080825280601f01601f1916602001820160405280156130ad576020820181803683370190505b5090505b84156124ba576130c2600183613c9a565b91506130cf600a86613d52565b6130da906030613c27565b60f81b8183815181106130ef576130ef613d92565b60200101906001600160f81b031916908160001a905350613111600a86613c67565b94506130b1565b6000806000835160411461316e5760405162461bcd60e51b815260206004820152601860248201527f696e76616c6964207369676e6174757265206c656e67746800000000000000006044820152606401610b70565b50505060208101516040820151606090920151909260009190911a90565b610ce4838383600161326b565b60006131ee826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166134129092919063ffffffff16565b805190915015610ce4578080602001905181019061320c91906137ec565b610ce45760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610b70565b6000546001600160a01b03851661329457604051622e076360e81b815260040160405180910390fd5b836132b25760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168c018116918217600160401b67ffffffffffffffff1990941690921783900481168c01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b42909216919091021790558080850183801561335e57506001600160a01b0387163b15155b156133d5575b60405182906001600160a01b03891690600090600080516020613df8833981519152908290a461339d6000888480600101955088612f15565b6133ba576040516368d2bf6b60e11b815260040160405180910390fd5b808214156133645782600054146133d057600080fd5b613409565b5b6040516001830192906001600160a01b03891690600090600080516020613df8833981519152908290a4808214156133d6575b50600055612855565b60606124ba848460008585843b61346b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b70565b600080866001600160a01b031685876040516134879190613a3b565b60006040518083038185875af1925050503d80600081146134c4576040519150601f19603f3d011682016040523d82523d6000602084013e6134c9565b606091505b50915091506134d98282866134e4565b979650505050505050565b606083156134f3575081611fa2565b8251156135035782518084602001fd5b8160405162461bcd60e51b8152600401610b709190613b17565b82805461352990613d02565b90600052602060002090601f01602090048101928261354b5760008555613591565b82601f1061356457805160ff1916838001178555613591565b82800160010185558215613591579182015b82811115613591578251825591602001919060010190613576565b5061359d9291506135a1565b5090565b5b8082111561359d57600081556001016135a2565b600082601f8301126135c757600080fd5b81356001600160401b03808211156135e1576135e1613da8565b604051601f8301601f19908116603f0116810190828211818310171561360957613609613da8565b8160405283815286602085880101111561362257600080fd5b836020870160208301376000602085830101528094505050505092915050565b803563ffffffff8116811461365657600080fd5b919050565b60006020828403121561366d57600080fd5b8135611fa281613dbe565b6000806040838503121561368b57600080fd5b823561369681613dbe565b915060208301356136a681613dbe565b809150509250929050565b6000806000606084860312156136c657600080fd5b83356136d181613dbe565b925060208401356136e181613dbe565b929592945050506040919091013590565b6000806000806080858703121561370857600080fd5b843561371381613dbe565b9350602085013561372381613dbe565b92506040850135915060608501356001600160401b0381111561374557600080fd5b613751878288016135b6565b91505092959194509250565b6000806040838503121561377057600080fd5b823561377b81613dbe565b915060208301356136a681613dd3565b6000806040838503121561379e57600080fd5b82356137a981613dbe565b946020939093013593505050565b600080604083850312156137ca57600080fd5b82356137d581613dbe565b91506137e360208401613642565b90509250929050565b6000602082840312156137fe57600080fd5b8151611fa281613dd3565b60006020828403121561381b57600080fd5b8135611fa281613de1565b60006020828403121561383857600080fd5b8151611fa281613de1565b6000806040838503121561385657600080fd5b82356001600160401b038082111561386d57600080fd5b613879868387016135b6565b9350602085013591508082111561388f57600080fd5b5061389c858286016135b6565b9150509250929050565b6000602082840312156138b857600080fd5b81356001600160401b038111156138ce57600080fd5b6124ba848285016135b6565b6000602082840312156138ec57600080fd5b5035919050565b60006020828403121561390557600080fd5b5051919050565b60008060006060848603121561392157600080fd5b8335925060208401356001600160401b038082111561393f57600080fd5b61394b878388016135b6565b9350604086013591508082111561396157600080fd5b5061396e868287016135b6565b9150509250925092565b6000806040838503121561398b57600080fd5b61399483613642565b915060208301356001600160401b038111156139af57600080fd5b61389c858286016135b6565b600080604083850312156139ce57600080fd5b6137d583613642565b600081518084526139ef816020860160208601613cd6565b601f01601f19169290920160200192915050565b6bffffffffffffffffffffffff198360601b16815260008251613a2d816014850160208701613cd6565b919091016014019392505050565b60008251613a4d818460208701613cd6565b9190910192915050565b60008351613a69818460208801613cd6565b835190830190613a7d818360208801613cd6565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613ac9908301846139d7565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015613b0b57835183529284019291840191600101613aef565b50909695505050505050565b602081526000611fa260208301846139d7565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b6020808252601d908201527f6d6178204e465473207065722061646472657373206578636565646564000000604082015260600190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008219821115613c3a57613c3a613d66565b500190565b600063ffffffff808316818516808303821115613c5e57613c5e613d66565b01949350505050565b600082613c7657613c76613d7c565b500490565b6000816000190483118215151615613c9557613c95613d66565b500290565b600082821015613cac57613cac613d66565b500390565b600063ffffffff83811690831681811015613cce57613cce613d66565b039392505050565b60005b83811015613cf1578181015183820152602001613cd9565b83811115611ebf5750506000910152565b600181811c90821680613d1657607f821691505b602082108114156116e257634e487b7160e01b600052602260045260246000fd5b6000600019821415613d4b57613d4b613d66565b5060010190565b600082613d6157613d61613d7c565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610b8257600080fd5b8015158114610b8257600080fd5b6001600160e01b031981168114610b8257600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef41423239444146413239343745424639453833433444453835303139454133383636333646374542463844333743333245393345453937463138353434414633a26469706673582212200bd8836aee8367821d73a1feb5a6b3ad995b409f1625459fc391aa27f26f75c564736f6c63430008070033

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

00000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000089c414614a488b929d081367b1b9a31bb1e043690000000000000000000000000000000000000000000000000000000000001388000000000000000000000000000000000000000000000000000000000000012c0000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000016345785d8a00000000000000000000000000000000000000000000000000000000000000000008546865424869766500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035442480000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name_ (string): TheBHive
Arg [1] : symbol_ (string): TBH
Arg [2] : signerAddress_ (address): 0x89c414614a488B929D081367B1B9a31bB1E04369
Arg [3] : maxSupply_ (uint32): 5000
Arg [4] : remainingReserves_ (uint32): 300
Arg [5] : maxBatchSize_ (uint32): 5
Arg [6] : price_ (uint256): 100000000000000000

-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [2] : 00000000000000000000000089c414614a488b929d081367b1b9a31bb1e04369
Arg [3] : 0000000000000000000000000000000000000000000000000000000000001388
Arg [4] : 000000000000000000000000000000000000000000000000000000000000012c
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [6] : 000000000000000000000000000000000000000000000000016345785d8a0000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [8] : 5468654248697665000000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [10] : 5442480000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

65739:11072:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60411:40;17586:10;60411:40;;;-1:-1:-1;;;;;11044:32:1;;;11026:51;;60441:9:0;11108:2:1;11093:18;;11086:34;10999:18;60411:40:0;;;;;;;65739:11072;;;;;25345:305;;;;;;;;;;-1:-1:-1;25345:305:0;;;;;:::i;:::-;;:::i;:::-;;;12705:14:1;;12698:22;12680:41;;12668:2;12653:18;25345:305:0;;;;;;;;68647:124;;;;;;;;;;-1:-1:-1;68647:124:0;;;;;:::i;:::-;;:::i;:::-;;28730:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;30233:204::-;;;;;;;;;;-1:-1:-1;30233:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;10800:32:1;;;10782:51;;10770:2;10755:18;30233:204:0;10636:203:1;29796:371:0;;;;;;;;;;-1:-1:-1;29796:371:0;;;;;:::i;:::-;;:::i;66754:30::-;;;;;;;;;;-1:-1:-1;66754:30:0;;;;;;;;;;;24594:303;;;;;;;;;;-1:-1:-1;66382:1:0;24848:12;24638:7;24832:13;:28;-1:-1:-1;;24832:46:0;24594:303;;;26795:25:1;;;26783:2;26768:18;24594:303:0;26649:177:1;62197:566:0;;;;;;;;;;-1:-1:-1;62197:566:0;;;;;:::i;:::-;;:::i;69282:196::-;;;;;;;;;;;;;:::i;44052:380::-;;;;;;;;;;-1:-1:-1;44052:380:0;;;;;:::i;:::-;;:::i;31090:170::-;;;;;;;;;;-1:-1:-1;31090:170:0;;;;;:::i;:::-;;:::i;66241:36::-;;;;;;;;;;;;;;;;;;27005:10:1;26993:23;;;26975:42;;26963:2;26948:18;66241:36:0;26831:192:1;72208:840:0;;;;;;:::i;:::-;;:::i;73113:333::-;;;;;;:::i;:::-;;:::i;71645:492::-;;;;;;;;;;-1:-1:-1;71645:492:0;;;;;:::i;:::-;;:::i;65923:107::-;;;;;;;;;;;;;:::i;60542:91::-;;;;;;;;;;-1:-1:-1;60613:12:0;;60542:91;;61671:135;;;;;;;;;;-1:-1:-1;61671:135:0;;;;;:::i;:::-;-1:-1:-1;;;;;61768:21:0;;;61741:7;61768:21;;;:14;:21;;;;;;;;:30;;;;;;;;;;;;;61671:135;31331:185;;;;;;;;;;-1:-1:-1;31331:185:0;;;;;:::i;:::-;;:::i;43266:423::-;;;;;;;;;;-1:-1:-1;43266:423:0;;;;;:::i;:::-;;:::i;75408:1134::-;;;;;;;;;;-1:-1:-1;75408:1134:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;63031:641::-;;;;;;;;;;-1:-1:-1;63031:641:0;;;;;:::i;:::-;;:::i;70298:202::-;;;;;;;;;;-1:-1:-1;70298:202:0;;;;;:::i;:::-;;:::i;66934:28::-;;;;;;;;;;-1:-1:-1;66934:28:0;;;;-1:-1:-1;;;66934:28:0;;;;;;71394:172;;;;;;;;;;-1:-1:-1;71394:172:0;;;;;:::i;:::-;;:::i;66621:25::-;;;;;;;;;;-1:-1:-1;66621:25:0;;;;;;;;66133:31;;;;;;;;;;-1:-1:-1;66133:31:0;;;;-1:-1:-1;;;66133:31:0;;;;;;28539:124;;;;;;;;;;-1:-1:-1;28539:124:0;;;;;:::i;:::-;;:::i;25714:206::-;;;;;;;;;;-1:-1:-1;25714:206:0;;;;;:::i;:::-;;:::i;47041:103::-;;;;;;;;;;;;;:::i;61897:100::-;;;;;;;;;;-1:-1:-1;61897:100:0;;;;;:::i;:::-;;:::i;46390:87::-;;;;;;;;;;-1:-1:-1;46463:6:0;;-1:-1:-1;;;;;46463:6:0;46390:87;;75198:121;;;;;;;;;;-1:-1:-1;75198:121:0;;;;;:::i;:::-;;:::i;28899:104::-;;;;;;;;;;;;;:::i;61393:109::-;;;;;;;;;;-1:-1:-1;61393:109:0;;;;;:::i;:::-;-1:-1:-1;;;;;61476:18:0;61449:7;61476:18;;;:9;:18;;;;;;;61393:109;76603:205;;;;;;;;;;;;;:::i;69007:214::-;;;;;;;;;;-1:-1:-1;69007:214:0;;;;;:::i;:::-;;:::i;66315:20::-;;;;;;;;;;;;;;;;30509:279;;;;;;;;;;-1:-1:-1;30509:279:0;;;;;:::i;:::-;;:::i;66839:28::-;;;;;;;;;;-1:-1:-1;66839:28:0;;;;;;;;;;;69818:264;;;;;;;;;;-1:-1:-1;69818:264:0;;;;;:::i;:::-;;:::i;68842:82::-;;;;;;;;;;;;;:::i;31587:369::-;;;;;;;;;;-1:-1:-1;31587:369:0;;;;;:::i;:::-;;:::i;74196:416::-;;;;;;;;;;-1:-1:-1;74196:416:0;;;;;:::i;:::-;;:::i;61189:105::-;;;;;;;;;;-1:-1:-1;61189:105:0;;;;;:::i;:::-;-1:-1:-1;;;;;61270:16:0;61243:7;61270:16;;;:7;:16;;;;;;;61189:105;66064:23;;;;;;;;;;-1:-1:-1;66064:23:0;;;;;;;;70564:494;;;;;;;;;;-1:-1:-1;70564:494:0;;;;;:::i;:::-;;:::i;60979:119::-;;;;;;;;;;-1:-1:-1;60979:119:0;;;;;:::i;:::-;-1:-1:-1;;;;;61064:26:0;61037:7;61064:26;;;:19;:26;;;;;;;60979:119;60727:95;;;;;;;;;;-1:-1:-1;60800:14:0;;60727:95;;66343:40;;;;;;;;;;;;66382:1;66343:40;;30859:164;;;;;;;;;;-1:-1:-1;30859:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;30980:25:0;;;30956:4;30980:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;30859:164;69562:178;;;;;;;;;;-1:-1:-1;69562:178:0;;;;;:::i;:::-;;:::i;47299:201::-;;;;;;;;;;-1:-1:-1;47299:201:0;;;;;:::i;:::-;;:::i;66721:26::-;;;;;;;;;;-1:-1:-1;66721:26:0;;;;;;;;;;;74817:373;;;;;;;;;;-1:-1:-1;74817:373:0;;;;;:::i;:::-;;:::i;25345:305::-;25447:4;-1:-1:-1;;;;;;25484:40:0;;-1:-1:-1;;;25484:40:0;;:105;;-1:-1:-1;;;;;;;25541:48:0;;-1:-1:-1;;;25541:48:0;25484:105;:158;;;-1:-1:-1;;;;;;;;;;20812:40:0;;;25606:36;25464:178;25345:305;-1:-1:-1;;25345:305:0:o;68647:124::-;46463:6;;-1:-1:-1;;;;;46463:6:0;17586:10;46610:23;46602:68;;;;-1:-1:-1;;;46602:68:0;;;;;;;:::i;:::-;;;;;;;;;68728:35:::1;68746:16;68728:17;:35::i;:::-;68647:124:::0;:::o;28730:100::-;28784:13;28817:5;28810:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28730:100;:::o;30233:204::-;30301:7;30326:16;30334:7;30326;:16::i;:::-;30321:64;;30351:34;;-1:-1:-1;;;30351:34:0;;;;;;;;;;;30321:64;-1:-1:-1;30405:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;30405:24:0;;30233:204::o;29796:371::-;29869:13;29885:24;29901:7;29885:15;:24::i;:::-;29869:40;;29930:5;-1:-1:-1;;;;;29924:11:0;:2;-1:-1:-1;;;;;29924:11:0;;29920:48;;;29944:24;;-1:-1:-1;;;29944:24:0;;;;;;;;;;;29920:48;17586:10;-1:-1:-1;;;;;29985:21:0;;;;;;:63;;-1:-1:-1;30011:37:0;30028:5;17586:10;30859:164;:::i;30011:37::-;30010:38;29985:63;29981:138;;;30072:35;;-1:-1:-1;;;30072:35:0;;;;;;;;;;;29981:138;30131:28;30140:2;30144:7;30153:5;30131:8;:28::i;:::-;29858:309;29796:371;;:::o;62197:566::-;-1:-1:-1;;;;;62273:16:0;;62292:1;62273:16;;;:7;:16;;;;;;62265:71;;;;-1:-1:-1;;;62265:71:0;;;;;;;:::i;:::-;62349:21;62397:15;60800:14;;;60727:95;62397:15;62373:39;;:21;:39;:::i;:::-;62349:63;;62423:15;62441:58;62457:7;62466:13;62481:17;62490:7;-1:-1:-1;;;;;61476:18:0;61449:7;61476:18;;;:9;:18;;;;;;;61393:109;62481:17;62441:15;:58::i;:::-;62423:76;-1:-1:-1;62520:12:0;62512:68;;;;-1:-1:-1;;;62512:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;62593:18:0;;;;;;:9;:18;;;;;:29;;62615:7;;62593:18;:29;;62615:7;;62593:29;:::i;:::-;;;;;;;;62651:7;62633:14;;:25;;;;;;;:::i;:::-;;;;-1:-1:-1;62671:35:0;;-1:-1:-1;62689:7:0;62698;62671:17;:35::i;:::-;62722:33;;;-1:-1:-1;;;;;11044:32:1;;11026:51;;11108:2;11093:18;;11086:34;;;62722:33:0;;10999:18:1;62722:33:0;;;;;;;62254:509;;62197:566;:::o;69282:196::-;46463:6;;-1:-1:-1;;;;;46463:6:0;17586:10;46610:23;46602:68;;;;-1:-1:-1;;;46602:68:0;;;;;;;:::i;:::-;69344:7:::1;::::0;::::1;::::0;::::1;;;69336:41;;;::::0;-1:-1:-1;;;69336:41:0;;18941:2:1;69336:41:0::1;::::0;::::1;18923:21:1::0;18980:2;18960:18;;;18953:30;-1:-1:-1;;;18999:18:1;;;18992:51;19060:18;;69336:41:0::1;18739:345:1::0;69336:41:0::1;69397:10;::::0;;;::::1;;;69396:11;69388:54;;;::::0;-1:-1:-1;;;69388:54:0;;20786:2:1;69388:54:0::1;::::0;::::1;20768:21:1::0;20825:2;20805:18;;;20798:30;20864:32;20844:18;;;20837:60;20914:18;;69388:54:0::1;20584:354:1::0;69388:54:0::1;69453:10;:17:::0;;-1:-1:-1;;69453:17:0::1;::::0;::::1;::::0;;69282:196::o;44052:380::-;44145:4;44162:20;44212:7;44195:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;44185:36;;;;;;44162:59;;44232:28;44326:12;44273:66;;;;;;;10025::1;10013:79;;10117:2;10108:12;;10101:28;;;;10154:2;10145:12;;9783:380;44273:66:0;;;;-1:-1:-1;;44273:66:0;;;;;;;;;44263:77;;44273:66;44263:77;;;;44411:13;;44263:77;;-1:-1:-1;;;;;;44411:13:0;44360:47;44263:77;44397:9;44360:14;:47::i;:::-;-1:-1:-1;;;;;44360:64:0;;;44052:380;-1:-1:-1;;;;;44052:380:0:o;31090:170::-;31224:28;31234:4;31240:2;31244:7;31224:9;:28::i;72208:840::-;72350:7;;;;;;;72341:34;;;;-1:-1:-1;;;72341:34:0;;16521:2:1;72341:34:0;;;16503:21:1;16560:2;16540:18;;;16533:30;-1:-1:-1;;;16579:18:1;;;16572:43;16632:18;;72341:34:0;16319:337:1;72341:34:0;72395:81;17586:10;72443:11;72412:43;;;;;;;;;:::i;:::-;;;;;;;;;;;;;72457:18;72395:16;:81::i;:::-;72386:117;;;;-1:-1:-1;;;72386:117:0;;24674:2:1;72386:117:0;;;24656:21:1;24713:2;24693:18;;;24686:30;-1:-1:-1;;;24732:18:1;;;24725:52;24794:18;;72386:117:0;24472:346:1;72386:117:0;72520:10;;;;;;;72516:482;;72593:13;72607:11;72593:26;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;72577:12;72555:19;72563:10;72555:7;:19::i;:::-;-1:-1:-1;;;;;72555:34:0;;;;;:::i;:::-;:64;;72546:107;;;;-1:-1:-1;;;72546:107:0;;;;;;;:::i;:::-;72668:63;72676:10;72717:12;72695:19;72703:10;72695:7;:19::i;:::-;-1:-1:-1;;;;;72695:34:0;;;;;:::i;:::-;72668:7;:63::i;:::-;72516:482;;;72838:13;72852:11;72838:26;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;72822:12;72800:19;72808:10;72800:7;:19::i;:::-;-1:-1:-1;;;;;72772:47:0;:25;72786:10;72772:13;:25::i;:::-;:47;;;;:::i;:::-;:62;;;;:::i;:::-;:92;;72764:134;;;;-1:-1:-1;;;72764:134:0;;;;;;;:::i;:::-;72935:10;72913:33;;;;:21;:33;;;;;:57;;72957:12;;72913:33;:57;;72957:12;;72913:57;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;72516:482;73010:22;73019:12;73010:8;:22::i;73113:333::-;73189:7;;;;;;;73188:8;73179:32;;;;-1:-1:-1;;;73179:32:0;;14320:2:1;73179:32:0;;;14302:21:1;14359:2;14339:18;;;14332:30;-1:-1:-1;;;14378:18:1;;;14371:40;14428:18;;73179:32:0;14118:334:1;73179:32:0;73332:20;;-1:-1:-1;;;10580:18:1;;73332:13:0;;10623:1:1;10614:11;73332:20:0;;;;;;;;;;;;;;;;73302:10;73332:20;73280:33;;;:21;:33;;;;;;;;73332:20;;;;;73316:12;;73280:33;;;73258:19;;:7;:19::i;:::-;-1:-1:-1;;;;;73230:47:0;:25;73244:10;73230:13;:25::i;:::-;:47;;;;:::i;:::-;:83;;;;:::i;:::-;:98;;;;:::i;:::-;:122;;73222:165;;;;-1:-1:-1;;;73222:165:0;;;;;;;:::i;:::-;73408:22;73417:12;73408:8;:22::i;71645:492::-;46463:6;;-1:-1:-1;;;;;46463:6:0;17586:10;46610:23;46602:68;;;;-1:-1:-1;;;46602:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;71734:16:0;::::1;71725:49;;;::::0;-1:-1:-1;;;71725:49:0;;16173:2:1;71725:49:0::1;::::0;::::1;16155:21:1::0;16212:2;16192:18;;;16185:30;-1:-1:-1;;;16231:18:1;;;16224:49;16290:18;;71725:49:0::1;15971:343:1::0;71725:49:0::1;71810:17;::::0;::::1;-1:-1:-1::0;;;71810:17:0;;::::1;::::0;::::1;71794:33:::0;;::::1;;;71785:106;;;::::0;-1:-1:-1;;;71785:106:0;;24246:2:1;71785:106:0::1;::::0;::::1;24228:21:1::0;24285:2;24265:18;;;24258:30;24324:34;24304:18;;;24297:62;24395:29;24375:18;;;24368:57;24442:19;;71785:106:0::1;24044:423:1::0;71785:106:0::1;71926:1;71911:12;:16;;;71902:61;;;::::0;-1:-1:-1;;;71902:61:0;;19291:2:1;71902:61:0::1;::::0;::::1;19273:21:1::0;19330:2;19310:18;;;19303:30;19369:33;19349:18;;;19342:61;19420:18;;71902:61:0::1;19089:355:1::0;71902:61:0::1;71999:12;71983:28;;:12;:28;;;;71974:67;;;::::0;-1:-1:-1;;;71974:67:0;;26497:2:1;71974:67:0::1;::::0;::::1;26479:21:1::0;26536:2;26516:18;;;26509:30;-1:-1:-1;;;26555:18:1;;;26548:55;26620:18;;71974:67:0::1;26295:349:1::0;71974:67:0::1;72054:27;72064:2;72068:12;72054:27;;:9;:27::i;:::-;72117:12;72096:17;;:33;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;71645:492:::0;;:::o;65923:107::-;;;;;;;;;;;;;;;;;;;:::o;31331:185::-;31469:39;31486:4;31492:2;31496:7;31469:39;;;;;;;;;;;;:16;:39::i;43266:423::-;43323:35;43361:20;43373:7;43361:11;:20::i;:::-;43436:18;;43323:58;;-1:-1:-1;43394:22:0;;-1:-1:-1;;;;;43420:34:0;17586:10;-1:-1:-1;;;;;43420:34:0;;:101;;;-1:-1:-1;43488:18:0;;43471:50;;17586:10;30859:164;:::i;43471:50::-;43420:154;;;-1:-1:-1;17586:10:0;43538:20;43550:7;43538:11;:20::i;:::-;-1:-1:-1;;;;;43538:36:0;;43420:154;43394:181;;43593:17;43588:66;;43619:35;;-1:-1:-1;;;43619:35:0;;;;;;;;;;;43588:66;43667:14;43673:7;43667:5;:14::i;75408:1134::-;75470:16;75499:18;75520:17;75530:6;75520:9;:17::i;:::-;75499:38;-1:-1:-1;75554:15:0;75550:985;;-1:-1:-1;;75632:16:0;;;75646:1;75632:16;;;;;;;;;75625:23;-1:-1:-1;75408:1134:0:o;75550:985::-;75681:23;75721:10;-1:-1:-1;;;;;75707:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;75707:25:0;-1:-1:-1;75681:51:0;-1:-1:-1;66382:1:0;75747:22;;75880:609;75895:10;75887:5;:18;:52;;;;;75926:13;;75909:14;:30;75887:52;75880:609;;;75967:27;;;;:11;:27;;;;;:34;-1:-1:-1;;;75967:34:0;;;;75966:35;:85;;;;-1:-1:-1;76049:1:0;76005:27;;;:11;:27;;;;;:32;-1:-1:-1;;;;;76005:32:0;:46;;75966:85;75962:178;;;-1:-1:-1;76088:27:0;;;;:11;:27;;;;;:32;-1:-1:-1;;;;;76088:32:0;75962:178;76177:6;-1:-1:-1;;;;;76164:19:0;:9;-1:-1:-1;;;;;76164:19:0;;:58;;;;-1:-1:-1;76188:27:0;;;;:11;:27;;;;;:34;-1:-1:-1;;;76188:34:0;;;;76187:35;76164:58;76160:227;;;76263:14;76247:6;76254:5;76247:13;;;;;;;;:::i;:::-;;;;;;;;;;:30;76337:7;;;;;76160:227;76438:16;;;;;75880:609;;;-1:-1:-1;76517:6:0;;75408:1134;-1:-1:-1;;;;;75408:1134:0:o;75550:985::-;75488:1054;75408:1134;;;:::o;63031:641::-;-1:-1:-1;;;;;63113:16:0;;63132:1;63113:16;;;:7;:16;;;;;;63105:71;;;;-1:-1:-1;;;63105:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;61064:26:0;;63189:21;61064:26;;;:19;:26;;;;;;63213:30;;-1:-1:-1;;;63213:30:0;;63237:4;63213:30;;;10782:51:1;-1:-1:-1;;;;;63213:15:0;;;;;10755:18:1;;63213:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;;;:::i;:::-;63189:77;;63277:15;63295:65;63311:7;63320:13;63335:24;63344:5;63351:7;-1:-1:-1;;;;;61768:21:0;;;61741:7;61768:21;;;:14;:21;;;;;;;;:30;;;;;;;;;;;;;61671:135;63295:65;63277:83;-1:-1:-1;63381:12:0;63373:68;;;;-1:-1:-1;;;63373:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;63454:21:0;;;;;;;:14;:21;;;;;;;;:30;;;;;;;;;;;:41;;63488:7;;63454:21;:41;;63488:7;;63454:41;:::i;:::-;;;;-1:-1:-1;;;;;;;63506:26:0;;;;;;:19;:26;;;;;:37;;63536:7;;63506:26;:37;;63536:7;;63506:37;:::i;:::-;;;;-1:-1:-1;63556:47:0;;-1:-1:-1;63579:5:0;63586:7;63595;63556:22;:47::i;:::-;63619:45;;;-1:-1:-1;;;;;11044:32:1;;;11026:51;;11108:2;11093:18;;11086:34;;;63619:45:0;;;;;10999:18:1;63619:45:0;;;;;;;63094:578;;63031:641;;:::o;70298:202::-;46463:6;;-1:-1:-1;;;;;46463:6:0;17586:10;46610:23;46602:68;;;;-1:-1:-1;;;46602:68:0;;;;;;;:::i;:::-;70391:8:::1;::::0;-1:-1:-1;;;70391:8:0;::::1;;;70390:9;70382:49;;;::::0;-1:-1:-1;;;70382:49:0;;22338:2:1;70382:49:0::1;::::0;::::1;22320:21:1::0;22377:2;22357:18;;;22350:30;22416:29;22396:18;;;22389:57;22463:18;;70382:49:0::1;22136:351:1::0;70382:49:0::1;70442:8;:15:::0;;-1:-1:-1;;70442:15:0::1;-1:-1:-1::0;;;70442:15:0::1;::::0;;70468:24:::1;70479:12:::0;71394:172;46463:6;;-1:-1:-1;;;;;46463:6:0;17586:10;46610:23;46602:68;;;;-1:-1:-1;;;46602:68:0;;;;;;;:::i;:::-;71484:8:::1;::::0;;;::::1;;;71483:9;71474:42;;;::::0;-1:-1:-1;;;71474:42:0;;26149:2:1;71474:42:0::1;::::0;::::1;26131:21:1::0;26188:2;26168:18;;;26161:30;-1:-1:-1;;;26207:18:1;;;26200:49;26266:18;;71474:42:0::1;25947:343:1::0;71474:42:0::1;71527:31:::0;;::::1;::::0;:13:::1;::::0;:31:::1;::::0;::::1;::::0;::::1;:::i;:::-;;71394:172:::0;:::o;28539:124::-;28603:7;28630:20;28642:7;28630:11;:20::i;:::-;:25;;28539:124;-1:-1:-1;;28539:124:0:o;25714:206::-;25778:7;-1:-1:-1;;;;;25802:19:0;;25798:60;;25830:28;;-1:-1:-1;;;25830:28:0;;;;;;;;;;;25798:60;-1:-1:-1;;;;;;25884:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;25884:27:0;;25714:206::o;47041:103::-;46463:6;;-1:-1:-1;;;;;46463:6:0;17586:10;46610:23;46602:68;;;;-1:-1:-1;;;46602:68:0;;;;;;;:::i;:::-;47106:30:::1;47133:1;47106:18;:30::i;:::-;47041:103::o:0;61897:100::-;61948:7;61975;61983:5;61975:14;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;61975:14:0;;61897:100;-1:-1:-1;;61897:100:0:o;75198:121::-;75266:6;75292:13;75306:4;75292:19;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;75198:121;-1:-1:-1;;75198:121:0:o;28899:104::-;28955:13;28988:7;28981:14;;;;;:::i;76603:205::-;46463:6;;-1:-1:-1;;;;;46463:6:0;17586:10;46610:23;46602:68;;;;-1:-1:-1;;;46602:68:0;;;;;;;:::i;:::-;76666:8:::1;::::0;;;::::1;;;76665:9;76657:45;;;::::0;-1:-1:-1;;;76657:45:0;;13561:2:1;76657:45:0::1;::::0;::::1;13543:21:1::0;13600:2;13580:18;;;13573:30;13639:25;13619:18;;;13612:53;13682:18;;76657:45:0::1;13359:347:1::0;76657:45:0::1;76721:8;::::0;-1:-1:-1;;;76721:8:0;::::1;;;76713:70;;;::::0;-1:-1:-1;;;76713:70:0;;19651:2:1;76713:70:0::1;::::0;::::1;19633:21:1::0;19690:2;19670:18;;;19663:30;19729:34;19709:18;;;19702:62;-1:-1:-1;;;19780:18:1;;;19773:47;19837:19;;76713:70:0::1;19449:413:1::0;76713:70:0::1;76788:8;:15:::0;;-1:-1:-1;;76788:15:0::1;::::0;::::1;::::0;;76603:205::o;69007:214::-;46463:6;;-1:-1:-1;;;;;46463:6:0;17586:10;46610:23;46602:68;;;;-1:-1:-1;;;46602:68:0;;;;;;;:::i;:::-;69090:7:::1;::::0;::::1;::::0;::::1;;;69082:41;;;::::0;-1:-1:-1;;;69082:41:0;;18941:2:1;69082:41:0::1;::::0;::::1;18923:21:1::0;18980:2;18960:18;;;18953:30;-1:-1:-1;;;18999:18:1;;;18992:51;19060:18;;69082:41:0::1;18739:345:1::0;69082:41:0::1;69134:5;:24:::0;69169:7:::1;:15:::0;;-1:-1:-1;;69195:18:0;;;69007:214::o;30509:279::-;-1:-1:-1;;;;;30600:24:0;;17586:10;30600:24;30596:54;;;30633:17;;-1:-1:-1;;;30633:17:0;;;;;;;;;;;30596:54;17586:10;30663:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;30663:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;30663:53:0;;;;;;;;;;30732:48;;12680:41:1;;;30663:42:0;;17586:10;30732:48;;12653:18:1;30732:48:0;;;;;;;30509:279;;:::o;69818:264::-;46463:6;;-1:-1:-1;;;;;46463:6:0;17586:10;46610:23;46602:68;;;;-1:-1:-1;;;46602:68:0;;;;;;;:::i;:::-;69951:15:::1;69928:38;;:13;69942:4;69928:19;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;;::::1;;:38;;69920:106;;;::::0;-1:-1:-1;;;69920:106:0;;21914:2:1;69920:106:0::1;::::0;::::1;21896:21:1::0;21953:2;21933:18;;;21926:30;21992:34;21972:18;;;21965:62;22063:25;22043:18;;;22036:53;22106:19;;69920:106:0::1;21712:419:1::0;69920:106:0::1;70059:15;70037:13;70051:4;70037:19;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:37;;::::1;::::0;;;::::1;-1:-1:-1::0;;70037:37:0;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;69818:264:0:o;68842:82::-;46463:6;;-1:-1:-1;;;;;46463:6:0;17586:10;46610:23;46602:68;;;;-1:-1:-1;;;46602:68:0;;;;;;;:::i;:::-;68910:6:::1;::::0;;-1:-1:-1;;68900:16:0;::::1;68910:6;::::0;;::::1;68909:7;68900:16;::::0;;68842:82::o;31587:369::-;31754:28;31764:4;31770:2;31774:7;31754:9;:28::i;:::-;-1:-1:-1;;;;;31797:13:0;;9821:20;9869:8;;31797:76;;;;;31817:56;31848:4;31854:2;31858:7;31867:5;31817:30;:56::i;:::-;31816:57;31797:76;31793:156;;;31897:40;;-1:-1:-1;;;31897:40:0;;;;;;;;;;;31793:156;31587:369;;;;:::o;74196:416::-;74269:13;74303:16;74311:7;74303;:16::i;:::-;74295:75;;;;-1:-1:-1;;;74295:75:0;;21145:2:1;74295:75:0;;;21127:21:1;21184:2;21164:18;;;21157:30;21223:34;21203:18;;;21196:62;-1:-1:-1;;;21274:18:1;;;21267:45;21329:19;;74295:75:0;20943:411:1;74295:75:0;74395:8;;-1:-1:-1;;;74395:8:0;;;;74391:58;;74427:10;:8;:10::i;74391:58::-;74469:17;74489:10;:8;:10::i;:::-;74469:30;;74537:1;74523:3;74517:17;:21;:87;;;;;;;;;;;;;;;;;74565:3;74570:18;:7;:16;:18::i;:::-;74548:50;;;;;;;;;:::i;:::-;;;;;;;;;;;;;74517:87;74510:94;74196:416;-1:-1:-1;;;74196:416:0:o;70564:494::-;46463:6;;-1:-1:-1;;;;;46463:6:0;17586:10;46610:23;46602:68;;;;-1:-1:-1;;;46602:68:0;;;;;;;:::i;:::-;70685:9:::1;::::0;::::1;::::0;;::::1;70673:21:::0;;::::1;;70665:69;;;::::0;-1:-1:-1;;;70665:69:0;;15003:2:1;70665:69:0::1;::::0;::::1;14985:21:1::0;15042:2;15022:18;;;15015:30;15081:34;15061:18;;;15054:62;-1:-1:-1;;;15132:18:1;;;15125:34;15176:19;;70665:69:0::1;14801:400:1::0;70665:69:0::1;70777:17;::::0;::::1;-1:-1:-1::0;;;70777:17:0;;::::1;::::0;::::1;70753:41:::0;;::::1;;;70745:81;;;::::0;-1:-1:-1;;;70745:81:0;;20069:2:1;70745:81:0::1;::::0;::::1;20051:21:1::0;20108:2;20088:18;;;20081:30;20147:29;20127:18;;;20120:57;20194:18;;70745:81:0::1;19867:351:1::0;70745:81:0::1;66382:1:::0;24848:12;24638:7;24832:13;:28;-1:-1:-1;;24832:46:0;70858:36:::1;::::0;::::1;::::0;::::1;;:::i;:::-;70845:9;:49;;;;70837:127;;;::::0;-1:-1:-1;;;70837:127:0;;17648:2:1;70837:127:0::1;::::0;::::1;17630:21:1::0;17687:2;17667:18;;;17660:30;17726:34;17706:18;;;17699:62;17797:34;17777:18;;;17770:62;-1:-1:-1;;;17848:19:1;;;17841:32;17890:19;;70837:127:0::1;17446:469:1::0;70837:127:0::1;70977:9;:21:::0;;::::1;71009:41:::0;;::::1;-1:-1:-1::0;;;71009:41:0::1;-1:-1:-1::0;;71009:41:0;;;70977:21;;;::::1;71009:41:::0;;;;;;;::::1;::::0;;70564:494::o;69562:178::-;46463:6;;-1:-1:-1;;;;;46463:6:0;17586:10;46610:23;46602:68;;;;-1:-1:-1;;;46602:68:0;;;;;;;:::i;:::-;69644:8:::1;69635:5;;:17;;69627:78;;;::::0;-1:-1:-1;;;69627:78:0;;23829:2:1;69627:78:0::1;::::0;::::1;23811:21:1::0;23868:2;23848:18;;;23841:30;23907:34;23887:18;;;23880:62;-1:-1:-1;;;23958:18:1;;;23951:46;24014:19;;69627:78:0::1;23627:412:1::0;69627:78:0::1;69716:5;:16:::0;69562:178::o;47299:201::-;46463:6;;-1:-1:-1;;;;;46463:6:0;17586:10;46610:23;46602:68;;;;-1:-1:-1;;;46602:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;47388:22:0;::::1;47380:73;;;::::0;-1:-1:-1;;;47380:73:0;;13913:2:1;47380:73:0::1;::::0;::::1;13895:21:1::0;13952:2;13932:18;;;13925:30;13991:34;13971:18;;;13964:62;-1:-1:-1;;;14042:18:1;;;14035:36;14088:19;;47380:73:0::1;13711:402:1::0;47380:73:0::1;47464:28;47483:8;47464:18;:28::i;74817:373::-:0;74906:7;74929:12;:17;;74945:1;74929:17;74926:71;;;74970:15;74978:6;74970:7;:15::i;:::-;-1:-1:-1;;;;;74963:22:0;;;;;74926:71;75010:12;:17;;75026:1;75010:17;75007:85;;;-1:-1:-1;;;;;;75051:29:0;;;;;;:21;:29;;;;;;;;75044:36;;75007:85;-1:-1:-1;;;;;75153:29:0;;;;;;:21;:29;;;;;;;;75135:15;75175:6;75135:7;:15::i;:::-;-1:-1:-1;;;;;75111:39:0;:21;75125:6;75111:13;:21::i;:::-;:39;;;;:::i;:::-;:71;;;;:::i;44505:230::-;44614:13;;-1:-1:-1;;;;;44594:33:0;;;44614:13;;44594:33;;44586:98;;;;-1:-1:-1;;;44586:98:0;;23050:2:1;44586:98:0;;;23032:21:1;23089:2;23069:18;;;23062:30;23128:34;23108:18;;;23101:62;-1:-1:-1;;;23179:18:1;;;23172:50;23239:19;;44586:98:0;22848:416:1;44586:98:0;44695:13;:32;;-1:-1:-1;;;;;;44695:32:0;-1:-1:-1;;;;;44695:32:0;;;;;;;;;;44505:230::o;32211:187::-;32268:4;32311:7;66382:1;32292:26;;:53;;;;;32332:13;;32322:7;:23;32292:53;:98;;;;-1:-1:-1;;32363:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;32363:27:0;;;;32362:28;;32211:187::o;39822:196::-;39937:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;39937:29:0;-1:-1:-1;;;;;39937:29:0;;;;;;;;;39982:28;;39937:24;;39982:28;;;;;;;39822:196;;;:::o;63850:248::-;64060:12;;-1:-1:-1;;;;;64040:16:0;;63996:7;64040:16;;;:7;:16;;;;;;63996:7;;64075:15;;64024:32;;:13;:32;:::i;:::-;64023:49;;;;:::i;:::-;:67;;;;:::i;:::-;64016:74;63850:248;-1:-1:-1;;;;63850:248:0:o;10820:317::-;10935:6;10910:21;:31;;10902:73;;;;-1:-1:-1;;;10902:73:0;;17290:2:1;10902:73:0;;;17272:21:1;17329:2;17309:18;;;17302:30;17368:31;17348:18;;;17341:59;17417:18;;10902:73:0;17088:353:1;10902:73:0;10989:12;11007:9;-1:-1:-1;;;;;11007:14:0;11029:6;11007:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10988:52;;;11059:7;11051:78;;;;-1:-1:-1;;;11051:78:0;;16863:2:1;11051:78:0;;;16845:21:1;16902:2;16882:18;;;16875:30;16941:34;16921:18;;;16914:62;17012:28;16992:18;;;16985:56;17058:19;;11051:78:0;16661:422:1;44743:250:0;44845:7;44866:9;44877;44888:7;44899:27;44915:10;44899:15;:27::i;:::-;44944:41;;;;;;;;;;;;12959:25:1;;;13032:4;13020:17;;13000:18;;;12993:45;;;;13054:18;;;13047:34;;;13097:18;;;13090:34;;;44865:61:0;;-1:-1:-1;44865:61:0;;-1:-1:-1;44865:61:0;-1:-1:-1;44944:41:0;;12931:19:1;;44944:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;44944:41:0;;-1:-1:-1;;44944:41:0;;;44743:250;-1:-1:-1;;;;;;;44743:250:0:o;35324:2112::-;35439:35;35477:20;35489:7;35477:11;:20::i;:::-;35552:18;;35439:58;;-1:-1:-1;35510:22:0;;-1:-1:-1;;;;;35536:34:0;17586:10;-1:-1:-1;;;;;35536:34:0;;:101;;;-1:-1:-1;35604:18:0;;35587:50;;17586:10;30859:164;:::i;35587:50::-;35536:154;;;-1:-1:-1;17586:10:0;35654:20;35666:7;35654:11;:20::i;:::-;-1:-1:-1;;;;;35654:36:0;;35536:154;35510:181;;35709:17;35704:66;;35735:35;;-1:-1:-1;;;35735:35:0;;;;;;;;;;;35704:66;35807:4;-1:-1:-1;;;;;35785:26:0;:13;:18;;;-1:-1:-1;;;;;35785:26:0;;35781:67;;35820:28;;-1:-1:-1;;;35820:28:0;;;;;;;;;;;35781:67;-1:-1:-1;;;;;35863:16:0;;35859:52;;35888:23;;-1:-1:-1;;;35888:23:0;;;;;;;;;;;35859:52;36032:49;36049:1;36053:7;36062:13;:18;;;36032:8;:49::i;:::-;-1:-1:-1;;;;;36377:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;36377:31:0;;;-1:-1:-1;;;;;36377:31:0;;;-1:-1:-1;;36377:31:0;;;;;;;36423:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;36423:29:0;;;;;;;;;;;36469:20;;;:11;:20;;;;;;:30;;-1:-1:-1;;;;;;36514:61:0;;;;-1:-1:-1;;;36559:15:0;36514:61;;;;;;;;;;;36849:11;;;36879:24;;;;;:29;36849:11;;36879:29;36875:445;;37104:13;;37090:11;:27;37086:219;;;37174:18;;;37142:24;;;:11;:24;;;;;;;;:50;;37257:28;;;;-1:-1:-1;;;;;37215:70:0;-1:-1:-1;;;37215:70:0;-1:-1:-1;;;;;;37215:70:0;;;-1:-1:-1;;;;;37142:50:0;;;37215:70;;;;;;;37086:219;36352:979;37367:7;37363:2;-1:-1:-1;;;;;37348:27:0;37357:4;-1:-1:-1;;;;;37348:27:0;-1:-1:-1;;;;;;;;;;;37348:27:0;;;;;;;;;37386:42;35428:2008;;35324:2112;;;:::o;26632:179::-;26687:6;-1:-1:-1;;;;;26710:19:0;;26706:56;;26738:24;;-1:-1:-1;;;26738:24:0;;;;;;;;;;;26706:56;-1:-1:-1;;;;;;26780:19:0;;;;;:12;:19;;;;;:23;-1:-1:-1;;;26780:23:0;;-1:-1:-1;;;;;26780:23:0;;26632:179::o;26999:168::-;-1:-1:-1;;;;;27067:19:0;;27063:56;;27095:24;;-1:-1:-1;;;27095:24:0;;;;;;;;;;;27063:56;-1:-1:-1;;;;;27130:19:0;;;;;;;:12;:19;;;;;:29;;-1:-1:-1;;;;;27130:29:0;;;-1:-1:-1;;;27130:29:0;-1:-1:-1;;;;;27130:29:0;;;;;;;;;26999:168::o;26002:207::-;26063:7;-1:-1:-1;;;;;26087:19:0;;26083:59;;26115:27;;-1:-1:-1;;;26115:27:0;;;;;;;;;;;26083:59;-1:-1:-1;;;;;;26168:19:0;;;;;:12;:19;;;;;:32;-1:-1:-1;;;26168:32:0;;-1:-1:-1;;;;;26168:32:0;;26002:207::o;73521:520::-;49668:1;50266:7;;:19;;50258:63;;;;-1:-1:-1;;;50258:63:0;;25789:2:1;50258:63:0;;;25771:21:1;25828:2;25808:18;;;25801:30;25867:33;25847:18;;;25840:61;25918:18;;50258:63:0;25587:355:1;50258:63:0;49668:1;50399:7;:18;73602:6:::1;::::0;::::1;;73601:7;73592:36;;;::::0;-1:-1:-1;;;73592:36:0;;14659:2:1;73592:36:0::1;::::0;::::1;14641:21:1::0;14698:2;14678:18;;;14671:30;-1:-1:-1;;;14717:18:1;;;14710:45;14772:18;;73592:36:0::1;14457:339:1::0;73592:36:0::1;73665:1;73649:13;:17;73640:62;;;::::0;-1:-1:-1;;;73640:62:0;;19291:2:1;73640:62:0::1;::::0;::::1;19273:21:1::0;19330:2;19310:18;;;19303:30;19369:33;19349:18;;;19342:61;19420:18;;73640:62:0::1;19089:355:1::0;73640:62:0::1;73767:17;::::0;73755:29:::1;::::0;73767:17:::1;-1:-1:-1::0;;;73767:17:0;::::1;::::0;::::1;::::0;73755:9:::1;:29;:::i;:::-;73722:62;;73738:13;66382:1:::0;24848:12;24638:7;24832:13;-1:-1:-1;;24832:28:0;;;:46;;24594:303;73738:13:::1;73722:29;::::0;:13;:29:::1;:::i;:::-;:62;;73713:103;;;::::0;-1:-1:-1;;;73713:103:0;;22694:2:1;73713:103:0::1;::::0;::::1;22676:21:1::0;22733:2;22713:18;;;22706:30;22772:29;22752:18;;;22745:57;22819:18;;73713:103:0::1;22492:351:1::0;73713:103:0::1;73855:13;73849:5;;:19;;;;:::i;:::-;73836:9;:32;73827:70;;;::::0;-1:-1:-1;;;73827:70:0;;21561:2:1;73827:70:0::1;::::0;::::1;21543:21:1::0;21600:2;21580:18;;;21573:30;21639:26;21619:18;;;21612:54;21683:18;;73827:70:0::1;21359:348:1::0;73827:70:0::1;73934:12;73917:29;;:13;:29;;73908:68;;;::::0;-1:-1:-1;;;73908:68:0;;26497:2:1;73908:68:0::1;::::0;::::1;26479:21:1::0;26536:2;26516:18;;;26509:30;-1:-1:-1;;;26555:18:1;;;26548:55;26620:18;;73908:68:0::1;26295:349:1::0;73908:68:0::1;73997:36;74007:10;74019:13;73997:9;:36::i;:::-;-1:-1:-1::0;49624:1:0;50578:7;:22;73521:520::o;32406:104::-;32475:27;32485:2;32489:8;32475:27;;;;;;;;;;;;:9;:27::i;27369:1108::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;27479:7:0;;66382:1;27528:23;;:47;;;;;27562:13;;27555:4;:20;27528:47;27524:886;;;27596:31;27630:17;;;:11;:17;;;;;;;;;27596:51;;;;;;;;;-1:-1:-1;;;;;27596:51:0;;;;-1:-1:-1;;;27596:51:0;;-1:-1:-1;;;;;27596:51:0;;;;;;;;-1:-1:-1;;;27596:51:0;;;;;;;;;;;;;;27666:729;;27716:14;;-1:-1:-1;;;;;27716:28:0;;27712:101;;27780:9;27369:1108;-1:-1:-1;;;27369:1108:0:o;27712:101::-;-1:-1:-1;;;28155:6:0;28200:17;;;;:11;:17;;;;;;;;;28188:29;;;;;;;;;-1:-1:-1;;;;;28188:29:0;;;;;-1:-1:-1;;;28188:29:0;;-1:-1:-1;;;;;28188:29:0;;;;;;;;-1:-1:-1;;;28188:29:0;;;;;;;;;;;;;28248:28;28244:109;;28316:9;27369:1108;-1:-1:-1;;;27369:1108:0:o;28244:109::-;28115:261;;;27577:833;27524:886;28438:31;;-1:-1:-1;;;28438:31:0;;;;;;;;;;;37665:2039;37725:35;37763:20;37775:7;37763:11;:20::i;:::-;37725:58;-1:-1:-1;37926:49:0;37943:1;37947:7;37956:13;:18;;;37926:8;:49::i;:::-;38284:18;;-1:-1:-1;;;;;38271:32:0;;;;;;;:12;:32;;;;;;;;:45;;-1:-1:-1;;38271:45:0;;-1:-1:-1;;;;;38271:45:0;;;-1:-1:-1;;38271:45:0;;;;;;;38344:18;;38331:32;;;;;;;:50;;-1:-1:-1;;;;38331:50:0;;-1:-1:-1;;;38331:50:0;;;;;;-1:-1:-1;38331:50:0;;;;;;;;;;;;38508:18;;38480:20;;;:11;:20;;;;;;:46;;-1:-1:-1;;;38480:46:0;;;-1:-1:-1;;;;;;38541:61:0;;;;-1:-1:-1;;;38586:15:0;38541:61;;;;;;;;;;;-1:-1:-1;;;;38617:34:0;;;;;;;38921:11;;;38951:24;;;;;:29;38921:11;;38951:29;38947:445;;39176:13;;39162:11;:27;39158:219;;;39246:18;;;39214:24;;;:11;:24;;;;;;;;:50;;39329:28;;;;-1:-1:-1;;;;;39287:70:0;-1:-1:-1;;;39287:70:0;-1:-1:-1;;;;;;39287:70:0;;;-1:-1:-1;;;;;39214:50:0;;;39287:70;;;;;;;39158:219;-1:-1:-1;39429:18:0;;39420:49;;39461:7;;39457:1;;-1:-1:-1;;;;;39420:49:0;;;;-1:-1:-1;;;;;;;;;;;39420:49:0;39457:1;;39420:49;-1:-1:-1;;39671:12:0;:14;;;;;;37665:2039::o;53967:211::-;54111:58;;;-1:-1:-1;;;;;11044:32:1;;54111:58:0;;;11026:51:1;11093:18;;;;11086:34;;;54111:58:0;;;;;;;;;;10999:18:1;;;;54111:58:0;;;;;;;;-1:-1:-1;;;;;54111:58:0;-1:-1:-1;;;54111:58:0;;;54084:86;;54104:5;;54084:19;:86::i;47660:191::-;47753:6;;;-1:-1:-1;;;;;47770:17:0;;;-1:-1:-1;;;;;;47770:17:0;;;;;;;47803:40;;47753:6;;;47770:17;47753:6;;47803:40;;47734:16;;47803:40;47723:128;47660:191;:::o;40510:667::-;40694:72;;-1:-1:-1;;;40694:72:0;;40673:4;;-1:-1:-1;;;;;40694:36:0;;;;;:72;;17586:10;;40745:4;;40751:7;;40760:5;;40694:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40694:72:0;;;;;;;;-1:-1:-1;;40694:72:0;;;;;;;;;;;;:::i;:::-;;;40690:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40928:13:0;;40924:235;;40974:40;;-1:-1:-1;;;40974:40:0;;;;;;;;;;;40924:235;41117:6;41111:13;41102:6;41098:2;41094:15;41087:38;40690:480;-1:-1:-1;;;;;;40813:55:0;-1:-1:-1;;;40813:55:0;;-1:-1:-1;40510:667:0;;;;;;:::o;71140:114::-;71200:13;71233;71226:20;;;;;:::i;18083:723::-;18139:13;18360:10;18356:53;;-1:-1:-1;;18387:10:0;;;;;;;;;;;;-1:-1:-1;;;18387:10:0;;;;;18083:723::o;18356:53::-;18434:5;18419:12;18475:78;18482:9;;18475:78;;18508:8;;;;:::i;:::-;;-1:-1:-1;18531:10:0;;-1:-1:-1;18539:2:0;18531:10;;:::i;:::-;;;18475:78;;;18563:19;18595:6;-1:-1:-1;;;;;18585:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18585:17:0;;18563:39;;18613:154;18620:10;;18613:154;;18647:11;18657:1;18647:11;;:::i;:::-;;-1:-1:-1;18716:10:0;18724:2;18716:5;:10;:::i;:::-;18703:24;;:2;:24;:::i;:::-;18690:39;;18673:6;18680;18673:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;18673:56:0;;;;;;;;-1:-1:-1;18744:11:0;18753:2;18744:11;;:::i;:::-;;;18613:154;;45001:324;45066:9;45077;45088:7;45116:3;:10;45130:2;45116:16;45108:53;;;;-1:-1:-1;;;45108:53:0;;25025:2:1;45108:53:0;;;25007:21:1;25064:2;25044:18;;;25037:30;25103:26;25083:18;;;25076:54;25147:18;;45108:53:0;24823:348:1;45108:53:0;-1:-1:-1;;;45218:2:0;45209:12;;45203:19;45256:2;45247:12;;45241:19;45302:2;45293:12;;;45287:19;45203;;45284:1;45279:28;;;;;45001:324::o;32873:163::-;32996:32;33002:2;33006:8;33016:5;33023:4;32996:5;:32::i;56540:716::-;56964:23;56990:69;57018:4;56990:69;;;;;;;;;;;;;;;;;56998:5;-1:-1:-1;;;;;56990:27:0;;;:69;;;;;:::i;:::-;57074:17;;56964:95;;-1:-1:-1;57074:21:0;57070:179;;57171:10;57160:30;;;;;;;;;;;;:::i;:::-;57152:85;;;;-1:-1:-1;;;57152:85:0;;25378:2:1;57152:85:0;;;25360:21:1;25417:2;25397:18;;;25390:30;25456:34;25436:18;;;25429:62;-1:-1:-1;;;25507:18:1;;;25500:40;25557:19;;57152:85:0;25176:406:1;33295:1775:0;33434:20;33457:13;-1:-1:-1;;;;;33485:16:0;;33481:48;;33510:19;;-1:-1:-1;;;33510:19:0;;;;;;;;;;;33481:48;33544:13;33540:44;;33566:18;;-1:-1:-1;;;33566:18:0;;;;;;;;;;;33540:44;-1:-1:-1;;;;;33935:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;33994:49:0;;-1:-1:-1;;;;;33935:44:0;;;;;;;33994:49;;;-1:-1:-1;;;;;33935:44:0;;;;;;33994:49;;;;;;;;;;;;;;;;34060:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;34110:66:0;;;;-1:-1:-1;;;34160:15:0;34110:66;;;;;;;;;;34060:25;34257:23;;;34301:4;:23;;;;-1:-1:-1;;;;;;34309:13:0;;9821:20;9869:8;;34309:15;34297:641;;;34345:314;34376:38;;34401:12;;-1:-1:-1;;;;;34376:38:0;;;34393:1;;-1:-1:-1;;;;;;;;;;;34376:38:0;34393:1;;34376:38;34442:69;34481:1;34485:2;34489:14;;;;;;34505:5;34442:30;:69::i;:::-;34437:174;;34547:40;;-1:-1:-1;;;34547:40:0;;;;;;;;;;;34437:174;34654:3;34638:12;:19;;34345:314;;34740:12;34723:13;;:29;34719:43;;34754:8;;;34719:43;34297:641;;;34803:120;34834:40;;34859:14;;;;;-1:-1:-1;;;;;34834:40:0;;;34851:1;;-1:-1:-1;;;;;;;;;;;34834:40:0;34851:1;;34834:40;34918:3;34902:12;:19;;34803:120;;34297:641;-1:-1:-1;34952:13:0;:28;35002:60;31587:369;12304:229;12441:12;12473:52;12495:6;12503:4;12509:1;12512:12;12441;9821:20;;13711:60;;;;-1:-1:-1;;;13711:60:0;;23471:2:1;13711:60:0;;;23453:21:1;23510:2;23490:18;;;23483:30;23549:31;23529:18;;;23522:59;23598:18;;13711:60:0;23269:353:1;13711:60:0;13785:12;13799:23;13826:6;-1:-1:-1;;;;;13826:11:0;13845:5;13852:4;13826:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13784:73;;;;13875:51;13892:7;13901:10;13913:12;13875:16;:51::i;:::-;13868:58;13424:510;-1:-1:-1;;;;;;;13424:510:0:o;16110:712::-;16260:12;16289:7;16285:530;;;-1:-1:-1;16320:10:0;16313:17;;16285:530;16434:17;;:21;16430:374;;16632:10;16626:17;16693:15;16680:10;16676:2;16672:19;16665:44;16430:374;16775:12;16768:20;;-1:-1:-1;;;16768:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:718:1;56:5;109:3;102:4;94:6;90:17;86:27;76:55;;127:1;124;117:12;76:55;163:6;150:20;-1:-1:-1;;;;;226:2:1;222;219:10;216:36;;;232:18;;:::i;:::-;307:2;301:9;275:2;361:13;;-1:-1:-1;;357:22:1;;;381:2;353:31;349:40;337:53;;;405:18;;;425:22;;;402:46;399:72;;;451:18;;:::i;:::-;491:10;487:2;480:22;526:2;518:6;511:18;572:3;565:4;560:2;552:6;548:15;544:26;541:35;538:55;;;589:1;586;579:12;538:55;653:2;646:4;638:6;634:17;627:4;619:6;615:17;602:54;700:1;693:4;688:2;680:6;676:15;672:26;665:37;720:6;711:15;;;;;;14:718;;;;:::o;737:163::-;804:20;;864:10;853:22;;843:33;;833:61;;890:1;887;880:12;833:61;737:163;;;:::o;905:247::-;964:6;1017:2;1005:9;996:7;992:23;988:32;985:52;;;1033:1;1030;1023:12;985:52;1072:9;1059:23;1091:31;1116:5;1091:31;:::i;1417:388::-;1485:6;1493;1546:2;1534:9;1525:7;1521:23;1517:32;1514:52;;;1562:1;1559;1552:12;1514:52;1601:9;1588:23;1620:31;1645:5;1620:31;:::i;:::-;1670:5;-1:-1:-1;1727:2:1;1712:18;;1699:32;1740:33;1699:32;1740:33;:::i;:::-;1792:7;1782:17;;;1417:388;;;;;:::o;1810:456::-;1887:6;1895;1903;1956:2;1944:9;1935:7;1931:23;1927:32;1924:52;;;1972:1;1969;1962:12;1924:52;2011:9;1998:23;2030:31;2055:5;2030:31;:::i;:::-;2080:5;-1:-1:-1;2137:2:1;2122:18;;2109:32;2150:33;2109:32;2150:33;:::i;:::-;1810:456;;2202:7;;-1:-1:-1;;;2256:2:1;2241:18;;;;2228:32;;1810:456::o;2271:665::-;2366:6;2374;2382;2390;2443:3;2431:9;2422:7;2418:23;2414:33;2411:53;;;2460:1;2457;2450:12;2411:53;2499:9;2486:23;2518:31;2543:5;2518:31;:::i;:::-;2568:5;-1:-1:-1;2625:2:1;2610:18;;2597:32;2638:33;2597:32;2638:33;:::i;:::-;2690:7;-1:-1:-1;2744:2:1;2729:18;;2716:32;;-1:-1:-1;2799:2:1;2784:18;;2771:32;-1:-1:-1;;;;;2815:30:1;;2812:50;;;2858:1;2855;2848:12;2812:50;2881:49;2922:7;2913:6;2902:9;2898:22;2881:49;:::i;:::-;2871:59;;;2271:665;;;;;;;:::o;2941:382::-;3006:6;3014;3067:2;3055:9;3046:7;3042:23;3038:32;3035:52;;;3083:1;3080;3073:12;3035:52;3122:9;3109:23;3141:31;3166:5;3141:31;:::i;:::-;3191:5;-1:-1:-1;3248:2:1;3233:18;;3220:32;3261:30;3220:32;3261:30;:::i;3328:315::-;3396:6;3404;3457:2;3445:9;3436:7;3432:23;3428:32;3425:52;;;3473:1;3470;3463:12;3425:52;3512:9;3499:23;3531:31;3556:5;3531:31;:::i;:::-;3581:5;3633:2;3618:18;;;;3605:32;;-1:-1:-1;;;3328:315:1:o;3648:319::-;3715:6;3723;3776:2;3764:9;3755:7;3751:23;3747:32;3744:52;;;3792:1;3789;3782:12;3744:52;3831:9;3818:23;3850:31;3875:5;3850:31;:::i;:::-;3900:5;-1:-1:-1;3924:37:1;3957:2;3942:18;;3924:37;:::i;:::-;3914:47;;3648:319;;;;;:::o;3972:245::-;4039:6;4092:2;4080:9;4071:7;4067:23;4063:32;4060:52;;;4108:1;4105;4098:12;4060:52;4140:9;4134:16;4159:28;4181:5;4159:28;:::i;4222:245::-;4280:6;4333:2;4321:9;4312:7;4308:23;4304:32;4301:52;;;4349:1;4346;4339:12;4301:52;4388:9;4375:23;4407:30;4431:5;4407:30;:::i;4472:249::-;4541:6;4594:2;4582:9;4573:7;4569:23;4565:32;4562:52;;;4610:1;4607;4600:12;4562:52;4642:9;4636:16;4661:30;4685:5;4661:30;:::i;4726:539::-;4812:6;4820;4873:2;4861:9;4852:7;4848:23;4844:32;4841:52;;;4889:1;4886;4879:12;4841:52;4929:9;4916:23;-1:-1:-1;;;;;4999:2:1;4991:6;4988:14;4985:34;;;5015:1;5012;5005:12;4985:34;5038:49;5079:7;5070:6;5059:9;5055:22;5038:49;:::i;:::-;5028:59;;5140:2;5129:9;5125:18;5112:32;5096:48;;5169:2;5159:8;5156:16;5153:36;;;5185:1;5182;5175:12;5153:36;;5208:51;5251:7;5240:8;5229:9;5225:24;5208:51;:::i;:::-;5198:61;;;4726:539;;;;;:::o;5945:321::-;6014:6;6067:2;6055:9;6046:7;6042:23;6038:32;6035:52;;;6083:1;6080;6073:12;6035:52;6123:9;6110:23;-1:-1:-1;;;;;6148:6:1;6145:30;6142:50;;;6188:1;6185;6178:12;6142:50;6211:49;6252:7;6243:6;6232:9;6228:22;6211:49;:::i;6271:180::-;6330:6;6383:2;6371:9;6362:7;6358:23;6354:32;6351:52;;;6399:1;6396;6389:12;6351:52;-1:-1:-1;6422:23:1;;6271:180;-1:-1:-1;6271:180:1:o;6456:184::-;6526:6;6579:2;6567:9;6558:7;6554:23;6550:32;6547:52;;;6595:1;6592;6585:12;6547:52;-1:-1:-1;6618:16:1;;6456:184;-1:-1:-1;6456:184:1:o;6645:608::-;6741:6;6749;6757;6810:2;6798:9;6789:7;6785:23;6781:32;6778:52;;;6826:1;6823;6816:12;6778:52;6862:9;6849:23;6839:33;;6923:2;6912:9;6908:18;6895:32;-1:-1:-1;;;;;6987:2:1;6979:6;6976:14;6973:34;;;7003:1;7000;6993:12;6973:34;7026:49;7067:7;7058:6;7047:9;7043:22;7026:49;:::i;:::-;7016:59;;7128:2;7117:9;7113:18;7100:32;7084:48;;7157:2;7147:8;7144:16;7141:36;;;7173:1;7170;7163:12;7141:36;;7196:51;7239:7;7228:8;7217:9;7213:24;7196:51;:::i;:::-;7186:61;;;6645:608;;;;;:::o;7258:393::-;7335:6;7343;7396:2;7384:9;7375:7;7371:23;7367:32;7364:52;;;7412:1;7409;7402:12;7364:52;7435:28;7453:9;7435:28;:::i;:::-;7425:38;;7514:2;7503:9;7499:18;7486:32;-1:-1:-1;;;;;7533:6:1;7530:30;7527:50;;;7573:1;7570;7563:12;7527:50;7596:49;7637:7;7628:6;7617:9;7613:22;7596:49;:::i;7656:256::-;7722:6;7730;7783:2;7771:9;7762:7;7758:23;7754:32;7751:52;;;7799:1;7796;7789:12;7751:52;7822:28;7840:9;7822:28;:::i;7917:257::-;7958:3;7996:5;7990:12;8023:6;8018:3;8011:19;8039:63;8095:6;8088:4;8083:3;8079:14;8072:4;8065:5;8061:16;8039:63;:::i;:::-;8156:2;8135:15;-1:-1:-1;;8131:29:1;8122:39;;;;8163:4;8118:50;;7917:257;-1:-1:-1;;7917:257:1:o;8179:397::-;8393:26;8389:31;8380:6;8376:2;8372:15;8368:53;8363:3;8356:66;8338:3;8451:6;8445:13;8467:62;8522:6;8517:2;8512:3;8508:12;8501:4;8493:6;8489:17;8467:62;:::i;:::-;8549:16;;;;8567:2;8545:25;;8179:397;-1:-1:-1;;;8179:397:1:o;8581:274::-;8710:3;8748:6;8742:13;8764:53;8810:6;8805:3;8798:4;8790:6;8786:17;8764:53;:::i;:::-;8833:16;;;;;8581:274;-1:-1:-1;;8581:274:1:o;9141:637::-;9421:3;9459:6;9453:13;9475:53;9521:6;9516:3;9509:4;9501:6;9497:17;9475:53;:::i;:::-;9591:13;;9550:16;;;;9613:57;9591:13;9550:16;9647:4;9635:17;;9613:57;:::i;:::-;-1:-1:-1;;;9692:20:1;;9721:22;;;9770:1;9759:13;;9141:637;-1:-1:-1;;;;9141:637:1:o;11131:488::-;-1:-1:-1;;;;;11400:15:1;;;11382:34;;11452:15;;11447:2;11432:18;;11425:43;11499:2;11484:18;;11477:34;;;11547:3;11542:2;11527:18;;11520:31;;;11325:4;;11568:45;;11593:19;;11585:6;11568:45;:::i;:::-;11560:53;11131:488;-1:-1:-1;;;;;;11131:488:1:o;11903:632::-;12074:2;12126:21;;;12196:13;;12099:18;;;12218:22;;;12045:4;;12074:2;12297:15;;;;12271:2;12256:18;;;12045:4;12340:169;12354:6;12351:1;12348:13;12340:169;;;12415:13;;12403:26;;12484:15;;;;12449:12;;;;12376:1;12369:9;12340:169;;;-1:-1:-1;12526:3:1;;11903:632;-1:-1:-1;;;;;;11903:632:1:o;13135:219::-;13284:2;13273:9;13266:21;13247:4;13304:44;13344:2;13333:9;13329:18;13321:6;13304:44;:::i;15206:402::-;15408:2;15390:21;;;15447:2;15427:18;;;15420:30;15486:34;15481:2;15466:18;;15459:62;-1:-1:-1;;;15552:2:1;15537:18;;15530:36;15598:3;15583:19;;15206:402::o;15613:353::-;15815:2;15797:21;;;15854:2;15834:18;;;15827:30;15893:31;15888:2;15873:18;;15866:59;15957:2;15942:18;;15613:353::o;18327:407::-;18529:2;18511:21;;;18568:2;18548:18;;;18541:30;18607:34;18602:2;18587:18;;18580:62;-1:-1:-1;;;18673:2:1;18658:18;;18651:41;18724:3;18709:19;;18327:407::o;20223:356::-;20425:2;20407:21;;;20444:18;;;20437:30;20503:34;20498:2;20483:18;;20476:62;20570:2;20555:18;;20223:356::o;27028:128::-;27068:3;27099:1;27095:6;27092:1;27089:13;27086:39;;;27105:18;;:::i;:::-;-1:-1:-1;27141:9:1;;27028:128::o;27161:228::-;27200:3;27228:10;27265:2;27262:1;27258:10;27295:2;27292:1;27288:10;27326:3;27322:2;27318:12;27313:3;27310:21;27307:47;;;27334:18;;:::i;:::-;27370:13;;27161:228;-1:-1:-1;;;;27161:228:1:o;27394:120::-;27434:1;27460;27450:35;;27465:18;;:::i;:::-;-1:-1:-1;27499:9:1;;27394:120::o;27519:168::-;27559:7;27625:1;27621;27617:6;27613:14;27610:1;27607:21;27602:1;27595:9;27588:17;27584:45;27581:71;;;27632:18;;:::i;:::-;-1:-1:-1;27672:9:1;;27519:168::o;27692:125::-;27732:4;27760:1;27757;27754:8;27751:34;;;27765:18;;:::i;:::-;-1:-1:-1;27802:9:1;;27692:125::o;27822:221::-;27861:4;27890:10;27950;;;;27920;;27972:12;;;27969:38;;;27987:18;;:::i;:::-;28024:13;;27822:221;-1:-1:-1;;;27822:221:1:o;28048:258::-;28120:1;28130:113;28144:6;28141:1;28138:13;28130:113;;;28220:11;;;28214:18;28201:11;;;28194:39;28166:2;28159:10;28130:113;;;28261:6;28258:1;28255:13;28252:48;;;-1:-1:-1;;28296:1:1;28278:16;;28271:27;28048:258::o;28311:380::-;28390:1;28386:12;;;;28433;;;28454:61;;28508:4;28500:6;28496:17;28486:27;;28454:61;28561:2;28553:6;28550:14;28530:18;28527:38;28524:161;;;28607:10;28602:3;28598:20;28595:1;28588:31;28642:4;28639:1;28632:15;28670:4;28667:1;28660:15;28696:135;28735:3;-1:-1:-1;;28756:17:1;;28753:43;;;28776:18;;:::i;:::-;-1:-1:-1;28823:1:1;28812:13;;28696:135::o;28836:112::-;28868:1;28894;28884:35;;28899:18;;:::i;:::-;-1:-1:-1;28933:9:1;;28836:112::o;28953:127::-;29014:10;29009:3;29005:20;29002:1;28995:31;29045:4;29042:1;29035:15;29069:4;29066:1;29059:15;29085:127;29146:10;29141:3;29137:20;29134:1;29127:31;29177:4;29174:1;29167:15;29201:4;29198:1;29191:15;29217:127;29278:10;29273:3;29269:20;29266:1;29259:31;29309:4;29306:1;29299:15;29333:4;29330:1;29323:15;29349:127;29410:10;29405:3;29401:20;29398:1;29391:31;29441:4;29438:1;29431:15;29465:4;29462:1;29455:15;29481:131;-1:-1:-1;;;;;29556:31:1;;29546:42;;29536:70;;29602:1;29599;29592:12;29617:118;29703:5;29696:13;29689:21;29682:5;29679:32;29669:60;;29725:1;29722;29715:12;29740:131;-1:-1:-1;;;;;;29814:32:1;;29804:43;;29794:71;;29861:1;29858;29851:12

Swarm Source

ipfs://0bd8836aee8367821d73a1feb5a6b3ad995b409f1625459fc391aa27f26f75c5
Loading...
Loading
Loading...
Loading
[ 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.