Token 3D Gnomes and Gnomides

Overview CRC721

Total Supply:
200 3DGnomies

Holders:
78 addresses
Balance
4 3DGnomies
0x634a5dc4cda63ea8d0699d9387cdcfffc6408b84
Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
GnomesandGnomides

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at cronoscan.com on 2023-04-17
*/

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be _NOT_ENTERED
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


// OpenZeppelin Contracts (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/contracts/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/contracts/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/contracts/utils/introspection/IERC165.sol


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

pragma solidity ^0.8.0;

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

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


// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

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


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

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/common/ERC2981.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/common/ERC2981.sol)

pragma solidity ^0.8.0;



/**
 * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
 * fee is specified in basis points by default.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC2981 is IERC2981, ERC165 {
    struct RoyaltyInfo {
        address receiver;
        uint96 royaltyFraction;
    }

    RoyaltyInfo private _defaultRoyaltyInfo;
    mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;

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

    /**
     * @inheritdoc IERC2981
     */
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) {
        RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId];

        if (royalty.receiver == address(0)) {
            royalty = _defaultRoyaltyInfo;
        }

        uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator();

        return (royalty.receiver, royaltyAmount);
    }

    /**
     * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
     * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
     * override.
     */
    function _feeDenominator() internal pure virtual returns (uint96) {
        return 10000;
    }

    /**
     * @dev Sets the royalty information that all ids in this contract will default to.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: invalid receiver");

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Removes default royalty information.
     */
    function _deleteDefaultRoyalty() internal virtual {
        delete _defaultRoyaltyInfo;
    }

    /**
     * @dev Sets the royalty information for a specific token id, overriding the global default.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setTokenRoyalty(
        uint256 tokenId,
        address receiver,
        uint96 feeNumerator
    ) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: Invalid parameters");

        _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Resets royalty information for the token id back to the global default.
     */
    function _resetTokenRoyalty(uint256 tokenId) internal virtual {
        delete _tokenRoyaltyInfo[tokenId];
    }
}

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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



pragma solidity 0.8.17;






// Coded by CRMax
contract GnomesandGnomides is ERC721Enumerable, Ownable, ReentrancyGuard, ERC2981 {
    using Counters for Counters.Counter;
    using Strings for uint256;

    uint256 public saleState = 0;
    string baseURI;
    string public baseExtension = ".json";
    uint256 public cost = 50 ether;
    uint256 public crognomeCost = 0 ether;
    uint256 public crognomideCost = 0 ether;
    uint256 public crognome2Cost = 0 ether;
    uint256 public crognomide2Cost = 0 ether;
    uint256 public mushroomCost = 0 ether;
    uint256 public constant maxSupply = 200;

    Counters.Counter private _tokenIds;

    bool public paused = false;
    mapping(address => uint256) public minted;

    address[] holders;
    uint256[] counts;
    uint public curIndex;

    address public teamWallet = 0xBaDa1b68A54f274814e050dbF0b6d1a8466e7A63;  

    IERC721 public ICrognome;
    IERC721 public ICrognomide;
    IERC721 public ICrognome2;
    IERC721 public ICrognomide2;
    IERC721 public IMushroom;

    struct MintInfo {
        bool paused;
        uint256 supply;
        uint256 publicTimestamp;
    }

    constructor(
        string memory _initBaseURI,
        address _crognome,
        address _crognomide,
        address _crognome2,
        address _crognomide2,
        address _mushroom
    ) ERC721("3D Gnomes and Gnomides", "3DGnomies") {
        setBaseURI(_initBaseURI);
        ICrognome = IERC721(_crognome);
        ICrognomide = IERC721(_crognomide);
        ICrognome2 = IERC721(_crognome2);
        ICrognomide2 = IERC721(_crognomide2);
        IMushroom = IERC721(_mushroom);
    }

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

    // public
    function mint(uint256 amount) public payable nonReentrant {
        require(!paused, "Mint is paused");
        require(saleState > 0, "Mint has not started");
        if (saleState == 1) {
            require(isCrognome(msg.sender) || isCrognomide(msg.sender) || isCrognome2(msg.sender) || isCrognomide2(msg.sender)|| isMushroom(msg.sender), "Free mint only for Crognome NFT Community");
        }
        require(
            minted[msg.sender] + amount <= (saleState == 1 ? 2 : 4), "Exceeds max mintable nfts");   //Allows max mint of 2 during presale, 4 during public sale
        require(amount > 0, "amount can't be zero");
        uint256 supply = totalSupply();
        require(supply + amount <= maxSupply, "Max supply exceeded");
        uint256 price = cost;
        if (isCrognome(msg.sender)) price = crognomeCost;
        if (isCrognome2(msg.sender)) price = crognome2Cost;
        if (isCrognomide(msg.sender)) price = crognomideCost;
        if (isCrognomide2(msg.sender)) price = crognomide2Cost;
        if (isMushroom(msg.sender)) price = mushroomCost;
        require(msg.value >= price * amount, "insufficient funds");

        for (uint256 i = 0; i < amount; i++) {
            _tokenIds.increment();
            uint256 tokenId = _tokenIds.current();
            _safeMint(msg.sender, tokenId);
        }
        minted[msg.sender] += amount;
    }

    function walletOfOwner(
        address _owner
    ) public 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"
        );

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

    function isCrognome(address _address) public view returns (bool) {
        return ICrognome.balanceOf(_address) > 0;
    }

    function isCrognome2(address _address) public view returns (bool) {
        return ICrognome2.balanceOf(_address) > 0;
    }

    function isCrognomide(address _address) public view returns (bool) {
        return ICrognomide.balanceOf(_address) > 0;
    }

    function isCrognomide2(address _address) public view returns (bool) {
        return ICrognomide2.balanceOf(_address) > 0;
    }

    function isMushroom(address _address) public view returns (bool) {
        return IMushroom.balanceOf(_address) > 0;
    }

    function startPresale() external onlyOwner {
        saleState = 1;
    }

    function startPublicSale() external onlyOwner {
        saleState = 2;
    }

    function setCost(uint256 _newCost) public onlyOwner {
        cost = _newCost;
    }

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

    function setBaseExtension(
        string memory _newBaseExtension
    ) public onlyOwner {
        baseExtension = _newBaseExtension;
    }

    function pause(bool _state) public onlyOwner {
        paused = _state;
    }

    function setAirDropCounts(address[] memory _holders, uint256[] memory _counts) external onlyOwner {
    require(_holders.length == _counts.length, "Input Data error");
    for (uint i = 0; i < _holders.length; i++) {
      holders.push(_holders[i]);
      counts.push(_counts[i]);
    }
  }

    function airDropNFT(uint256 amount) external {
    require(curIndex < holders.length, "None left to airdrop");
    uint256 endID = curIndex + amount;
    if (endID > holders.length) endID = holders.length;
    uint256 supply = totalSupply();
    
    for (; curIndex < endID; curIndex++) {
      for (uint256 idx = 1; idx <= counts[curIndex]; idx++)
        _safeMint(holders[curIndex], supply+idx);
      supply += counts[curIndex];
    }
  }

    function mintCost(address _minter) external view returns (uint256) {
        if (isCrognome(_minter) == true) return crognomeCost;
        if (isCrognome2(_minter) == true) return crognome2Cost;
        if (isCrognomide(_minter) == true) return crognomideCost;
        if (isCrognomide2(_minter) == true) return crognomide2Cost;
        if (isMushroom(_minter) == true) return mushroomCost;
        return cost;
    }

    function withdraw() external {
        bool sent;
        (sent, ) = payable(teamWallet).call{value: address(this).balance}("");
        require(sent, "Sending cro failed");
    }

    function teamMint(uint256 from, uint256 to) external onlyOwner {
        for (uint i = from; i <= to; i++) {
            require(i <= maxSupply, "Invalid token ID");
            _safeMint(teamWallet, i);
        }
    }

    function supportsInterface(
        bytes4 interfaceId
    ) public view override(ERC721Enumerable, ERC2981) returns (bool) {
        return super.supportsInterface(interfaceId);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"address","name":"_crognome","type":"address"},{"internalType":"address","name":"_crognomide","type":"address"},{"internalType":"address","name":"_crognome2","type":"address"},{"internalType":"address","name":"_crognomide2","type":"address"},{"internalType":"address","name":"_mushroom","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"ICrognome","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ICrognome2","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ICrognomide","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ICrognomide2","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IMushroom","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"airDropNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"crognome2Cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"crognomeCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"crognomide2Cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"crognomideCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"curIndex","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":[{"internalType":"address","name":"_address","type":"address"}],"name":"isCrognome","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isCrognome2","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isCrognomide","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isCrognomide2","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isMushroom","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":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"mintCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mushroomCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"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":[],"name":"saleState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_holders","type":"address[]"},{"internalType":"uint256[]","name":"_counts","type":"uint256[]"}],"name":"setAirDropCounts","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":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startPublicSale","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":"from","type":"uint256"},{"internalType":"uint256","name":"to","type":"uint256"}],"name":"teamMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"teamWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600e556040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250601090816200004f91906200075d565b506802b5e3af16b1880000601155600060125560006013556000601455600060155560006016556000601860006101000a81548160ff02191690831515021790555073bada1b68a54f274814e050dbf0b6d1a8466e7a63601d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000f357600080fd5b50604051620067e9380380620067e9833981810160405281019062000119919062000a0d565b6040518060400160405280601681526020017f334420476e6f6d657320616e6420476e6f6d69646573000000000000000000008152506040518060400160405280600981526020017f3344476e6f6d696573000000000000000000000000000000000000000000000081525081600090816200019691906200075d565b508060019081620001a891906200075d565b505050620001cb620001bf6200033560201b60201c565b6200033d60201b60201c565b6001600b81905550620001e4866200040360201b60201c565b84601e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083601f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081602160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080602260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050505062000b4b565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620004136200042860201b60201c565b80600f90816200042491906200075d565b5050565b620004386200033560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200045e620004b960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620004b7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004ae9062000b29565b60405180910390fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200056557607f821691505b6020821081036200057b576200057a6200051d565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620005e57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620005a6565b620005f18683620005a6565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200063e62000638620006328462000609565b62000613565b62000609565b9050919050565b6000819050919050565b6200065a836200061d565b62000672620006698262000645565b848454620005b3565b825550505050565b600090565b620006896200067a565b620006968184846200064f565b505050565b5b81811015620006be57620006b26000826200067f565b6001810190506200069c565b5050565b601f8211156200070d57620006d78162000581565b620006e28462000596565b81016020851015620006f2578190505b6200070a620007018562000596565b8301826200069b565b50505b505050565b600082821c905092915050565b6000620007326000198460080262000712565b1980831691505092915050565b60006200074d83836200071f565b9150826002028217905092915050565b6200076882620004e3565b67ffffffffffffffff811115620007845762000783620004ee565b5b6200079082546200054c565b6200079d828285620006c2565b600060209050601f831160018114620007d55760008415620007c0578287015190505b620007cc85826200073f565b8655506200083c565b601f198416620007e58662000581565b60005b828110156200080f57848901518255600182019150602085019450602081019050620007e8565b868310156200082f57848901516200082b601f8916826200071f565b8355505b6001600288020188555050505b505050505050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b6200087e8262000862565b810181811067ffffffffffffffff82111715620008a0576200089f620004ee565b5b80604052505050565b6000620008b562000844565b9050620008c3828262000873565b919050565b600067ffffffffffffffff821115620008e657620008e5620004ee565b5b620008f18262000862565b9050602081019050919050565b60005b838110156200091e57808201518184015260208101905062000901565b60008484015250505050565b6000620009416200093b84620008c8565b620008a9565b90508281526020810184848401111562000960576200095f6200085d565b5b6200096d848285620008fe565b509392505050565b600082601f8301126200098d576200098c62000858565b5b81516200099f8482602086016200092a565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620009d582620009a8565b9050919050565b620009e781620009c8565b8114620009f357600080fd5b50565b60008151905062000a0781620009dc565b92915050565b60008060008060008060c0878903121562000a2d5762000a2c6200084e565b5b600087015167ffffffffffffffff81111562000a4e5762000a4d62000853565b5b62000a5c89828a0162000975565b965050602062000a6f89828a01620009f6565b955050604062000a8289828a01620009f6565b945050606062000a9589828a01620009f6565b935050608062000aa889828a01620009f6565b92505060a062000abb89828a01620009f6565b9150509295509295509295565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062000b1160208362000ac8565b915062000b1e8262000ad9565b602082019050919050565b6000602082019050818103600083015262000b448162000b02565b9050919050565b615c8e8062000b5b6000396000f3fe60806040526004361061036b5760003560e01c80635f32b6c4116101c6578063a1b9023d116100f7578063d215086111610095578063e985e9c51161006f578063e985e9c514610cd6578063ee39829514610d13578063f2fde38b14610d3e578063f889a2fa14610d675761036b565b8063d215086114610c45578063d5abeb0114610c82578063da3ef23f14610cad5761036b565b8063b88d4fde116100d1578063b88d4fde14610b89578063c668286214610bb2578063c87b56dd14610bdd578063c912696c14610c1a5761036b565b8063a1b9023d14610b0a578063a22cb46514610b35578063b2ea454014610b5e5761036b565b8063715018a6116101645780639294614a1161013e5780639294614a14610a5b57806395d89b4114610a985780639a30e5b314610ac3578063a0712d6814610aee5761036b565b8063715018a6146109f05780638da5cb5b14610a075780638e79401314610a325761036b565b80636499d87a116101a05780636499d87a1461092257806369b5b29c1461094d5780636ba7dda41461097657806370a08231146109b35761036b565b80635f32b6c41461088f578063603f4d52146108ba5780636352211e146108e55761036b565b80632a55205a116102a057806342842e0e1161023e5780634f6ccce7116102185780634f6ccce7146107d357806355f804b31461081057806359927044146108395780635c975abb146108645761036b565b806342842e0e14610744578063438b63001461076d57806344a0d68a146107aa5761036b565b80632d35b7951161027a5780632d35b7951461069c5780632f745c59146106c55780633ccfd60b146107025780633f065d06146107195761036b565b80632a55205a146105e45780632a735147146106225780632acc659e1461065f5761036b565b80630ce69e901161030d5780631b294a2c116102e75780631b294a2c146105165780631e7269c51461055357806323b872dd1461059057806328b5c186146105b95761036b565b80630ce69e901461049557806313faede6146104c057806318160ddd146104eb5761036b565b806306fdde031161034957806306fdde03146103ed578063081812fc14610418578063095ea7b3146104555780630c1c972a1461047e5761036b565b806301ffc9a71461037057806302329a29146103ad57806304c98b2b146103d6575b600080fd5b34801561037c57600080fd5b5061039760048036038101906103929190613cf5565b610d92565b6040516103a49190613d3d565b60405180910390f35b3480156103b957600080fd5b506103d460048036038101906103cf9190613d84565b610da4565b005b3480156103e257600080fd5b506103eb610dc9565b005b3480156103f957600080fd5b50610402610ddb565b60405161040f9190613e41565b60405180910390f35b34801561042457600080fd5b5061043f600480360381019061043a9190613e99565b610e6d565b60405161044c9190613f07565b60405180910390f35b34801561046157600080fd5b5061047c60048036038101906104779190613f4e565b610eb3565b005b34801561048a57600080fd5b50610493610fca565b005b3480156104a157600080fd5b506104aa610fdc565b6040516104b79190613f9d565b60405180910390f35b3480156104cc57600080fd5b506104d5610fe2565b6040516104e29190613f9d565b60405180910390f35b3480156104f757600080fd5b50610500610fe8565b60405161050d9190613f9d565b60405180910390f35b34801561052257600080fd5b5061053d60048036038101906105389190613fb8565b610ff5565b60405161054a9190613d3d565b60405180910390f35b34801561055f57600080fd5b5061057a60048036038101906105759190613fb8565b61109c565b6040516105879190613f9d565b60405180910390f35b34801561059c57600080fd5b506105b760048036038101906105b29190613fe5565b6110b4565b005b3480156105c557600080fd5b506105ce611114565b6040516105db9190613f9d565b60405180910390f35b3480156105f057600080fd5b5061060b60048036038101906106069190614038565b61111a565b604051610619929190614078565b60405180910390f35b34801561062e57600080fd5b5061064960048036038101906106449190613fb8565b611304565b6040516106569190613d3d565b60405180910390f35b34801561066b57600080fd5b5061068660048036038101906106819190613fb8565b6113ab565b6040516106939190613f9d565b60405180910390f35b3480156106a857600080fd5b506106c360048036038101906106be91906142ac565b61144e565b005b3480156106d157600080fd5b506106ec60048036038101906106e79190613f4e565b61157e565b6040516106f99190613f9d565b60405180910390f35b34801561070e57600080fd5b50610717611623565b005b34801561072557600080fd5b5061072e6116f6565b60405161073b9190614383565b60405180910390f35b34801561075057600080fd5b5061076b60048036038101906107669190613fe5565b61171c565b005b34801561077957600080fd5b50610794600480360381019061078f9190613fb8565b61173c565b6040516107a1919061445c565b60405180910390f35b3480156107b657600080fd5b506107d160048036038101906107cc9190613e99565b6117ea565b005b3480156107df57600080fd5b506107fa60048036038101906107f59190613e99565b6117fc565b6040516108079190613f9d565b60405180910390f35b34801561081c57600080fd5b5061083760048036038101906108329190614533565b61186d565b005b34801561084557600080fd5b5061084e611888565b60405161085b9190613f07565b60405180910390f35b34801561087057600080fd5b506108796118ae565b6040516108869190613d3d565b60405180910390f35b34801561089b57600080fd5b506108a46118c1565b6040516108b19190614383565b60405180910390f35b3480156108c657600080fd5b506108cf6118e7565b6040516108dc9190613f9d565b60405180910390f35b3480156108f157600080fd5b5061090c60048036038101906109079190613e99565b6118ed565b6040516109199190613f07565b60405180910390f35b34801561092e57600080fd5b50610937611973565b6040516109449190613f9d565b60405180910390f35b34801561095957600080fd5b50610974600480360381019061096f9190614038565b611979565b005b34801561098257600080fd5b5061099d60048036038101906109989190613fb8565b611a16565b6040516109aa9190613d3d565b60405180910390f35b3480156109bf57600080fd5b506109da60048036038101906109d59190613fb8565b611abd565b6040516109e79190613f9d565b60405180910390f35b3480156109fc57600080fd5b50610a05611b74565b005b348015610a1357600080fd5b50610a1c611b88565b604051610a299190613f07565b60405180910390f35b348015610a3e57600080fd5b50610a596004803603810190610a549190613e99565b611bb2565b005b348015610a6757600080fd5b50610a826004803603810190610a7d9190613fb8565b611d21565b604051610a8f9190613d3d565b60405180910390f35b348015610aa457600080fd5b50610aad611dc8565b604051610aba9190613e41565b60405180910390f35b348015610acf57600080fd5b50610ad8611e5a565b604051610ae59190614383565b60405180910390f35b610b086004803603810190610b039190613e99565b611e80565b005b348015610b1657600080fd5b50610b1f61224f565b604051610b2c9190613f9d565b60405180910390f35b348015610b4157600080fd5b50610b5c6004803603810190610b57919061457c565b612255565b005b348015610b6a57600080fd5b50610b7361226b565b604051610b809190613f9d565b60405180910390f35b348015610b9557600080fd5b50610bb06004803603810190610bab919061465d565b612271565b005b348015610bbe57600080fd5b50610bc76122d3565b604051610bd49190613e41565b60405180910390f35b348015610be957600080fd5b50610c046004803603810190610bff9190613e99565b612361565b604051610c119190613e41565b60405180910390f35b348015610c2657600080fd5b50610c2f61240b565b604051610c3c9190613f9d565b60405180910390f35b348015610c5157600080fd5b50610c6c6004803603810190610c679190613fb8565b612411565b604051610c799190613d3d565b60405180910390f35b348015610c8e57600080fd5b50610c976124b8565b604051610ca49190613f9d565b60405180910390f35b348015610cb957600080fd5b50610cd46004803603810190610ccf9190614533565b6124bd565b005b348015610ce257600080fd5b50610cfd6004803603810190610cf891906146e0565b6124d8565b604051610d0a9190613d3d565b60405180910390f35b348015610d1f57600080fd5b50610d2861256c565b604051610d359190614383565b60405180910390f35b348015610d4a57600080fd5b50610d656004803603810190610d609190613fb8565b612592565b005b348015610d7357600080fd5b50610d7c612615565b604051610d899190614383565b60405180910390f35b6000610d9d8261263b565b9050919050565b610dac6126b5565b80601860006101000a81548160ff02191690831515021790555050565b610dd16126b5565b6001600e81905550565b606060008054610dea9061474f565b80601f0160208091040260200160405190810160405280929190818152602001828054610e169061474f565b8015610e635780601f10610e3857610100808354040283529160200191610e63565b820191906000526020600020905b815481529060010190602001808311610e4657829003601f168201915b5050505050905090565b6000610e7882612733565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ebe826118ed565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610f2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f25906147f2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610f4d61277e565b73ffffffffffffffffffffffffffffffffffffffff161480610f7c5750610f7b81610f7661277e565b6124d8565b5b610fbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb290614884565b60405180910390fd5b610fc58383612786565b505050565b610fd26126b5565b6002600e81905550565b60155481565b60115481565b6000600880549050905090565b600080602160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b81526004016110539190613f07565b602060405180830381865afa158015611070573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109491906148b9565b119050919050565b60196020528060005260406000206000915090505481565b6110c56110bf61277e565b8261283f565b611104576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fb90614958565b60405180910390fd5b61110f8383836128d4565b505050565b60165481565b6000806000600d60008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16036112af57600c6040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b60006112b9612bcd565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff16866112e591906149a7565b6112ef9190614a18565b90508160000151819350935050509250929050565b600080602060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b81526004016113629190613f07565b602060405180830381865afa15801561137f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113a391906148b9565b119050919050565b6000600115156113ba83611d21565b1515036113cb576012549050611449565b600115156113d883611304565b1515036113e9576014549050611449565b600115156113f683612411565b151503611407576013549050611449565b6001151561141483610ff5565b151503611425576015549050611449565b6001151561143283611a16565b151503611443576016549050611449565b60115490505b919050565b6114566126b5565b805182511461149a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149190614a95565b60405180910390fd5b60005b825181101561157957601a8382815181106114bb576114ba614ab5565b5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601b82828151811061153857611537614ab5565b5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190915055808061157190614ae4565b91505061149d565b505050565b600061158983611abd565b82106115ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c190614b9e565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000601d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff164760405161166b90614bef565b60006040518083038185875af1925050503d80600081146116a8576040519150601f19603f3d011682016040523d82523d6000602084013e6116ad565b606091505b505080915050806116f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ea90614c50565b60405180910390fd5b50565b602060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61173783838360405180602001604052806000815250612271565b505050565b6060600061174983611abd565b905060008167ffffffffffffffff811115611767576117666140a6565b5b6040519080825280602002602001820160405280156117955781602001602082028036833780820191505090505b50905060005b828110156117df576117ad858261157e565b8282815181106117c0576117bf614ab5565b5b60200260200101818152505080806117d790614ae4565b91505061179b565b508092505050919050565b6117f26126b5565b8060118190555050565b6000611806610fe8565b8210611847576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183e90614ce2565b60405180910390fd5b6008828154811061185b5761185a614ab5565b5b90600052602060002001549050919050565b6118756126b5565b80600f90816118849190614ea4565b5050565b601d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601860009054906101000a900460ff1681565b602160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e5481565b6000806118f983612bd7565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361196a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196190614fc2565b60405180910390fd5b80915050919050565b60145481565b6119816126b5565b60008290505b818111611a115760c88111156119d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c99061502e565b60405180910390fd5b6119fe601d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682612c14565b8080611a0990614ae4565b915050611987565b505050565b600080602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401611a749190613f07565b602060405180830381865afa158015611a91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ab591906148b9565b119050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611b2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b24906150c0565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611b7c6126b5565b611b866000612c32565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b601a80549050601c5410611bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf29061512c565b60405180910390fd5b600081601c54611c0b919061514c565b9050601a80549050811115611c2357601a8054905090505b6000611c2d610fe8565b90505b81601c541015611d1c576000600190505b601b601c5481548110611c5757611c56614ab5565b5b90600052602060002001548111611cd057611cbd601a601c5481548110611c8157611c80614ab5565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168284611cb8919061514c565b612c14565b8080611cc890614ae4565b915050611c41565b50601b601c5481548110611ce757611ce6614ab5565b5b906000526020600020015481611cfd919061514c565b9050601c6000815480929190611d1290614ae4565b9190505550611c30565b505050565b600080601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401611d7f9190613f07565b602060405180830381865afa158015611d9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dc091906148b9565b119050919050565b606060018054611dd79061474f565b80601f0160208091040260200160405190810160405280929190818152602001828054611e039061474f565b8015611e505780601f10611e2557610100808354040283529160200191611e50565b820191906000526020600020905b815481529060010190602001808311611e3357829003601f168201915b5050505050905090565b602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611e88612cf8565b601860009054906101000a900460ff1615611ed8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ecf906151cc565b60405180910390fd5b6000600e5411611f1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1490615238565b60405180910390fd5b6001600e5403611fb057611f3033611d21565b80611f405750611f3f33612411565b5b80611f505750611f4f33611304565b5b80611f605750611f5f33610ff5565b5b80611f705750611f6f33611a16565b5b611faf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa6906152ca565b60405180910390fd5b5b6001600e5414611fc1576004611fc4565b60025b60ff1681601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612012919061514c565b1115612053576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204a90615336565b60405180910390fd5b60008111612096576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208d906153a2565b60405180910390fd5b60006120a0610fe8565b905060c882826120b0919061514c565b11156120f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e89061540e565b60405180910390fd5b6000601154905061210133611d21565b1561210c5760125490505b61211533611304565b156121205760145490505b61212933612411565b156121345760135490505b61213d33610ff5565b156121485760155490505b61215133611a16565b1561215c5760165490505b828161216891906149a7565b3410156121aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a19061547a565b60405180910390fd5b60005b838110156121eb576121bf6017612d47565b60006121cb6017612d5d565b90506121d73382612c14565b5080806121e390614ae4565b9150506121ad565b5082601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461223b919061514c565b92505081905550505061224c612d6b565b50565b60125481565b61226761226061277e565b8383612d75565b5050565b60135481565b61228261227c61277e565b8361283f565b6122c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b890614958565b60405180910390fd5b6122cd84848484612ee1565b50505050565b601080546122e09061474f565b80601f016020809104026020016040519081016040528092919081815260200182805461230c9061474f565b80156123595780601f1061232e57610100808354040283529160200191612359565b820191906000526020600020905b81548152906001019060200180831161233c57829003601f168201915b505050505081565b606061236c82612f3d565b6123ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a29061550c565b60405180910390fd5b60006123b5612f7e565b905060008151116123d55760405180602001604052806000815250612403565b806123df84613010565b60106040516020016123f3939291906155eb565b6040516020818303038152906040525b915050919050565b601c5481565b600080601f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b815260040161246f9190613f07565b602060405180830381865afa15801561248c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124b091906148b9565b119050919050565b60c881565b6124c56126b5565b80601090816124d49190614ea4565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61259a6126b5565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612609576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126009061568e565b60405180910390fd5b61261281612c32565b50565b601f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806126ae57506126ad826130de565b5b9050919050565b6126bd61277e565b73ffffffffffffffffffffffffffffffffffffffff166126db611b88565b73ffffffffffffffffffffffffffffffffffffffff1614612731576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612728906156fa565b60405180910390fd5b565b61273c81612f3d565b61277b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277290614fc2565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166127f9836118ed565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061284b836118ed565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061288d575061288c81856124d8565b5b806128cb57508373ffffffffffffffffffffffffffffffffffffffff166128b384610e6d565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166128f4826118ed565b73ffffffffffffffffffffffffffffffffffffffff161461294a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129419061578c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036129b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129b09061581e565b60405180910390fd5b6129c68383836001613158565b8273ffffffffffffffffffffffffffffffffffffffff166129e6826118ed565b73ffffffffffffffffffffffffffffffffffffffff1614612a3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a339061578c565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612bc883838360016132b6565b505050565b6000612710905090565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b612c2e8282604051806020016040528060008152506132bc565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6002600b5403612d3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d349061588a565b60405180910390fd5b6002600b81905550565b6001816000016000828254019250508190555050565b600081600001549050919050565b6001600b81905550565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612de3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dda906158f6565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612ed49190613d3d565b60405180910390a3505050565b612eec8484846128d4565b612ef884848484613317565b612f37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2e90615988565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff16612f5f83612bd7565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600f8054612f8d9061474f565b80601f0160208091040260200160405190810160405280929190818152602001828054612fb99061474f565b80156130065780601f10612fdb57610100808354040283529160200191613006565b820191906000526020600020905b815481529060010190602001808311612fe957829003601f168201915b5050505050905090565b60606000600161301f8461349e565b01905060008167ffffffffffffffff81111561303e5761303d6140a6565b5b6040519080825280601f01601f1916602001820160405280156130705781602001600182028036833780820191505090505b509050600082602001820190505b6001156130d3578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816130c7576130c66149e9565b5b0494506000850361307e575b819350505050919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806131515750613150826135f1565b5b9050919050565b613164848484846136d3565b60018111156131a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319f90615a1a565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036131ef576131ea816136d9565b61322e565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161461322d5761322c8582613722565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036132705761326b8161388f565b6132af565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146132ae576132ad8482613960565b5b5b5050505050565b50505050565b6132c683836139df565b6132d36000848484613317565b613312576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161330990615988565b60405180910390fd5b505050565b60006133388473ffffffffffffffffffffffffffffffffffffffff16613bfc565b15613491578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261336161277e565b8786866040518563ffffffff1660e01b81526004016133839493929190615a8f565b6020604051808303816000875af19250505080156133bf57506040513d601f19601f820116820180604052508101906133bc9190615af0565b60015b613441573d80600081146133ef576040519150601f19603f3d011682016040523d82523d6000602084013e6133f4565b606091505b506000815103613439576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343090615988565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613496565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106134fc577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816134f2576134f16149e9565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310613539576d04ee2d6d415b85acef8100000000838161352f5761352e6149e9565b5b0492506020810190505b662386f26fc10000831061356857662386f26fc10000838161355e5761355d6149e9565b5b0492506010810190505b6305f5e1008310613591576305f5e1008381613587576135866149e9565b5b0492506008810190505b61271083106135b65761271083816135ac576135ab6149e9565b5b0492506004810190505b606483106135d957606483816135cf576135ce6149e9565b5b0492506002810190505b600a83106135e8576001810190505b80915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806136bc57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806136cc57506136cb82613c1f565b5b9050919050565b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161372f84611abd565b6137399190615b1d565b905060006007600084815260200190815260200160002054905081811461381e576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506138a39190615b1d565b90506000600960008481526020019081526020016000205490506000600883815481106138d3576138d2614ab5565b5b9060005260206000200154905080600883815481106138f5576138f4614ab5565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061394457613943615b51565b5b6001900381819060005260206000200160009055905550505050565b600061396b83611abd565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613a4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a4590615bcc565b60405180910390fd5b613a5781612f3d565b15613a97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a8e90615c38565b60405180910390fd5b613aa5600083836001613158565b613aae81612f3d565b15613aee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ae590615c38565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613bf86000838360016132b6565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613cd281613c9d565b8114613cdd57600080fd5b50565b600081359050613cef81613cc9565b92915050565b600060208284031215613d0b57613d0a613c93565b5b6000613d1984828501613ce0565b91505092915050565b60008115159050919050565b613d3781613d22565b82525050565b6000602082019050613d526000830184613d2e565b92915050565b613d6181613d22565b8114613d6c57600080fd5b50565b600081359050613d7e81613d58565b92915050565b600060208284031215613d9a57613d99613c93565b5b6000613da884828501613d6f565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613deb578082015181840152602081019050613dd0565b60008484015250505050565b6000601f19601f8301169050919050565b6000613e1382613db1565b613e1d8185613dbc565b9350613e2d818560208601613dcd565b613e3681613df7565b840191505092915050565b60006020820190508181036000830152613e5b8184613e08565b905092915050565b6000819050919050565b613e7681613e63565b8114613e8157600080fd5b50565b600081359050613e9381613e6d565b92915050565b600060208284031215613eaf57613eae613c93565b5b6000613ebd84828501613e84565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613ef182613ec6565b9050919050565b613f0181613ee6565b82525050565b6000602082019050613f1c6000830184613ef8565b92915050565b613f2b81613ee6565b8114613f3657600080fd5b50565b600081359050613f4881613f22565b92915050565b60008060408385031215613f6557613f64613c93565b5b6000613f7385828601613f39565b9250506020613f8485828601613e84565b9150509250929050565b613f9781613e63565b82525050565b6000602082019050613fb26000830184613f8e565b92915050565b600060208284031215613fce57613fcd613c93565b5b6000613fdc84828501613f39565b91505092915050565b600080600060608486031215613ffe57613ffd613c93565b5b600061400c86828701613f39565b935050602061401d86828701613f39565b925050604061402e86828701613e84565b9150509250925092565b6000806040838503121561404f5761404e613c93565b5b600061405d85828601613e84565b925050602061406e85828601613e84565b9150509250929050565b600060408201905061408d6000830185613ef8565b61409a6020830184613f8e565b9392505050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6140de82613df7565b810181811067ffffffffffffffff821117156140fd576140fc6140a6565b5b80604052505050565b6000614110613c89565b905061411c82826140d5565b919050565b600067ffffffffffffffff82111561413c5761413b6140a6565b5b602082029050602081019050919050565b600080fd5b600061416561416084614121565b614106565b905080838252602082019050602084028301858111156141885761418761414d565b5b835b818110156141b1578061419d8882613f39565b84526020840193505060208101905061418a565b5050509392505050565b600082601f8301126141d0576141cf6140a1565b5b81356141e0848260208601614152565b91505092915050565b600067ffffffffffffffff821115614204576142036140a6565b5b602082029050602081019050919050565b6000614228614223846141e9565b614106565b9050808382526020820190506020840283018581111561424b5761424a61414d565b5b835b8181101561427457806142608882613e84565b84526020840193505060208101905061424d565b5050509392505050565b600082601f830112614293576142926140a1565b5b81356142a3848260208601614215565b91505092915050565b600080604083850312156142c3576142c2613c93565b5b600083013567ffffffffffffffff8111156142e1576142e0613c98565b5b6142ed858286016141bb565b925050602083013567ffffffffffffffff81111561430e5761430d613c98565b5b61431a8582860161427e565b9150509250929050565b6000819050919050565b600061434961434461433f84613ec6565b614324565b613ec6565b9050919050565b600061435b8261432e565b9050919050565b600061436d82614350565b9050919050565b61437d81614362565b82525050565b60006020820190506143986000830184614374565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6143d381613e63565b82525050565b60006143e583836143ca565b60208301905092915050565b6000602082019050919050565b60006144098261439e565b61441381856143a9565b935061441e836143ba565b8060005b8381101561444f57815161443688826143d9565b9750614441836143f1565b925050600181019050614422565b5085935050505092915050565b6000602082019050818103600083015261447681846143fe565b905092915050565b600080fd5b600067ffffffffffffffff82111561449e5761449d6140a6565b5b6144a782613df7565b9050602081019050919050565b82818337600083830152505050565b60006144d66144d184614483565b614106565b9050828152602081018484840111156144f2576144f161447e565b5b6144fd8482856144b4565b509392505050565b600082601f83011261451a576145196140a1565b5b813561452a8482602086016144c3565b91505092915050565b60006020828403121561454957614548613c93565b5b600082013567ffffffffffffffff81111561456757614566613c98565b5b61457384828501614505565b91505092915050565b6000806040838503121561459357614592613c93565b5b60006145a185828601613f39565b92505060206145b285828601613d6f565b9150509250929050565b600067ffffffffffffffff8211156145d7576145d66140a6565b5b6145e082613df7565b9050602081019050919050565b60006146006145fb846145bc565b614106565b90508281526020810184848401111561461c5761461b61447e565b5b6146278482856144b4565b509392505050565b600082601f830112614644576146436140a1565b5b81356146548482602086016145ed565b91505092915050565b6000806000806080858703121561467757614676613c93565b5b600061468587828801613f39565b945050602061469687828801613f39565b93505060406146a787828801613e84565b925050606085013567ffffffffffffffff8111156146c8576146c7613c98565b5b6146d48782880161462f565b91505092959194509250565b600080604083850312156146f7576146f6613c93565b5b600061470585828601613f39565b925050602061471685828601613f39565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061476757607f821691505b60208210810361477a57614779614720565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006147dc602183613dbc565b91506147e782614780565b604082019050919050565b6000602082019050818103600083015261480b816147cf565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b600061486e603d83613dbc565b915061487982614812565b604082019050919050565b6000602082019050818103600083015261489d81614861565b9050919050565b6000815190506148b381613e6d565b92915050565b6000602082840312156148cf576148ce613c93565b5b60006148dd848285016148a4565b91505092915050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000614942602d83613dbc565b915061494d826148e6565b604082019050919050565b6000602082019050818103600083015261497181614935565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006149b282613e63565b91506149bd83613e63565b92508282026149cb81613e63565b915082820484148315176149e2576149e1614978565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614a2382613e63565b9150614a2e83613e63565b925082614a3e57614a3d6149e9565b5b828204905092915050565b7f496e7075742044617461206572726f7200000000000000000000000000000000600082015250565b6000614a7f601083613dbc565b9150614a8a82614a49565b602082019050919050565b60006020820190508181036000830152614aae81614a72565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614aef82613e63565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614b2157614b20614978565b5b600182019050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000614b88602b83613dbc565b9150614b9382614b2c565b604082019050919050565b60006020820190508181036000830152614bb781614b7b565b9050919050565b600081905092915050565b50565b6000614bd9600083614bbe565b9150614be482614bc9565b600082019050919050565b6000614bfa82614bcc565b9150819050919050565b7f53656e64696e672063726f206661696c65640000000000000000000000000000600082015250565b6000614c3a601283613dbc565b9150614c4582614c04565b602082019050919050565b60006020820190508181036000830152614c6981614c2d565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000614ccc602c83613dbc565b9150614cd782614c70565b604082019050919050565b60006020820190508181036000830152614cfb81614cbf565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302614d647fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614d27565b614d6e8683614d27565b95508019841693508086168417925050509392505050565b6000614da1614d9c614d9784613e63565b614324565b613e63565b9050919050565b6000819050919050565b614dbb83614d86565b614dcf614dc782614da8565b848454614d34565b825550505050565b600090565b614de4614dd7565b614def818484614db2565b505050565b5b81811015614e1357614e08600082614ddc565b600181019050614df5565b5050565b601f821115614e5857614e2981614d02565b614e3284614d17565b81016020851015614e41578190505b614e55614e4d85614d17565b830182614df4565b50505b505050565b600082821c905092915050565b6000614e7b60001984600802614e5d565b1980831691505092915050565b6000614e948383614e6a565b9150826002028217905092915050565b614ead82613db1565b67ffffffffffffffff811115614ec657614ec56140a6565b5b614ed0825461474f565b614edb828285614e17565b600060209050601f831160018114614f0e5760008415614efc578287015190505b614f068582614e88565b865550614f6e565b601f198416614f1c86614d02565b60005b82811015614f4457848901518255600182019150602085019450602081019050614f1f565b86831015614f615784890151614f5d601f891682614e6a565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000614fac601883613dbc565b9150614fb782614f76565b602082019050919050565b60006020820190508181036000830152614fdb81614f9f565b9050919050565b7f496e76616c696420746f6b656e20494400000000000000000000000000000000600082015250565b6000615018601083613dbc565b915061502382614fe2565b602082019050919050565b600060208201905081810360008301526150478161500b565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006150aa602983613dbc565b91506150b58261504e565b604082019050919050565b600060208201905081810360008301526150d98161509d565b9050919050565b7f4e6f6e65206c65667420746f2061697264726f70000000000000000000000000600082015250565b6000615116601483613dbc565b9150615121826150e0565b602082019050919050565b6000602082019050818103600083015261514581615109565b9050919050565b600061515782613e63565b915061516283613e63565b925082820190508082111561517a57615179614978565b5b92915050565b7f4d696e7420697320706175736564000000000000000000000000000000000000600082015250565b60006151b6600e83613dbc565b91506151c182615180565b602082019050919050565b600060208201905081810360008301526151e5816151a9565b9050919050565b7f4d696e7420686173206e6f742073746172746564000000000000000000000000600082015250565b6000615222601483613dbc565b915061522d826151ec565b602082019050919050565b6000602082019050818103600083015261525181615215565b9050919050565b7f46726565206d696e74206f6e6c7920666f722043726f676e6f6d65204e46542060008201527f436f6d6d756e6974790000000000000000000000000000000000000000000000602082015250565b60006152b4602983613dbc565b91506152bf82615258565b604082019050919050565b600060208201905081810360008301526152e3816152a7565b9050919050565b7f45786365656473206d6178206d696e7461626c65206e66747300000000000000600082015250565b6000615320601983613dbc565b915061532b826152ea565b602082019050919050565b6000602082019050818103600083015261534f81615313565b9050919050565b7f616d6f756e742063616e2774206265207a65726f000000000000000000000000600082015250565b600061538c601483613dbc565b915061539782615356565b602082019050919050565b600060208201905081810360008301526153bb8161537f565b9050919050565b7f4d617820737570706c7920657863656564656400000000000000000000000000600082015250565b60006153f8601383613dbc565b9150615403826153c2565b602082019050919050565b60006020820190508181036000830152615427816153eb565b9050919050565b7f696e73756666696369656e742066756e64730000000000000000000000000000600082015250565b6000615464601283613dbc565b915061546f8261542e565b602082019050919050565b6000602082019050818103600083015261549381615457565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006154f6602f83613dbc565b91506155018261549a565b604082019050919050565b60006020820190508181036000830152615525816154e9565b9050919050565b600081905092915050565b600061554282613db1565b61554c818561552c565b935061555c818560208601613dcd565b80840191505092915050565b600081546155758161474f565b61557f818661552c565b9450600182166000811461559a57600181146155af576155e2565b60ff19831686528115158202860193506155e2565b6155b885614d02565b60005b838110156155da578154818901526001820191506020810190506155bb565b838801955050505b50505092915050565b60006155f78286615537565b91506156038285615537565b915061560f8284615568565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615678602683613dbc565b91506156838261561c565b604082019050919050565b600060208201905081810360008301526156a78161566b565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006156e4602083613dbc565b91506156ef826156ae565b602082019050919050565b60006020820190508181036000830152615713816156d7565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000615776602583613dbc565b91506157818261571a565b604082019050919050565b600060208201905081810360008301526157a581615769565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000615808602483613dbc565b9150615813826157ac565b604082019050919050565b60006020820190508181036000830152615837816157fb565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000615874601f83613dbc565b915061587f8261583e565b602082019050919050565b600060208201905081810360008301526158a381615867565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006158e0601983613dbc565b91506158eb826158aa565b602082019050919050565b6000602082019050818103600083015261590f816158d3565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000615972603283613dbc565b915061597d82615916565b604082019050919050565b600060208201905081810360008301526159a181615965565b9050919050565b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b6000615a04603583613dbc565b9150615a0f826159a8565b604082019050919050565b60006020820190508181036000830152615a33816159f7565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000615a6182615a3a565b615a6b8185615a45565b9350615a7b818560208601613dcd565b615a8481613df7565b840191505092915050565b6000608082019050615aa46000830187613ef8565b615ab16020830186613ef8565b615abe6040830185613f8e565b8181036060830152615ad08184615a56565b905095945050505050565b600081519050615aea81613cc9565b92915050565b600060208284031215615b0657615b05613c93565b5b6000615b1484828501615adb565b91505092915050565b6000615b2882613e63565b9150615b3383613e63565b9250828203905081811115615b4b57615b4a614978565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000615bb6602083613dbc565b9150615bc182615b80565b602082019050919050565b60006020820190508181036000830152615be581615ba9565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615c22601c83613dbc565b9150615c2d82615bec565b602082019050919050565b60006020820190508181036000830152615c5181615c15565b905091905056fea26469706673582212201e52e4e63b324c0197f3ecc5e8152796e54226b38ae6ee545b02410bababefac64736f6c6343000811003300000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000de56d1c3e5b9e8e4f12533c1e64d4f6b7eee701e0000000000000000000000009ae196176b528680b75c7aea2fbd72456fdfae17000000000000000000000000aef47406e93a6c67ada8bdd194ee4d27e4bc05d7000000000000000000000000a304781f2c47f20a8a567458b2b0cea48b30220f00000000000000000000000000095839d3b6ea654a3bf46b77886e749e16dc86000000000000000000000000000000000000000000000000000000000000004468747470733a2f2f697066732e696f2f697066732f516d514e543454774d783662456666506f4e66513132647a4554365232644277376469707a726b533635313577642f00000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061036b5760003560e01c80635f32b6c4116101c6578063a1b9023d116100f7578063d215086111610095578063e985e9c51161006f578063e985e9c514610cd6578063ee39829514610d13578063f2fde38b14610d3e578063f889a2fa14610d675761036b565b8063d215086114610c45578063d5abeb0114610c82578063da3ef23f14610cad5761036b565b8063b88d4fde116100d1578063b88d4fde14610b89578063c668286214610bb2578063c87b56dd14610bdd578063c912696c14610c1a5761036b565b8063a1b9023d14610b0a578063a22cb46514610b35578063b2ea454014610b5e5761036b565b8063715018a6116101645780639294614a1161013e5780639294614a14610a5b57806395d89b4114610a985780639a30e5b314610ac3578063a0712d6814610aee5761036b565b8063715018a6146109f05780638da5cb5b14610a075780638e79401314610a325761036b565b80636499d87a116101a05780636499d87a1461092257806369b5b29c1461094d5780636ba7dda41461097657806370a08231146109b35761036b565b80635f32b6c41461088f578063603f4d52146108ba5780636352211e146108e55761036b565b80632a55205a116102a057806342842e0e1161023e5780634f6ccce7116102185780634f6ccce7146107d357806355f804b31461081057806359927044146108395780635c975abb146108645761036b565b806342842e0e14610744578063438b63001461076d57806344a0d68a146107aa5761036b565b80632d35b7951161027a5780632d35b7951461069c5780632f745c59146106c55780633ccfd60b146107025780633f065d06146107195761036b565b80632a55205a146105e45780632a735147146106225780632acc659e1461065f5761036b565b80630ce69e901161030d5780631b294a2c116102e75780631b294a2c146105165780631e7269c51461055357806323b872dd1461059057806328b5c186146105b95761036b565b80630ce69e901461049557806313faede6146104c057806318160ddd146104eb5761036b565b806306fdde031161034957806306fdde03146103ed578063081812fc14610418578063095ea7b3146104555780630c1c972a1461047e5761036b565b806301ffc9a71461037057806302329a29146103ad57806304c98b2b146103d6575b600080fd5b34801561037c57600080fd5b5061039760048036038101906103929190613cf5565b610d92565b6040516103a49190613d3d565b60405180910390f35b3480156103b957600080fd5b506103d460048036038101906103cf9190613d84565b610da4565b005b3480156103e257600080fd5b506103eb610dc9565b005b3480156103f957600080fd5b50610402610ddb565b60405161040f9190613e41565b60405180910390f35b34801561042457600080fd5b5061043f600480360381019061043a9190613e99565b610e6d565b60405161044c9190613f07565b60405180910390f35b34801561046157600080fd5b5061047c60048036038101906104779190613f4e565b610eb3565b005b34801561048a57600080fd5b50610493610fca565b005b3480156104a157600080fd5b506104aa610fdc565b6040516104b79190613f9d565b60405180910390f35b3480156104cc57600080fd5b506104d5610fe2565b6040516104e29190613f9d565b60405180910390f35b3480156104f757600080fd5b50610500610fe8565b60405161050d9190613f9d565b60405180910390f35b34801561052257600080fd5b5061053d60048036038101906105389190613fb8565b610ff5565b60405161054a9190613d3d565b60405180910390f35b34801561055f57600080fd5b5061057a60048036038101906105759190613fb8565b61109c565b6040516105879190613f9d565b60405180910390f35b34801561059c57600080fd5b506105b760048036038101906105b29190613fe5565b6110b4565b005b3480156105c557600080fd5b506105ce611114565b6040516105db9190613f9d565b60405180910390f35b3480156105f057600080fd5b5061060b60048036038101906106069190614038565b61111a565b604051610619929190614078565b60405180910390f35b34801561062e57600080fd5b5061064960048036038101906106449190613fb8565b611304565b6040516106569190613d3d565b60405180910390f35b34801561066b57600080fd5b5061068660048036038101906106819190613fb8565b6113ab565b6040516106939190613f9d565b60405180910390f35b3480156106a857600080fd5b506106c360048036038101906106be91906142ac565b61144e565b005b3480156106d157600080fd5b506106ec60048036038101906106e79190613f4e565b61157e565b6040516106f99190613f9d565b60405180910390f35b34801561070e57600080fd5b50610717611623565b005b34801561072557600080fd5b5061072e6116f6565b60405161073b9190614383565b60405180910390f35b34801561075057600080fd5b5061076b60048036038101906107669190613fe5565b61171c565b005b34801561077957600080fd5b50610794600480360381019061078f9190613fb8565b61173c565b6040516107a1919061445c565b60405180910390f35b3480156107b657600080fd5b506107d160048036038101906107cc9190613e99565b6117ea565b005b3480156107df57600080fd5b506107fa60048036038101906107f59190613e99565b6117fc565b6040516108079190613f9d565b60405180910390f35b34801561081c57600080fd5b5061083760048036038101906108329190614533565b61186d565b005b34801561084557600080fd5b5061084e611888565b60405161085b9190613f07565b60405180910390f35b34801561087057600080fd5b506108796118ae565b6040516108869190613d3d565b60405180910390f35b34801561089b57600080fd5b506108a46118c1565b6040516108b19190614383565b60405180910390f35b3480156108c657600080fd5b506108cf6118e7565b6040516108dc9190613f9d565b60405180910390f35b3480156108f157600080fd5b5061090c60048036038101906109079190613e99565b6118ed565b6040516109199190613f07565b60405180910390f35b34801561092e57600080fd5b50610937611973565b6040516109449190613f9d565b60405180910390f35b34801561095957600080fd5b50610974600480360381019061096f9190614038565b611979565b005b34801561098257600080fd5b5061099d60048036038101906109989190613fb8565b611a16565b6040516109aa9190613d3d565b60405180910390f35b3480156109bf57600080fd5b506109da60048036038101906109d59190613fb8565b611abd565b6040516109e79190613f9d565b60405180910390f35b3480156109fc57600080fd5b50610a05611b74565b005b348015610a1357600080fd5b50610a1c611b88565b604051610a299190613f07565b60405180910390f35b348015610a3e57600080fd5b50610a596004803603810190610a549190613e99565b611bb2565b005b348015610a6757600080fd5b50610a826004803603810190610a7d9190613fb8565b611d21565b604051610a8f9190613d3d565b60405180910390f35b348015610aa457600080fd5b50610aad611dc8565b604051610aba9190613e41565b60405180910390f35b348015610acf57600080fd5b50610ad8611e5a565b604051610ae59190614383565b60405180910390f35b610b086004803603810190610b039190613e99565b611e80565b005b348015610b1657600080fd5b50610b1f61224f565b604051610b2c9190613f9d565b60405180910390f35b348015610b4157600080fd5b50610b5c6004803603810190610b57919061457c565b612255565b005b348015610b6a57600080fd5b50610b7361226b565b604051610b809190613f9d565b60405180910390f35b348015610b9557600080fd5b50610bb06004803603810190610bab919061465d565b612271565b005b348015610bbe57600080fd5b50610bc76122d3565b604051610bd49190613e41565b60405180910390f35b348015610be957600080fd5b50610c046004803603810190610bff9190613e99565b612361565b604051610c119190613e41565b60405180910390f35b348015610c2657600080fd5b50610c2f61240b565b604051610c3c9190613f9d565b60405180910390f35b348015610c5157600080fd5b50610c6c6004803603810190610c679190613fb8565b612411565b604051610c799190613d3d565b60405180910390f35b348015610c8e57600080fd5b50610c976124b8565b604051610ca49190613f9d565b60405180910390f35b348015610cb957600080fd5b50610cd46004803603810190610ccf9190614533565b6124bd565b005b348015610ce257600080fd5b50610cfd6004803603810190610cf891906146e0565b6124d8565b604051610d0a9190613d3d565b60405180910390f35b348015610d1f57600080fd5b50610d2861256c565b604051610d359190614383565b60405180910390f35b348015610d4a57600080fd5b50610d656004803603810190610d609190613fb8565b612592565b005b348015610d7357600080fd5b50610d7c612615565b604051610d899190614383565b60405180910390f35b6000610d9d8261263b565b9050919050565b610dac6126b5565b80601860006101000a81548160ff02191690831515021790555050565b610dd16126b5565b6001600e81905550565b606060008054610dea9061474f565b80601f0160208091040260200160405190810160405280929190818152602001828054610e169061474f565b8015610e635780601f10610e3857610100808354040283529160200191610e63565b820191906000526020600020905b815481529060010190602001808311610e4657829003601f168201915b5050505050905090565b6000610e7882612733565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ebe826118ed565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610f2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f25906147f2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610f4d61277e565b73ffffffffffffffffffffffffffffffffffffffff161480610f7c5750610f7b81610f7661277e565b6124d8565b5b610fbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb290614884565b60405180910390fd5b610fc58383612786565b505050565b610fd26126b5565b6002600e81905550565b60155481565b60115481565b6000600880549050905090565b600080602160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b81526004016110539190613f07565b602060405180830381865afa158015611070573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109491906148b9565b119050919050565b60196020528060005260406000206000915090505481565b6110c56110bf61277e565b8261283f565b611104576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fb90614958565b60405180910390fd5b61110f8383836128d4565b505050565b60165481565b6000806000600d60008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16036112af57600c6040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b60006112b9612bcd565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff16866112e591906149a7565b6112ef9190614a18565b90508160000151819350935050509250929050565b600080602060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b81526004016113629190613f07565b602060405180830381865afa15801561137f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113a391906148b9565b119050919050565b6000600115156113ba83611d21565b1515036113cb576012549050611449565b600115156113d883611304565b1515036113e9576014549050611449565b600115156113f683612411565b151503611407576013549050611449565b6001151561141483610ff5565b151503611425576015549050611449565b6001151561143283611a16565b151503611443576016549050611449565b60115490505b919050565b6114566126b5565b805182511461149a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149190614a95565b60405180910390fd5b60005b825181101561157957601a8382815181106114bb576114ba614ab5565b5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601b82828151811061153857611537614ab5565b5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190915055808061157190614ae4565b91505061149d565b505050565b600061158983611abd565b82106115ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c190614b9e565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000601d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff164760405161166b90614bef565b60006040518083038185875af1925050503d80600081146116a8576040519150601f19603f3d011682016040523d82523d6000602084013e6116ad565b606091505b505080915050806116f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ea90614c50565b60405180910390fd5b50565b602060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61173783838360405180602001604052806000815250612271565b505050565b6060600061174983611abd565b905060008167ffffffffffffffff811115611767576117666140a6565b5b6040519080825280602002602001820160405280156117955781602001602082028036833780820191505090505b50905060005b828110156117df576117ad858261157e565b8282815181106117c0576117bf614ab5565b5b60200260200101818152505080806117d790614ae4565b91505061179b565b508092505050919050565b6117f26126b5565b8060118190555050565b6000611806610fe8565b8210611847576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183e90614ce2565b60405180910390fd5b6008828154811061185b5761185a614ab5565b5b90600052602060002001549050919050565b6118756126b5565b80600f90816118849190614ea4565b5050565b601d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601860009054906101000a900460ff1681565b602160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e5481565b6000806118f983612bd7565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361196a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196190614fc2565b60405180910390fd5b80915050919050565b60145481565b6119816126b5565b60008290505b818111611a115760c88111156119d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c99061502e565b60405180910390fd5b6119fe601d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682612c14565b8080611a0990614ae4565b915050611987565b505050565b600080602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401611a749190613f07565b602060405180830381865afa158015611a91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ab591906148b9565b119050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611b2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b24906150c0565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611b7c6126b5565b611b866000612c32565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b601a80549050601c5410611bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf29061512c565b60405180910390fd5b600081601c54611c0b919061514c565b9050601a80549050811115611c2357601a8054905090505b6000611c2d610fe8565b90505b81601c541015611d1c576000600190505b601b601c5481548110611c5757611c56614ab5565b5b90600052602060002001548111611cd057611cbd601a601c5481548110611c8157611c80614ab5565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168284611cb8919061514c565b612c14565b8080611cc890614ae4565b915050611c41565b50601b601c5481548110611ce757611ce6614ab5565b5b906000526020600020015481611cfd919061514c565b9050601c6000815480929190611d1290614ae4565b9190505550611c30565b505050565b600080601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401611d7f9190613f07565b602060405180830381865afa158015611d9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dc091906148b9565b119050919050565b606060018054611dd79061474f565b80601f0160208091040260200160405190810160405280929190818152602001828054611e039061474f565b8015611e505780601f10611e2557610100808354040283529160200191611e50565b820191906000526020600020905b815481529060010190602001808311611e3357829003601f168201915b5050505050905090565b602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611e88612cf8565b601860009054906101000a900460ff1615611ed8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ecf906151cc565b60405180910390fd5b6000600e5411611f1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1490615238565b60405180910390fd5b6001600e5403611fb057611f3033611d21565b80611f405750611f3f33612411565b5b80611f505750611f4f33611304565b5b80611f605750611f5f33610ff5565b5b80611f705750611f6f33611a16565b5b611faf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa6906152ca565b60405180910390fd5b5b6001600e5414611fc1576004611fc4565b60025b60ff1681601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612012919061514c565b1115612053576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204a90615336565b60405180910390fd5b60008111612096576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208d906153a2565b60405180910390fd5b60006120a0610fe8565b905060c882826120b0919061514c565b11156120f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e89061540e565b60405180910390fd5b6000601154905061210133611d21565b1561210c5760125490505b61211533611304565b156121205760145490505b61212933612411565b156121345760135490505b61213d33610ff5565b156121485760155490505b61215133611a16565b1561215c5760165490505b828161216891906149a7565b3410156121aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a19061547a565b60405180910390fd5b60005b838110156121eb576121bf6017612d47565b60006121cb6017612d5d565b90506121d73382612c14565b5080806121e390614ae4565b9150506121ad565b5082601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461223b919061514c565b92505081905550505061224c612d6b565b50565b60125481565b61226761226061277e565b8383612d75565b5050565b60135481565b61228261227c61277e565b8361283f565b6122c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b890614958565b60405180910390fd5b6122cd84848484612ee1565b50505050565b601080546122e09061474f565b80601f016020809104026020016040519081016040528092919081815260200182805461230c9061474f565b80156123595780601f1061232e57610100808354040283529160200191612359565b820191906000526020600020905b81548152906001019060200180831161233c57829003601f168201915b505050505081565b606061236c82612f3d565b6123ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a29061550c565b60405180910390fd5b60006123b5612f7e565b905060008151116123d55760405180602001604052806000815250612403565b806123df84613010565b60106040516020016123f3939291906155eb565b6040516020818303038152906040525b915050919050565b601c5481565b600080601f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b815260040161246f9190613f07565b602060405180830381865afa15801561248c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124b091906148b9565b119050919050565b60c881565b6124c56126b5565b80601090816124d49190614ea4565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61259a6126b5565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612609576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126009061568e565b60405180910390fd5b61261281612c32565b50565b601f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806126ae57506126ad826130de565b5b9050919050565b6126bd61277e565b73ffffffffffffffffffffffffffffffffffffffff166126db611b88565b73ffffffffffffffffffffffffffffffffffffffff1614612731576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612728906156fa565b60405180910390fd5b565b61273c81612f3d565b61277b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277290614fc2565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166127f9836118ed565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061284b836118ed565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061288d575061288c81856124d8565b5b806128cb57508373ffffffffffffffffffffffffffffffffffffffff166128b384610e6d565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166128f4826118ed565b73ffffffffffffffffffffffffffffffffffffffff161461294a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129419061578c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036129b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129b09061581e565b60405180910390fd5b6129c68383836001613158565b8273ffffffffffffffffffffffffffffffffffffffff166129e6826118ed565b73ffffffffffffffffffffffffffffffffffffffff1614612a3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a339061578c565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612bc883838360016132b6565b505050565b6000612710905090565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b612c2e8282604051806020016040528060008152506132bc565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6002600b5403612d3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d349061588a565b60405180910390fd5b6002600b81905550565b6001816000016000828254019250508190555050565b600081600001549050919050565b6001600b81905550565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612de3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dda906158f6565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612ed49190613d3d565b60405180910390a3505050565b612eec8484846128d4565b612ef884848484613317565b612f37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2e90615988565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff16612f5f83612bd7565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600f8054612f8d9061474f565b80601f0160208091040260200160405190810160405280929190818152602001828054612fb99061474f565b80156130065780601f10612fdb57610100808354040283529160200191613006565b820191906000526020600020905b815481529060010190602001808311612fe957829003601f168201915b5050505050905090565b60606000600161301f8461349e565b01905060008167ffffffffffffffff81111561303e5761303d6140a6565b5b6040519080825280601f01601f1916602001820160405280156130705781602001600182028036833780820191505090505b509050600082602001820190505b6001156130d3578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816130c7576130c66149e9565b5b0494506000850361307e575b819350505050919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806131515750613150826135f1565b5b9050919050565b613164848484846136d3565b60018111156131a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319f90615a1a565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036131ef576131ea816136d9565b61322e565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161461322d5761322c8582613722565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036132705761326b8161388f565b6132af565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146132ae576132ad8482613960565b5b5b5050505050565b50505050565b6132c683836139df565b6132d36000848484613317565b613312576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161330990615988565b60405180910390fd5b505050565b60006133388473ffffffffffffffffffffffffffffffffffffffff16613bfc565b15613491578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261336161277e565b8786866040518563ffffffff1660e01b81526004016133839493929190615a8f565b6020604051808303816000875af19250505080156133bf57506040513d601f19601f820116820180604052508101906133bc9190615af0565b60015b613441573d80600081146133ef576040519150601f19603f3d011682016040523d82523d6000602084013e6133f4565b606091505b506000815103613439576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343090615988565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613496565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106134fc577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816134f2576134f16149e9565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310613539576d04ee2d6d415b85acef8100000000838161352f5761352e6149e9565b5b0492506020810190505b662386f26fc10000831061356857662386f26fc10000838161355e5761355d6149e9565b5b0492506010810190505b6305f5e1008310613591576305f5e1008381613587576135866149e9565b5b0492506008810190505b61271083106135b65761271083816135ac576135ab6149e9565b5b0492506004810190505b606483106135d957606483816135cf576135ce6149e9565b5b0492506002810190505b600a83106135e8576001810190505b80915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806136bc57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806136cc57506136cb82613c1f565b5b9050919050565b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161372f84611abd565b6137399190615b1d565b905060006007600084815260200190815260200160002054905081811461381e576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506138a39190615b1d565b90506000600960008481526020019081526020016000205490506000600883815481106138d3576138d2614ab5565b5b9060005260206000200154905080600883815481106138f5576138f4614ab5565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061394457613943615b51565b5b6001900381819060005260206000200160009055905550505050565b600061396b83611abd565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613a4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a4590615bcc565b60405180910390fd5b613a5781612f3d565b15613a97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a8e90615c38565b60405180910390fd5b613aa5600083836001613158565b613aae81612f3d565b15613aee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ae590615c38565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613bf86000838360016132b6565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613cd281613c9d565b8114613cdd57600080fd5b50565b600081359050613cef81613cc9565b92915050565b600060208284031215613d0b57613d0a613c93565b5b6000613d1984828501613ce0565b91505092915050565b60008115159050919050565b613d3781613d22565b82525050565b6000602082019050613d526000830184613d2e565b92915050565b613d6181613d22565b8114613d6c57600080fd5b50565b600081359050613d7e81613d58565b92915050565b600060208284031215613d9a57613d99613c93565b5b6000613da884828501613d6f565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613deb578082015181840152602081019050613dd0565b60008484015250505050565b6000601f19601f8301169050919050565b6000613e1382613db1565b613e1d8185613dbc565b9350613e2d818560208601613dcd565b613e3681613df7565b840191505092915050565b60006020820190508181036000830152613e5b8184613e08565b905092915050565b6000819050919050565b613e7681613e63565b8114613e8157600080fd5b50565b600081359050613e9381613e6d565b92915050565b600060208284031215613eaf57613eae613c93565b5b6000613ebd84828501613e84565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613ef182613ec6565b9050919050565b613f0181613ee6565b82525050565b6000602082019050613f1c6000830184613ef8565b92915050565b613f2b81613ee6565b8114613f3657600080fd5b50565b600081359050613f4881613f22565b92915050565b60008060408385031215613f6557613f64613c93565b5b6000613f7385828601613f39565b9250506020613f8485828601613e84565b9150509250929050565b613f9781613e63565b82525050565b6000602082019050613fb26000830184613f8e565b92915050565b600060208284031215613fce57613fcd613c93565b5b6000613fdc84828501613f39565b91505092915050565b600080600060608486031215613ffe57613ffd613c93565b5b600061400c86828701613f39565b935050602061401d86828701613f39565b925050604061402e86828701613e84565b9150509250925092565b6000806040838503121561404f5761404e613c93565b5b600061405d85828601613e84565b925050602061406e85828601613e84565b9150509250929050565b600060408201905061408d6000830185613ef8565b61409a6020830184613f8e565b9392505050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6140de82613df7565b810181811067ffffffffffffffff821117156140fd576140fc6140a6565b5b80604052505050565b6000614110613c89565b905061411c82826140d5565b919050565b600067ffffffffffffffff82111561413c5761413b6140a6565b5b602082029050602081019050919050565b600080fd5b600061416561416084614121565b614106565b905080838252602082019050602084028301858111156141885761418761414d565b5b835b818110156141b1578061419d8882613f39565b84526020840193505060208101905061418a565b5050509392505050565b600082601f8301126141d0576141cf6140a1565b5b81356141e0848260208601614152565b91505092915050565b600067ffffffffffffffff821115614204576142036140a6565b5b602082029050602081019050919050565b6000614228614223846141e9565b614106565b9050808382526020820190506020840283018581111561424b5761424a61414d565b5b835b8181101561427457806142608882613e84565b84526020840193505060208101905061424d565b5050509392505050565b600082601f830112614293576142926140a1565b5b81356142a3848260208601614215565b91505092915050565b600080604083850312156142c3576142c2613c93565b5b600083013567ffffffffffffffff8111156142e1576142e0613c98565b5b6142ed858286016141bb565b925050602083013567ffffffffffffffff81111561430e5761430d613c98565b5b61431a8582860161427e565b9150509250929050565b6000819050919050565b600061434961434461433f84613ec6565b614324565b613ec6565b9050919050565b600061435b8261432e565b9050919050565b600061436d82614350565b9050919050565b61437d81614362565b82525050565b60006020820190506143986000830184614374565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6143d381613e63565b82525050565b60006143e583836143ca565b60208301905092915050565b6000602082019050919050565b60006144098261439e565b61441381856143a9565b935061441e836143ba565b8060005b8381101561444f57815161443688826143d9565b9750614441836143f1565b925050600181019050614422565b5085935050505092915050565b6000602082019050818103600083015261447681846143fe565b905092915050565b600080fd5b600067ffffffffffffffff82111561449e5761449d6140a6565b5b6144a782613df7565b9050602081019050919050565b82818337600083830152505050565b60006144d66144d184614483565b614106565b9050828152602081018484840111156144f2576144f161447e565b5b6144fd8482856144b4565b509392505050565b600082601f83011261451a576145196140a1565b5b813561452a8482602086016144c3565b91505092915050565b60006020828403121561454957614548613c93565b5b600082013567ffffffffffffffff81111561456757614566613c98565b5b61457384828501614505565b91505092915050565b6000806040838503121561459357614592613c93565b5b60006145a185828601613f39565b92505060206145b285828601613d6f565b9150509250929050565b600067ffffffffffffffff8211156145d7576145d66140a6565b5b6145e082613df7565b9050602081019050919050565b60006146006145fb846145bc565b614106565b90508281526020810184848401111561461c5761461b61447e565b5b6146278482856144b4565b509392505050565b600082601f830112614644576146436140a1565b5b81356146548482602086016145ed565b91505092915050565b6000806000806080858703121561467757614676613c93565b5b600061468587828801613f39565b945050602061469687828801613f39565b93505060406146a787828801613e84565b925050606085013567ffffffffffffffff8111156146c8576146c7613c98565b5b6146d48782880161462f565b91505092959194509250565b600080604083850312156146f7576146f6613c93565b5b600061470585828601613f39565b925050602061471685828601613f39565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061476757607f821691505b60208210810361477a57614779614720565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006147dc602183613dbc565b91506147e782614780565b604082019050919050565b6000602082019050818103600083015261480b816147cf565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b600061486e603d83613dbc565b915061487982614812565b604082019050919050565b6000602082019050818103600083015261489d81614861565b9050919050565b6000815190506148b381613e6d565b92915050565b6000602082840312156148cf576148ce613c93565b5b60006148dd848285016148a4565b91505092915050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000614942602d83613dbc565b915061494d826148e6565b604082019050919050565b6000602082019050818103600083015261497181614935565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006149b282613e63565b91506149bd83613e63565b92508282026149cb81613e63565b915082820484148315176149e2576149e1614978565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614a2382613e63565b9150614a2e83613e63565b925082614a3e57614a3d6149e9565b5b828204905092915050565b7f496e7075742044617461206572726f7200000000000000000000000000000000600082015250565b6000614a7f601083613dbc565b9150614a8a82614a49565b602082019050919050565b60006020820190508181036000830152614aae81614a72565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614aef82613e63565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614b2157614b20614978565b5b600182019050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000614b88602b83613dbc565b9150614b9382614b2c565b604082019050919050565b60006020820190508181036000830152614bb781614b7b565b9050919050565b600081905092915050565b50565b6000614bd9600083614bbe565b9150614be482614bc9565b600082019050919050565b6000614bfa82614bcc565b9150819050919050565b7f53656e64696e672063726f206661696c65640000000000000000000000000000600082015250565b6000614c3a601283613dbc565b9150614c4582614c04565b602082019050919050565b60006020820190508181036000830152614c6981614c2d565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000614ccc602c83613dbc565b9150614cd782614c70565b604082019050919050565b60006020820190508181036000830152614cfb81614cbf565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302614d647fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614d27565b614d6e8683614d27565b95508019841693508086168417925050509392505050565b6000614da1614d9c614d9784613e63565b614324565b613e63565b9050919050565b6000819050919050565b614dbb83614d86565b614dcf614dc782614da8565b848454614d34565b825550505050565b600090565b614de4614dd7565b614def818484614db2565b505050565b5b81811015614e1357614e08600082614ddc565b600181019050614df5565b5050565b601f821115614e5857614e2981614d02565b614e3284614d17565b81016020851015614e41578190505b614e55614e4d85614d17565b830182614df4565b50505b505050565b600082821c905092915050565b6000614e7b60001984600802614e5d565b1980831691505092915050565b6000614e948383614e6a565b9150826002028217905092915050565b614ead82613db1565b67ffffffffffffffff811115614ec657614ec56140a6565b5b614ed0825461474f565b614edb828285614e17565b600060209050601f831160018114614f0e5760008415614efc578287015190505b614f068582614e88565b865550614f6e565b601f198416614f1c86614d02565b60005b82811015614f4457848901518255600182019150602085019450602081019050614f1f565b86831015614f615784890151614f5d601f891682614e6a565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000614fac601883613dbc565b9150614fb782614f76565b602082019050919050565b60006020820190508181036000830152614fdb81614f9f565b9050919050565b7f496e76616c696420746f6b656e20494400000000000000000000000000000000600082015250565b6000615018601083613dbc565b915061502382614fe2565b602082019050919050565b600060208201905081810360008301526150478161500b565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006150aa602983613dbc565b91506150b58261504e565b604082019050919050565b600060208201905081810360008301526150d98161509d565b9050919050565b7f4e6f6e65206c65667420746f2061697264726f70000000000000000000000000600082015250565b6000615116601483613dbc565b9150615121826150e0565b602082019050919050565b6000602082019050818103600083015261514581615109565b9050919050565b600061515782613e63565b915061516283613e63565b925082820190508082111561517a57615179614978565b5b92915050565b7f4d696e7420697320706175736564000000000000000000000000000000000000600082015250565b60006151b6600e83613dbc565b91506151c182615180565b602082019050919050565b600060208201905081810360008301526151e5816151a9565b9050919050565b7f4d696e7420686173206e6f742073746172746564000000000000000000000000600082015250565b6000615222601483613dbc565b915061522d826151ec565b602082019050919050565b6000602082019050818103600083015261525181615215565b9050919050565b7f46726565206d696e74206f6e6c7920666f722043726f676e6f6d65204e46542060008201527f436f6d6d756e6974790000000000000000000000000000000000000000000000602082015250565b60006152b4602983613dbc565b91506152bf82615258565b604082019050919050565b600060208201905081810360008301526152e3816152a7565b9050919050565b7f45786365656473206d6178206d696e7461626c65206e66747300000000000000600082015250565b6000615320601983613dbc565b915061532b826152ea565b602082019050919050565b6000602082019050818103600083015261534f81615313565b9050919050565b7f616d6f756e742063616e2774206265207a65726f000000000000000000000000600082015250565b600061538c601483613dbc565b915061539782615356565b602082019050919050565b600060208201905081810360008301526153bb8161537f565b9050919050565b7f4d617820737570706c7920657863656564656400000000000000000000000000600082015250565b60006153f8601383613dbc565b9150615403826153c2565b602082019050919050565b60006020820190508181036000830152615427816153eb565b9050919050565b7f696e73756666696369656e742066756e64730000000000000000000000000000600082015250565b6000615464601283613dbc565b915061546f8261542e565b602082019050919050565b6000602082019050818103600083015261549381615457565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006154f6602f83613dbc565b91506155018261549a565b604082019050919050565b60006020820190508181036000830152615525816154e9565b9050919050565b600081905092915050565b600061554282613db1565b61554c818561552c565b935061555c818560208601613dcd565b80840191505092915050565b600081546155758161474f565b61557f818661552c565b9450600182166000811461559a57600181146155af576155e2565b60ff19831686528115158202860193506155e2565b6155b885614d02565b60005b838110156155da578154818901526001820191506020810190506155bb565b838801955050505b50505092915050565b60006155f78286615537565b91506156038285615537565b915061560f8284615568565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615678602683613dbc565b91506156838261561c565b604082019050919050565b600060208201905081810360008301526156a78161566b565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006156e4602083613dbc565b91506156ef826156ae565b602082019050919050565b60006020820190508181036000830152615713816156d7565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000615776602583613dbc565b91506157818261571a565b604082019050919050565b600060208201905081810360008301526157a581615769565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000615808602483613dbc565b9150615813826157ac565b604082019050919050565b60006020820190508181036000830152615837816157fb565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000615874601f83613dbc565b915061587f8261583e565b602082019050919050565b600060208201905081810360008301526158a381615867565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006158e0601983613dbc565b91506158eb826158aa565b602082019050919050565b6000602082019050818103600083015261590f816158d3565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000615972603283613dbc565b915061597d82615916565b604082019050919050565b600060208201905081810360008301526159a181615965565b9050919050565b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b6000615a04603583613dbc565b9150615a0f826159a8565b604082019050919050565b60006020820190508181036000830152615a33816159f7565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000615a6182615a3a565b615a6b8185615a45565b9350615a7b818560208601613dcd565b615a8481613df7565b840191505092915050565b6000608082019050615aa46000830187613ef8565b615ab16020830186613ef8565b615abe6040830185613f8e565b8181036060830152615ad08184615a56565b905095945050505050565b600081519050615aea81613cc9565b92915050565b600060208284031215615b0657615b05613c93565b5b6000615b1484828501615adb565b91505092915050565b6000615b2882613e63565b9150615b3383613e63565b9250828203905081811115615b4b57615b4a614978565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000615bb6602083613dbc565b9150615bc182615b80565b602082019050919050565b60006020820190508181036000830152615be581615ba9565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615c22601c83613dbc565b9150615c2d82615bec565b602082019050919050565b60006020820190508181036000830152615c5181615c15565b905091905056fea26469706673582212201e52e4e63b324c0197f3ecc5e8152796e54226b38ae6ee545b02410bababefac64736f6c63430008110033

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

00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000de56d1c3e5b9e8e4f12533c1e64d4f6b7eee701e0000000000000000000000009ae196176b528680b75c7aea2fbd72456fdfae17000000000000000000000000aef47406e93a6c67ada8bdd194ee4d27e4bc05d7000000000000000000000000a304781f2c47f20a8a567458b2b0cea48b30220f00000000000000000000000000095839d3b6ea654a3bf46b77886e749e16dc86000000000000000000000000000000000000000000000000000000000000004468747470733a2f2f697066732e696f2f697066732f516d514e543454774d783662456666506f4e66513132647a4554365232644277376469707a726b533635313577642f00000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _initBaseURI (string): https://ipfs.io/ipfs/QmQNT4TwMx6bEffPoNfQ12dzET6R2dBw7dipzrkS6515wd/
Arg [1] : _crognome (address): 0xde56d1c3e5b9e8e4f12533c1e64d4f6b7eee701e
Arg [2] : _crognomide (address): 0x9ae196176b528680b75c7aea2fbd72456fdfae17
Arg [3] : _crognome2 (address): 0xaef47406e93a6c67ada8bdd194ee4d27e4bc05d7
Arg [4] : _crognomide2 (address): 0xa304781f2c47f20a8a567458b2b0cea48b30220f
Arg [5] : _mushroom (address): 0x00095839d3b6ea654a3bf46b77886e749e16dc86

-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [1] : 000000000000000000000000de56d1c3e5b9e8e4f12533c1e64d4f6b7eee701e
Arg [2] : 0000000000000000000000009ae196176b528680b75c7aea2fbd72456fdfae17
Arg [3] : 000000000000000000000000aef47406e93a6c67ada8bdd194ee4d27e4bc05d7
Arg [4] : 000000000000000000000000a304781f2c47f20a8a567458b2b0cea48b30220f
Arg [5] : 00000000000000000000000000095839d3b6ea654a3bf46b77886e749e16dc86
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000044
Arg [7] : 68747470733a2f2f697066732e696f2f697066732f516d514e543454774d7836
Arg [8] : 62456666506f4e66513132647a4554365232644277376469707a726b53363531
Arg [9] : 3577642f00000000000000000000000000000000000000000000000000000000


Deployed ByteCode Sourcemap

72337:7299:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79445:188;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77737:79;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77210:75;;;;;;;;;;;;;:::i;:::-;;50014:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51526:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51044:416;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77293:78;;;;;;;;;;;;;:::i;:::-;;72774:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72602:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66947:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76940:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72989:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52226:335;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72821:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38185:442;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;76670:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78590:424;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77824:296;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66615:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79022:183;;;;;;;;;;;;;:::i;:::-;;73260:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52632:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75540:374;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77379:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67137:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77473:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73115:70;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72956:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73292:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72502:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49724:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72729:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79213:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77078:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49455:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22386:103;;;;;;;;;;;;;:::i;:::-;;21738:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78128:454;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76538:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50183:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73326:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74136:1396;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72639:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51769:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72683:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52888:322;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72558:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75922:608;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73086:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76804:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72865:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77585:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51995:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73196:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22644:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73227:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79445:188;79565:4;79589:36;79613:11;79589:23;:36::i;:::-;79582:43;;79445:188;;;:::o;77737:79::-;21624:13;:11;:13::i;:::-;77802:6:::1;77793;;:15;;;;;;;;;;;;;;;;;;77737:79:::0;:::o;77210:75::-;21624:13;:11;:13::i;:::-;77276:1:::1;77264:9;:13;;;;77210:75::o:0;50014:100::-;50068:13;50101:5;50094:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50014:100;:::o;51526:171::-;51602:7;51622:23;51637:7;51622:14;:23::i;:::-;51665:15;:24;51681:7;51665:24;;;;;;;;;;;;;;;;;;;;;51658:31;;51526:171;;;:::o;51044:416::-;51125:13;51141:23;51156:7;51141:14;:23::i;:::-;51125:39;;51189:5;51183:11;;:2;:11;;;51175:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;51283:5;51267:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;51292:37;51309:5;51316:12;:10;:12::i;:::-;51292:16;:37::i;:::-;51267:62;51245:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;51431:21;51440:2;51444:7;51431:8;:21::i;:::-;51114:346;51044:416;;:::o;77293:78::-;21624:13;:11;:13::i;:::-;77362:1:::1;77350:9;:13;;;;77293:78::o:0;72774:40::-;;;;:::o;72602:30::-;;;;:::o;66947:113::-;67008:7;67035:10;:17;;;;67028:24;;66947:113;:::o;76940:130::-;77002:4;77061:1;77026:12;;;;;;;;;;;:22;;;77049:8;77026:32;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:36;77019:43;;76940:130;;;:::o;72989:41::-;;;;;;;;;;;;;;;;;:::o;52226:335::-;52421:41;52440:12;:10;:12::i;:::-;52454:7;52421:18;:41::i;:::-;52413:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;52525:28;52535:4;52541:2;52545:7;52525:9;:28::i;:::-;52226:335;;;:::o;72821:37::-;;;;:::o;38185:442::-;38282:7;38291;38311:26;38340:17;:27;38358:8;38340:27;;;;;;;;;;;38311:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38412:1;38384:30;;:7;:16;;;:30;;;38380:92;;38441:19;38431:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38380:92;38484:21;38549:17;:15;:17::i;:::-;38508:58;;38522:7;:23;;;38509:36;;:10;:36;;;;:::i;:::-;38508:58;;;;:::i;:::-;38484:82;;38587:7;:16;;;38605:13;38579:40;;;;;;38185:442;;;;;:::o;76670:126::-;76730:4;76787:1;76754:10;;;;;;;;;;;:20;;;76775:8;76754:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:34;76747:41;;76670:126;;;:::o;78590:424::-;78648:7;78695:4;78672:27;;:19;78683:7;78672:10;:19::i;:::-;:27;;;78668:52;;78708:12;;78701:19;;;;78668:52;78759:4;78735:28;;:20;78747:7;78735:11;:20::i;:::-;:28;;;78731:54;;78772:13;;78765:20;;;;78731:54;78825:4;78800:29;;:21;78813:7;78800:12;:21::i;:::-;:29;;;78796:56;;78838:14;;78831:21;;;;78796:56;78893:4;78867:30;;:22;78881:7;78867:13;:22::i;:::-;:30;;;78863:58;;78906:15;;78899:22;;;;78863:58;78959:4;78936:27;;:19;78947:7;78936:10;:19::i;:::-;:27;;;78932:52;;78972:12;;78965:19;;;;78932:52;79002:4;;78995:11;;78590:424;;;;:::o;77824:296::-;21624:13;:11;:13::i;:::-;77956:7:::1;:14;77937:8;:15;:33;77929:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;78003:6;77998:117;78019:8;:15;78015:1;:19;77998:117;;;78050:7;78063:8;78072:1;78063:11;;;;;;;;:::i;:::-;;;;;;;;78050:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78084:6;78096:7;78104:1;78096:10;;;;;;;;:::i;:::-;;;;;;;;78084:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78036:3;;;;;:::i;:::-;;;;77998:117;;;;77824:296:::0;;:::o;66615:256::-;66712:7;66748:23;66765:5;66748:16;:23::i;:::-;66740:5;:31;66732:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;66837:12;:19;66850:5;66837:19;;;;;;;;;;;;;;;:26;66857:5;66837:26;;;;;;;;;;;;66830:33;;66615:256;;;;:::o;79022:183::-;79062:9;79101:10;;;;;;;;;;;79093:24;;79125:21;79093:58;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79082:69;;;;;79170:4;79162:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;79051:154;79022:183::o;73260:25::-;;;;;;;;;;;;;:::o;52632:185::-;52770:39;52787:4;52793:2;52797:7;52770:39;;;;;;;;;;;;:16;:39::i;:::-;52632:185;;;:::o;75540:374::-;75616:16;75645:23;75671:17;75681:6;75671:9;:17::i;:::-;75645:43;;75699:25;75741:15;75727:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75699:58;;75773:9;75768:113;75788:15;75784:1;:19;75768:113;;;75839:30;75859:6;75867:1;75839:19;:30::i;:::-;75825:8;75834:1;75825:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;75805:3;;;;;:::i;:::-;;;;75768:113;;;;75898:8;75891:15;;;;75540:374;;;:::o;77379:86::-;21624:13;:11;:13::i;:::-;77449:8:::1;77442:4;:15;;;;77379:86:::0;:::o;67137:233::-;67212:7;67248:30;:28;:30::i;:::-;67240:5;:38;67232:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;67345:10;67356:5;67345:17;;;;;;;;:::i;:::-;;;;;;;;;;67338:24;;67137:233;;;:::o;77473:104::-;21624:13;:11;:13::i;:::-;77558:11:::1;77548:7;:21;;;;;;:::i;:::-;;77473:104:::0;:::o;73115:70::-;;;;;;;;;;;;;:::o;72956:26::-;;;;;;;;;;;;;:::o;73292:27::-;;;;;;;;;;;;;:::o;72502:28::-;;;;:::o;49724:223::-;49796:7;49816:13;49832:17;49841:7;49832:8;:17::i;:::-;49816:33;;49885:1;49868:19;;:5;:19;;;49860:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;49934:5;49927:12;;;49724:223;;;:::o;72729:38::-;;;;:::o;79213:224::-;21624:13;:11;:13::i;:::-;79292:6:::1;79301:4;79292:13;;79287:143;79312:2;79307:1;:7;79287:143;;72901:3;79344:1;:14;;79336:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;79394:24;79404:10;;;;;;;;;;;79416:1;79394:9;:24::i;:::-;79316:3;;;;;:::i;:::-;;;;79287:143;;;;79213:224:::0;;:::o;77078:124::-;77137:4;77193:1;77161:9;;;;;;;;;;;:19;;;77181:8;77161:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:33;77154:40;;77078:124;;;:::o;49455:207::-;49527:7;49572:1;49555:19;;:5;:19;;;49547:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;49638:9;:16;49648:5;49638:16;;;;;;;;;;;;;;;;49631:23;;49455:207;;;:::o;22386:103::-;21624:13;:11;:13::i;:::-;22451:30:::1;22478:1;22451:18;:30::i;:::-;22386:103::o:0;21738:87::-;21784:7;21811:6;;;;;;;;;;;21804:13;;21738:87;:::o;78128:454::-;78199:7;:14;;;;78188:8;;:25;78180:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;78245:13;78272:6;78261:8;;:17;;;;:::i;:::-;78245:33;;78297:7;:14;;;;78289:5;:22;78285:50;;;78321:7;:14;;;;78313:22;;78285:50;78342:14;78359:13;:11;:13::i;:::-;78342:30;;78385:192;78403:5;78392:8;;:16;78385:192;;;78436:11;78450:1;78436:15;;78431:103;78460:6;78467:8;;78460:16;;;;;;;;:::i;:::-;;;;;;;;;;78453:3;:23;78431:103;;78494:40;78504:7;78512:8;;78504:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;78530:3;78523:6;:10;;;;:::i;:::-;78494:9;:40::i;:::-;78478:5;;;;;:::i;:::-;;;;78431:103;;;;78553:6;78560:8;;78553:16;;;;;;;;:::i;:::-;;;;;;;;;;78543:26;;;;;:::i;:::-;;;78410:8;;:10;;;;;;;;;:::i;:::-;;;;;;78385:192;;;78173:409;;78128:454;:::o;76538:124::-;76597:4;76653:1;76621:9;;;;;;;;;;;:19;;;76641:8;76621:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:33;76614:40;;76538:124;;;:::o;50183:104::-;50239:13;50272:7;50265:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50183:104;:::o;73326:24::-;;;;;;;;;;;;;:::o;74136:1396::-;3810:21;:19;:21::i;:::-;74214:6:::1;;;;;;;;;;;74213:7;74205:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;74270:1;74258:9;;:13;74250:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;74324:1;74311:9;;:14:::0;74307:232:::1;;74350:22;74361:10;74350;:22::i;:::-;:50;;;;74376:24;74389:10;74376:12;:24::i;:::-;74350:50;:77;;;;74404:23;74416:10;74404:11;:23::i;:::-;74350:77;:106;;;;74431:25;74445:10;74431:13;:25::i;:::-;74350:106;:131;;;;74459:22;74470:10;74459;:22::i;:::-;74350:131;74342:185;;;;;;;;;;;;:::i;:::-;;;;;;;;;74307:232;74616:1;74603:9;;:14;:22;;74624:1;74603:22;;;74620:1;74603:22;74571:55;;74592:6;74571;:18;74578:10;74571:18;;;;;;;;;;;;;;;;:27;;;;:::i;:::-;:55;;74549:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;74746:1;74737:6;:10;74729:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;74783:14;74800:13;:11;:13::i;:::-;74783:30;;72901:3;74841:6;74832;:15;;;;:::i;:::-;:28;;74824:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;74895:13;74911:4;;74895:20;;74930:22;74941:10;74930;:22::i;:::-;74926:48;;;74962:12;;74954:20;;74926:48;74989:23;75001:10;74989:11;:23::i;:::-;74985:50;;;75022:13;;75014:21;;74985:50;75050:24;75063:10;75050:12;:24::i;:::-;75046:52;;;75084:14;;75076:22;;75046:52;75113:25;75127:10;75113:13;:25::i;:::-;75109:54;;;75148:15;;75140:23;;75109:54;75178:22;75189:10;75178;:22::i;:::-;75174:48;;;75210:12;;75202:20;;75174:48;75262:6;75254:5;:14;;;;:::i;:::-;75241:9;:27;;75233:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;75309:9;75304:182;75328:6;75324:1;:10;75304:182;;;75356:21;:9;:19;:21::i;:::-;75392:15;75410:19;:9;:17;:19::i;:::-;75392:37;;75444:30;75454:10;75466:7;75444:9;:30::i;:::-;75341:145;75336:3;;;;;:::i;:::-;;;;75304:182;;;;75518:6;75496;:18;75503:10;75496:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;74194:1338;;3854:20:::0;:18;:20::i;:::-;74136:1396;:::o;72639:37::-;;;;:::o;51769:155::-;51864:52;51883:12;:10;:12::i;:::-;51897:8;51907;51864:18;:52::i;:::-;51769:155;;:::o;72683:39::-;;;;:::o;52888:322::-;53062:41;53081:12;:10;:12::i;:::-;53095:7;53062:18;:41::i;:::-;53054:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;53164:38;53178:4;53184:2;53188:7;53197:4;53164:13;:38::i;:::-;52888:322;;;;:::o;72558:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;75922:608::-;76011:13;76059:16;76067:7;76059;:16::i;:::-;76037:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;76163:28;76194:10;:8;:10::i;:::-;76163:41;;76266:1;76241:14;76235:28;:32;:287;;;;;;;;;;;;;;;;;76359:14;76400:18;:7;:16;:18::i;:::-;76445:13;76316:165;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;76235:287;76215:307;;;75922:608;;;:::o;73086:20::-;;;;:::o;76804:128::-;76865:4;76923:1;76889:11;;;;;;;;;;;:21;;;76911:8;76889:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:35;76882:42;;76804:128;;;:::o;72865:39::-;72901:3;72865:39;:::o;77585:144::-;21624:13;:11;:13::i;:::-;77704:17:::1;77688:13;:33;;;;;;:::i;:::-;;77585:144:::0;:::o;51995:164::-;52092:4;52116:18;:25;52135:5;52116:25;;;;;;;;;;;;;;;:35;52142:8;52116:35;;;;;;;;;;;;;;;;;;;;;;;;;52109:42;;51995:164;;;;:::o;73196:24::-;;;;;;;;;;;;;:::o;22644:201::-;21624:13;:11;:13::i;:::-;22753:1:::1;22733:22;;:8;:22;;::::0;22725:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;22809:28;22828:8;22809:18;:28::i;:::-;22644:201:::0;:::o;73227:26::-;;;;;;;;;;;;;:::o;37915:215::-;38017:4;38056:26;38041:41;;;:11;:41;;;;:81;;;;38086:36;38110:11;38086:23;:36::i;:::-;38041:81;38034:88;;37915:215;;;:::o;21903:132::-;21978:12;:10;:12::i;:::-;21967:23;;:7;:5;:7::i;:::-;:23;;;21959:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;21903:132::o;61345:135::-;61427:16;61435:7;61427;:16::i;:::-;61419:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;61345:135;:::o;20289:98::-;20342:7;20369:10;20362:17;;20289:98;:::o;60624:174::-;60726:2;60699:15;:24;60715:7;60699:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;60782:7;60778:2;60744:46;;60753:23;60768:7;60753:14;:23::i;:::-;60744:46;;;;;;;;;;;;60624:174;;:::o;55243:264::-;55336:4;55353:13;55369:23;55384:7;55369:14;:23::i;:::-;55353:39;;55422:5;55411:16;;:7;:16;;;:52;;;;55431:32;55448:5;55455:7;55431:16;:32::i;:::-;55411:52;:87;;;;55491:7;55467:31;;:20;55479:7;55467:11;:20::i;:::-;:31;;;55411:87;55403:96;;;55243:264;;;;:::o;59242:1263::-;59401:4;59374:31;;:23;59389:7;59374:14;:23::i;:::-;:31;;;59366:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;59480:1;59466:16;;:2;:16;;;59458:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;59536:42;59557:4;59563:2;59567:7;59576:1;59536:20;:42::i;:::-;59708:4;59681:31;;:23;59696:7;59681:14;:23::i;:::-;:31;;;59673:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;59826:15;:24;59842:7;59826:24;;;;;;;;;;;;59819:31;;;;;;;;;;;60321:1;60302:9;:15;60312:4;60302:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;60354:1;60337:9;:13;60347:2;60337:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;60396:2;60377:7;:16;60385:7;60377:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;60435:7;60431:2;60416:27;;60425:4;60416:27;;;;;;;;;;;;60456:41;60476:4;60482:2;60486:7;60495:1;60456:19;:41::i;:::-;59242:1263;;;:::o;38909:97::-;38967:6;38993:5;38986:12;;38909:97;:::o;54518:117::-;54584:7;54611;:16;54619:7;54611:16;;;;;;;;;;;;;;;;;;;;;54604:23;;54518:117;;;:::o;55849:110::-;55925:26;55935:2;55939:7;55925:26;;;;;;;;;;;;:9;:26::i;:::-;55849:110;;:::o;23005:191::-;23079:16;23098:6;;;;;;;;;;;23079:25;;23124:8;23115:6;;:17;;;;;;;;;;;;;;;;;;23179:8;23148:40;;23169:8;23148:40;;;;;;;;;;;;23068:128;23005:191;:::o;3890:293::-;3292:1;4024:7;;:19;4016:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;3292:1;4157:7;:18;;;;3890:293::o;994:127::-;1101:1;1083:7;:14;;;:19;;;;;;;;;;;994:127;:::o;872:114::-;937:7;964;:14;;;957:21;;872:114;;;:::o;4191:213::-;3248:1;4374:7;:22;;;;4191:213::o;60941:315::-;61096:8;61087:17;;:5;:17;;;61079:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;61183:8;61145:18;:25;61164:5;61145:25;;;;;;;;;;;;;;;:35;61171:8;61145:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;61229:8;61207:41;;61222:5;61207:41;;;61239:8;61207:41;;;;;;:::i;:::-;;;;;;;;60941:315;;;:::o;54091:313::-;54247:28;54257:4;54263:2;54267:7;54247:9;:28::i;:::-;54294:47;54317:4;54323:2;54327:7;54336:4;54294:22;:47::i;:::-;54286:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;54091:313;;;;:::o;54948:128::-;55013:4;55066:1;55037:31;;:17;55046:7;55037:8;:17::i;:::-;:31;;;;55030:38;;54948:128;;;:::o;74005:108::-;74065:13;74098:7;74091:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74005:108;:::o;17716:716::-;17772:13;17823:14;17860:1;17840:17;17851:5;17840:10;:17::i;:::-;:21;17823:38;;17876:20;17910:6;17899:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17876:41;;17932:11;18061:6;18057:2;18053:15;18045:6;18041:28;18034:35;;18098:288;18105:4;18098:288;;;18130:5;;;;;;;;18272:8;18267:2;18260:5;18256:14;18251:30;18246:3;18238:44;18328:2;18319:11;;;;;;:::i;:::-;;;;;18362:1;18353:5;:10;18098:288;18349:21;18098:288;18407:6;18400:13;;;;;17716:716;;;:::o;66307:224::-;66409:4;66448:35;66433:50;;;:11;:50;;;;:90;;;;66487:36;66511:11;66487:23;:36::i;:::-;66433:90;66426:97;;66307:224;;;:::o;67444:915::-;67621:61;67648:4;67654:2;67658:12;67672:9;67621:26;:61::i;:::-;67711:1;67699:9;:13;67695:222;;;67842:63;;;;;;;;;;:::i;:::-;;;;;;;;67695:222;67929:15;67947:12;67929:30;;67992:1;67976:18;;:4;:18;;;67972:187;;68011:40;68043:7;68011:31;:40::i;:::-;67972:187;;;68081:2;68073:10;;:4;:10;;;68069:90;;68100:47;68133:4;68139:7;68100:32;:47::i;:::-;68069:90;67972:187;68187:1;68173:16;;:2;:16;;;68169:183;;68206:45;68243:7;68206:36;:45::i;:::-;68169:183;;;68279:4;68273:10;;:2;:10;;;68269:83;;68300:40;68328:2;68332:7;68300:27;:40::i;:::-;68269:83;68169:183;67610:749;67444:915;;;;:::o;64510:158::-;;;;;:::o;56186:319::-;56315:18;56321:2;56325:7;56315:5;:18::i;:::-;56366:53;56397:1;56401:2;56405:7;56414:4;56366:22;:53::i;:::-;56344:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;56186:319;;;:::o;62044:853::-;62198:4;62219:15;:2;:13;;;:15::i;:::-;62215:675;;;62271:2;62255:36;;;62292:12;:10;:12::i;:::-;62306:4;62312:7;62321:4;62255:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;62251:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62513:1;62496:6;:13;:18;62492:328;;62539:60;;;;;;;;;;:::i;:::-;;;;;;;;62492:328;62770:6;62764:13;62755:6;62751:2;62747:15;62740:38;62251:584;62387:41;;;62377:51;;;:6;:51;;;;62370:58;;;;;62215:675;62874:4;62867:11;;62044:853;;;;;;;:::o;14582:922::-;14635:7;14655:14;14672:1;14655:18;;14722:6;14713:5;:15;14709:102;;14758:6;14749:15;;;;;;:::i;:::-;;;;;14793:2;14783:12;;;;14709:102;14838:6;14829:5;:15;14825:102;;14874:6;14865:15;;;;;;:::i;:::-;;;;;14909:2;14899:12;;;;14825:102;14954:6;14945:5;:15;14941:102;;14990:6;14981:15;;;;;;:::i;:::-;;;;;15025:2;15015:12;;;;14941:102;15070:5;15061;:14;15057:99;;15105:5;15096:14;;;;;;:::i;:::-;;;;;15139:1;15129:11;;;;15057:99;15183:5;15174;:14;15170:99;;15218:5;15209:14;;;;;;:::i;:::-;;;;;15252:1;15242:11;;;;15170:99;15296:5;15287;:14;15283:99;;15331:5;15322:14;;;;;;:::i;:::-;;;;;15365:1;15355:11;;;;15283:99;15409:5;15400;:14;15396:66;;15445:1;15435:11;;;;15396:66;15490:6;15483:13;;;14582:922;;;:::o;49086:305::-;49188:4;49240:25;49225:40;;;:11;:40;;;;:105;;;;49297:33;49282:48;;;:11;:48;;;;49225:105;:158;;;;49347:36;49371:11;49347:23;:36::i;:::-;49225:158;49205:178;;49086:305;;;:::o;63629:159::-;;;;;:::o;69082:164::-;69186:10;:17;;;;69159:15;:24;69175:7;69159:24;;;;;;;;;;;:44;;;;69214:10;69230:7;69214:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69082:164;:::o;69873:988::-;70139:22;70189:1;70164:22;70181:4;70164:16;:22::i;:::-;:26;;;;:::i;:::-;70139:51;;70201:18;70222:17;:26;70240:7;70222:26;;;;;;;;;;;;70201:47;;70369:14;70355:10;:28;70351:328;;70400:19;70422:12;:18;70435:4;70422:18;;;;;;;;;;;;;;;:34;70441:14;70422:34;;;;;;;;;;;;70400:56;;70506:11;70473:12;:18;70486:4;70473:18;;;;;;;;;;;;;;;:30;70492:10;70473:30;;;;;;;;;;;:44;;;;70623:10;70590:17;:30;70608:11;70590:30;;;;;;;;;;;:43;;;;70385:294;70351:328;70775:17;:26;70793:7;70775:26;;;;;;;;;;;70768:33;;;70819:12;:18;70832:4;70819:18;;;;;;;;;;;;;;;:34;70838:14;70819:34;;;;;;;;;;;70812:41;;;69954:907;;69873:988;;:::o;71156:1079::-;71409:22;71454:1;71434:10;:17;;;;:21;;;;:::i;:::-;71409:46;;71466:18;71487:15;:24;71503:7;71487:24;;;;;;;;;;;;71466:45;;71838:19;71860:10;71871:14;71860:26;;;;;;;;:::i;:::-;;;;;;;;;;71838:48;;71924:11;71899:10;71910;71899:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;72035:10;72004:15;:28;72020:11;72004:28;;;;;;;;;;;:41;;;;72176:15;:24;72192:7;72176:24;;;;;;;;;;;72169:31;;;72211:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;71227:1008;;;71156:1079;:::o;68660:221::-;68745:14;68762:20;68779:2;68762:16;:20::i;:::-;68745:37;;68820:7;68793:12;:16;68806:2;68793:16;;;;;;;;;;;;;;;:24;68810:6;68793:24;;;;;;;;;;;:34;;;;68867:6;68838:17;:26;68856:7;68838:26;;;;;;;;;;;:35;;;;68734:147;68660:221;;:::o;56841:942::-;56935:1;56921:16;;:2;:16;;;56913:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;56994:16;57002:7;56994;:16::i;:::-;56993:17;56985:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;57056:48;57085:1;57089:2;57093:7;57102:1;57056:20;:48::i;:::-;57203:16;57211:7;57203;:16::i;:::-;57202:17;57194:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;57618:1;57601:9;:13;57611:2;57601:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;57662:2;57643:7;:16;57651:7;57643:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;57707:7;57703:2;57682:33;;57699:1;57682:33;;;;;;;;;;;;57728:47;57756:1;57760:2;57764:7;57773:1;57728:19;:47::i;:::-;56841:942;;:::o;24436:326::-;24496:4;24753:1;24731:7;:19;;;:23;24724:30;;24436:326;;;:::o;36365:157::-;36450:4;36489:25;36474:40;;;:11;:40;;;;36467:47;;36365:157;;;:::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:116::-;1588:21;1603:5;1588:21;:::i;:::-;1581:5;1578:32;1568:60;;1624:1;1621;1614:12;1568:60;1518:116;:::o;1640:133::-;1683:5;1721:6;1708:20;1699:29;;1737:30;1761:5;1737:30;:::i;:::-;1640:133;;;;:::o;1779:323::-;1835:6;1884:2;1872:9;1863:7;1859:23;1855:32;1852:119;;;1890:79;;:::i;:::-;1852:119;2010:1;2035:50;2077:7;2068:6;2057:9;2053:22;2035:50;:::i;:::-;2025:60;;1981:114;1779:323;;;;:::o;2108:99::-;2160:6;2194:5;2188:12;2178:22;;2108:99;;;:::o;2213:169::-;2297:11;2331:6;2326:3;2319:19;2371:4;2366:3;2362:14;2347:29;;2213:169;;;;:::o;2388:246::-;2469:1;2479:113;2493:6;2490:1;2487:13;2479:113;;;2578:1;2573:3;2569:11;2563:18;2559:1;2554:3;2550:11;2543:39;2515:2;2512:1;2508:10;2503:15;;2479:113;;;2626:1;2617:6;2612:3;2608:16;2601:27;2450:184;2388:246;;;:::o;2640:102::-;2681:6;2732:2;2728:7;2723:2;2716:5;2712:14;2708:28;2698:38;;2640:102;;;:::o;2748:377::-;2836:3;2864:39;2897:5;2864:39;:::i;:::-;2919:71;2983:6;2978:3;2919:71;:::i;:::-;2912:78;;2999:65;3057:6;3052:3;3045:4;3038:5;3034:16;2999:65;:::i;:::-;3089:29;3111:6;3089:29;:::i;:::-;3084:3;3080:39;3073:46;;2840:285;2748:377;;;;:::o;3131:313::-;3244:4;3282:2;3271:9;3267:18;3259:26;;3331:9;3325:4;3321:20;3317:1;3306:9;3302:17;3295:47;3359:78;3432:4;3423:6;3359:78;:::i;:::-;3351:86;;3131:313;;;;:::o;3450:77::-;3487:7;3516:5;3505:16;;3450:77;;;:::o;3533:122::-;3606:24;3624:5;3606:24;:::i;:::-;3599:5;3596:35;3586:63;;3645:1;3642;3635:12;3586:63;3533:122;:::o;3661:139::-;3707:5;3745:6;3732:20;3723:29;;3761:33;3788:5;3761:33;:::i;:::-;3661:139;;;;:::o;3806:329::-;3865:6;3914:2;3902:9;3893:7;3889:23;3885:32;3882:119;;;3920:79;;:::i;:::-;3882:119;4040:1;4065:53;4110:7;4101:6;4090:9;4086:22;4065:53;:::i;:::-;4055:63;;4011:117;3806:329;;;;:::o;4141:126::-;4178:7;4218:42;4211:5;4207:54;4196:65;;4141:126;;;:::o;4273:96::-;4310:7;4339:24;4357:5;4339:24;:::i;:::-;4328:35;;4273:96;;;:::o;4375:118::-;4462:24;4480:5;4462:24;:::i;:::-;4457:3;4450:37;4375:118;;:::o;4499:222::-;4592:4;4630:2;4619:9;4615:18;4607:26;;4643:71;4711:1;4700:9;4696:17;4687:6;4643:71;:::i;:::-;4499:222;;;;:::o;4727:122::-;4800:24;4818:5;4800:24;:::i;:::-;4793:5;4790:35;4780:63;;4839:1;4836;4829:12;4780:63;4727:122;:::o;4855:139::-;4901:5;4939:6;4926:20;4917:29;;4955:33;4982:5;4955:33;:::i;:::-;4855:139;;;;:::o;5000:474::-;5068:6;5076;5125:2;5113:9;5104:7;5100:23;5096:32;5093:119;;;5131:79;;:::i;:::-;5093:119;5251:1;5276:53;5321:7;5312:6;5301:9;5297:22;5276:53;:::i;:::-;5266:63;;5222:117;5378:2;5404:53;5449:7;5440:6;5429:9;5425:22;5404:53;:::i;:::-;5394:63;;5349:118;5000:474;;;;;:::o;5480:118::-;5567:24;5585:5;5567:24;:::i;:::-;5562:3;5555:37;5480:118;;:::o;5604:222::-;5697:4;5735:2;5724:9;5720:18;5712:26;;5748:71;5816:1;5805:9;5801:17;5792:6;5748:71;:::i;:::-;5604:222;;;;:::o;5832:329::-;5891:6;5940:2;5928:9;5919:7;5915:23;5911:32;5908:119;;;5946:79;;:::i;:::-;5908:119;6066:1;6091:53;6136:7;6127:6;6116:9;6112:22;6091:53;:::i;:::-;6081:63;;6037:117;5832:329;;;;:::o;6167:619::-;6244:6;6252;6260;6309:2;6297:9;6288:7;6284:23;6280:32;6277:119;;;6315:79;;:::i;:::-;6277:119;6435:1;6460:53;6505:7;6496:6;6485:9;6481:22;6460:53;:::i;:::-;6450:63;;6406:117;6562:2;6588:53;6633:7;6624:6;6613:9;6609:22;6588:53;:::i;:::-;6578:63;;6533:118;6690:2;6716:53;6761:7;6752:6;6741:9;6737:22;6716:53;:::i;:::-;6706:63;;6661:118;6167:619;;;;;:::o;6792:474::-;6860:6;6868;6917:2;6905:9;6896:7;6892:23;6888:32;6885:119;;;6923:79;;:::i;:::-;6885:119;7043:1;7068:53;7113:7;7104:6;7093:9;7089:22;7068:53;:::i;:::-;7058:63;;7014:117;7170:2;7196:53;7241:7;7232:6;7221:9;7217:22;7196:53;:::i;:::-;7186:63;;7141:118;6792:474;;;;;:::o;7272:332::-;7393:4;7431:2;7420:9;7416:18;7408:26;;7444:71;7512:1;7501:9;7497:17;7488:6;7444:71;:::i;:::-;7525:72;7593:2;7582:9;7578:18;7569:6;7525:72;:::i;:::-;7272:332;;;;;:::o;7610:117::-;7719:1;7716;7709:12;7733:180;7781:77;7778:1;7771:88;7878:4;7875:1;7868:15;7902:4;7899:1;7892:15;7919:281;8002:27;8024:4;8002:27;:::i;:::-;7994:6;7990:40;8132:6;8120:10;8117:22;8096:18;8084:10;8081:34;8078:62;8075:88;;;8143:18;;:::i;:::-;8075:88;8183:10;8179:2;8172:22;7962:238;7919:281;;:::o;8206:129::-;8240:6;8267:20;;:::i;:::-;8257:30;;8296:33;8324:4;8316:6;8296:33;:::i;:::-;8206:129;;;:::o;8341:311::-;8418:4;8508:18;8500:6;8497:30;8494:56;;;8530:18;;:::i;:::-;8494:56;8580:4;8572:6;8568:17;8560:25;;8640:4;8634;8630:15;8622:23;;8341:311;;;:::o;8658:117::-;8767:1;8764;8757:12;8798:710;8894:5;8919:81;8935:64;8992:6;8935:64;:::i;:::-;8919:81;:::i;:::-;8910:90;;9020:5;9049:6;9042:5;9035:21;9083:4;9076:5;9072:16;9065:23;;9136:4;9128:6;9124:17;9116:6;9112:30;9165:3;9157:6;9154:15;9151:122;;;9184:79;;:::i;:::-;9151:122;9299:6;9282:220;9316:6;9311:3;9308:15;9282:220;;;9391:3;9420:37;9453:3;9441:10;9420:37;:::i;:::-;9415:3;9408:50;9487:4;9482:3;9478:14;9471:21;;9358:144;9342:4;9337:3;9333:14;9326:21;;9282:220;;;9286:21;8900:608;;8798:710;;;;;:::o;9531:370::-;9602:5;9651:3;9644:4;9636:6;9632:17;9628:27;9618:122;;9659:79;;:::i;:::-;9618:122;9776:6;9763:20;9801:94;9891:3;9883:6;9876:4;9868:6;9864:17;9801:94;:::i;:::-;9792:103;;9608:293;9531:370;;;;:::o;9907:311::-;9984:4;10074:18;10066:6;10063:30;10060:56;;;10096:18;;:::i;:::-;10060:56;10146:4;10138:6;10134:17;10126:25;;10206:4;10200;10196:15;10188:23;;9907:311;;;:::o;10241:710::-;10337:5;10362:81;10378:64;10435:6;10378:64;:::i;:::-;10362:81;:::i;:::-;10353:90;;10463:5;10492:6;10485:5;10478:21;10526:4;10519:5;10515:16;10508:23;;10579:4;10571:6;10567:17;10559:6;10555:30;10608:3;10600:6;10597:15;10594:122;;;10627:79;;:::i;:::-;10594:122;10742:6;10725:220;10759:6;10754:3;10751:15;10725:220;;;10834:3;10863:37;10896:3;10884:10;10863:37;:::i;:::-;10858:3;10851:50;10930:4;10925:3;10921:14;10914:21;;10801:144;10785:4;10780:3;10776:14;10769:21;;10725:220;;;10729:21;10343:608;;10241:710;;;;;:::o;10974:370::-;11045:5;11094:3;11087:4;11079:6;11075:17;11071:27;11061:122;;11102:79;;:::i;:::-;11061:122;11219:6;11206:20;11244:94;11334:3;11326:6;11319:4;11311:6;11307:17;11244:94;:::i;:::-;11235:103;;11051:293;10974:370;;;;:::o;11350:894::-;11468:6;11476;11525:2;11513:9;11504:7;11500:23;11496:32;11493:119;;;11531:79;;:::i;:::-;11493:119;11679:1;11668:9;11664:17;11651:31;11709:18;11701:6;11698:30;11695:117;;;11731:79;;:::i;:::-;11695:117;11836:78;11906:7;11897:6;11886:9;11882:22;11836:78;:::i;:::-;11826:88;;11622:302;11991:2;11980:9;11976:18;11963:32;12022:18;12014:6;12011:30;12008:117;;;12044:79;;:::i;:::-;12008:117;12149:78;12219:7;12210:6;12199:9;12195:22;12149:78;:::i;:::-;12139:88;;11934:303;11350:894;;;;;:::o;12250:60::-;12278:3;12299:5;12292:12;;12250:60;;;:::o;12316:142::-;12366:9;12399:53;12417:34;12426:24;12444:5;12426:24;:::i;:::-;12417:34;:::i;:::-;12399:53;:::i;:::-;12386:66;;12316:142;;;:::o;12464:126::-;12514:9;12547:37;12578:5;12547:37;:::i;:::-;12534:50;;12464:126;;;:::o;12596:142::-;12662:9;12695:37;12726:5;12695:37;:::i;:::-;12682:50;;12596:142;;;:::o;12744:163::-;12847:53;12894:5;12847:53;:::i;:::-;12842:3;12835:66;12744:163;;:::o;12913:254::-;13022:4;13060:2;13049:9;13045:18;13037:26;;13073:87;13157:1;13146:9;13142:17;13133:6;13073:87;:::i;:::-;12913:254;;;;:::o;13173:114::-;13240:6;13274:5;13268:12;13258:22;;13173:114;;;:::o;13293:184::-;13392:11;13426:6;13421:3;13414:19;13466:4;13461:3;13457:14;13442:29;;13293:184;;;;:::o;13483:132::-;13550:4;13573:3;13565:11;;13603:4;13598:3;13594:14;13586:22;;13483:132;;;:::o;13621:108::-;13698:24;13716:5;13698:24;:::i;:::-;13693:3;13686:37;13621:108;;:::o;13735:179::-;13804:10;13825:46;13867:3;13859:6;13825:46;:::i;:::-;13903:4;13898:3;13894:14;13880:28;;13735:179;;;;:::o;13920:113::-;13990:4;14022;14017:3;14013:14;14005:22;;13920:113;;;:::o;14069:732::-;14188:3;14217:54;14265:5;14217:54;:::i;:::-;14287:86;14366:6;14361:3;14287:86;:::i;:::-;14280:93;;14397:56;14447:5;14397:56;:::i;:::-;14476:7;14507:1;14492:284;14517:6;14514:1;14511:13;14492:284;;;14593:6;14587:13;14620:63;14679:3;14664:13;14620:63;:::i;:::-;14613:70;;14706:60;14759:6;14706:60;:::i;:::-;14696:70;;14552:224;14539:1;14536;14532:9;14527:14;;14492:284;;;14496:14;14792:3;14785:10;;14193:608;;;14069:732;;;;:::o;14807:373::-;14950:4;14988:2;14977:9;14973:18;14965:26;;15037:9;15031:4;15027:20;15023:1;15012:9;15008:17;15001:47;15065:108;15168:4;15159:6;15065:108;:::i;:::-;15057:116;;14807:373;;;;:::o;15186:117::-;15295:1;15292;15285:12;15309:308;15371:4;15461:18;15453:6;15450:30;15447:56;;;15483:18;;:::i;:::-;15447:56;15521:29;15543:6;15521:29;:::i;:::-;15513:37;;15605:4;15599;15595:15;15587:23;;15309:308;;;:::o;15623:146::-;15720:6;15715:3;15710;15697:30;15761:1;15752:6;15747:3;15743:16;15736:27;15623:146;;;:::o;15775:425::-;15853:5;15878:66;15894:49;15936:6;15894:49;:::i;:::-;15878:66;:::i;:::-;15869:75;;15967:6;15960:5;15953:21;16005:4;15998:5;15994:16;16043:3;16034:6;16029:3;16025:16;16022:25;16019:112;;;16050:79;;:::i;:::-;16019:112;16140:54;16187:6;16182:3;16177;16140:54;:::i;:::-;15859:341;15775:425;;;;;:::o;16220:340::-;16276:5;16325:3;16318:4;16310:6;16306:17;16302:27;16292:122;;16333:79;;:::i;:::-;16292:122;16450:6;16437:20;16475:79;16550:3;16542:6;16535:4;16527:6;16523:17;16475:79;:::i;:::-;16466:88;;16282:278;16220:340;;;;:::o;16566:509::-;16635:6;16684:2;16672:9;16663:7;16659:23;16655:32;16652:119;;;16690:79;;:::i;:::-;16652:119;16838:1;16827:9;16823:17;16810:31;16868:18;16860:6;16857:30;16854:117;;;16890:79;;:::i;:::-;16854:117;16995:63;17050:7;17041:6;17030:9;17026:22;16995:63;:::i;:::-;16985:73;;16781:287;16566:509;;;;:::o;17081:468::-;17146:6;17154;17203:2;17191:9;17182:7;17178:23;17174:32;17171:119;;;17209:79;;:::i;:::-;17171:119;17329:1;17354:53;17399:7;17390:6;17379:9;17375:22;17354:53;:::i;:::-;17344:63;;17300:117;17456:2;17482:50;17524:7;17515:6;17504:9;17500:22;17482:50;:::i;:::-;17472:60;;17427:115;17081:468;;;;;:::o;17555:307::-;17616:4;17706:18;17698:6;17695:30;17692:56;;;17728:18;;:::i;:::-;17692:56;17766:29;17788:6;17766:29;:::i;:::-;17758:37;;17850:4;17844;17840:15;17832:23;;17555:307;;;:::o;17868:423::-;17945:5;17970:65;17986:48;18027:6;17986:48;:::i;:::-;17970:65;:::i;:::-;17961:74;;18058:6;18051:5;18044:21;18096:4;18089:5;18085:16;18134:3;18125:6;18120:3;18116:16;18113:25;18110:112;;;18141:79;;:::i;:::-;18110:112;18231:54;18278:6;18273:3;18268;18231:54;:::i;:::-;17951:340;17868:423;;;;;:::o;18310:338::-;18365:5;18414:3;18407:4;18399:6;18395:17;18391:27;18381:122;;18422:79;;:::i;:::-;18381:122;18539:6;18526:20;18564:78;18638:3;18630:6;18623:4;18615:6;18611:17;18564:78;:::i;:::-;18555:87;;18371:277;18310:338;;;;:::o;18654:943::-;18749:6;18757;18765;18773;18822:3;18810:9;18801:7;18797:23;18793:33;18790:120;;;18829:79;;:::i;:::-;18790:120;18949:1;18974:53;19019:7;19010:6;18999:9;18995:22;18974:53;:::i;:::-;18964:63;;18920:117;19076:2;19102:53;19147:7;19138:6;19127:9;19123:22;19102:53;:::i;:::-;19092:63;;19047:118;19204:2;19230:53;19275:7;19266:6;19255:9;19251:22;19230:53;:::i;:::-;19220:63;;19175:118;19360:2;19349:9;19345:18;19332:32;19391:18;19383:6;19380:30;19377:117;;;19413:79;;:::i;:::-;19377:117;19518:62;19572:7;19563:6;19552:9;19548:22;19518:62;:::i;:::-;19508:72;;19303:287;18654:943;;;;;;;:::o;19603:474::-;19671:6;19679;19728:2;19716:9;19707:7;19703:23;19699:32;19696:119;;;19734:79;;:::i;:::-;19696:119;19854:1;19879:53;19924:7;19915:6;19904:9;19900:22;19879:53;:::i;:::-;19869:63;;19825:117;19981:2;20007:53;20052:7;20043:6;20032:9;20028:22;20007:53;:::i;:::-;19997:63;;19952:118;19603:474;;;;;:::o;20083:180::-;20131:77;20128:1;20121:88;20228:4;20225:1;20218:15;20252:4;20249:1;20242:15;20269:320;20313:6;20350:1;20344:4;20340:12;20330:22;;20397:1;20391:4;20387:12;20418:18;20408:81;;20474:4;20466:6;20462:17;20452:27;;20408:81;20536:2;20528:6;20525:14;20505:18;20502:38;20499:84;;20555:18;;:::i;:::-;20499:84;20320:269;20269:320;;;:::o;20595:220::-;20735:34;20731:1;20723:6;20719:14;20712:58;20804:3;20799:2;20791:6;20787:15;20780:28;20595:220;:::o;20821:366::-;20963:3;20984:67;21048:2;21043:3;20984:67;:::i;:::-;20977:74;;21060:93;21149:3;21060:93;:::i;:::-;21178:2;21173:3;21169:12;21162:19;;20821:366;;;:::o;21193:419::-;21359:4;21397:2;21386:9;21382:18;21374:26;;21446:9;21440:4;21436:20;21432:1;21421:9;21417:17;21410:47;21474:131;21600:4;21474:131;:::i;:::-;21466:139;;21193:419;;;:::o;21618:248::-;21758:34;21754:1;21746:6;21742:14;21735:58;21827:31;21822:2;21814:6;21810:15;21803:56;21618:248;:::o;21872:366::-;22014:3;22035:67;22099:2;22094:3;22035:67;:::i;:::-;22028:74;;22111:93;22200:3;22111:93;:::i;:::-;22229:2;22224:3;22220:12;22213:19;;21872:366;;;:::o;22244:419::-;22410:4;22448:2;22437:9;22433:18;22425:26;;22497:9;22491:4;22487:20;22483:1;22472:9;22468:17;22461:47;22525:131;22651:4;22525:131;:::i;:::-;22517:139;;22244:419;;;:::o;22669:143::-;22726:5;22757:6;22751:13;22742:22;;22773:33;22800:5;22773:33;:::i;:::-;22669:143;;;;:::o;22818:351::-;22888:6;22937:2;22925:9;22916:7;22912:23;22908:32;22905:119;;;22943:79;;:::i;:::-;22905:119;23063:1;23088:64;23144:7;23135:6;23124:9;23120:22;23088:64;:::i;:::-;23078:74;;23034:128;22818:351;;;;:::o;23175:232::-;23315:34;23311:1;23303:6;23299:14;23292:58;23384:15;23379:2;23371:6;23367:15;23360:40;23175:232;:::o;23413:366::-;23555:3;23576:67;23640:2;23635:3;23576:67;:::i;:::-;23569:74;;23652:93;23741:3;23652:93;:::i;:::-;23770:2;23765:3;23761:12;23754:19;;23413:366;;;:::o;23785:419::-;23951:4;23989:2;23978:9;23974:18;23966:26;;24038:9;24032:4;24028:20;24024:1;24013:9;24009:17;24002:47;24066:131;24192:4;24066:131;:::i;:::-;24058:139;;23785:419;;;:::o;24210:180::-;24258:77;24255:1;24248:88;24355:4;24352:1;24345:15;24379:4;24376:1;24369:15;24396:410;24436:7;24459:20;24477:1;24459:20;:::i;:::-;24454:25;;24493:20;24511:1;24493:20;:::i;:::-;24488:25;;24548:1;24545;24541:9;24570:30;24588:11;24570:30;:::i;:::-;24559:41;;24749:1;24740:7;24736:15;24733:1;24730:22;24710:1;24703:9;24683:83;24660:139;;24779:18;;:::i;:::-;24660:139;24444:362;24396:410;;;;:::o;24812:180::-;24860:77;24857:1;24850:88;24957:4;24954:1;24947:15;24981:4;24978:1;24971:15;24998:185;25038:1;25055:20;25073:1;25055:20;:::i;:::-;25050:25;;25089:20;25107:1;25089:20;:::i;:::-;25084:25;;25128:1;25118:35;;25133:18;;:::i;:::-;25118:35;25175:1;25172;25168:9;25163:14;;24998:185;;;;:::o;25189:166::-;25329:18;25325:1;25317:6;25313:14;25306:42;25189:166;:::o;25361:366::-;25503:3;25524:67;25588:2;25583:3;25524:67;:::i;:::-;25517:74;;25600:93;25689:3;25600:93;:::i;:::-;25718:2;25713:3;25709:12;25702:19;;25361:366;;;:::o;25733:419::-;25899:4;25937:2;25926:9;25922:18;25914:26;;25986:9;25980:4;25976:20;25972:1;25961:9;25957:17;25950:47;26014:131;26140:4;26014:131;:::i;:::-;26006:139;;25733:419;;;:::o;26158:180::-;26206:77;26203:1;26196:88;26303:4;26300:1;26293:15;26327:4;26324:1;26317:15;26344:233;26383:3;26406:24;26424:5;26406:24;:::i;:::-;26397:33;;26452:66;26445:5;26442:77;26439:103;;26522:18;;:::i;:::-;26439:103;26569:1;26562:5;26558:13;26551:20;;26344:233;;;:::o;26583:230::-;26723:34;26719:1;26711:6;26707:14;26700:58;26792:13;26787:2;26779:6;26775:15;26768:38;26583:230;:::o;26819:366::-;26961:3;26982:67;27046:2;27041:3;26982:67;:::i;:::-;26975:74;;27058:93;27147:3;27058:93;:::i;:::-;27176:2;27171:3;27167:12;27160:19;;26819:366;;;:::o;27191:419::-;27357:4;27395:2;27384:9;27380:18;27372:26;;27444:9;27438:4;27434:20;27430:1;27419:9;27415:17;27408:47;27472:131;27598:4;27472:131;:::i;:::-;27464:139;;27191:419;;;:::o;27616:147::-;27717:11;27754:3;27739:18;;27616:147;;;;:::o;27769:114::-;;:::o;27889:398::-;28048:3;28069:83;28150:1;28145:3;28069:83;:::i;:::-;28062:90;;28161:93;28250:3;28161:93;:::i;:::-;28279:1;28274:3;28270:11;28263:18;;27889:398;;;:::o;28293:379::-;28477:3;28499:147;28642:3;28499:147;:::i;:::-;28492:154;;28663:3;28656:10;;28293:379;;;:::o;28678:168::-;28818:20;28814:1;28806:6;28802:14;28795:44;28678:168;:::o;28852:366::-;28994:3;29015:67;29079:2;29074:3;29015:67;:::i;:::-;29008:74;;29091:93;29180:3;29091:93;:::i;:::-;29209:2;29204:3;29200:12;29193:19;;28852:366;;;:::o;29224:419::-;29390:4;29428:2;29417:9;29413:18;29405:26;;29477:9;29471:4;29467:20;29463:1;29452:9;29448:17;29441:47;29505:131;29631:4;29505:131;:::i;:::-;29497:139;;29224:419;;;:::o;29649:231::-;29789:34;29785:1;29777:6;29773:14;29766:58;29858:14;29853:2;29845:6;29841:15;29834:39;29649:231;:::o;29886:366::-;30028:3;30049:67;30113:2;30108:3;30049:67;:::i;:::-;30042:74;;30125:93;30214:3;30125:93;:::i;:::-;30243:2;30238:3;30234:12;30227:19;;29886:366;;;:::o;30258:419::-;30424:4;30462:2;30451:9;30447:18;30439:26;;30511:9;30505:4;30501:20;30497:1;30486:9;30482:17;30475:47;30539:131;30665:4;30539:131;:::i;:::-;30531:139;;30258:419;;;:::o;30683:141::-;30732:4;30755:3;30747:11;;30778:3;30775:1;30768:14;30812:4;30809:1;30799:18;30791:26;;30683:141;;;:::o;30830:93::-;30867:6;30914:2;30909;30902:5;30898:14;30894:23;30884:33;;30830:93;;;:::o;30929:107::-;30973:8;31023:5;31017:4;31013:16;30992:37;;30929:107;;;;:::o;31042:393::-;31111:6;31161:1;31149:10;31145:18;31184:97;31214:66;31203:9;31184:97;:::i;:::-;31302:39;31332:8;31321:9;31302:39;:::i;:::-;31290:51;;31374:4;31370:9;31363:5;31359:21;31350:30;;31423:4;31413:8;31409:19;31402:5;31399:30;31389:40;;31118:317;;31042:393;;;;;:::o;31441:142::-;31491:9;31524:53;31542:34;31551:24;31569:5;31551:24;:::i;:::-;31542:34;:::i;:::-;31524:53;:::i;:::-;31511:66;;31441:142;;;:::o;31589:75::-;31632:3;31653:5;31646:12;;31589:75;;;:::o;31670:269::-;31780:39;31811:7;31780:39;:::i;:::-;31841:91;31890:41;31914:16;31890:41;:::i;:::-;31882:6;31875:4;31869:11;31841:91;:::i;:::-;31835:4;31828:105;31746:193;31670:269;;;:::o;31945:73::-;31990:3;31945:73;:::o;32024:189::-;32101:32;;:::i;:::-;32142:65;32200:6;32192;32186:4;32142:65;:::i;:::-;32077:136;32024:189;;:::o;32219:186::-;32279:120;32296:3;32289:5;32286:14;32279:120;;;32350:39;32387:1;32380:5;32350:39;:::i;:::-;32323:1;32316:5;32312:13;32303:22;;32279:120;;;32219:186;;:::o;32411:543::-;32512:2;32507:3;32504:11;32501:446;;;32546:38;32578:5;32546:38;:::i;:::-;32630:29;32648:10;32630:29;:::i;:::-;32620:8;32616:44;32813:2;32801:10;32798:18;32795:49;;;32834:8;32819:23;;32795:49;32857:80;32913:22;32931:3;32913:22;:::i;:::-;32903:8;32899:37;32886:11;32857:80;:::i;:::-;32516:431;;32501:446;32411:543;;;:::o;32960:117::-;33014:8;33064:5;33058:4;33054:16;33033:37;;32960:117;;;;:::o;33083:169::-;33127:6;33160:51;33208:1;33204:6;33196:5;33193:1;33189:13;33160:51;:::i;:::-;33156:56;33241:4;33235;33231:15;33221:25;;33134:118;33083:169;;;;:::o;33257:295::-;33333:4;33479:29;33504:3;33498:4;33479:29;:::i;:::-;33471:37;;33541:3;33538:1;33534:11;33528:4;33525:21;33517:29;;33257:295;;;;:::o;33557:1395::-;33674:37;33707:3;33674:37;:::i;:::-;33776:18;33768:6;33765:30;33762:56;;;33798:18;;:::i;:::-;33762:56;33842:38;33874:4;33868:11;33842:38;:::i;:::-;33927:67;33987:6;33979;33973:4;33927:67;:::i;:::-;34021:1;34045:4;34032:17;;34077:2;34069:6;34066:14;34094:1;34089:618;;;;34751:1;34768:6;34765:77;;;34817:9;34812:3;34808:19;34802:26;34793:35;;34765:77;34868:67;34928:6;34921:5;34868:67;:::i;:::-;34862:4;34855:81;34724:222;34059:887;;34089:618;34141:4;34137:9;34129:6;34125:22;34175:37;34207:4;34175:37;:::i;:::-;34234:1;34248:208;34262:7;34259:1;34256:14;34248:208;;;34341:9;34336:3;34332:19;34326:26;34318:6;34311:42;34392:1;34384:6;34380:14;34370:24;;34439:2;34428:9;34424:18;34411:31;;34285:4;34282:1;34278:12;34273:17;;34248:208;;;34484:6;34475:7;34472:19;34469:179;;;34542:9;34537:3;34533:19;34527:26;34585:48;34627:4;34619:6;34615:17;34604:9;34585:48;:::i;:::-;34577:6;34570:64;34492:156;34469:179;34694:1;34690;34682:6;34678:14;34674:22;34668:4;34661:36;34096:611;;;34059:887;;33649:1303;;;33557:1395;;:::o;34958:174::-;35098:26;35094:1;35086:6;35082:14;35075:50;34958:174;:::o;35138:366::-;35280:3;35301:67;35365:2;35360:3;35301:67;:::i;:::-;35294:74;;35377:93;35466:3;35377:93;:::i;:::-;35495:2;35490:3;35486:12;35479:19;;35138:366;;;:::o;35510:419::-;35676:4;35714:2;35703:9;35699:18;35691:26;;35763:9;35757:4;35753:20;35749:1;35738:9;35734:17;35727:47;35791:131;35917:4;35791:131;:::i;:::-;35783:139;;35510:419;;;:::o;35935:166::-;36075:18;36071:1;36063:6;36059:14;36052:42;35935:166;:::o;36107:366::-;36249:3;36270:67;36334:2;36329:3;36270:67;:::i;:::-;36263:74;;36346:93;36435:3;36346:93;:::i;:::-;36464:2;36459:3;36455:12;36448:19;;36107:366;;;:::o;36479:419::-;36645:4;36683:2;36672:9;36668:18;36660:26;;36732:9;36726:4;36722:20;36718:1;36707:9;36703:17;36696:47;36760:131;36886:4;36760:131;:::i;:::-;36752:139;;36479:419;;;:::o;36904:228::-;37044:34;37040:1;37032:6;37028:14;37021:58;37113:11;37108:2;37100:6;37096:15;37089:36;36904:228;:::o;37138:366::-;37280:3;37301:67;37365:2;37360:3;37301:67;:::i;:::-;37294:74;;37377:93;37466:3;37377:93;:::i;:::-;37495:2;37490:3;37486:12;37479:19;;37138:366;;;:::o;37510:419::-;37676:4;37714:2;37703:9;37699:18;37691:26;;37763:9;37757:4;37753:20;37749:1;37738:9;37734:17;37727:47;37791:131;37917:4;37791:131;:::i;:::-;37783:139;;37510:419;;;:::o;37935:170::-;38075:22;38071:1;38063:6;38059:14;38052:46;37935:170;:::o;38111:366::-;38253:3;38274:67;38338:2;38333:3;38274:67;:::i;:::-;38267:74;;38350:93;38439:3;38350:93;:::i;:::-;38468:2;38463:3;38459:12;38452:19;;38111:366;;;:::o;38483:419::-;38649:4;38687:2;38676:9;38672:18;38664:26;;38736:9;38730:4;38726:20;38722:1;38711:9;38707:17;38700:47;38764:131;38890:4;38764:131;:::i;:::-;38756:139;;38483:419;;;:::o;38908:191::-;38948:3;38967:20;38985:1;38967:20;:::i;:::-;38962:25;;39001:20;39019:1;39001:20;:::i;:::-;38996:25;;39044:1;39041;39037:9;39030:16;;39065:3;39062:1;39059:10;39056:36;;;39072:18;;:::i;:::-;39056:36;38908:191;;;;:::o;39105:164::-;39245:16;39241:1;39233:6;39229:14;39222:40;39105:164;:::o;39275:366::-;39417:3;39438:67;39502:2;39497:3;39438:67;:::i;:::-;39431:74;;39514:93;39603:3;39514:93;:::i;:::-;39632:2;39627:3;39623:12;39616:19;;39275:366;;;:::o;39647:419::-;39813:4;39851:2;39840:9;39836:18;39828:26;;39900:9;39894:4;39890:20;39886:1;39875:9;39871:17;39864:47;39928:131;40054:4;39928:131;:::i;:::-;39920:139;;39647:419;;;:::o;40072:170::-;40212:22;40208:1;40200:6;40196:14;40189:46;40072:170;:::o;40248:366::-;40390:3;40411:67;40475:2;40470:3;40411:67;:::i;:::-;40404:74;;40487:93;40576:3;40487:93;:::i;:::-;40605:2;40600:3;40596:12;40589:19;;40248:366;;;:::o;40620:419::-;40786:4;40824:2;40813:9;40809:18;40801:26;;40873:9;40867:4;40863:20;40859:1;40848:9;40844:17;40837:47;40901:131;41027:4;40901:131;:::i;:::-;40893:139;;40620:419;;;:::o;41045:228::-;41185:34;41181:1;41173:6;41169:14;41162:58;41254:11;41249:2;41241:6;41237:15;41230:36;41045:228;:::o;41279:366::-;41421:3;41442:67;41506:2;41501:3;41442:67;:::i;:::-;41435:74;;41518:93;41607:3;41518:93;:::i;:::-;41636:2;41631:3;41627:12;41620:19;;41279:366;;;:::o;41651:419::-;41817:4;41855:2;41844:9;41840:18;41832:26;;41904:9;41898:4;41894:20;41890:1;41879:9;41875:17;41868:47;41932:131;42058:4;41932:131;:::i;:::-;41924:139;;41651:419;;;:::o;42076:175::-;42216:27;42212:1;42204:6;42200:14;42193:51;42076:175;:::o;42257:366::-;42399:3;42420:67;42484:2;42479:3;42420:67;:::i;:::-;42413:74;;42496:93;42585:3;42496:93;:::i;:::-;42614:2;42609:3;42605:12;42598:19;;42257:366;;;:::o;42629:419::-;42795:4;42833:2;42822:9;42818:18;42810:26;;42882:9;42876:4;42872:20;42868:1;42857:9;42853:17;42846:47;42910:131;43036:4;42910:131;:::i;:::-;42902:139;;42629:419;;;:::o;43054:170::-;43194:22;43190:1;43182:6;43178:14;43171:46;43054:170;:::o;43230:366::-;43372:3;43393:67;43457:2;43452:3;43393:67;:::i;:::-;43386:74;;43469:93;43558:3;43469:93;:::i;:::-;43587:2;43582:3;43578:12;43571:19;;43230:366;;;:::o;43602:419::-;43768:4;43806:2;43795:9;43791:18;43783:26;;43855:9;43849:4;43845:20;43841:1;43830:9;43826:17;43819:47;43883:131;44009:4;43883:131;:::i;:::-;43875:139;;43602:419;;;:::o;44027:169::-;44167:21;44163:1;44155:6;44151:14;44144:45;44027:169;:::o;44202:366::-;44344:3;44365:67;44429:2;44424:3;44365:67;:::i;:::-;44358:74;;44441:93;44530:3;44441:93;:::i;:::-;44559:2;44554:3;44550:12;44543:19;;44202:366;;;:::o;44574:419::-;44740:4;44778:2;44767:9;44763:18;44755:26;;44827:9;44821:4;44817:20;44813:1;44802:9;44798:17;44791:47;44855:131;44981:4;44855:131;:::i;:::-;44847:139;;44574:419;;;:::o;44999:168::-;45139:20;45135:1;45127:6;45123:14;45116:44;44999:168;:::o;45173:366::-;45315:3;45336:67;45400:2;45395:3;45336:67;:::i;:::-;45329:74;;45412:93;45501:3;45412:93;:::i;:::-;45530:2;45525:3;45521:12;45514:19;;45173:366;;;:::o;45545:419::-;45711:4;45749:2;45738:9;45734:18;45726:26;;45798:9;45792:4;45788:20;45784:1;45773:9;45769:17;45762:47;45826:131;45952:4;45826:131;:::i;:::-;45818:139;;45545:419;;;:::o;45970:234::-;46110:34;46106:1;46098:6;46094:14;46087:58;46179:17;46174:2;46166:6;46162:15;46155:42;45970:234;:::o;46210:366::-;46352:3;46373:67;46437:2;46432:3;46373:67;:::i;:::-;46366:74;;46449:93;46538:3;46449:93;:::i;:::-;46567:2;46562:3;46558:12;46551:19;;46210:366;;;:::o;46582:419::-;46748:4;46786:2;46775:9;46771:18;46763:26;;46835:9;46829:4;46825:20;46821:1;46810:9;46806:17;46799:47;46863:131;46989:4;46863:131;:::i;:::-;46855:139;;46582:419;;;:::o;47007:148::-;47109:11;47146:3;47131:18;;47007:148;;;;:::o;47161:390::-;47267:3;47295:39;47328:5;47295:39;:::i;:::-;47350:89;47432:6;47427:3;47350:89;:::i;:::-;47343:96;;47448:65;47506:6;47501:3;47494:4;47487:5;47483:16;47448:65;:::i;:::-;47538:6;47533:3;47529:16;47522:23;;47271:280;47161:390;;;;:::o;47581:874::-;47684:3;47721:5;47715:12;47750:36;47776:9;47750:36;:::i;:::-;47802:89;47884:6;47879:3;47802:89;:::i;:::-;47795:96;;47922:1;47911:9;47907:17;47938:1;47933:166;;;;48113:1;48108:341;;;;47900:549;;47933:166;48017:4;48013:9;48002;47998:25;47993:3;47986:38;48079:6;48072:14;48065:22;48057:6;48053:35;48048:3;48044:45;48037:52;;47933:166;;48108:341;48175:38;48207:5;48175:38;:::i;:::-;48235:1;48249:154;48263:6;48260:1;48257:13;48249:154;;;48337:7;48331:14;48327:1;48322:3;48318:11;48311:35;48387:1;48378:7;48374:15;48363:26;;48285:4;48282:1;48278:12;48273:17;;48249:154;;;48432:6;48427:3;48423:16;48416:23;;48115:334;;47900:549;;47688:767;;47581:874;;;;:::o;48461:589::-;48686:3;48708:95;48799:3;48790:6;48708:95;:::i;:::-;48701:102;;48820:95;48911:3;48902:6;48820:95;:::i;:::-;48813:102;;48932:92;49020:3;49011:6;48932:92;:::i;:::-;48925:99;;49041:3;49034:10;;48461:589;;;;;;:::o;49056:225::-;49196:34;49192:1;49184:6;49180:14;49173:58;49265:8;49260:2;49252:6;49248:15;49241:33;49056:225;:::o;49287:366::-;49429:3;49450:67;49514:2;49509:3;49450:67;:::i;:::-;49443:74;;49526:93;49615:3;49526:93;:::i;:::-;49644:2;49639:3;49635:12;49628:19;;49287:366;;;:::o;49659:419::-;49825:4;49863:2;49852:9;49848:18;49840:26;;49912:9;49906:4;49902:20;49898:1;49887:9;49883:17;49876:47;49940:131;50066:4;49940:131;:::i;:::-;49932:139;;49659:419;;;:::o;50084:182::-;50224:34;50220:1;50212:6;50208:14;50201:58;50084:182;:::o;50272:366::-;50414:3;50435:67;50499:2;50494:3;50435:67;:::i;:::-;50428:74;;50511:93;50600:3;50511:93;:::i;:::-;50629:2;50624:3;50620:12;50613:19;;50272:366;;;:::o;50644:419::-;50810:4;50848:2;50837:9;50833:18;50825:26;;50897:9;50891:4;50887:20;50883:1;50872:9;50868:17;50861:47;50925:131;51051:4;50925:131;:::i;:::-;50917:139;;50644:419;;;:::o;51069:224::-;51209:34;51205:1;51197:6;51193:14;51186:58;51278:7;51273:2;51265:6;51261:15;51254:32;51069:224;:::o;51299:366::-;51441:3;51462:67;51526:2;51521:3;51462:67;:::i;:::-;51455:74;;51538:93;51627:3;51538:93;:::i;:::-;51656:2;51651:3;51647:12;51640:19;;51299:366;;;:::o;51671:419::-;51837:4;51875:2;51864:9;51860:18;51852:26;;51924:9;51918:4;51914:20;51910:1;51899:9;51895:17;51888:47;51952:131;52078:4;51952:131;:::i;:::-;51944:139;;51671:419;;;:::o;52096:223::-;52236:34;52232:1;52224:6;52220:14;52213:58;52305:6;52300:2;52292:6;52288:15;52281:31;52096:223;:::o;52325:366::-;52467:3;52488:67;52552:2;52547:3;52488:67;:::i;:::-;52481:74;;52564:93;52653:3;52564:93;:::i;:::-;52682:2;52677:3;52673:12;52666:19;;52325:366;;;:::o;52697:419::-;52863:4;52901:2;52890:9;52886:18;52878:26;;52950:9;52944:4;52940:20;52936:1;52925:9;52921:17;52914:47;52978:131;53104:4;52978:131;:::i;:::-;52970:139;;52697:419;;;:::o;53122:181::-;53262:33;53258:1;53250:6;53246:14;53239:57;53122:181;:::o;53309:366::-;53451:3;53472:67;53536:2;53531:3;53472:67;:::i;:::-;53465:74;;53548:93;53637:3;53548:93;:::i;:::-;53666:2;53661:3;53657:12;53650:19;;53309:366;;;:::o;53681:419::-;53847:4;53885:2;53874:9;53870:18;53862:26;;53934:9;53928:4;53924:20;53920:1;53909:9;53905:17;53898:47;53962:131;54088:4;53962:131;:::i;:::-;53954:139;;53681:419;;;:::o;54106:175::-;54246:27;54242:1;54234:6;54230:14;54223:51;54106:175;:::o;54287:366::-;54429:3;54450:67;54514:2;54509:3;54450:67;:::i;:::-;54443:74;;54526:93;54615:3;54526:93;:::i;:::-;54644:2;54639:3;54635:12;54628:19;;54287:366;;;:::o;54659:419::-;54825:4;54863:2;54852:9;54848:18;54840:26;;54912:9;54906:4;54902:20;54898:1;54887:9;54883:17;54876:47;54940:131;55066:4;54940:131;:::i;:::-;54932:139;;54659:419;;;:::o;55084:237::-;55224:34;55220:1;55212:6;55208:14;55201:58;55293:20;55288:2;55280:6;55276:15;55269:45;55084:237;:::o;55327:366::-;55469:3;55490:67;55554:2;55549:3;55490:67;:::i;:::-;55483:74;;55566:93;55655:3;55566:93;:::i;:::-;55684:2;55679:3;55675:12;55668:19;;55327:366;;;:::o;55699:419::-;55865:4;55903:2;55892:9;55888:18;55880:26;;55952:9;55946:4;55942:20;55938:1;55927:9;55923:17;55916:47;55980:131;56106:4;55980:131;:::i;:::-;55972:139;;55699:419;;;:::o;56124:240::-;56264:34;56260:1;56252:6;56248:14;56241:58;56333:23;56328:2;56320:6;56316:15;56309:48;56124:240;:::o;56370:366::-;56512:3;56533:67;56597:2;56592:3;56533:67;:::i;:::-;56526:74;;56609:93;56698:3;56609:93;:::i;:::-;56727:2;56722:3;56718:12;56711:19;;56370:366;;;:::o;56742:419::-;56908:4;56946:2;56935:9;56931:18;56923:26;;56995:9;56989:4;56985:20;56981:1;56970:9;56966:17;56959:47;57023:131;57149:4;57023:131;:::i;:::-;57015:139;;56742:419;;;:::o;57167:98::-;57218:6;57252:5;57246:12;57236:22;;57167:98;;;:::o;57271:168::-;57354:11;57388:6;57383:3;57376:19;57428:4;57423:3;57419:14;57404:29;;57271:168;;;;:::o;57445:373::-;57531:3;57559:38;57591:5;57559:38;:::i;:::-;57613:70;57676:6;57671:3;57613:70;:::i;:::-;57606:77;;57692:65;57750:6;57745:3;57738:4;57731:5;57727:16;57692:65;:::i;:::-;57782:29;57804:6;57782:29;:::i;:::-;57777:3;57773:39;57766:46;;57535:283;57445:373;;;;:::o;57824:640::-;58019:4;58057:3;58046:9;58042:19;58034:27;;58071:71;58139:1;58128:9;58124:17;58115:6;58071:71;:::i;:::-;58152:72;58220:2;58209:9;58205:18;58196:6;58152:72;:::i;:::-;58234;58302:2;58291:9;58287:18;58278:6;58234:72;:::i;:::-;58353:9;58347:4;58343:20;58338:2;58327:9;58323:18;58316:48;58381:76;58452:4;58443:6;58381:76;:::i;:::-;58373:84;;57824:640;;;;;;;:::o;58470:141::-;58526:5;58557:6;58551:13;58542:22;;58573:32;58599:5;58573:32;:::i;:::-;58470:141;;;;:::o;58617:349::-;58686:6;58735:2;58723:9;58714:7;58710:23;58706:32;58703:119;;;58741:79;;:::i;:::-;58703:119;58861:1;58886:63;58941:7;58932:6;58921:9;58917:22;58886:63;:::i;:::-;58876:73;;58832:127;58617:349;;;;:::o;58972:194::-;59012:4;59032:20;59050:1;59032:20;:::i;:::-;59027:25;;59066:20;59084:1;59066:20;:::i;:::-;59061:25;;59110:1;59107;59103:9;59095:17;;59134:1;59128:4;59125:11;59122:37;;;59139:18;;:::i;:::-;59122:37;58972:194;;;;:::o;59172:180::-;59220:77;59217:1;59210:88;59317:4;59314:1;59307:15;59341:4;59338:1;59331:15;59358:182;59498:34;59494:1;59486:6;59482:14;59475:58;59358:182;:::o;59546:366::-;59688:3;59709:67;59773:2;59768:3;59709:67;:::i;:::-;59702:74;;59785:93;59874:3;59785:93;:::i;:::-;59903:2;59898:3;59894:12;59887:19;;59546:366;;;:::o;59918:419::-;60084:4;60122:2;60111:9;60107:18;60099:26;;60171:9;60165:4;60161:20;60157:1;60146:9;60142:17;60135:47;60199:131;60325:4;60199:131;:::i;:::-;60191:139;;59918:419;;;:::o;60343:178::-;60483:30;60479:1;60471:6;60467:14;60460:54;60343:178;:::o;60527:366::-;60669:3;60690:67;60754:2;60749:3;60690:67;:::i;:::-;60683:74;;60766:93;60855:3;60766:93;:::i;:::-;60884:2;60879:3;60875:12;60868:19;;60527:366;;;:::o;60899:419::-;61065:4;61103:2;61092:9;61088:18;61080:26;;61152:9;61146:4;61142:20;61138:1;61127:9;61123:17;61116:47;61180:131;61306:4;61180:131;:::i;:::-;61172:139;;60899:419;;;:::o

Swarm Source

ipfs://1e52e4e63b324c0197f3ecc5e8152796e54226b38ae6ee545b02410bababefac
Loading