ETH Price: $2,285.86 (+0.40%)

Token

BFFs Founders Pass (BFFs Passes)
 

Overview

Max Total Supply

87 BFFs Passes

Holders

34

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
seaniatwain.eth
Balance
4 BFFs Passes
0xb9102f00f087bb12ad1aea832a11a288891260a6
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
BFFsFoundersPass

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-07-08
*/

/**
 *Submitted for verification at Etherscan.io on 2022-07-08
*/

// SPDX-License-Identifier: MIT
//
//░██▄▒▄▀▄▒█▀▄░▀█▀░▀░▄▀▀░░▒█▀▒▄▀▄▒█▀▄░█▄▒▄█░░▒█▀▒█▀▄▒██▀░█▄░█░▄▀▀
//▒█▄█░█▀█░█▀▄░▒█▒░░▒▄██▒░░█▀░█▀█░█▀▄░█▒▀▒█▒░░█▀░█▀▄░█▄▄░█▒▀█▒▄██
                  

//******************************************************************@@@***********
//***********************************@@@@@@@@@&******************@@,  @***********
//****************************#@@@@@@@@@@@@@@@@@,/@@@@/******&@@.    @@***********
//******@@@@***************@@@@@@@@@@@@@@@@@@@@%       @@@@@        @@************
//******@@   @@@@*******@@@@@@@@@@&,,%@@@@@@@%            @@&      @@*************
//*******@@        @@@@@(                                   @@*.#@@***************
//********&@(        @@                                   @@@@@@@@@@@@@***********
//**********(@@     @@.                             @@@(   (@@@@@       @@********
//**************@@@@@.    .@@@@@@     @@@ @@      &@@@&@@    @@@@%@@@@@@**********
//**********@@@.   @@.   @@@@@@@@     @@@@@@       #@@@@     .@@@*****************
//*******@@%     @@@@   %@@@@@@@@@              ,/(((*          @*****************
//*********%@@@@***@@    @@@@@@@@@@     @@@@@,,,,,,,,,,,,(@@@@ /@*****************
//******************@%.      @@@@&  (@@,,,,,,,,,,,,,,,,,,,,,,,(@@/****************
//******************#@            @@*,,,,,,,(@,,,,,,,,@@@@,,,,,,*@(***************
//*******************(@* .       @@,,,,,,,,&@@@,,,,,,,,(#,,,,,,,,@@***************
//********************/@@.       @@,,,,,*,,,,,,,,,,,,,,,,,,,,,,,,@@***************
//***********************@@@     @@,,,,,@@@@@@@@@@@@,,,,,,,,,,,(@@****************
//***************************@@@@@@@%,,,*@@@@@@@@@@,,,,,,,,,@@@*******************
//***********************************@@@@#,,,,,,,,,(&@@@@@%***********************

// contract by @ZombieBitsNFT

//https://founders-pass.bartsfarmfrens.io

//Exclusive Access OG Pass to unlock airdrops & extra perks at the farm


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


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @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/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/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: @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/extensions/IERC721Enumerable.sol


// OpenZeppelin Contracts (last updated v4.5.0) (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);

    /**
     * @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/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/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/cryptography/MerkleProof.sol


// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

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

// File: @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/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;
    }
}


pragma solidity ^0.8.0;


/**ERC721A import
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Assumes the number of issuable tokens (collection size) is capped and fits in a uint128.
 *
 * Does not support burning tokens to address(0).
 */
contract ERC721A is
  Context,
  ERC165,
  IERC721,
  IERC721Metadata,
  IERC721Enumerable
{
  using Address for address;
  using Strings for uint256;

  struct TokenOwnership {
    address addr;
    uint64 startTimestamp;
  }

  struct AddressData {
    uint128 balance;
    uint128 numberMinted;
  }

  uint256 private currentIndex = 0;

  uint256 internal immutable collectionSize;
  uint256 internal immutable maxBatchSize;

  // 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) private _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;

  /**
   * @dev
   * `maxBatchSize` refers to how much a minter can mint at a time.
   * `collectionSize_` refers to how many tokens are in the collection.
   */
  constructor(
    string memory name_,
    string memory symbol_,
    uint256 maxBatchSize_,
    uint256 collectionSize_
  ) {
    require(
      collectionSize_ > 0,
      "ERC721A: collection must have a nonzero supply"
    );
    require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero");
    _name = name_;
    _symbol = symbol_;
    maxBatchSize = maxBatchSize_;
    collectionSize = collectionSize_;
  }

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

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

  /**
   * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
   * This read function is O(collectionSize). If calling from a separate contract, be sure to test gas first.
   * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
   */
  function tokenOfOwnerByIndex(address owner, uint256 index)
    public
    view
    override
    returns (uint256)
  {
    require(index < balanceOf(owner), "ERC721A: owner index out of bounds");
    uint256 numMintedSoFar = totalSupply();
    uint256 tokenIdsIdx = 0;
    address currOwnershipAddr = address(0);
    for (uint256 i = 0; i < numMintedSoFar; i++) {
      TokenOwnership memory ownership = _ownerships[i];
      if (ownership.addr != address(0)) {
        currOwnershipAddr = ownership.addr;
      }
      if (currOwnershipAddr == owner) {
        if (tokenIdsIdx == index) {
          return i;
        }
        tokenIdsIdx++;
      }
    }
    revert("ERC721A: unable to get token of owner by index");
  }

  /**
   * @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 ||
      interfaceId == type(IERC721Enumerable).interfaceId ||
      super.supportsInterface(interfaceId);
  }

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

  function _numberMinted(address owner) internal view returns (uint256) {
    require(
      owner != address(0),
      "ERC721A: number minted query for the zero address"
    );
    return uint256(_addressData[owner].numberMinted);
  }

  function ownershipOf(uint256 tokenId)
    internal
    view
    returns (TokenOwnership memory)
  {
    require(_exists(tokenId), "ERC721A: owner query for nonexistent token");

    uint256 lowestTokenToCheck;
    if (tokenId >= maxBatchSize) {
      lowestTokenToCheck = tokenId - maxBatchSize + 1;
    }

    for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) {
      TokenOwnership memory ownership = _ownerships[curr];
      if (ownership.addr != address(0)) {
        return ownership;
      }
    }

    revert("ERC721A: unable to determine the owner of token");
  }

  /**
   * @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)
  {
    require(
      _exists(tokenId),
      "ERC721Metadata: URI query for nonexistent token"
    );

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

  /**
   * @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);
    require(to != owner, "ERC721A: approval to current owner");

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

    _approve(to, tokenId, owner);
  }

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

    return _tokenApprovals[tokenId];
  }

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

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

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

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

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

  /**
   * @dev See {IERC721-safeTransferFrom}.
   */
  function safeTransferFrom(
    address from,
    address to,
    uint256 tokenId,
    bytes memory _data
  ) public override {
    _transfer(from, to, tokenId);
    require(
      _checkOnERC721Received(from, to, tokenId, _data),
      "ERC721A: transfer to non ERC721Receiver implementer"
    );
  }

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

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

  /**
   * @dev Mints `quantity` tokens and transfers them to `to`.
   *
   * Requirements:
   *
   * - there must be `quantity` tokens remaining unminted in the total collection.
   * - `to` cannot be the zero address.
   * - `quantity` cannot be larger than the max batch size.
   *
   * Emits a {Transfer} event.
   */
  function _safeMint(
    address to,
    uint256 quantity,
    bytes memory _data
  ) internal {
    uint256 startTokenId = currentIndex;
    require(to != address(0), "ERC721A: mint to the zero address");
    // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering.
    require(!_exists(startTokenId), "ERC721A: token already minted");
    require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high");

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

    AddressData memory addressData = _addressData[to];
    _addressData[to] = AddressData(
      addressData.balance + uint128(quantity),
      addressData.numberMinted + uint128(quantity)
    );
    _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp));

    uint256 updatedIndex = startTokenId;

    for (uint256 i = 0; i < quantity; i++) {
      emit Transfer(address(0), to, updatedIndex);
      require(
        _checkOnERC721Received(address(0), to, updatedIndex, _data),
        "ERC721A: transfer to non ERC721Receiver implementer"
      );
      updatedIndex++;
    }

    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 ||
      getApproved(tokenId) == _msgSender() ||
      isApprovedForAll(prevOwnership.addr, _msgSender()));

    require(
      isApprovedOrOwner,
      "ERC721A: transfer caller is not owner nor approved"
    );

    require(
      prevOwnership.addr == from,
      "ERC721A: transfer from incorrect owner"
    );
    require(to != address(0), "ERC721A: transfer to the zero address");

    _beforeTokenTransfers(from, to, tokenId, 1);

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

    _addressData[from].balance -= 1;
    _addressData[to].balance += 1;
    _ownerships[tokenId] = TokenOwnership(to, 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)) {
      if (_exists(nextTokenId)) {
        _ownerships[nextTokenId] = TokenOwnership(
          prevOwnership.addr,
          prevOwnership.startTimestamp
        );
      }
    }

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

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

  uint256 public nextOwnerToExplicitlySet = 0;

  /**
   * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf().
   */
  function _setOwnersExplicit(uint256 quantity) internal {
    uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet;
    require(quantity > 0, "quantity must be nonzero");
    uint256 endIndex = oldNextOwnerToSet + quantity - 1;
    if (endIndex > collectionSize - 1) {
      endIndex = collectionSize - 1;
    }
    // We know if the last one in the group exists, all in the group exist, due to serial ordering.
    require(_exists(endIndex), "not enough minted yet for this cleanup");
    for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) {
      if (_ownerships[i].addr == address(0)) {
        TokenOwnership memory ownership = ownershipOf(i);
        _ownerships[i] = TokenOwnership(
          ownership.addr,
          ownership.startTimestamp
        );
      }
    }
    nextOwnerToExplicitlySet = endIndex + 1;
  }

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

  /**
   * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
   *
   * 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`.
   */
  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.
   *
   * 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` and `to` are never both zero.
   */
  function _afterTokenTransfers(
    address from,
    address to,
    uint256 startTokenId,
    uint256 quantity
  ) internal virtual {}
}
//
//░██▄▒▄▀▄▒█▀▄░▀█▀░▀░▄▀▀░░▒█▀▒▄▀▄▒█▀▄░█▄▒▄█░░▒█▀▒█▀▄▒██▀░█▄░█░▄▀▀
//▒█▄█░█▀█░█▀▄░▒█▒░░▒▄██▒░░█▀░█▀█░█▀▄░█▒▀▒█▒░░█▀░█▀▄░█▄▄░█▒▀█▒▄██


library OpenSeaGasFreeListing {
    /**
    @notice Returns whether the operator is an OpenSea proxy for the owner, thus
    allowing it to list without the token owner paying gas.
    @dev ERC{721,1155}.isApprovedForAll should be overriden to also check if
    this function returns true.
     */
    function isApprovedForAll(address owner, address operator) internal view returns (bool) {
        ProxyRegistry registry;
        assembly {
            switch chainid()
            case 1 {
                // mainnet
                registry := 0xa5409ec958c83c3f309868babaca7c86dcb077c1
            }
            case 4 {
                // rinkeby
                registry := 0xf57b2c51ded3a29e6891aba85459d600256cf317
            }
        }

        return address(registry) != address(0) && (address(registry.proxies(owner)) == operator);
    }
}

contract OwnableDelegateProxy {}

contract ProxyRegistry {
    mapping(address => OwnableDelegateProxy) public proxies;
}


contract BFFsFoundersPass is Ownable, ERC721A, ReentrancyGuard {

    using Address for address;
    using Strings for uint256;

    //allows for team reserves 
    uint256 public MAX_TEAM_RESERVES_PRESALE = 44;
    //sets total max supply of 444 passes
    uint256 public immutable MAX_TOKENS;
    //OG presale token price
    uint256 public OG_TOKEN_PRICE = 0.00 ether;
    //public token price
    uint256 public TOKEN_PRICE = 0.04 ether;
    //max mints per tx during the public mint
    uint256 public MAX_MINTS_PER_TX = 50;

    bool public preSale = false;
    bool public publicSale = false;

//tracks amount a user can claim
    mapping (address => uint256) public presaleReserved;

//tracks how many a user has claimed
    mapping (address => uint) public saleNumMinted;

    bytes32 public merkleroot;


    constructor(
    uint256 maxBatchSize_,
    uint256 collectionSize_,
    uint256 maxTOKENS_
  ) ERC721A("BFFs Founders Pass","BFFs Passes", maxBatchSize_,collectionSize_) {
    MAX_MINTS_PER_TX = maxBatchSize_;
    MAX_TOKENS = maxTOKENS_;
    require(
        maxTOKENS_ <= collectionSize_,
        "larger collection size needed"
    );   
  }

  modifier callerIsUser() {
    require(tx.origin == msg.sender, "The caller is another contract");
    _;
  }
 


//minting function for the presale OG claim
    function OGclaim(uint256 quantity, bytes32[] calldata PresaleMerkleProof) external payable callerIsUser nonReentrant {
        require(preSale, "pre sale is not live");
        require(totalSupply() + quantity <= MAX_TOKENS, "minting this many would exceed supply");
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        require(MerkleProof.verify(PresaleMerkleProof, merkleroot, leaf), "Invalid proof.");
        _checkPreMintRequirements(quantity);
        _safeMint(msg.sender, quantity);
    }

    function _checkPreMintRequirements(uint256 quantity) internal {
        require(quantity > 0 && quantity <= presaleReserved[msg.sender], "invalid quantity: zero or greater than mint allowance");
        require(msg.value == OG_TOKEN_PRICE * quantity, "wrong amount of ether sent");
        saleNumMinted[msg.sender] = saleNumMinted[msg.sender] + quantity;
        require(saleNumMinted[msg.sender] <= presaleReserved[msg.sender], "Cannot mint more than your allowance");
}

//public mint function
    function mint(uint256 quantity) external payable callerIsUser nonReentrant {
        require(publicSale, "public sale is not live");
        require(totalSupply() + quantity <= MAX_TOKENS, "invalid quantity: would exceed max supply");
        _checkMintRequirements(quantity);
        _safeMint(msg.sender, quantity);
    }

    function _checkMintRequirements(uint256 quantity) internal {
        require(quantity > 0 && quantity <= MAX_MINTS_PER_TX, "invalid quantity: zero or greater than mint allowance");
        require(msg.value == TOKEN_PRICE * quantity, "wrong amount of ether sent");

    }
//admin minting function for team tokens
    function teamReservesPreSaleMint(uint256 quantity) public onlyOwner {
        require(quantity <= MAX_TEAM_RESERVES_PRESALE, "Can't reserve more than set amount" );
        MAX_TEAM_RESERVES_PRESALE -= quantity;
        require(totalSupply() + quantity <= MAX_TOKENS, "invalid quantity: would exceed max supply");
        _safeMint(msg.sender, quantity);
    }

    function togglePreSale() public onlyOwner {
        preSale = !preSale;
    }

    function togglePublicSale() public onlyOwner {
        publicSale = !publicSale;
    }

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

    function setOwnersExplicit(uint256 quantity) external onlyOwner nonReentrant {
    _setOwnersExplicit(quantity);
  }

    // // metadata URI
    string private _baseTokenURI;

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

    function setBaseURI(string calldata baseURI) external onlyOwner {
    _baseTokenURI = baseURI;
  } 

    function setMAX_MINTS_PER_TX(uint256 _MAX_MINTS_PER_TX) public onlyOwner() {
    MAX_MINTS_PER_TX = _MAX_MINTS_PER_TX;
    }

    function setTOKEN_PRICE(uint256 _TOKEN_PRICE) public onlyOwner() {
    TOKEN_PRICE = _TOKEN_PRICE;
    }

    // Edit reserved presale spots
  function editPresaleReserved(address[] memory _a, uint256[] memory _amount) public onlyOwner {
    for(uint256 i; i < _a.length; i++){
    presaleReserved[_a[i]] = _amount[i];
    }
  }

   function setMerkleRoot(bytes32 newMerkle) public onlyOwner {
    merkleroot = newMerkle;
    }

    function isApprovedForAll(address owner, address operator) public view override returns (bool) {
        return OpenSeaGasFreeListing.isApprovedForAll(owner, operator) || super.isApprovedForAll(owner, operator);
    }

    function getOwnershipData(uint256 tokenId)
    external
    view
    returns (TokenOwnership memory)
  {
    return ownershipOf(tokenId);
  }

  function withdrawMoney() external onlyOwner nonReentrant {
    (bool success, ) = msg.sender.call{value: address(this).balance}("");
    require(success, "Transfer failed.");
  }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"maxBatchSize_","type":"uint256"},{"internalType":"uint256","name":"collectionSize_","type":"uint256"},{"internalType":"uint256","name":"maxTOKENS_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_MINTS_PER_TX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TEAM_RESERVES_PRESALE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OG_TOKEN_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32[]","name":"PresaleMerkleProof","type":"bytes32[]"}],"name":"OGclaim","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"TOKEN_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"address[]","name":"_a","type":"address[]"},{"internalType":"uint256[]","name":"_amount","type":"uint256[]"}],"name":"editPresaleReserved","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"}],"internalType":"struct ERC721A.TokenOwnership","name":"","type":"tuple"}],"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":"merkleroot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"presaleReserved","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"saleNumMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_MAX_MINTS_PER_TX","type":"uint256"}],"name":"setMAX_MINTS_PER_TX","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"newMerkle","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"setOwnersExplicit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_TOKEN_PRICE","type":"uint256"}],"name":"setTOKEN_PRICE","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"teamReservesPreSaleMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePreSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawMoney","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60e0604052600060018190556008819055602c600a55600b55668e1bc9bf040000600c556032600d55600e805461ffff191690553480156200004057600080fd5b50604051620035d2380380620035d2833981016040819052620000639162000338565b604051806040016040528060128152602001714246467320466f756e64657273205061737360701b8152506040518060400160405280600b81526020016a424646732050617373657360a81b8152508484620000ce620000c86200023e60201b60201c565b62000242565b600081116200013b5760405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060448201526d6e6f6e7a65726f20737570706c7960901b60648201526084015b60405180910390fd5b600082116200019d5760405162461bcd60e51b815260206004820152602760248201527f455243373231413a206d61782062617463682073697a65206d757374206265206044820152666e6f6e7a65726f60c81b606482015260840162000132565b8351620001b290600290602087019062000292565b508251620001c890600390602086019062000292565b5060a09190915260805250506001600955600d83905560c081905281811115620002355760405162461bcd60e51b815260206004820152601d60248201527f6c617267657220636f6c6c656374696f6e2073697a65206e6565646564000000604482015260640162000132565b505050620003a4565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054620002a09062000367565b90600052602060002090601f016020900481019282620002c457600085556200030f565b82601f10620002df57805160ff19168380011785556200030f565b828001600101855582156200030f579182015b828111156200030f578251825591602001919060010190620002f2565b506200031d92915062000321565b5090565b5b808211156200031d576000815560010162000322565b6000806000606084860312156200034e57600080fd5b8351925060208401519150604084015190509250925092565b600181811c908216806200037c57607f821691505b602082108114156200039e57634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c0516131d4620003fe600039600081816107bf01528181610b55015281816111c90152611354015260008181611f7401528181611f9e015261264f015260008181611d7a0152611dac01526131d46000f3fe6080604052600436106102675760003560e01c8063715018a611610144578063c6a91b42116100b6578063da40760a1161007a578063da40760a1461070b578063dc33e68114610738578063e222c7f914610758578063e985e9c51461076d578063f2fde38b1461078d578063f47c84c5146107ad57600080fd5b8063c6a91b4214610694578063c87b56dd146106aa578063ca3cb522146106ca578063d2d8cb67146106df578063d7224ba0146106f557600080fd5b806395d89b411161010857806395d89b4114610601578063a0712d6814610616578063a22cb46514610629578063ac44600214610649578063b6c7ecf51461065e578063b88d4fde1461067457600080fd5b8063715018a6146105415780637a37744a146105565780637cb64759146105765780638da5cb5b146105965780639231ab2a146105b457600080fd5b806339c36fa0116101dd5780635a7adf7f116101a15780635a7adf7f146104915780636352211e146104ab57806364be5287146104cb57806368df66a6146104eb5780636b2fd8651461050157806370a082311461052157600080fd5b806339c36fa0146103e457806342842e0e146104115780634f4342e2146104315780634f6ccce71461045157806355f804b31461047157600080fd5b80631bbaa8ec1161022f5780631bbaa8ec1461033c57806323b872dd146103525780632bd1c94e146103725780632d20fb60146103855780632f745c59146103a557806333bc1c5c146103c557600080fd5b806301ffc9a71461026c57806306fdde03146102a1578063081812fc146102c3578063095ea7b3146102fb57806318160ddd1461031d575b600080fd5b34801561027857600080fd5b5061028c610287366004612c08565b6107e1565b60405190151581526020015b60405180910390f35b3480156102ad57600080fd5b506102b661084e565b6040516102989190612df6565b3480156102cf57600080fd5b506102e36102de366004612bef565b6108e0565b6040516001600160a01b039091168152602001610298565b34801561030757600080fd5b5061031b610316366004612afb565b610970565b005b34801561032957600080fd5b506001545b604051908152602001610298565b34801561034857600080fd5b5061032e600a5481565b34801561035e57600080fd5b5061031b61036d3660046129c4565b610a88565b61031b610380366004612cd0565b610a93565b34801561039157600080fd5b5061031b6103a0366004612bef565b610cb9565b3480156103b157600080fd5b5061032e6103c0366004612afb565b610d1c565b3480156103d157600080fd5b50600e5461028c90610100900460ff1681565b3480156103f057600080fd5b5061032e6103ff36600461296e565b600f6020526000908152604090205481565b34801561041d57600080fd5b5061031b61042c3660046129c4565b610e94565b34801561043d57600080fd5b5061031b61044c366004612bef565b610eaf565b34801561045d57600080fd5b5061032e61046c366004612bef565b610ede565b34801561047d57600080fd5b5061031b61048c366004612c5f565b610f47565b34801561049d57600080fd5b50600e5461028c9060ff1681565b3480156104b757600080fd5b506102e36104c6366004612bef565b610f7d565b3480156104d757600080fd5b5061031b6104e6366004612bef565b610f8f565b3480156104f757600080fd5b5061032e600b5481565b34801561050d57600080fd5b5061031b61051c366004612b27565b610fbe565b34801561052d57600080fd5b5061032e61053c36600461296e565b611063565b34801561054d57600080fd5b5061031b6110f4565b34801561056257600080fd5b5061031b610571366004612bef565b61112a565b34801561058257600080fd5b5061031b610591366004612bef565b611229565b3480156105a257600080fd5b506000546001600160a01b03166102e3565b3480156105c057600080fd5b506105d46105cf366004612bef565b611258565b6040805182516001600160a01b031681526020928301516001600160401b03169281019290925201610298565b34801561060d57600080fd5b506102b6611275565b61031b610624366004612bef565b611284565b34801561063557600080fd5b5061031b610644366004612ac8565b6113b8565b34801561065557600080fd5b5061031b61147d565b34801561066a57600080fd5b5061032e60115481565b34801561068057600080fd5b5061031b61068f366004612a05565b61155a565b3480156106a057600080fd5b5061032e600d5481565b3480156106b657600080fd5b506102b66106c5366004612bef565b611593565b3480156106d657600080fd5b5061031b611660565b3480156106eb57600080fd5b5061032e600c5481565b34801561070157600080fd5b5061032e60085481565b34801561071757600080fd5b5061032e61072636600461296e565b60106020526000908152604090205481565b34801561074457600080fd5b5061032e61075336600461296e565b61169e565b34801561076457600080fd5b5061031b6116a9565b34801561077957600080fd5b5061028c61078836600461298b565b6116f0565b34801561079957600080fd5b5061031b6107a836600461296e565b611730565b3480156107b957600080fd5b5061032e7f000000000000000000000000000000000000000000000000000000000000000081565b60006001600160e01b031982166380ac58cd60e01b148061081257506001600160e01b03198216635b5e139f60e01b145b8061082d57506001600160e01b0319821663780e9d6360e01b145b8061084857506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606002805461085d906130b1565b80601f0160208091040260200160405190810160405280929190818152602001828054610889906130b1565b80156108d65780601f106108ab576101008083540402835291602001916108d6565b820191906000526020600020905b8154815290600101906020018083116108b957829003601f168201915b5050505050905090565b60006108ed826001541190565b6109545760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084015b60405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061097b82610f7d565b9050806001600160a01b0316836001600160a01b031614156109ea5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b606482015260840161094b565b336001600160a01b0382161480610a065750610a0681336116f0565b610a785760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000606482015260840161094b565b610a838383836117c8565b505050565b610a83838383611824565b323314610ae25760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000604482015260640161094b565b60026009541415610b055760405162461bcd60e51b815260040161094b90612eda565b6002600955600e5460ff16610b535760405162461bcd60e51b81526020600482015260146024820152737072652073616c65206973206e6f74206c69766560601b604482015260640161094b565b7f000000000000000000000000000000000000000000000000000000000000000083610b7e60015490565b610b889190612fe4565b1115610be45760405162461bcd60e51b815260206004820152602560248201527f6d696e74696e672074686973206d616e7920776f756c642065786365656420736044820152647570706c7960d81b606482015260840161094b565b6040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050610c5e838380806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506011549150849050611baa565b610c9b5760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b210383937b7b31760911b604482015260640161094b565b610ca484611bc0565b610cae3385611ceb565b505060016009555050565b6000546001600160a01b03163314610ce35760405162461bcd60e51b815260040161094b90612e52565b60026009541415610d065760405162461bcd60e51b815260040161094b90612eda565b6002600955610d1481611d09565b506001600955565b6000610d2783611063565b8210610d805760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b606482015260840161094b565b6000610d8b60015490565b905060008060005b83811015610e34576000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b03169183019190915215610de557805192505b876001600160a01b0316836001600160a01b03161415610e215786841415610e135750935061084892505050565b83610e1d816130ec565b9450505b5080610e2c816130ec565b915050610d93565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b606482015260840161094b565b610a838383836040518060200160405280600081525061155a565b6000546001600160a01b03163314610ed95760405162461bcd60e51b815260040161094b90612e52565b600d55565b6000610ee960015490565b8210610f435760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b606482015260840161094b565b5090565b6000546001600160a01b03163314610f715760405162461bcd60e51b815260040161094b90612e52565b610a836012838361286c565b6000610f8882611ef2565b5192915050565b6000546001600160a01b03163314610fb95760405162461bcd60e51b815260040161094b90612e52565b600c55565b6000546001600160a01b03163314610fe85760405162461bcd60e51b815260040161094b90612e52565b60005b8251811015610a835781818151811061100657611006613147565b6020026020010151600f600085848151811061102457611024613147565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002081905550808061105b906130ec565b915050610feb565b60006001600160a01b0382166110cf5760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b606482015260840161094b565b506001600160a01b03166000908152600560205260409020546001600160801b031690565b6000546001600160a01b0316331461111e5760405162461bcd60e51b815260040161094b90612e52565b611128600061209b565b565b6000546001600160a01b031633146111545760405162461bcd60e51b815260040161094b90612e52565b600a548111156111b15760405162461bcd60e51b815260206004820152602260248201527f43616e27742072657365727665206d6f7265207468616e2073657420616d6f756044820152611b9d60f21b606482015260840161094b565b80600a60008282546111c39190613057565b909155507f00000000000000000000000000000000000000000000000000000000000000009050816111f460015490565b6111fe9190612fe4565b111561121c5760405162461bcd60e51b815260040161094b90612e09565b6112263382611ceb565b50565b6000546001600160a01b031633146112535760405162461bcd60e51b815260040161094b90612e52565b601155565b604080518082019091526000808252602082015261084882611ef2565b60606003805461085d906130b1565b3233146112d35760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000604482015260640161094b565b600260095414156112f65760405162461bcd60e51b815260040161094b90612eda565b6002600955600e54610100900460ff166113525760405162461bcd60e51b815260206004820152601760248201527f7075626c69632073616c65206973206e6f74206c697665000000000000000000604482015260640161094b565b7f00000000000000000000000000000000000000000000000000000000000000008161137d60015490565b6113879190612fe4565b11156113a55760405162461bcd60e51b815260040161094b90612e09565b6113ae816120eb565b610d143382611ceb565b6001600160a01b0382163314156114115760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c6572000000000000604482015260640161094b565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000546001600160a01b031633146114a75760405162461bcd60e51b815260040161094b90612e52565b600260095414156114ca5760405162461bcd60e51b815260040161094b90612eda565b6002600955604051600090339047908381818185875af1925050503d8060008114611511576040519150601f19603f3d011682016040523d82523d6000602084013e611516565b606091505b5050905080610d145760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b604482015260640161094b565b611565848484611824565b61157184848484612175565b61158d5760405162461bcd60e51b815260040161094b90612e87565b50505050565b60606115a0826001541190565b6116045760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161094b565b600061160e612283565b9050600081511161162e5760405180602001604052806000815250611659565b8061163884612292565b604051602001611649929190612d7a565b6040516020818303038152906040525b9392505050565b6000546001600160a01b0316331461168a5760405162461bcd60e51b815260040161094b90612e52565b600e805460ff19811660ff90911615179055565b60006108488261238f565b6000546001600160a01b031633146116d35760405162461bcd60e51b815260040161094b90612e52565b600e805461ff001981166101009182900460ff1615909102179055565b60006116fc838361242d565b8061165957506001600160a01b0380841660009081526007602090815260408083209386168352929052205460ff16611659565b6000546001600160a01b0316331461175a5760405162461bcd60e51b815260040161094b90612e52565b6001600160a01b0381166117bf5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161094b565b6112268161209b565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061182f82611ef2565b80519091506000906001600160a01b0316336001600160a01b0316148061186657503361185b846108e0565b6001600160a01b0316145b806118785750815161187890336116f0565b9050806118e25760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606482015260840161094b565b846001600160a01b031682600001516001600160a01b0316146119565760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b606482015260840161094b565b6001600160a01b0384166119ba5760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b606482015260840161094b565b6119ca60008484600001516117c8565b6001600160a01b03851660009081526005602052604081208054600192906119fc9084906001600160801b031661302f565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b03861660009081526005602052604081208054600194509092611a4891859116612fb9565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b0380871682526001600160401b03428116602080850191825260008981526004909152948520935184549151909216600160a01b026001600160e01b03199091169190921617179055611acf846001612fe4565b6000818152600460205260409020549091506001600160a01b0316611b6057611af9816001541190565b15611b605760408051808201825284516001600160a01b0390811682526020808701516001600160401b039081168285019081526000878152600490935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b600082611bb7858461251e565b14949350505050565b600081118015611bdf5750336000908152600f60205260409020548111155b611bfb5760405162461bcd60e51b815260040161094b90612f11565b80600b54611c099190613010565b3414611c575760405162461bcd60e51b815260206004820152601a60248201527f77726f6e6720616d6f756e74206f662065746865722073656e74000000000000604482015260640161094b565b33600090815260106020526040902054611c72908290612fe4565b336000908152601060208181526040808420859055600f825290922054915210156112265760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f74206d696e74206d6f7265207468616e20796f757220616c6c6f77604482015263616e636560e01b606482015260840161094b565b611d05828260405180602001604052806000815250612592565b5050565b60085481611d595760405162461bcd60e51b815260206004820152601860248201527f7175616e74697479206d757374206265206e6f6e7a65726f0000000000000000604482015260640161094b565b60006001611d678484612fe4565b611d719190613057565b9050611d9e60017f0000000000000000000000000000000000000000000000000000000000000000613057565b811115611dd357611dd060017f0000000000000000000000000000000000000000000000000000000000000000613057565b90505b611dde816001541190565b611e395760405162461bcd60e51b815260206004820152602660248201527f6e6f7420656e6f756768206d696e7465642079657420666f722074686973206360448201526506c65616e75760d41b606482015260840161094b565b815b818111611ede576000818152600460205260409020546001600160a01b0316611ecc576000611e6982611ef2565b60408051808201825282516001600160a01b0390811682526020938401516001600160401b039081168584019081526000888152600490965293909420915182549351909416600160a01b026001600160e01b0319909316931692909217179055505b80611ed6816130ec565b915050611e3b565b50611eea816001612fe4565b600855505050565b6040805180820190915260008082526020820152611f11826001541190565b611f705760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b606482015260840161094b565b60007f00000000000000000000000000000000000000000000000000000000000000008310611fd157611fc37f000000000000000000000000000000000000000000000000000000000000000084613057565b611fce906001612fe4565b90505b825b81811061203a576000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b0316918301919091521561202757949350505050565b50806120328161309a565b915050611fd3565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b606482015260840161094b565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000811180156120fd5750600d548111155b6121195760405162461bcd60e51b815260040161094b90612f11565b80600c546121279190613010565b34146112265760405162461bcd60e51b815260206004820152601a60248201527f77726f6e6720616d6f756e74206f662065746865722073656e74000000000000604482015260640161094b565b60006001600160a01b0384163b1561227757604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906121b9903390899088908890600401612db9565b602060405180830381600087803b1580156121d357600080fd5b505af1925050508015612203575060408051601f3d908101601f1916820190925261220091810190612c25565b60015b61225d573d808015612231576040519150601f19603f3d011682016040523d82523d6000602084013e612236565b606091505b5080516122555760405162461bcd60e51b815260040161094b90612e87565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061227b565b5060015b949350505050565b60606012805461085d906130b1565b6060816122b65750506040805180820190915260018152600360fc1b602082015290565b8160005b81156122e057806122ca816130ec565b91506122d99050600a83612ffc565b91506122ba565b6000816001600160401b038111156122fa576122fa61315d565b6040519080825280601f01601f191660200182016040528015612324576020820181803683370190505b5090505b841561227b57612339600183613057565b9150612346600a86613107565b612351906030612fe4565b60f81b81838151811061236657612366613147565b60200101906001600160f81b031916908160001a905350612388600a86612ffc565b9450612328565b60006001600160a01b0382166124015760405162461bcd60e51b815260206004820152603160248201527f455243373231413a206e756d626572206d696e74656420717565727920666f7260448201527020746865207a65726f206164647265737360781b606482015260840161094b565b506001600160a01b0316600090815260056020526040902054600160801b90046001600160801b031690565b600080466001811461244657600481146124625761247a565b73a5409ec958c83c3f309868babaca7c86dcb077c1915061247a565b73f57b2c51ded3a29e6891aba85459d600256cf31791505b506001600160a01b0381161580159061227b575060405163c455279160e01b81526001600160a01b038581166004830152808516919083169063c45527919060240160206040518083038186803b1580156124d457600080fd5b505afa1580156124e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061250c9190612c42565b6001600160a01b031614949350505050565b600081815b845181101561258a57600085828151811061254057612540613147565b602002602001015190508083116125665760008381526020829052604090209250612577565b600081815260208490526040902092505b5080612582816130ec565b915050612523565b509392505050565b6001546001600160a01b0384166125f55760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b606482015260840161094b565b612600816001541190565b1561264d5760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e746564000000604482015260640161094b565b7f00000000000000000000000000000000000000000000000000000000000000008311156126c85760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b606482015260840161094b565b6001600160a01b0384166000908152600560209081526040918290208251808401845290546001600160801b038082168352600160801b9091041691810191909152815180830190925280519091908190612724908790612fb9565b6001600160801b031681526020018583602001516127429190612fb9565b6001600160801b039081169091526001600160a01b0380881660008181526005602090815260408083208751978301518716600160801b029790961696909617909455845180860186529182526001600160401b034281168386019081528883526004909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b858110156128615760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46128256000888488612175565b6128415760405162461bcd60e51b815260040161094b90612e87565b8161284b816130ec565b9250508080612859906130ec565b9150506127d8565b506001819055611ba2565b828054612878906130b1565b90600052602060002090601f01602090048101928261289a57600085556128e0565b82601f106128b35782800160ff198235161785556128e0565b828001600101855582156128e0579182015b828111156128e05782358255916020019190600101906128c5565b50610f439291505b80821115610f4357600081556001016128e8565b600082601f83011261290d57600080fd5b8135602061292261291d83612f96565b612f66565b80838252828201915082860187848660051b890101111561294257600080fd5b60005b8581101561296157813584529284019290840190600101612945565b5090979650505050505050565b60006020828403121561298057600080fd5b813561165981613173565b6000806040838503121561299e57600080fd5b82356129a981613173565b915060208301356129b981613173565b809150509250929050565b6000806000606084860312156129d957600080fd5b83356129e481613173565b925060208401356129f481613173565b929592945050506040919091013590565b60008060008060808587031215612a1b57600080fd5b8435612a2681613173565b9350602085810135612a3781613173565b93506040860135925060608601356001600160401b0380821115612a5a57600080fd5b818801915088601f830112612a6e57600080fd5b813581811115612a8057612a8061315d565b612a92601f8201601f19168501612f66565b91508082528984828501011115612aa857600080fd5b808484018584013760008482840101525080935050505092959194509250565b60008060408385031215612adb57600080fd5b8235612ae681613173565b9150602083013580151581146129b957600080fd5b60008060408385031215612b0e57600080fd5b8235612b1981613173565b946020939093013593505050565b60008060408385031215612b3a57600080fd5b82356001600160401b0380821115612b5157600080fd5b818501915085601f830112612b6557600080fd5b81356020612b7561291d83612f96565b8083825282820191508286018a848660051b8901011115612b9557600080fd5b600096505b84871015612bc1578035612bad81613173565b835260019690960195918301918301612b9a565b5096505086013592505080821115612bd857600080fd5b50612be5858286016128fc565b9150509250929050565b600060208284031215612c0157600080fd5b5035919050565b600060208284031215612c1a57600080fd5b813561165981613188565b600060208284031215612c3757600080fd5b815161165981613188565b600060208284031215612c5457600080fd5b815161165981613173565b60008060208385031215612c7257600080fd5b82356001600160401b0380821115612c8957600080fd5b818501915085601f830112612c9d57600080fd5b813581811115612cac57600080fd5b866020828501011115612cbe57600080fd5b60209290920196919550909350505050565b600080600060408486031215612ce557600080fd5b8335925060208401356001600160401b0380821115612d0357600080fd5b818601915086601f830112612d1757600080fd5b813581811115612d2657600080fd5b8760208260051b8501011115612d3b57600080fd5b6020830194508093505050509250925092565b60008151808452612d6681602086016020860161306e565b601f01601f19169290920160200192915050565b60008351612d8c81846020880161306e565b835190830190612da081836020880161306e565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612dec90830184612d4e565b9695505050505050565b6020815260006116596020830184612d4e565b60208082526029908201527f696e76616c6964207175616e746974793a20776f756c6420657863656564206d604082015268617820737570706c7960b81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526035908201527f696e76616c6964207175616e746974793a207a65726f206f722067726561746560408201527472207468616e206d696e7420616c6c6f77616e636560581b606082015260800190565b604051601f8201601f191681016001600160401b0381118282101715612f8e57612f8e61315d565b604052919050565b60006001600160401b03821115612faf57612faf61315d565b5060051b60200190565b60006001600160801b03808316818516808303821115612fdb57612fdb61311b565b01949350505050565b60008219821115612ff757612ff761311b565b500190565b60008261300b5761300b613131565b500490565b600081600019048311821515161561302a5761302a61311b565b500290565b60006001600160801b038381169083168181101561304f5761304f61311b565b039392505050565b6000828210156130695761306961311b565b500390565b60005b83811015613089578181015183820152602001613071565b8381111561158d5750506000910152565b6000816130a9576130a961311b565b506000190190565b600181811c908216806130c557607f821691505b602082108114156130e657634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156131005761310061311b565b5060010190565b60008261311657613116613131565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461122657600080fd5b6001600160e01b03198116811461122657600080fdfea2646970667358221220adc615eaedc7871f09cafa516aad30df61026199d0c897684c960518b6717ef764736f6c63430008070033000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000001bc00000000000000000000000000000000000000000000000000000000000001bc

Deployed Bytecode

0x6080604052600436106102675760003560e01c8063715018a611610144578063c6a91b42116100b6578063da40760a1161007a578063da40760a1461070b578063dc33e68114610738578063e222c7f914610758578063e985e9c51461076d578063f2fde38b1461078d578063f47c84c5146107ad57600080fd5b8063c6a91b4214610694578063c87b56dd146106aa578063ca3cb522146106ca578063d2d8cb67146106df578063d7224ba0146106f557600080fd5b806395d89b411161010857806395d89b4114610601578063a0712d6814610616578063a22cb46514610629578063ac44600214610649578063b6c7ecf51461065e578063b88d4fde1461067457600080fd5b8063715018a6146105415780637a37744a146105565780637cb64759146105765780638da5cb5b146105965780639231ab2a146105b457600080fd5b806339c36fa0116101dd5780635a7adf7f116101a15780635a7adf7f146104915780636352211e146104ab57806364be5287146104cb57806368df66a6146104eb5780636b2fd8651461050157806370a082311461052157600080fd5b806339c36fa0146103e457806342842e0e146104115780634f4342e2146104315780634f6ccce71461045157806355f804b31461047157600080fd5b80631bbaa8ec1161022f5780631bbaa8ec1461033c57806323b872dd146103525780632bd1c94e146103725780632d20fb60146103855780632f745c59146103a557806333bc1c5c146103c557600080fd5b806301ffc9a71461026c57806306fdde03146102a1578063081812fc146102c3578063095ea7b3146102fb57806318160ddd1461031d575b600080fd5b34801561027857600080fd5b5061028c610287366004612c08565b6107e1565b60405190151581526020015b60405180910390f35b3480156102ad57600080fd5b506102b661084e565b6040516102989190612df6565b3480156102cf57600080fd5b506102e36102de366004612bef565b6108e0565b6040516001600160a01b039091168152602001610298565b34801561030757600080fd5b5061031b610316366004612afb565b610970565b005b34801561032957600080fd5b506001545b604051908152602001610298565b34801561034857600080fd5b5061032e600a5481565b34801561035e57600080fd5b5061031b61036d3660046129c4565b610a88565b61031b610380366004612cd0565b610a93565b34801561039157600080fd5b5061031b6103a0366004612bef565b610cb9565b3480156103b157600080fd5b5061032e6103c0366004612afb565b610d1c565b3480156103d157600080fd5b50600e5461028c90610100900460ff1681565b3480156103f057600080fd5b5061032e6103ff36600461296e565b600f6020526000908152604090205481565b34801561041d57600080fd5b5061031b61042c3660046129c4565b610e94565b34801561043d57600080fd5b5061031b61044c366004612bef565b610eaf565b34801561045d57600080fd5b5061032e61046c366004612bef565b610ede565b34801561047d57600080fd5b5061031b61048c366004612c5f565b610f47565b34801561049d57600080fd5b50600e5461028c9060ff1681565b3480156104b757600080fd5b506102e36104c6366004612bef565b610f7d565b3480156104d757600080fd5b5061031b6104e6366004612bef565b610f8f565b3480156104f757600080fd5b5061032e600b5481565b34801561050d57600080fd5b5061031b61051c366004612b27565b610fbe565b34801561052d57600080fd5b5061032e61053c36600461296e565b611063565b34801561054d57600080fd5b5061031b6110f4565b34801561056257600080fd5b5061031b610571366004612bef565b61112a565b34801561058257600080fd5b5061031b610591366004612bef565b611229565b3480156105a257600080fd5b506000546001600160a01b03166102e3565b3480156105c057600080fd5b506105d46105cf366004612bef565b611258565b6040805182516001600160a01b031681526020928301516001600160401b03169281019290925201610298565b34801561060d57600080fd5b506102b6611275565b61031b610624366004612bef565b611284565b34801561063557600080fd5b5061031b610644366004612ac8565b6113b8565b34801561065557600080fd5b5061031b61147d565b34801561066a57600080fd5b5061032e60115481565b34801561068057600080fd5b5061031b61068f366004612a05565b61155a565b3480156106a057600080fd5b5061032e600d5481565b3480156106b657600080fd5b506102b66106c5366004612bef565b611593565b3480156106d657600080fd5b5061031b611660565b3480156106eb57600080fd5b5061032e600c5481565b34801561070157600080fd5b5061032e60085481565b34801561071757600080fd5b5061032e61072636600461296e565b60106020526000908152604090205481565b34801561074457600080fd5b5061032e61075336600461296e565b61169e565b34801561076457600080fd5b5061031b6116a9565b34801561077957600080fd5b5061028c61078836600461298b565b6116f0565b34801561079957600080fd5b5061031b6107a836600461296e565b611730565b3480156107b957600080fd5b5061032e7f00000000000000000000000000000000000000000000000000000000000001bc81565b60006001600160e01b031982166380ac58cd60e01b148061081257506001600160e01b03198216635b5e139f60e01b145b8061082d57506001600160e01b0319821663780e9d6360e01b145b8061084857506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606002805461085d906130b1565b80601f0160208091040260200160405190810160405280929190818152602001828054610889906130b1565b80156108d65780601f106108ab576101008083540402835291602001916108d6565b820191906000526020600020905b8154815290600101906020018083116108b957829003601f168201915b5050505050905090565b60006108ed826001541190565b6109545760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084015b60405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061097b82610f7d565b9050806001600160a01b0316836001600160a01b031614156109ea5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b606482015260840161094b565b336001600160a01b0382161480610a065750610a0681336116f0565b610a785760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000606482015260840161094b565b610a838383836117c8565b505050565b610a83838383611824565b323314610ae25760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000604482015260640161094b565b60026009541415610b055760405162461bcd60e51b815260040161094b90612eda565b6002600955600e5460ff16610b535760405162461bcd60e51b81526020600482015260146024820152737072652073616c65206973206e6f74206c69766560601b604482015260640161094b565b7f00000000000000000000000000000000000000000000000000000000000001bc83610b7e60015490565b610b889190612fe4565b1115610be45760405162461bcd60e51b815260206004820152602560248201527f6d696e74696e672074686973206d616e7920776f756c642065786365656420736044820152647570706c7960d81b606482015260840161094b565b6040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050610c5e838380806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506011549150849050611baa565b610c9b5760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b210383937b7b31760911b604482015260640161094b565b610ca484611bc0565b610cae3385611ceb565b505060016009555050565b6000546001600160a01b03163314610ce35760405162461bcd60e51b815260040161094b90612e52565b60026009541415610d065760405162461bcd60e51b815260040161094b90612eda565b6002600955610d1481611d09565b506001600955565b6000610d2783611063565b8210610d805760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b606482015260840161094b565b6000610d8b60015490565b905060008060005b83811015610e34576000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b03169183019190915215610de557805192505b876001600160a01b0316836001600160a01b03161415610e215786841415610e135750935061084892505050565b83610e1d816130ec565b9450505b5080610e2c816130ec565b915050610d93565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b606482015260840161094b565b610a838383836040518060200160405280600081525061155a565b6000546001600160a01b03163314610ed95760405162461bcd60e51b815260040161094b90612e52565b600d55565b6000610ee960015490565b8210610f435760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b606482015260840161094b565b5090565b6000546001600160a01b03163314610f715760405162461bcd60e51b815260040161094b90612e52565b610a836012838361286c565b6000610f8882611ef2565b5192915050565b6000546001600160a01b03163314610fb95760405162461bcd60e51b815260040161094b90612e52565b600c55565b6000546001600160a01b03163314610fe85760405162461bcd60e51b815260040161094b90612e52565b60005b8251811015610a835781818151811061100657611006613147565b6020026020010151600f600085848151811061102457611024613147565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002081905550808061105b906130ec565b915050610feb565b60006001600160a01b0382166110cf5760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b606482015260840161094b565b506001600160a01b03166000908152600560205260409020546001600160801b031690565b6000546001600160a01b0316331461111e5760405162461bcd60e51b815260040161094b90612e52565b611128600061209b565b565b6000546001600160a01b031633146111545760405162461bcd60e51b815260040161094b90612e52565b600a548111156111b15760405162461bcd60e51b815260206004820152602260248201527f43616e27742072657365727665206d6f7265207468616e2073657420616d6f756044820152611b9d60f21b606482015260840161094b565b80600a60008282546111c39190613057565b909155507f00000000000000000000000000000000000000000000000000000000000001bc9050816111f460015490565b6111fe9190612fe4565b111561121c5760405162461bcd60e51b815260040161094b90612e09565b6112263382611ceb565b50565b6000546001600160a01b031633146112535760405162461bcd60e51b815260040161094b90612e52565b601155565b604080518082019091526000808252602082015261084882611ef2565b60606003805461085d906130b1565b3233146112d35760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000604482015260640161094b565b600260095414156112f65760405162461bcd60e51b815260040161094b90612eda565b6002600955600e54610100900460ff166113525760405162461bcd60e51b815260206004820152601760248201527f7075626c69632073616c65206973206e6f74206c697665000000000000000000604482015260640161094b565b7f00000000000000000000000000000000000000000000000000000000000001bc8161137d60015490565b6113879190612fe4565b11156113a55760405162461bcd60e51b815260040161094b90612e09565b6113ae816120eb565b610d143382611ceb565b6001600160a01b0382163314156114115760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c6572000000000000604482015260640161094b565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000546001600160a01b031633146114a75760405162461bcd60e51b815260040161094b90612e52565b600260095414156114ca5760405162461bcd60e51b815260040161094b90612eda565b6002600955604051600090339047908381818185875af1925050503d8060008114611511576040519150601f19603f3d011682016040523d82523d6000602084013e611516565b606091505b5050905080610d145760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b604482015260640161094b565b611565848484611824565b61157184848484612175565b61158d5760405162461bcd60e51b815260040161094b90612e87565b50505050565b60606115a0826001541190565b6116045760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161094b565b600061160e612283565b9050600081511161162e5760405180602001604052806000815250611659565b8061163884612292565b604051602001611649929190612d7a565b6040516020818303038152906040525b9392505050565b6000546001600160a01b0316331461168a5760405162461bcd60e51b815260040161094b90612e52565b600e805460ff19811660ff90911615179055565b60006108488261238f565b6000546001600160a01b031633146116d35760405162461bcd60e51b815260040161094b90612e52565b600e805461ff001981166101009182900460ff1615909102179055565b60006116fc838361242d565b8061165957506001600160a01b0380841660009081526007602090815260408083209386168352929052205460ff16611659565b6000546001600160a01b0316331461175a5760405162461bcd60e51b815260040161094b90612e52565b6001600160a01b0381166117bf5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161094b565b6112268161209b565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061182f82611ef2565b80519091506000906001600160a01b0316336001600160a01b0316148061186657503361185b846108e0565b6001600160a01b0316145b806118785750815161187890336116f0565b9050806118e25760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606482015260840161094b565b846001600160a01b031682600001516001600160a01b0316146119565760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b606482015260840161094b565b6001600160a01b0384166119ba5760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b606482015260840161094b565b6119ca60008484600001516117c8565b6001600160a01b03851660009081526005602052604081208054600192906119fc9084906001600160801b031661302f565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b03861660009081526005602052604081208054600194509092611a4891859116612fb9565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b0380871682526001600160401b03428116602080850191825260008981526004909152948520935184549151909216600160a01b026001600160e01b03199091169190921617179055611acf846001612fe4565b6000818152600460205260409020549091506001600160a01b0316611b6057611af9816001541190565b15611b605760408051808201825284516001600160a01b0390811682526020808701516001600160401b039081168285019081526000878152600490935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b600082611bb7858461251e565b14949350505050565b600081118015611bdf5750336000908152600f60205260409020548111155b611bfb5760405162461bcd60e51b815260040161094b90612f11565b80600b54611c099190613010565b3414611c575760405162461bcd60e51b815260206004820152601a60248201527f77726f6e6720616d6f756e74206f662065746865722073656e74000000000000604482015260640161094b565b33600090815260106020526040902054611c72908290612fe4565b336000908152601060208181526040808420859055600f825290922054915210156112265760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f74206d696e74206d6f7265207468616e20796f757220616c6c6f77604482015263616e636560e01b606482015260840161094b565b611d05828260405180602001604052806000815250612592565b5050565b60085481611d595760405162461bcd60e51b815260206004820152601860248201527f7175616e74697479206d757374206265206e6f6e7a65726f0000000000000000604482015260640161094b565b60006001611d678484612fe4565b611d719190613057565b9050611d9e60017f00000000000000000000000000000000000000000000000000000000000001bc613057565b811115611dd357611dd060017f00000000000000000000000000000000000000000000000000000000000001bc613057565b90505b611dde816001541190565b611e395760405162461bcd60e51b815260206004820152602660248201527f6e6f7420656e6f756768206d696e7465642079657420666f722074686973206360448201526506c65616e75760d41b606482015260840161094b565b815b818111611ede576000818152600460205260409020546001600160a01b0316611ecc576000611e6982611ef2565b60408051808201825282516001600160a01b0390811682526020938401516001600160401b039081168584019081526000888152600490965293909420915182549351909416600160a01b026001600160e01b0319909316931692909217179055505b80611ed6816130ec565b915050611e3b565b50611eea816001612fe4565b600855505050565b6040805180820190915260008082526020820152611f11826001541190565b611f705760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b606482015260840161094b565b60007f00000000000000000000000000000000000000000000000000000000000000328310611fd157611fc37f000000000000000000000000000000000000000000000000000000000000003284613057565b611fce906001612fe4565b90505b825b81811061203a576000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b0316918301919091521561202757949350505050565b50806120328161309a565b915050611fd3565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b606482015260840161094b565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000811180156120fd5750600d548111155b6121195760405162461bcd60e51b815260040161094b90612f11565b80600c546121279190613010565b34146112265760405162461bcd60e51b815260206004820152601a60248201527f77726f6e6720616d6f756e74206f662065746865722073656e74000000000000604482015260640161094b565b60006001600160a01b0384163b1561227757604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906121b9903390899088908890600401612db9565b602060405180830381600087803b1580156121d357600080fd5b505af1925050508015612203575060408051601f3d908101601f1916820190925261220091810190612c25565b60015b61225d573d808015612231576040519150601f19603f3d011682016040523d82523d6000602084013e612236565b606091505b5080516122555760405162461bcd60e51b815260040161094b90612e87565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061227b565b5060015b949350505050565b60606012805461085d906130b1565b6060816122b65750506040805180820190915260018152600360fc1b602082015290565b8160005b81156122e057806122ca816130ec565b91506122d99050600a83612ffc565b91506122ba565b6000816001600160401b038111156122fa576122fa61315d565b6040519080825280601f01601f191660200182016040528015612324576020820181803683370190505b5090505b841561227b57612339600183613057565b9150612346600a86613107565b612351906030612fe4565b60f81b81838151811061236657612366613147565b60200101906001600160f81b031916908160001a905350612388600a86612ffc565b9450612328565b60006001600160a01b0382166124015760405162461bcd60e51b815260206004820152603160248201527f455243373231413a206e756d626572206d696e74656420717565727920666f7260448201527020746865207a65726f206164647265737360781b606482015260840161094b565b506001600160a01b0316600090815260056020526040902054600160801b90046001600160801b031690565b600080466001811461244657600481146124625761247a565b73a5409ec958c83c3f309868babaca7c86dcb077c1915061247a565b73f57b2c51ded3a29e6891aba85459d600256cf31791505b506001600160a01b0381161580159061227b575060405163c455279160e01b81526001600160a01b038581166004830152808516919083169063c45527919060240160206040518083038186803b1580156124d457600080fd5b505afa1580156124e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061250c9190612c42565b6001600160a01b031614949350505050565b600081815b845181101561258a57600085828151811061254057612540613147565b602002602001015190508083116125665760008381526020829052604090209250612577565b600081815260208490526040902092505b5080612582816130ec565b915050612523565b509392505050565b6001546001600160a01b0384166125f55760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b606482015260840161094b565b612600816001541190565b1561264d5760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e746564000000604482015260640161094b565b7f00000000000000000000000000000000000000000000000000000000000000328311156126c85760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b606482015260840161094b565b6001600160a01b0384166000908152600560209081526040918290208251808401845290546001600160801b038082168352600160801b9091041691810191909152815180830190925280519091908190612724908790612fb9565b6001600160801b031681526020018583602001516127429190612fb9565b6001600160801b039081169091526001600160a01b0380881660008181526005602090815260408083208751978301518716600160801b029790961696909617909455845180860186529182526001600160401b034281168386019081528883526004909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b858110156128615760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46128256000888488612175565b6128415760405162461bcd60e51b815260040161094b90612e87565b8161284b816130ec565b9250508080612859906130ec565b9150506127d8565b506001819055611ba2565b828054612878906130b1565b90600052602060002090601f01602090048101928261289a57600085556128e0565b82601f106128b35782800160ff198235161785556128e0565b828001600101855582156128e0579182015b828111156128e05782358255916020019190600101906128c5565b50610f439291505b80821115610f4357600081556001016128e8565b600082601f83011261290d57600080fd5b8135602061292261291d83612f96565b612f66565b80838252828201915082860187848660051b890101111561294257600080fd5b60005b8581101561296157813584529284019290840190600101612945565b5090979650505050505050565b60006020828403121561298057600080fd5b813561165981613173565b6000806040838503121561299e57600080fd5b82356129a981613173565b915060208301356129b981613173565b809150509250929050565b6000806000606084860312156129d957600080fd5b83356129e481613173565b925060208401356129f481613173565b929592945050506040919091013590565b60008060008060808587031215612a1b57600080fd5b8435612a2681613173565b9350602085810135612a3781613173565b93506040860135925060608601356001600160401b0380821115612a5a57600080fd5b818801915088601f830112612a6e57600080fd5b813581811115612a8057612a8061315d565b612a92601f8201601f19168501612f66565b91508082528984828501011115612aa857600080fd5b808484018584013760008482840101525080935050505092959194509250565b60008060408385031215612adb57600080fd5b8235612ae681613173565b9150602083013580151581146129b957600080fd5b60008060408385031215612b0e57600080fd5b8235612b1981613173565b946020939093013593505050565b60008060408385031215612b3a57600080fd5b82356001600160401b0380821115612b5157600080fd5b818501915085601f830112612b6557600080fd5b81356020612b7561291d83612f96565b8083825282820191508286018a848660051b8901011115612b9557600080fd5b600096505b84871015612bc1578035612bad81613173565b835260019690960195918301918301612b9a565b5096505086013592505080821115612bd857600080fd5b50612be5858286016128fc565b9150509250929050565b600060208284031215612c0157600080fd5b5035919050565b600060208284031215612c1a57600080fd5b813561165981613188565b600060208284031215612c3757600080fd5b815161165981613188565b600060208284031215612c5457600080fd5b815161165981613173565b60008060208385031215612c7257600080fd5b82356001600160401b0380821115612c8957600080fd5b818501915085601f830112612c9d57600080fd5b813581811115612cac57600080fd5b866020828501011115612cbe57600080fd5b60209290920196919550909350505050565b600080600060408486031215612ce557600080fd5b8335925060208401356001600160401b0380821115612d0357600080fd5b818601915086601f830112612d1757600080fd5b813581811115612d2657600080fd5b8760208260051b8501011115612d3b57600080fd5b6020830194508093505050509250925092565b60008151808452612d6681602086016020860161306e565b601f01601f19169290920160200192915050565b60008351612d8c81846020880161306e565b835190830190612da081836020880161306e565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612dec90830184612d4e565b9695505050505050565b6020815260006116596020830184612d4e565b60208082526029908201527f696e76616c6964207175616e746974793a20776f756c6420657863656564206d604082015268617820737570706c7960b81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526035908201527f696e76616c6964207175616e746974793a207a65726f206f722067726561746560408201527472207468616e206d696e7420616c6c6f77616e636560581b606082015260800190565b604051601f8201601f191681016001600160401b0381118282101715612f8e57612f8e61315d565b604052919050565b60006001600160401b03821115612faf57612faf61315d565b5060051b60200190565b60006001600160801b03808316818516808303821115612fdb57612fdb61311b565b01949350505050565b60008219821115612ff757612ff761311b565b500190565b60008261300b5761300b613131565b500490565b600081600019048311821515161561302a5761302a61311b565b500290565b60006001600160801b038381169083168181101561304f5761304f61311b565b039392505050565b6000828210156130695761306961311b565b500390565b60005b83811015613089578181015183820152602001613071565b8381111561158d5750506000910152565b6000816130a9576130a961311b565b506000190190565b600181811c908216806130c557607f821691505b602082108114156130e657634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156131005761310061311b565b5060010190565b60008261311657613116613131565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461122657600080fd5b6001600160e01b03198116811461122657600080fdfea2646970667358221220adc615eaedc7871f09cafa516aad30df61026199d0c897684c960518b6717ef764736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000001bc00000000000000000000000000000000000000000000000000000000000001bc

-----Decoded View---------------
Arg [0] : maxBatchSize_ (uint256): 50
Arg [1] : collectionSize_ (uint256): 444
Arg [2] : maxTOKENS_ (uint256): 444

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000032
Arg [1] : 00000000000000000000000000000000000000000000000000000000000001bc
Arg [2] : 00000000000000000000000000000000000000000000000000000000000001bc


Deployed Bytecode Sourcemap

48634:5307:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34918:370;;;;;;;;;;-1:-1:-1;34918:370:0;;;;;:::i;:::-;;:::i;:::-;;;9541:14:1;;9534:22;9516:41;;9504:2;9489:18;34918:370:0;;;;;;;;36644:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;38177:204::-;;;;;;;;;;-1:-1:-1;38177:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;8839:32:1;;;8821:51;;8809:2;8794:18;38177:204:0;8675:203:1;37740:379:0;;;;;;;;;;-1:-1:-1;37740:379:0;;;;;:::i;:::-;;:::i;:::-;;33479:94;;;;;;;;;;-1:-1:-1;33555:12:0;;33479:94;;;9714:25:1;;;9702:2;9687:18;33479:94:0;9568:177:1;48805:45:0;;;;;;;;;;;;;;;;39027:142;;;;;;;;;;-1:-1:-1;39027:142:0;;;;;:::i;:::-;;:::i;50012:522::-;;;;;;:::i;:::-;;:::i;52381:118::-;;;;;;;;;;-1:-1:-1;52381:118:0;;;;;:::i;:::-;;:::i;34110:744::-;;;;;;;;;;-1:-1:-1;34110:744:0;;;;;:::i;:::-;;:::i;49219:30::-;;;;;;;;;;-1:-1:-1;49219:30:0;;;;;;;;;;;49292:51;;;;;;;;;;-1:-1:-1;49292:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;39232:157;;;;;;;;;;-1:-1:-1;39232:157:0;;;;;:::i;:::-;;:::i;52793:126::-;;;;;;;;;;-1:-1:-1;52793:126:0;;;;;:::i;:::-;;:::i;33642:177::-;;;;;;;;;;-1:-1:-1;33642:177:0;;;;;:::i;:::-;;:::i;52684:100::-;;;;;;;;;;-1:-1:-1;52684:100:0;;;;;:::i;:::-;;:::i;49185:27::-;;;;;;;;;;-1:-1:-1;49185:27:0;;;;;;;;36467:118;;;;;;;;;;-1:-1:-1;36467:118:0;;;;;:::i;:::-;;:::i;52927:106::-;;;;;;;;;;-1:-1:-1;52927:106:0;;;;;:::i;:::-;;:::i;48972:42::-;;;;;;;;;;;;;;;;53075:189;;;;;;;;;;-1:-1:-1;53075:189:0;;;;;:::i;:::-;;:::i;35344:211::-;;;;;;;;;;-1:-1:-1;35344:211:0;;;;;:::i;:::-;;:::i;27623:103::-;;;;;;;;;;;;;:::i;51710:365::-;;;;;;;;;;-1:-1:-1;51710:365:0;;;;;:::i;:::-;;:::i;53271:96::-;;;;;;;;;;-1:-1:-1;53271:96:0;;;;;:::i;:::-;;:::i;26972:87::-;;;;;;;;;;-1:-1:-1;27018:7:0;27045:6;-1:-1:-1;;;;;27045:6:0;26972:87;;53602:147;;;;;;;;;;-1:-1:-1;53602:147:0;;;;;:::i;:::-;;:::i;:::-;;;;23949:13:1;;-1:-1:-1;;;;;23945:39:1;23927:58;;24045:4;24033:17;;;24027:24;-1:-1:-1;;;;;24023:49:1;24001:20;;;23994:79;;;;23900:18;53602:147:0;23719:360:1;36799:98:0;;;;;;;;;;;;;:::i;51051:328::-;;;;;;:::i;:::-;;:::i;38445:274::-;;;;;;;;;;-1:-1:-1;38445:274:0;;;;;:::i;:::-;;:::i;53755:181::-;;;;;;;;;;;;;:::i;49445:25::-;;;;;;;;;;;;;;;;39452:311;;;;;;;;;;-1:-1:-1;39452:311:0;;;;;:::i;:::-;;:::i;49140:36::-;;;;;;;;;;;;;;;;36960:402;;;;;;;;;;-1:-1:-1;36960:402:0;;;;;:::i;:::-;;:::i;52083:79::-;;;;;;;;;;;;;:::i;49047:39::-;;;;;;;;;;;;;;;;43867:43;;;;;;;;;;;;;;;;49390:46;;;;;;;;;;-1:-1:-1;49390:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;52266:107;;;;;;;;;;-1:-1:-1;52266:107:0;;;;;:::i;:::-;;:::i;52170:88::-;;;;;;;;;;;;;:::i;53375:219::-;;;;;;;;;;-1:-1:-1;53375:219:0;;;;;:::i;:::-;;:::i;27881:201::-;;;;;;;;;;-1:-1:-1;27881:201:0;;;;;:::i;:::-;;:::i;48900:35::-;;;;;;;;;;;;;;;34918:370;35045:4;-1:-1:-1;;;;;;35075:40:0;;-1:-1:-1;;;35075:40:0;;:99;;-1:-1:-1;;;;;;;35126:48:0;;-1:-1:-1;;;35126:48:0;35075:99;:160;;;-1:-1:-1;;;;;;;35185:50:0;;-1:-1:-1;;;35185:50:0;35075:160;:207;;;-1:-1:-1;;;;;;;;;;13694:40:0;;;35246:36;35061:221;34918:370;-1:-1:-1;;34918:370:0:o;36644:94::-;36698:13;36727:5;36720:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36644:94;:::o;38177:204::-;38245:7;38269:16;38277:7;40089:12;;-1:-1:-1;40079:22:0;40002:105;38269:16;38261:74;;;;-1:-1:-1;;;38261:74:0;;23104:2:1;38261:74:0;;;23086:21:1;23143:2;23123:18;;;23116:30;23182:34;23162:18;;;23155:62;-1:-1:-1;;;23233:18:1;;;23226:43;23286:19;;38261:74:0;;;;;;;;;-1:-1:-1;38351:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;38351:24:0;;38177:204::o;37740:379::-;37809:13;37825:24;37841:7;37825:15;:24::i;:::-;37809:40;;37870:5;-1:-1:-1;;;;;37864:11:0;:2;-1:-1:-1;;;;;37864:11:0;;;37856:58;;;;-1:-1:-1;;;37856:58:0;;18458:2:1;37856:58:0;;;18440:21:1;18497:2;18477:18;;;18470:30;18536:34;18516:18;;;18509:62;-1:-1:-1;;;18587:18:1;;;18580:32;18629:19;;37856:58:0;18256:398:1;37856:58:0;25776:10;-1:-1:-1;;;;;37939:21:0;;;;:62;;-1:-1:-1;37964:37:0;37981:5;25776:10;53375:219;:::i;37964:37::-;37923:153;;;;-1:-1:-1;;;37923:153:0;;13685:2:1;37923:153:0;;;13667:21:1;13724:2;13704:18;;;13697:30;13763:34;13743:18;;;13736:62;13834:27;13814:18;;;13807:55;13879:19;;37923:153:0;13483:421:1;37923:153:0;38085:28;38094:2;38098:7;38107:5;38085:8;:28::i;:::-;37802:317;37740:379;;:::o;39027:142::-;39135:28;39145:4;39151:2;39155:7;39135:9;:28::i;50012:522::-;49882:9;49895:10;49882:23;49874:66;;;;-1:-1:-1;;;49874:66:0;;13326:2:1;49874:66:0;;;13308:21:1;13365:2;13345:18;;;13338:30;13404:32;13384:18;;;13377:60;13454:18;;49874:66:0;13124:354:1;49874:66:0;30252:1:::1;30850:7;;:19;;30842:63;;;;-1:-1:-1::0;;;30842:63:0::1;;;;;;;:::i;:::-;30252:1;30983:7;:18:::0;50148:7:::2;::::0;::::2;;50140:40;;;::::0;-1:-1:-1;;;50140:40:0;;12977:2:1;50140:40:0::2;::::0;::::2;12959:21:1::0;13016:2;12996:18;;;12989:30;-1:-1:-1;;;13035:18:1;;;13028:50;13095:18;;50140:40:0::2;12775:344:1::0;50140:40:0::2;50227:10;50215:8;50199:13;33555:12:::0;;;33479:94;50199:13:::2;:24;;;;:::i;:::-;:38;;50191:88;;;::::0;-1:-1:-1;;;50191:88:0;;16862:2:1;50191:88:0::2;::::0;::::2;16844:21:1::0;16901:2;16881:18;;;16874:30;16940:34;16920:18;;;16913:62;-1:-1:-1;;;16991:18:1;;;16984:35;17036:19;;50191:88:0::2;16660:401:1::0;50191:88:0::2;50315:28;::::0;-1:-1:-1;;50332:10:0::2;7738:2:1::0;7734:15;7730:53;50315:28:0::2;::::0;::::2;7718:66:1::0;50290:12:0::2;::::0;7800::1;;50315:28:0::2;;;;;;;;;;;;50305:39;;;;;;50290:54;;50363:56;50382:18;;50363:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;::::0;;;;-1:-1:-1;;50402:10:0::2;::::0;;-1:-1:-1;50414:4:0;;-1:-1:-1;50363:18:0::2;:56::i;:::-;50355:83;;;::::0;-1:-1:-1;;;50355:83:0;;20386:2:1;50355:83:0::2;::::0;::::2;20368:21:1::0;20425:2;20405:18;;;20398:30;-1:-1:-1;;;20444:18:1;;;20437:44;20498:18;;50355:83:0::2;20184:338:1::0;50355:83:0::2;50449:35;50475:8;50449:25;:35::i;:::-;50495:31;50505:10;50517:8;50495:9;:31::i;:::-;-1:-1:-1::0;;30208:1:0::1;31162:7;:22:::0;-1:-1:-1;;50012:522:0:o;52381:118::-;27018:7;27045:6;-1:-1:-1;;;;;27045:6:0;25776:10;27192:23;27184:68;;;;-1:-1:-1;;;27184:68:0;;;;;;;:::i;:::-;30252:1:::1;30850:7;;:19;;30842:63;;;;-1:-1:-1::0;;;30842:63:0::1;;;;;;;:::i;:::-;30252:1;30983:7;:18:::0;52465:28:::2;52484:8:::0;52465:18:::2;:28::i;:::-;-1:-1:-1::0;30208:1:0::1;31162:7;:22:::0;52381:118::o;34110:744::-;34219:7;34254:16;34264:5;34254:9;:16::i;:::-;34246:5;:24;34238:71;;;;-1:-1:-1;;;34238:71:0;;10176:2:1;34238:71:0;;;10158:21:1;10215:2;10195:18;;;10188:30;10254:34;10234:18;;;10227:62;-1:-1:-1;;;10305:18:1;;;10298:32;10347:19;;34238:71:0;9974:398:1;34238:71:0;34316:22;34341:13;33555:12;;;33479:94;34341:13;34316:38;;34361:19;34391:25;34441:9;34436:350;34460:14;34456:1;:18;34436:350;;;34490:31;34524:14;;;:11;:14;;;;;;;;;34490:48;;;;;;;;;-1:-1:-1;;;;;34490:48:0;;;;;-1:-1:-1;;;34490:48:0;;;-1:-1:-1;;;;;34490:48:0;;;;;;;;34551:28;34547:89;;34612:14;;;-1:-1:-1;34547:89:0;34669:5;-1:-1:-1;;;;;34648:26:0;:17;-1:-1:-1;;;;;34648:26:0;;34644:135;;;34706:5;34691:11;:20;34687:59;;;-1:-1:-1;34733:1:0;-1:-1:-1;34726:8:0;;-1:-1:-1;;;34726:8:0;34687:59;34756:13;;;;:::i;:::-;;;;34644:135;-1:-1:-1;34476:3:0;;;;:::i;:::-;;;;34436:350;;;-1:-1:-1;34792:56:0;;-1:-1:-1;;;34792:56:0;;20729:2:1;34792:56:0;;;20711:21:1;20768:2;20748:18;;;20741:30;20807:34;20787:18;;;20780:62;-1:-1:-1;;;20858:18:1;;;20851:44;20912:19;;34792:56:0;20527:410:1;39232:157:0;39344:39;39361:4;39367:2;39371:7;39344:39;;;;;;;;;;;;:16;:39::i;52793:126::-;27018:7;27045:6;-1:-1:-1;;;;;27045:6:0;25776:10;27192:23;27184:68;;;;-1:-1:-1;;;27184:68:0;;;;;;;:::i;:::-;52875:16:::1;:36:::0;52793:126::o;33642:177::-;33709:7;33741:13;33555:12;;;33479:94;33741:13;33733:5;:21;33725:69;;;;-1:-1:-1;;;33725:69:0;;11749:2:1;33725:69:0;;;11731:21:1;11788:2;11768:18;;;11761:30;11827:34;11807:18;;;11800:62;-1:-1:-1;;;11878:18:1;;;11871:33;11921:19;;33725:69:0;11547:399:1;33725:69:0;-1:-1:-1;33808:5:0;33642:177::o;52684:100::-;27018:7;27045:6;-1:-1:-1;;;;;27045:6:0;25776:10;27192:23;27184:68;;;;-1:-1:-1;;;27184:68:0;;;;;;;:::i;:::-;52755:23:::1;:13;52771:7:::0;;52755:23:::1;:::i;36467:118::-:0;36531:7;36554:20;36566:7;36554:11;:20::i;:::-;:25;;36467:118;-1:-1:-1;;36467:118:0:o;52927:106::-;27018:7;27045:6;-1:-1:-1;;;;;27045:6:0;25776:10;27192:23;27184:68;;;;-1:-1:-1;;;27184:68:0;;;;;;;:::i;:::-;52999:11:::1;:26:::0;52927:106::o;53075:189::-;27018:7;27045:6;-1:-1:-1;;;;;27045:6:0;25776:10;27192:23;27184:68;;;;-1:-1:-1;;;27184:68:0;;;;;;;:::i;:::-;53179:9:::1;53175:84;53194:2;:9;53190:1;:13;53175:84;;;53241:7;53249:1;53241:10;;;;;;;;:::i;:::-;;;;;;;53216:15;:22;53232:2;53235:1;53232:5;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;53216:22:0::1;-1:-1:-1::0;;;;;53216:22:0::1;;;;;;;;;;;;:35;;;;53205:3;;;;;:::i;:::-;;;;53175:84;;35344:211:::0;35408:7;-1:-1:-1;;;;;35432:19:0;;35424:75;;;;-1:-1:-1;;;35424:75:0;;15279:2:1;35424:75:0;;;15261:21:1;15318:2;15298:18;;;15291:30;15357:34;15337:18;;;15330:62;-1:-1:-1;;;15408:18:1;;;15401:41;15459:19;;35424:75:0;15077:407:1;35424:75:0;-1:-1:-1;;;;;;35521:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;35521:27:0;;35344:211::o;27623:103::-;27018:7;27045:6;-1:-1:-1;;;;;27045:6:0;25776:10;27192:23;27184:68;;;;-1:-1:-1;;;27184:68:0;;;;;;;:::i;:::-;27688:30:::1;27715:1;27688:18;:30::i;:::-;27623:103::o:0;51710:365::-;27018:7;27045:6;-1:-1:-1;;;;;27045:6:0;25776:10;27192:23;27184:68;;;;-1:-1:-1;;;27184:68:0;;;;;;;:::i;:::-;51809:25:::1;;51797:8;:37;;51789:85;;;::::0;-1:-1:-1;;;51789:85:0;;16098:2:1;51789:85:0::1;::::0;::::1;16080:21:1::0;16137:2;16117:18;;;16110:30;16176:34;16156:18;;;16149:62;-1:-1:-1;;;16227:18:1;;;16220:32;16269:19;;51789:85:0::1;15896:398:1::0;51789:85:0::1;51914:8;51885:25;;:37;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;51969:10:0::1;::::0;-1:-1:-1;51957:8:0;51941:13:::1;33555:12:::0;;;33479:94;51941:13:::1;:24;;;;:::i;:::-;:38;;51933:92;;;;-1:-1:-1::0;;;51933:92:0::1;;;;;;;:::i;:::-;52036:31;52046:10;52058:8;52036:9;:31::i;:::-;51710:365:::0;:::o;53271:96::-;27018:7;27045:6;-1:-1:-1;;;;;27045:6:0;25776:10;27192:23;27184:68;;;;-1:-1:-1;;;27184:68:0;;;;;;;:::i;:::-;53337:10:::1;:22:::0;53271:96::o;53602:147::-;-1:-1:-1;;;;;;;;;;;;;;;;;53723:20:0;53735:7;53723:11;:20::i;36799:98::-;36855:13;36884:7;36877:14;;;;;:::i;51051:328::-;49882:9;49895:10;49882:23;49874:66;;;;-1:-1:-1;;;49874:66:0;;13326:2:1;49874:66:0;;;13308:21:1;13365:2;13345:18;;;13338:30;13404:32;13384:18;;;13377:60;13454:18;;49874:66:0;13124:354:1;49874:66:0;30252:1:::1;30850:7;;:19;;30842:63;;;;-1:-1:-1::0;;;30842:63:0::1;;;;;;;:::i;:::-;30252:1;30983:7;:18:::0;51145:10:::2;::::0;::::2;::::0;::::2;;;51137:46;;;::::0;-1:-1:-1;;;51137:46:0;;10579:2:1;51137:46:0::2;::::0;::::2;10561:21:1::0;10618:2;10598:18;;;10591:30;10657:25;10637:18;;;10630:53;10700:18;;51137:46:0::2;10377:347:1::0;51137:46:0::2;51230:10;51218:8;51202:13;33555:12:::0;;;33479:94;51202:13:::2;:24;;;;:::i;:::-;:38;;51194:92;;;;-1:-1:-1::0;;;51194:92:0::2;;;;;;;:::i;:::-;51297:32;51320:8;51297:22;:32::i;:::-;51340:31;51350:10;51362:8;51340:9;:31::i;38445:274::-:0;-1:-1:-1;;;;;38536:24:0;;25776:10;38536:24;;38528:63;;;;-1:-1:-1;;;38528:63:0;;17684:2:1;38528:63:0;;;17666:21:1;17723:2;17703:18;;;17696:30;17762:28;17742:18;;;17735:56;17808:18;;38528:63:0;17482:350:1;38528:63:0;25776:10;38600:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;38600:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;38600:53:0;;;;;;;;;;38665:48;;9516:41:1;;;38600:42:0;;25776:10;38665:48;;9489:18:1;38665:48:0;;;;;;;38445:274;;:::o;53755:181::-;27018:7;27045:6;-1:-1:-1;;;;;27045:6:0;25776:10;27192:23;27184:68;;;;-1:-1:-1;;;27184:68:0;;;;;;;:::i;:::-;30252:1:::1;30850:7;;:19;;30842:63;;;;-1:-1:-1::0;;;30842:63:0::1;;;;;;;:::i;:::-;30252:1;30983:7;:18:::0;53838:49:::2;::::0;53820:12:::2;::::0;53838:10:::2;::::0;53861:21:::2;::::0;53820:12;53838:49;53820:12;53838:49;53861:21;53838:10;:49:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53819:68;;;53902:7;53894:36;;;::::0;-1:-1:-1;;;53894:36:0;;18861:2:1;53894:36:0::2;::::0;::::2;18843:21:1::0;18900:2;18880:18;;;18873:30;-1:-1:-1;;;18919:18:1;;;18912:46;18975:18;;53894:36:0::2;18659:340:1::0;39452:311:0;39589:28;39599:4;39605:2;39609:7;39589:9;:28::i;:::-;39640:48;39663:4;39669:2;39673:7;39682:5;39640:22;:48::i;:::-;39624:133;;;;-1:-1:-1;;;39624:133:0;;;;;;;:::i;:::-;39452:311;;;;:::o;36960:402::-;37058:13;37099:16;37107:7;40089:12;;-1:-1:-1;40079:22:0;40002:105;37099:16;37083:97;;;;-1:-1:-1;;;37083:97:0;;17268:2:1;37083:97:0;;;17250:21:1;17307:2;17287:18;;;17280:30;17346:34;17326:18;;;17319:62;-1:-1:-1;;;17397:18:1;;;17390:45;17452:19;;37083:97:0;17066:411:1;37083:97:0;37189:21;37213:10;:8;:10::i;:::-;37189:34;;37268:1;37250:7;37244:21;:25;:112;;;;;;;;;;;;;;;;;37305:7;37314:18;:7;:16;:18::i;:::-;37288:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;37244:112;37230:126;36960:402;-1:-1:-1;;;36960:402:0:o;52083:79::-;27018:7;27045:6;-1:-1:-1;;;;;27045:6:0;25776:10;27192:23;27184:68;;;;-1:-1:-1;;;27184:68:0;;;;;;;:::i;:::-;52147:7:::1;::::0;;-1:-1:-1;;52136:18:0;::::1;52147:7;::::0;;::::1;52146:8;52136:18;::::0;;52083:79::o;52266:107::-;52324:7;52347:20;52361:5;52347:13;:20::i;52170:88::-;27018:7;27045:6;-1:-1:-1;;;;;27045:6:0;25776:10;27192:23;27184:68;;;;-1:-1:-1;;;27184:68:0;;;;;;;:::i;:::-;52240:10:::1;::::0;;-1:-1:-1;;52226:24:0;::::1;52240:10;::::0;;;::::1;;;52239:11;52226:24:::0;;::::1;;::::0;;52170:88::o;53375:219::-;53464:4;53488:55;53527:5;53534:8;53488:38;:55::i;:::-;:98;;;-1:-1:-1;;;;;;38927:25:0;;;38904:4;38927:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;53547:39;38782:186;27881:201;27018:7;27045:6;-1:-1:-1;;;;;27045:6:0;25776:10;27192:23;27184:68;;;;-1:-1:-1;;;27184:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;27970:22:0;::::1;27962:73;;;::::0;-1:-1:-1;;;27962:73:0;;10931:2:1;27962:73:0::1;::::0;::::1;10913:21:1::0;10970:2;10950:18;;;10943:30;11009:34;10989:18;;;10982:62;-1:-1:-1;;;11060:18:1;;;11053:36;11106:19;;27962:73:0::1;10729:402:1::0;27962:73:0::1;28046:28;28065:8;28046:18;:28::i;43689:172::-:0;43786:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;43786:29:0;-1:-1:-1;;;;;43786:29:0;;;;;;;;;43827:28;;43786:24;;43827:28;;;;;;;43689:172;;;:::o;42054:1529::-;42151:35;42189:20;42201:7;42189:11;:20::i;:::-;42260:18;;42151:58;;-1:-1:-1;42218:22:0;;-1:-1:-1;;;;;42244:34:0;25776:10;-1:-1:-1;;;;;42244:34:0;;:81;;;-1:-1:-1;25776:10:0;42289:20;42301:7;42289:11;:20::i;:::-;-1:-1:-1;;;;;42289:36:0;;42244:81;:142;;;-1:-1:-1;42353:18:0;;42336:50;;25776:10;53375:219;:::i;42336:50::-;42218:169;;42412:17;42396:101;;;;-1:-1:-1;;;42396:101:0;;18039:2:1;42396:101:0;;;18021:21:1;18078:2;18058:18;;;18051:30;18117:34;18097:18;;;18090:62;-1:-1:-1;;;18168:18:1;;;18161:48;18226:19;;42396:101:0;17837:414:1;42396:101:0;42544:4;-1:-1:-1;;;;;42522:26:0;:13;:18;;;-1:-1:-1;;;;;42522:26:0;;42506:98;;;;-1:-1:-1;;;42506:98:0;;15691:2:1;42506:98:0;;;15673:21:1;15730:2;15710:18;;;15703:30;15769:34;15749:18;;;15742:62;-1:-1:-1;;;15820:18:1;;;15813:36;15866:19;;42506:98:0;15489:402:1;42506:98:0;-1:-1:-1;;;;;42619:16:0;;42611:66;;;;-1:-1:-1;;;42611:66:0;;12153:2:1;42611:66:0;;;12135:21:1;12192:2;12172:18;;;12165:30;12231:34;12211:18;;;12204:62;-1:-1:-1;;;12282:18:1;;;12275:35;12327:19;;42611:66:0;11951:401:1;42611:66:0;42786:49;42803:1;42807:7;42816:13;:18;;;42786:8;:49::i;:::-;-1:-1:-1;;;;;42844:18:0;;;;;;:12;:18;;;;;:31;;42874:1;;42844:18;:31;;42874:1;;-1:-1:-1;;;;;42844:31:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;42844:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;42882:16:0;;-1:-1:-1;42882:16:0;;;:12;:16;;;;;:29;;-1:-1:-1;;;42882:16:0;;:29;;-1:-1:-1;;42882:29:0;;:::i;:::-;;;-1:-1:-1;;;;;42882:29:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42941:43:0;;;;;;;;-1:-1:-1;;;;;42941:43:0;;;;;-1:-1:-1;;;;;42967:15:0;42941:43;;;;;;;;;-1:-1:-1;42918:20:0;;;:11;:20;;;;;;:66;;;;;;;;;-1:-1:-1;;;42918:66:0;-1:-1:-1;;;;;;42918:66:0;;;;;;;;;;;43234:11;42930:7;-1:-1:-1;43234:11:0;:::i;:::-;43297:1;43256:24;;;:11;:24;;;;;:29;43212:33;;-1:-1:-1;;;;;;43256:29:0;43252:236;;43314:20;43322:11;40089:12;;-1:-1:-1;40079:22:0;40002:105;43314:20;43310:171;;;43374:97;;;;;;;;43401:18;;-1:-1:-1;;;;;43374:97:0;;;;;;43432:28;;;;-1:-1:-1;;;;;43374:97:0;;;;;;;;;-1:-1:-1;43347:24:0;;;:11;:24;;;;;;;:124;;;;;;;;;-1:-1:-1;;;43347:124:0;-1:-1:-1;;;;;;43347:124:0;;;;;;;;;;;;43310:171;43520:7;43516:2;-1:-1:-1;;;;;43501:27:0;43510:4;-1:-1:-1;;;;;43501:27:0;;;;;;;;;;;43535:42;42144:1439;;;42054:1529;;;:::o;23551:190::-;23676:4;23729;23700:25;23713:5;23720:4;23700:12;:25::i;:::-;:33;;23551:190;-1:-1:-1;;;;23551:190:0:o;50542:477::-;50634:1;50623:8;:12;:55;;;;-1:-1:-1;50667:10:0;50651:27;;;;:15;:27;;;;;;50639:39;;;50623:55;50615:121;;;;-1:-1:-1;;;50615:121:0;;;;;;;:::i;:::-;50785:8;50768:14;;:25;;;;:::i;:::-;50755:9;:38;50747:77;;;;-1:-1:-1;;;50747:77:0;;21911:2:1;50747:77:0;;;21893:21:1;21950:2;21930:18;;;21923:30;21989:28;21969:18;;;21962:56;22035:18;;50747:77:0;21709:350:1;50747:77:0;50877:10;50863:25;;;;:13;:25;;;;;;:36;;50891:8;;50863:36;:::i;:::-;50849:10;50835:25;;;;:13;:25;;;;;;;;:64;;;50947:15;:27;;;;;;50918:25;;-1:-1:-1;50918:56:0;50910:105;;;;-1:-1:-1;;;50910:105:0;;14464:2:1;50910:105:0;;;14446:21:1;14503:2;14483:18;;;14476:30;14542:34;14522:18;;;14515:62;-1:-1:-1;;;14593:18:1;;;14586:34;14637:19;;50910:105:0;14262:400:1;40113:98:0;40178:27;40188:2;40192:8;40178:27;;;;;;;;;;;;:9;:27::i;:::-;40113:98;;:::o;44015:846::-;44105:24;;44144:12;44136:49;;;;-1:-1:-1;;;44136:49:0;;14111:2:1;44136:49:0;;;14093:21:1;14150:2;14130:18;;;14123:30;14189:26;14169:18;;;14162:54;14233:18;;44136:49:0;13909:348:1;44136:49:0;44192:16;44242:1;44211:28;44231:8;44211:17;:28;:::i;:::-;:32;;;;:::i;:::-;44192:51;-1:-1:-1;44265:18:0;44282:1;44265:14;:18;:::i;:::-;44254:8;:29;44250:81;;;44305:18;44322:1;44305:14;:18;:::i;:::-;44294:29;;44250:81;44446:17;44454:8;40089:12;;-1:-1:-1;40079:22:0;40002:105;44446:17;44438:68;;;;-1:-1:-1;;;44438:68:0;;21144:2:1;44438:68:0;;;21126:21:1;21183:2;21163:18;;;21156:30;21222:34;21202:18;;;21195:62;-1:-1:-1;;;21273:18:1;;;21266:36;21319:19;;44438:68:0;20942:402:1;44438:68:0;44530:17;44513:297;44554:8;44549:1;:13;44513:297;;44613:1;44582:14;;;:11;:14;;;;;:19;-1:-1:-1;;;;;44582:19:0;44578:225;;44628:31;44662:14;44674:1;44662:11;:14::i;:::-;44704:89;;;;;;;;44731:14;;-1:-1:-1;;;;;44704:89:0;;;;;;44758:24;;;;-1:-1:-1;;;;;44704:89:0;;;;;;;;;-1:-1:-1;44687:14:0;;;:11;:14;;;;;;;:106;;;;;;;;;-1:-1:-1;;;44687:106:0;-1:-1:-1;;;;;;44687:106:0;;;;;;;;;;;;-1:-1:-1;44578:225:0;44564:3;;;;:::i;:::-;;;;44513:297;;;-1:-1:-1;44843:12:0;:8;44854:1;44843:12;:::i;:::-;44816:24;:39;-1:-1:-1;;;44015:846:0:o;35807:606::-;-1:-1:-1;;;;;;;;;;;;;;;;;35924:16:0;35932:7;40089:12;;-1:-1:-1;40079:22:0;40002:105;35924:16;35916:71;;;;-1:-1:-1;;;35916:71:0;;11338:2:1;35916:71:0;;;11320:21:1;11377:2;11357:18;;;11350:30;11416:34;11396:18;;;11389:62;-1:-1:-1;;;11467:18:1;;;11460:40;11517:19;;35916:71:0;11136:406:1;35916:71:0;35996:26;36044:12;36033:7;:23;36029:93;;36088:22;36098:12;36088:7;:22;:::i;:::-;:26;;36113:1;36088:26;:::i;:::-;36067:47;;36029:93;36150:7;36130:212;36167:18;36159:4;:26;36130:212;;36204:31;36238:17;;;:11;:17;;;;;;;;;36204:51;;;;;;;;;-1:-1:-1;;;;;36204:51:0;;;;;-1:-1:-1;;;36204:51:0;;;-1:-1:-1;;;;;36204:51:0;;;;;;;;36268:28;36264:71;;36316:9;35807:606;-1:-1:-1;;;;35807:606:0:o;36264:71::-;-1:-1:-1;36187:6:0;;;;:::i;:::-;;;;36130:212;;;-1:-1:-1;36350:57:0;;-1:-1:-1;;;36350:57:0;;22266:2:1;36350:57:0;;;22248:21:1;22305:2;22285:18;;;22278:30;22344:34;22324:18;;;22317:62;-1:-1:-1;;;22395:18:1;;;22388:45;22450:19;;36350:57:0;22064:411:1;28242:191:0;28316:16;28335:6;;-1:-1:-1;;;;;28352:17:0;;;-1:-1:-1;;;;;;28352:17:0;;;;;;28385:40;;28335:6;;;;;;;28385:40;;28316:16;28385:40;28305:128;28242:191;:::o;51387:275::-;51476:1;51465:8;:12;:44;;;;;51493:16;;51481:8;:28;;51465:44;51457:110;;;;-1:-1:-1;;;51457:110:0;;;;;;;:::i;:::-;51613:8;51599:11;;:22;;;;:::i;:::-;51586:9;:35;51578:74;;;;-1:-1:-1;;;51578:74:0;;21911:2:1;51578:74:0;;;21893:21:1;21950:2;21930:18;;;21923:30;21989:28;21969:18;;;21962:56;22035:18;;51578:74:0;21709:350:1;45404:690:0;45541:4;-1:-1:-1;;;;;45558:13:0;;3797:19;:23;45554:535;;45597:72;;-1:-1:-1;;;45597:72:0;;-1:-1:-1;;;;;45597:36:0;;;;;:72;;25776:10;;45648:4;;45654:7;;45663:5;;45597:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45597:72:0;;;;;;;;-1:-1:-1;;45597:72:0;;;;;;;;;;;;:::i;:::-;;;45584:464;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45828:13:0;;45824:215;;45861:61;;-1:-1:-1;;;45861:61:0;;;;;;;:::i;45824:215::-;46007:6;46001:13;45992:6;45988:2;45984:15;45977:38;45584:464;-1:-1:-1;;;;;;45719:55:0;-1:-1:-1;;;45719:55:0;;-1:-1:-1;45712:62:0;;45554:535;-1:-1:-1;46077:4:0;45554:535;45404:690;;;;;;:::o;52568:108::-;52628:13;52657;52650:20;;;;;:::i;20869:723::-;20925:13;21146:10;21142:53;;-1:-1:-1;;21173:10:0;;;;;;;;;;;;-1:-1:-1;;;21173:10:0;;;;;20869:723::o;21142:53::-;21220:5;21205:12;21261:78;21268:9;;21261:78;;21294:8;;;;:::i;:::-;;-1:-1:-1;21317:10:0;;-1:-1:-1;21325:2:0;21317:10;;:::i;:::-;;;21261:78;;;21349:19;21381:6;-1:-1:-1;;;;;21371:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21371:17:0;;21349:39;;21399:154;21406:10;;21399:154;;21433:11;21443:1;21433:11;;:::i;:::-;;-1:-1:-1;21502:10:0;21510:2;21502:5;:10;:::i;:::-;21489:24;;:2;:24;:::i;:::-;21476:39;;21459:6;21466;21459:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;21459:56:0;;;;;;;;-1:-1:-1;21530:11:0;21539:2;21530:11;;:::i;:::-;;;21399:154;;35561:240;35622:7;-1:-1:-1;;;;;35654:19:0;;35638:102;;;;-1:-1:-1;;;35638:102:0;;12559:2:1;35638:102:0;;;12541:21:1;12598:2;12578:18;;;12571:30;12637:34;12617:18;;;12610:62;-1:-1:-1;;;12688:18:1;;;12681:47;12745:19;;35638:102:0;12357:413:1;35638:102:0;-1:-1:-1;;;;;;35762:19:0;;;;;:12;:19;;;;;:32;-1:-1:-1;;;35762:32:0;;-1:-1:-1;;;;;35762:32:0;;35561:240::o;47931:565::-;48013:4;48030:22;48094:9;48122:1;48117:123;;;;48259:1;48254:123;;;;48087:290;;48117:123;48183:42;48171:54;;48117:123;;48254;48320:42;48308:54;;48087:290;-1:-1:-1;;;;;;48407:31:0;;;;;;:81;;-1:-1:-1;48451:23:0;;-1:-1:-1;;;48451:23:0;;-1:-1:-1;;;;;8839:32:1;;;48451:23:0;;;8821:51:1;48443:44:0;;;;48451:16;;;;;;8794:18:1;;48451:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;48443:44:0;;48400:88;47931:565;-1:-1:-1;;;;47931:565:0:o;24103:675::-;24186:7;24229:4;24186:7;24244:497;24268:5;:12;24264:1;:16;24244:497;;;24302:20;24325:5;24331:1;24325:8;;;;;;;;:::i;:::-;;;;;;;24302:31;;24368:12;24352;:28;24348:382;;24854:13;24904:15;;;24940:4;24933:15;;;24987:4;24971:21;;24480:57;;24348:382;;;24854:13;24904:15;;;24940:4;24933:15;;;24987:4;24971:21;;24657:57;;24348:382;-1:-1:-1;24282:3:0;;;;:::i;:::-;;;;24244:497;;;-1:-1:-1;24758:12:0;24103:675;-1:-1:-1;;;24103:675:0:o;40550:1272::-;40678:12;;-1:-1:-1;;;;;40705:16:0;;40697:62;;;;-1:-1:-1;;;40697:62:0;;19984:2:1;40697:62:0;;;19966:21:1;20023:2;20003:18;;;19996:30;20062:34;20042:18;;;20035:62;-1:-1:-1;;;20113:18:1;;;20106:31;20154:19;;40697:62:0;19782:397:1;40697:62:0;40896:21;40904:12;40089;;-1:-1:-1;40079:22:0;40002:105;40896:21;40895:22;40887:64;;;;-1:-1:-1;;;40887:64:0;;19626:2:1;40887:64:0;;;19608:21:1;19665:2;19645:18;;;19638:30;19704:31;19684:18;;;19677:59;19753:18;;40887:64:0;19424:353:1;40887:64:0;40978:12;40966:8;:24;;40958:71;;;;-1:-1:-1;;;40958:71:0;;23518:2:1;40958:71:0;;;23500:21:1;23557:2;23537:18;;;23530:30;23596:34;23576:18;;;23569:62;-1:-1:-1;;;23647:18:1;;;23640:32;23689:19;;40958:71:0;23316:398:1;40958:71:0;-1:-1:-1;;;;;41141:16:0;;41108:30;41141:16;;;:12;:16;;;;;;;;;41108:49;;;;;;;;;-1:-1:-1;;;;;41108:49:0;;;;;-1:-1:-1;;;41108:49:0;;;;;;;;;;;41183:119;;;;;;;;41203:19;;41108:49;;41183:119;;;41203:39;;41233:8;;41203:39;:::i;:::-;-1:-1:-1;;;;;41183:119:0;;;;;41286:8;41251:11;:24;;;:44;;;;:::i;:::-;-1:-1:-1;;;;;41183:119:0;;;;;;-1:-1:-1;;;;;41164:16:0;;;;;;;:12;:16;;;;;;;;:138;;;;;;;;-1:-1:-1;;;41164:138:0;;;;;;;;;;;;41337:43;;;;;;;;;;-1:-1:-1;;;;;41363:15:0;41337:43;;;;;;;;41309:25;;;:11;:25;;;;;;:71;;;;;;;;;-1:-1:-1;;;41309:71:0;-1:-1:-1;;;;;;41309:71:0;;;;;;;;;;;;;;;;;;41321:12;;41433:281;41457:8;41453:1;:12;41433:281;;;41486:38;;41511:12;;-1:-1:-1;;;;;41486:38:0;;;41503:1;;41486:38;;41503:1;;41486:38;41551:59;41582:1;41586:2;41590:12;41604:5;41551:22;:59::i;:::-;41533:150;;;;-1:-1:-1;;;41533:150:0;;;;;;;:::i;:::-;41692:14;;;;:::i;:::-;;;;41467:3;;;;;:::i;:::-;;;;41433:281;;;-1:-1:-1;41722:12:0;:27;;;41756:60;39452:311;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:673:1;68:5;121:3;114:4;106:6;102:17;98:27;88:55;;139:1;136;129:12;88:55;175:6;162:20;201:4;225:60;241:43;281:2;241:43;:::i;:::-;225:60;:::i;:::-;307:3;331:2;326:3;319:15;359:2;354:3;350:12;343:19;;394:2;386:6;382:15;446:3;441:2;435;432:1;428:10;420:6;416:23;412:32;409:41;406:61;;;463:1;460;453:12;406:61;485:1;495:163;509:2;506:1;503:9;495:163;;;566:17;;554:30;;604:12;;;;636;;;;527:1;520:9;495:163;;;-1:-1:-1;676:5:1;;14:673;-1:-1:-1;;;;;;;14:673:1:o;692:247::-;751:6;804:2;792:9;783:7;779:23;775:32;772:52;;;820:1;817;810:12;772:52;859:9;846:23;878:31;903:5;878:31;:::i;944:388::-;1012:6;1020;1073:2;1061:9;1052:7;1048:23;1044:32;1041:52;;;1089:1;1086;1079:12;1041:52;1128:9;1115:23;1147:31;1172:5;1147:31;:::i;:::-;1197:5;-1:-1:-1;1254:2:1;1239:18;;1226:32;1267:33;1226:32;1267:33;:::i;:::-;1319:7;1309:17;;;944:388;;;;;:::o;1337:456::-;1414:6;1422;1430;1483:2;1471:9;1462:7;1458:23;1454:32;1451:52;;;1499:1;1496;1489:12;1451:52;1538:9;1525:23;1557:31;1582:5;1557:31;:::i;:::-;1607:5;-1:-1:-1;1664:2:1;1649:18;;1636:32;1677:33;1636:32;1677:33;:::i;:::-;1337:456;;1729:7;;-1:-1:-1;;;1783:2:1;1768:18;;;;1755:32;;1337:456::o;1798:1108::-;1893:6;1901;1909;1917;1970:3;1958:9;1949:7;1945:23;1941:33;1938:53;;;1987:1;1984;1977:12;1938:53;2026:9;2013:23;2045:31;2070:5;2045:31;:::i;:::-;2095:5;-1:-1:-1;2119:2:1;2158:18;;;2145:32;2186:33;2145:32;2186:33;:::i;:::-;2238:7;-1:-1:-1;2292:2:1;2277:18;;2264:32;;-1:-1:-1;2347:2:1;2332:18;;2319:32;-1:-1:-1;;;;;2400:14:1;;;2397:34;;;2427:1;2424;2417:12;2397:34;2465:6;2454:9;2450:22;2440:32;;2510:7;2503:4;2499:2;2495:13;2491:27;2481:55;;2532:1;2529;2522:12;2481:55;2568:2;2555:16;2590:2;2586;2583:10;2580:36;;;2596:18;;:::i;:::-;2638:53;2681:2;2662:13;;-1:-1:-1;;2658:27:1;2654:36;;2638:53;:::i;:::-;2625:66;;2714:2;2707:5;2700:17;2754:7;2749:2;2744;2740;2736:11;2732:20;2729:33;2726:53;;;2775:1;2772;2765:12;2726:53;2830:2;2825;2821;2817:11;2812:2;2805:5;2801:14;2788:45;2874:1;2869:2;2864;2857:5;2853:14;2849:23;2842:34;;2895:5;2885:15;;;;;1798:1108;;;;;;;:::o;2911:416::-;2976:6;2984;3037:2;3025:9;3016:7;3012:23;3008:32;3005:52;;;3053:1;3050;3043:12;3005:52;3092:9;3079:23;3111:31;3136:5;3111:31;:::i;:::-;3161:5;-1:-1:-1;3218:2:1;3203:18;;3190:32;3260:15;;3253:23;3241:36;;3231:64;;3291:1;3288;3281:12;3332:315;3400:6;3408;3461:2;3449:9;3440:7;3436:23;3432:32;3429:52;;;3477:1;3474;3467:12;3429:52;3516:9;3503:23;3535:31;3560:5;3535:31;:::i;:::-;3585:5;3637:2;3622:18;;;;3609:32;;-1:-1:-1;;;3332:315:1:o;3652:1226::-;3770:6;3778;3831:2;3819:9;3810:7;3806:23;3802:32;3799:52;;;3847:1;3844;3837:12;3799:52;3887:9;3874:23;-1:-1:-1;;;;;3957:2:1;3949:6;3946:14;3943:34;;;3973:1;3970;3963:12;3943:34;4011:6;4000:9;3996:22;3986:32;;4056:7;4049:4;4045:2;4041:13;4037:27;4027:55;;4078:1;4075;4068:12;4027:55;4114:2;4101:16;4136:4;4160:60;4176:43;4216:2;4176:43;:::i;4160:60::-;4242:3;4266:2;4261:3;4254:15;4294:2;4289:3;4285:12;4278:19;;4325:2;4321;4317:11;4373:7;4368:2;4362;4359:1;4355:10;4351:2;4347:19;4343:28;4340:41;4337:61;;;4394:1;4391;4384:12;4337:61;4416:1;4407:10;;4426:238;4440:2;4437:1;4434:9;4426:238;;;4511:3;4498:17;4528:31;4553:5;4528:31;:::i;:::-;4572:18;;4458:1;4451:9;;;;;4610:12;;;;4642;;4426:238;;;-1:-1:-1;4683:5:1;-1:-1:-1;;4726:18:1;;4713:32;;-1:-1:-1;;4757:16:1;;;4754:36;;;4786:1;4783;4776:12;4754:36;;4809:63;4864:7;4853:8;4842:9;4838:24;4809:63;:::i;:::-;4799:73;;;3652:1226;;;;;:::o;4883:180::-;4942:6;4995:2;4983:9;4974:7;4970:23;4966:32;4963:52;;;5011:1;5008;5001:12;4963:52;-1:-1:-1;5034:23:1;;4883:180;-1:-1:-1;4883:180:1:o;5068:245::-;5126:6;5179:2;5167:9;5158:7;5154:23;5150:32;5147:52;;;5195:1;5192;5185:12;5147:52;5234:9;5221:23;5253:30;5277:5;5253:30;:::i;5318:249::-;5387:6;5440:2;5428:9;5419:7;5415:23;5411:32;5408:52;;;5456:1;5453;5446:12;5408:52;5488:9;5482:16;5507:30;5531:5;5507:30;:::i;5572:280::-;5671:6;5724:2;5712:9;5703:7;5699:23;5695:32;5692:52;;;5740:1;5737;5730:12;5692:52;5772:9;5766:16;5791:31;5816:5;5791:31;:::i;5857:592::-;5928:6;5936;5989:2;5977:9;5968:7;5964:23;5960:32;5957:52;;;6005:1;6002;5995:12;5957:52;6045:9;6032:23;-1:-1:-1;;;;;6115:2:1;6107:6;6104:14;6101:34;;;6131:1;6128;6121:12;6101:34;6169:6;6158:9;6154:22;6144:32;;6214:7;6207:4;6203:2;6199:13;6195:27;6185:55;;6236:1;6233;6226:12;6185:55;6276:2;6263:16;6302:2;6294:6;6291:14;6288:34;;;6318:1;6315;6308:12;6288:34;6363:7;6358:2;6349:6;6345:2;6341:15;6337:24;6334:37;6331:57;;;6384:1;6381;6374:12;6331:57;6415:2;6407:11;;;;;6437:6;;-1:-1:-1;5857:592:1;;-1:-1:-1;;;;5857:592:1:o;6639:683::-;6734:6;6742;6750;6803:2;6791:9;6782:7;6778:23;6774:32;6771:52;;;6819:1;6816;6809:12;6771:52;6855:9;6842:23;6832:33;;6916:2;6905:9;6901:18;6888:32;-1:-1:-1;;;;;6980:2:1;6972:6;6969:14;6966:34;;;6996:1;6993;6986:12;6966:34;7034:6;7023:9;7019:22;7009:32;;7079:7;7072:4;7068:2;7064:13;7060:27;7050:55;;7101:1;7098;7091:12;7050:55;7141:2;7128:16;7167:2;7159:6;7156:14;7153:34;;;7183:1;7180;7173:12;7153:34;7236:7;7231:2;7221:6;7218:1;7214:14;7210:2;7206:23;7202:32;7199:45;7196:65;;;7257:1;7254;7247:12;7196:65;7288:2;7284;7280:11;7270:21;;7310:6;7300:16;;;;;6639:683;;;;;:::o;7327:257::-;7368:3;7406:5;7400:12;7433:6;7428:3;7421:19;7449:63;7505:6;7498:4;7493:3;7489:14;7482:4;7475:5;7471:16;7449:63;:::i;:::-;7566:2;7545:15;-1:-1:-1;;7541:29:1;7532:39;;;;7573:4;7528:50;;7327:257;-1:-1:-1;;7327:257:1:o;7823:637::-;8103:3;8141:6;8135:13;8157:53;8203:6;8198:3;8191:4;8183:6;8179:17;8157:53;:::i;:::-;8273:13;;8232:16;;;;8295:57;8273:13;8232:16;8329:4;8317:17;;8295:57;:::i;:::-;-1:-1:-1;;;8374:20:1;;8403:22;;;8452:1;8441:13;;7823:637;-1:-1:-1;;;;7823:637:1:o;8883:488::-;-1:-1:-1;;;;;9152:15:1;;;9134:34;;9204:15;;9199:2;9184:18;;9177:43;9251:2;9236:18;;9229:34;;;9299:3;9294:2;9279:18;;9272:31;;;9077:4;;9320:45;;9345:19;;9337:6;9320:45;:::i;:::-;9312:53;8883:488;-1:-1:-1;;;;;;8883:488:1:o;9750:219::-;9899:2;9888:9;9881:21;9862:4;9919:44;9959:2;9948:9;9944:18;9936:6;9919:44;:::i;14667:405::-;14869:2;14851:21;;;14908:2;14888:18;;;14881:30;14947:34;14942:2;14927:18;;14920:62;-1:-1:-1;;;15013:2:1;14998:18;;14991:39;15062:3;15047:19;;14667:405::o;16299:356::-;16501:2;16483:21;;;16520:18;;;16513:30;16579:34;16574:2;16559:18;;16552:62;16646:2;16631:18;;16299:356::o;19004:415::-;19206:2;19188:21;;;19245:2;19225:18;;;19218:30;19284:34;19279:2;19264:18;;19257:62;-1:-1:-1;;;19350:2:1;19335:18;;19328:49;19409:3;19394:19;;19004:415::o;21349:355::-;21551:2;21533:21;;;21590:2;21570:18;;;21563:30;21629:33;21624:2;21609:18;;21602:61;21695:2;21680:18;;21349:355::o;22480:417::-;22682:2;22664:21;;;22721:2;22701:18;;;22694:30;22760:34;22755:2;22740:18;;22733:62;-1:-1:-1;;;22826:2:1;22811:18;;22804:51;22887:3;22872:19;;22480:417::o;24266:275::-;24337:2;24331:9;24402:2;24383:13;;-1:-1:-1;;24379:27:1;24367:40;;-1:-1:-1;;;;;24422:34:1;;24458:22;;;24419:62;24416:88;;;24484:18;;:::i;:::-;24520:2;24513:22;24266:275;;-1:-1:-1;24266:275:1:o;24546:183::-;24606:4;-1:-1:-1;;;;;24631:6:1;24628:30;24625:56;;;24661:18;;:::i;:::-;-1:-1:-1;24706:1:1;24702:14;24718:4;24698:25;;24546:183::o;24734:253::-;24774:3;-1:-1:-1;;;;;24863:2:1;24860:1;24856:10;24893:2;24890:1;24886:10;24924:3;24920:2;24916:12;24911:3;24908:21;24905:47;;;24932:18;;:::i;:::-;24968:13;;24734:253;-1:-1:-1;;;;24734:253:1:o;24992:128::-;25032:3;25063:1;25059:6;25056:1;25053:13;25050:39;;;25069:18;;:::i;:::-;-1:-1:-1;25105:9:1;;24992:128::o;25125:120::-;25165:1;25191;25181:35;;25196:18;;:::i;:::-;-1:-1:-1;25230:9:1;;25125:120::o;25250:168::-;25290:7;25356:1;25352;25348:6;25344:14;25341:1;25338:21;25333:1;25326:9;25319:17;25315:45;25312:71;;;25363:18;;:::i;:::-;-1:-1:-1;25403:9:1;;25250:168::o;25423:246::-;25463:4;-1:-1:-1;;;;;25576:10:1;;;;25546;;25598:12;;;25595:38;;;25613:18;;:::i;:::-;25650:13;;25423:246;-1:-1:-1;;;25423:246:1:o;25674:125::-;25714:4;25742:1;25739;25736:8;25733:34;;;25747:18;;:::i;:::-;-1:-1:-1;25784:9:1;;25674:125::o;25804:258::-;25876:1;25886:113;25900:6;25897:1;25894:13;25886:113;;;25976:11;;;25970:18;25957:11;;;25950:39;25922:2;25915:10;25886:113;;;26017:6;26014:1;26011:13;26008:48;;;-1:-1:-1;;26052:1:1;26034:16;;26027:27;25804:258::o;26067:136::-;26106:3;26134:5;26124:39;;26143:18;;:::i;:::-;-1:-1:-1;;;26179:18:1;;26067:136::o;26208:380::-;26287:1;26283:12;;;;26330;;;26351:61;;26405:4;26397:6;26393:17;26383:27;;26351:61;26458:2;26450:6;26447:14;26427:18;26424:38;26421:161;;;26504:10;26499:3;26495:20;26492:1;26485:31;26539:4;26536:1;26529:15;26567:4;26564:1;26557:15;26421:161;;26208:380;;;:::o;26593:135::-;26632:3;-1:-1:-1;;26653:17:1;;26650:43;;;26673:18;;:::i;:::-;-1:-1:-1;26720:1:1;26709:13;;26593:135::o;26733:112::-;26765:1;26791;26781:35;;26796:18;;:::i;:::-;-1:-1:-1;26830:9:1;;26733:112::o;26850:127::-;26911:10;26906:3;26902:20;26899:1;26892:31;26942:4;26939:1;26932:15;26966:4;26963:1;26956:15;26982:127;27043:10;27038:3;27034:20;27031:1;27024:31;27074:4;27071:1;27064:15;27098:4;27095:1;27088:15;27114:127;27175:10;27170:3;27166:20;27163:1;27156:31;27206:4;27203:1;27196:15;27230:4;27227:1;27220:15;27246:127;27307:10;27302:3;27298:20;27295:1;27288:31;27338:4;27335:1;27328:15;27362:4;27359:1;27352:15;27378:131;-1:-1:-1;;;;;27453:31:1;;27443:42;;27433:70;;27499:1;27496;27489:12;27514:131;-1:-1:-1;;;;;;27588:32:1;;27578:43;;27568:71;;27635:1;27632;27625:12

Swarm Source

ipfs://adc615eaedc7871f09cafa516aad30df61026199d0c897684c960518b6717ef7
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.