POL Price: $0.71324 (-0.47%)
 

Overview

Max Total Supply

3,804 LBAO

Holders

410

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 LBAO
0x677c5381f3aace93f82a9873b70e643a8e63b784
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
LittleBaos

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2023-06-19
*/

// File: @openzeppelin/[email protected]/utils/math/Math.sol


// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1);

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator,
        Rounding rounding
    ) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10**64) {
                value /= 10**64;
                result += 64;
            }
            if (value >= 10**32) {
                value /= 10**32;
                result += 32;
            }
            if (value >= 10**16) {
                value /= 10**16;
                result += 16;
            }
            if (value >= 10**8) {
                value /= 10**8;
                result += 8;
            }
            if (value >= 10**4) {
                value /= 10**4;
                result += 4;
            }
            if (value >= 10**2) {
                value /= 10**2;
                result += 2;
            }
            if (value >= 10**1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);
        }
    }
}

// File: @openzeppelin/[email protected]/utils/Strings.sol


// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)

pragma solidity ^0.8.0;


/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

    /**
     * @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] = _SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

// File: @openzeppelin/[email protected]/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/[email protected]/access/Ownable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (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 Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        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/[email protected]/utils/Address.sol


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or 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 {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // 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
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

// File: @openzeppelin/[email protected]/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts (last updated v4.6.0) (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 `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/[email protected]/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/[email protected]/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/[email protected]/token/ERC721/IERC721.sol


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

    /**
     * @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 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: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
     * understand this adds an external call which potentially creates a reentrancy vulnerability.
     *
     * 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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

// File: @openzeppelin/[email protected]/token/ERC721/extensions/IERC721Enumerable.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/[email protected]/token/ERC721/extensions/IERC721Metadata.sol


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

pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/[email protected]/token/ERC721/ERC721.sol


// OpenZeppelin Contracts (last updated v4.8.2) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _ownerOf(tokenId);
        require(owner != address(0), "ERC721: invalid token ID");
        return owner;
    }

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

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

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

        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 overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

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

        _transfer(from, to, tokenId);
    }

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist
     */
    function _ownerOf(uint256 tokenId) internal view virtual returns (address) {
        return _owners[tokenId];
    }

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

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

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

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

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

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

        // Check that tokenId was not minted by `_beforeTokenTransfer` hook
        require(!_exists(tokenId), "ERC721: token already minted");

        unchecked {
            // Will not overflow unless all 2**256 token ids are minted to the same owner.
            // Given that tokens are minted one by one, it is impossible in practice that
            // this ever happens. Might change if we allow batch minting.
            // The ERC fails to describe this case.
            _balances[to] += 1;
        }

        _owners[tokenId] = to;

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

        _afterTokenTransfer(address(0), to, tokenId, 1);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     * This is an internal function that does not check if the sender is authorized to operate on the token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

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

        // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook
        owner = ERC721.ownerOf(tokenId);

        // Clear approvals
        delete _tokenApprovals[tokenId];

        unchecked {
            // Cannot overflow, as that would require more tokens to be burned/transferred
            // out than the owner initially received through minting and transferring in.
            _balances[owner] -= 1;
        }
        delete _owners[tokenId];

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

        _afterTokenTransfer(owner, address(0), tokenId, 1);
    }

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

        _beforeTokenTransfer(from, to, tokenId, 1);

        // Check that tokenId was not transferred by `_beforeTokenTransfer` hook
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");

        // Clear approvals from the previous owner
        delete _tokenApprovals[tokenId];

        unchecked {
            // `_balances[from]` cannot overflow for the same reason as described in `_burn`:
            // `from`'s balance is the number of token held, which is at least one before the current
            // transfer.
            // `_balances[to]` could overflow in the conditions described in `_mint`. That would require
            // all 2**256 token ids to be minted, which in practice is impossible.
            _balances[from] -= 1;
            _balances[to] += 1;
        }
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId, 1);
    }

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

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits an {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

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

    /**
     * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`.
     * - When `from` is zero, the tokens will be minted for `to`.
     * - When `to` is zero, ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 firstTokenId,
        uint256 batchSize
    ) internal virtual {}

    /**
     * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`.
     * - When `from` is zero, the tokens were minted for `to`.
     * - When `to` is zero, ``from``'s tokens were burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 firstTokenId,
        uint256 batchSize
    ) internal virtual {}

    /**
     * @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override.
     *
     * WARNING: Anyone calling this MUST ensure that the balances remain consistent with the ownership. The invariant
     * being that for any address `a` the value returned by `balanceOf(a)` must be equal to the number of tokens such
     * that `ownerOf(tokenId)` is `a`.
     */
    // solhint-disable-next-line func-name-mixedcase
    function __unsafe_increaseBalance(address account, uint256 amount) internal {
        _balances[account] += amount;
    }
}

// File: @openzeppelin/[email protected]/token/ERC721/extensions/ERC721Enumerable.sol


// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

    /**
     * @dev See {ERC721-_beforeTokenTransfer}.
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 firstTokenId,
        uint256 batchSize
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, firstTokenId, batchSize);

        if (batchSize > 1) {
            // Will only trigger during construction. Batch transferring (minting) is not available afterwards.
            revert("ERC721Enumerable: consecutive transfers not supported");
        }

        uint256 tokenId = firstTokenId;

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: contracts/NewBaoContract.sol


pragma solidity ^0.8.0;



contract LittleBaos is ERC721Enumerable, Ownable {

  using Strings for uint256;

  string public baseURI;
  string public unrevealedURI = "";
  string public baseExtension = ".json";

  uint256 public cost = 2 ether;
  uint256 public maxSupply = 7777;

  bool public paused = true;
  bool public revealed = false;

  constructor(
    string memory _name,
    string memory _symbol,
    string memory _initBaseURI,
    string memory _initNotRevealedUri
  ) ERC721(_name, _symbol) {
    baseURI = _initBaseURI;
    unrevealedURI = _initNotRevealedUri;
  }

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

  // public
  function mint(uint256 _mintAmount) public payable {
    require(!paused, "the contract is paused");
    uint256 supply = totalSupply();
    require(_mintAmount > 0, "need to mint at least 1 NFT");
    require(_mintAmount <= 30, "max mint amount per session exceeded");
    require(supply + _mintAmount <= maxSupply, "max NFT limit exceeded");

    if (msg.sender != owner()) {
        require(msg.value >= cost * _mintAmount, "insufficient funds");
    }

    for (uint256 i = 1; i <= _mintAmount; i++) {
      _safeMint(msg.sender, supply + i);
    }
  }

  function walletOfOwner(address _owner) external view returns (uint256[] memory)
  {
    uint256 ownerTokenCount = balanceOf(_owner);
    uint256[] memory tokenIds = new uint256[](ownerTokenCount);

    for (uint256 i; i < ownerTokenCount; i++) {
      tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
    }

    return tokenIds;
  }

  function tokenURI(uint256 tokenId) public view virtual override returns (string memory)
  {
    require(
      _exists(tokenId),
      "ERC721Metadata: URI query for nonexistent token"
    );
    
    //if not revealed 
    if (!revealed) return unrevealedURI;

    //use the base URI plus token id
    string memory currentBaseURI = _baseURI();
    return bytes(currentBaseURI).length > 0
        ? string(abi.encodePacked(currentBaseURI, tokenId.toString(), baseExtension))
        : "";
  }

  //only owner
  function mintBatch(address[] memory _addresses, uint256[][] memory _tokenIdsList) external onlyOwner {  
    require (_addresses.length == _tokenIdsList.length, "invalid batch data");
    
    for (uint j = 0; j < _addresses.length; j++ ){
      address _address = _addresses[j];
      uint256[] memory _tokenIds = _tokenIdsList[j];
      for (uint256 i = 0; i < _tokenIds.length; i++) {
        _safeMint(_address, _tokenIds[i]);
      }
    }
  }

  function setCostWEI(uint256 _newCostInWEI) public onlyOwner {
    cost = _newCostInWEI;  //directly set wei cost
  }
  
  function setCostMATIC(uint256 _newCostInMATIC) public onlyOwner {
    cost = _newCostInMATIC * (10 ** 18); //convert to matic 
  }

  function setBaseURI(string memory _newBaseURI) public onlyOwner {
    baseURI = _newBaseURI;
  }

  function setUnrevealedURI(string memory _unrevealedURI) external onlyOwner {
    unrevealedURI = _unrevealedURI;
  }

  function setBaseExtension(string memory _newBaseExtension) public onlyOwner {
    baseExtension = _newBaseExtension;
  }
  
  function setPaused(bool _state) public onlyOwner {
    paused = _state;
  }

  function setRevealed(bool _state) public onlyOwner {
    revealed = _state;
  }
 
  function withdraw() public payable onlyOwner {
    // =============================================================================
    // This will payout the owner the contract balance.
    // Do not remove this otherwise you will not be able to withdraw the funds.
    // =============================================================================

    (bool os, ) = payable(owner()).call{value: address(this).balance}("");
    require(os);
    // =============================================================================
  }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"string","name":"_initNotRevealedUri","type":"string"}],"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":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"uint256[][]","name":"_tokenIdsList","type":"uint256[][]"}],"name":"mintBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCostInMATIC","type":"uint256"}],"name":"setCostMATIC","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCostInWEI","type":"uint256"}],"name":"setCostWEI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_unrevealedURI","type":"string"}],"name":"setUnrevealedURI","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":"unrevealedURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

608060405260405180602001604052806000815250600c9081620000249190620004a5565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600d90816200006b9190620004a5565b50671bc16d674ec80000600e55611e61600f556001601060006101000a81548160ff0219169083151502179055506000601060016101000a81548160ff021916908315150217905550348015620000c157600080fd5b5060405162005235380380620052358339818101604052810190620000e79190620006f0565b83838160009081620000fa9190620004a5565b5080600190816200010c9190620004a5565b5050506200012f620001236200015d60201b60201c565b6200016560201b60201c565b81600b9081620001409190620004a5565b5080600c9081620001529190620004a5565b5050505050620007de565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002ad57607f821691505b602082108103620002c357620002c262000265565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200032d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620002ee565b620003398683620002ee565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000386620003806200037a8462000351565b6200035b565b62000351565b9050919050565b6000819050919050565b620003a28362000365565b620003ba620003b1826200038d565b848454620002fb565b825550505050565b600090565b620003d1620003c2565b620003de81848462000397565b505050565b5b818110156200040657620003fa600082620003c7565b600181019050620003e4565b5050565b601f82111562000455576200041f81620002c9565b6200042a84620002de565b810160208510156200043a578190505b620004526200044985620002de565b830182620003e3565b50505b505050565b600082821c905092915050565b60006200047a600019846008026200045a565b1980831691505092915050565b600062000495838362000467565b9150826002028217905092915050565b620004b0826200022b565b67ffffffffffffffff811115620004cc57620004cb62000236565b5b620004d8825462000294565b620004e58282856200040a565b600060209050601f8311600181146200051d576000841562000508578287015190505b62000514858262000487565b86555062000584565b601f1984166200052d86620002c9565b60005b82811015620005575784890151825560018201915060208501945060208101905062000530565b8683101562000577578489015162000573601f89168262000467565b8355505b6001600288020188555050505b505050505050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b620005c682620005aa565b810181811067ffffffffffffffff82111715620005e857620005e762000236565b5b80604052505050565b6000620005fd6200058c565b90506200060b8282620005bb565b919050565b600067ffffffffffffffff8211156200062e576200062d62000236565b5b6200063982620005aa565b9050602081019050919050565b60005b838110156200066657808201518184015260208101905062000649565b60008484015250505050565b600062000689620006838462000610565b620005f1565b905082815260208101848484011115620006a857620006a7620005a5565b5b620006b584828562000646565b509392505050565b600082601f830112620006d557620006d4620005a0565b5b8151620006e784826020860162000672565b91505092915050565b600080600080608085870312156200070d576200070c62000596565b5b600085015167ffffffffffffffff8111156200072e576200072d6200059b565b5b6200073c87828801620006bd565b945050602085015167ffffffffffffffff81111562000760576200075f6200059b565b5b6200076e87828801620006bd565b935050604085015167ffffffffffffffff8111156200079257620007916200059b565b5b620007a087828801620006bd565b925050606085015167ffffffffffffffff811115620007c457620007c36200059b565b5b620007d287828801620006bd565b91505092959194509250565b614a4780620007ee6000396000f3fe60806040526004361061021a5760003560e01c80637035bf1811610123578063c87b56dd116100ab578063e0a808531161006f578063e0a80853146107b7578063e985e9c5146107e0578063e9e18a781461081d578063f2fde38b14610846578063fe2c7fee1461086f5761021a565b8063c87b56dd146106d4578063ce48e68114610711578063d5abeb011461073a578063d6fd92d214610765578063da3ef23f1461078e5761021a565b806395d89b41116100f257806395d89b4114610610578063a0712d681461063b578063a22cb46514610657578063b88d4fde14610680578063c6682862146106a95761021a565b80637035bf181461056657806370a0823114610591578063715018a6146105ce5780638da5cb5b146105e55761021a565b80633ccfd60b116101a65780635183022711610175578063518302271461047f57806355f804b3146104aa5780635c975abb146104d35780636352211e146104fe5780636c0360eb1461053b5761021a565b80633ccfd60b146103d257806342842e0e146103dc578063438b6300146104055780634f6ccce7146104425761021a565b806313faede6116101ed57806313faede6146102ed57806316c38b3c1461031857806318160ddd1461034157806323b872dd1461036c5780632f745c59146103955761021a565b806301ffc9a71461021f57806306fdde031461025c578063081812fc14610287578063095ea7b3146102c4575b600080fd5b34801561022b57600080fd5b5061024660048036038101906102419190612da1565b610898565b6040516102539190612de9565b60405180910390f35b34801561026857600080fd5b50610271610912565b60405161027e9190612e94565b60405180910390f35b34801561029357600080fd5b506102ae60048036038101906102a99190612eec565b6109a4565b6040516102bb9190612f5a565b60405180910390f35b3480156102d057600080fd5b506102eb60048036038101906102e69190612fa1565b6109ea565b005b3480156102f957600080fd5b50610302610b01565b60405161030f9190612ff0565b60405180910390f35b34801561032457600080fd5b5061033f600480360381019061033a9190613037565b610b07565b005b34801561034d57600080fd5b50610356610b2c565b6040516103639190612ff0565b60405180910390f35b34801561037857600080fd5b50610393600480360381019061038e9190613064565b610b39565b005b3480156103a157600080fd5b506103bc60048036038101906103b79190612fa1565b610b99565b6040516103c99190612ff0565b60405180910390f35b6103da610c3e565b005b3480156103e857600080fd5b5061040360048036038101906103fe9190613064565b610cc6565b005b34801561041157600080fd5b5061042c600480360381019061042791906130b7565b610ce6565b60405161043991906131a2565b60405180910390f35b34801561044e57600080fd5b5061046960048036038101906104649190612eec565b610d94565b6040516104769190612ff0565b60405180910390f35b34801561048b57600080fd5b50610494610e05565b6040516104a19190612de9565b60405180910390f35b3480156104b657600080fd5b506104d160048036038101906104cc91906132f9565b610e18565b005b3480156104df57600080fd5b506104e8610e33565b6040516104f59190612de9565b60405180910390f35b34801561050a57600080fd5b5061052560048036038101906105209190612eec565b610e46565b6040516105329190612f5a565b60405180910390f35b34801561054757600080fd5b50610550610ecc565b60405161055d9190612e94565b60405180910390f35b34801561057257600080fd5b5061057b610f5a565b6040516105889190612e94565b60405180910390f35b34801561059d57600080fd5b506105b860048036038101906105b391906130b7565b610fe8565b6040516105c59190612ff0565b60405180910390f35b3480156105da57600080fd5b506105e361109f565b005b3480156105f157600080fd5b506105fa6110b3565b6040516106079190612f5a565b60405180910390f35b34801561061c57600080fd5b506106256110dd565b6040516106329190612e94565b60405180910390f35b61065560048036038101906106509190612eec565b61116f565b005b34801561066357600080fd5b5061067e60048036038101906106799190613342565b611368565b005b34801561068c57600080fd5b506106a760048036038101906106a29190613423565b61137e565b005b3480156106b557600080fd5b506106be6113e0565b6040516106cb9190612e94565b60405180910390f35b3480156106e057600080fd5b506106fb60048036038101906106f69190612eec565b61146e565b6040516107089190612e94565b60405180910390f35b34801561071d57600080fd5b5061073860048036038101906107339190613712565b6115bf565b005b34801561074657600080fd5b5061074f6116b3565b60405161075c9190612ff0565b60405180910390f35b34801561077157600080fd5b5061078c60048036038101906107879190612eec565b6116b9565b005b34801561079a57600080fd5b506107b560048036038101906107b091906132f9565b6116de565b005b3480156107c357600080fd5b506107de60048036038101906107d99190613037565b6116f9565b005b3480156107ec57600080fd5b506108076004803603810190610802919061378a565b61171e565b6040516108149190612de9565b60405180910390f35b34801561082957600080fd5b50610844600480360381019061083f9190612eec565b6117b2565b005b34801561085257600080fd5b5061086d600480360381019061086891906130b7565b6117c4565b005b34801561087b57600080fd5b50610896600480360381019061089191906132f9565b611847565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061090b575061090a82611862565b5b9050919050565b606060008054610921906137f9565b80601f016020809104026020016040519081016040528092919081815260200182805461094d906137f9565b801561099a5780601f1061096f5761010080835404028352916020019161099a565b820191906000526020600020905b81548152906001019060200180831161097d57829003601f168201915b5050505050905090565b60006109af82611944565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109f582610e46565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5c9061389c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a8461198f565b73ffffffffffffffffffffffffffffffffffffffff161480610ab35750610ab281610aad61198f565b61171e565b5b610af2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae99061392e565b60405180910390fd5b610afc8383611997565b505050565b600e5481565b610b0f611a50565b80601060006101000a81548160ff02191690831515021790555050565b6000600880549050905090565b610b4a610b4461198f565b82611ace565b610b89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b80906139c0565b60405180910390fd5b610b94838383611b63565b505050565b6000610ba483610fe8565b8210610be5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bdc90613a52565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610c46611a50565b6000610c506110b3565b73ffffffffffffffffffffffffffffffffffffffff1647604051610c7390613aa3565b60006040518083038185875af1925050503d8060008114610cb0576040519150601f19603f3d011682016040523d82523d6000602084013e610cb5565b606091505b5050905080610cc357600080fd5b50565b610ce18383836040518060200160405280600081525061137e565b505050565b60606000610cf383610fe8565b905060008167ffffffffffffffff811115610d1157610d106131ce565b5b604051908082528060200260200182016040528015610d3f5781602001602082028036833780820191505090505b50905060005b82811015610d8957610d578582610b99565b828281518110610d6a57610d69613ab8565b5b6020026020010181815250508080610d8190613b16565b915050610d45565b508092505050919050565b6000610d9e610b2c565b8210610ddf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd690613bd0565b60405180910390fd5b60088281548110610df357610df2613ab8565b5b90600052602060002001549050919050565b601060019054906101000a900460ff1681565b610e20611a50565b80600b9081610e2f9190613d9c565b5050565b601060009054906101000a900460ff1681565b600080610e5283611e5c565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610ec3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eba90613eba565b60405180910390fd5b80915050919050565b600b8054610ed9906137f9565b80601f0160208091040260200160405190810160405280929190818152602001828054610f05906137f9565b8015610f525780601f10610f2757610100808354040283529160200191610f52565b820191906000526020600020905b815481529060010190602001808311610f3557829003601f168201915b505050505081565b600c8054610f67906137f9565b80601f0160208091040260200160405190810160405280929190818152602001828054610f93906137f9565b8015610fe05780601f10610fb557610100808354040283529160200191610fe0565b820191906000526020600020905b815481529060010190602001808311610fc357829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611058576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104f90613f4c565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6110a7611a50565b6110b16000611e99565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546110ec906137f9565b80601f0160208091040260200160405190810160405280929190818152602001828054611118906137f9565b80156111655780601f1061113a57610100808354040283529160200191611165565b820191906000526020600020905b81548152906001019060200180831161114857829003601f168201915b5050505050905090565b601060009054906101000a900460ff16156111bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b690613fb8565b60405180910390fd5b60006111c9610b2c565b90506000821161120e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120590614024565b60405180910390fd5b601e821115611252576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611249906140b6565b60405180910390fd5b600f54828261126191906140d6565b11156112a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129990614156565b60405180910390fd5b6112aa6110b3565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461132d5781600e546112ea9190614176565b34101561132c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132390614204565b60405180910390fd5b5b6000600190505b8281116113635761135033828461134b91906140d6565b611f5f565b808061135b90613b16565b915050611334565b505050565b61137a61137361198f565b8383611f7d565b5050565b61138f61138961198f565b83611ace565b6113ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c5906139c0565b60405180910390fd5b6113da848484846120e9565b50505050565b600d80546113ed906137f9565b80601f0160208091040260200160405190810160405280929190818152602001828054611419906137f9565b80156114665780601f1061143b57610100808354040283529160200191611466565b820191906000526020600020905b81548152906001019060200180831161144957829003601f168201915b505050505081565b606061147982612145565b6114b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114af90614296565b60405180910390fd5b601060019054906101000a900460ff1661155e57600c80546114d9906137f9565b80601f0160208091040260200160405190810160405280929190818152602001828054611505906137f9565b80156115525780601f1061152757610100808354040283529160200191611552565b820191906000526020600020905b81548152906001019060200180831161153557829003601f168201915b505050505090506115ba565b6000611568612186565b9050600081511161158857604051806020016040528060008152506115b6565b8061159284612218565b600d6040516020016115a693929190614375565b6040516020818303038152906040525b9150505b919050565b6115c7611a50565b805182511461160b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611602906143f2565b60405180910390fd5b60005b82518110156116ae57600083828151811061162c5761162b613ab8565b5b60200260200101519050600083838151811061164b5761164a613ab8565b5b6020026020010151905060005b8151811015611698576116858383838151811061167857611677613ab8565b5b6020026020010151611f5f565b808061169090613b16565b915050611658565b50505080806116a690613b16565b91505061160e565b505050565b600f5481565b6116c1611a50565b670de0b6b3a7640000816116d59190614176565b600e8190555050565b6116e6611a50565b80600d90816116f59190613d9c565b5050565b611701611a50565b80601060016101000a81548160ff02191690831515021790555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6117ba611a50565b80600e8190555050565b6117cc611a50565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361183b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183290614484565b60405180910390fd5b61184481611e99565b50565b61184f611a50565b80600c908161185e9190613d9c565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061192d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061193d575061193c826122e6565b5b9050919050565b61194d81612145565b61198c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198390613eba565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611a0a83610e46565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611a5861198f565b73ffffffffffffffffffffffffffffffffffffffff16611a766110b3565b73ffffffffffffffffffffffffffffffffffffffff1614611acc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac3906144f0565b60405180910390fd5b565b600080611ada83610e46565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611b1c5750611b1b818561171e565b5b80611b5a57508373ffffffffffffffffffffffffffffffffffffffff16611b42846109a4565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611b8382610e46565b73ffffffffffffffffffffffffffffffffffffffff1614611bd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd090614582565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611c48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3f90614614565b60405180910390fd5b611c558383836001612350565b8273ffffffffffffffffffffffffffffffffffffffff16611c7582610e46565b73ffffffffffffffffffffffffffffffffffffffff1614611ccb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc290614582565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611e5783838360016124ae565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611f798282604051806020016040528060008152506124b4565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611feb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe290614680565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516120dc9190612de9565b60405180910390a3505050565b6120f4848484611b63565b6121008484848461250f565b61213f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213690614712565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff1661216783611e5c565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600b8054612195906137f9565b80601f01602080910402602001604051908101604052809291908181526020018280546121c1906137f9565b801561220e5780601f106121e35761010080835404028352916020019161220e565b820191906000526020600020905b8154815290600101906020018083116121f157829003601f168201915b5050505050905090565b60606000600161222784612696565b01905060008167ffffffffffffffff811115612246576122456131ce565b5b6040519080825280601f01601f1916602001820160405280156122785781602001600182028036833780820191505090505b509050600082602001820190505b6001156122db578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816122cf576122ce614732565b5b04945060008503612286575b819350505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61235c848484846127e9565b60018111156123a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612397906147d3565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036123e7576123e2816127ef565b612426565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614612425576124248582612838565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361246857612463816129a5565b6124a7565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146124a6576124a58482612a76565b5b5b5050505050565b50505050565b6124be8383612af5565b6124cb600084848461250f565b61250a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250190614712565b60405180910390fd5b505050565b60006125308473ffffffffffffffffffffffffffffffffffffffff16612d12565b15612689578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261255961198f565b8786866040518563ffffffff1660e01b815260040161257b9493929190614848565b6020604051808303816000875af19250505080156125b757506040513d601f19601f820116820180604052508101906125b491906148a9565b60015b612639573d80600081146125e7576040519150601f19603f3d011682016040523d82523d6000602084013e6125ec565b606091505b506000815103612631576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262890614712565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061268e565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106126f4577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816126ea576126e9614732565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612731576d04ee2d6d415b85acef8100000000838161272757612726614732565b5b0492506020810190505b662386f26fc10000831061276057662386f26fc10000838161275657612755614732565b5b0492506010810190505b6305f5e1008310612789576305f5e100838161277f5761277e614732565b5b0492506008810190505b61271083106127ae5761271083816127a4576127a3614732565b5b0492506004810190505b606483106127d157606483816127c7576127c6614732565b5b0492506002810190505b600a83106127e0576001810190505b80915050919050565b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161284584610fe8565b61284f91906148d6565b9050600060076000848152602001908152602001600020549050818114612934576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506129b991906148d6565b90506000600960008481526020019081526020016000205490506000600883815481106129e9576129e8613ab8565b5b906000526020600020015490508060088381548110612a0b57612a0a613ab8565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612a5a57612a5961490a565b5b6001900381819060005260206000200160009055905550505050565b6000612a8183610fe8565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612b64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b5b90614985565b60405180910390fd5b612b6d81612145565b15612bad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ba4906149f1565b60405180910390fd5b612bbb600083836001612350565b612bc481612145565b15612c04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bfb906149f1565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612d0e6000838360016124ae565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612d7e81612d49565b8114612d8957600080fd5b50565b600081359050612d9b81612d75565b92915050565b600060208284031215612db757612db6612d3f565b5b6000612dc584828501612d8c565b91505092915050565b60008115159050919050565b612de381612dce565b82525050565b6000602082019050612dfe6000830184612dda565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612e3e578082015181840152602081019050612e23565b60008484015250505050565b6000601f19601f8301169050919050565b6000612e6682612e04565b612e708185612e0f565b9350612e80818560208601612e20565b612e8981612e4a565b840191505092915050565b60006020820190508181036000830152612eae8184612e5b565b905092915050565b6000819050919050565b612ec981612eb6565b8114612ed457600080fd5b50565b600081359050612ee681612ec0565b92915050565b600060208284031215612f0257612f01612d3f565b5b6000612f1084828501612ed7565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612f4482612f19565b9050919050565b612f5481612f39565b82525050565b6000602082019050612f6f6000830184612f4b565b92915050565b612f7e81612f39565b8114612f8957600080fd5b50565b600081359050612f9b81612f75565b92915050565b60008060408385031215612fb857612fb7612d3f565b5b6000612fc685828601612f8c565b9250506020612fd785828601612ed7565b9150509250929050565b612fea81612eb6565b82525050565b60006020820190506130056000830184612fe1565b92915050565b61301481612dce565b811461301f57600080fd5b50565b6000813590506130318161300b565b92915050565b60006020828403121561304d5761304c612d3f565b5b600061305b84828501613022565b91505092915050565b60008060006060848603121561307d5761307c612d3f565b5b600061308b86828701612f8c565b935050602061309c86828701612f8c565b92505060406130ad86828701612ed7565b9150509250925092565b6000602082840312156130cd576130cc612d3f565b5b60006130db84828501612f8c565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61311981612eb6565b82525050565b600061312b8383613110565b60208301905092915050565b6000602082019050919050565b600061314f826130e4565b61315981856130ef565b935061316483613100565b8060005b8381101561319557815161317c888261311f565b975061318783613137565b925050600181019050613168565b5085935050505092915050565b600060208201905081810360008301526131bc8184613144565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61320682612e4a565b810181811067ffffffffffffffff82111715613225576132246131ce565b5b80604052505050565b6000613238612d35565b905061324482826131fd565b919050565b600067ffffffffffffffff821115613264576132636131ce565b5b61326d82612e4a565b9050602081019050919050565b82818337600083830152505050565b600061329c61329784613249565b61322e565b9050828152602081018484840111156132b8576132b76131c9565b5b6132c384828561327a565b509392505050565b600082601f8301126132e0576132df6131c4565b5b81356132f0848260208601613289565b91505092915050565b60006020828403121561330f5761330e612d3f565b5b600082013567ffffffffffffffff81111561332d5761332c612d44565b5b613339848285016132cb565b91505092915050565b6000806040838503121561335957613358612d3f565b5b600061336785828601612f8c565b925050602061337885828601613022565b9150509250929050565b600067ffffffffffffffff82111561339d5761339c6131ce565b5b6133a682612e4a565b9050602081019050919050565b60006133c66133c184613382565b61322e565b9050828152602081018484840111156133e2576133e16131c9565b5b6133ed84828561327a565b509392505050565b600082601f83011261340a576134096131c4565b5b813561341a8482602086016133b3565b91505092915050565b6000806000806080858703121561343d5761343c612d3f565b5b600061344b87828801612f8c565b945050602061345c87828801612f8c565b935050604061346d87828801612ed7565b925050606085013567ffffffffffffffff81111561348e5761348d612d44565b5b61349a878288016133f5565b91505092959194509250565b600067ffffffffffffffff8211156134c1576134c06131ce565b5b602082029050602081019050919050565b600080fd5b60006134ea6134e5846134a6565b61322e565b9050808382526020820190506020840283018581111561350d5761350c6134d2565b5b835b8181101561353657806135228882612f8c565b84526020840193505060208101905061350f565b5050509392505050565b600082601f830112613555576135546131c4565b5b81356135658482602086016134d7565b91505092915050565b600067ffffffffffffffff821115613589576135886131ce565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156135b5576135b46131ce565b5b602082029050602081019050919050565b60006135d96135d48461359a565b61322e565b905080838252602082019050602084028301858111156135fc576135fb6134d2565b5b835b8181101561362557806136118882612ed7565b8452602084019350506020810190506135fe565b5050509392505050565b600082601f830112613644576136436131c4565b5b81356136548482602086016135c6565b91505092915050565b600061367061366b8461356e565b61322e565b90508083825260208201905060208402830185811115613693576136926134d2565b5b835b818110156136da57803567ffffffffffffffff8111156136b8576136b76131c4565b5b8086016136c5898261362f565b85526020850194505050602081019050613695565b5050509392505050565b600082601f8301126136f9576136f86131c4565b5b813561370984826020860161365d565b91505092915050565b6000806040838503121561372957613728612d3f565b5b600083013567ffffffffffffffff81111561374757613746612d44565b5b61375385828601613540565b925050602083013567ffffffffffffffff81111561377457613773612d44565b5b613780858286016136e4565b9150509250929050565b600080604083850312156137a1576137a0612d3f565b5b60006137af85828601612f8c565b92505060206137c085828601612f8c565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061381157607f821691505b602082108103613824576138236137ca565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613886602183612e0f565b91506138918261382a565b604082019050919050565b600060208201905081810360008301526138b581613879565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000613918603d83612e0f565b9150613923826138bc565b604082019050919050565b600060208201905081810360008301526139478161390b565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b60006139aa602d83612e0f565b91506139b58261394e565b604082019050919050565b600060208201905081810360008301526139d98161399d565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613a3c602b83612e0f565b9150613a47826139e0565b604082019050919050565b60006020820190508181036000830152613a6b81613a2f565b9050919050565b600081905092915050565b50565b6000613a8d600083613a72565b9150613a9882613a7d565b600082019050919050565b6000613aae82613a80565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613b2182612eb6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613b5357613b52613ae7565b5b600182019050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613bba602c83612e0f565b9150613bc582613b5e565b604082019050919050565b60006020820190508181036000830152613be981613bad565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613c527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613c15565b613c5c8683613c15565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613c99613c94613c8f84612eb6565b613c74565b612eb6565b9050919050565b6000819050919050565b613cb383613c7e565b613cc7613cbf82613ca0565b848454613c22565b825550505050565b600090565b613cdc613ccf565b613ce7818484613caa565b505050565b5b81811015613d0b57613d00600082613cd4565b600181019050613ced565b5050565b601f821115613d5057613d2181613bf0565b613d2a84613c05565b81016020851015613d39578190505b613d4d613d4585613c05565b830182613cec565b50505b505050565b600082821c905092915050565b6000613d7360001984600802613d55565b1980831691505092915050565b6000613d8c8383613d62565b9150826002028217905092915050565b613da582612e04565b67ffffffffffffffff811115613dbe57613dbd6131ce565b5b613dc882546137f9565b613dd3828285613d0f565b600060209050601f831160018114613e065760008415613df4578287015190505b613dfe8582613d80565b865550613e66565b601f198416613e1486613bf0565b60005b82811015613e3c57848901518255600182019150602085019450602081019050613e17565b86831015613e595784890151613e55601f891682613d62565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000613ea4601883612e0f565b9150613eaf82613e6e565b602082019050919050565b60006020820190508181036000830152613ed381613e97565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000613f36602983612e0f565b9150613f4182613eda565b604082019050919050565b60006020820190508181036000830152613f6581613f29565b9050919050565b7f74686520636f6e74726163742069732070617573656400000000000000000000600082015250565b6000613fa2601683612e0f565b9150613fad82613f6c565b602082019050919050565b60006020820190508181036000830152613fd181613f95565b9050919050565b7f6e65656420746f206d696e74206174206c656173742031204e46540000000000600082015250565b600061400e601b83612e0f565b915061401982613fd8565b602082019050919050565b6000602082019050818103600083015261403d81614001565b9050919050565b7f6d6178206d696e7420616d6f756e74207065722073657373696f6e206578636560008201527f6564656400000000000000000000000000000000000000000000000000000000602082015250565b60006140a0602483612e0f565b91506140ab82614044565b604082019050919050565b600060208201905081810360008301526140cf81614093565b9050919050565b60006140e182612eb6565b91506140ec83612eb6565b925082820190508082111561410457614103613ae7565b5b92915050565b7f6d6178204e4654206c696d697420657863656564656400000000000000000000600082015250565b6000614140601683612e0f565b915061414b8261410a565b602082019050919050565b6000602082019050818103600083015261416f81614133565b9050919050565b600061418182612eb6565b915061418c83612eb6565b925082820261419a81612eb6565b915082820484148315176141b1576141b0613ae7565b5b5092915050565b7f696e73756666696369656e742066756e64730000000000000000000000000000600082015250565b60006141ee601283612e0f565b91506141f9826141b8565b602082019050919050565b6000602082019050818103600083015261421d816141e1565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614280602f83612e0f565b915061428b82614224565b604082019050919050565b600060208201905081810360008301526142af81614273565b9050919050565b600081905092915050565b60006142cc82612e04565b6142d681856142b6565b93506142e6818560208601612e20565b80840191505092915050565b600081546142ff816137f9565b61430981866142b6565b9450600182166000811461432457600181146143395761436c565b60ff198316865281151582028601935061436c565b61434285613bf0565b60005b8381101561436457815481890152600182019150602081019050614345565b838801955050505b50505092915050565b600061438182866142c1565b915061438d82856142c1565b915061439982846142f2565b9150819050949350505050565b7f696e76616c696420626174636820646174610000000000000000000000000000600082015250565b60006143dc601283612e0f565b91506143e7826143a6565b602082019050919050565b6000602082019050818103600083015261440b816143cf565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061446e602683612e0f565b915061447982614412565b604082019050919050565b6000602082019050818103600083015261449d81614461565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006144da602083612e0f565b91506144e5826144a4565b602082019050919050565b60006020820190508181036000830152614509816144cd565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061456c602583612e0f565b915061457782614510565b604082019050919050565b6000602082019050818103600083015261459b8161455f565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006145fe602483612e0f565b9150614609826145a2565b604082019050919050565b6000602082019050818103600083015261462d816145f1565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061466a601983612e0f565b915061467582614634565b602082019050919050565b600060208201905081810360008301526146998161465d565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006146fc603283612e0f565b9150614707826146a0565b604082019050919050565b6000602082019050818103600083015261472b816146ef565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b60006147bd603583612e0f565b91506147c882614761565b604082019050919050565b600060208201905081810360008301526147ec816147b0565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061481a826147f3565b61482481856147fe565b9350614834818560208601612e20565b61483d81612e4a565b840191505092915050565b600060808201905061485d6000830187612f4b565b61486a6020830186612f4b565b6148776040830185612fe1565b8181036060830152614889818461480f565b905095945050505050565b6000815190506148a381612d75565b92915050565b6000602082840312156148bf576148be612d3f565b5b60006148cd84828501614894565b91505092915050565b60006148e182612eb6565b91506148ec83612eb6565b925082820390508181111561490457614903613ae7565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061496f602083612e0f565b915061497a82614939565b602082019050919050565b6000602082019050818103600083015261499e81614962565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006149db601c83612e0f565b91506149e6826149a5565b602082019050919050565b60006020820190508181036000830152614a0a816149ce565b905091905056fea2646970667358221220677f85b05f501b27bf64e64e9d185dbfd934a156544e96e6560bfc587ac269c964736f6c63430008120033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000094c6974746c6542616f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044c42414f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d61425853736f7255656279376d4a637750755a444b6f72624e4a334c5675594d774c5a344165586d313654630000000000000000000000

Deployed Bytecode

0x60806040526004361061021a5760003560e01c80637035bf1811610123578063c87b56dd116100ab578063e0a808531161006f578063e0a80853146107b7578063e985e9c5146107e0578063e9e18a781461081d578063f2fde38b14610846578063fe2c7fee1461086f5761021a565b8063c87b56dd146106d4578063ce48e68114610711578063d5abeb011461073a578063d6fd92d214610765578063da3ef23f1461078e5761021a565b806395d89b41116100f257806395d89b4114610610578063a0712d681461063b578063a22cb46514610657578063b88d4fde14610680578063c6682862146106a95761021a565b80637035bf181461056657806370a0823114610591578063715018a6146105ce5780638da5cb5b146105e55761021a565b80633ccfd60b116101a65780635183022711610175578063518302271461047f57806355f804b3146104aa5780635c975abb146104d35780636352211e146104fe5780636c0360eb1461053b5761021a565b80633ccfd60b146103d257806342842e0e146103dc578063438b6300146104055780634f6ccce7146104425761021a565b806313faede6116101ed57806313faede6146102ed57806316c38b3c1461031857806318160ddd1461034157806323b872dd1461036c5780632f745c59146103955761021a565b806301ffc9a71461021f57806306fdde031461025c578063081812fc14610287578063095ea7b3146102c4575b600080fd5b34801561022b57600080fd5b5061024660048036038101906102419190612da1565b610898565b6040516102539190612de9565b60405180910390f35b34801561026857600080fd5b50610271610912565b60405161027e9190612e94565b60405180910390f35b34801561029357600080fd5b506102ae60048036038101906102a99190612eec565b6109a4565b6040516102bb9190612f5a565b60405180910390f35b3480156102d057600080fd5b506102eb60048036038101906102e69190612fa1565b6109ea565b005b3480156102f957600080fd5b50610302610b01565b60405161030f9190612ff0565b60405180910390f35b34801561032457600080fd5b5061033f600480360381019061033a9190613037565b610b07565b005b34801561034d57600080fd5b50610356610b2c565b6040516103639190612ff0565b60405180910390f35b34801561037857600080fd5b50610393600480360381019061038e9190613064565b610b39565b005b3480156103a157600080fd5b506103bc60048036038101906103b79190612fa1565b610b99565b6040516103c99190612ff0565b60405180910390f35b6103da610c3e565b005b3480156103e857600080fd5b5061040360048036038101906103fe9190613064565b610cc6565b005b34801561041157600080fd5b5061042c600480360381019061042791906130b7565b610ce6565b60405161043991906131a2565b60405180910390f35b34801561044e57600080fd5b5061046960048036038101906104649190612eec565b610d94565b6040516104769190612ff0565b60405180910390f35b34801561048b57600080fd5b50610494610e05565b6040516104a19190612de9565b60405180910390f35b3480156104b657600080fd5b506104d160048036038101906104cc91906132f9565b610e18565b005b3480156104df57600080fd5b506104e8610e33565b6040516104f59190612de9565b60405180910390f35b34801561050a57600080fd5b5061052560048036038101906105209190612eec565b610e46565b6040516105329190612f5a565b60405180910390f35b34801561054757600080fd5b50610550610ecc565b60405161055d9190612e94565b60405180910390f35b34801561057257600080fd5b5061057b610f5a565b6040516105889190612e94565b60405180910390f35b34801561059d57600080fd5b506105b860048036038101906105b391906130b7565b610fe8565b6040516105c59190612ff0565b60405180910390f35b3480156105da57600080fd5b506105e361109f565b005b3480156105f157600080fd5b506105fa6110b3565b6040516106079190612f5a565b60405180910390f35b34801561061c57600080fd5b506106256110dd565b6040516106329190612e94565b60405180910390f35b61065560048036038101906106509190612eec565b61116f565b005b34801561066357600080fd5b5061067e60048036038101906106799190613342565b611368565b005b34801561068c57600080fd5b506106a760048036038101906106a29190613423565b61137e565b005b3480156106b557600080fd5b506106be6113e0565b6040516106cb9190612e94565b60405180910390f35b3480156106e057600080fd5b506106fb60048036038101906106f69190612eec565b61146e565b6040516107089190612e94565b60405180910390f35b34801561071d57600080fd5b5061073860048036038101906107339190613712565b6115bf565b005b34801561074657600080fd5b5061074f6116b3565b60405161075c9190612ff0565b60405180910390f35b34801561077157600080fd5b5061078c60048036038101906107879190612eec565b6116b9565b005b34801561079a57600080fd5b506107b560048036038101906107b091906132f9565b6116de565b005b3480156107c357600080fd5b506107de60048036038101906107d99190613037565b6116f9565b005b3480156107ec57600080fd5b506108076004803603810190610802919061378a565b61171e565b6040516108149190612de9565b60405180910390f35b34801561082957600080fd5b50610844600480360381019061083f9190612eec565b6117b2565b005b34801561085257600080fd5b5061086d600480360381019061086891906130b7565b6117c4565b005b34801561087b57600080fd5b50610896600480360381019061089191906132f9565b611847565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061090b575061090a82611862565b5b9050919050565b606060008054610921906137f9565b80601f016020809104026020016040519081016040528092919081815260200182805461094d906137f9565b801561099a5780601f1061096f5761010080835404028352916020019161099a565b820191906000526020600020905b81548152906001019060200180831161097d57829003601f168201915b5050505050905090565b60006109af82611944565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109f582610e46565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5c9061389c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a8461198f565b73ffffffffffffffffffffffffffffffffffffffff161480610ab35750610ab281610aad61198f565b61171e565b5b610af2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae99061392e565b60405180910390fd5b610afc8383611997565b505050565b600e5481565b610b0f611a50565b80601060006101000a81548160ff02191690831515021790555050565b6000600880549050905090565b610b4a610b4461198f565b82611ace565b610b89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b80906139c0565b60405180910390fd5b610b94838383611b63565b505050565b6000610ba483610fe8565b8210610be5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bdc90613a52565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610c46611a50565b6000610c506110b3565b73ffffffffffffffffffffffffffffffffffffffff1647604051610c7390613aa3565b60006040518083038185875af1925050503d8060008114610cb0576040519150601f19603f3d011682016040523d82523d6000602084013e610cb5565b606091505b5050905080610cc357600080fd5b50565b610ce18383836040518060200160405280600081525061137e565b505050565b60606000610cf383610fe8565b905060008167ffffffffffffffff811115610d1157610d106131ce565b5b604051908082528060200260200182016040528015610d3f5781602001602082028036833780820191505090505b50905060005b82811015610d8957610d578582610b99565b828281518110610d6a57610d69613ab8565b5b6020026020010181815250508080610d8190613b16565b915050610d45565b508092505050919050565b6000610d9e610b2c565b8210610ddf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd690613bd0565b60405180910390fd5b60088281548110610df357610df2613ab8565b5b90600052602060002001549050919050565b601060019054906101000a900460ff1681565b610e20611a50565b80600b9081610e2f9190613d9c565b5050565b601060009054906101000a900460ff1681565b600080610e5283611e5c565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610ec3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eba90613eba565b60405180910390fd5b80915050919050565b600b8054610ed9906137f9565b80601f0160208091040260200160405190810160405280929190818152602001828054610f05906137f9565b8015610f525780601f10610f2757610100808354040283529160200191610f52565b820191906000526020600020905b815481529060010190602001808311610f3557829003601f168201915b505050505081565b600c8054610f67906137f9565b80601f0160208091040260200160405190810160405280929190818152602001828054610f93906137f9565b8015610fe05780601f10610fb557610100808354040283529160200191610fe0565b820191906000526020600020905b815481529060010190602001808311610fc357829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611058576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104f90613f4c565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6110a7611a50565b6110b16000611e99565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546110ec906137f9565b80601f0160208091040260200160405190810160405280929190818152602001828054611118906137f9565b80156111655780601f1061113a57610100808354040283529160200191611165565b820191906000526020600020905b81548152906001019060200180831161114857829003601f168201915b5050505050905090565b601060009054906101000a900460ff16156111bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b690613fb8565b60405180910390fd5b60006111c9610b2c565b90506000821161120e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120590614024565b60405180910390fd5b601e821115611252576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611249906140b6565b60405180910390fd5b600f54828261126191906140d6565b11156112a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129990614156565b60405180910390fd5b6112aa6110b3565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461132d5781600e546112ea9190614176565b34101561132c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132390614204565b60405180910390fd5b5b6000600190505b8281116113635761135033828461134b91906140d6565b611f5f565b808061135b90613b16565b915050611334565b505050565b61137a61137361198f565b8383611f7d565b5050565b61138f61138961198f565b83611ace565b6113ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c5906139c0565b60405180910390fd5b6113da848484846120e9565b50505050565b600d80546113ed906137f9565b80601f0160208091040260200160405190810160405280929190818152602001828054611419906137f9565b80156114665780601f1061143b57610100808354040283529160200191611466565b820191906000526020600020905b81548152906001019060200180831161144957829003601f168201915b505050505081565b606061147982612145565b6114b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114af90614296565b60405180910390fd5b601060019054906101000a900460ff1661155e57600c80546114d9906137f9565b80601f0160208091040260200160405190810160405280929190818152602001828054611505906137f9565b80156115525780601f1061152757610100808354040283529160200191611552565b820191906000526020600020905b81548152906001019060200180831161153557829003601f168201915b505050505090506115ba565b6000611568612186565b9050600081511161158857604051806020016040528060008152506115b6565b8061159284612218565b600d6040516020016115a693929190614375565b6040516020818303038152906040525b9150505b919050565b6115c7611a50565b805182511461160b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611602906143f2565b60405180910390fd5b60005b82518110156116ae57600083828151811061162c5761162b613ab8565b5b60200260200101519050600083838151811061164b5761164a613ab8565b5b6020026020010151905060005b8151811015611698576116858383838151811061167857611677613ab8565b5b6020026020010151611f5f565b808061169090613b16565b915050611658565b50505080806116a690613b16565b91505061160e565b505050565b600f5481565b6116c1611a50565b670de0b6b3a7640000816116d59190614176565b600e8190555050565b6116e6611a50565b80600d90816116f59190613d9c565b5050565b611701611a50565b80601060016101000a81548160ff02191690831515021790555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6117ba611a50565b80600e8190555050565b6117cc611a50565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361183b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183290614484565b60405180910390fd5b61184481611e99565b50565b61184f611a50565b80600c908161185e9190613d9c565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061192d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061193d575061193c826122e6565b5b9050919050565b61194d81612145565b61198c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198390613eba565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611a0a83610e46565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611a5861198f565b73ffffffffffffffffffffffffffffffffffffffff16611a766110b3565b73ffffffffffffffffffffffffffffffffffffffff1614611acc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac3906144f0565b60405180910390fd5b565b600080611ada83610e46565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611b1c5750611b1b818561171e565b5b80611b5a57508373ffffffffffffffffffffffffffffffffffffffff16611b42846109a4565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611b8382610e46565b73ffffffffffffffffffffffffffffffffffffffff1614611bd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd090614582565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611c48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3f90614614565b60405180910390fd5b611c558383836001612350565b8273ffffffffffffffffffffffffffffffffffffffff16611c7582610e46565b73ffffffffffffffffffffffffffffffffffffffff1614611ccb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc290614582565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611e5783838360016124ae565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611f798282604051806020016040528060008152506124b4565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611feb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe290614680565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516120dc9190612de9565b60405180910390a3505050565b6120f4848484611b63565b6121008484848461250f565b61213f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213690614712565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff1661216783611e5c565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600b8054612195906137f9565b80601f01602080910402602001604051908101604052809291908181526020018280546121c1906137f9565b801561220e5780601f106121e35761010080835404028352916020019161220e565b820191906000526020600020905b8154815290600101906020018083116121f157829003601f168201915b5050505050905090565b60606000600161222784612696565b01905060008167ffffffffffffffff811115612246576122456131ce565b5b6040519080825280601f01601f1916602001820160405280156122785781602001600182028036833780820191505090505b509050600082602001820190505b6001156122db578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816122cf576122ce614732565b5b04945060008503612286575b819350505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61235c848484846127e9565b60018111156123a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612397906147d3565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036123e7576123e2816127ef565b612426565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614612425576124248582612838565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361246857612463816129a5565b6124a7565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146124a6576124a58482612a76565b5b5b5050505050565b50505050565b6124be8383612af5565b6124cb600084848461250f565b61250a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250190614712565b60405180910390fd5b505050565b60006125308473ffffffffffffffffffffffffffffffffffffffff16612d12565b15612689578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261255961198f565b8786866040518563ffffffff1660e01b815260040161257b9493929190614848565b6020604051808303816000875af19250505080156125b757506040513d601f19601f820116820180604052508101906125b491906148a9565b60015b612639573d80600081146125e7576040519150601f19603f3d011682016040523d82523d6000602084013e6125ec565b606091505b506000815103612631576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262890614712565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061268e565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106126f4577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816126ea576126e9614732565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612731576d04ee2d6d415b85acef8100000000838161272757612726614732565b5b0492506020810190505b662386f26fc10000831061276057662386f26fc10000838161275657612755614732565b5b0492506010810190505b6305f5e1008310612789576305f5e100838161277f5761277e614732565b5b0492506008810190505b61271083106127ae5761271083816127a4576127a3614732565b5b0492506004810190505b606483106127d157606483816127c7576127c6614732565b5b0492506002810190505b600a83106127e0576001810190505b80915050919050565b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161284584610fe8565b61284f91906148d6565b9050600060076000848152602001908152602001600020549050818114612934576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506129b991906148d6565b90506000600960008481526020019081526020016000205490506000600883815481106129e9576129e8613ab8565b5b906000526020600020015490508060088381548110612a0b57612a0a613ab8565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612a5a57612a5961490a565b5b6001900381819060005260206000200160009055905550505050565b6000612a8183610fe8565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612b64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b5b90614985565b60405180910390fd5b612b6d81612145565b15612bad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ba4906149f1565b60405180910390fd5b612bbb600083836001612350565b612bc481612145565b15612c04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bfb906149f1565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612d0e6000838360016124ae565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612d7e81612d49565b8114612d8957600080fd5b50565b600081359050612d9b81612d75565b92915050565b600060208284031215612db757612db6612d3f565b5b6000612dc584828501612d8c565b91505092915050565b60008115159050919050565b612de381612dce565b82525050565b6000602082019050612dfe6000830184612dda565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612e3e578082015181840152602081019050612e23565b60008484015250505050565b6000601f19601f8301169050919050565b6000612e6682612e04565b612e708185612e0f565b9350612e80818560208601612e20565b612e8981612e4a565b840191505092915050565b60006020820190508181036000830152612eae8184612e5b565b905092915050565b6000819050919050565b612ec981612eb6565b8114612ed457600080fd5b50565b600081359050612ee681612ec0565b92915050565b600060208284031215612f0257612f01612d3f565b5b6000612f1084828501612ed7565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612f4482612f19565b9050919050565b612f5481612f39565b82525050565b6000602082019050612f6f6000830184612f4b565b92915050565b612f7e81612f39565b8114612f8957600080fd5b50565b600081359050612f9b81612f75565b92915050565b60008060408385031215612fb857612fb7612d3f565b5b6000612fc685828601612f8c565b9250506020612fd785828601612ed7565b9150509250929050565b612fea81612eb6565b82525050565b60006020820190506130056000830184612fe1565b92915050565b61301481612dce565b811461301f57600080fd5b50565b6000813590506130318161300b565b92915050565b60006020828403121561304d5761304c612d3f565b5b600061305b84828501613022565b91505092915050565b60008060006060848603121561307d5761307c612d3f565b5b600061308b86828701612f8c565b935050602061309c86828701612f8c565b92505060406130ad86828701612ed7565b9150509250925092565b6000602082840312156130cd576130cc612d3f565b5b60006130db84828501612f8c565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61311981612eb6565b82525050565b600061312b8383613110565b60208301905092915050565b6000602082019050919050565b600061314f826130e4565b61315981856130ef565b935061316483613100565b8060005b8381101561319557815161317c888261311f565b975061318783613137565b925050600181019050613168565b5085935050505092915050565b600060208201905081810360008301526131bc8184613144565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61320682612e4a565b810181811067ffffffffffffffff82111715613225576132246131ce565b5b80604052505050565b6000613238612d35565b905061324482826131fd565b919050565b600067ffffffffffffffff821115613264576132636131ce565b5b61326d82612e4a565b9050602081019050919050565b82818337600083830152505050565b600061329c61329784613249565b61322e565b9050828152602081018484840111156132b8576132b76131c9565b5b6132c384828561327a565b509392505050565b600082601f8301126132e0576132df6131c4565b5b81356132f0848260208601613289565b91505092915050565b60006020828403121561330f5761330e612d3f565b5b600082013567ffffffffffffffff81111561332d5761332c612d44565b5b613339848285016132cb565b91505092915050565b6000806040838503121561335957613358612d3f565b5b600061336785828601612f8c565b925050602061337885828601613022565b9150509250929050565b600067ffffffffffffffff82111561339d5761339c6131ce565b5b6133a682612e4a565b9050602081019050919050565b60006133c66133c184613382565b61322e565b9050828152602081018484840111156133e2576133e16131c9565b5b6133ed84828561327a565b509392505050565b600082601f83011261340a576134096131c4565b5b813561341a8482602086016133b3565b91505092915050565b6000806000806080858703121561343d5761343c612d3f565b5b600061344b87828801612f8c565b945050602061345c87828801612f8c565b935050604061346d87828801612ed7565b925050606085013567ffffffffffffffff81111561348e5761348d612d44565b5b61349a878288016133f5565b91505092959194509250565b600067ffffffffffffffff8211156134c1576134c06131ce565b5b602082029050602081019050919050565b600080fd5b60006134ea6134e5846134a6565b61322e565b9050808382526020820190506020840283018581111561350d5761350c6134d2565b5b835b8181101561353657806135228882612f8c565b84526020840193505060208101905061350f565b5050509392505050565b600082601f830112613555576135546131c4565b5b81356135658482602086016134d7565b91505092915050565b600067ffffffffffffffff821115613589576135886131ce565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156135b5576135b46131ce565b5b602082029050602081019050919050565b60006135d96135d48461359a565b61322e565b905080838252602082019050602084028301858111156135fc576135fb6134d2565b5b835b8181101561362557806136118882612ed7565b8452602084019350506020810190506135fe565b5050509392505050565b600082601f830112613644576136436131c4565b5b81356136548482602086016135c6565b91505092915050565b600061367061366b8461356e565b61322e565b90508083825260208201905060208402830185811115613693576136926134d2565b5b835b818110156136da57803567ffffffffffffffff8111156136b8576136b76131c4565b5b8086016136c5898261362f565b85526020850194505050602081019050613695565b5050509392505050565b600082601f8301126136f9576136f86131c4565b5b813561370984826020860161365d565b91505092915050565b6000806040838503121561372957613728612d3f565b5b600083013567ffffffffffffffff81111561374757613746612d44565b5b61375385828601613540565b925050602083013567ffffffffffffffff81111561377457613773612d44565b5b613780858286016136e4565b9150509250929050565b600080604083850312156137a1576137a0612d3f565b5b60006137af85828601612f8c565b92505060206137c085828601612f8c565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061381157607f821691505b602082108103613824576138236137ca565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613886602183612e0f565b91506138918261382a565b604082019050919050565b600060208201905081810360008301526138b581613879565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000613918603d83612e0f565b9150613923826138bc565b604082019050919050565b600060208201905081810360008301526139478161390b565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b60006139aa602d83612e0f565b91506139b58261394e565b604082019050919050565b600060208201905081810360008301526139d98161399d565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613a3c602b83612e0f565b9150613a47826139e0565b604082019050919050565b60006020820190508181036000830152613a6b81613a2f565b9050919050565b600081905092915050565b50565b6000613a8d600083613a72565b9150613a9882613a7d565b600082019050919050565b6000613aae82613a80565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613b2182612eb6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613b5357613b52613ae7565b5b600182019050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613bba602c83612e0f565b9150613bc582613b5e565b604082019050919050565b60006020820190508181036000830152613be981613bad565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613c527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613c15565b613c5c8683613c15565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613c99613c94613c8f84612eb6565b613c74565b612eb6565b9050919050565b6000819050919050565b613cb383613c7e565b613cc7613cbf82613ca0565b848454613c22565b825550505050565b600090565b613cdc613ccf565b613ce7818484613caa565b505050565b5b81811015613d0b57613d00600082613cd4565b600181019050613ced565b5050565b601f821115613d5057613d2181613bf0565b613d2a84613c05565b81016020851015613d39578190505b613d4d613d4585613c05565b830182613cec565b50505b505050565b600082821c905092915050565b6000613d7360001984600802613d55565b1980831691505092915050565b6000613d8c8383613d62565b9150826002028217905092915050565b613da582612e04565b67ffffffffffffffff811115613dbe57613dbd6131ce565b5b613dc882546137f9565b613dd3828285613d0f565b600060209050601f831160018114613e065760008415613df4578287015190505b613dfe8582613d80565b865550613e66565b601f198416613e1486613bf0565b60005b82811015613e3c57848901518255600182019150602085019450602081019050613e17565b86831015613e595784890151613e55601f891682613d62565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000613ea4601883612e0f565b9150613eaf82613e6e565b602082019050919050565b60006020820190508181036000830152613ed381613e97565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000613f36602983612e0f565b9150613f4182613eda565b604082019050919050565b60006020820190508181036000830152613f6581613f29565b9050919050565b7f74686520636f6e74726163742069732070617573656400000000000000000000600082015250565b6000613fa2601683612e0f565b9150613fad82613f6c565b602082019050919050565b60006020820190508181036000830152613fd181613f95565b9050919050565b7f6e65656420746f206d696e74206174206c656173742031204e46540000000000600082015250565b600061400e601b83612e0f565b915061401982613fd8565b602082019050919050565b6000602082019050818103600083015261403d81614001565b9050919050565b7f6d6178206d696e7420616d6f756e74207065722073657373696f6e206578636560008201527f6564656400000000000000000000000000000000000000000000000000000000602082015250565b60006140a0602483612e0f565b91506140ab82614044565b604082019050919050565b600060208201905081810360008301526140cf81614093565b9050919050565b60006140e182612eb6565b91506140ec83612eb6565b925082820190508082111561410457614103613ae7565b5b92915050565b7f6d6178204e4654206c696d697420657863656564656400000000000000000000600082015250565b6000614140601683612e0f565b915061414b8261410a565b602082019050919050565b6000602082019050818103600083015261416f81614133565b9050919050565b600061418182612eb6565b915061418c83612eb6565b925082820261419a81612eb6565b915082820484148315176141b1576141b0613ae7565b5b5092915050565b7f696e73756666696369656e742066756e64730000000000000000000000000000600082015250565b60006141ee601283612e0f565b91506141f9826141b8565b602082019050919050565b6000602082019050818103600083015261421d816141e1565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614280602f83612e0f565b915061428b82614224565b604082019050919050565b600060208201905081810360008301526142af81614273565b9050919050565b600081905092915050565b60006142cc82612e04565b6142d681856142b6565b93506142e6818560208601612e20565b80840191505092915050565b600081546142ff816137f9565b61430981866142b6565b9450600182166000811461432457600181146143395761436c565b60ff198316865281151582028601935061436c565b61434285613bf0565b60005b8381101561436457815481890152600182019150602081019050614345565b838801955050505b50505092915050565b600061438182866142c1565b915061438d82856142c1565b915061439982846142f2565b9150819050949350505050565b7f696e76616c696420626174636820646174610000000000000000000000000000600082015250565b60006143dc601283612e0f565b91506143e7826143a6565b602082019050919050565b6000602082019050818103600083015261440b816143cf565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061446e602683612e0f565b915061447982614412565b604082019050919050565b6000602082019050818103600083015261449d81614461565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006144da602083612e0f565b91506144e5826144a4565b602082019050919050565b60006020820190508181036000830152614509816144cd565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061456c602583612e0f565b915061457782614510565b604082019050919050565b6000602082019050818103600083015261459b8161455f565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006145fe602483612e0f565b9150614609826145a2565b604082019050919050565b6000602082019050818103600083015261462d816145f1565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061466a601983612e0f565b915061467582614634565b602082019050919050565b600060208201905081810360008301526146998161465d565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006146fc603283612e0f565b9150614707826146a0565b604082019050919050565b6000602082019050818103600083015261472b816146ef565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b60006147bd603583612e0f565b91506147c882614761565b604082019050919050565b600060208201905081810360008301526147ec816147b0565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061481a826147f3565b61482481856147fe565b9350614834818560208601612e20565b61483d81612e4a565b840191505092915050565b600060808201905061485d6000830187612f4b565b61486a6020830186612f4b565b6148776040830185612fe1565b8181036060830152614889818461480f565b905095945050505050565b6000815190506148a381612d75565b92915050565b6000602082840312156148bf576148be612d3f565b5b60006148cd84828501614894565b91505092915050565b60006148e182612eb6565b91506148ec83612eb6565b925082820390508181111561490457614903613ae7565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061496f602083612e0f565b915061497a82614939565b602082019050919050565b6000602082019050818103600083015261499e81614962565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006149db601c83612e0f565b91506149e6826149a5565b602082019050919050565b60006020820190508181036000830152614a0a816149ce565b905091905056fea2646970667358221220677f85b05f501b27bf64e64e9d185dbfd934a156544e96e6560bfc587ac269c964736f6c63430008120033

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

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000094c6974746c6542616f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044c42414f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d61425853736f7255656279376d4a637750755a444b6f72624e4a334c5675594d774c5a344165586d313654630000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): LittleBao
Arg [1] : _symbol (string): LBAO
Arg [2] : _initBaseURI (string):
Arg [3] : _initNotRevealedUri (string): ipfs://QmaBXSsorUeby7mJcwPuZDKorbNJ3LVuYMwLZ4AeXm16Tc

-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [5] : 4c6974746c6542616f0000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [7] : 4c42414f00000000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000035
Arg [10] : 697066733a2f2f516d61425853736f7255656279376d4a637750755a444b6f72
Arg [11] : 624e4a334c5675594d774c5a344165586d313654630000000000000000000000


Deployed Bytecode Sourcemap

62932:3973:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56923:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40624:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42136:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41654:416;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63127:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66186:77;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57563:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42836:335;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57231:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66357:543;;;:::i;:::-;;43242:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64225:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57753:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63229:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65828:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63199:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40334:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63020:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63046:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40065:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17999:103;;;;;;;;;;;;;:::i;:::-;;17351:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40793:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63650:569;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42379:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43498:322;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63083:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64570:508;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65100:458;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63161:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65690:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66056:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66269:81;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42605:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65564:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18257:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65932:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56923:224;57025:4;57064:35;57049:50;;;:11;:50;;;;:90;;;;57103:36;57127:11;57103:23;:36::i;:::-;57049:90;57042:97;;56923:224;;;:::o;40624:100::-;40678:13;40711:5;40704:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40624:100;:::o;42136:171::-;42212:7;42232:23;42247:7;42232:14;:23::i;:::-;42275:15;:24;42291:7;42275:24;;;;;;;;;;;;;;;;;;;;;42268:31;;42136:171;;;:::o;41654:416::-;41735:13;41751:23;41766:7;41751:14;:23::i;:::-;41735:39;;41799:5;41793:11;;:2;:11;;;41785:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;41893:5;41877:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;41902:37;41919:5;41926:12;:10;:12::i;:::-;41902:16;:37::i;:::-;41877:62;41855:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;42041:21;42050:2;42054:7;42041:8;:21::i;:::-;41724:346;41654:416;;:::o;63127:29::-;;;;:::o;66186:77::-;17237:13;:11;:13::i;:::-;66251:6:::1;66242;;:15;;;;;;;;;;;;;;;;;;66186:77:::0;:::o;57563:113::-;57624:7;57651:10;:17;;;;57644:24;;57563:113;:::o;42836:335::-;43031:41;43050:12;:10;:12::i;:::-;43064:7;43031:18;:41::i;:::-;43023:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;43135:28;43145:4;43151:2;43155:7;43135:9;:28::i;:::-;42836:335;;;:::o;57231:256::-;57328:7;57364:23;57381:5;57364:16;:23::i;:::-;57356:5;:31;57348:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;57453:12;:19;57466:5;57453:19;;;;;;;;;;;;;;;:26;57473:5;57453:26;;;;;;;;;;;;57446:33;;57231:256;;;;:::o;66357:543::-;17237:13;:11;:13::i;:::-;66722:7:::1;66743;:5;:7::i;:::-;66735:21;;66764;66735:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66721:69;;;66805:2;66797:11;;;::::0;::::1;;66402:498;66357:543::o:0;43242:185::-;43380:39;43397:4;43403:2;43407:7;43380:39;;;;;;;;;;;;:16;:39::i;:::-;43242:185;;;:::o;64225:339::-;64287:16;64315:23;64341:17;64351:6;64341:9;:17::i;:::-;64315:43;;64365:25;64407:15;64393:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64365:58;;64437:9;64432:103;64452:15;64448:1;:19;64432:103;;;64497:30;64517:6;64525:1;64497:19;:30::i;:::-;64483:8;64492:1;64483:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;64469:3;;;;;:::i;:::-;;;;64432:103;;;;64550:8;64543:15;;;;64225:339;;;:::o;57753:233::-;57828:7;57864:30;:28;:30::i;:::-;57856:5;:38;57848:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;57961:10;57972:5;57961:17;;;;;;;;:::i;:::-;;;;;;;;;;57954:24;;57753:233;;;:::o;63229:28::-;;;;;;;;;;;;;:::o;65828:98::-;17237:13;:11;:13::i;:::-;65909:11:::1;65899:7;:21;;;;;;:::i;:::-;;65828:98:::0;:::o;63199:25::-;;;;;;;;;;;;;:::o;40334:223::-;40406:7;40426:13;40442:17;40451:7;40442:8;:17::i;:::-;40426:33;;40495:1;40478:19;;:5;:19;;;40470:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;40544:5;40537:12;;;40334:223;;;:::o;63020:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;63046:32::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;40065:207::-;40137:7;40182:1;40165:19;;:5;:19;;;40157:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;40248:9;:16;40258:5;40248:16;;;;;;;;;;;;;;;;40241:23;;40065:207;;;:::o;17999:103::-;17237:13;:11;:13::i;:::-;18064:30:::1;18091:1;18064:18;:30::i;:::-;17999:103::o:0;17351:87::-;17397:7;17424:6;;;;;;;;;;;17417:13;;17351:87;:::o;40793:104::-;40849:13;40882:7;40875:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40793:104;:::o;63650:569::-;63716:6;;;;;;;;;;;63715:7;63707:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;63756:14;63773:13;:11;:13::i;:::-;63756:30;;63815:1;63801:11;:15;63793:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;63878:2;63863:11;:17;;63855:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;63960:9;;63945:11;63936:6;:20;;;;:::i;:::-;:33;;63928:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64023:7;:5;:7::i;:::-;64009:21;;:10;:21;;;64005:108;;64071:11;64064:4;;:18;;;;:::i;:::-;64051:9;:31;;64043:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;64005:108;64126:9;64138:1;64126:13;;64121:93;64146:11;64141:1;:16;64121:93;;64173:33;64183:10;64204:1;64195:6;:10;;;;:::i;:::-;64173:9;:33::i;:::-;64159:3;;;;;:::i;:::-;;;;64121:93;;;;63700:519;63650:569;:::o;42379:155::-;42474:52;42493:12;:10;:12::i;:::-;42507:8;42517;42474:18;:52::i;:::-;42379:155;;:::o;43498:322::-;43672:41;43691:12;:10;:12::i;:::-;43705:7;43672:18;:41::i;:::-;43664:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;43774:38;43788:4;43794:2;43798:7;43807:4;43774:13;:38::i;:::-;43498:322;;;;:::o;63083:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;64570:508::-;64643:13;64684:16;64692:7;64684;:16::i;:::-;64668:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;64807:8;;;;;;;;;;;64802:35;;64824:13;64817:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64802:35;64884:28;64915:10;:8;:10::i;:::-;64884:41;;64970:1;64945:14;64939:28;:32;:133;;;;;;;;;;;;;;;;;65007:14;65023:18;:7;:16;:18::i;:::-;65043:13;64990:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;64939:133;64932:140;;;64570:508;;;;:::o;65100:458::-;17237:13;:11;:13::i;:::-;65240::::1;:20;65219:10;:17;:41;65210:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;65301:6;65296:257;65317:10;:17;65313:1;:21;65296:257;;;65350:16;65369:10;65380:1;65369:13;;;;;;;;:::i;:::-;;;;;;;;65350:32;;65391:26;65420:13;65434:1;65420:16;;;;;;;;:::i;:::-;;;;;;;;65391:45;;65450:9;65445:101;65469:9;:16;65465:1;:20;65445:101;;;65503:33;65513:8;65523:9;65533:1;65523:12;;;;;;;;:::i;:::-;;;;;;;;65503:9;:33::i;:::-;65487:3;;;;;:::i;:::-;;;;65445:101;;;;65341:212;;65336:3;;;;;:::i;:::-;;;;65296:257;;;;65100:458:::0;;:::o;63161:31::-;;;;:::o;65690:132::-;17237:13;:11;:13::i;:::-;65787:8:::1;65768:15;:28;;;;:::i;:::-;65761:4;:35;;;;65690:132:::0;:::o;66056:122::-;17237:13;:11;:13::i;:::-;66155:17:::1;66139:13;:33;;;;;;:::i;:::-;;66056:122:::0;:::o;66269:81::-;17237:13;:11;:13::i;:::-;66338:6:::1;66327:8;;:17;;;;;;;;;;;;;;;;;;66269:81:::0;:::o;42605:164::-;42702:4;42726:18;:25;42745:5;42726:25;;;;;;;;;;;;;;;:35;42752:8;42726:35;;;;;;;;;;;;;;;;;;;;;;;;;42719:42;;42605:164;;;;:::o;65564:118::-;17237:13;:11;:13::i;:::-;65638::::1;65631:4;:20;;;;65564:118:::0;:::o;18257:201::-;17237:13;:11;:13::i;:::-;18366:1:::1;18346:22;;:8;:22;;::::0;18338:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;18422:28;18441:8;18422:18;:28::i;:::-;18257:201:::0;:::o;65932:118::-;17237:13;:11;:13::i;:::-;66030:14:::1;66014:13;:30;;;;;;:::i;:::-;;65932:118:::0;:::o;39696:305::-;39798:4;39850:25;39835:40;;;:11;:40;;;;:105;;;;39907:33;39892:48;;;:11;:48;;;;39835:105;:158;;;;39957:36;39981:11;39957:23;:36::i;:::-;39835:158;39815:178;;39696:305;;;:::o;51955:135::-;52037:16;52045:7;52037;:16::i;:::-;52029:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;51955:135;:::o;15896:98::-;15949:7;15976:10;15969:17;;15896:98;:::o;51234:174::-;51336:2;51309:15;:24;51325:7;51309:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;51392:7;51388:2;51354:46;;51363:23;51378:7;51363:14;:23::i;:::-;51354:46;;;;;;;;;;;;51234:174;;:::o;17516:132::-;17591:12;:10;:12::i;:::-;17580:23;;:7;:5;:7::i;:::-;:23;;;17572:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17516:132::o;45853:264::-;45946:4;45963:13;45979:23;45994:7;45979:14;:23::i;:::-;45963:39;;46032:5;46021:16;;:7;:16;;;:52;;;;46041:32;46058:5;46065:7;46041:16;:32::i;:::-;46021:52;:87;;;;46101:7;46077:31;;:20;46089:7;46077:11;:20::i;:::-;:31;;;46021:87;46013:96;;;45853:264;;;;:::o;49852:1263::-;50011:4;49984:31;;:23;49999:7;49984:14;:23::i;:::-;:31;;;49976:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;50090:1;50076:16;;:2;:16;;;50068:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;50146:42;50167:4;50173:2;50177:7;50186:1;50146:20;:42::i;:::-;50318:4;50291:31;;:23;50306:7;50291:14;:23::i;:::-;:31;;;50283:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;50436:15;:24;50452:7;50436:24;;;;;;;;;;;;50429:31;;;;;;;;;;;50931:1;50912:9;:15;50922:4;50912:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;50964:1;50947:9;:13;50957:2;50947:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;51006:2;50987:7;:16;50995:7;50987:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;51045:7;51041:2;51026:27;;51035:4;51026:27;;;;;;;;;;;;51066:41;51086:4;51092:2;51096:7;51105:1;51066:19;:41::i;:::-;49852:1263;;;:::o;45128:117::-;45194:7;45221;:16;45229:7;45221:16;;;;;;;;;;;;;;;;;;;;;45214:23;;45128:117;;;:::o;18618:191::-;18692:16;18711:6;;;;;;;;;;;18692:25;;18737:8;18728:6;;:17;;;;;;;;;;;;;;;;;;18792:8;18761:40;;18782:8;18761:40;;;;;;;;;;;;18681:128;18618:191;:::o;46459:110::-;46535:26;46545:2;46549:7;46535:26;;;;;;;;;;;;:9;:26::i;:::-;46459:110;;:::o;51551:315::-;51706:8;51697:17;;:5;:17;;;51689:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;51793:8;51755:18;:25;51774:5;51755:25;;;;;;;;;;;;;;;:35;51781:8;51755:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;51839:8;51817:41;;51832:5;51817:41;;;51849:8;51817:41;;;;;;:::i;:::-;;;;;;;;51551:315;;;:::o;44701:313::-;44857:28;44867:4;44873:2;44877:7;44857:9;:28::i;:::-;44904:47;44927:4;44933:2;44937:7;44946:4;44904:22;:47::i;:::-;44896:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;44701:313;;;;:::o;45558:128::-;45623:4;45676:1;45647:31;;:17;45656:7;45647:8;:17::i;:::-;:31;;;;45640:38;;45558:128;;;:::o;63529:102::-;63589:13;63618:7;63611:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63529:102;:::o;13317:716::-;13373:13;13424:14;13461:1;13441:17;13452:5;13441:10;:17::i;:::-;:21;13424:38;;13477:20;13511:6;13500:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13477:41;;13533:11;13662:6;13658:2;13654:15;13646:6;13642:28;13635:35;;13699:288;13706:4;13699:288;;;13731:5;;;;;;;;13873:8;13868:2;13861:5;13857:14;13852:30;13847:3;13839:44;13929:2;13920:11;;;;;;:::i;:::-;;;;;13963:1;13954:5;:10;13699:288;13950:21;13699:288;14008:6;14001:13;;;;;13317:716;;;:::o;31104:157::-;31189:4;31228:25;31213:40;;;:11;:40;;;;31206:47;;31104:157;;;:::o;58060:915::-;58237:61;58264:4;58270:2;58274:12;58288:9;58237:26;:61::i;:::-;58327:1;58315:9;:13;58311:222;;;58458:63;;;;;;;;;;:::i;:::-;;;;;;;;58311:222;58545:15;58563:12;58545:30;;58608:1;58592:18;;:4;:18;;;58588:187;;58627:40;58659:7;58627:31;:40::i;:::-;58588:187;;;58697:2;58689:10;;:4;:10;;;58685:90;;58716:47;58749:4;58755:7;58716:32;:47::i;:::-;58685:90;58588:187;58803:1;58789:16;;:2;:16;;;58785:183;;58822:45;58859:7;58822:36;:45::i;:::-;58785:183;;;58895:4;58889:10;;:2;:10;;;58885:83;;58916:40;58944:2;58948:7;58916:27;:40::i;:::-;58885:83;58785:183;58226:749;58060:915;;;;:::o;55120:158::-;;;;;:::o;46796:319::-;46925:18;46931:2;46935:7;46925:5;:18::i;:::-;46976:53;47007:1;47011:2;47015:7;47024:4;46976:22;:53::i;:::-;46954:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;46796:319;;;:::o;52654:853::-;52808:4;52829:15;:2;:13;;;:15::i;:::-;52825:675;;;52881:2;52865:36;;;52902:12;:10;:12::i;:::-;52916:4;52922:7;52931:4;52865:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;52861:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53123:1;53106:6;:13;:18;53102:328;;53149:60;;;;;;;;;;:::i;:::-;;;;;;;;53102:328;53380:6;53374:13;53365:6;53361:2;53357:15;53350:38;52861:584;52997:41;;;52987:51;;;:6;:51;;;;52980:58;;;;;52825:675;53484:4;53477:11;;52654:853;;;;;;;:::o;10177:922::-;10230:7;10250:14;10267:1;10250:18;;10317:6;10308:5;:15;10304:102;;10353:6;10344:15;;;;;;:::i;:::-;;;;;10388:2;10378:12;;;;10304:102;10433:6;10424:5;:15;10420:102;;10469:6;10460:15;;;;;;:::i;:::-;;;;;10504:2;10494:12;;;;10420:102;10549:6;10540:5;:15;10536:102;;10585:6;10576:15;;;;;;:::i;:::-;;;;;10620:2;10610:12;;;;10536:102;10665:5;10656;:14;10652:99;;10700:5;10691:14;;;;;;:::i;:::-;;;;;10734:1;10724:11;;;;10652:99;10778:5;10769;:14;10765:99;;10813:5;10804:14;;;;;;:::i;:::-;;;;;10847:1;10837:11;;;;10765:99;10891:5;10882;:14;10878:99;;10926:5;10917:14;;;;;;:::i;:::-;;;;;10960:1;10950:11;;;;10878:99;11004:5;10995;:14;10991:66;;11040:1;11030:11;;;;10991:66;11085:6;11078:13;;;10177:922;;;:::o;54239:159::-;;;;;:::o;59698:164::-;59802:10;:17;;;;59775:15;:24;59791:7;59775:24;;;;;;;;;;;:44;;;;59830:10;59846:7;59830:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59698:164;:::o;60489:988::-;60755:22;60805:1;60780:22;60797:4;60780:16;:22::i;:::-;:26;;;;:::i;:::-;60755:51;;60817:18;60838:17;:26;60856:7;60838:26;;;;;;;;;;;;60817:47;;60985:14;60971:10;:28;60967:328;;61016:19;61038:12;:18;61051:4;61038:18;;;;;;;;;;;;;;;:34;61057:14;61038:34;;;;;;;;;;;;61016:56;;61122:11;61089:12;:18;61102:4;61089:18;;;;;;;;;;;;;;;:30;61108:10;61089:30;;;;;;;;;;;:44;;;;61239:10;61206:17;:30;61224:11;61206:30;;;;;;;;;;;:43;;;;61001:294;60967:328;61391:17;:26;61409:7;61391:26;;;;;;;;;;;61384:33;;;61435:12;:18;61448:4;61435:18;;;;;;;;;;;;;;;:34;61454:14;61435:34;;;;;;;;;;;61428:41;;;60570:907;;60489:988;;:::o;61772:1079::-;62025:22;62070:1;62050:10;:17;;;;:21;;;;:::i;:::-;62025:46;;62082:18;62103:15;:24;62119:7;62103:24;;;;;;;;;;;;62082:45;;62454:19;62476:10;62487:14;62476:26;;;;;;;;:::i;:::-;;;;;;;;;;62454:48;;62540:11;62515:10;62526;62515:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;62651:10;62620:15;:28;62636:11;62620:28;;;;;;;;;;;:41;;;;62792:15;:24;62808:7;62792:24;;;;;;;;;;;62785:31;;;62827:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;61843:1008;;;61772:1079;:::o;59276:221::-;59361:14;59378:20;59395:2;59378:16;:20::i;:::-;59361:37;;59436:7;59409:12;:16;59422:2;59409:16;;;;;;;;;;;;;;;:24;59426:6;59409:24;;;;;;;;;;;:34;;;;59483:6;59454:17;:26;59472:7;59454:26;;;;;;;;;;;:35;;;;59350:147;59276:221;;:::o;47451:942::-;47545:1;47531:16;;:2;:16;;;47523:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;47604:16;47612:7;47604;:16::i;:::-;47603:17;47595:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;47666:48;47695:1;47699:2;47703:7;47712:1;47666:20;:48::i;:::-;47813:16;47821:7;47813;:16::i;:::-;47812:17;47804:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;48228:1;48211:9;:13;48221:2;48211:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;48272:2;48253:7;:16;48261:7;48253:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;48317:7;48313:2;48292:33;;48309:1;48292:33;;;;;;;;;;;;48338:47;48366:1;48370:2;48374:7;48383:1;48338:19;:47::i;:::-;47451:942;;:::o;20055:326::-;20115:4;20372:1;20350:7;:19;;;:23;20343:30;;20055:326;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:116::-;5312:21;5327:5;5312:21;:::i;:::-;5305:5;5302:32;5292:60;;5348:1;5345;5338:12;5292:60;5242:116;:::o;5364:133::-;5407:5;5445:6;5432:20;5423:29;;5461:30;5485:5;5461:30;:::i;:::-;5364:133;;;;:::o;5503:323::-;5559:6;5608:2;5596:9;5587:7;5583:23;5579:32;5576:119;;;5614:79;;:::i;:::-;5576:119;5734:1;5759:50;5801:7;5792:6;5781:9;5777:22;5759:50;:::i;:::-;5749:60;;5705:114;5503:323;;;;:::o;5832:619::-;5909:6;5917;5925;5974:2;5962:9;5953:7;5949:23;5945:32;5942:119;;;5980:79;;:::i;:::-;5942:119;6100:1;6125:53;6170:7;6161:6;6150:9;6146:22;6125:53;:::i;:::-;6115:63;;6071:117;6227:2;6253:53;6298:7;6289:6;6278:9;6274:22;6253:53;:::i;:::-;6243:63;;6198:118;6355:2;6381:53;6426:7;6417:6;6406:9;6402:22;6381:53;:::i;:::-;6371:63;;6326:118;5832:619;;;;;:::o;6457:329::-;6516:6;6565:2;6553:9;6544:7;6540:23;6536:32;6533:119;;;6571:79;;:::i;:::-;6533:119;6691:1;6716:53;6761:7;6752:6;6741:9;6737:22;6716:53;:::i;:::-;6706:63;;6662:117;6457:329;;;;:::o;6792:114::-;6859:6;6893:5;6887:12;6877:22;;6792:114;;;:::o;6912:184::-;7011:11;7045:6;7040:3;7033:19;7085:4;7080:3;7076:14;7061:29;;6912:184;;;;:::o;7102:132::-;7169:4;7192:3;7184:11;;7222:4;7217:3;7213:14;7205:22;;7102:132;;;:::o;7240:108::-;7317:24;7335:5;7317:24;:::i;:::-;7312:3;7305:37;7240:108;;:::o;7354:179::-;7423:10;7444:46;7486:3;7478:6;7444:46;:::i;:::-;7522:4;7517:3;7513:14;7499:28;;7354:179;;;;:::o;7539:113::-;7609:4;7641;7636:3;7632:14;7624:22;;7539:113;;;:::o;7688:732::-;7807:3;7836:54;7884:5;7836:54;:::i;:::-;7906:86;7985:6;7980:3;7906:86;:::i;:::-;7899:93;;8016:56;8066:5;8016:56;:::i;:::-;8095:7;8126:1;8111:284;8136:6;8133:1;8130:13;8111:284;;;8212:6;8206:13;8239:63;8298:3;8283:13;8239:63;:::i;:::-;8232:70;;8325:60;8378:6;8325:60;:::i;:::-;8315:70;;8171:224;8158:1;8155;8151:9;8146:14;;8111:284;;;8115:14;8411:3;8404:10;;7812:608;;;7688:732;;;;:::o;8426:373::-;8569:4;8607:2;8596:9;8592:18;8584:26;;8656:9;8650:4;8646:20;8642:1;8631:9;8627:17;8620:47;8684:108;8787:4;8778:6;8684:108;:::i;:::-;8676:116;;8426:373;;;;:::o;8805:117::-;8914:1;8911;8904:12;8928:117;9037:1;9034;9027:12;9051:180;9099:77;9096:1;9089:88;9196:4;9193:1;9186:15;9220:4;9217:1;9210:15;9237:281;9320:27;9342:4;9320:27;:::i;:::-;9312:6;9308:40;9450:6;9438:10;9435:22;9414:18;9402:10;9399:34;9396:62;9393:88;;;9461:18;;:::i;:::-;9393:88;9501:10;9497:2;9490:22;9280:238;9237:281;;:::o;9524:129::-;9558:6;9585:20;;:::i;:::-;9575:30;;9614:33;9642:4;9634:6;9614:33;:::i;:::-;9524:129;;;:::o;9659:308::-;9721:4;9811:18;9803:6;9800:30;9797:56;;;9833:18;;:::i;:::-;9797:56;9871:29;9893:6;9871:29;:::i;:::-;9863:37;;9955:4;9949;9945:15;9937:23;;9659:308;;;:::o;9973:146::-;10070:6;10065:3;10060;10047:30;10111:1;10102:6;10097:3;10093:16;10086:27;9973:146;;;:::o;10125:425::-;10203:5;10228:66;10244:49;10286:6;10244:49;:::i;:::-;10228:66;:::i;:::-;10219:75;;10317:6;10310:5;10303:21;10355:4;10348:5;10344:16;10393:3;10384:6;10379:3;10375:16;10372:25;10369:112;;;10400:79;;:::i;:::-;10369:112;10490:54;10537:6;10532:3;10527;10490:54;:::i;:::-;10209:341;10125:425;;;;;:::o;10570:340::-;10626:5;10675:3;10668:4;10660:6;10656:17;10652:27;10642:122;;10683:79;;:::i;:::-;10642:122;10800:6;10787:20;10825:79;10900:3;10892:6;10885:4;10877:6;10873:17;10825:79;:::i;:::-;10816:88;;10632:278;10570:340;;;;:::o;10916:509::-;10985:6;11034:2;11022:9;11013:7;11009:23;11005:32;11002:119;;;11040:79;;:::i;:::-;11002:119;11188:1;11177:9;11173:17;11160:31;11218:18;11210:6;11207:30;11204:117;;;11240:79;;:::i;:::-;11204:117;11345:63;11400:7;11391:6;11380:9;11376:22;11345:63;:::i;:::-;11335:73;;11131:287;10916:509;;;;:::o;11431:468::-;11496:6;11504;11553:2;11541:9;11532:7;11528:23;11524:32;11521:119;;;11559:79;;:::i;:::-;11521:119;11679:1;11704:53;11749:7;11740:6;11729:9;11725:22;11704:53;:::i;:::-;11694:63;;11650:117;11806:2;11832:50;11874:7;11865:6;11854:9;11850:22;11832:50;:::i;:::-;11822:60;;11777:115;11431:468;;;;;:::o;11905:307::-;11966:4;12056:18;12048:6;12045:30;12042:56;;;12078:18;;:::i;:::-;12042:56;12116:29;12138:6;12116:29;:::i;:::-;12108:37;;12200:4;12194;12190:15;12182:23;;11905:307;;;:::o;12218:423::-;12295:5;12320:65;12336:48;12377:6;12336:48;:::i;:::-;12320:65;:::i;:::-;12311:74;;12408:6;12401:5;12394:21;12446:4;12439:5;12435:16;12484:3;12475:6;12470:3;12466:16;12463:25;12460:112;;;12491:79;;:::i;:::-;12460:112;12581:54;12628:6;12623:3;12618;12581:54;:::i;:::-;12301:340;12218:423;;;;;:::o;12660:338::-;12715:5;12764:3;12757:4;12749:6;12745:17;12741:27;12731:122;;12772:79;;:::i;:::-;12731:122;12889:6;12876:20;12914:78;12988:3;12980:6;12973:4;12965:6;12961:17;12914:78;:::i;:::-;12905:87;;12721:277;12660:338;;;;:::o;13004:943::-;13099:6;13107;13115;13123;13172:3;13160:9;13151:7;13147:23;13143:33;13140:120;;;13179:79;;:::i;:::-;13140:120;13299:1;13324:53;13369:7;13360:6;13349:9;13345:22;13324:53;:::i;:::-;13314:63;;13270:117;13426:2;13452:53;13497:7;13488:6;13477:9;13473:22;13452:53;:::i;:::-;13442:63;;13397:118;13554:2;13580:53;13625:7;13616:6;13605:9;13601:22;13580:53;:::i;:::-;13570:63;;13525:118;13710:2;13699:9;13695:18;13682:32;13741:18;13733:6;13730:30;13727:117;;;13763:79;;:::i;:::-;13727:117;13868:62;13922:7;13913:6;13902:9;13898:22;13868:62;:::i;:::-;13858:72;;13653:287;13004:943;;;;;;;:::o;13953:311::-;14030:4;14120:18;14112:6;14109:30;14106:56;;;14142:18;;:::i;:::-;14106:56;14192:4;14184:6;14180:17;14172:25;;14252:4;14246;14242:15;14234:23;;13953:311;;;:::o;14270:117::-;14379:1;14376;14369:12;14410:710;14506:5;14531:81;14547:64;14604:6;14547:64;:::i;:::-;14531:81;:::i;:::-;14522:90;;14632:5;14661:6;14654:5;14647:21;14695:4;14688:5;14684:16;14677:23;;14748:4;14740:6;14736:17;14728:6;14724:30;14777:3;14769:6;14766:15;14763:122;;;14796:79;;:::i;:::-;14763:122;14911:6;14894:220;14928:6;14923:3;14920:15;14894:220;;;15003:3;15032:37;15065:3;15053:10;15032:37;:::i;:::-;15027:3;15020:50;15099:4;15094:3;15090:14;15083:21;;14970:144;14954:4;14949:3;14945:14;14938:21;;14894:220;;;14898:21;14512:608;;14410:710;;;;;:::o;15143:370::-;15214:5;15263:3;15256:4;15248:6;15244:17;15240:27;15230:122;;15271:79;;:::i;:::-;15230:122;15388:6;15375:20;15413:94;15503:3;15495:6;15488:4;15480:6;15476:17;15413:94;:::i;:::-;15404:103;;15220:293;15143:370;;;;:::o;15519:336::-;15621:4;15711:18;15703:6;15700:30;15697:56;;;15733:18;;:::i;:::-;15697:56;15783:4;15775:6;15771:17;15763:25;;15843:4;15837;15833:15;15825:23;;15519:336;;;:::o;15861:311::-;15938:4;16028:18;16020:6;16017:30;16014:56;;;16050:18;;:::i;:::-;16014:56;16100:4;16092:6;16088:17;16080:25;;16160:4;16154;16150:15;16142:23;;15861:311;;;:::o;16195:710::-;16291:5;16316:81;16332:64;16389:6;16332:64;:::i;:::-;16316:81;:::i;:::-;16307:90;;16417:5;16446:6;16439:5;16432:21;16480:4;16473:5;16469:16;16462:23;;16533:4;16525:6;16521:17;16513:6;16509:30;16562:3;16554:6;16551:15;16548:122;;;16581:79;;:::i;:::-;16548:122;16696:6;16679:220;16713:6;16708:3;16705:15;16679:220;;;16788:3;16817:37;16850:3;16838:10;16817:37;:::i;:::-;16812:3;16805:50;16884:4;16879:3;16875:14;16868:21;;16755:144;16739:4;16734:3;16730:14;16723:21;;16679:220;;;16683:21;16297:608;;16195:710;;;;;:::o;16928:370::-;16999:5;17048:3;17041:4;17033:6;17029:17;17025:27;17015:122;;17056:79;;:::i;:::-;17015:122;17173:6;17160:20;17198:94;17288:3;17280:6;17273:4;17265:6;17261:17;17198:94;:::i;:::-;17189:103;;17005:293;16928:370;;;;:::o;17323:990::-;17444:5;17469:106;17485:89;17567:6;17485:89;:::i;:::-;17469:106;:::i;:::-;17460:115;;17595:5;17624:6;17617:5;17610:21;17658:4;17651:5;17647:16;17640:23;;17711:4;17703:6;17699:17;17691:6;17687:30;17740:3;17732:6;17729:15;17726:122;;;17759:79;;:::i;:::-;17726:122;17874:6;17857:450;17891:6;17886:3;17883:15;17857:450;;;17980:3;17967:17;18016:18;18003:11;18000:35;17997:122;;;18038:79;;:::i;:::-;17997:122;18162:11;18154:6;18150:24;18200:62;18258:3;18246:10;18200:62;:::i;:::-;18195:3;18188:75;18292:4;18287:3;18283:14;18276:21;;17933:374;;17917:4;17912:3;17908:14;17901:21;;17857:450;;;17861:21;17450:863;;17323:990;;;;;:::o;18338:420::-;18434:5;18483:3;18476:4;18468:6;18464:17;18460:27;18450:122;;18491:79;;:::i;:::-;18450:122;18608:6;18595:20;18633:119;18748:3;18740:6;18733:4;18725:6;18721:17;18633:119;:::i;:::-;18624:128;;18440:318;18338:420;;;;:::o;18764:944::-;18907:6;18915;18964:2;18952:9;18943:7;18939:23;18935:32;18932:119;;;18970:79;;:::i;:::-;18932:119;19118:1;19107:9;19103:17;19090:31;19148:18;19140:6;19137:30;19134:117;;;19170:79;;:::i;:::-;19134:117;19275:78;19345:7;19336:6;19325:9;19321:22;19275:78;:::i;:::-;19265:88;;19061:302;19430:2;19419:9;19415:18;19402:32;19461:18;19453:6;19450:30;19447:117;;;19483:79;;:::i;:::-;19447:117;19588:103;19683:7;19674:6;19663:9;19659:22;19588:103;:::i;:::-;19578:113;;19373:328;18764:944;;;;;:::o;19714:474::-;19782:6;19790;19839:2;19827:9;19818:7;19814:23;19810:32;19807:119;;;19845:79;;:::i;:::-;19807:119;19965:1;19990:53;20035:7;20026:6;20015:9;20011:22;19990:53;:::i;:::-;19980:63;;19936:117;20092:2;20118:53;20163:7;20154:6;20143:9;20139:22;20118:53;:::i;:::-;20108:63;;20063:118;19714:474;;;;;:::o;20194:180::-;20242:77;20239:1;20232:88;20339:4;20336:1;20329:15;20363:4;20360:1;20353:15;20380:320;20424:6;20461:1;20455:4;20451:12;20441:22;;20508:1;20502:4;20498:12;20529:18;20519:81;;20585:4;20577:6;20573:17;20563:27;;20519:81;20647:2;20639:6;20636:14;20616:18;20613:38;20610:84;;20666:18;;:::i;:::-;20610:84;20431:269;20380:320;;;:::o;20706:220::-;20846:34;20842:1;20834:6;20830:14;20823:58;20915:3;20910:2;20902:6;20898:15;20891:28;20706:220;:::o;20932:366::-;21074:3;21095:67;21159:2;21154:3;21095:67;:::i;:::-;21088:74;;21171:93;21260:3;21171:93;:::i;:::-;21289:2;21284:3;21280:12;21273:19;;20932:366;;;:::o;21304:419::-;21470:4;21508:2;21497:9;21493:18;21485:26;;21557:9;21551:4;21547:20;21543:1;21532:9;21528:17;21521:47;21585:131;21711:4;21585:131;:::i;:::-;21577:139;;21304:419;;;:::o;21729:248::-;21869:34;21865:1;21857:6;21853:14;21846:58;21938:31;21933:2;21925:6;21921:15;21914:56;21729:248;:::o;21983:366::-;22125:3;22146:67;22210:2;22205:3;22146:67;:::i;:::-;22139:74;;22222:93;22311:3;22222:93;:::i;:::-;22340:2;22335:3;22331:12;22324:19;;21983:366;;;:::o;22355:419::-;22521:4;22559:2;22548:9;22544:18;22536:26;;22608:9;22602:4;22598:20;22594:1;22583:9;22579:17;22572:47;22636:131;22762:4;22636:131;:::i;:::-;22628:139;;22355:419;;;:::o;22780:232::-;22920:34;22916:1;22908:6;22904:14;22897:58;22989:15;22984:2;22976:6;22972:15;22965:40;22780:232;:::o;23018:366::-;23160:3;23181:67;23245:2;23240:3;23181:67;:::i;:::-;23174:74;;23257:93;23346:3;23257:93;:::i;:::-;23375:2;23370:3;23366:12;23359:19;;23018:366;;;:::o;23390:419::-;23556:4;23594:2;23583:9;23579:18;23571:26;;23643:9;23637:4;23633:20;23629:1;23618:9;23614:17;23607:47;23671:131;23797:4;23671:131;:::i;:::-;23663:139;;23390:419;;;:::o;23815:230::-;23955:34;23951:1;23943:6;23939:14;23932:58;24024:13;24019:2;24011:6;24007:15;24000:38;23815:230;:::o;24051:366::-;24193:3;24214:67;24278:2;24273:3;24214:67;:::i;:::-;24207:74;;24290:93;24379:3;24290:93;:::i;:::-;24408:2;24403:3;24399:12;24392:19;;24051:366;;;:::o;24423:419::-;24589:4;24627:2;24616:9;24612:18;24604:26;;24676:9;24670:4;24666:20;24662:1;24651:9;24647:17;24640:47;24704:131;24830:4;24704:131;:::i;:::-;24696:139;;24423:419;;;:::o;24848:147::-;24949:11;24986:3;24971:18;;24848:147;;;;:::o;25001:114::-;;:::o;25121:398::-;25280:3;25301:83;25382:1;25377:3;25301:83;:::i;:::-;25294:90;;25393:93;25482:3;25393:93;:::i;:::-;25511:1;25506:3;25502:11;25495:18;;25121:398;;;:::o;25525:379::-;25709:3;25731:147;25874:3;25731:147;:::i;:::-;25724:154;;25895:3;25888:10;;25525:379;;;:::o;25910:180::-;25958:77;25955:1;25948:88;26055:4;26052:1;26045:15;26079:4;26076:1;26069:15;26096:180;26144:77;26141:1;26134:88;26241:4;26238:1;26231:15;26265:4;26262:1;26255:15;26282:233;26321:3;26344:24;26362:5;26344:24;:::i;:::-;26335:33;;26390:66;26383:5;26380:77;26377:103;;26460:18;;:::i;:::-;26377:103;26507:1;26500:5;26496:13;26489:20;;26282:233;;;:::o;26521:231::-;26661:34;26657:1;26649:6;26645:14;26638:58;26730:14;26725:2;26717:6;26713:15;26706:39;26521:231;:::o;26758:366::-;26900:3;26921:67;26985:2;26980:3;26921:67;:::i;:::-;26914:74;;26997:93;27086:3;26997:93;:::i;:::-;27115:2;27110:3;27106:12;27099:19;;26758:366;;;:::o;27130:419::-;27296:4;27334:2;27323:9;27319:18;27311:26;;27383:9;27377:4;27373:20;27369:1;27358:9;27354:17;27347:47;27411:131;27537:4;27411:131;:::i;:::-;27403:139;;27130:419;;;:::o;27555:141::-;27604:4;27627:3;27619:11;;27650:3;27647:1;27640:14;27684:4;27681:1;27671:18;27663:26;;27555:141;;;:::o;27702:93::-;27739:6;27786:2;27781;27774:5;27770:14;27766:23;27756:33;;27702:93;;;:::o;27801:107::-;27845:8;27895:5;27889:4;27885:16;27864:37;;27801:107;;;;:::o;27914:393::-;27983:6;28033:1;28021:10;28017:18;28056:97;28086:66;28075:9;28056:97;:::i;:::-;28174:39;28204:8;28193:9;28174:39;:::i;:::-;28162:51;;28246:4;28242:9;28235:5;28231:21;28222:30;;28295:4;28285:8;28281:19;28274:5;28271:30;28261:40;;27990:317;;27914:393;;;;;:::o;28313:60::-;28341:3;28362:5;28355:12;;28313:60;;;:::o;28379:142::-;28429:9;28462:53;28480:34;28489:24;28507:5;28489:24;:::i;:::-;28480:34;:::i;:::-;28462:53;:::i;:::-;28449:66;;28379:142;;;:::o;28527:75::-;28570:3;28591:5;28584:12;;28527:75;;;:::o;28608:269::-;28718:39;28749:7;28718:39;:::i;:::-;28779:91;28828:41;28852:16;28828:41;:::i;:::-;28820:6;28813:4;28807:11;28779:91;:::i;:::-;28773:4;28766:105;28684:193;28608:269;;;:::o;28883:73::-;28928:3;28883:73;:::o;28962:189::-;29039:32;;:::i;:::-;29080:65;29138:6;29130;29124:4;29080:65;:::i;:::-;29015:136;28962:189;;:::o;29157:186::-;29217:120;29234:3;29227:5;29224:14;29217:120;;;29288:39;29325:1;29318:5;29288:39;:::i;:::-;29261:1;29254:5;29250:13;29241:22;;29217:120;;;29157:186;;:::o;29349:543::-;29450:2;29445:3;29442:11;29439:446;;;29484:38;29516:5;29484:38;:::i;:::-;29568:29;29586:10;29568:29;:::i;:::-;29558:8;29554:44;29751:2;29739:10;29736:18;29733:49;;;29772:8;29757:23;;29733:49;29795:80;29851:22;29869:3;29851:22;:::i;:::-;29841:8;29837:37;29824:11;29795:80;:::i;:::-;29454:431;;29439:446;29349:543;;;:::o;29898:117::-;29952:8;30002:5;29996:4;29992:16;29971:37;;29898:117;;;;:::o;30021:169::-;30065:6;30098:51;30146:1;30142:6;30134:5;30131:1;30127:13;30098:51;:::i;:::-;30094:56;30179:4;30173;30169:15;30159:25;;30072:118;30021:169;;;;:::o;30195:295::-;30271:4;30417:29;30442:3;30436:4;30417:29;:::i;:::-;30409:37;;30479:3;30476:1;30472:11;30466:4;30463:21;30455:29;;30195:295;;;;:::o;30495:1395::-;30612:37;30645:3;30612:37;:::i;:::-;30714:18;30706:6;30703:30;30700:56;;;30736:18;;:::i;:::-;30700:56;30780:38;30812:4;30806:11;30780:38;:::i;:::-;30865:67;30925:6;30917;30911:4;30865:67;:::i;:::-;30959:1;30983:4;30970:17;;31015:2;31007:6;31004:14;31032:1;31027:618;;;;31689:1;31706:6;31703:77;;;31755:9;31750:3;31746:19;31740:26;31731:35;;31703:77;31806:67;31866:6;31859:5;31806:67;:::i;:::-;31800:4;31793:81;31662:222;30997:887;;31027:618;31079:4;31075:9;31067:6;31063:22;31113:37;31145:4;31113:37;:::i;:::-;31172:1;31186:208;31200:7;31197:1;31194:14;31186:208;;;31279:9;31274:3;31270:19;31264:26;31256:6;31249:42;31330:1;31322:6;31318:14;31308:24;;31377:2;31366:9;31362:18;31349:31;;31223:4;31220:1;31216:12;31211:17;;31186:208;;;31422:6;31413:7;31410:19;31407:179;;;31480:9;31475:3;31471:19;31465:26;31523:48;31565:4;31557:6;31553:17;31542:9;31523:48;:::i;:::-;31515:6;31508:64;31430:156;31407:179;31632:1;31628;31620:6;31616:14;31612:22;31606:4;31599:36;31034:611;;;30997:887;;30587:1303;;;30495:1395;;:::o;31896:174::-;32036:26;32032:1;32024:6;32020:14;32013:50;31896:174;:::o;32076:366::-;32218:3;32239:67;32303:2;32298:3;32239:67;:::i;:::-;32232:74;;32315:93;32404:3;32315:93;:::i;:::-;32433:2;32428:3;32424:12;32417:19;;32076:366;;;:::o;32448:419::-;32614:4;32652:2;32641:9;32637:18;32629:26;;32701:9;32695:4;32691:20;32687:1;32676:9;32672:17;32665:47;32729:131;32855:4;32729:131;:::i;:::-;32721:139;;32448:419;;;:::o;32873:228::-;33013:34;33009:1;33001:6;32997:14;32990:58;33082:11;33077:2;33069:6;33065:15;33058:36;32873:228;:::o;33107:366::-;33249:3;33270:67;33334:2;33329:3;33270:67;:::i;:::-;33263:74;;33346:93;33435:3;33346:93;:::i;:::-;33464:2;33459:3;33455:12;33448:19;;33107:366;;;:::o;33479:419::-;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:172::-;34044:24;34040:1;34032:6;34028:14;34021:48;33904:172;:::o;34082:366::-;34224:3;34245:67;34309:2;34304:3;34245:67;:::i;:::-;34238:74;;34321:93;34410:3;34321:93;:::i;:::-;34439:2;34434:3;34430:12;34423:19;;34082:366;;;:::o;34454:419::-;34620:4;34658:2;34647:9;34643:18;34635:26;;34707:9;34701:4;34697:20;34693:1;34682:9;34678:17;34671:47;34735:131;34861:4;34735:131;:::i;:::-;34727:139;;34454:419;;;:::o;34879:177::-;35019:29;35015:1;35007:6;35003:14;34996:53;34879:177;:::o;35062:366::-;35204:3;35225:67;35289:2;35284:3;35225:67;:::i;:::-;35218:74;;35301:93;35390:3;35301:93;:::i;:::-;35419:2;35414:3;35410:12;35403:19;;35062:366;;;:::o;35434:419::-;35600:4;35638:2;35627:9;35623:18;35615:26;;35687:9;35681:4;35677:20;35673:1;35662:9;35658:17;35651:47;35715:131;35841:4;35715:131;:::i;:::-;35707:139;;35434:419;;;:::o;35859:223::-;35999:34;35995:1;35987:6;35983:14;35976:58;36068:6;36063:2;36055:6;36051:15;36044:31;35859:223;:::o;36088:366::-;36230:3;36251:67;36315:2;36310:3;36251:67;:::i;:::-;36244:74;;36327:93;36416:3;36327:93;:::i;:::-;36445:2;36440:3;36436:12;36429:19;;36088:366;;;:::o;36460:419::-;36626:4;36664:2;36653:9;36649:18;36641:26;;36713:9;36707:4;36703:20;36699:1;36688:9;36684:17;36677:47;36741:131;36867:4;36741:131;:::i;:::-;36733:139;;36460:419;;;:::o;36885:191::-;36925:3;36944:20;36962:1;36944:20;:::i;:::-;36939:25;;36978:20;36996:1;36978:20;:::i;:::-;36973:25;;37021:1;37018;37014:9;37007:16;;37042:3;37039:1;37036:10;37033:36;;;37049:18;;:::i;:::-;37033:36;36885:191;;;;:::o;37082:172::-;37222:24;37218:1;37210:6;37206:14;37199:48;37082:172;:::o;37260:366::-;37402:3;37423:67;37487:2;37482:3;37423:67;:::i;:::-;37416:74;;37499:93;37588:3;37499:93;:::i;:::-;37617:2;37612:3;37608:12;37601:19;;37260:366;;;:::o;37632:419::-;37798:4;37836:2;37825:9;37821:18;37813:26;;37885:9;37879:4;37875:20;37871:1;37860:9;37856:17;37849:47;37913:131;38039:4;37913:131;:::i;:::-;37905:139;;37632:419;;;:::o;38057:410::-;38097:7;38120:20;38138:1;38120:20;:::i;:::-;38115:25;;38154:20;38172:1;38154:20;:::i;:::-;38149:25;;38209:1;38206;38202:9;38231:30;38249:11;38231:30;:::i;:::-;38220:41;;38410:1;38401:7;38397:15;38394:1;38391:22;38371:1;38364:9;38344:83;38321:139;;38440:18;;:::i;:::-;38321:139;38105:362;38057:410;;;;:::o;38473:168::-;38613:20;38609:1;38601:6;38597:14;38590:44;38473:168;:::o;38647:366::-;38789:3;38810:67;38874:2;38869:3;38810:67;:::i;:::-;38803:74;;38886:93;38975:3;38886:93;:::i;:::-;39004:2;38999:3;38995:12;38988:19;;38647:366;;;:::o;39019:419::-;39185:4;39223:2;39212:9;39208:18;39200:26;;39272:9;39266:4;39262:20;39258:1;39247:9;39243:17;39236:47;39300:131;39426:4;39300:131;:::i;:::-;39292:139;;39019:419;;;:::o;39444:234::-;39584:34;39580:1;39572:6;39568:14;39561:58;39653:17;39648:2;39640:6;39636:15;39629:42;39444:234;:::o;39684:366::-;39826:3;39847:67;39911:2;39906:3;39847:67;:::i;:::-;39840:74;;39923:93;40012:3;39923:93;:::i;:::-;40041:2;40036:3;40032:12;40025:19;;39684:366;;;:::o;40056:419::-;40222:4;40260:2;40249:9;40245:18;40237:26;;40309:9;40303:4;40299:20;40295:1;40284:9;40280:17;40273:47;40337:131;40463:4;40337:131;:::i;:::-;40329:139;;40056:419;;;:::o;40481:148::-;40583:11;40620:3;40605:18;;40481:148;;;;:::o;40635:390::-;40741:3;40769:39;40802:5;40769:39;:::i;:::-;40824:89;40906:6;40901:3;40824:89;:::i;:::-;40817:96;;40922:65;40980:6;40975:3;40968:4;40961:5;40957:16;40922:65;:::i;:::-;41012:6;41007:3;41003:16;40996:23;;40745:280;40635:390;;;;:::o;41055:874::-;41158:3;41195:5;41189:12;41224:36;41250:9;41224:36;:::i;:::-;41276:89;41358:6;41353:3;41276:89;:::i;:::-;41269:96;;41396:1;41385:9;41381:17;41412:1;41407:166;;;;41587:1;41582:341;;;;41374:549;;41407:166;41491:4;41487:9;41476;41472:25;41467:3;41460:38;41553:6;41546:14;41539:22;41531:6;41527:35;41522:3;41518:45;41511:52;;41407:166;;41582:341;41649:38;41681:5;41649:38;:::i;:::-;41709:1;41723:154;41737:6;41734:1;41731:13;41723:154;;;41811:7;41805:14;41801:1;41796:3;41792:11;41785:35;41861:1;41852:7;41848:15;41837:26;;41759:4;41756:1;41752:12;41747:17;;41723:154;;;41906:6;41901:3;41897:16;41890:23;;41589:334;;41374:549;;41162:767;;41055:874;;;;:::o;41935:589::-;42160:3;42182:95;42273:3;42264:6;42182:95;:::i;:::-;42175:102;;42294:95;42385:3;42376:6;42294:95;:::i;:::-;42287:102;;42406:92;42494:3;42485:6;42406:92;:::i;:::-;42399:99;;42515:3;42508:10;;41935:589;;;;;;:::o;42530:168::-;42670:20;42666:1;42658:6;42654:14;42647:44;42530:168;:::o;42704:366::-;42846:3;42867:67;42931:2;42926:3;42867:67;:::i;:::-;42860:74;;42943:93;43032:3;42943:93;:::i;:::-;43061:2;43056:3;43052:12;43045:19;;42704:366;;;:::o;43076:419::-;43242:4;43280:2;43269:9;43265:18;43257:26;;43329:9;43323:4;43319:20;43315:1;43304:9;43300:17;43293:47;43357:131;43483:4;43357:131;:::i;:::-;43349:139;;43076:419;;;:::o;43501:225::-;43641:34;43637:1;43629:6;43625:14;43618:58;43710:8;43705:2;43697:6;43693:15;43686:33;43501:225;:::o;43732:366::-;43874:3;43895:67;43959:2;43954:3;43895:67;:::i;:::-;43888:74;;43971:93;44060:3;43971:93;:::i;:::-;44089:2;44084:3;44080:12;44073:19;;43732:366;;;:::o;44104:419::-;44270:4;44308:2;44297:9;44293:18;44285:26;;44357:9;44351:4;44347:20;44343:1;44332:9;44328:17;44321:47;44385:131;44511:4;44385:131;:::i;:::-;44377:139;;44104:419;;;:::o;44529:182::-;44669:34;44665:1;44657:6;44653:14;44646:58;44529:182;:::o;44717:366::-;44859:3;44880:67;44944:2;44939:3;44880:67;:::i;:::-;44873:74;;44956:93;45045:3;44956:93;:::i;:::-;45074:2;45069:3;45065:12;45058:19;;44717:366;;;:::o;45089:419::-;45255:4;45293:2;45282:9;45278:18;45270:26;;45342:9;45336:4;45332:20;45328:1;45317:9;45313:17;45306:47;45370:131;45496:4;45370:131;:::i;:::-;45362:139;;45089:419;;;:::o;45514:224::-;45654:34;45650:1;45642:6;45638:14;45631:58;45723:7;45718:2;45710:6;45706:15;45699:32;45514:224;:::o;45744:366::-;45886:3;45907:67;45971:2;45966:3;45907:67;:::i;:::-;45900:74;;45983:93;46072:3;45983:93;:::i;:::-;46101:2;46096:3;46092:12;46085:19;;45744:366;;;:::o;46116:419::-;46282:4;46320:2;46309:9;46305:18;46297:26;;46369:9;46363:4;46359:20;46355:1;46344:9;46340:17;46333:47;46397:131;46523:4;46397:131;:::i;:::-;46389:139;;46116:419;;;:::o;46541:223::-;46681:34;46677:1;46669:6;46665:14;46658:58;46750:6;46745:2;46737:6;46733:15;46726:31;46541:223;:::o;46770:366::-;46912:3;46933:67;46997:2;46992:3;46933:67;:::i;:::-;46926:74;;47009:93;47098:3;47009:93;:::i;:::-;47127:2;47122:3;47118:12;47111:19;;46770:366;;;:::o;47142:419::-;47308:4;47346:2;47335:9;47331:18;47323:26;;47395:9;47389:4;47385:20;47381:1;47370:9;47366:17;47359:47;47423:131;47549:4;47423:131;:::i;:::-;47415:139;;47142:419;;;:::o;47567:175::-;47707:27;47703:1;47695:6;47691:14;47684:51;47567:175;:::o;47748:366::-;47890:3;47911:67;47975:2;47970:3;47911:67;:::i;:::-;47904:74;;47987:93;48076:3;47987:93;:::i;:::-;48105:2;48100:3;48096:12;48089:19;;47748:366;;;:::o;48120:419::-;48286:4;48324:2;48313:9;48309:18;48301:26;;48373:9;48367:4;48363:20;48359:1;48348:9;48344:17;48337:47;48401:131;48527:4;48401:131;:::i;:::-;48393:139;;48120:419;;;:::o;48545:237::-;48685:34;48681:1;48673:6;48669:14;48662:58;48754:20;48749:2;48741:6;48737:15;48730:45;48545:237;:::o;48788:366::-;48930:3;48951:67;49015:2;49010:3;48951:67;:::i;:::-;48944:74;;49027:93;49116:3;49027:93;:::i;:::-;49145:2;49140:3;49136:12;49129:19;;48788:366;;;:::o;49160:419::-;49326:4;49364:2;49353:9;49349:18;49341:26;;49413:9;49407:4;49403:20;49399:1;49388:9;49384:17;49377:47;49441:131;49567:4;49441:131;:::i;:::-;49433:139;;49160:419;;;:::o;49585:180::-;49633:77;49630:1;49623:88;49730:4;49727:1;49720:15;49754:4;49751:1;49744:15;49771:240;49911:34;49907:1;49899:6;49895:14;49888:58;49980:23;49975:2;49967:6;49963:15;49956:48;49771:240;:::o;50017:366::-;50159:3;50180:67;50244:2;50239:3;50180:67;:::i;:::-;50173:74;;50256:93;50345:3;50256:93;:::i;:::-;50374:2;50369:3;50365:12;50358:19;;50017:366;;;:::o;50389:419::-;50555:4;50593:2;50582:9;50578:18;50570:26;;50642:9;50636:4;50632:20;50628:1;50617:9;50613:17;50606:47;50670:131;50796:4;50670:131;:::i;:::-;50662:139;;50389:419;;;:::o;50814:98::-;50865:6;50899:5;50893:12;50883:22;;50814:98;;;:::o;50918:168::-;51001:11;51035:6;51030:3;51023:19;51075:4;51070:3;51066:14;51051:29;;50918:168;;;;:::o;51092:373::-;51178:3;51206:38;51238:5;51206:38;:::i;:::-;51260:70;51323:6;51318:3;51260:70;:::i;:::-;51253:77;;51339:65;51397:6;51392:3;51385:4;51378:5;51374:16;51339:65;:::i;:::-;51429:29;51451:6;51429:29;:::i;:::-;51424:3;51420:39;51413:46;;51182:283;51092:373;;;;:::o;51471:640::-;51666:4;51704:3;51693:9;51689:19;51681:27;;51718:71;51786:1;51775:9;51771:17;51762:6;51718:71;:::i;:::-;51799:72;51867:2;51856:9;51852:18;51843:6;51799:72;:::i;:::-;51881;51949:2;51938:9;51934:18;51925:6;51881:72;:::i;:::-;52000:9;51994:4;51990:20;51985:2;51974:9;51970:18;51963:48;52028:76;52099:4;52090:6;52028:76;:::i;:::-;52020:84;;51471:640;;;;;;;:::o;52117:141::-;52173:5;52204:6;52198:13;52189:22;;52220:32;52246:5;52220:32;:::i;:::-;52117:141;;;;:::o;52264:349::-;52333:6;52382:2;52370:9;52361:7;52357:23;52353:32;52350:119;;;52388:79;;:::i;:::-;52350:119;52508:1;52533:63;52588:7;52579:6;52568:9;52564:22;52533:63;:::i;:::-;52523:73;;52479:127;52264:349;;;;:::o;52619:194::-;52659:4;52679:20;52697:1;52679:20;:::i;:::-;52674:25;;52713:20;52731:1;52713:20;:::i;:::-;52708:25;;52757:1;52754;52750:9;52742:17;;52781:1;52775:4;52772:11;52769:37;;;52786:18;;:::i;:::-;52769:37;52619:194;;;;:::o;52819:180::-;52867:77;52864:1;52857:88;52964:4;52961:1;52954:15;52988:4;52985:1;52978:15;53005:182;53145:34;53141:1;53133:6;53129:14;53122:58;53005:182;:::o;53193:366::-;53335:3;53356:67;53420:2;53415:3;53356:67;:::i;:::-;53349:74;;53432:93;53521:3;53432:93;:::i;:::-;53550:2;53545:3;53541:12;53534:19;;53193:366;;;:::o;53565:419::-;53731:4;53769:2;53758:9;53754:18;53746:26;;53818:9;53812:4;53808:20;53804:1;53793:9;53789:17;53782:47;53846:131;53972:4;53846:131;:::i;:::-;53838:139;;53565:419;;;:::o;53990:178::-;54130:30;54126:1;54118:6;54114:14;54107:54;53990:178;:::o;54174:366::-;54316:3;54337:67;54401:2;54396:3;54337:67;:::i;:::-;54330:74;;54413:93;54502:3;54413:93;:::i;:::-;54531:2;54526:3;54522:12;54515:19;;54174:366;;;:::o;54546:419::-;54712:4;54750:2;54739:9;54735:18;54727:26;;54799:9;54793:4;54789:20;54785:1;54774:9;54770:17;54763:47;54827:131;54953:4;54827:131;:::i;:::-;54819:139;;54546:419;;;:::o

Swarm Source

ipfs://677f85b05f501b27bf64e64e9d185dbfd934a156544e96e6560bfc587ac269c9
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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