ETH Price: $2,366.56 (-0.96%)

The Poetry (Poetry)
 

Overview

TokenID

1046

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
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:
ThePoetry

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

// File: contracts/nft.sol

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

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


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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

// 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/interfaces/IERC20.sol


// OpenZeppelin Contracts v4.4.1 (interfaces/IERC20.sol)

pragma solidity ^0.8.0;


// 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/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/interfaces/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol)

pragma solidity ^0.8.0;


// File: @openzeppelin/contracts/interfaces/IERC2981.sol


// OpenZeppelin Contracts v4.4.1 (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for the NFT Royalty Standard
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Called with the sale price to determine how much royalty is owed and to whom.
     * @param tokenId - the NFT asset queried for royalty information
     * @param salePrice - the sale price of the NFT asset specified by `tokenId`
     * @return receiver - address of who should be sent the royalty payment
     * @return royaltyAmount - the royalty payment amount for `salePrice`
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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



pragma solidity ^0.8.0;









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

  struct TokenOwnership {
    address addr;
    uint64 startTimestamp;
  }

  struct AddressData {
    uint128 balance;
    uint128 numberMinted;
  }

  uint256 private currentIndex = 0;

  uint256 internal immutable collectionSize;
  uint256 internal immutable maxBatchSize;

  // Token name
  string private _name;

  // Token symbol
  string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    _approve(to, tokenId, owner);
  }

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

    return _tokenApprovals[tokenId];
  }

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

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

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

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

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

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

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

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

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

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

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

    uint256 updatedIndex = startTokenId;

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

    currentIndex = updatedIndex;
    _afterTokenTransfers(address(0), to, startTokenId, quantity);
  }

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

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

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

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

    _beforeTokenTransfers(from, to, tokenId, 1);

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

    _addressData[from].balance -= 1;
    _addressData[to].balance += 1;
    _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp));

    // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
    // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
    uint256 nextTokenId = tokenId + 1;
    if (_ownerships[nextTokenId].addr == address(0)) {
      if (_exists(nextTokenId)) {
        _ownerships[nextTokenId] = TokenOwnership(
          prevOwnership.addr,
          prevOwnership.startTimestamp
        );
      }
    }

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

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

  uint256 public nextOwnerToExplicitlySet = 0;

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

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

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

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

//SPDX-License-Identifier: MIT
//Contract based on [https://docs.openzeppelin.com/contracts/3.x/erc721](https://docs.openzeppelin.com/contracts/3.x/erc721)

pragma solidity ^0.8.0;









contract ThePoetry is ERC721A, IERC2981, Ownable, ReentrancyGuard {
    using Counters for Counters.Counter;
    using Strings for uint256;

    Counters.Counter private tokenCounter;

    string private baseURI = "ipfs://QmZyvpkN4kSYgx2wEfQK8s7p1bappcU1dLxKuBE1yCa9FH";
    address private openSeaProxyRegistryAddress = 0xa5409ec958C83C3f309868babACA7c86DCB077c1;
    bool private isOpenSeaProxyActive = true;

    uint256 public constant MAX_MINTS_PER_TX = 3;
    uint256 public maxSupply = 1111;

    uint256 public constant PUBLIC_SALE_PRICE = 0 ether;
    bool public isPublicSaleActive = true;




    // ============ ACCESS CONTROL/SANITY MODIFIERS ============

    modifier publicSaleActive() {
        require(isPublicSaleActive, "Public sale is not open");
        _;
    }

    modifier maxMintsPerTX(uint256 numberOfTokens) {
        require(
            numberOfTokens <= MAX_MINTS_PER_TX,
            "Max mints per transaction exceeded"
        );
        _;
    }

    modifier canMintNFTs(uint256 numberOfTokens) {
        require(
            totalSupply() + numberOfTokens <=
                maxSupply,
            "Not enough mints remaining to mint"
        );
        _;
    }

    modifier isCorrectPayment(uint256 price, uint256 numberOfTokens) {
        require(
            (price * numberOfTokens) == msg.value,
            "Incorrect ETH value sent"
        );
        _;
    }


    constructor(
    ) ERC721A("The Poetry", "Poetry", 100, maxSupply) {
    }

    // ============ PUBLIC FUNCTIONS FOR MINTING ============

    function mint(uint256 numberOfTokens)
        external
        payable
        nonReentrant
        isCorrectPayment(PUBLIC_SALE_PRICE, numberOfTokens)
        publicSaleActive
        canMintNFTs(numberOfTokens)
        maxMintsPerTX(numberOfTokens)
    {

        _safeMint(msg.sender, numberOfTokens);
    }



    //A simple free mint function to avoid confusion
    //The normal mint function with a cost of 0 would work too

    // ============ PUBLIC READ-ONLY FUNCTIONS ============

    function getBaseURI() external view returns (string memory) {
        return baseURI;
    }

    // ============ OWNER-ONLY ADMIN FUNCTIONS ============

    function setBaseURI(string memory _baseURI) external onlyOwner {
        baseURI = _baseURI;
    }

    function withdraw() public onlyOwner {
        uint256 balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }

    function withdrawTokens(IERC20 token) public onlyOwner {
        uint256 balance = token.balanceOf(address(this));
        token.transfer(msg.sender, balance);
    }



    // ============ SUPPORTING FUNCTIONS ============

    function nextTokenId() private returns (uint256) {
        tokenCounter.increment();
        return tokenCounter.current();
    }

    // ============ FUNCTION OVERRIDES ============

    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(ERC721A, IERC165)
        returns (bool)
    {
        return
            interfaceId == type(IERC2981).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev Override isApprovedForAll to allowlist user's OpenSea proxy accounts to enable gas-less listings.
     */
    function isApprovedForAll(address owner, address operator)
        public
        view
        override
        returns (bool)
    {
        // Get a reference to OpenSea's proxy registry contract by instantiating
        // the contract using the already existing address.
        ProxyRegistry proxyRegistry = ProxyRegistry(
            openSeaProxyRegistryAddress
        );
        if (
            isOpenSeaProxyActive &&
            address(proxyRegistry.proxies(owner)) == operator
        ) {
            return true;
        }

        return super.isApprovedForAll(owner, operator);
    }

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

        return
            string(abi.encodePacked(baseURI, "/", (tokenId+1).toString(), ".json"));
    }

    /**
     * @dev See {IERC165-royaltyInfo}.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        override
        returns (address receiver, uint256 royaltyAmount)
    {
        require(_exists(tokenId), "Nonexistent token");

        return (address(this), SafeMath.div(SafeMath.mul(salePrice, 5), 100));
    }
}

// These contract definitions are used to create a reference to the OpenSea
// ProxyRegistry contract by using the registry's address (see isApprovedForAll).
contract OwnableDelegateProxy {

}

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_MINTS_PER_TX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_SALE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"isPublicSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","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":"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":"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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c060405260008055600060075560405180606001604052806035815260200162004ede60359139600b90805190602001906200003e9291906200031d565b5073a5409ec958c83c3f309868babaca7c86dcb077c1600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600c60146101000a81548160ff021916908315150217905550610457600d556001600e60006101000a81548160ff021916908315150217905550348015620000dd57600080fd5b506040518060400160405280600a81526020017f54686520506f65747279000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f506f6574727900000000000000000000000000000000000000000000000000008152506064600d546000811162000195576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200018c906200043d565b60405180910390fd5b60008211620001db576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001d2906200041b565b60405180910390fd5b8360019080519060200190620001f39291906200031d565b5082600290805190602001906200020c9291906200031d565b508160a0818152505080608081815250505050505062000241620002356200024f60201b60201c565b6200025760201b60201c565b600160098190555062000573565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200032b9062000470565b90600052602060002090601f0160209004810192826200034f57600085556200039b565b82601f106200036a57805160ff19168380011785556200039b565b828001600101855582156200039b579182015b828111156200039a5782518255916020019190600101906200037d565b5b509050620003aa9190620003ae565b5090565b5b80821115620003c9576000816000905550600101620003af565b5090565b6000620003dc6027836200045f565b9150620003e982620004d5565b604082019050919050565b600062000403602e836200045f565b9150620004108262000524565b604082019050919050565b600060208201905081810360008301526200043681620003cd565b9050919050565b600060208201905081810360008301526200045881620003f4565b9050919050565b600082825260208201905092915050565b600060028204905060018216806200048957607f821691505b60208210811415620004a0576200049f620004a6565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f455243373231413a206d61782062617463682073697a65206d7573742062652060008201527f6e6f6e7a65726f00000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060008201527f6e6f6e7a65726f20737570706c79000000000000000000000000000000000000602082015250565b60805160a05161493a620005a4600039600081816121360152818161215f015261288c01526000505061493a6000f3fe6080604052600436106101cd5760003560e01c80636352211e116100f7578063a22cb46511610095578063d5abeb0111610064578063d5abeb011461067c578063d7224ba0146106a7578063e985e9c5146106d2578063f2fde38b1461070f576101cd565b8063a22cb465146105c2578063b88d4fde146105eb578063c6a91b4214610614578063c87b56dd1461063f576101cd565b8063715018a6116100d1578063715018a6146105395780638da5cb5b1461055057806395d89b411461057b578063a0712d68146105a6576101cd565b80636352211e1461049457806370a08231146104d1578063714c53981461050e576101cd565b806323b872dd1161016f57806342842e0e1161013e57806342842e0e146103dc57806349df728c146104055780634f6ccce71461042e57806355f804b31461046b576101cd565b806323b872dd146103215780632a55205a1461034a5780632f745c59146103885780633ccfd60b146103c5576101cd565b8063081812fc116101ab578063081812fc14610265578063095ea7b3146102a257806318160ddd146102cb5780631e84c413146102f6576101cd565b806301ffc9a7146101d257806306fdde031461020f57806307e89ec01461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190613127565b610738565b6040516102069190613888565b60405180910390f35b34801561021b57600080fd5b506102246107b2565b60405161023191906138a3565b60405180910390f35b34801561024657600080fd5b5061024f610844565b60405161025c9190613be5565b60405180910390f35b34801561027157600080fd5b5061028c60048036038101906102879190613224565b610849565b60405161029991906137f8565b60405180910390f35b3480156102ae57600080fd5b506102c960048036038101906102c491906130ba565b6108ce565b005b3480156102d757600080fd5b506102e06109e7565b6040516102ed9190613be5565b60405180910390f35b34801561030257600080fd5b5061030b6109f0565b6040516103189190613888565b60405180910390f35b34801561032d57600080fd5b5061034860048036038101906103439190612fa4565b610a03565b005b34801561035657600080fd5b50610371600480360381019061036c919061327e565b610a13565b60405161037f92919061385f565b60405180910390f35b34801561039457600080fd5b506103af60048036038101906103aa91906130ba565b610a7f565b6040516103bc9190613be5565b60405180910390f35b3480156103d157600080fd5b506103da610c7d565b005b3480156103e857600080fd5b5061040360048036038101906103fe9190612fa4565b610d48565b005b34801561041157600080fd5b5061042c60048036038101906104279190613181565b610d68565b005b34801561043a57600080fd5b5061045560048036038101906104509190613224565b610f03565b6040516104629190613be5565b60405180910390f35b34801561047757600080fd5b50610492600480360381019061048d91906131db565b610f56565b005b3480156104a057600080fd5b506104bb60048036038101906104b69190613224565b610fec565b6040516104c891906137f8565b60405180910390f35b3480156104dd57600080fd5b506104f860048036038101906104f39190612f37565b611002565b6040516105059190613be5565b60405180910390f35b34801561051a57600080fd5b506105236110eb565b60405161053091906138a3565b60405180910390f35b34801561054557600080fd5b5061054e61117d565b005b34801561055c57600080fd5b50610565611205565b60405161057291906137f8565b60405180910390f35b34801561058757600080fd5b5061059061122f565b60405161059d91906138a3565b60405180910390f35b6105c060048036038101906105bb9190613224565b6112c1565b005b3480156105ce57600080fd5b506105e960048036038101906105e4919061307a565b611464565b005b3480156105f757600080fd5b50610612600480360381019061060d9190612ff7565b6115e5565b005b34801561062057600080fd5b50610629611641565b6040516106369190613be5565b60405180910390f35b34801561064b57600080fd5b5061066660048036038101906106619190613224565b611646565b60405161067391906138a3565b60405180910390f35b34801561068857600080fd5b506106916116ce565b60405161069e9190613be5565b60405180910390f35b3480156106b357600080fd5b506106bc6116d4565b6040516106c99190613be5565b60405180910390f35b3480156106de57600080fd5b506106f960048036038101906106f49190612f64565b6116da565b6040516107069190613888565b60405180910390f35b34801561071b57600080fd5b5061073660048036038101906107319190612f37565b6117f4565b005b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107ab57506107aa826118ec565b5b9050919050565b6060600180546107c190613f8e565b80601f01602080910402602001604051908101604052809291908181526020018280546107ed90613f8e565b801561083a5780601f1061080f5761010080835404028352916020019161083a565b820191906000526020600020905b81548152906001019060200180831161081d57829003601f168201915b5050505050905090565b600081565b600061085482611a36565b610893576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088a90613ba5565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108d982610fec565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561094a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094190613a85565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610969611a43565b73ffffffffffffffffffffffffffffffffffffffff161480610998575061099781610992611a43565b6116da565b5b6109d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ce906139c5565b60405180910390fd5b6109e2838383611a4b565b505050565b60008054905090565b600e60009054906101000a900460ff1681565b610a0e838383611afd565b505050565b600080610a1f84611a36565b610a5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a55906139a5565b60405180910390fd5b30610a74610a6d8560056120b6565b60646120cc565b915091509250929050565b6000610a8a83611002565b8210610acb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac2906138c5565b60405180910390fd5b6000610ad56109e7565b905060008060005b83811015610c3b576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610bcf57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c275786841415610c18578195505050505050610c77565b8380610c2390613ff1565b9450505b508080610c3390613ff1565b915050610add565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6e90613b25565b60405180910390fd5b92915050565b610c85611a43565b73ffffffffffffffffffffffffffffffffffffffff16610ca3611205565b73ffffffffffffffffffffffffffffffffffffffff1614610cf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf090613a25565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610d44573d6000803e3d6000fd5b5050565b610d63838383604051806020016040528060008152506115e5565b505050565b610d70611a43565b73ffffffffffffffffffffffffffffffffffffffff16610d8e611205565b73ffffffffffffffffffffffffffffffffffffffff1614610de4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddb90613a25565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610e1f91906137f8565b60206040518083038186803b158015610e3757600080fd5b505afa158015610e4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e6f9190613251565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401610eac92919061385f565b602060405180830381600087803b158015610ec657600080fd5b505af1158015610eda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610efe91906130fa565b505050565b6000610f0d6109e7565b8210610f4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4590613925565b60405180910390fd5b819050919050565b610f5e611a43565b73ffffffffffffffffffffffffffffffffffffffff16610f7c611205565b73ffffffffffffffffffffffffffffffffffffffff1614610fd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc990613a25565b60405180910390fd5b80600b9080519060200190610fe8929190612cbd565b5050565b6000610ff7826120e2565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611073576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106a906139e5565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6060600b80546110fa90613f8e565b80601f016020809104026020016040519081016040528092919081815260200182805461112690613f8e565b80156111735780601f1061114857610100808354040283529160200191611173565b820191906000526020600020905b81548152906001019060200180831161115657829003601f168201915b5050505050905090565b611185611a43565b73ffffffffffffffffffffffffffffffffffffffff166111a3611205565b73ffffffffffffffffffffffffffffffffffffffff16146111f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f090613a25565b60405180910390fd5b61120360006122e5565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606002805461123e90613f8e565b80601f016020809104026020016040519081016040528092919081815260200182805461126a90613f8e565b80156112b75780601f1061128c576101008083540402835291602001916112b7565b820191906000526020600020905b81548152906001019060200180831161129a57829003601f168201915b5050505050905090565b60026009541415611307576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fe90613b45565b60405180910390fd5b600260098190555060008134818361131f9190613dac565b1461135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135690613b05565b60405180910390fd5b600e60009054906101000a900460ff166113ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a590613b85565b60405180910390fd5b82600d54816113bb6109e7565b6113c59190613d25565b1115611406576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fd90613945565b60405180910390fd5b83600381111561144b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144290613985565b60405180910390fd5b61145533866123ab565b50505050600160098190555050565b61146c611a43565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d190613a45565b60405180910390fd5b80600660006114e7611a43565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611594611a43565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115d99190613888565b60405180910390a35050565b6115f0848484611afd565b6115fc848484846123c9565b61163b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163290613aa5565b60405180910390fd5b50505050565b600381565b606061165182611a36565b611690576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611687906139a5565b60405180910390fd5b600b6116a76001846116a29190613d25565b612560565b6040516020016116b89291906137be565b6040516020818303038152906040529050919050565b600d5481565b60075481565b600080600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600c60149054906101000a900460ff1680156117d157508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b815260040161176991906137f8565b60206040518083038186803b15801561178157600080fd5b505afa158015611795573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b991906131ae565b73ffffffffffffffffffffffffffffffffffffffff16145b156117e05760019150506117ee565b6117ea84846126c1565b9150505b92915050565b6117fc611a43565b73ffffffffffffffffffffffffffffffffffffffff1661181a611205565b73ffffffffffffffffffffffffffffffffffffffff1614611870576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186790613a25565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156118e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d7906138e5565b60405180910390fd5b6118e9816122e5565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806119b757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611a1f57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611a2f5750611a2e82612755565b5b9050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611b08826120e2565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611b2f611a43565b73ffffffffffffffffffffffffffffffffffffffff161480611b8b5750611b54611a43565b73ffffffffffffffffffffffffffffffffffffffff16611b7384610849565b73ffffffffffffffffffffffffffffffffffffffff16145b80611ba75750611ba68260000151611ba1611a43565b6116da565b5b905080611be9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be090613a65565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611c5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5290613a05565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611ccb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc290613965565b60405180910390fd5b611cd885858560016127bf565b611ce86000848460000151611a4b565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16611d569190613e06565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16611dfa9190613cdf565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050506000600184611f009190613d25565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561204657611f7681611a36565b15612045576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46120ae86868660016127c5565b505050505050565b600081836120c49190613dac565b905092915050565b600081836120da9190613d7b565b905092915050565b6120ea612d43565b6120f382611a36565b612132576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212990613905565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000083106121965760017f0000000000000000000000000000000000000000000000000000000000000000846121899190613e3a565b6121939190613d25565b90505b60008390505b8181106122a4576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612290578093505050506122e0565b50808061229c90613f64565b91505061219c565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d790613b65565b60405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6123c58282604051806020016040528060008152506127cb565b5050565b60006123ea8473ffffffffffffffffffffffffffffffffffffffff16612caa565b15612553578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612413611a43565b8786866040518563ffffffff1660e01b81526004016124359493929190613813565b602060405180830381600087803b15801561244f57600080fd5b505af192505050801561248057506040513d601f19601f8201168201806040525081019061247d9190613154565b60015b612503573d80600081146124b0576040519150601f19603f3d011682016040523d82523d6000602084013e6124b5565b606091505b506000815114156124fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f290613aa5565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612558565b600190505b949350505050565b606060008214156125a8576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506126bc565b600082905060005b600082146125da5780806125c390613ff1565b915050600a826125d39190613d7b565b91506125b0565b60008167ffffffffffffffff8111156125f6576125f5614127565b5b6040519080825280601f01601f1916602001820160405280156126285781602001600182028036833780820191505090505b5090505b600085146126b5576001826126419190613e3a565b9150600a85612650919061403a565b603061265c9190613d25565b60f81b818381518110612672576126716140f8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126ae9190613d7b565b945061262c565b8093505050505b919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612841576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283890613ae5565b60405180910390fd5b61284a81611a36565b1561288a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288190613ac5565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000008311156128ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e490613bc5565b60405180910390fd5b6128fa60008583866127bf565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905060405180604001604052808583600001516129f79190613cdf565b6fffffffffffffffffffffffffffffffff168152602001858360200151612a1e9190613cdf565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b85811015612c8d57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c2d60008884886123c9565b612c6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c6390613aa5565b60405180910390fd5b8180612c7790613ff1565b9250508080612c8590613ff1565b915050612bbc565b5080600081905550612ca260008785886127c5565b505050505050565b600080823b905060008111915050919050565b828054612cc990613f8e565b90600052602060002090601f016020900481019282612ceb5760008555612d32565b82601f10612d0457805160ff1916838001178555612d32565b82800160010185558215612d32579182015b82811115612d31578251825591602001919060010190612d16565b5b509050612d3f9190612d7d565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115612d96576000816000905550600101612d7e565b5090565b6000612dad612da884613c25565b613c00565b905082815260208101848484011115612dc957612dc861415b565b5b612dd4848285613f22565b509392505050565b6000612def612dea84613c56565b613c00565b905082815260208101848484011115612e0b57612e0a61415b565b5b612e16848285613f22565b509392505050565b600081359050612e2d8161487a565b92915050565b600081359050612e4281614891565b92915050565b600081519050612e5781614891565b92915050565b600081359050612e6c816148a8565b92915050565b600081519050612e81816148a8565b92915050565b600082601f830112612e9c57612e9b614156565b5b8135612eac848260208601612d9a565b91505092915050565b600081359050612ec4816148bf565b92915050565b600081519050612ed9816148d6565b92915050565b600082601f830112612ef457612ef3614156565b5b8135612f04848260208601612ddc565b91505092915050565b600081359050612f1c816148ed565b92915050565b600081519050612f31816148ed565b92915050565b600060208284031215612f4d57612f4c614165565b5b6000612f5b84828501612e1e565b91505092915050565b60008060408385031215612f7b57612f7a614165565b5b6000612f8985828601612e1e565b9250506020612f9a85828601612e1e565b9150509250929050565b600080600060608486031215612fbd57612fbc614165565b5b6000612fcb86828701612e1e565b9350506020612fdc86828701612e1e565b9250506040612fed86828701612f0d565b9150509250925092565b6000806000806080858703121561301157613010614165565b5b600061301f87828801612e1e565b945050602061303087828801612e1e565b935050604061304187828801612f0d565b925050606085013567ffffffffffffffff81111561306257613061614160565b5b61306e87828801612e87565b91505092959194509250565b6000806040838503121561309157613090614165565b5b600061309f85828601612e1e565b92505060206130b085828601612e33565b9150509250929050565b600080604083850312156130d1576130d0614165565b5b60006130df85828601612e1e565b92505060206130f085828601612f0d565b9150509250929050565b6000602082840312156131105761310f614165565b5b600061311e84828501612e48565b91505092915050565b60006020828403121561313d5761313c614165565b5b600061314b84828501612e5d565b91505092915050565b60006020828403121561316a57613169614165565b5b600061317884828501612e72565b91505092915050565b60006020828403121561319757613196614165565b5b60006131a584828501612eb5565b91505092915050565b6000602082840312156131c4576131c3614165565b5b60006131d284828501612eca565b91505092915050565b6000602082840312156131f1576131f0614165565b5b600082013567ffffffffffffffff81111561320f5761320e614160565b5b61321b84828501612edf565b91505092915050565b60006020828403121561323a57613239614165565b5b600061324884828501612f0d565b91505092915050565b60006020828403121561326757613266614165565b5b600061327584828501612f22565b91505092915050565b6000806040838503121561329557613294614165565b5b60006132a385828601612f0d565b92505060206132b485828601612f0d565b9150509250929050565b6132c781613e6e565b82525050565b6132d681613e80565b82525050565b60006132e782613c9c565b6132f18185613cb2565b9350613301818560208601613f31565b61330a8161416a565b840191505092915050565b600061332082613ca7565b61332a8185613cc3565b935061333a818560208601613f31565b6133438161416a565b840191505092915050565b600061335982613ca7565b6133638185613cd4565b9350613373818560208601613f31565b80840191505092915050565b6000815461338c81613f8e565b6133968186613cd4565b945060018216600081146133b157600181146133c2576133f5565b60ff198316865281860193506133f5565b6133cb85613c87565b60005b838110156133ed578154818901526001820191506020810190506133ce565b838801955050505b50505092915050565b600061340b602283613cc3565b91506134168261417b565b604082019050919050565b600061342e602683613cc3565b9150613439826141ca565b604082019050919050565b6000613451602a83613cc3565b915061345c82614219565b604082019050919050565b6000613474602383613cc3565b915061347f82614268565b604082019050919050565b6000613497602283613cc3565b91506134a2826142b7565b604082019050919050565b60006134ba602583613cc3565b91506134c582614306565b604082019050919050565b60006134dd602283613cc3565b91506134e882614355565b604082019050919050565b6000613500601183613cc3565b915061350b826143a4565b602082019050919050565b6000613523603983613cc3565b915061352e826143cd565b604082019050919050565b6000613546602b83613cc3565b91506135518261441c565b604082019050919050565b6000613569602683613cc3565b91506135748261446b565b604082019050919050565b600061358c600583613cd4565b9150613597826144ba565b600582019050919050565b60006135af602083613cc3565b91506135ba826144e3565b602082019050919050565b60006135d2601a83613cc3565b91506135dd8261450c565b602082019050919050565b60006135f5603283613cc3565b915061360082614535565b604082019050919050565b6000613618602283613cc3565b915061362382614584565b604082019050919050565b600061363b603383613cc3565b9150613646826145d3565b604082019050919050565b600061365e601d83613cc3565b915061366982614622565b602082019050919050565b6000613681602183613cc3565b915061368c8261464b565b604082019050919050565b60006136a4601883613cc3565b91506136af8261469a565b602082019050919050565b60006136c7602e83613cc3565b91506136d2826146c3565b604082019050919050565b60006136ea601f83613cc3565b91506136f582614712565b602082019050919050565b600061370d602f83613cc3565b91506137188261473b565b604082019050919050565b6000613730601783613cc3565b915061373b8261478a565b602082019050919050565b6000613753602d83613cc3565b915061375e826147b3565b604082019050919050565b6000613776602283613cc3565b915061378182614802565b604082019050919050565b6000613799600183613cd4565b91506137a482614851565b600182019050919050565b6137b881613f18565b82525050565b60006137ca828561337f565b91506137d58261378c565b91506137e1828461334e565b91506137ec8261357f565b91508190509392505050565b600060208201905061380d60008301846132be565b92915050565b600060808201905061382860008301876132be565b61383560208301866132be565b61384260408301856137af565b818103606083015261385481846132dc565b905095945050505050565b600060408201905061387460008301856132be565b61388160208301846137af565b9392505050565b600060208201905061389d60008301846132cd565b92915050565b600060208201905081810360008301526138bd8184613315565b905092915050565b600060208201905081810360008301526138de816133fe565b9050919050565b600060208201905081810360008301526138fe81613421565b9050919050565b6000602082019050818103600083015261391e81613444565b9050919050565b6000602082019050818103600083015261393e81613467565b9050919050565b6000602082019050818103600083015261395e8161348a565b9050919050565b6000602082019050818103600083015261397e816134ad565b9050919050565b6000602082019050818103600083015261399e816134d0565b9050919050565b600060208201905081810360008301526139be816134f3565b9050919050565b600060208201905081810360008301526139de81613516565b9050919050565b600060208201905081810360008301526139fe81613539565b9050919050565b60006020820190508181036000830152613a1e8161355c565b9050919050565b60006020820190508181036000830152613a3e816135a2565b9050919050565b60006020820190508181036000830152613a5e816135c5565b9050919050565b60006020820190508181036000830152613a7e816135e8565b9050919050565b60006020820190508181036000830152613a9e8161360b565b9050919050565b60006020820190508181036000830152613abe8161362e565b9050919050565b60006020820190508181036000830152613ade81613651565b9050919050565b60006020820190508181036000830152613afe81613674565b9050919050565b60006020820190508181036000830152613b1e81613697565b9050919050565b60006020820190508181036000830152613b3e816136ba565b9050919050565b60006020820190508181036000830152613b5e816136dd565b9050919050565b60006020820190508181036000830152613b7e81613700565b9050919050565b60006020820190508181036000830152613b9e81613723565b9050919050565b60006020820190508181036000830152613bbe81613746565b9050919050565b60006020820190508181036000830152613bde81613769565b9050919050565b6000602082019050613bfa60008301846137af565b92915050565b6000613c0a613c1b565b9050613c168282613fc0565b919050565b6000604051905090565b600067ffffffffffffffff821115613c4057613c3f614127565b5b613c498261416a565b9050602081019050919050565b600067ffffffffffffffff821115613c7157613c70614127565b5b613c7a8261416a565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613cea82613edc565b9150613cf583613edc565b9250826fffffffffffffffffffffffffffffffff03821115613d1a57613d1961406b565b5b828201905092915050565b6000613d3082613f18565b9150613d3b83613f18565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d7057613d6f61406b565b5b828201905092915050565b6000613d8682613f18565b9150613d9183613f18565b925082613da157613da061409a565b5b828204905092915050565b6000613db782613f18565b9150613dc283613f18565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613dfb57613dfa61406b565b5b828202905092915050565b6000613e1182613edc565b9150613e1c83613edc565b925082821015613e2f57613e2e61406b565b5b828203905092915050565b6000613e4582613f18565b9150613e5083613f18565b925082821015613e6357613e6261406b565b5b828203905092915050565b6000613e7982613ef8565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000613ec382613e6e565b9050919050565b6000613ed582613e6e565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613f4f578082015181840152602081019050613f34565b83811115613f5e576000848401525b50505050565b6000613f6f82613f18565b91506000821415613f8357613f8261406b565b5b600182039050919050565b60006002820490506001821680613fa657607f821691505b60208210811415613fba57613fb96140c9565b5b50919050565b613fc98261416a565b810181811067ffffffffffffffff82111715613fe857613fe7614127565b5b80604052505050565b6000613ffc82613f18565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561402f5761402e61406b565b5b600182019050919050565b600061404582613f18565b915061405083613f18565b9250826140605761405f61409a565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f756768206d696e74732072656d61696e696e6720746f206d6960008201527f6e74000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f4d6178206d696e747320706572207472616e73616374696f6e2065786365656460008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f6e6578697374656e7420746f6b656e000000000000000000000000000000600082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f496e636f7272656374204554482076616c75652073656e740000000000000000600082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f5075626c69632073616c65206973206e6f74206f70656e000000000000000000600082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b61488381613e6e565b811461488e57600080fd5b50565b61489a81613e80565b81146148a557600080fd5b50565b6148b181613e8c565b81146148bc57600080fd5b50565b6148c881613eb8565b81146148d357600080fd5b50565b6148df81613eca565b81146148ea57600080fd5b50565b6148f681613f18565b811461490157600080fd5b5056fea2646970667358221220221feb2de428611bed8b9a4482bfcbaf333e2a4a5fdb8e46a79b3e0b1860905664736f6c63430008070033697066733a2f2f516d5a7976706b4e346b5359677832774566514b387337703162617070635531644c784b75424531794361394648

Deployed Bytecode

0x6080604052600436106101cd5760003560e01c80636352211e116100f7578063a22cb46511610095578063d5abeb0111610064578063d5abeb011461067c578063d7224ba0146106a7578063e985e9c5146106d2578063f2fde38b1461070f576101cd565b8063a22cb465146105c2578063b88d4fde146105eb578063c6a91b4214610614578063c87b56dd1461063f576101cd565b8063715018a6116100d1578063715018a6146105395780638da5cb5b1461055057806395d89b411461057b578063a0712d68146105a6576101cd565b80636352211e1461049457806370a08231146104d1578063714c53981461050e576101cd565b806323b872dd1161016f57806342842e0e1161013e57806342842e0e146103dc57806349df728c146104055780634f6ccce71461042e57806355f804b31461046b576101cd565b806323b872dd146103215780632a55205a1461034a5780632f745c59146103885780633ccfd60b146103c5576101cd565b8063081812fc116101ab578063081812fc14610265578063095ea7b3146102a257806318160ddd146102cb5780631e84c413146102f6576101cd565b806301ffc9a7146101d257806306fdde031461020f57806307e89ec01461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190613127565b610738565b6040516102069190613888565b60405180910390f35b34801561021b57600080fd5b506102246107b2565b60405161023191906138a3565b60405180910390f35b34801561024657600080fd5b5061024f610844565b60405161025c9190613be5565b60405180910390f35b34801561027157600080fd5b5061028c60048036038101906102879190613224565b610849565b60405161029991906137f8565b60405180910390f35b3480156102ae57600080fd5b506102c960048036038101906102c491906130ba565b6108ce565b005b3480156102d757600080fd5b506102e06109e7565b6040516102ed9190613be5565b60405180910390f35b34801561030257600080fd5b5061030b6109f0565b6040516103189190613888565b60405180910390f35b34801561032d57600080fd5b5061034860048036038101906103439190612fa4565b610a03565b005b34801561035657600080fd5b50610371600480360381019061036c919061327e565b610a13565b60405161037f92919061385f565b60405180910390f35b34801561039457600080fd5b506103af60048036038101906103aa91906130ba565b610a7f565b6040516103bc9190613be5565b60405180910390f35b3480156103d157600080fd5b506103da610c7d565b005b3480156103e857600080fd5b5061040360048036038101906103fe9190612fa4565b610d48565b005b34801561041157600080fd5b5061042c60048036038101906104279190613181565b610d68565b005b34801561043a57600080fd5b5061045560048036038101906104509190613224565b610f03565b6040516104629190613be5565b60405180910390f35b34801561047757600080fd5b50610492600480360381019061048d91906131db565b610f56565b005b3480156104a057600080fd5b506104bb60048036038101906104b69190613224565b610fec565b6040516104c891906137f8565b60405180910390f35b3480156104dd57600080fd5b506104f860048036038101906104f39190612f37565b611002565b6040516105059190613be5565b60405180910390f35b34801561051a57600080fd5b506105236110eb565b60405161053091906138a3565b60405180910390f35b34801561054557600080fd5b5061054e61117d565b005b34801561055c57600080fd5b50610565611205565b60405161057291906137f8565b60405180910390f35b34801561058757600080fd5b5061059061122f565b60405161059d91906138a3565b60405180910390f35b6105c060048036038101906105bb9190613224565b6112c1565b005b3480156105ce57600080fd5b506105e960048036038101906105e4919061307a565b611464565b005b3480156105f757600080fd5b50610612600480360381019061060d9190612ff7565b6115e5565b005b34801561062057600080fd5b50610629611641565b6040516106369190613be5565b60405180910390f35b34801561064b57600080fd5b5061066660048036038101906106619190613224565b611646565b60405161067391906138a3565b60405180910390f35b34801561068857600080fd5b506106916116ce565b60405161069e9190613be5565b60405180910390f35b3480156106b357600080fd5b506106bc6116d4565b6040516106c99190613be5565b60405180910390f35b3480156106de57600080fd5b506106f960048036038101906106f49190612f64565b6116da565b6040516107069190613888565b60405180910390f35b34801561071b57600080fd5b5061073660048036038101906107319190612f37565b6117f4565b005b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107ab57506107aa826118ec565b5b9050919050565b6060600180546107c190613f8e565b80601f01602080910402602001604051908101604052809291908181526020018280546107ed90613f8e565b801561083a5780601f1061080f5761010080835404028352916020019161083a565b820191906000526020600020905b81548152906001019060200180831161081d57829003601f168201915b5050505050905090565b600081565b600061085482611a36565b610893576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088a90613ba5565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108d982610fec565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561094a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094190613a85565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610969611a43565b73ffffffffffffffffffffffffffffffffffffffff161480610998575061099781610992611a43565b6116da565b5b6109d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ce906139c5565b60405180910390fd5b6109e2838383611a4b565b505050565b60008054905090565b600e60009054906101000a900460ff1681565b610a0e838383611afd565b505050565b600080610a1f84611a36565b610a5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a55906139a5565b60405180910390fd5b30610a74610a6d8560056120b6565b60646120cc565b915091509250929050565b6000610a8a83611002565b8210610acb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac2906138c5565b60405180910390fd5b6000610ad56109e7565b905060008060005b83811015610c3b576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610bcf57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c275786841415610c18578195505050505050610c77565b8380610c2390613ff1565b9450505b508080610c3390613ff1565b915050610add565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6e90613b25565b60405180910390fd5b92915050565b610c85611a43565b73ffffffffffffffffffffffffffffffffffffffff16610ca3611205565b73ffffffffffffffffffffffffffffffffffffffff1614610cf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf090613a25565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610d44573d6000803e3d6000fd5b5050565b610d63838383604051806020016040528060008152506115e5565b505050565b610d70611a43565b73ffffffffffffffffffffffffffffffffffffffff16610d8e611205565b73ffffffffffffffffffffffffffffffffffffffff1614610de4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddb90613a25565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610e1f91906137f8565b60206040518083038186803b158015610e3757600080fd5b505afa158015610e4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e6f9190613251565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401610eac92919061385f565b602060405180830381600087803b158015610ec657600080fd5b505af1158015610eda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610efe91906130fa565b505050565b6000610f0d6109e7565b8210610f4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4590613925565b60405180910390fd5b819050919050565b610f5e611a43565b73ffffffffffffffffffffffffffffffffffffffff16610f7c611205565b73ffffffffffffffffffffffffffffffffffffffff1614610fd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc990613a25565b60405180910390fd5b80600b9080519060200190610fe8929190612cbd565b5050565b6000610ff7826120e2565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611073576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106a906139e5565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6060600b80546110fa90613f8e565b80601f016020809104026020016040519081016040528092919081815260200182805461112690613f8e565b80156111735780601f1061114857610100808354040283529160200191611173565b820191906000526020600020905b81548152906001019060200180831161115657829003601f168201915b5050505050905090565b611185611a43565b73ffffffffffffffffffffffffffffffffffffffff166111a3611205565b73ffffffffffffffffffffffffffffffffffffffff16146111f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f090613a25565b60405180910390fd5b61120360006122e5565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606002805461123e90613f8e565b80601f016020809104026020016040519081016040528092919081815260200182805461126a90613f8e565b80156112b75780601f1061128c576101008083540402835291602001916112b7565b820191906000526020600020905b81548152906001019060200180831161129a57829003601f168201915b5050505050905090565b60026009541415611307576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fe90613b45565b60405180910390fd5b600260098190555060008134818361131f9190613dac565b1461135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135690613b05565b60405180910390fd5b600e60009054906101000a900460ff166113ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a590613b85565b60405180910390fd5b82600d54816113bb6109e7565b6113c59190613d25565b1115611406576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fd90613945565b60405180910390fd5b83600381111561144b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144290613985565b60405180910390fd5b61145533866123ab565b50505050600160098190555050565b61146c611a43565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d190613a45565b60405180910390fd5b80600660006114e7611a43565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611594611a43565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115d99190613888565b60405180910390a35050565b6115f0848484611afd565b6115fc848484846123c9565b61163b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163290613aa5565b60405180910390fd5b50505050565b600381565b606061165182611a36565b611690576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611687906139a5565b60405180910390fd5b600b6116a76001846116a29190613d25565b612560565b6040516020016116b89291906137be565b6040516020818303038152906040529050919050565b600d5481565b60075481565b600080600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600c60149054906101000a900460ff1680156117d157508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b815260040161176991906137f8565b60206040518083038186803b15801561178157600080fd5b505afa158015611795573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b991906131ae565b73ffffffffffffffffffffffffffffffffffffffff16145b156117e05760019150506117ee565b6117ea84846126c1565b9150505b92915050565b6117fc611a43565b73ffffffffffffffffffffffffffffffffffffffff1661181a611205565b73ffffffffffffffffffffffffffffffffffffffff1614611870576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186790613a25565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156118e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d7906138e5565b60405180910390fd5b6118e9816122e5565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806119b757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611a1f57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611a2f5750611a2e82612755565b5b9050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611b08826120e2565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611b2f611a43565b73ffffffffffffffffffffffffffffffffffffffff161480611b8b5750611b54611a43565b73ffffffffffffffffffffffffffffffffffffffff16611b7384610849565b73ffffffffffffffffffffffffffffffffffffffff16145b80611ba75750611ba68260000151611ba1611a43565b6116da565b5b905080611be9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be090613a65565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611c5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5290613a05565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611ccb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc290613965565b60405180910390fd5b611cd885858560016127bf565b611ce86000848460000151611a4b565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16611d569190613e06565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16611dfa9190613cdf565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050506000600184611f009190613d25565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561204657611f7681611a36565b15612045576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46120ae86868660016127c5565b505050505050565b600081836120c49190613dac565b905092915050565b600081836120da9190613d7b565b905092915050565b6120ea612d43565b6120f382611a36565b612132576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212990613905565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000006483106121965760017f0000000000000000000000000000000000000000000000000000000000000064846121899190613e3a565b6121939190613d25565b90505b60008390505b8181106122a4576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612290578093505050506122e0565b50808061229c90613f64565b91505061219c565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d790613b65565b60405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6123c58282604051806020016040528060008152506127cb565b5050565b60006123ea8473ffffffffffffffffffffffffffffffffffffffff16612caa565b15612553578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612413611a43565b8786866040518563ffffffff1660e01b81526004016124359493929190613813565b602060405180830381600087803b15801561244f57600080fd5b505af192505050801561248057506040513d601f19601f8201168201806040525081019061247d9190613154565b60015b612503573d80600081146124b0576040519150601f19603f3d011682016040523d82523d6000602084013e6124b5565b606091505b506000815114156124fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f290613aa5565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612558565b600190505b949350505050565b606060008214156125a8576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506126bc565b600082905060005b600082146125da5780806125c390613ff1565b915050600a826125d39190613d7b565b91506125b0565b60008167ffffffffffffffff8111156125f6576125f5614127565b5b6040519080825280601f01601f1916602001820160405280156126285781602001600182028036833780820191505090505b5090505b600085146126b5576001826126419190613e3a565b9150600a85612650919061403a565b603061265c9190613d25565b60f81b818381518110612672576126716140f8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126ae9190613d7b565b945061262c565b8093505050505b919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612841576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283890613ae5565b60405180910390fd5b61284a81611a36565b1561288a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288190613ac5565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000648311156128ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e490613bc5565b60405180910390fd5b6128fa60008583866127bf565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905060405180604001604052808583600001516129f79190613cdf565b6fffffffffffffffffffffffffffffffff168152602001858360200151612a1e9190613cdf565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b85811015612c8d57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c2d60008884886123c9565b612c6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c6390613aa5565b60405180910390fd5b8180612c7790613ff1565b9250508080612c8590613ff1565b915050612bbc565b5080600081905550612ca260008785886127c5565b505050505050565b600080823b905060008111915050919050565b828054612cc990613f8e565b90600052602060002090601f016020900481019282612ceb5760008555612d32565b82601f10612d0457805160ff1916838001178555612d32565b82800160010185558215612d32579182015b82811115612d31578251825591602001919060010190612d16565b5b509050612d3f9190612d7d565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115612d96576000816000905550600101612d7e565b5090565b6000612dad612da884613c25565b613c00565b905082815260208101848484011115612dc957612dc861415b565b5b612dd4848285613f22565b509392505050565b6000612def612dea84613c56565b613c00565b905082815260208101848484011115612e0b57612e0a61415b565b5b612e16848285613f22565b509392505050565b600081359050612e2d8161487a565b92915050565b600081359050612e4281614891565b92915050565b600081519050612e5781614891565b92915050565b600081359050612e6c816148a8565b92915050565b600081519050612e81816148a8565b92915050565b600082601f830112612e9c57612e9b614156565b5b8135612eac848260208601612d9a565b91505092915050565b600081359050612ec4816148bf565b92915050565b600081519050612ed9816148d6565b92915050565b600082601f830112612ef457612ef3614156565b5b8135612f04848260208601612ddc565b91505092915050565b600081359050612f1c816148ed565b92915050565b600081519050612f31816148ed565b92915050565b600060208284031215612f4d57612f4c614165565b5b6000612f5b84828501612e1e565b91505092915050565b60008060408385031215612f7b57612f7a614165565b5b6000612f8985828601612e1e565b9250506020612f9a85828601612e1e565b9150509250929050565b600080600060608486031215612fbd57612fbc614165565b5b6000612fcb86828701612e1e565b9350506020612fdc86828701612e1e565b9250506040612fed86828701612f0d565b9150509250925092565b6000806000806080858703121561301157613010614165565b5b600061301f87828801612e1e565b945050602061303087828801612e1e565b935050604061304187828801612f0d565b925050606085013567ffffffffffffffff81111561306257613061614160565b5b61306e87828801612e87565b91505092959194509250565b6000806040838503121561309157613090614165565b5b600061309f85828601612e1e565b92505060206130b085828601612e33565b9150509250929050565b600080604083850312156130d1576130d0614165565b5b60006130df85828601612e1e565b92505060206130f085828601612f0d565b9150509250929050565b6000602082840312156131105761310f614165565b5b600061311e84828501612e48565b91505092915050565b60006020828403121561313d5761313c614165565b5b600061314b84828501612e5d565b91505092915050565b60006020828403121561316a57613169614165565b5b600061317884828501612e72565b91505092915050565b60006020828403121561319757613196614165565b5b60006131a584828501612eb5565b91505092915050565b6000602082840312156131c4576131c3614165565b5b60006131d284828501612eca565b91505092915050565b6000602082840312156131f1576131f0614165565b5b600082013567ffffffffffffffff81111561320f5761320e614160565b5b61321b84828501612edf565b91505092915050565b60006020828403121561323a57613239614165565b5b600061324884828501612f0d565b91505092915050565b60006020828403121561326757613266614165565b5b600061327584828501612f22565b91505092915050565b6000806040838503121561329557613294614165565b5b60006132a385828601612f0d565b92505060206132b485828601612f0d565b9150509250929050565b6132c781613e6e565b82525050565b6132d681613e80565b82525050565b60006132e782613c9c565b6132f18185613cb2565b9350613301818560208601613f31565b61330a8161416a565b840191505092915050565b600061332082613ca7565b61332a8185613cc3565b935061333a818560208601613f31565b6133438161416a565b840191505092915050565b600061335982613ca7565b6133638185613cd4565b9350613373818560208601613f31565b80840191505092915050565b6000815461338c81613f8e565b6133968186613cd4565b945060018216600081146133b157600181146133c2576133f5565b60ff198316865281860193506133f5565b6133cb85613c87565b60005b838110156133ed578154818901526001820191506020810190506133ce565b838801955050505b50505092915050565b600061340b602283613cc3565b91506134168261417b565b604082019050919050565b600061342e602683613cc3565b9150613439826141ca565b604082019050919050565b6000613451602a83613cc3565b915061345c82614219565b604082019050919050565b6000613474602383613cc3565b915061347f82614268565b604082019050919050565b6000613497602283613cc3565b91506134a2826142b7565b604082019050919050565b60006134ba602583613cc3565b91506134c582614306565b604082019050919050565b60006134dd602283613cc3565b91506134e882614355565b604082019050919050565b6000613500601183613cc3565b915061350b826143a4565b602082019050919050565b6000613523603983613cc3565b915061352e826143cd565b604082019050919050565b6000613546602b83613cc3565b91506135518261441c565b604082019050919050565b6000613569602683613cc3565b91506135748261446b565b604082019050919050565b600061358c600583613cd4565b9150613597826144ba565b600582019050919050565b60006135af602083613cc3565b91506135ba826144e3565b602082019050919050565b60006135d2601a83613cc3565b91506135dd8261450c565b602082019050919050565b60006135f5603283613cc3565b915061360082614535565b604082019050919050565b6000613618602283613cc3565b915061362382614584565b604082019050919050565b600061363b603383613cc3565b9150613646826145d3565b604082019050919050565b600061365e601d83613cc3565b915061366982614622565b602082019050919050565b6000613681602183613cc3565b915061368c8261464b565b604082019050919050565b60006136a4601883613cc3565b91506136af8261469a565b602082019050919050565b60006136c7602e83613cc3565b91506136d2826146c3565b604082019050919050565b60006136ea601f83613cc3565b91506136f582614712565b602082019050919050565b600061370d602f83613cc3565b91506137188261473b565b604082019050919050565b6000613730601783613cc3565b915061373b8261478a565b602082019050919050565b6000613753602d83613cc3565b915061375e826147b3565b604082019050919050565b6000613776602283613cc3565b915061378182614802565b604082019050919050565b6000613799600183613cd4565b91506137a482614851565b600182019050919050565b6137b881613f18565b82525050565b60006137ca828561337f565b91506137d58261378c565b91506137e1828461334e565b91506137ec8261357f565b91508190509392505050565b600060208201905061380d60008301846132be565b92915050565b600060808201905061382860008301876132be565b61383560208301866132be565b61384260408301856137af565b818103606083015261385481846132dc565b905095945050505050565b600060408201905061387460008301856132be565b61388160208301846137af565b9392505050565b600060208201905061389d60008301846132cd565b92915050565b600060208201905081810360008301526138bd8184613315565b905092915050565b600060208201905081810360008301526138de816133fe565b9050919050565b600060208201905081810360008301526138fe81613421565b9050919050565b6000602082019050818103600083015261391e81613444565b9050919050565b6000602082019050818103600083015261393e81613467565b9050919050565b6000602082019050818103600083015261395e8161348a565b9050919050565b6000602082019050818103600083015261397e816134ad565b9050919050565b6000602082019050818103600083015261399e816134d0565b9050919050565b600060208201905081810360008301526139be816134f3565b9050919050565b600060208201905081810360008301526139de81613516565b9050919050565b600060208201905081810360008301526139fe81613539565b9050919050565b60006020820190508181036000830152613a1e8161355c565b9050919050565b60006020820190508181036000830152613a3e816135a2565b9050919050565b60006020820190508181036000830152613a5e816135c5565b9050919050565b60006020820190508181036000830152613a7e816135e8565b9050919050565b60006020820190508181036000830152613a9e8161360b565b9050919050565b60006020820190508181036000830152613abe8161362e565b9050919050565b60006020820190508181036000830152613ade81613651565b9050919050565b60006020820190508181036000830152613afe81613674565b9050919050565b60006020820190508181036000830152613b1e81613697565b9050919050565b60006020820190508181036000830152613b3e816136ba565b9050919050565b60006020820190508181036000830152613b5e816136dd565b9050919050565b60006020820190508181036000830152613b7e81613700565b9050919050565b60006020820190508181036000830152613b9e81613723565b9050919050565b60006020820190508181036000830152613bbe81613746565b9050919050565b60006020820190508181036000830152613bde81613769565b9050919050565b6000602082019050613bfa60008301846137af565b92915050565b6000613c0a613c1b565b9050613c168282613fc0565b919050565b6000604051905090565b600067ffffffffffffffff821115613c4057613c3f614127565b5b613c498261416a565b9050602081019050919050565b600067ffffffffffffffff821115613c7157613c70614127565b5b613c7a8261416a565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613cea82613edc565b9150613cf583613edc565b9250826fffffffffffffffffffffffffffffffff03821115613d1a57613d1961406b565b5b828201905092915050565b6000613d3082613f18565b9150613d3b83613f18565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d7057613d6f61406b565b5b828201905092915050565b6000613d8682613f18565b9150613d9183613f18565b925082613da157613da061409a565b5b828204905092915050565b6000613db782613f18565b9150613dc283613f18565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613dfb57613dfa61406b565b5b828202905092915050565b6000613e1182613edc565b9150613e1c83613edc565b925082821015613e2f57613e2e61406b565b5b828203905092915050565b6000613e4582613f18565b9150613e5083613f18565b925082821015613e6357613e6261406b565b5b828203905092915050565b6000613e7982613ef8565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000613ec382613e6e565b9050919050565b6000613ed582613e6e565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613f4f578082015181840152602081019050613f34565b83811115613f5e576000848401525b50505050565b6000613f6f82613f18565b91506000821415613f8357613f8261406b565b5b600182039050919050565b60006002820490506001821680613fa657607f821691505b60208210811415613fba57613fb96140c9565b5b50919050565b613fc98261416a565b810181811067ffffffffffffffff82111715613fe857613fe7614127565b5b80604052505050565b6000613ffc82613f18565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561402f5761402e61406b565b5b600182019050919050565b600061404582613f18565b915061405083613f18565b9250826140605761405f61409a565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f756768206d696e74732072656d61696e696e6720746f206d6960008201527f6e74000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f4d6178206d696e747320706572207472616e73616374696f6e2065786365656460008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f6e6578697374656e7420746f6b656e000000000000000000000000000000600082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f496e636f7272656374204554482076616c75652073656e740000000000000000600082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f5075626c69632073616c65206973206e6f74206f70656e000000000000000000600082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b61488381613e6e565b811461488e57600080fd5b50565b61489a81613e80565b81146148a557600080fd5b50565b6148b181613e8c565b81146148bc57600080fd5b50565b6148c881613eb8565b81146148d357600080fd5b50565b6148df81613eca565b81146148ea57600080fd5b50565b6148f681613f18565b811461490157600080fd5b5056fea2646970667358221220221feb2de428611bed8b9a4482bfcbaf333e2a4a5fdb8e46a79b3e0b1860905664736f6c63430008070033

Deployed Bytecode Sourcemap

54926:4796:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57911:292;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44145:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55443:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45670:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45233:379;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40980:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55501:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46520:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59401:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;41611:744;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57328:143;;;;;;;;;;;;;:::i;:::-;;46725:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57479:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41143:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57220:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43968:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42845:211;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57056:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19003:103;;;;;;;;;;;;;:::i;:::-;;18352:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44300:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56540:321;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45938:274;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46945:311;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55352:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59028:307;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55403:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51360:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58340:617;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19261:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57911:292;58059:4;58116:26;58101:41;;;:11;:41;;;;:94;;;;58159:36;58183:11;58159:23;:36::i;:::-;58101:94;58081:114;;57911:292;;;:::o;44145:94::-;44199:13;44228:5;44221:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44145:94;:::o;55443:51::-;55487:7;55443:51;:::o;45670:204::-;45738:7;45762:16;45770:7;45762;:16::i;:::-;45754:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;45844:15;:24;45860:7;45844:24;;;;;;;;;;;;;;;;;;;;;45837:31;;45670:204;;;:::o;45233:379::-;45302:13;45318:24;45334:7;45318:15;:24::i;:::-;45302:40;;45363:5;45357:11;;:2;:11;;;;45349:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;45448:5;45432:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;45457:37;45474:5;45481:12;:10;:12::i;:::-;45457:16;:37::i;:::-;45432:62;45416:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;45578:28;45587:2;45591:7;45600:5;45578:8;:28::i;:::-;45295:317;45233:379;;:::o;40980:94::-;41033:7;41056:12;;41049:19;;40980:94;:::o;55501:37::-;;;;;;;;;;;;;:::o;46520:142::-;46628:28;46638:4;46644:2;46648:7;46628:9;:28::i;:::-;46520:142;;;:::o;59401:318::-;59526:16;59544:21;59591:16;59599:7;59591;:16::i;:::-;59583:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;59658:4;59665:45;59678:26;59691:9;59702:1;59678:12;:26::i;:::-;59706:3;59665:12;:45::i;:::-;59642:69;;;;59401:318;;;;;:::o;41611:744::-;41720:7;41755:16;41765:5;41755:9;:16::i;:::-;41747:5;:24;41739:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;41817:22;41842:13;:11;:13::i;:::-;41817:38;;41862:19;41892:25;41942:9;41937:350;41961:14;41957:1;:18;41937:350;;;41991:31;42025:11;:14;42037:1;42025:14;;;;;;;;;;;41991:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42078:1;42052:28;;:9;:14;;;:28;;;42048:89;;42113:9;:14;;;42093:34;;42048:89;42170:5;42149:26;;:17;:26;;;42145:135;;;42207:5;42192:11;:20;42188:59;;;42234:1;42227:8;;;;;;;;;42188:59;42257:13;;;;;:::i;:::-;;;;42145:135;41982:305;41977:3;;;;;:::i;:::-;;;;41937:350;;;;42293:56;;;;;;;;;;:::i;:::-;;;;;;;;41611:744;;;;;:::o;57328:143::-;18583:12;:10;:12::i;:::-;18572:23;;:7;:5;:7::i;:::-;:23;;;18564:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57376:15:::1;57394:21;57376:39;;57434:10;57426:28;;:37;57455:7;57426:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;57365:106;57328:143::o:0;46725:157::-;46837:39;46854:4;46860:2;46864:7;46837:39;;;;;;;;;;;;:16;:39::i;:::-;46725:157;;;:::o;57479:168::-;18583:12;:10;:12::i;:::-;18572:23;;:7;:5;:7::i;:::-;:23;;;18564:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57545:15:::1;57563:5;:15;;;57587:4;57563:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57545:48;;57604:5;:14;;;57619:10;57631:7;57604:35;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;57534:113;57479:168:::0;:::o;41143:177::-;41210:7;41242:13;:11;:13::i;:::-;41234:5;:21;41226:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;41309:5;41302:12;;41143:177;;;:::o;57220:100::-;18583:12;:10;:12::i;:::-;18572:23;;:7;:5;:7::i;:::-;:23;;;18564:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57304:8:::1;57294:7;:18;;;;;;;;;;;;:::i;:::-;;57220:100:::0;:::o;43968:118::-;44032:7;44055:20;44067:7;44055:11;:20::i;:::-;:25;;;44048:32;;43968:118;;;:::o;42845:211::-;42909:7;42950:1;42933:19;;:5;:19;;;;42925:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;43022:12;:19;43035:5;43022:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;43014:36;;43007:43;;42845:211;;;:::o;57056:93::-;57101:13;57134:7;57127:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57056:93;:::o;19003:103::-;18583:12;:10;:12::i;:::-;18572:23;;:7;:5;:7::i;:::-;:23;;;18564:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19068:30:::1;19095:1;19068:18;:30::i;:::-;19003:103::o:0;18352:87::-;18398:7;18425:6;;;;;;;;;;;18418:13;;18352:87;:::o;44300:98::-;44356:13;44385:7;44378:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44300:98;:::o;56540:321::-;10281:1;10879:7;;:19;;10871:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;10281:1;11012:7;:18;;;;55487:7:::1;56680:14;56300:9;56281:14;56273:5;:22;;;;:::i;:::-;56272:37;56250:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;55668:18:::2;;;;;;;;;;;55660:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;56743:14:::3;56075:9;;56040:14;56024:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:60;;56002:144;;;;;;;;;;;;:::i;:::-;;;;;;;;;56782:14:::4;55395:1;55822:14;:34;;55800:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;56816:37:::5;56826:10;56838:14;56816:9;:37::i;:::-;56157:1:::4;55725::::3;11043::::1;;10237::::0;11191:7;:22;;;;56540:321;:::o;45938:274::-;46041:12;:10;:12::i;:::-;46029:24;;:8;:24;;;;46021:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;46138:8;46093:18;:32;46112:12;:10;:12::i;:::-;46093:32;;;;;;;;;;;;;;;:42;46126:8;46093:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;46187:8;46158:48;;46173:12;:10;:12::i;:::-;46158:48;;;46197:8;46158:48;;;;;;:::i;:::-;;;;;;;;45938:274;;:::o;46945:311::-;47082:28;47092:4;47098:2;47102:7;47082:9;:28::i;:::-;47133:48;47156:4;47162:2;47166:7;47175:5;47133:22;:48::i;:::-;47117:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;46945:311;;;;:::o;55352:44::-;55395:1;55352:44;:::o;59028:307::-;59146:13;59185:16;59193:7;59185;:16::i;:::-;59177:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;59280:7;59294:22;59303:1;59295:7;:9;;;;:::i;:::-;59294:20;:22::i;:::-;59263:63;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59236:91;;59028:307;;;:::o;55403:31::-;;;;:::o;51360:43::-;;;;:::o;58340:617::-;58465:4;58630:27;58688;;;;;;;;;;;58630:96;;58755:20;;;;;;;;;;;:86;;;;;58833:8;58792:49;;58800:13;:21;;;58822:5;58800:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58792:49;;;58755:86;58737:154;;;58875:4;58868:11;;;;;58737:154;58910:39;58933:5;58940:8;58910:22;:39::i;:::-;58903:46;;;58340:617;;;;;:::o;19261:201::-;18583:12;:10;:12::i;:::-;18572:23;;:7;:5;:7::i;:::-;:23;;;18564:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19370:1:::1;19350:22;;:8;:22;;;;19342:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;19426:28;19445:8;19426:18;:28::i;:::-;19261:201:::0;:::o;42419:370::-;42546:4;42591:25;42576:40;;;:11;:40;;;;:99;;;;42642:33;42627:48;;;:11;:48;;;;42576:99;:160;;;;42701:35;42686:50;;;:11;:50;;;;42576:160;:207;;;;42747:36;42771:11;42747:23;:36::i;:::-;42576:207;42562:221;;42419:370;;;:::o;47495:105::-;47552:4;47582:12;;47572:7;:22;47565:29;;47495:105;;;:::o;17076:98::-;17129:7;17156:10;17149:17;;17076:98;:::o;51182:172::-;51306:2;51279:15;:24;51295:7;51279:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;51340:7;51336:2;51320:28;;51329:5;51320:28;;;;;;;;;;;;51182:172;;;:::o;49547:1529::-;49644:35;49682:20;49694:7;49682:11;:20::i;:::-;49644:58;;49711:22;49753:13;:18;;;49737:34;;:12;:10;:12::i;:::-;:34;;;:81;;;;49806:12;:10;:12::i;:::-;49782:36;;:20;49794:7;49782:11;:20::i;:::-;:36;;;49737:81;:142;;;;49829:50;49846:13;:18;;;49866:12;:10;:12::i;:::-;49829:16;:50::i;:::-;49737:142;49711:169;;49905:17;49889:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;50037:4;50015:26;;:13;:18;;;:26;;;49999:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;50126:1;50112:16;;:2;:16;;;;50104:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;50179:43;50201:4;50207:2;50211:7;50220:1;50179:21;:43::i;:::-;50279:49;50296:1;50300:7;50309:13;:18;;;50279:8;:49::i;:::-;50367:1;50337:12;:18;50350:4;50337:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;50403:1;50375:12;:16;50388:2;50375:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;50434:43;;;;;;;;50449:2;50434:43;;;;;;50460:15;50434:43;;;;;50411:11;:20;50423:7;50411:20;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50705:19;50737:1;50727:7;:11;;;;:::i;:::-;50705:33;;50790:1;50749:43;;:11;:24;50761:11;50749:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;50745:236;;;50807:20;50815:11;50807:7;:20::i;:::-;50803:171;;;50867:97;;;;;;;;50894:13;:18;;;50867:97;;;;;;50925:13;:28;;;50867:97;;;;;50840:11;:24;50852:11;50840:24;;;;;;;;;;;:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50803:171;50745:236;51013:7;51009:2;50994:27;;51003:4;50994:27;;;;;;;;;;;;51028:42;51049:4;51055:2;51059:7;51068:1;51028:20;:42::i;:::-;49637:1439;;;49547:1529;;;:::o;3577:98::-;3635:7;3666:1;3662;:5;;;;:::i;:::-;3655:12;;3577:98;;;;:::o;3976:::-;4034:7;4065:1;4061;:5;;;;:::i;:::-;4054:12;;3976:98;;;;:::o;43308:606::-;43384:21;;:::i;:::-;43425:16;43433:7;43425;:16::i;:::-;43417:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;43497:26;43545:12;43534:7;:23;43530:93;;43614:1;43599:12;43589:7;:22;;;;:::i;:::-;:26;;;;:::i;:::-;43568:47;;43530:93;43636:12;43651:7;43636:22;;43631:212;43668:18;43660:4;:26;43631:212;;43705:31;43739:11;:17;43751:4;43739:17;;;;;;;;;;;43705:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43795:1;43769:28;;:9;:14;;;:28;;;43765:71;;43817:9;43810:16;;;;;;;43765:71;43696:147;43688:6;;;;;:::i;:::-;;;;43631:212;;;;43851:57;;;;;;;;;;:::i;:::-;;;;;;;;43308:606;;;;:::o;19622:191::-;19696:16;19715:6;;;;;;;;;;;19696:25;;19741:8;19732:6;;:17;;;;;;;;;;;;;;;;;;19796:8;19765:40;;19786:8;19765:40;;;;;;;;;;;;19685:128;19622:191;:::o;47606:98::-;47671:27;47681:2;47685:8;47671:27;;;;;;;;;;;;:9;:27::i;:::-;47606:98;;:::o;52897:690::-;53034:4;53051:15;:2;:13;;;:15::i;:::-;53047:535;;;53106:2;53090:36;;;53127:12;:10;:12::i;:::-;53141:4;53147:7;53156:5;53090:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;53077:464;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53338:1;53321:6;:13;:18;53317:215;;;53354:61;;;;;;;;;;:::i;:::-;;;;;;;;53317:215;53500:6;53494:13;53485:6;53481:2;53477:15;53470:38;53077:464;53222:45;;;53212:55;;;:6;:55;;;;53205:62;;;;;53047:535;53570:4;53563:11;;52897:690;;;;;;;:::o;14638:723::-;14694:13;14924:1;14915:5;:10;14911:53;;;14942:10;;;;;;;;;;;;;;;;;;;;;14911:53;14974:12;14989:5;14974:20;;15005:14;15030:78;15045:1;15037:4;:9;15030:78;;15063:8;;;;;:::i;:::-;;;;15094:2;15086:10;;;;;:::i;:::-;;;15030:78;;;15118:19;15150:6;15140:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15118:39;;15168:154;15184:1;15175:5;:10;15168:154;;15212:1;15202:11;;;;;:::i;:::-;;;15279:2;15271:5;:10;;;;:::i;:::-;15258:2;:24;;;;:::i;:::-;15245:39;;15228:6;15235;15228:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;15308:2;15299:11;;;;;:::i;:::-;;;15168:154;;;15346:6;15332:21;;;;;14638:723;;;;:::o;46275:186::-;46397:4;46420:18;:25;46439:5;46420:25;;;;;;;;;;;;;;;:35;46446:8;46420:35;;;;;;;;;;;;;;;;;;;;;;;;;46413:42;;46275:186;;;;:::o;31752:157::-;31837:4;31876:25;31861:40;;;:11;:40;;;;31854:47;;31752:157;;;:::o;54049:141::-;;;;;:::o;54576:140::-;;;;;:::o;48043:1272::-;48148:20;48171:12;;48148:35;;48212:1;48198:16;;:2;:16;;;;48190:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;48389:21;48397:12;48389:7;:21::i;:::-;48388:22;48380:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;48471:12;48459:8;:24;;48451:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;48531:61;48561:1;48565:2;48569:12;48583:8;48531:21;:61::i;:::-;48601:30;48634:12;:16;48647:2;48634:16;;;;;;;;;;;;;;;48601:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48676:119;;;;;;;;48726:8;48696:11;:19;;;:39;;;;:::i;:::-;48676:119;;;;;;48779:8;48744:11;:24;;;:44;;;;:::i;:::-;48676:119;;;;;48657:12;:16;48670:2;48657:16;;;;;;;;;;;;;;;:138;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48830:43;;;;;;;;48845:2;48830:43;;;;;;48856:15;48830:43;;;;;48802:11;:25;48814:12;48802:25;;;;;;;;;;;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48882:20;48905:12;48882:35;;48931:9;48926:281;48950:8;48946:1;:12;48926:281;;;49004:12;49000:2;48979:38;;48996:1;48979:38;;;;;;;;;;;;49044:59;49075:1;49079:2;49083:12;49097:5;49044:22;:59::i;:::-;49026:150;;;;;;;;;;;;:::i;:::-;;;;;;;;;49185:14;;;;;:::i;:::-;;;;48960:3;;;;;:::i;:::-;;;;48926:281;;;;49230:12;49215;:27;;;;49249:60;49278:1;49282:2;49286:12;49300:8;49249:20;:60::i;:::-;48141:1174;;;48043:1272;;;:::o;20640:387::-;20700:4;20908:12;20975:7;20963:20;20955:28;;21018:1;21011:4;:8;21004:15;;;20640:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1179:5;1210:6;1204:13;1195:22;;1226:30;1250:5;1226:30;:::i;:::-;1125:137;;;;:::o;1268:::-;1313:5;1351:6;1338:20;1329:29;;1367:32;1393:5;1367:32;:::i;:::-;1268:137;;;;:::o;1411:141::-;1467:5;1498:6;1492:13;1483:22;;1514:32;1540:5;1514:32;:::i;:::-;1411:141;;;;:::o;1571:338::-;1626:5;1675:3;1668:4;1660:6;1656:17;1652:27;1642:122;;1683:79;;:::i;:::-;1642:122;1800:6;1787:20;1825:78;1899:3;1891:6;1884:4;1876:6;1872:17;1825:78;:::i;:::-;1816:87;;1632:277;1571:338;;;;:::o;1915:167::-;1975:5;2013:6;2000:20;1991:29;;2029:47;2070:5;2029:47;:::i;:::-;1915:167;;;;:::o;2088:201::-;2174:5;2205:6;2199:13;2190:22;;2221:62;2277:5;2221:62;:::i;:::-;2088:201;;;;:::o;2309:340::-;2365:5;2414:3;2407:4;2399:6;2395:17;2391:27;2381:122;;2422:79;;:::i;:::-;2381:122;2539:6;2526:20;2564:79;2639:3;2631:6;2624:4;2616:6;2612:17;2564:79;:::i;:::-;2555:88;;2371:278;2309:340;;;;:::o;2655:139::-;2701:5;2739:6;2726:20;2717:29;;2755:33;2782:5;2755:33;:::i;:::-;2655:139;;;;:::o;2800:143::-;2857:5;2888:6;2882:13;2873:22;;2904:33;2931:5;2904:33;:::i;:::-;2800:143;;;;:::o;2949:329::-;3008:6;3057:2;3045:9;3036:7;3032:23;3028:32;3025:119;;;3063:79;;:::i;:::-;3025:119;3183:1;3208:53;3253:7;3244:6;3233:9;3229:22;3208:53;:::i;:::-;3198:63;;3154:117;2949:329;;;;:::o;3284:474::-;3352:6;3360;3409:2;3397:9;3388:7;3384:23;3380:32;3377:119;;;3415:79;;:::i;:::-;3377:119;3535:1;3560:53;3605:7;3596:6;3585:9;3581:22;3560:53;:::i;:::-;3550:63;;3506:117;3662:2;3688:53;3733:7;3724:6;3713:9;3709:22;3688:53;:::i;:::-;3678:63;;3633:118;3284:474;;;;;:::o;3764:619::-;3841:6;3849;3857;3906:2;3894:9;3885:7;3881:23;3877:32;3874:119;;;3912:79;;:::i;:::-;3874:119;4032:1;4057:53;4102:7;4093:6;4082:9;4078:22;4057:53;:::i;:::-;4047:63;;4003:117;4159:2;4185:53;4230:7;4221:6;4210:9;4206:22;4185:53;:::i;:::-;4175:63;;4130:118;4287:2;4313:53;4358:7;4349:6;4338:9;4334:22;4313:53;:::i;:::-;4303:63;;4258:118;3764:619;;;;;:::o;4389:943::-;4484:6;4492;4500;4508;4557:3;4545:9;4536:7;4532:23;4528:33;4525:120;;;4564:79;;:::i;:::-;4525:120;4684:1;4709:53;4754:7;4745:6;4734:9;4730:22;4709:53;:::i;:::-;4699:63;;4655:117;4811:2;4837:53;4882:7;4873:6;4862:9;4858:22;4837:53;:::i;:::-;4827:63;;4782:118;4939:2;4965:53;5010:7;5001:6;4990:9;4986:22;4965:53;:::i;:::-;4955:63;;4910:118;5095:2;5084:9;5080:18;5067:32;5126:18;5118:6;5115:30;5112:117;;;5148:79;;:::i;:::-;5112:117;5253:62;5307:7;5298:6;5287:9;5283:22;5253:62;:::i;:::-;5243:72;;5038:287;4389:943;;;;;;;:::o;5338:468::-;5403:6;5411;5460:2;5448:9;5439:7;5435:23;5431:32;5428:119;;;5466:79;;:::i;:::-;5428:119;5586:1;5611:53;5656:7;5647:6;5636:9;5632:22;5611:53;:::i;:::-;5601:63;;5557:117;5713:2;5739:50;5781:7;5772:6;5761:9;5757:22;5739:50;:::i;:::-;5729:60;;5684:115;5338:468;;;;;:::o;5812:474::-;5880:6;5888;5937:2;5925:9;5916:7;5912:23;5908:32;5905:119;;;5943:79;;:::i;:::-;5905:119;6063:1;6088:53;6133:7;6124:6;6113:9;6109:22;6088:53;:::i;:::-;6078:63;;6034:117;6190:2;6216:53;6261:7;6252:6;6241:9;6237:22;6216:53;:::i;:::-;6206:63;;6161:118;5812:474;;;;;:::o;6292:345::-;6359:6;6408:2;6396:9;6387:7;6383:23;6379:32;6376:119;;;6414:79;;:::i;:::-;6376:119;6534:1;6559:61;6612:7;6603:6;6592:9;6588:22;6559:61;:::i;:::-;6549:71;;6505:125;6292:345;;;;:::o;6643:327::-;6701:6;6750:2;6738:9;6729:7;6725:23;6721:32;6718:119;;;6756:79;;:::i;:::-;6718:119;6876:1;6901:52;6945:7;6936:6;6925:9;6921:22;6901:52;:::i;:::-;6891:62;;6847:116;6643:327;;;;:::o;6976:349::-;7045:6;7094:2;7082:9;7073:7;7069:23;7065:32;7062:119;;;7100:79;;:::i;:::-;7062:119;7220:1;7245:63;7300:7;7291:6;7280:9;7276:22;7245:63;:::i;:::-;7235:73;;7191:127;6976:349;;;;:::o;7331:357::-;7404:6;7453:2;7441:9;7432:7;7428:23;7424:32;7421:119;;;7459:79;;:::i;:::-;7421:119;7579:1;7604:67;7663:7;7654:6;7643:9;7639:22;7604:67;:::i;:::-;7594:77;;7550:131;7331:357;;;;:::o;7694:409::-;7793:6;7842:2;7830:9;7821:7;7817:23;7813:32;7810:119;;;7848:79;;:::i;:::-;7810:119;7968:1;7993:93;8078:7;8069:6;8058:9;8054:22;7993:93;:::i;:::-;7983:103;;7939:157;7694:409;;;;:::o;8109:509::-;8178:6;8227:2;8215:9;8206:7;8202:23;8198:32;8195:119;;;8233:79;;:::i;:::-;8195:119;8381:1;8370:9;8366:17;8353:31;8411:18;8403:6;8400:30;8397:117;;;8433:79;;:::i;:::-;8397:117;8538:63;8593:7;8584:6;8573:9;8569:22;8538:63;:::i;:::-;8528:73;;8324:287;8109:509;;;;:::o;8624:329::-;8683:6;8732:2;8720:9;8711:7;8707:23;8703:32;8700:119;;;8738:79;;:::i;:::-;8700:119;8858:1;8883:53;8928:7;8919:6;8908:9;8904:22;8883:53;:::i;:::-;8873:63;;8829:117;8624:329;;;;:::o;8959:351::-;9029:6;9078:2;9066:9;9057:7;9053:23;9049:32;9046:119;;;9084:79;;:::i;:::-;9046:119;9204:1;9229:64;9285:7;9276:6;9265:9;9261:22;9229:64;:::i;:::-;9219:74;;9175:128;8959:351;;;;:::o;9316:474::-;9384:6;9392;9441:2;9429:9;9420:7;9416:23;9412:32;9409:119;;;9447:79;;:::i;:::-;9409:119;9567:1;9592:53;9637:7;9628:6;9617:9;9613:22;9592:53;:::i;:::-;9582:63;;9538:117;9694:2;9720:53;9765:7;9756:6;9745:9;9741:22;9720:53;:::i;:::-;9710:63;;9665:118;9316:474;;;;;:::o;9796:118::-;9883:24;9901:5;9883:24;:::i;:::-;9878:3;9871:37;9796:118;;:::o;9920:109::-;10001:21;10016:5;10001:21;:::i;:::-;9996:3;9989:34;9920:109;;:::o;10035:360::-;10121:3;10149:38;10181:5;10149:38;:::i;:::-;10203:70;10266:6;10261:3;10203:70;:::i;:::-;10196:77;;10282:52;10327:6;10322:3;10315:4;10308:5;10304:16;10282:52;:::i;:::-;10359:29;10381:6;10359:29;:::i;:::-;10354:3;10350:39;10343:46;;10125:270;10035:360;;;;:::o;10401:364::-;10489:3;10517:39;10550:5;10517:39;:::i;:::-;10572:71;10636:6;10631:3;10572:71;:::i;:::-;10565:78;;10652:52;10697:6;10692:3;10685:4;10678:5;10674:16;10652:52;:::i;:::-;10729:29;10751:6;10729:29;:::i;:::-;10724:3;10720:39;10713:46;;10493:272;10401:364;;;;:::o;10771:377::-;10877:3;10905:39;10938:5;10905:39;:::i;:::-;10960:89;11042:6;11037:3;10960:89;:::i;:::-;10953:96;;11058:52;11103:6;11098:3;11091:4;11084:5;11080:16;11058:52;:::i;:::-;11135:6;11130:3;11126:16;11119:23;;10881:267;10771:377;;;;:::o;11178:845::-;11281:3;11318:5;11312:12;11347:36;11373:9;11347:36;:::i;:::-;11399:89;11481:6;11476:3;11399:89;:::i;:::-;11392:96;;11519:1;11508:9;11504:17;11535:1;11530:137;;;;11681:1;11676:341;;;;11497:520;;11530:137;11614:4;11610:9;11599;11595:25;11590:3;11583:38;11650:6;11645:3;11641:16;11634:23;;11530:137;;11676:341;11743:38;11775:5;11743:38;:::i;:::-;11803:1;11817:154;11831:6;11828:1;11825:13;11817:154;;;11905:7;11899:14;11895:1;11890:3;11886:11;11879:35;11955:1;11946:7;11942:15;11931:26;;11853:4;11850:1;11846:12;11841:17;;11817:154;;;12000:6;11995:3;11991:16;11984:23;;11683:334;;11497:520;;11285:738;;11178:845;;;;:::o;12029:366::-;12171:3;12192:67;12256:2;12251:3;12192:67;:::i;:::-;12185:74;;12268:93;12357:3;12268:93;:::i;:::-;12386:2;12381:3;12377:12;12370:19;;12029:366;;;:::o;12401:::-;12543:3;12564:67;12628:2;12623:3;12564:67;:::i;:::-;12557:74;;12640:93;12729:3;12640:93;:::i;:::-;12758:2;12753:3;12749:12;12742:19;;12401:366;;;:::o;12773:::-;12915:3;12936:67;13000:2;12995:3;12936:67;:::i;:::-;12929:74;;13012:93;13101:3;13012:93;:::i;:::-;13130:2;13125:3;13121:12;13114:19;;12773:366;;;:::o;13145:::-;13287:3;13308:67;13372:2;13367:3;13308:67;:::i;:::-;13301:74;;13384:93;13473:3;13384:93;:::i;:::-;13502:2;13497:3;13493:12;13486:19;;13145:366;;;:::o;13517:::-;13659:3;13680:67;13744:2;13739:3;13680:67;:::i;:::-;13673:74;;13756:93;13845:3;13756:93;:::i;:::-;13874:2;13869:3;13865:12;13858:19;;13517:366;;;:::o;13889:::-;14031:3;14052:67;14116:2;14111:3;14052:67;:::i;:::-;14045:74;;14128:93;14217:3;14128:93;:::i;:::-;14246:2;14241:3;14237:12;14230:19;;13889:366;;;:::o;14261:::-;14403:3;14424:67;14488:2;14483:3;14424:67;:::i;:::-;14417:74;;14500:93;14589:3;14500:93;:::i;:::-;14618:2;14613:3;14609:12;14602:19;;14261:366;;;:::o;14633:::-;14775:3;14796:67;14860:2;14855:3;14796:67;:::i;:::-;14789:74;;14872:93;14961:3;14872:93;:::i;:::-;14990:2;14985:3;14981:12;14974:19;;14633:366;;;:::o;15005:::-;15147:3;15168:67;15232:2;15227:3;15168:67;:::i;:::-;15161:74;;15244:93;15333:3;15244:93;:::i;:::-;15362:2;15357:3;15353:12;15346:19;;15005:366;;;:::o;15377:::-;15519:3;15540:67;15604:2;15599:3;15540:67;:::i;:::-;15533:74;;15616:93;15705:3;15616:93;:::i;:::-;15734:2;15729:3;15725:12;15718:19;;15377:366;;;:::o;15749:::-;15891:3;15912:67;15976:2;15971:3;15912:67;:::i;:::-;15905:74;;15988:93;16077:3;15988:93;:::i;:::-;16106:2;16101:3;16097:12;16090:19;;15749:366;;;:::o;16121:400::-;16281:3;16302:84;16384:1;16379:3;16302:84;:::i;:::-;16295:91;;16395:93;16484:3;16395:93;:::i;:::-;16513:1;16508:3;16504:11;16497:18;;16121:400;;;:::o;16527:366::-;16669:3;16690:67;16754:2;16749:3;16690:67;:::i;:::-;16683:74;;16766:93;16855:3;16766:93;:::i;:::-;16884:2;16879:3;16875:12;16868:19;;16527:366;;;:::o;16899:::-;17041:3;17062:67;17126:2;17121:3;17062:67;:::i;:::-;17055:74;;17138:93;17227:3;17138:93;:::i;:::-;17256:2;17251:3;17247:12;17240:19;;16899:366;;;:::o;17271:::-;17413:3;17434:67;17498:2;17493:3;17434:67;:::i;:::-;17427:74;;17510:93;17599:3;17510:93;:::i;:::-;17628:2;17623:3;17619:12;17612:19;;17271:366;;;:::o;17643:::-;17785:3;17806:67;17870:2;17865:3;17806:67;:::i;:::-;17799:74;;17882:93;17971:3;17882:93;:::i;:::-;18000:2;17995:3;17991:12;17984:19;;17643:366;;;:::o;18015:::-;18157:3;18178:67;18242:2;18237:3;18178:67;:::i;:::-;18171:74;;18254:93;18343:3;18254:93;:::i;:::-;18372:2;18367:3;18363:12;18356:19;;18015:366;;;:::o;18387:::-;18529:3;18550:67;18614:2;18609:3;18550:67;:::i;:::-;18543:74;;18626:93;18715:3;18626:93;:::i;:::-;18744:2;18739:3;18735:12;18728:19;;18387:366;;;:::o;18759:::-;18901:3;18922:67;18986:2;18981:3;18922:67;:::i;:::-;18915:74;;18998:93;19087:3;18998:93;:::i;:::-;19116:2;19111:3;19107:12;19100:19;;18759:366;;;:::o;19131:::-;19273:3;19294:67;19358:2;19353:3;19294:67;:::i;:::-;19287:74;;19370:93;19459:3;19370:93;:::i;:::-;19488:2;19483:3;19479:12;19472:19;;19131:366;;;:::o;19503:::-;19645:3;19666:67;19730:2;19725:3;19666:67;:::i;:::-;19659:74;;19742:93;19831:3;19742:93;:::i;:::-;19860:2;19855:3;19851:12;19844:19;;19503:366;;;:::o;19875:::-;20017:3;20038:67;20102:2;20097:3;20038:67;:::i;:::-;20031:74;;20114:93;20203:3;20114:93;:::i;:::-;20232:2;20227:3;20223:12;20216:19;;19875:366;;;:::o;20247:::-;20389:3;20410:67;20474:2;20469:3;20410:67;:::i;:::-;20403:74;;20486:93;20575:3;20486:93;:::i;:::-;20604:2;20599:3;20595:12;20588:19;;20247:366;;;:::o;20619:::-;20761:3;20782:67;20846:2;20841:3;20782:67;:::i;:::-;20775:74;;20858:93;20947:3;20858:93;:::i;:::-;20976:2;20971:3;20967:12;20960:19;;20619:366;;;:::o;20991:::-;21133:3;21154:67;21218:2;21213:3;21154:67;:::i;:::-;21147:74;;21230:93;21319:3;21230:93;:::i;:::-;21348:2;21343:3;21339:12;21332:19;;20991:366;;;:::o;21363:::-;21505:3;21526:67;21590:2;21585:3;21526:67;:::i;:::-;21519:74;;21602:93;21691:3;21602:93;:::i;:::-;21720:2;21715:3;21711:12;21704:19;;21363:366;;;:::o;21735:400::-;21895:3;21916:84;21998:1;21993:3;21916:84;:::i;:::-;21909:91;;22009:93;22098:3;22009:93;:::i;:::-;22127:1;22122:3;22118:11;22111:18;;21735:400;;;:::o;22141:118::-;22228:24;22246:5;22228:24;:::i;:::-;22223:3;22216:37;22141:118;;:::o;22265:961::-;22644:3;22666:92;22754:3;22745:6;22666:92;:::i;:::-;22659:99;;22775:148;22919:3;22775:148;:::i;:::-;22768:155;;22940:95;23031:3;23022:6;22940:95;:::i;:::-;22933:102;;23052:148;23196:3;23052:148;:::i;:::-;23045:155;;23217:3;23210:10;;22265:961;;;;;:::o;23232:222::-;23325:4;23363:2;23352:9;23348:18;23340:26;;23376:71;23444:1;23433:9;23429:17;23420:6;23376:71;:::i;:::-;23232:222;;;;:::o;23460:640::-;23655:4;23693:3;23682:9;23678:19;23670:27;;23707:71;23775:1;23764:9;23760:17;23751:6;23707:71;:::i;:::-;23788:72;23856:2;23845:9;23841:18;23832:6;23788:72;:::i;:::-;23870;23938:2;23927:9;23923:18;23914:6;23870:72;:::i;:::-;23989:9;23983:4;23979:20;23974:2;23963:9;23959:18;23952:48;24017:76;24088:4;24079:6;24017:76;:::i;:::-;24009:84;;23460:640;;;;;;;:::o;24106:332::-;24227:4;24265:2;24254:9;24250:18;24242:26;;24278:71;24346:1;24335:9;24331:17;24322:6;24278:71;:::i;:::-;24359:72;24427:2;24416:9;24412:18;24403:6;24359:72;:::i;:::-;24106:332;;;;;:::o;24444:210::-;24531:4;24569:2;24558:9;24554:18;24546:26;;24582:65;24644:1;24633:9;24629:17;24620:6;24582:65;:::i;:::-;24444:210;;;;:::o;24660:313::-;24773:4;24811:2;24800:9;24796:18;24788:26;;24860:9;24854:4;24850:20;24846:1;24835:9;24831:17;24824:47;24888:78;24961:4;24952:6;24888:78;:::i;:::-;24880:86;;24660:313;;;;:::o;24979:419::-;25145:4;25183:2;25172:9;25168:18;25160:26;;25232:9;25226:4;25222:20;25218:1;25207:9;25203:17;25196:47;25260:131;25386:4;25260:131;:::i;:::-;25252:139;;24979:419;;;:::o;25404:::-;25570:4;25608:2;25597:9;25593:18;25585:26;;25657:9;25651:4;25647:20;25643:1;25632:9;25628:17;25621:47;25685:131;25811:4;25685:131;:::i;:::-;25677:139;;25404:419;;;:::o;25829:::-;25995:4;26033:2;26022:9;26018:18;26010:26;;26082:9;26076:4;26072:20;26068:1;26057:9;26053:17;26046:47;26110:131;26236:4;26110:131;:::i;:::-;26102:139;;25829:419;;;:::o;26254:::-;26420:4;26458:2;26447:9;26443:18;26435:26;;26507:9;26501:4;26497:20;26493:1;26482:9;26478:17;26471:47;26535:131;26661:4;26535:131;:::i;:::-;26527:139;;26254:419;;;:::o;26679:::-;26845:4;26883:2;26872:9;26868:18;26860:26;;26932:9;26926:4;26922:20;26918:1;26907:9;26903:17;26896:47;26960:131;27086:4;26960:131;:::i;:::-;26952:139;;26679:419;;;:::o;27104:::-;27270:4;27308:2;27297:9;27293:18;27285:26;;27357:9;27351:4;27347:20;27343:1;27332:9;27328:17;27321:47;27385:131;27511:4;27385:131;:::i;:::-;27377:139;;27104:419;;;:::o;27529:::-;27695:4;27733:2;27722:9;27718:18;27710:26;;27782:9;27776:4;27772:20;27768:1;27757:9;27753:17;27746:47;27810:131;27936:4;27810:131;:::i;:::-;27802:139;;27529:419;;;:::o;27954:::-;28120:4;28158:2;28147:9;28143:18;28135:26;;28207:9;28201:4;28197:20;28193:1;28182:9;28178:17;28171:47;28235:131;28361:4;28235:131;:::i;:::-;28227:139;;27954:419;;;:::o;28379:::-;28545:4;28583:2;28572:9;28568:18;28560:26;;28632:9;28626:4;28622:20;28618:1;28607:9;28603:17;28596:47;28660:131;28786:4;28660:131;:::i;:::-;28652:139;;28379:419;;;:::o;28804:::-;28970:4;29008:2;28997:9;28993:18;28985:26;;29057:9;29051:4;29047:20;29043:1;29032:9;29028:17;29021:47;29085:131;29211:4;29085:131;:::i;:::-;29077:139;;28804:419;;;:::o;29229:::-;29395:4;29433:2;29422:9;29418:18;29410:26;;29482:9;29476:4;29472:20;29468:1;29457:9;29453:17;29446:47;29510:131;29636:4;29510:131;:::i;:::-;29502:139;;29229:419;;;:::o;29654:::-;29820:4;29858:2;29847:9;29843:18;29835:26;;29907:9;29901:4;29897:20;29893:1;29882:9;29878:17;29871:47;29935:131;30061:4;29935:131;:::i;:::-;29927:139;;29654:419;;;:::o;30079:::-;30245:4;30283:2;30272:9;30268:18;30260:26;;30332:9;30326:4;30322:20;30318:1;30307:9;30303:17;30296:47;30360:131;30486:4;30360:131;:::i;:::-;30352:139;;30079:419;;;:::o;30504:::-;30670:4;30708:2;30697:9;30693:18;30685:26;;30757:9;30751:4;30747:20;30743:1;30732:9;30728:17;30721:47;30785:131;30911:4;30785:131;:::i;:::-;30777:139;;30504:419;;;:::o;30929:::-;31095:4;31133:2;31122:9;31118:18;31110:26;;31182:9;31176:4;31172:20;31168:1;31157:9;31153:17;31146:47;31210:131;31336:4;31210:131;:::i;:::-;31202:139;;30929:419;;;:::o;31354:::-;31520:4;31558:2;31547:9;31543:18;31535:26;;31607:9;31601:4;31597:20;31593:1;31582:9;31578:17;31571:47;31635:131;31761:4;31635:131;:::i;:::-;31627:139;;31354:419;;;:::o;31779:::-;31945:4;31983:2;31972:9;31968:18;31960:26;;32032:9;32026:4;32022:20;32018:1;32007:9;32003:17;31996:47;32060:131;32186:4;32060:131;:::i;:::-;32052:139;;31779:419;;;:::o;32204:::-;32370:4;32408:2;32397:9;32393:18;32385:26;;32457:9;32451:4;32447:20;32443:1;32432:9;32428:17;32421:47;32485:131;32611:4;32485:131;:::i;:::-;32477:139;;32204:419;;;:::o;32629:::-;32795:4;32833:2;32822:9;32818:18;32810:26;;32882:9;32876:4;32872:20;32868:1;32857:9;32853:17;32846:47;32910:131;33036:4;32910:131;:::i;:::-;32902:139;;32629:419;;;:::o;33054:::-;33220:4;33258:2;33247:9;33243:18;33235:26;;33307:9;33301:4;33297:20;33293:1;33282:9;33278:17;33271:47;33335:131;33461:4;33335:131;:::i;:::-;33327:139;;33054:419;;;:::o;33479:::-;33645:4;33683:2;33672:9;33668:18;33660:26;;33732:9;33726:4;33722:20;33718:1;33707:9;33703:17;33696:47;33760:131;33886:4;33760:131;:::i;:::-;33752:139;;33479:419;;;:::o;33904:::-;34070:4;34108:2;34097:9;34093:18;34085:26;;34157:9;34151:4;34147:20;34143:1;34132:9;34128:17;34121:47;34185:131;34311:4;34185:131;:::i;:::-;34177:139;;33904:419;;;:::o;34329:::-;34495:4;34533:2;34522:9;34518:18;34510:26;;34582:9;34576:4;34572:20;34568:1;34557:9;34553:17;34546:47;34610:131;34736:4;34610:131;:::i;:::-;34602:139;;34329:419;;;:::o;34754:::-;34920:4;34958:2;34947:9;34943:18;34935:26;;35007:9;35001:4;34997:20;34993:1;34982:9;34978:17;34971:47;35035:131;35161:4;35035:131;:::i;:::-;35027:139;;34754:419;;;:::o;35179:::-;35345:4;35383:2;35372:9;35368:18;35360:26;;35432:9;35426:4;35422:20;35418:1;35407:9;35403:17;35396:47;35460:131;35586:4;35460:131;:::i;:::-;35452:139;;35179:419;;;:::o;35604:222::-;35697:4;35735:2;35724:9;35720:18;35712:26;;35748:71;35816:1;35805:9;35801:17;35792:6;35748:71;:::i;:::-;35604:222;;;;:::o;35832:129::-;35866:6;35893:20;;:::i;:::-;35883:30;;35922:33;35950:4;35942:6;35922:33;:::i;:::-;35832:129;;;:::o;35967:75::-;36000:6;36033:2;36027:9;36017:19;;35967:75;:::o;36048:307::-;36109:4;36199:18;36191:6;36188:30;36185:56;;;36221:18;;:::i;:::-;36185:56;36259:29;36281:6;36259:29;:::i;:::-;36251:37;;36343:4;36337;36333:15;36325:23;;36048:307;;;:::o;36361:308::-;36423:4;36513:18;36505:6;36502:30;36499:56;;;36535:18;;:::i;:::-;36499:56;36573:29;36595:6;36573:29;:::i;:::-;36565:37;;36657:4;36651;36647:15;36639:23;;36361:308;;;:::o;36675:141::-;36724:4;36747:3;36739:11;;36770:3;36767:1;36760:14;36804:4;36801:1;36791:18;36783:26;;36675:141;;;:::o;36822:98::-;36873:6;36907:5;36901:12;36891:22;;36822:98;;;:::o;36926:99::-;36978:6;37012:5;37006:12;36996:22;;36926:99;;;:::o;37031:168::-;37114:11;37148:6;37143:3;37136:19;37188:4;37183:3;37179:14;37164:29;;37031:168;;;;:::o;37205:169::-;37289:11;37323:6;37318:3;37311:19;37363:4;37358:3;37354:14;37339:29;;37205:169;;;;:::o;37380:148::-;37482:11;37519:3;37504:18;;37380:148;;;;:::o;37534:273::-;37574:3;37593:20;37611:1;37593:20;:::i;:::-;37588:25;;37627:20;37645:1;37627:20;:::i;:::-;37622:25;;37749:1;37713:34;37709:42;37706:1;37703:49;37700:75;;;37755:18;;:::i;:::-;37700:75;37799:1;37796;37792:9;37785:16;;37534:273;;;;:::o;37813:305::-;37853:3;37872:20;37890:1;37872:20;:::i;:::-;37867:25;;37906:20;37924:1;37906:20;:::i;:::-;37901:25;;38060:1;37992:66;37988:74;37985:1;37982:81;37979:107;;;38066:18;;:::i;:::-;37979:107;38110:1;38107;38103:9;38096:16;;37813:305;;;;:::o;38124:185::-;38164:1;38181:20;38199:1;38181:20;:::i;:::-;38176:25;;38215:20;38233:1;38215:20;:::i;:::-;38210:25;;38254:1;38244:35;;38259:18;;:::i;:::-;38244:35;38301:1;38298;38294:9;38289:14;;38124:185;;;;:::o;38315:348::-;38355:7;38378:20;38396:1;38378:20;:::i;:::-;38373:25;;38412:20;38430:1;38412:20;:::i;:::-;38407:25;;38600:1;38532:66;38528:74;38525:1;38522:81;38517:1;38510:9;38503:17;38499:105;38496:131;;;38607:18;;:::i;:::-;38496:131;38655:1;38652;38648:9;38637:20;;38315:348;;;;:::o;38669:191::-;38709:4;38729:20;38747:1;38729:20;:::i;:::-;38724:25;;38763:20;38781:1;38763:20;:::i;:::-;38758:25;;38802:1;38799;38796:8;38793:34;;;38807:18;;:::i;:::-;38793:34;38852:1;38849;38845:9;38837:17;;38669:191;;;;:::o;38866:::-;38906:4;38926:20;38944:1;38926:20;:::i;:::-;38921:25;;38960:20;38978:1;38960:20;:::i;:::-;38955:25;;38999:1;38996;38993:8;38990:34;;;39004:18;;:::i;:::-;38990:34;39049:1;39046;39042:9;39034:17;;38866:191;;;;:::o;39063:96::-;39100:7;39129:24;39147:5;39129:24;:::i;:::-;39118:35;;39063:96;;;:::o;39165:90::-;39199:7;39242:5;39235:13;39228:21;39217:32;;39165:90;;;:::o;39261:149::-;39297:7;39337:66;39330:5;39326:78;39315:89;;39261:149;;;:::o;39416:110::-;39467:7;39496:24;39514:5;39496:24;:::i;:::-;39485:35;;39416:110;;;:::o;39532:125::-;39598:7;39627:24;39645:5;39627:24;:::i;:::-;39616:35;;39532:125;;;:::o;39663:118::-;39700:7;39740:34;39733:5;39729:46;39718:57;;39663:118;;;:::o;39787:126::-;39824:7;39864:42;39857:5;39853:54;39842:65;;39787:126;;;:::o;39919:77::-;39956:7;39985:5;39974:16;;39919:77;;;:::o;40002:154::-;40086:6;40081:3;40076;40063:30;40148:1;40139:6;40134:3;40130:16;40123:27;40002:154;;;:::o;40162:307::-;40230:1;40240:113;40254:6;40251:1;40248:13;40240:113;;;40339:1;40334:3;40330:11;40324:18;40320:1;40315:3;40311:11;40304:39;40276:2;40273:1;40269:10;40264:15;;40240:113;;;40371:6;40368:1;40365:13;40362:101;;;40451:1;40442:6;40437:3;40433:16;40426:27;40362:101;40211:258;40162:307;;;:::o;40475:171::-;40514:3;40537:24;40555:5;40537:24;:::i;:::-;40528:33;;40583:4;40576:5;40573:15;40570:41;;;40591:18;;:::i;:::-;40570:41;40638:1;40631:5;40627:13;40620:20;;40475:171;;;:::o;40652:320::-;40696:6;40733:1;40727:4;40723:12;40713:22;;40780:1;40774:4;40770:12;40801:18;40791:81;;40857:4;40849:6;40845:17;40835:27;;40791:81;40919:2;40911:6;40908:14;40888:18;40885:38;40882:84;;;40938:18;;:::i;:::-;40882:84;40703:269;40652:320;;;:::o;40978:281::-;41061:27;41083:4;41061:27;:::i;:::-;41053:6;41049:40;41191:6;41179:10;41176:22;41155:18;41143:10;41140:34;41137:62;41134:88;;;41202:18;;:::i;:::-;41134:88;41242:10;41238:2;41231:22;41021:238;40978:281;;:::o;41265:233::-;41304:3;41327:24;41345:5;41327:24;:::i;:::-;41318:33;;41373:66;41366:5;41363:77;41360:103;;;41443:18;;:::i;:::-;41360:103;41490:1;41483:5;41479:13;41472:20;;41265:233;;;:::o;41504:176::-;41536:1;41553:20;41571:1;41553:20;:::i;:::-;41548:25;;41587:20;41605:1;41587:20;:::i;:::-;41582:25;;41626:1;41616:35;;41631:18;;:::i;:::-;41616:35;41672:1;41669;41665:9;41660:14;;41504:176;;;;:::o;41686:180::-;41734:77;41731:1;41724:88;41831:4;41828:1;41821:15;41855:4;41852:1;41845:15;41872:180;41920:77;41917:1;41910:88;42017:4;42014:1;42007:15;42041:4;42038:1;42031:15;42058:180;42106:77;42103:1;42096:88;42203:4;42200:1;42193:15;42227:4;42224:1;42217:15;42244:180;42292:77;42289:1;42282:88;42389:4;42386:1;42379:15;42413:4;42410:1;42403:15;42430:180;42478:77;42475:1;42468:88;42575:4;42572:1;42565:15;42599:4;42596:1;42589:15;42616:117;42725:1;42722;42715:12;42739:117;42848:1;42845;42838:12;42862:117;42971:1;42968;42961:12;42985:117;43094:1;43091;43084:12;43108:102;43149:6;43200:2;43196:7;43191:2;43184:5;43180:14;43176:28;43166:38;;43108:102;;;:::o;43216:221::-;43356:34;43352:1;43344:6;43340:14;43333:58;43425:4;43420:2;43412:6;43408:15;43401:29;43216:221;:::o;43443:225::-;43583:34;43579:1;43571:6;43567:14;43560:58;43652:8;43647:2;43639:6;43635:15;43628:33;43443:225;:::o;43674:229::-;43814:34;43810:1;43802:6;43798:14;43791:58;43883:12;43878:2;43870:6;43866:15;43859:37;43674:229;:::o;43909:222::-;44049:34;44045:1;44037:6;44033:14;44026:58;44118:5;44113:2;44105:6;44101:15;44094:30;43909:222;:::o;44137:221::-;44277:34;44273:1;44265:6;44261:14;44254:58;44346:4;44341:2;44333:6;44329:15;44322:29;44137:221;:::o;44364:224::-;44504:34;44500:1;44492:6;44488:14;44481:58;44573:7;44568:2;44560:6;44556:15;44549:32;44364:224;:::o;44594:221::-;44734:34;44730:1;44722:6;44718:14;44711:58;44803:4;44798:2;44790:6;44786:15;44779:29;44594:221;:::o;44821:167::-;44961:19;44957:1;44949:6;44945:14;44938:43;44821:167;:::o;44994:244::-;45134:34;45130:1;45122:6;45118:14;45111:58;45203:27;45198:2;45190:6;45186:15;45179:52;44994:244;:::o;45244:230::-;45384:34;45380:1;45372:6;45368:14;45361:58;45453:13;45448:2;45440:6;45436:15;45429:38;45244:230;:::o;45480:225::-;45620:34;45616:1;45608:6;45604:14;45597:58;45689:8;45684:2;45676:6;45672:15;45665:33;45480:225;:::o;45711:155::-;45851:7;45847:1;45839:6;45835:14;45828:31;45711:155;:::o;45872:182::-;46012:34;46008:1;46000:6;45996:14;45989:58;45872:182;:::o;46060:176::-;46200:28;46196:1;46188:6;46184:14;46177:52;46060:176;:::o;46242:237::-;46382:34;46378:1;46370:6;46366:14;46359:58;46451:20;46446:2;46438:6;46434:15;46427:45;46242:237;:::o;46485:221::-;46625:34;46621:1;46613:6;46609:14;46602:58;46694:4;46689:2;46681:6;46677:15;46670:29;46485:221;:::o;46712:238::-;46852:34;46848:1;46840:6;46836:14;46829:58;46921:21;46916:2;46908:6;46904:15;46897:46;46712:238;:::o;46956:179::-;47096:31;47092:1;47084:6;47080:14;47073:55;46956:179;:::o;47141:220::-;47281:34;47277:1;47269:6;47265:14;47258:58;47350:3;47345:2;47337:6;47333:15;47326:28;47141:220;:::o;47367:174::-;47507:26;47503:1;47495:6;47491:14;47484:50;47367:174;:::o;47547:233::-;47687:34;47683:1;47675:6;47671:14;47664:58;47756:16;47751:2;47743:6;47739:15;47732:41;47547:233;:::o;47786:181::-;47926:33;47922:1;47914:6;47910:14;47903:57;47786:181;:::o;47973:234::-;48113:34;48109:1;48101:6;48097:14;48090:58;48182:17;48177:2;48169:6;48165:15;48158:42;47973:234;:::o;48213:173::-;48353:25;48349:1;48341:6;48337:14;48330:49;48213:173;:::o;48392:232::-;48532:34;48528:1;48520:6;48516:14;48509:58;48601:15;48596:2;48588:6;48584:15;48577:40;48392:232;:::o;48630:221::-;48770:34;48766:1;48758:6;48754:14;48747:58;48839:4;48834:2;48826:6;48822:15;48815:29;48630:221;:::o;48857:151::-;48997:3;48993:1;48985:6;48981:14;48974:27;48857:151;:::o;49014:122::-;49087:24;49105:5;49087:24;:::i;:::-;49080:5;49077:35;49067:63;;49126:1;49123;49116:12;49067:63;49014:122;:::o;49142:116::-;49212:21;49227:5;49212:21;:::i;:::-;49205:5;49202:32;49192:60;;49248:1;49245;49238:12;49192:60;49142:116;:::o;49264:120::-;49336:23;49353:5;49336:23;:::i;:::-;49329:5;49326:34;49316:62;;49374:1;49371;49364:12;49316:62;49264:120;:::o;49390:150::-;49477:38;49509:5;49477:38;:::i;:::-;49470:5;49467:49;49457:77;;49530:1;49527;49520:12;49457:77;49390:150;:::o;49546:180::-;49648:53;49695:5;49648:53;:::i;:::-;49641:5;49638:64;49628:92;;49716:1;49713;49706:12;49628:92;49546:180;:::o;49732:122::-;49805:24;49823:5;49805:24;:::i;:::-;49798:5;49795:35;49785:63;;49844:1;49841;49834:12;49785:63;49732:122;:::o

Swarm Source

ipfs://221feb2de428611bed8b9a4482bfcbaf333e2a4a5fdb8e46a79b3e0b18609056
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

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