ETH Price: $3,447.08 (+0.03%)
Gas: 2 Gwei

Token

Cryptoboyz (BOYZ)
 

Overview

Max Total Supply

0 BOYZ

Holders

600

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
5 BOYZ
0x68bf9c6fcf5de122e230139c4d1430a9a4d31b8b
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:
Cryptoboyz

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 1000 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-03-12
*/

//SPDX-License-Identifier: GPL-3.0
pragma solidity 0.8.7;
// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/finance/PaymentSplitter.sol


// OpenZeppelin Contracts v4.4.1 (finance/PaymentSplitter.sol)

pragma solidity ^0.8.0;




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

    uint256 private _totalShares;
    uint256 private _totalReleased;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @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/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: contracts/ERC721LowGas.sol



pragma solidity 0.8.7;









error TransferToNonERC721ReceiverImplementer();
error MintToZeroAddress();
error MintZeroQuantity();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToZeroAddress();
error ApproveToCaller();
error BalanceQueryForZeroAddress();
error QueryForNonexistentToken();
error ApprovalToCurrentOwner();
error ApprovalCallerNotOwnerNorApproved();

/**
 * @dev Custom implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard and Chiru Labs ERC721A, including
 * the Metadata extension, but not including the Enumerable extension.
 * 
 * Assumes that no burn will ever be executed.
 *
 * Assumes that safeMint will never be called, no contracts being allowed to mint.
 */
contract ERC721LowGas is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // The tokenId of the next token to be minted.
    uint128 internal _currentIndex = 1;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) internal _tokenIdToAddress;

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

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

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

    bool _revealed = false;

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

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

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

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

        if (_exists(curr)) {
            address add;
            if (_tokenIdToAddress[curr] != address(0)) return _tokenIdToAddress[curr];
            while (true) {
                curr--;
                add = _tokenIdToAddress[curr];
                if (add != address(0)) return add;
            }
        }
        revert QueryForNonexistentToken();
    }

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert QueryForNonexistentToken();
            string memory baseURI = _baseURI();
        if (_revealed)
            return string(abi.encodePacked(baseURI, tokenId.toString()));
        else 
            return baseURI;
    }

    /**
     * @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 overridden 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 = ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();
        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) revert ApprovalCallerNotOwnerNorApproved();
        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        if (!_exists(tokenId)) revert QueryForNonexistentToken();
        return _tokenApprovals[tokenId];
    }

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

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

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

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

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


    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        uint256 curr = tokenId;
        if (curr <_currentIndex && curr >0){
            if (_tokenIdToAddress[curr] != address(0)) {
                return true;
            }
            while (true) {
                curr--;
                if (_tokenIdToAddress[curr] != address(0)) {
                    return true;
                }
            }
        }
        else if (tokenId >100000 && tokenId <100020){
            return _tokenIdToAddress[tokenId] != address(0);
        }
        revert QueryForNonexistentToken();
    }

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

        // Overflows are incredibly unrealistic.
        // balance overflow if current value of either + quantity > 3.4e38 (2**128) - 1
        // updatedIndex overflows if _currentIndex + quantity > 3.4e38 (2**128) - 1
        unchecked {
            _balances[to] += quantity;
            _tokenIdToAddress[startTokenId] = to;

            uint128 updatedIndex = _currentIndex;

            for (uint256 i; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex);
                updatedIndex++;
            }

            _currentIndex = updatedIndex;
        }
    }

    /**
     * @dev Mints specific token and transfers it to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mintSpecial(address to, uint256 id) internal {
        if (to == address(0)) revert MintToZeroAddress();

        unchecked {
            _balances[to] ++;

            _tokenIdToAddress[id] = to;

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

    /**
     * @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 {
        address prevOwner = _tokenIdToAddress[tokenId];
        bool isApprovedOrOwner = (_msgSender() == prevOwner || isApprovedForAll(prevOwner, _msgSender()) || getApproved(tokenId) == _msgSender());
        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (prevOwner != from) revert TransferFromIncorrectOwner();
        if (to == address(0)) revert TransferToZeroAddress();
        // Clear approvals from the previous owner
        _approve(address(0), tokenId, prevOwner);
        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**128.
        unchecked {
            _balances[from] --;
            _balances[to] ++;
            _tokenIdToAddress[tokenId] = to;
            // 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;
            // This will suffice for checking _exists(nextTokenId)
            if (_tokenIdToAddress[nextTokenId] == address(0) && nextTokenId < _currentIndex) _tokenIdToAddress[nextTokenId] = prevOwner;
        }
        emit Transfer(from, to, tokenId);
    }

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) 
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                else 
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                
            }
        else return true;
        
    }

}
// File: contracts/Cryptoboyz.sol


pragma solidity 0.8.7;





   /**********************************************************************************************\
   |*                                                                                            *|
   |*                                                                                            *|
   |*     ██████ ██████  ██    ██ ██████  ████████  ██████  ██████   ██████  ██    ██ ███████    *|
   |*    ██      ██   ██  ██  ██  ██   ██    ██    ██    ██ ██   ██ ██    ██  ██  ██     ███     *|
   |*    ██      ██████    ████   ██████     ██    ██    ██ ██████  ██    ██   ████     ███      *|
   |*    ██      ██   ██    ██    ██         ██    ██    ██ ██   ██ ██    ██    ██     ███       *|
   |*     ██████ ██   ██    ██    ██         ██     ██████  ██████   ██████     ██    ███████    *|
   |*                                                                                            *| 
   |*                                                                                            *|
   \**********************************************************************************************/


contract Cryptoboyz is ERC721LowGas, Ownable, PaymentSplitter {

    uint constant maxTokens = 6969;    
    uint constant maxMintsPerTx = 20;
    uint constant tokenPrice = 0.02 ether;
    string baseURI_ = 'ipfs://QmZvjy5YpeDpT3D3cpYDNmgHU8Mnyfk3zBZNGaAwKXik9e/'; 
    mapping(address => uint) uniqueWL; 
    bool paused = true;
    address[] _payees = [0x388DC7162F644F8AA8aBe46ceDAf8beb2d7DC74B,0xD624cdcD51427230Fe7342D22c98f2D55513F67C];
    uint[] _shares = [90,10];

    constructor() ERC721LowGas("Cryptoboyz", "BOYZ") PaymentSplitter(_payees,_shares) payable {}

    // Minting
    function mint(uint quantity) external payable {
        require(quantity <= maxMintsPerTx,"Max 20 by tx");
        require(_currentIndex + quantity <= maxTokens + 1,"Would exceed supply");
        require(msg.sender == tx.origin,"No contract");
        require(!paused,"Mint is offline");
        require(msg.value >= tokenPrice * quantity,"Not enough ether");
        if (isUniqueWL() != 0){
            _mintSpecial(msg.sender,uniqueWL[msg.sender]+100000);
            uniqueWL[msg.sender] = 0;
        } 
        _mint(msg.sender, quantity);
    }

    // 1/1 mint only
    function mintUnique() external {        
        require (isUniqueWL() != 0,"You can't mint any 1/1");
        require(msg.sender == tx.origin,"No contract");
        require(!paused,"Mint is offline");
        if (isUniqueWL() != 0){
            _mintSpecial(msg.sender,uniqueWL[msg.sender]+100000);
            uniqueWL[msg.sender] = 0;
        } 
    }

    // Add unique whitelisted addresses
    function addUniqueWL (address[] calldata _addresses, uint[] calldata ids) external onlyOwner{
        for (uint i ; i<_addresses.length ; i++) uniqueWL[_addresses[i]] = ids[i];
    }

    // Check if msg.sender is in the unique whitelist. 0 for a no, tokenId for a yes.
    function isUniqueWL() public view returns (uint) {
        return uniqueWL[msg.sender];
    }

    // baseURI internal getter
    function _baseURI() internal view override returns (string memory) {
        return baseURI_;
    }

    // baseURI setter
    function setBaseURI(string calldata baseURI) external onlyOwner {
        baseURI_ = baseURI;
    }

    // pause setter
    function setPaused (bool b_) external onlyOwner {
        paused = b_;
    }

    // reveal setter
    function setReveal () external onlyOwner {
        _revealed = true;
    }

    function minted () external view returns (uint){
        return _currentIndex-1;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"payable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"QueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"addUniqueWL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"isUniqueWL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintUnique","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"b_","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"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"},{"stateMutability":"payable","type":"receive"}]

600080546001600160801b03191660011790556007805460ff1916905560e060405260366080818152906200315b60a03980516200004691600f916020909101906200057f565b506011805460ff191660011790556040805180820190915273388dc7162f644f8aa8abe46cedaf8beb2d7dc74b815273d624cdcd51427230fe7342d22c98f2d55513f67c60208201526200009f9060129060026200060e565b5060408051808201909152605a8152600a6020820152620000c590601390600262000666565b5060128054806020026020016040519081016040528092919081815260200182805480156200011e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311620000ff575b505050505060138054806020026020016040519081016040528092919081815260200182805480156200017157602002820191906000526020600020905b8154815260200190600101908083116200015c575b5050604080518082018252600a81526921b93cb83a37b137bcbd60b11b6020808301918252835180850190945260048452632127acad60e11b908401528151919550919350620001c69250600191906200057f565b508051620001dc9060029060208401906200057f565b505050620001f9620001f36200033360201b60201c565b62000337565b80518251146200026b5760405162461bcd60e51b815260206004820152603260248201527f5061796d656e7453706c69747465723a2070617965657320616e6420736861726044820152710cae640d8cadccee8d040dad2e6dac2e8c6d60731b60648201526084015b60405180910390fd5b6000825111620002be5760405162461bcd60e51b815260206004820152601a60248201527f5061796d656e7453706c69747465723a206e6f20706179656573000000000000604482015260640162000262565b60005b82518110156200032a5762000315838281518110620002e457620002e46200074c565b60200260200101518383815181106200030157620003016200074c565b60200260200101516200039160201b60201c565b80620003218162000718565b915050620002c1565b50505062000762565b3390565b600780546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216620003fe5760405162461bcd60e51b815260206004820152602c60248201527f5061796d656e7453706c69747465723a206163636f756e74206973207468652060448201526b7a65726f206164647265737360a01b606482015260840162000262565b60008111620004505760405162461bcd60e51b815260206004820152601d60248201527f5061796d656e7453706c69747465723a20736861726573206172652030000000604482015260640162000262565b6001600160a01b0382166000908152600a602052604090205415620004cc5760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960448201526a206861732073686172657360a81b606482015260840162000262565b600c8054600181019091557fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c70180546001600160a01b0319166001600160a01b0384169081179091556000908152600a6020526040902081905560085462000536908290620006c0565b600855604080516001600160a01b0384168152602081018390527f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac910160405180910390a15050565b8280546200058d90620006db565b90600052602060002090601f016020900481019282620005b15760008555620005fc565b82601f10620005cc57805160ff1916838001178555620005fc565b82800160010185558215620005fc579182015b82811115620005fc578251825591602001919060010190620005df565b506200060a929150620006a9565b5090565b828054828255906000526020600020908101928215620005fc579160200282015b82811115620005fc57825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906200062f565b828054828255906000526020600020908101928215620005fc579160200282015b82811115620005fc578251829060ff1690559160200191906001019062000687565b5b808211156200060a5760008155600101620006aa565b60008219821115620006d657620006d662000736565b500190565b600181811c90821680620006f057607f821691505b602082108114156200071257634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156200072f576200072f62000736565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6129e980620007726000396000f3fe6080604052600436106102025760003560e01c80636352211e1161011d578063a0712d68116100b0578063ce7c2ac21161007f578063e33b7de311610064578063e33b7de314610669578063e985e9c51461067e578063f2fde38b146106c757600080fd5b8063ce7c2ac2146105fd578063d79779b21461063357600080fd5b8063a0712d681461058a578063a22cb4651461059d578063b88d4fde146105bd578063c87b56dd146105dd57600080fd5b80638b83209b116100ec5780638b83209b146104fc5780638da5cb5b1461051c57806395d89b411461053f5780639852595c1461055457600080fd5b80636352211e1461049257806370a08231146104b2578063715018a6146104d257806376645315146104e757600080fd5b80632e84c3931161019557806342842e0e1161016457806342842e0e1461041d57806348b750441461043d5780634f02c4201461045d57806355f804b31461047257600080fd5b80632e84c393146103765780633a98ef3914610396578063406072a9146103b557806341041eb8146103fb57600080fd5b806316c38b3c116101d157806316c38b3c146103015780631916558714610321578063195894fe1461034157806323b872dd1461035657600080fd5b806301ffc9a71461025057806306fdde0314610285578063081812fc146102a7578063095ea7b3146102df57600080fd5b3661024b577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b34801561025c57600080fd5b5061027061026b36600461264d565b6106e7565b60405190151581526020015b60405180910390f35b34801561029157600080fd5b5061029a610784565b60405161027c91906127de565b3480156102b357600080fd5b506102c76102c23660046126f9565b610816565b6040516001600160a01b03909116815260200161027c565b3480156102eb57600080fd5b506102ff6102fa36600461257b565b61085a565b005b34801561030d57600080fd5b506102ff61031c366004612613565b61091a565b34801561032d57600080fd5b506102ff61033c3660046123d6565b610992565b34801561034d57600080fd5b506102ff610b43565b34801561036257600080fd5b506102ff61037136600461242c565b610c7e565b34801561038257600080fd5b506102ff6103913660046125a7565b610c89565b3480156103a257600080fd5b506008545b60405190815260200161027c565b3480156103c157600080fd5b506103a76103d03660046123f3565b6001600160a01b039182166000908152600e6020908152604080832093909416825291909152205490565b34801561040757600080fd5b50336000908152601060205260409020546103a7565b34801561042957600080fd5b506102ff61043836600461242c565b610d6b565b34801561044957600080fd5b506102ff6104583660046123f3565b610d86565b34801561046957600080fd5b506103a761100a565b34801561047e57600080fd5b506102ff61048d366004612687565b611031565b34801561049e57600080fd5b506102c76104ad3660046126f9565b61109d565b3480156104be57600080fd5b506103a76104cd3660046123d6565b61113d565b3480156104de57600080fd5b506102ff61119b565b3480156104f357600080fd5b506102ff611205565b34801561050857600080fd5b506102c76105173660046126f9565b611274565b34801561052857600080fd5b5060075461010090046001600160a01b03166102c7565b34801561054b57600080fd5b5061029a6112a4565b34801561056057600080fd5b506103a761056f3660046123d6565b6001600160a01b03166000908152600b602052604090205490565b6102ff6105983660046126f9565b6112b3565b3480156105a957600080fd5b506102ff6105b836600461254d565b6114bb565b3480156105c957600080fd5b506102ff6105d836600461246d565b61156a565b3480156105e957600080fd5b5061029a6105f83660046126f9565b6115bd565b34801561060957600080fd5b506103a76106183660046123d6565b6001600160a01b03166000908152600a602052604090205490565b34801561063f57600080fd5b506103a761064e3660046123d6565b6001600160a01b03166000908152600d602052604090205490565b34801561067557600080fd5b506009546103a7565b34801561068a57600080fd5b506102706106993660046123f3565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b3480156106d357600080fd5b506102ff6106e23660046123d6565b611635565b60006001600160e01b031982167f80ac58cd00000000000000000000000000000000000000000000000000000000148061074a57506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061077e57507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b606060018054610793906128be565b80601f01602080910402602001604051908101604052809291908181526020018280546107bf906128be565b801561080c5780601f106107e15761010080835404028352916020019161080c565b820191906000526020600020905b8154815290600101906020018083116107ef57829003601f168201915b5050505050905090565b60006108218261171a565b61083e57604051636c01c8cf60e11b815260040160405180910390fd5b506000908152600560205260409020546001600160a01b031690565b60006108658261109d565b9050806001600160a01b0316836001600160a01b031614156108b3576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336001600160a01b038216148015906108d357506108d18133610699565b155b1561090a576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109158383836117d4565b505050565b6007546001600160a01b0361010090910416331461097f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6011805460ff1916911515919091179055565b6001600160a01b0381166000908152600a6020526040902054610a065760405162461bcd60e51b815260206004820152602660248201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060448201526573686172657360d01b6064820152608401610976565b6000610a1160095490565b610a1b90476127f1565b90506000610a488383610a43866001600160a01b03166000908152600b602052604090205490565b611830565b905080610aab5760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060448201526a191d59481c185e5b595b9d60aa1b6064820152608401610976565b6001600160a01b0383166000908152600b602052604081208054839290610ad39084906127f1565b925050819055508060096000828254610aec91906127f1565b90915550610afc90508382611878565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a1505050565b33600090815260106020526040902054610b9f5760405162461bcd60e51b815260206004820152601660248201527f596f752063616e2774206d696e7420616e7920312f31000000000000000000006044820152606401610976565b333214610bdc5760405162461bcd60e51b815260206004820152600b60248201526a139bc818dbdb9d1c9858dd60aa1b6044820152606401610976565b60115460ff1615610c2f5760405162461bcd60e51b815260206004820152600f60248201527f4d696e74206973206f66666c696e6500000000000000000000000000000000006044820152606401610976565b3360009081526010602052604090205415610c7c5733600081815260106020526040902054610c6b9190610c6690620186a06127f1565b611991565b336000908152601060205260408120555b565b610915838383611a22565b6007546001600160a01b03610100909104163314610ce95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610976565b60005b83811015610d6457828282818110610d0657610d0661294e565b9050602002013560106000878785818110610d2357610d2361294e565b9050602002016020810190610d3891906123d6565b6001600160a01b0316815260208101919091526040016000205580610d5c816128f3565b915050610cec565b5050505050565b6109158383836040518060200160405280600081525061156a565b6001600160a01b0381166000908152600a6020526040902054610dfa5760405162461bcd60e51b815260206004820152602660248201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060448201526573686172657360d01b6064820152608401610976565b6001600160a01b0382166000908152600d60205260408120546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b038516906370a082319060240160206040518083038186803b158015610e6b57600080fd5b505afa158015610e7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea39190612712565b610ead91906127f1565b90506000610ee68383610a4387876001600160a01b039182166000908152600e6020908152604080832093909416825291909152205490565b905080610f495760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060448201526a191d59481c185e5b595b9d60aa1b6064820152608401610976565b6001600160a01b038085166000908152600e6020908152604080832093871683529290529081208054839290610f809084906127f1565b90915550506001600160a01b0384166000908152600d602052604081208054839290610fad9084906127f1565b90915550610fbe9050848483611c25565b604080516001600160a01b038581168252602082018490528616917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a250505050565b60008054611023906001906001600160801b031661283c565b6001600160801b0316905090565b6007546001600160a01b036101009091041633146110915760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610976565b610915600f83836122f1565b6000816110a98161171a565b15611124576000818152600360205260408120546001600160a01b0316156110ea57506000908152600360205260409020546001600160a01b031692915050565b816110f4816128a7565b6000818152600360205260409020549093506001600160a01b0316915050801561111f579392505050565b6110ea565b604051636c01c8cf60e11b815260040160405180910390fd5b60006001600160a01b03821661117f576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001600160a01b031660009081526004602052604090205490565b6007546001600160a01b036101009091041633146111fb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610976565b610c7c6000611ca5565b6007546001600160a01b036101009091041633146112655760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610976565b6007805460ff19166001179055565b6000600c82815481106112895761128961294e565b6000918252602090912001546001600160a01b031692915050565b606060028054610793906128be565b60148111156113045760405162461bcd60e51b815260206004820152600c60248201527f4d617820323020627920747800000000000000000000000000000000000000006044820152606401610976565b611311611b3960016127f1565b6000546113289083906001600160801b03166127f1565b11156113765760405162461bcd60e51b815260206004820152601360248201527f576f756c642065786365656420737570706c79000000000000000000000000006044820152606401610976565b3332146113b35760405162461bcd60e51b815260206004820152600b60248201526a139bc818dbdb9d1c9858dd60aa1b6044820152606401610976565b60115460ff16156114065760405162461bcd60e51b815260206004820152600f60248201527f4d696e74206973206f66666c696e6500000000000000000000000000000000006044820152606401610976565b6114178166470de4df82000061281d565b3410156114665760405162461bcd60e51b815260206004820152601060248201527f4e6f7420656e6f756768206574686572000000000000000000000000000000006044820152606401610976565b33600090815260106020526040902054156114ae573360008181526010602052604090205461149d9190610c6690620186a06127f1565b336000908152601060205260408120555b6114b83382611d16565b50565b6001600160a01b0382163314156114fe576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611575848484611a22565b61158184848484611e5c565b6115b7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b60606115c88261171a565b6115e557604051636c01c8cf60e11b815260040160405180910390fd5b60006115ef611fc0565b60075490915060ff161561077e578061160784611fcf565b604051602001611618929190612773565b604051602081830303815290604052915050919050565b50919050565b6007546001600160a01b036101009091041633146116955760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610976565b6001600160a01b0381166117115760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610976565b6114b881611ca5565b6000805482906001600160801b0316811080156117375750600081115b1561179c576000818152600360205260409020546001600160a01b0316156117625750600192915050565b8061176c816128a7565b6000818152600360205260409020549092506001600160a01b03161590506117975750600192915050565b611762565b620186a0831180156117b05750620186b483105b156111245750506000908152600360205260409020546001600160a01b0316151590565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6008546001600160a01b0384166000908152600a60205260408120549091839161185a908661281d565b6118649190612809565b61186e9190612864565b90505b9392505050565b804710156118c85760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610976565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611915576040519150601f19603f3d011682016040523d82523d6000602084013e61191a565b606091505b50509050806109155760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610976565b6001600160a01b0382166119b757604051622e076360e81b815260040160405180910390fd5b6001600160a01b038216600081815260046020908152604080832080546001019055848352600390915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000818152600360205260408120546001600160a01b03169033821480611a4e5750611a4e8233610699565b80611a69575033611a5e84610816565b6001600160a01b0316145b905080611aa2576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b846001600160a01b0316826001600160a01b031614611aed576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038416611b2d576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b39600084846117d4565b6001600160a01b038086166000908152600460209081526040808320805460001901905587841680845281842080546001908101909155888552600390935281842080546001600160a01b0319169091179055908601808352912054909116158015611baf57506000546001600160801b031681105b15611bdc57600081815260036020526040902080546001600160a01b0319166001600160a01b0385161790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052610915908490612101565b600780546001600160a01b038381166101008181027fffffffffffffffffffffff0000000000000000000000000000000000000000ff85161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000546001600160801b03166001600160a01b038316611d4857604051622e076360e81b815260040160405180910390fd5b81611d7f576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03831660008181526004602090815260408083208054870190558483526003909152812080546001600160a01b03191690921790915580546001600160801b0316905b83811015611e1e576040516001600160801b038316906001600160a01b038716906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a460019182019101611dc9565b50600080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166001600160801b0392909216919091179055505050565b60006001600160a01b0384163b15611fb457604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611ea09033908990889088906004016127a2565b602060405180830381600087803b158015611eba57600080fd5b505af1925050508015611eea575060408051601f3d908101601f19168201909252611ee79181019061266a565b60015b611f9a573d808015611f18576040519150601f19603f3d011682016040523d82523d6000602084013e611f1d565b606091505b508051611f925760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610976565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611fb8565b5060015b949350505050565b6060600f8054610793906128be565b60608161200f57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156120395780612023816128f3565b91506120329050600a83612809565b9150612013565b60008167ffffffffffffffff81111561205457612054612964565b6040519080825280601f01601f19166020018201604052801561207e576020820181803683370190505b5090505b8415611fb857612093600183612864565b91506120a0600a8661290e565b6120ab9060306127f1565b60f81b8183815181106120c0576120c061294e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506120fa600a86612809565b9450612082565b6000612156826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166121e69092919063ffffffff16565b80519091501561091557808060200190518101906121749190612630565b6109155760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610976565b606061186e848460008585843b61223f5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610976565b600080866001600160a01b0316858760405161225b9190612757565b60006040518083038185875af1925050503d8060008114612298576040519150601f19603f3d011682016040523d82523d6000602084013e61229d565b606091505b50915091506122ad8282866122b8565b979650505050505050565b606083156122c7575081611871565b8251156122d75782518084602001fd5b8160405162461bcd60e51b815260040161097691906127de565b8280546122fd906128be565b90600052602060002090601f01602090048101928261231f5760008555612365565b82601f106123385782800160ff19823516178555612365565b82800160010185558215612365579182015b8281111561236557823582559160200191906001019061234a565b50612371929150612375565b5090565b5b808211156123715760008155600101612376565b60008083601f84011261239c57600080fd5b50813567ffffffffffffffff8111156123b457600080fd5b6020830191508360208260051b85010111156123cf57600080fd5b9250929050565b6000602082840312156123e857600080fd5b81356118718161297a565b6000806040838503121561240657600080fd5b82356124118161297a565b915060208301356124218161297a565b809150509250929050565b60008060006060848603121561244157600080fd5b833561244c8161297a565b9250602084013561245c8161297a565b929592945050506040919091013590565b6000806000806080858703121561248357600080fd5b843561248e8161297a565b9350602085013561249e8161297a565b925060408501359150606085013567ffffffffffffffff808211156124c257600080fd5b818701915087601f8301126124d657600080fd5b8135818111156124e8576124e8612964565b604051601f8201601f19908116603f0116810190838211818310171561251057612510612964565b816040528281528a602084870101111561252957600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561256057600080fd5b823561256b8161297a565b915060208301356124218161298f565b6000806040838503121561258e57600080fd5b82356125998161297a565b946020939093013593505050565b600080600080604085870312156125bd57600080fd5b843567ffffffffffffffff808211156125d557600080fd5b6125e18883890161238a565b909650945060208701359150808211156125fa57600080fd5b506126078782880161238a565b95989497509550505050565b60006020828403121561262557600080fd5b81356118718161298f565b60006020828403121561264257600080fd5b81516118718161298f565b60006020828403121561265f57600080fd5b81356118718161299d565b60006020828403121561267c57600080fd5b81516118718161299d565b6000806020838503121561269a57600080fd5b823567ffffffffffffffff808211156126b257600080fd5b818501915085601f8301126126c657600080fd5b8135818111156126d557600080fd5b8660208285010111156126e757600080fd5b60209290920196919550909350505050565b60006020828403121561270b57600080fd5b5035919050565b60006020828403121561272457600080fd5b5051919050565b6000815180845261274381602086016020860161287b565b601f01601f19169290920160200192915050565b6000825161276981846020870161287b565b9190910192915050565b6000835161278581846020880161287b565b83519083019061279981836020880161287b565b01949350505050565b60006001600160a01b038087168352808616602084015250836040830152608060608301526127d4608083018461272b565b9695505050505050565b602081526000611871602083018461272b565b6000821982111561280457612804612922565b500190565b60008261281857612818612938565b500490565b600081600019048311821515161561283757612837612922565b500290565b60006001600160801b038381169083168181101561285c5761285c612922565b039392505050565b60008282101561287657612876612922565b500390565b60005b8381101561289657818101518382015260200161287e565b838111156115b75750506000910152565b6000816128b6576128b6612922565b506000190190565b600181811c908216806128d257607f821691505b6020821081141561162f57634e487b7160e01b600052602260045260246000fd5b600060001982141561290757612907612922565b5060010190565b60008261291d5761291d612938565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146114b857600080fd5b80151581146114b857600080fd5b6001600160e01b0319811681146114b857600080fdfea2646970667358221220d6af600587e223c11533bbda4ee8559734d91a1fc1ea8c32c5d14e62ec101b2464736f6c63430008070033697066733a2f2f516d5a766a7935597065447054334433637059444e6d674855384d6e79666b337a425a4e476141774b58696b39652f

Deployed Bytecode

0x6080604052600436106102025760003560e01c80636352211e1161011d578063a0712d68116100b0578063ce7c2ac21161007f578063e33b7de311610064578063e33b7de314610669578063e985e9c51461067e578063f2fde38b146106c757600080fd5b8063ce7c2ac2146105fd578063d79779b21461063357600080fd5b8063a0712d681461058a578063a22cb4651461059d578063b88d4fde146105bd578063c87b56dd146105dd57600080fd5b80638b83209b116100ec5780638b83209b146104fc5780638da5cb5b1461051c57806395d89b411461053f5780639852595c1461055457600080fd5b80636352211e1461049257806370a08231146104b2578063715018a6146104d257806376645315146104e757600080fd5b80632e84c3931161019557806342842e0e1161016457806342842e0e1461041d57806348b750441461043d5780634f02c4201461045d57806355f804b31461047257600080fd5b80632e84c393146103765780633a98ef3914610396578063406072a9146103b557806341041eb8146103fb57600080fd5b806316c38b3c116101d157806316c38b3c146103015780631916558714610321578063195894fe1461034157806323b872dd1461035657600080fd5b806301ffc9a71461025057806306fdde0314610285578063081812fc146102a7578063095ea7b3146102df57600080fd5b3661024b577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b34801561025c57600080fd5b5061027061026b36600461264d565b6106e7565b60405190151581526020015b60405180910390f35b34801561029157600080fd5b5061029a610784565b60405161027c91906127de565b3480156102b357600080fd5b506102c76102c23660046126f9565b610816565b6040516001600160a01b03909116815260200161027c565b3480156102eb57600080fd5b506102ff6102fa36600461257b565b61085a565b005b34801561030d57600080fd5b506102ff61031c366004612613565b61091a565b34801561032d57600080fd5b506102ff61033c3660046123d6565b610992565b34801561034d57600080fd5b506102ff610b43565b34801561036257600080fd5b506102ff61037136600461242c565b610c7e565b34801561038257600080fd5b506102ff6103913660046125a7565b610c89565b3480156103a257600080fd5b506008545b60405190815260200161027c565b3480156103c157600080fd5b506103a76103d03660046123f3565b6001600160a01b039182166000908152600e6020908152604080832093909416825291909152205490565b34801561040757600080fd5b50336000908152601060205260409020546103a7565b34801561042957600080fd5b506102ff61043836600461242c565b610d6b565b34801561044957600080fd5b506102ff6104583660046123f3565b610d86565b34801561046957600080fd5b506103a761100a565b34801561047e57600080fd5b506102ff61048d366004612687565b611031565b34801561049e57600080fd5b506102c76104ad3660046126f9565b61109d565b3480156104be57600080fd5b506103a76104cd3660046123d6565b61113d565b3480156104de57600080fd5b506102ff61119b565b3480156104f357600080fd5b506102ff611205565b34801561050857600080fd5b506102c76105173660046126f9565b611274565b34801561052857600080fd5b5060075461010090046001600160a01b03166102c7565b34801561054b57600080fd5b5061029a6112a4565b34801561056057600080fd5b506103a761056f3660046123d6565b6001600160a01b03166000908152600b602052604090205490565b6102ff6105983660046126f9565b6112b3565b3480156105a957600080fd5b506102ff6105b836600461254d565b6114bb565b3480156105c957600080fd5b506102ff6105d836600461246d565b61156a565b3480156105e957600080fd5b5061029a6105f83660046126f9565b6115bd565b34801561060957600080fd5b506103a76106183660046123d6565b6001600160a01b03166000908152600a602052604090205490565b34801561063f57600080fd5b506103a761064e3660046123d6565b6001600160a01b03166000908152600d602052604090205490565b34801561067557600080fd5b506009546103a7565b34801561068a57600080fd5b506102706106993660046123f3565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b3480156106d357600080fd5b506102ff6106e23660046123d6565b611635565b60006001600160e01b031982167f80ac58cd00000000000000000000000000000000000000000000000000000000148061074a57506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061077e57507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b606060018054610793906128be565b80601f01602080910402602001604051908101604052809291908181526020018280546107bf906128be565b801561080c5780601f106107e15761010080835404028352916020019161080c565b820191906000526020600020905b8154815290600101906020018083116107ef57829003601f168201915b5050505050905090565b60006108218261171a565b61083e57604051636c01c8cf60e11b815260040160405180910390fd5b506000908152600560205260409020546001600160a01b031690565b60006108658261109d565b9050806001600160a01b0316836001600160a01b031614156108b3576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336001600160a01b038216148015906108d357506108d18133610699565b155b1561090a576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109158383836117d4565b505050565b6007546001600160a01b0361010090910416331461097f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6011805460ff1916911515919091179055565b6001600160a01b0381166000908152600a6020526040902054610a065760405162461bcd60e51b815260206004820152602660248201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060448201526573686172657360d01b6064820152608401610976565b6000610a1160095490565b610a1b90476127f1565b90506000610a488383610a43866001600160a01b03166000908152600b602052604090205490565b611830565b905080610aab5760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060448201526a191d59481c185e5b595b9d60aa1b6064820152608401610976565b6001600160a01b0383166000908152600b602052604081208054839290610ad39084906127f1565b925050819055508060096000828254610aec91906127f1565b90915550610afc90508382611878565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a1505050565b33600090815260106020526040902054610b9f5760405162461bcd60e51b815260206004820152601660248201527f596f752063616e2774206d696e7420616e7920312f31000000000000000000006044820152606401610976565b333214610bdc5760405162461bcd60e51b815260206004820152600b60248201526a139bc818dbdb9d1c9858dd60aa1b6044820152606401610976565b60115460ff1615610c2f5760405162461bcd60e51b815260206004820152600f60248201527f4d696e74206973206f66666c696e6500000000000000000000000000000000006044820152606401610976565b3360009081526010602052604090205415610c7c5733600081815260106020526040902054610c6b9190610c6690620186a06127f1565b611991565b336000908152601060205260408120555b565b610915838383611a22565b6007546001600160a01b03610100909104163314610ce95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610976565b60005b83811015610d6457828282818110610d0657610d0661294e565b9050602002013560106000878785818110610d2357610d2361294e565b9050602002016020810190610d3891906123d6565b6001600160a01b0316815260208101919091526040016000205580610d5c816128f3565b915050610cec565b5050505050565b6109158383836040518060200160405280600081525061156a565b6001600160a01b0381166000908152600a6020526040902054610dfa5760405162461bcd60e51b815260206004820152602660248201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060448201526573686172657360d01b6064820152608401610976565b6001600160a01b0382166000908152600d60205260408120546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b038516906370a082319060240160206040518083038186803b158015610e6b57600080fd5b505afa158015610e7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea39190612712565b610ead91906127f1565b90506000610ee68383610a4387876001600160a01b039182166000908152600e6020908152604080832093909416825291909152205490565b905080610f495760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060448201526a191d59481c185e5b595b9d60aa1b6064820152608401610976565b6001600160a01b038085166000908152600e6020908152604080832093871683529290529081208054839290610f809084906127f1565b90915550506001600160a01b0384166000908152600d602052604081208054839290610fad9084906127f1565b90915550610fbe9050848483611c25565b604080516001600160a01b038581168252602082018490528616917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a250505050565b60008054611023906001906001600160801b031661283c565b6001600160801b0316905090565b6007546001600160a01b036101009091041633146110915760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610976565b610915600f83836122f1565b6000816110a98161171a565b15611124576000818152600360205260408120546001600160a01b0316156110ea57506000908152600360205260409020546001600160a01b031692915050565b816110f4816128a7565b6000818152600360205260409020549093506001600160a01b0316915050801561111f579392505050565b6110ea565b604051636c01c8cf60e11b815260040160405180910390fd5b60006001600160a01b03821661117f576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001600160a01b031660009081526004602052604090205490565b6007546001600160a01b036101009091041633146111fb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610976565b610c7c6000611ca5565b6007546001600160a01b036101009091041633146112655760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610976565b6007805460ff19166001179055565b6000600c82815481106112895761128961294e565b6000918252602090912001546001600160a01b031692915050565b606060028054610793906128be565b60148111156113045760405162461bcd60e51b815260206004820152600c60248201527f4d617820323020627920747800000000000000000000000000000000000000006044820152606401610976565b611311611b3960016127f1565b6000546113289083906001600160801b03166127f1565b11156113765760405162461bcd60e51b815260206004820152601360248201527f576f756c642065786365656420737570706c79000000000000000000000000006044820152606401610976565b3332146113b35760405162461bcd60e51b815260206004820152600b60248201526a139bc818dbdb9d1c9858dd60aa1b6044820152606401610976565b60115460ff16156114065760405162461bcd60e51b815260206004820152600f60248201527f4d696e74206973206f66666c696e6500000000000000000000000000000000006044820152606401610976565b6114178166470de4df82000061281d565b3410156114665760405162461bcd60e51b815260206004820152601060248201527f4e6f7420656e6f756768206574686572000000000000000000000000000000006044820152606401610976565b33600090815260106020526040902054156114ae573360008181526010602052604090205461149d9190610c6690620186a06127f1565b336000908152601060205260408120555b6114b83382611d16565b50565b6001600160a01b0382163314156114fe576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611575848484611a22565b61158184848484611e5c565b6115b7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b60606115c88261171a565b6115e557604051636c01c8cf60e11b815260040160405180910390fd5b60006115ef611fc0565b60075490915060ff161561077e578061160784611fcf565b604051602001611618929190612773565b604051602081830303815290604052915050919050565b50919050565b6007546001600160a01b036101009091041633146116955760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610976565b6001600160a01b0381166117115760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610976565b6114b881611ca5565b6000805482906001600160801b0316811080156117375750600081115b1561179c576000818152600360205260409020546001600160a01b0316156117625750600192915050565b8061176c816128a7565b6000818152600360205260409020549092506001600160a01b03161590506117975750600192915050565b611762565b620186a0831180156117b05750620186b483105b156111245750506000908152600360205260409020546001600160a01b0316151590565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6008546001600160a01b0384166000908152600a60205260408120549091839161185a908661281d565b6118649190612809565b61186e9190612864565b90505b9392505050565b804710156118c85760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610976565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611915576040519150601f19603f3d011682016040523d82523d6000602084013e61191a565b606091505b50509050806109155760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610976565b6001600160a01b0382166119b757604051622e076360e81b815260040160405180910390fd5b6001600160a01b038216600081815260046020908152604080832080546001019055848352600390915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000818152600360205260408120546001600160a01b03169033821480611a4e5750611a4e8233610699565b80611a69575033611a5e84610816565b6001600160a01b0316145b905080611aa2576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b846001600160a01b0316826001600160a01b031614611aed576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038416611b2d576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b39600084846117d4565b6001600160a01b038086166000908152600460209081526040808320805460001901905587841680845281842080546001908101909155888552600390935281842080546001600160a01b0319169091179055908601808352912054909116158015611baf57506000546001600160801b031681105b15611bdc57600081815260036020526040902080546001600160a01b0319166001600160a01b0385161790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052610915908490612101565b600780546001600160a01b038381166101008181027fffffffffffffffffffffff0000000000000000000000000000000000000000ff85161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000546001600160801b03166001600160a01b038316611d4857604051622e076360e81b815260040160405180910390fd5b81611d7f576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03831660008181526004602090815260408083208054870190558483526003909152812080546001600160a01b03191690921790915580546001600160801b0316905b83811015611e1e576040516001600160801b038316906001600160a01b038716906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a460019182019101611dc9565b50600080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166001600160801b0392909216919091179055505050565b60006001600160a01b0384163b15611fb457604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611ea09033908990889088906004016127a2565b602060405180830381600087803b158015611eba57600080fd5b505af1925050508015611eea575060408051601f3d908101601f19168201909252611ee79181019061266a565b60015b611f9a573d808015611f18576040519150601f19603f3d011682016040523d82523d6000602084013e611f1d565b606091505b508051611f925760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610976565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611fb8565b5060015b949350505050565b6060600f8054610793906128be565b60608161200f57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156120395780612023816128f3565b91506120329050600a83612809565b9150612013565b60008167ffffffffffffffff81111561205457612054612964565b6040519080825280601f01601f19166020018201604052801561207e576020820181803683370190505b5090505b8415611fb857612093600183612864565b91506120a0600a8661290e565b6120ab9060306127f1565b60f81b8183815181106120c0576120c061294e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506120fa600a86612809565b9450612082565b6000612156826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166121e69092919063ffffffff16565b80519091501561091557808060200190518101906121749190612630565b6109155760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610976565b606061186e848460008585843b61223f5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610976565b600080866001600160a01b0316858760405161225b9190612757565b60006040518083038185875af1925050503d8060008114612298576040519150601f19603f3d011682016040523d82523d6000602084013e61229d565b606091505b50915091506122ad8282866122b8565b979650505050505050565b606083156122c7575081611871565b8251156122d75782518084602001fd5b8160405162461bcd60e51b815260040161097691906127de565b8280546122fd906128be565b90600052602060002090601f01602090048101928261231f5760008555612365565b82601f106123385782800160ff19823516178555612365565b82800160010185558215612365579182015b8281111561236557823582559160200191906001019061234a565b50612371929150612375565b5090565b5b808211156123715760008155600101612376565b60008083601f84011261239c57600080fd5b50813567ffffffffffffffff8111156123b457600080fd5b6020830191508360208260051b85010111156123cf57600080fd5b9250929050565b6000602082840312156123e857600080fd5b81356118718161297a565b6000806040838503121561240657600080fd5b82356124118161297a565b915060208301356124218161297a565b809150509250929050565b60008060006060848603121561244157600080fd5b833561244c8161297a565b9250602084013561245c8161297a565b929592945050506040919091013590565b6000806000806080858703121561248357600080fd5b843561248e8161297a565b9350602085013561249e8161297a565b925060408501359150606085013567ffffffffffffffff808211156124c257600080fd5b818701915087601f8301126124d657600080fd5b8135818111156124e8576124e8612964565b604051601f8201601f19908116603f0116810190838211818310171561251057612510612964565b816040528281528a602084870101111561252957600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561256057600080fd5b823561256b8161297a565b915060208301356124218161298f565b6000806040838503121561258e57600080fd5b82356125998161297a565b946020939093013593505050565b600080600080604085870312156125bd57600080fd5b843567ffffffffffffffff808211156125d557600080fd5b6125e18883890161238a565b909650945060208701359150808211156125fa57600080fd5b506126078782880161238a565b95989497509550505050565b60006020828403121561262557600080fd5b81356118718161298f565b60006020828403121561264257600080fd5b81516118718161298f565b60006020828403121561265f57600080fd5b81356118718161299d565b60006020828403121561267c57600080fd5b81516118718161299d565b6000806020838503121561269a57600080fd5b823567ffffffffffffffff808211156126b257600080fd5b818501915085601f8301126126c657600080fd5b8135818111156126d557600080fd5b8660208285010111156126e757600080fd5b60209290920196919550909350505050565b60006020828403121561270b57600080fd5b5035919050565b60006020828403121561272457600080fd5b5051919050565b6000815180845261274381602086016020860161287b565b601f01601f19169290920160200192915050565b6000825161276981846020870161287b565b9190910192915050565b6000835161278581846020880161287b565b83519083019061279981836020880161287b565b01949350505050565b60006001600160a01b038087168352808616602084015250836040830152608060608301526127d4608083018461272b565b9695505050505050565b602081526000611871602083018461272b565b6000821982111561280457612804612922565b500190565b60008261281857612818612938565b500490565b600081600019048311821515161561283757612837612922565b500290565b60006001600160801b038381169083168181101561285c5761285c612922565b039392505050565b60008282101561287657612876612922565b500390565b60005b8381101561289657818101518382015260200161287e565b838111156115b75750506000910152565b6000816128b6576128b6612922565b506000190190565b600181811c908216806128d257607f821691505b6020821081141561162f57634e487b7160e01b600052602260045260246000fd5b600060001982141561290757612907612922565b5060010190565b60008261291d5761291d612938565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146114b857600080fd5b80151581146114b857600080fd5b6001600160e01b0319811681146114b857600080fdfea2646970667358221220d6af600587e223c11533bbda4ee8559734d91a1fc1ea8c32c5d14e62ec101b2464736f6c63430008070033

Deployed Bytecode Sourcemap

50794:2568:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23891:40;5839:10;23891:40;;;-1:-1:-1;;;;;8807:55:1;;;8789:74;;23921:9:0;8894:2:1;8879:18;;8872:34;8762:18;23891:40:0;;;;;;;50794:2568;;;;;38861:266;;;;;;;;;;-1:-1:-1;38861:266:0;;;;;:::i;:::-;;:::i;:::-;;;9900:14:1;;9893:22;9875:41;;9863:2;9848:18;38861:266:0;;;;;;;;39997:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;41500:202::-;;;;;;;;;;-1:-1:-1;41500:202:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;8540:55:1;;;8522:74;;8510:2;8495:18;41500:202:0;8376:226:1;41101:333:0;;;;;;;;;;-1:-1:-1;41101:333:0;;;;;:::i;:::-;;:::i;:::-;;53079:78;;;;;;;;;;-1:-1:-1;53079:78:0;;;;;:::i;:::-;;:::i;25677:566::-;;;;;;;;;;-1:-1:-1;25677:566:0;;;;;:::i;:::-;;:::i;51991:363::-;;;;;;;;;;;;;:::i;42354:136::-;;;;;;;;;;-1:-1:-1;42354:136:0;;;;;:::i;:::-;;:::i;52403:184::-;;;;;;;;;;-1:-1:-1;52403:184:0;;;;;:::i;:::-;;:::i;24022:91::-;;;;;;;;;;-1:-1:-1;24093:12:0;;24022:91;;;16333:25:1;;;16321:2;16306:18;24022:91:0;16187:177:1;25151:135:0;;;;;;;;;;-1:-1:-1;25151:135:0;;;;;:::i;:::-;-1:-1:-1;;;;;25248:21:0;;;25221:7;25248:21;;;:14;:21;;;;;;;;:30;;;;;;;;;;;;;25151:135;52682:95;;;;;;;;;;-1:-1:-1;52758:10:0;52725:4;52749:20;;;:8;:20;;;;;;52682:95;;42561:151;;;;;;;;;;-1:-1:-1;42561:151:0;;;;;:::i;:::-;;:::i;26511:641::-;;;;;;;;;;-1:-1:-1;26511:641:0;;;;;:::i;:::-;;:::i;53271:88::-;;;;;;;;;;;;;:::i;52949:101::-;;;;;;;;;;-1:-1:-1;52949:101:0;;;;;:::i;:::-;;:::i;39447:483::-;;;;;;;;;;-1:-1:-1;39447:483:0;;;;;:::i;:::-;;:::i;39191:194::-;;;;;;;;;;-1:-1:-1;39191:194:0;;;;;:::i;:::-;;:::i;7686:103::-;;;;;;;;;;;;;:::i;53187:76::-;;;;;;;;;;;;;:::i;25377:100::-;;;;;;;;;;-1:-1:-1;25377:100:0;;;;;:::i;:::-;;:::i;7035:87::-;;;;;;;;;;-1:-1:-1;7108:6:0;;;;;-1:-1:-1;;;;;7108:6:0;7035:87;;40166:104;;;;;;;;;;;;;:::i;24873:109::-;;;;;;;;;;-1:-1:-1;24873:109:0;;;;;:::i;:::-;-1:-1:-1;;;;;24956:18:0;24929:7;24956:18;;;:9;:18;;;;;;;24873:109;51400:561;;;;;;:::i;:::-;;:::i;41774:277::-;;;;;;;;;;-1:-1:-1;41774:277:0;;;;;:::i;:::-;;:::i;42783:273::-;;;;;;;;;;-1:-1:-1;42783:273:0;;;;;:::i;:::-;;:::i;40341:355::-;;;;;;;;;;-1:-1:-1;40341:355:0;;;;;:::i;:::-;;:::i;24669:105::-;;;;;;;;;;-1:-1:-1;24669:105:0;;;;;:::i;:::-;-1:-1:-1;;;;;24750:16:0;24723:7;24750:16;;;:7;:16;;;;;;;24669:105;24459:119;;;;;;;;;;-1:-1:-1;24459:119:0;;;;;:::i;:::-;-1:-1:-1;;;;;24544:26:0;24517:7;24544:26;;;:19;:26;;;;;;;24459:119;24207:95;;;;;;;;;;-1:-1:-1;24280:14:0;;24207:95;;42122:164;;;;;;;;;;-1:-1:-1;42122:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;42243:25:0;;;42219:4;42243:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;42122:164;7944:201;;;;;;;;;;-1:-1:-1;7944:201:0;;;;;:::i;:::-;;:::i;38861:266::-;38963:4;-1:-1:-1;;;;;;38987:40:0;;39002:25;38987:40;;:92;;-1:-1:-1;;;;;;;39031:48:0;;39046:33;39031:48;38987:92;:132;;;-1:-1:-1;31187:25:0;-1:-1:-1;;;;;;31172:40:0;;;39083:36;38980:139;38861:266;-1:-1:-1;;38861:266:0:o;39997:100::-;40051:13;40084:5;40077:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39997:100;:::o;41500:202::-;41576:7;41601:16;41609:7;41601;:16::i;:::-;41596:56;;41626:26;;-1:-1:-1;;;41626:26:0;;;;;;;;;;;41596:56;-1:-1:-1;41670:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;41670:24:0;;41500:202::o;41101:333::-;41174:13;41190:16;41198:7;41190;:16::i;:::-;41174:32;;41227:5;-1:-1:-1;;;;;41221:11:0;:2;-1:-1:-1;;;;;41221:11:0;;41217:48;;;41241:24;;;;;;;;;;;;;;41217:48;5839:10;-1:-1:-1;;;;;41280:21:0;;;;;;:63;;-1:-1:-1;41306:37:0;41323:5;5839:10;42122:164;:::i;41306:37::-;41305:38;41280:63;41276:111;;;41352:35;;;;;;;;;;;;;;41276:111;41398:28;41407:2;41411:7;41420:5;41398:8;:28::i;:::-;41163:271;41101:333;;:::o;53079:78::-;7108:6;;-1:-1:-1;;;;;7108:6:0;;;;;5839:10;7255:23;7247:68;;;;-1:-1:-1;;;7247:68:0;;14568:2:1;7247:68:0;;;14550:21:1;;;14587:18;;;14580:30;14646:34;14626:18;;;14619:62;14698:18;;7247:68:0;;;;;;;;;53138:6:::1;:11:::0;;-1:-1:-1;;53138:11:0::1;::::0;::::1;;::::0;;;::::1;::::0;;53079:78::o;25677:566::-;-1:-1:-1;;;;;25753:16:0;;25772:1;25753:16;;;:7;:16;;;;;;25745:71;;;;-1:-1:-1;;;25745:71:0;;11865:2:1;25745:71:0;;;11847:21:1;11904:2;11884:18;;;11877:30;11943:34;11923:18;;;11916:62;-1:-1:-1;;;11994:18:1;;;11987:36;12040:19;;25745:71:0;11663:402:1;25745:71:0;25829:21;25877:15;24280:14;;;24207:95;25877:15;25853:39;;:21;:39;:::i;:::-;25829:63;;25903:15;25921:58;25937:7;25946:13;25961:17;25970:7;-1:-1:-1;;;;;24956:18:0;24929:7;24956:18;;;:9;:18;;;;;;;24873:109;25961:17;25921:15;:58::i;:::-;25903:76;-1:-1:-1;26000:12:0;25992:68;;;;-1:-1:-1;;;25992:68:0;;13464:2:1;25992:68:0;;;13446:21:1;13503:2;13483:18;;;13476:30;13542:34;13522:18;;;13515:62;-1:-1:-1;;;13593:18:1;;;13586:41;13644:19;;25992:68:0;13262:407:1;25992:68:0;-1:-1:-1;;;;;26073:18:0;;;;;;:9;:18;;;;;:29;;26095:7;;26073:18;:29;;26095:7;;26073:29;:::i;:::-;;;;;;;;26131:7;26113:14;;:25;;;;;;;:::i;:::-;;;;-1:-1:-1;26151:35:0;;-1:-1:-1;26169:7:0;26178;26151:17;:35::i;:::-;26202:33;;;-1:-1:-1;;;;;8807:55:1;;8789:74;;8894:2;8879:18;;8872:34;;;26202:33:0;;8762:18:1;26202:33:0;;;;;;;25734:509;;25677:566;:::o;51991:363::-;52758:10;52725:4;52749:20;;;:8;:20;;;;;;52041:52;;;;-1:-1:-1;;;52041:52:0;;15287:2:1;52041:52:0;;;15269:21:1;15326:2;15306:18;;;15299:30;15365:24;15345:18;;;15338:52;15407:18;;52041:52:0;15085:346:1;52041:52:0;52112:10;52126:9;52112:23;52104:46;;;;-1:-1:-1;;;52104:46:0;;16049:2:1;52104:46:0;;;16031:21:1;16088:2;16068:18;;;16061:30;-1:-1:-1;;;16107:18:1;;;16100:41;16158:18;;52104:46:0;15847:335:1;52104:46:0;52170:6;;;;52169:7;52161:34;;;;-1:-1:-1;;;52161:34:0;;13876:2:1;52161:34:0;;;13858:21:1;13915:2;13895:18;;;13888:30;13954:17;13934:18;;;13927:45;13989:18;;52161:34:0;13674:339:1;52161:34:0;52758:10;52725:4;52749:20;;;:8;:20;;;;;;52210:17;52206:140;;52256:10;52267:20;;;;:8;:20;;;;;;52243:52;;52256:10;52267:27;;52288:6;52267:27;:::i;:::-;52243:12;:52::i;:::-;52319:10;52333:1;52310:20;;;:8;:20;;;;;:24;52206:140;51991:363::o;42354:136::-;42454:28;42464:4;42470:2;42474:7;42454:9;:28::i;52403:184::-;7108:6;;-1:-1:-1;;;;;7108:6:0;;;;;5839:10;7255:23;7247:68;;;;-1:-1:-1;;;7247:68:0;;14568:2:1;7247:68:0;;;14550:21:1;;;14587:18;;;14580:30;14646:34;14626:18;;;14619:62;14698:18;;7247:68:0;14366:356:1;7247:68:0;52511:6:::1;52506:73;52520:19:::0;;::::1;52506:73;;;52573:3;;52577:1;52573:6;;;;;;;:::i;:::-;;;;;;;52547:8;:23;52556:10;;52567:1;52556:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;52547:23:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;52547:23:0;:32;52542:3;::::1;::::0;::::1;:::i;:::-;;;;52506:73;;;;52403:184:::0;;;;:::o;42561:151::-;42665:39;42682:4;42688:2;42692:7;42665:39;;;;;;;;;;;;:16;:39::i;26511:641::-;-1:-1:-1;;;;;26593:16:0;;26612:1;26593:16;;;:7;:16;;;;;;26585:71;;;;-1:-1:-1;;;26585:71:0;;11865:2:1;26585:71:0;;;11847:21:1;11904:2;11884:18;;;11877:30;11943:34;11923:18;;;11916:62;-1:-1:-1;;;11994:18:1;;;11987:36;12040:19;;26585:71:0;11663:402:1;26585:71:0;-1:-1:-1;;;;;24544:26:0;;26669:21;24544:26;;;:19;:26;;;;;;26693:30;;;;;26717:4;26693:30;;;8522:74:1;-1:-1:-1;;;;;26693:15:0;;;;;8495:18:1;;26693:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;;;:::i;:::-;26669:77;;26757:15;26775:65;26791:7;26800:13;26815:24;26824:5;26831:7;-1:-1:-1;;;;;25248:21:0;;;25221:7;25248:21;;;:14;:21;;;;;;;;:30;;;;;;;;;;;;;25151:135;26775:65;26757:83;-1:-1:-1;26861:12:0;26853:68;;;;-1:-1:-1;;;26853:68:0;;13464:2:1;26853:68:0;;;13446:21:1;13503:2;13483:18;;;13476:30;13542:34;13522:18;;;13515:62;-1:-1:-1;;;13593:18:1;;;13586:41;13644:19;;26853:68:0;13262:407:1;26853:68:0;-1:-1:-1;;;;;26934:21:0;;;;;;;:14;:21;;;;;;;;:30;;;;;;;;;;;:41;;26968:7;;26934:21;:41;;26968:7;;26934:41;:::i;:::-;;;;-1:-1:-1;;;;;;;26986:26:0;;;;;;:19;:26;;;;;:37;;27016:7;;26986:26;:37;;27016:7;;26986:37;:::i;:::-;;;;-1:-1:-1;27036:47:0;;-1:-1:-1;27059:5:0;27066:7;27075;27036:22;:47::i;:::-;27099:45;;;-1:-1:-1;;;;;8807:55:1;;;8789:74;;8894:2;8879:18;;8872:34;;;27099:45:0;;;;;8762:18:1;27099:45:0;;;;;;;26574:578;;26511:641;;:::o;53271:88::-;53313:4;53336:13;;:15;;53350:1;;-1:-1:-1;;;;;53336:13:0;:15;:::i;:::-;-1:-1:-1;;;;;53329:22:0;;;53271:88;:::o;52949:101::-;7108:6;;-1:-1:-1;;;;;7108:6:0;;;;;5839:10;7255:23;7247:68;;;;-1:-1:-1;;;7247:68:0;;14568:2:1;7247:68:0;;;14550:21:1;;;14587:18;;;14580:30;14646:34;14626:18;;;14619:62;14698:18;;7247:68:0;14366:356:1;7247:68:0;53024:18:::1;:8;53035:7:::0;;53024:18:::1;:::i;39447:483::-:0;39511:7;39546;39570:13;39546:7;39570;:13::i;:::-;39566:313;;;39600:11;39630:23;;;:17;:23;;;;;;-1:-1:-1;;;;;39630:23:0;:37;39626:73;;-1:-1:-1;39676:23:0;;;;:17;:23;;;;;;-1:-1:-1;;;;;39676:23:0;;39447:483;-1:-1:-1;;39447:483:0:o;39626:73::-;39746:6;;;;:::i;:::-;39777:23;;;;:17;:23;;;;;;39746:6;;-1:-1:-1;;;;;;39777:23:0;;-1:-1:-1;;39823:17:0;;39819:33;;39849:3;39447:483;-1:-1:-1;;;39447:483:0:o;39819:33::-;39714:154;;39566:313;39896:26;;-1:-1:-1;;;39896:26:0;;;;;;;;;;;39191:194;39263:7;-1:-1:-1;;;;;39287:19:0;;39283:60;;39315:28;;;;;;;;;;;;;;39283:60;-1:-1:-1;;;;;;39361:16:0;;;;;:9;:16;;;;;;;39191:194::o;7686:103::-;7108:6;;-1:-1:-1;;;;;7108:6:0;;;;;5839:10;7255:23;7247:68;;;;-1:-1:-1;;;7247:68:0;;14568:2:1;7247:68:0;;;14550:21:1;;;14587:18;;;14580:30;14646:34;14626:18;;;14619:62;14698:18;;7247:68:0;14366:356:1;7247:68:0;7751:30:::1;7778:1;7751:18;:30::i;53187:76::-:0;7108:6;;-1:-1:-1;;;;;7108:6:0;;;;;5839:10;7255:23;7247:68;;;;-1:-1:-1;;;7247:68:0;;14568:2:1;7247:68:0;;;14550:21:1;;;14587:18;;;14580:30;14646:34;14626:18;;;14619:62;14698:18;;7247:68:0;14366:356:1;7247:68:0;53239:9:::1;:16:::0;;-1:-1:-1;;53239:16:0::1;53251:4;53239:16;::::0;;53187:76::o;25377:100::-;25428:7;25455;25463:5;25455:14;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;25455:14:0;;25377:100;-1:-1:-1;;25377:100:0:o;40166:104::-;40222:13;40255:7;40248:14;;;;;:::i;51400:561::-;50936:2;51465:8;:25;;51457:49;;;;-1:-1:-1;;;51457:49:0;;11524:2:1;51457:49:0;;;11506:21:1;11563:2;11543:18;;;11536:30;11602:14;11582:18;;;11575:42;11634:18;;51457:49:0;11322:336:1;51457:49:0;51553:13;50891:4;51565:1;51553:13;:::i;:::-;51525;;:24;;51541:8;;-1:-1:-1;;;;;51525:13:0;:24;:::i;:::-;:41;;51517:72;;;;-1:-1:-1;;;51517:72:0;;14220:2:1;51517:72:0;;;14202:21:1;14259:2;14239:18;;;14232:30;14298:21;14278:18;;;14271:49;14337:18;;51517:72:0;14018:343:1;51517:72:0;51608:10;51622:9;51608:23;51600:46;;;;-1:-1:-1;;;51600:46:0;;16049:2:1;51600:46:0;;;16031:21:1;16088:2;16068:18;;;16061:30;-1:-1:-1;;;16107:18:1;;;16100:41;16158:18;;51600:46:0;15847:335:1;51600:46:0;51666:6;;;;51665:7;51657:34;;;;-1:-1:-1;;;51657:34:0;;13876:2:1;51657:34:0;;;13858:21:1;13915:2;13895:18;;;13888:30;13954:17;13934:18;;;13927:45;13989:18;;51657:34:0;13674:339:1;51657:34:0;51723:21;51736:8;50972:10;51723:21;:::i;:::-;51710:9;:34;;51702:62;;;;-1:-1:-1;;;51702:62:0;;10353:2:1;51702:62:0;;;10335:21:1;10392:2;10372:18;;;10365:30;10431:18;10411;;;10404:46;10467:18;;51702:62:0;10151:340:1;51702:62:0;52758:10;52725:4;52749:20;;;:8;:20;;;;;;51779:17;51775:140;;51825:10;51836:20;;;;:8;:20;;;;;;51812:52;;51825:10;51836:27;;51857:6;51836:27;:::i;51812:52::-;51888:10;51902:1;51879:20;;;:8;:20;;;;;:24;51775:140;51926:27;51932:10;51944:8;51926:5;:27::i;:::-;51400:561;:::o;41774:277::-;-1:-1:-1;;;;;41865:24:0;;5839:10;41865:24;41861:54;;;41898:17;;;;;;;;;;;;;;41861:54;5839:10;41926:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;41926:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;41926:53:0;;;;;;;;;;41995:48;;9875:41:1;;;41926:42:0;;5839:10;41995:48;;9848:18:1;41995:48:0;;;;;;;41774:277;;:::o;42783:273::-;42907:28;42917:4;42923:2;42927:7;42907:9;:28::i;:::-;42951:48;42974:4;42980:2;42984:7;42993:5;42951:22;:48::i;:::-;42946:102;;43008:40;;;;;;;;;;;;;;42946:102;42783:273;;;;:::o;40341:355::-;40414:13;40445:16;40453:7;40445;:16::i;:::-;40440:56;;40470:26;;-1:-1:-1;;;40470:26:0;;;;;;;;;;;40440:56;40511:21;40535:10;:8;:10::i;:::-;40560:9;;40511:34;;-1:-1:-1;40560:9:0;;40556:132;;;40615:7;40624:18;:7;:16;:18::i;:::-;40598:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;40584:60;;;40341:355;;;:::o;40556:132::-;40429:267;40341:355;;;:::o;7944:201::-;7108:6;;-1:-1:-1;;;;;7108:6:0;;;;;5839:10;7255:23;7247:68;;;;-1:-1:-1;;;7247:68:0;;14568:2:1;7247:68:0;;;14550:21:1;;;14587:18;;;14580:30;14646:34;14626:18;;;14619:62;14698:18;;7247:68:0;14366:356:1;7247:68:0;-1:-1:-1;;;;;8033:22:0;::::1;8025:73;;;::::0;-1:-1:-1;;;8025:73:0;;11117:2:1;8025:73:0::1;::::0;::::1;11099:21:1::0;11156:2;11136:18;;;11129:30;11195:34;11175:18;;;11168:62;11266:8;11246:18;;;11239:36;11292:19;;8025:73:0::1;10915:402:1::0;8025:73:0::1;8109:28;8128:8;8109:18;:28::i;43371:627::-:0;43436:4;43496:13;;43468:7;;-1:-1:-1;;;;;43496:13:0;43490:19;;:30;;;;;43519:1;43513:4;:7;43490:30;43486:461;;;43575:1;43540:23;;;:17;:23;;;;;;-1:-1:-1;;;;;43540:23:0;:37;43536:89;;-1:-1:-1;43605:4:0;;43371:627;-1:-1:-1;;43371:627:0:o;43536:89::-;43671:6;;;;:::i;:::-;43735:1;43700:23;;;:17;:23;;;;;;43671:6;;-1:-1:-1;;;;;;43700:23:0;:37;;-1:-1:-1;43696:97:0;;-1:-1:-1;43769:4:0;;43371:627;-1:-1:-1;;43371:627:0:o;43696:97::-;43639:169;;43486:461;43847:6;43838:7;:15;:34;;;;;43866:6;43857:7;:15;43838:34;43834:113;;;-1:-1:-1;;43933:1:0;43895:26;;;:17;:26;;;;;;-1:-1:-1;;;;;43895:26:0;:40;;;43371:627::o;47477:162::-;47558:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;47558:29:0;-1:-1:-1;;;;;47558:29:0;;;;;;;;;47603:28;;47558:24;;47603:28;;;;;;;47477:162;;;:::o;27330:248::-;27540:12;;-1:-1:-1;;;;;27520:16:0;;27476:7;27520:16;;;:7;:16;;;;;;27476:7;;27555:15;;27504:32;;:13;:32;:::i;:::-;27503:49;;;;:::i;:::-;:67;;;;:::i;:::-;27496:74;;27330:248;;;;;;:::o;10645:317::-;10760:6;10735:21;:31;;10727:73;;;;-1:-1:-1;;;10727:73:0;;12699:2:1;10727:73:0;;;12681:21:1;12738:2;12718:18;;;12711:30;12777:31;12757:18;;;12750:59;12826:18;;10727:73:0;12497:353:1;10727:73:0;10814:12;10832:9;-1:-1:-1;;;;;10832:14:0;10854:6;10832:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10813:52;;;10884:7;10876:78;;;;-1:-1:-1;;;10876:78:0;;12272:2:1;10876:78:0;;;12254:21:1;12311:2;12291:18;;;12284:30;12350:34;12330:18;;;12323:62;12421:28;12401:18;;;12394:56;12467:19;;10876:78:0;12070:422:1;45298:280:0;-1:-1:-1;;;;;45368:16:0;;45364:48;;45393:19;;-1:-1:-1;;;45393:19:0;;;;;;;;;;;45364:48;-1:-1:-1;;;;;45450:13:0;;;;;;:9;:13;;;;;;;;:16;;;;;;45483:21;;;:17;:21;;;;;;:26;;-1:-1:-1;;;;;;45483:26:0;;;;;45531:28;45501:2;;45450:13;;45531:28;;45450:13;;45531:28;45298:280;;:::o;45832:1527::-;45913:17;45933:26;;;:17;:26;;;;;;-1:-1:-1;;;;;45933:26:0;;5839:10;45996:25;;;:70;;-1:-1:-1;46025:41:0;46042:9;5839:10;42122:164;:::i;46025:41::-;45996:110;;;-1:-1:-1;5839:10:0;46070:20;46082:7;46070:11;:20::i;:::-;-1:-1:-1;;;;;46070:36:0;;45996:110;45970:137;;46123:17;46118:66;;46149:35;;;;;;;;;;;;;;46118:66;46212:4;-1:-1:-1;;;;;46199:17:0;:9;-1:-1:-1;;;;;46199:17:0;;46195:58;;46225:28;;;;;;;;;;;;;;46195:58;-1:-1:-1;;;;;46268:16:0;;46264:52;;46293:23;;;;;;;;;;;;;;46264:52;46379:40;46396:1;46400:7;46409:9;46379:8;:40::i;:::-;-1:-1:-1;;;;;46713:15:0;;;;;;;:9;:15;;;;;;;;:18;;-1:-1:-1;;46713:18:0;;;46746:13;;;;;;;;;:16;;46713:18;46746:16;;;;;;46777:26;;;:17;:26;;;;;;:31;;-1:-1:-1;;;;;;46777:31:0;;;;;;47080:11;;;47178:30;;;;;;47080:11;;47178:30;:44;:75;;;;-1:-1:-1;47240:13:0;;-1:-1:-1;;;;;47240:13:0;47226:27;;47178:75;47174:123;;;47255:30;;;;:17;:30;;;;;:42;;-1:-1:-1;;;;;;47255:42:0;-1:-1:-1;;;;;47255:42:0;;;;;47174:123;46688:621;47343:7;47339:2;-1:-1:-1;;;;;47324:27:0;47333:4;-1:-1:-1;;;;;47324:27:0;;;;;;;;;;;45902:1457;;45832:1527;;;:::o;17351:211::-;17495:58;;;-1:-1:-1;;;;;8807:55:1;;17495:58:0;;;8789:74:1;8879:18;;;;8872:34;;;17495:58:0;;;;;;;;;;8762:18:1;;;;17495:58:0;;;;;;;;;;17518:23;17495:58;;;17468:86;;17488:5;;17468:19;:86::i;8305:191::-;8398:6;;;-1:-1:-1;;;;;8415:17:0;;;8398:6;8415:17;;;;;;;;;;8448:40;;8398:6;;;;;;;;8448:40;;8379:16;;8448:40;8368:128;8305:191;:::o;44257:832::-;44322:20;44345:13;-1:-1:-1;;;;;44345:13:0;-1:-1:-1;;;;;44373:16:0;;44369:48;;44398:19;;-1:-1:-1;;;44398:19:0;;;;;;;;;;;44369:48;44432:13;44428:44;;44454:18;;;;;;;;;;;;;;44428:44;-1:-1:-1;;;;;44734:13:0;;;;;;:9;:13;;;;;;;;:25;;;;;;44774:31;;;:17;:31;;;;;:36;;-1:-1:-1;;;;;;44774:36:0;;;;;;;44850:13;;-1:-1:-1;;;;;44850:13:0;;44880:146;44900:8;44896:1;:12;44880:146;;;44939:38;;-1:-1:-1;;;;;44939:38:0;;;-1:-1:-1;;;;;44939:38:0;;;44956:1;;44939:38;;44956:1;;44939:38;44996:14;;;;;44910:3;44880:146;;;-1:-1:-1;45042:13:0;:28;;;;-1:-1:-1;;;;;45042:28:0;;;;;;;;;;-1:-1:-1;;;44257:832:0:o;48204:732::-;48316:4;-1:-1:-1;;;;;48337:13:0;;9646:20;9694:8;48333:585;;48372:72;;-1:-1:-1;;;48372:72:0;;-1:-1:-1;;;;;48372:36:0;;;;;:72;;5839:10;;48423:4;;48429:7;;48438:5;;48372:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48372:72:0;;;;;;;;-1:-1:-1;;48372:72:0;;;;;;;;;;;;:::i;:::-;;;48368:524;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48614:13:0;;48610:249;;48656:60;;-1:-1:-1;;;48656:60:0;;10698:2:1;48656:60:0;;;10680:21:1;10737:2;10717:18;;;10710:30;10776:34;10756:18;;;10749:62;10847:20;10827:18;;;10820:48;10885:19;;48656:60:0;10496:414:1;48610:249:0;48828:6;48822:13;48813:6;48809:2;48805:15;48798:38;48368:524;-1:-1:-1;;;;;;48495:51:0;-1:-1:-1;;;48495:51:0;;-1:-1:-1;48488:58:0;;48333:585;-1:-1:-1;48914:4:0;48333:585;48204:732;;;;;;:::o;52817:101::-;52869:13;52902:8;52895:15;;;;;:::i;3321:723::-;3377:13;3598:10;3594:53;;-1:-1:-1;;3625:10:0;;;;;;;;;;;;;;;;;;3321:723::o;3594:53::-;3672:5;3657:12;3713:78;3720:9;;3713:78;;3746:8;;;;:::i;:::-;;-1:-1:-1;3769:10:0;;-1:-1:-1;3777:2:0;3769:10;;:::i;:::-;;;3713:78;;;3801:19;3833:6;3823:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3823:17:0;;3801:39;;3851:154;3858:10;;3851:154;;3885:11;3895:1;3885:11;;:::i;:::-;;-1:-1:-1;3954:10:0;3962:2;3954:5;:10;:::i;:::-;3941:24;;:2;:24;:::i;:::-;3928:39;;3911:6;3918;3911:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;3982:11:0;3991:2;3982:11;;:::i;:::-;;;3851:154;;19924:716;20348:23;20374:69;20402:4;20374:69;;;;;;;;;;;;;;;;;20382:5;-1:-1:-1;;;;;20374:27:0;;;:69;;;;;:::i;:::-;20458:17;;20348:95;;-1:-1:-1;20458:21:0;20454:179;;20555:10;20544:30;;;;;;;;;;;;:::i;:::-;20536:85;;;;-1:-1:-1;;;20536:85:0;;15638:2:1;20536:85:0;;;15620:21:1;15677:2;15657:18;;;15650:30;15716:34;15696:18;;;15689:62;15787:12;15767:18;;;15760:40;15817:19;;20536:85:0;15436:406:1;12129:229:0;12266:12;12298:52;12320:6;12328:4;12334:1;12337:12;12266;9646:20;;13536:60;;;;-1:-1:-1;;;13536:60:0;;14929:2:1;13536:60:0;;;14911:21:1;14968:2;14948:18;;;14941:30;15007:31;14987:18;;;14980:59;15056:18;;13536:60:0;14727:353:1;13536:60:0;13610:12;13624:23;13651:6;-1:-1:-1;;;;;13651:11:0;13670:5;13677:4;13651:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13609:73;;;;13700:51;13717:7;13726:10;13738:12;13700:16;:51::i;:::-;13693:58;13249:510;-1:-1:-1;;;;;;;13249:510:0:o;15935:712::-;16085:12;16114:7;16110:530;;;-1:-1:-1;16145:10:0;16138:17;;16110:530;16259:17;;:21;16255:374;;16457:10;16451:17;16518:15;16505:10;16501:2;16497:19;16490:44;16255:374;16600:12;16593:20;;-1:-1:-1;;;16593:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:367:1;77:8;87:6;141:3;134:4;126:6;122:17;118:27;108:55;;159:1;156;149:12;108:55;-1:-1:-1;182:20:1;;225:18;214:30;;211:50;;;257:1;254;247:12;211:50;294:4;286:6;282:17;270:29;;354:3;347:4;337:6;334:1;330:14;322:6;318:27;314:38;311:47;308:67;;;371:1;368;361:12;308:67;14:367;;;;;:::o;386:247::-;445:6;498:2;486:9;477:7;473:23;469:32;466:52;;;514:1;511;504:12;466:52;553:9;540:23;572:31;597:5;572:31;:::i;898:388::-;966:6;974;1027:2;1015:9;1006:7;1002:23;998:32;995:52;;;1043:1;1040;1033:12;995:52;1082:9;1069:23;1101:31;1126:5;1101:31;:::i;:::-;1151:5;-1:-1:-1;1208:2:1;1193:18;;1180:32;1221:33;1180:32;1221:33;:::i;:::-;1273:7;1263:17;;;898:388;;;;;:::o;1291:456::-;1368:6;1376;1384;1437:2;1425:9;1416:7;1412:23;1408:32;1405:52;;;1453:1;1450;1443:12;1405:52;1492:9;1479:23;1511:31;1536:5;1511:31;:::i;:::-;1561:5;-1:-1:-1;1618:2:1;1603:18;;1590:32;1631:33;1590:32;1631:33;:::i;:::-;1291:456;;1683:7;;-1:-1:-1;;;1737:2:1;1722:18;;;;1709:32;;1291:456::o;1752:1266::-;1847:6;1855;1863;1871;1924:3;1912:9;1903:7;1899:23;1895:33;1892:53;;;1941:1;1938;1931:12;1892:53;1980:9;1967:23;1999:31;2024:5;1999:31;:::i;:::-;2049:5;-1:-1:-1;2106:2:1;2091:18;;2078:32;2119:33;2078:32;2119:33;:::i;:::-;2171:7;-1:-1:-1;2225:2:1;2210:18;;2197:32;;-1:-1:-1;2280:2:1;2265:18;;2252:32;2303:18;2333:14;;;2330:34;;;2360:1;2357;2350:12;2330:34;2398:6;2387:9;2383:22;2373:32;;2443:7;2436:4;2432:2;2428:13;2424:27;2414:55;;2465:1;2462;2455:12;2414:55;2501:2;2488:16;2523:2;2519;2516:10;2513:36;;;2529:18;;:::i;:::-;2604:2;2598:9;2572:2;2658:13;;-1:-1:-1;;2654:22:1;;;2678:2;2650:31;2646:40;2634:53;;;2702:18;;;2722:22;;;2699:46;2696:72;;;2748:18;;:::i;:::-;2788:10;2784:2;2777:22;2823:2;2815:6;2808:18;2863:7;2858:2;2853;2849;2845:11;2841:20;2838:33;2835:53;;;2884:1;2881;2874:12;2835:53;2940:2;2935;2931;2927:11;2922:2;2914:6;2910:15;2897:46;2985:1;2980:2;2975;2967:6;2963:15;2959:24;2952:35;3006:6;2996:16;;;;;;;1752:1266;;;;;;;:::o;3023:382::-;3088:6;3096;3149:2;3137:9;3128:7;3124:23;3120:32;3117:52;;;3165:1;3162;3155:12;3117:52;3204:9;3191:23;3223:31;3248:5;3223:31;:::i;:::-;3273:5;-1:-1:-1;3330:2:1;3315:18;;3302:32;3343:30;3302:32;3343:30;:::i;3410:315::-;3478:6;3486;3539:2;3527:9;3518:7;3514:23;3510:32;3507:52;;;3555:1;3552;3545:12;3507:52;3594:9;3581:23;3613:31;3638:5;3613:31;:::i;:::-;3663:5;3715:2;3700:18;;;;3687:32;;-1:-1:-1;;;3410:315:1:o;3730:773::-;3852:6;3860;3868;3876;3929:2;3917:9;3908:7;3904:23;3900:32;3897:52;;;3945:1;3942;3935:12;3897:52;3985:9;3972:23;4014:18;4055:2;4047:6;4044:14;4041:34;;;4071:1;4068;4061:12;4041:34;4110:70;4172:7;4163:6;4152:9;4148:22;4110:70;:::i;:::-;4199:8;;-1:-1:-1;4084:96:1;-1:-1:-1;4287:2:1;4272:18;;4259:32;;-1:-1:-1;4303:16:1;;;4300:36;;;4332:1;4329;4322:12;4300:36;;4371:72;4435:7;4424:8;4413:9;4409:24;4371:72;:::i;:::-;3730:773;;;;-1:-1:-1;4462:8:1;-1:-1:-1;;;;3730:773:1:o;4508:241::-;4564:6;4617:2;4605:9;4596:7;4592:23;4588:32;4585:52;;;4633:1;4630;4623:12;4585:52;4672:9;4659:23;4691:28;4713:5;4691:28;:::i;4754:245::-;4821:6;4874:2;4862:9;4853:7;4849:23;4845:32;4842:52;;;4890:1;4887;4880:12;4842:52;4922:9;4916:16;4941:28;4963:5;4941:28;:::i;5004:245::-;5062:6;5115:2;5103:9;5094:7;5090:23;5086:32;5083:52;;;5131:1;5128;5121:12;5083:52;5170:9;5157:23;5189:30;5213:5;5189:30;:::i;5254:249::-;5323:6;5376:2;5364:9;5355:7;5351:23;5347:32;5344:52;;;5392:1;5389;5382:12;5344:52;5424:9;5418:16;5443:30;5467:5;5443:30;:::i;6179:592::-;6250:6;6258;6311:2;6299:9;6290:7;6286:23;6282:32;6279:52;;;6327:1;6324;6317:12;6279:52;6367:9;6354:23;6396:18;6437:2;6429:6;6426:14;6423:34;;;6453:1;6450;6443:12;6423:34;6491:6;6480:9;6476:22;6466:32;;6536:7;6529:4;6525:2;6521:13;6517:27;6507:55;;6558:1;6555;6548:12;6507:55;6598:2;6585:16;6624:2;6616:6;6613:14;6610:34;;;6640:1;6637;6630:12;6610:34;6685:7;6680:2;6671:6;6667:2;6663:15;6659:24;6656:37;6653:57;;;6706:1;6703;6696:12;6653:57;6737:2;6729:11;;;;;6759:6;;-1:-1:-1;6179:592:1;;-1:-1:-1;;;;6179:592:1:o;6776:180::-;6835:6;6888:2;6876:9;6867:7;6863:23;6859:32;6856:52;;;6904:1;6901;6894:12;6856:52;-1:-1:-1;6927:23:1;;6776:180;-1:-1:-1;6776:180:1:o;6961:184::-;7031:6;7084:2;7072:9;7063:7;7059:23;7055:32;7052:52;;;7100:1;7097;7090:12;7052:52;-1:-1:-1;7123:16:1;;6961:184;-1:-1:-1;6961:184:1:o;7150:257::-;7191:3;7229:5;7223:12;7256:6;7251:3;7244:19;7272:63;7328:6;7321:4;7316:3;7312:14;7305:4;7298:5;7294:16;7272:63;:::i;:::-;7389:2;7368:15;-1:-1:-1;;7364:29:1;7355:39;;;;7396:4;7351:50;;7150:257;-1:-1:-1;;7150:257:1:o;7412:274::-;7541:3;7579:6;7573:13;7595:53;7641:6;7636:3;7629:4;7621:6;7617:17;7595:53;:::i;:::-;7664:16;;;;;7412:274;-1:-1:-1;;7412:274:1:o;7691:470::-;7870:3;7908:6;7902:13;7924:53;7970:6;7965:3;7958:4;7950:6;7946:17;7924:53;:::i;:::-;8040:13;;7999:16;;;;8062:57;8040:13;7999:16;8096:4;8084:17;;8062:57;:::i;:::-;8135:20;;7691:470;-1:-1:-1;;;;7691:470:1:o;8917:511::-;9111:4;-1:-1:-1;;;;;9221:2:1;9213:6;9209:15;9198:9;9191:34;9273:2;9265:6;9261:15;9256:2;9245:9;9241:18;9234:43;;9313:6;9308:2;9297:9;9293:18;9286:34;9356:3;9351:2;9340:9;9336:18;9329:31;9377:45;9417:3;9406:9;9402:19;9394:6;9377:45;:::i;:::-;9369:53;8917:511;-1:-1:-1;;;;;;8917:511:1:o;9927:219::-;10076:2;10065:9;10058:21;10039:4;10096:44;10136:2;10125:9;10121:18;10113:6;10096:44;:::i;16369:128::-;16409:3;16440:1;16436:6;16433:1;16430:13;16427:39;;;16446:18;;:::i;:::-;-1:-1:-1;16482:9:1;;16369:128::o;16502:120::-;16542:1;16568;16558:35;;16573:18;;:::i;:::-;-1:-1:-1;16607:9:1;;16502:120::o;16627:168::-;16667:7;16733:1;16729;16725:6;16721:14;16718:1;16715:21;16710:1;16703:9;16696:17;16692:45;16689:71;;;16740:18;;:::i;:::-;-1:-1:-1;16780:9:1;;16627:168::o;16800:246::-;16840:4;-1:-1:-1;;;;;16953:10:1;;;;16923;;16975:12;;;16972:38;;;16990:18;;:::i;:::-;17027:13;;16800:246;-1:-1:-1;;;16800:246:1:o;17051:125::-;17091:4;17119:1;17116;17113:8;17110:34;;;17124:18;;:::i;:::-;-1:-1:-1;17161:9:1;;17051:125::o;17181:258::-;17253:1;17263:113;17277:6;17274:1;17271:13;17263:113;;;17353:11;;;17347:18;17334:11;;;17327:39;17299:2;17292:10;17263:113;;;17394:6;17391:1;17388:13;17385:48;;;-1:-1:-1;;17429:1:1;17411:16;;17404:27;17181:258::o;17444:136::-;17483:3;17511:5;17501:39;;17520:18;;:::i;:::-;-1:-1:-1;;;17556:18:1;;17444:136::o;17585:437::-;17664:1;17660:12;;;;17707;;;17728:61;;17782:4;17774:6;17770:17;17760:27;;17728:61;17835:2;17827:6;17824:14;17804:18;17801:38;17798:218;;;-1:-1:-1;;;17869:1:1;17862:88;17973:4;17970:1;17963:15;18001:4;17998:1;17991:15;18027:135;18066:3;-1:-1:-1;;18087:17:1;;18084:43;;;18107:18;;:::i;:::-;-1:-1:-1;18154:1:1;18143:13;;18027:135::o;18167:112::-;18199:1;18225;18215:35;;18230:18;;:::i;:::-;-1:-1:-1;18264:9:1;;18167:112::o;18284:184::-;-1:-1:-1;;;18333:1:1;18326:88;18433:4;18430:1;18423:15;18457:4;18454:1;18447:15;18473:184;-1:-1:-1;;;18522:1:1;18515:88;18622:4;18619:1;18612:15;18646:4;18643:1;18636:15;18662:184;-1:-1:-1;;;18711:1:1;18704:88;18811:4;18808:1;18801:15;18835:4;18832:1;18825:15;18851:184;-1:-1:-1;;;18900:1:1;18893:88;19000:4;18997:1;18990:15;19024:4;19021:1;19014:15;19040:154;-1:-1:-1;;;;;19119:5:1;19115:54;19108:5;19105:65;19095:93;;19184:1;19181;19174:12;19199:118;19285:5;19278:13;19271:21;19264:5;19261:32;19251:60;;19307:1;19304;19297:12;19322:177;-1:-1:-1;;;;;;19400:5:1;19396:78;19389:5;19386:89;19376:117;;19489:1;19486;19479:12

Swarm Source

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