ETH Price: $2,307.55 (-0.48%)

Token

 

Overview

Max Total Supply

50,000,000,000

Holders

7

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
0xb94393171d776edf8182d184f7bca64da7cfe966
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
DigitalPowerTokenBanks

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-01-13
*/

// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/utils/math/Math.sol


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

pragma solidity ^0.8.7;

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


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

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


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

/**
 * @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/utils/introspection/IERC165.sol


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

pragma solidity ^0.8.7;

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

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


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

pragma solidity ^0.8.7;


/**
 * @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/ERC1155/IERC1155Receiver.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.7;


/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
     * @dev Handles the receipt of a single ERC1155 token type. This function is
     * called at the end of a `safeTransferFrom` after the balance has been updated.
     *
     * NOTE: To accept the transfer, this must return
     * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     * (i.e. 0xf23a6e61, or its own function selector).
     *
     * @param operator The address which initiated the transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param id The ID of the token being transferred
     * @param value The amount of tokens being transferred
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
     */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
     * @dev Handles the receipt of a multiple ERC1155 token types. This function
     * is called at the end of a `safeBatchTransferFrom` after the balances have
     * been updated.
     *
     * NOTE: To accept the transfer(s), this must return
     * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
     * (i.e. 0xbc197c81, or its own function selector).
     *
     * @param operator The address which initiated the batch transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param ids An array containing ids of each token being transferred (order and length must match values array)
     * @param values An array containing amounts of each token being transferred (order and length must match ids array)
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
     */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/token/ERC1155/IERC1155.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.7;


/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

// File: @openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)

pragma solidity ^0.8.7;


/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}

// File: @openzeppelin/contracts/token/ERC1155/ERC1155.sol


// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC1155/ERC1155.sol)

pragma solidity ^0.8.7;







/**
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using Address for address;

    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) private _balances;

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

    // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
    string private _uri;

    /**
     * @dev See {_setURI}.
     */
    constructor(string memory uri_) {
        _setURI(uri_);
    }

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

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256) public view virtual override returns (string memory) {
        return _uri;
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
        require(account != address(0), "ERC1155: address zero is not a valid owner");
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

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

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

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not token owner or approved"
        );
        _safeTransferFrom(from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not token owner or approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }
        _balances[id][to] += amount;

        emit TransferSingle(operator, from, to, id, amount);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
            _balances[id][to] += amount;
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
    }

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * By this mechanism, any occurrence of the `\{id\}` substring in either the
     * URI or any of the amounts in the JSON file at said URI will be replaced by
     * clients with the token type ID.
     *
     * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
     * interpreted by clients as
     * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
     * for token type ID 0x4cce0.
     *
     * See {uri}.
     *
     * Because these URIs cannot be meaningfully represented by the {URI} event,
     * this function emits no events.
     */
    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        _balances[id][to] += amount;
        emit TransferSingle(operator, address(0), to, id, amount);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `from`
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `from` must have at least `amount` tokens of token type `id`.
     */
    function _burn(
        address from,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }

        emit TransferSingle(operator, from, address(0), id, amount);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(
        address from,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        for (uint256 i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
        }

        emit TransferBatch(operator, from, address(0), ids, amounts);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @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, "ERC1155: setting approval status for self");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `ids` and `amounts` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    /**
     * @dev Hook that is called after any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
                if (response != IERC1155Receiver.onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non-ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (
                bytes4 response
            ) {
                if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non-ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}

// File: Digital Power Token Banks.sol

// contracts/Digital Power Token Banks.sol

pragma solidity ^0.8.7;




contract DigitalPowerTokenBanks is ERC1155, Ownable {
    
    uint256 public constant V1 = 1;
    uint256 public constant V2 = 2;
    uint256 public constant V3 = 3;
    uint256 public constant V4 = 4;
    uint256 public constant V5 = 5;
    uint256 public constant V6 = 6;
    uint256 public constant V7 = 7;
    uint256 public constant V8 = 8;
    uint256 public constant V9 = 9;
    uint256 public constant V10 = 10;
    uint256 public constant V11 = 11;
    uint256 public constant V12 = 12;
    uint256 public constant V13 = 13;
    uint256 public constant V14 = 14;
    uint256 public constant V15 = 15;
    uint256 public constant V16 = 16;
    uint256 public constant V17 = 17;
    uint256 public constant V18 = 18;
    uint256 public constant V19 = 19;
    uint256 public constant V20 = 20;
    uint256 public constant V21 = 21;
    uint256 public constant V22 = 22;
    uint256 public constant V23 = 23;
    uint256 public constant V24 = 24;
    uint256 public constant V25 = 25;
    uint256 public constant V26 = 26;
    uint256 public constant V27 = 27;
    uint256 public constant V28 = 28;
    uint256 public constant V29 = 29;
    uint256 public constant V30 = 30;
    uint256 public constant V31 = 31;
    uint256 public constant V32 = 32;
    uint256 public constant V33 = 33;
    uint256 public constant V34 = 34;
    uint256 public constant V35 = 35;
    uint256 public constant V36 = 36;
    uint256 public constant V37 = 37;
    uint256 public constant V38 = 38;
    uint256 public constant V39 = 39;
    uint256 public constant V40 = 40;
    uint256 public constant V41 = 41;
    uint256 public constant V42 = 42;
    uint256 public constant V43 = 43;
    uint256 public constant V44 = 44;
    uint256 public constant V45 = 45;
    uint256 public constant V46 = 46;
    uint256 public constant V47 = 47;
    uint256 public constant V48 = 48;
    uint256 public constant V49 = 49;
    uint256 public constant V50 = 50;


    mapping (uint256 => string) private _uris;

    constructor() public ERC1155("") {
        _mint(msg.sender, V1, 1000000000, "");
        _mint(msg.sender, V2, 1000000000, "");
        _mint(msg.sender, V3, 1000000000, "");
        _mint(msg.sender, V4, 1000000000, "");
        _mint(msg.sender, V5, 1000000000, "");
        _mint(msg.sender, V6, 1000000000, "");
        _mint(msg.sender, V7, 1000000000, "");
        _mint(msg.sender, V8, 1000000000, "");
        _mint(msg.sender, V9, 1000000000, "");
        _mint(msg.sender, V10, 1000000000, "");
        _mint(msg.sender, V11, 1000000000, "");
        _mint(msg.sender, V12, 1000000000, "");
        _mint(msg.sender, V13, 1000000000, "");
        _mint(msg.sender, V14, 1000000000, "");
        _mint(msg.sender, V15, 1000000000, "");
        _mint(msg.sender, V16, 1000000000, "");
        _mint(msg.sender, V17, 1000000000, "");
        _mint(msg.sender, V18, 1000000000, "");
        _mint(msg.sender, V19, 1000000000, "");
        _mint(msg.sender, V20, 1000000000, "");
        _mint(msg.sender, V21, 1000000000, "");
        _mint(msg.sender, V22, 1000000000, "");
        _mint(msg.sender, V23, 1000000000, "");
        _mint(msg.sender, V24, 1000000000, "");
        _mint(msg.sender, V25, 1000000000, "");
        _mint(msg.sender, V26, 1000000000, "");
        _mint(msg.sender, V27, 1000000000, "");
        _mint(msg.sender, V28, 1000000000, "");
        _mint(msg.sender, V29, 1000000000, "");
        _mint(msg.sender, V30, 1000000000, "");
        _mint(msg.sender, V31, 1000000000, "");
        _mint(msg.sender, V32, 1000000000, "");
        _mint(msg.sender, V33, 1000000000, "");
        _mint(msg.sender, V34, 1000000000, "");
        _mint(msg.sender, V35, 1000000000, "");
        _mint(msg.sender, V36, 1000000000, "");
        _mint(msg.sender, V37, 1000000000, "");
        _mint(msg.sender, V38, 1000000000, "");
        _mint(msg.sender, V39, 1000000000, "");
        _mint(msg.sender, V40, 1000000000, "");
        _mint(msg.sender, V41, 1000000000, "");
        _mint(msg.sender, V42, 1000000000, "");
        _mint(msg.sender, V43, 1000000000, "");
        _mint(msg.sender, V44, 1000000000, "");
        _mint(msg.sender, V45, 1000000000, "");
        _mint(msg.sender, V46, 1000000000, "");
        _mint(msg.sender, V47, 1000000000, "");
        _mint(msg.sender, V48, 1000000000, "");
        _mint(msg.sender, V49, 1000000000, "");
        _mint(msg.sender, V50, 1000000000, "");
    }

    function uri(uint256 tokenId) override public view returns (string memory) {
        return(_uris[tokenId]);
    }
    
    function setTokenUri(uint256 tokenId, string memory uri) public onlyOwner {
        require(bytes(_uris[tokenId]).length == 0, "Cannot set uri twice"); 
        _uris[tokenId] = uri; 
    }
    
    function mint(address _to, uint _id, uint _amount) external onlyOwner {
        _mint(_to, _id, _amount, "");
    }

    function mintBatch(address _to, uint[] memory _ids, uint[] memory _amounts) external onlyOwner {
        _mintBatch(_to, _ids, _amounts, "");
    }

    function burn(uint _id, uint _amount) external onlyOwner {
        _burn(msg.sender, _id, _amount);
    }

    function burnBatch(uint[] memory _ids, uint[] memory _amounts) external onlyOwner {
       _burnBatch(msg.sender, _ids, _amounts);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","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":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"V1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"V10","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"V11","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"V12","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"V13","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"V14","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"V15","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"V16","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"V17","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"V18","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"V19","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"V2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"V20","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"V21","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"V22","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"V23","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"V24","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"V25","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"V26","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"V27","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"V28","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"V29","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"V3","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"V30","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"V31","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"V32","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"V33","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"V34","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"V35","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"V36","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"V37","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"V38","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"V39","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"V4","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"V40","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"V41","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"V42","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"V43","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"V44","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"V45","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"V46","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"V47","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"V48","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"V49","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"V5","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"V50","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"V6","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"V7","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"V8","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"V9","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"mintBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"uri","type":"string"}],"name":"setTokenUri","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":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b506040518060200160405280600081525062000033816200082a60201b60201c565b5062000054620000486200084660201b60201c565b6200084e60201b60201c565b6200007c336001633b9aca00604051806020016040528060008152506200091460201b60201c565b620000a4336002633b9aca00604051806020016040528060008152506200091460201b60201c565b620000cc336003633b9aca00604051806020016040528060008152506200091460201b60201c565b620000f4336004633b9aca00604051806020016040528060008152506200091460201b60201c565b6200011c336005633b9aca00604051806020016040528060008152506200091460201b60201c565b62000144336006633b9aca00604051806020016040528060008152506200091460201b60201c565b6200016c336007633b9aca00604051806020016040528060008152506200091460201b60201c565b62000194336008633b9aca00604051806020016040528060008152506200091460201b60201c565b620001bc336009633b9aca00604051806020016040528060008152506200091460201b60201c565b620001e433600a633b9aca00604051806020016040528060008152506200091460201b60201c565b6200020c33600b633b9aca00604051806020016040528060008152506200091460201b60201c565b6200023433600c633b9aca00604051806020016040528060008152506200091460201b60201c565b6200025c33600d633b9aca00604051806020016040528060008152506200091460201b60201c565b6200028433600e633b9aca00604051806020016040528060008152506200091460201b60201c565b620002ac33600f633b9aca00604051806020016040528060008152506200091460201b60201c565b620002d4336010633b9aca00604051806020016040528060008152506200091460201b60201c565b620002fc336011633b9aca00604051806020016040528060008152506200091460201b60201c565b62000324336012633b9aca00604051806020016040528060008152506200091460201b60201c565b6200034c336013633b9aca00604051806020016040528060008152506200091460201b60201c565b62000374336014633b9aca00604051806020016040528060008152506200091460201b60201c565b6200039c336015633b9aca00604051806020016040528060008152506200091460201b60201c565b620003c4336016633b9aca00604051806020016040528060008152506200091460201b60201c565b620003ec336017633b9aca00604051806020016040528060008152506200091460201b60201c565b62000414336018633b9aca00604051806020016040528060008152506200091460201b60201c565b6200043c336019633b9aca00604051806020016040528060008152506200091460201b60201c565b6200046433601a633b9aca00604051806020016040528060008152506200091460201b60201c565b6200048c33601b633b9aca00604051806020016040528060008152506200091460201b60201c565b620004b433601c633b9aca00604051806020016040528060008152506200091460201b60201c565b620004dc33601d633b9aca00604051806020016040528060008152506200091460201b60201c565b6200050433601e633b9aca00604051806020016040528060008152506200091460201b60201c565b6200052c33601f633b9aca00604051806020016040528060008152506200091460201b60201c565b62000554336020633b9aca00604051806020016040528060008152506200091460201b60201c565b6200057c336021633b9aca00604051806020016040528060008152506200091460201b60201c565b620005a4336022633b9aca00604051806020016040528060008152506200091460201b60201c565b620005cc336023633b9aca00604051806020016040528060008152506200091460201b60201c565b620005f4336024633b9aca00604051806020016040528060008152506200091460201b60201c565b6200061c336025633b9aca00604051806020016040528060008152506200091460201b60201c565b62000644336026633b9aca00604051806020016040528060008152506200091460201b60201c565b6200066c336027633b9aca00604051806020016040528060008152506200091460201b60201c565b62000694336028633b9aca00604051806020016040528060008152506200091460201b60201c565b620006bc336029633b9aca00604051806020016040528060008152506200091460201b60201c565b620006e433602a633b9aca00604051806020016040528060008152506200091460201b60201c565b6200070c33602b633b9aca00604051806020016040528060008152506200091460201b60201c565b6200073433602c633b9aca00604051806020016040528060008152506200091460201b60201c565b6200075c33602d633b9aca00604051806020016040528060008152506200091460201b60201c565b6200078433602e633b9aca00604051806020016040528060008152506200091460201b60201c565b620007ac33602f633b9aca00604051806020016040528060008152506200091460201b60201c565b620007d4336030633b9aca00604051806020016040528060008152506200091460201b60201c565b620007fc336031633b9aca00604051806020016040528060008152506200091460201b60201c565b62000824336032633b9aca00604051806020016040528060008152506200091460201b60201c565b6200153f565b80600290805190602001906200084292919062000dba565b5050565b600033905090565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141562000987576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200097e9062001076565b60405180910390fd5b6000620009996200084660201b60201c565b90506000620009ae8562000afc60201b60201c565b90506000620009c38562000afc60201b60201c565b9050620009dc8360008985858962000b7d60201b60201c565b8460008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825462000a3d919062001129565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62898960405162000abd929190620010ba565b60405180910390a462000adc8360008985858962000b8560201b60201c565b62000af38360008989898962000b8d60201b60201c565b50505050505050565b60606000600167ffffffffffffffff81111562000b1e5762000b1d6200131f565b5b60405190808252806020026020018201604052801562000b4d5781602001602082028036833780820191505090505b509050828160008151811062000b685762000b67620012f0565b5b60200260200101818152505080915050919050565b505050505050565b505050505050565b62000bb98473ffffffffffffffffffffffffffffffffffffffff1662000d9760201b620013ff1760201c565b1562000d8f578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b815260040162000c0295949392919062000fcc565b602060405180830381600087803b15801562000c1d57600080fd5b505af192505050801562000c5157506040513d601f19601f8201168201806040525081019062000c4e919062000e81565b60015b62000d035762000c606200134e565b806308c379a0141562000cc4575062000c7862001483565b8062000c85575062000cc6565b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000cbb919062001030565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000cfa9062001098565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161462000d8d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000d849062001054565b60405180910390fd5b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b82805462000dc89062001226565b90600052602060002090601f01602090048101928262000dec576000855562000e38565b82601f1062000e0757805160ff191683800117855562000e38565b8280016001018555821562000e38579182015b8281111562000e3757825182559160200191906001019062000e1a565b5b50905062000e47919062000e4b565b5090565b5b8082111562000e6657600081600090555060010162000e4c565b5090565b60008151905062000e7b8162001525565b92915050565b60006020828403121562000e9a5762000e9962001373565b5b600062000eaa8482850162000e6a565b91505092915050565b62000ebe8162001186565b82525050565b600062000ed182620010f1565b62000edd818562001107565b935062000eef818560208601620011f0565b62000efa8162001378565b840191505092915050565b600062000f1282620010fc565b62000f1e818562001118565b935062000f30818560208601620011f0565b62000f3b8162001378565b840191505092915050565b600062000f5560288362001118565b915062000f628262001396565b604082019050919050565b600062000f7c60218362001118565b915062000f8982620013e5565b604082019050919050565b600062000fa360348362001118565b915062000fb08262001434565b604082019050919050565b62000fc681620011e6565b82525050565b600060a08201905062000fe3600083018862000eb3565b62000ff2602083018762000eb3565b62001001604083018662000fbb565b62001010606083018562000fbb565b818103608083015262001024818462000ec4565b90509695505050505050565b600060208201905081810360008301526200104c818462000f05565b905092915050565b600060208201905081810360008301526200106f8162000f46565b9050919050565b60006020820190508181036000830152620010918162000f6d565b9050919050565b60006020820190508181036000830152620010b38162000f94565b9050919050565b6000604082019050620010d1600083018562000fbb565b620010e0602083018462000fbb565b9392505050565b6000604051905090565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b60006200113682620011e6565b91506200114383620011e6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156200117b576200117a62001292565b5b828201905092915050565b60006200119382620011c6565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101562001210578082015181840152602081019050620011f3565b8381111562001220576000848401525b50505050565b600060028204905060018216806200123f57607f821691505b60208210811415620012565762001255620012c1565b5b50919050565b620012678262001378565b810181811067ffffffffffffffff821117156200128957620012886200131f565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d1115620013705760046000803e6200136d60005162001389565b90505b90565b600080fd5b6000601f19601f8301169050919050565b60008160e01c9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e7366657220746f206e6f6e2d4552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b600060443d1015620014955762001522565b6200149f620010e7565b60043d036004823e80513d602482011167ffffffffffffffff82111715620014c957505062001522565b808201805167ffffffffffffffff811115620014e9575050505062001522565b80602083010160043d0385018111156200150857505050505062001522565b62001519826020018501866200125c565b82955050505050505b90565b62001530816200119a565b81146200153c57600080fd5b50565b61431d806200154f6000396000f3fe608060405234801561001057600080fd5b50600436106103e55760003560e01c806366fe39551161020a5780639970e55811610125578063c64626ff116100b8578063db34179511610087578063db34179514610b36578063e985e9c514610b54578063f242432a14610b84578063f2fde38b14610ba0578063fafe3b2214610bbc576103e5565b8063c64626ff14610ac0578063caae111214610ade578063d74e529214610afc578063d81d0a1514610b1a576103e5565b8063a5739b70116100f4578063a5739b7014610a4a578063b390c0ab14610a68578063bb3ae55614610a84578063c436843214610aa2576103e5565b80639970e558146109d45780639c58ee21146109f25780639e9a917f14610a10578063a22cb46514610a2e576103e5565b8063835716821161019d5780638ee77f471161016c5780638ee77f471461095c5780638f6ae46d1461097a57806396cd25ef1461099857806397f9e939146109b6576103e5565b806383571682146108e657806383ca4b6f1461090457806384806c33146109205780638da5cb5b1461093e576103e5565b8063715018a6116101d9578063715018a614610882578063765a351c1461088c5780637bd7a173146108aa5780637d2a38bd146108c8576103e5565b806366fe39551461080a578063678e4cdd1461082857806369c3e4a7146108465780636fd6dae314610864576103e5565b8063297a7937116103055780634560ac551161029857806351e55d4f1161026757806351e55d4f1461077657806354963cd7146107945780635677aaa1146107b257806357f7789e146107d05780635e472c9f146107ec576103e5565b80634560ac55146106ec5780634769c58d1461070a5780634e1273f4146107285780634fce128c14610758576103e5565b806337f1e238116102d457806337f1e238146106745780633a372e38146106925780633db10f6d146106b05780633ee569bf146106ce576103e5565b8063297a7937146105fe5780632e79b9691461061c5780632eb2c2d61461063a5780632fb42d7014610656576103e5565b8063156e29f61161037d5780631fd4d7121161034c5780631fd4d7121461058657806321489dda146105a457806324ed6e07146105c2578063260767f7146105e0576103e5565b8063156e29f61461051057806316ce049b1461052c5780631cd124a51461054a5780631d6a4aa914610568576103e5565b806308adf515116103b957806308adf515146104865780630c0c6df8146104a45780630e89341c146104c257806314c7226c146104f2576103e5565b8062fdd58e146103ea57806301456df01461041a57806301ffc9a71461043857806303c07fae14610468575b600080fd5b61040460048036038101906103ff9190613015565b610bda565b604051610411919061393f565b60405180910390f35b610422610ca3565b60405161042f919061393f565b60405180910390f35b610452600480360381019061044d9190613198565b610ca8565b60405161045f9190613722565b60405180910390f35b610470610d8a565b60405161047d919061393f565b60405180910390f35b61048e610d8f565b60405161049b919061393f565b60405180910390f35b6104ac610d94565b6040516104b9919061393f565b60405180910390f35b6104dc60048036038101906104d791906131f2565b610d99565b6040516104e9919061373d565b60405180910390f35b6104fa610e3e565b604051610507919061393f565b60405180910390f35b61052a60048036038101906105259190613055565b610e43565b005b610534610e6b565b604051610541919061393f565b60405180910390f35b610552610e70565b60405161055f919061393f565b60405180910390f35b610570610e75565b60405161057d919061393f565b60405180910390f35b61058e610e7a565b60405161059b919061393f565b60405180910390f35b6105ac610e7f565b6040516105b9919061393f565b60405180910390f35b6105ca610e84565b6040516105d7919061393f565b60405180910390f35b6105e8610e89565b6040516105f5919061393f565b60405180910390f35b610606610e8e565b604051610613919061393f565b60405180910390f35b610624610e93565b604051610631919061393f565b60405180910390f35b610654600480360381019061064f9190612de4565b610e98565b005b61065e610f39565b60405161066b919061393f565b60405180910390f35b61067c610f3e565b604051610689919061393f565b60405180910390f35b61069a610f43565b6040516106a7919061393f565b60405180910390f35b6106b8610f48565b6040516106c5919061393f565b60405180910390f35b6106d6610f4d565b6040516106e3919061393f565b60405180910390f35b6106f4610f52565b604051610701919061393f565b60405180910390f35b610712610f57565b60405161071f919061393f565b60405180910390f35b610742600480360381019061073d91906130a8565b610f5c565b60405161074f91906136c9565b60405180910390f35b610760611075565b60405161076d919061393f565b60405180910390f35b61077e61107a565b60405161078b919061393f565b60405180910390f35b61079c61107f565b6040516107a9919061393f565b60405180910390f35b6107ba611084565b6040516107c7919061393f565b60405180910390f35b6107ea60048036038101906107e5919061321f565b611089565b005b6107f461111f565b604051610801919061393f565b60405180910390f35b610812611124565b60405161081f919061393f565b60405180910390f35b610830611129565b60405161083d919061393f565b60405180910390f35b61084e61112e565b60405161085b919061393f565b60405180910390f35b61086c611133565b604051610879919061393f565b60405180910390f35b61088a611138565b005b61089461114c565b6040516108a1919061393f565b60405180910390f35b6108b2611151565b6040516108bf919061393f565b60405180910390f35b6108d0611156565b6040516108dd919061393f565b60405180910390f35b6108ee61115b565b6040516108fb919061393f565b60405180910390f35b61091e60048036038101906109199190613120565b611160565b005b610928611177565b604051610935919061393f565b60405180910390f35b61094661117c565b60405161095391906135ec565b60405180910390f35b6109646111a6565b604051610971919061393f565b60405180910390f35b6109826111ab565b60405161098f919061393f565b60405180910390f35b6109a06111b0565b6040516109ad919061393f565b60405180910390f35b6109be6111b5565b6040516109cb919061393f565b60405180910390f35b6109dc6111ba565b6040516109e9919061393f565b60405180910390f35b6109fa6111bf565b604051610a07919061393f565b60405180910390f35b610a186111c4565b604051610a25919061393f565b60405180910390f35b610a486004803603810190610a439190612fd5565b6111c9565b005b610a526111df565b604051610a5f919061393f565b60405180910390f35b610a826004803603810190610a7d919061327b565b6111e4565b005b610a8c6111fb565b604051610a99919061393f565b60405180910390f35b610aaa611200565b604051610ab7919061393f565b60405180910390f35b610ac8611205565b604051610ad5919061393f565b60405180910390f35b610ae661120a565b604051610af3919061393f565b60405180910390f35b610b0461120f565b604051610b11919061393f565b60405180910390f35b610b346004803603810190610b2f9190612f4a565b611214565b005b610b3e61123c565b604051610b4b919061393f565b60405180910390f35b610b6e6004803603810190610b699190612da4565b611241565b604051610b7b9190613722565b60405180910390f35b610b9e6004803603810190610b999190612eb3565b6112d5565b005b610bba6004803603810190610bb59190612d77565b611376565b005b610bc46113fa565b604051610bd1919061393f565b60405180910390f35b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c42906137bf565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b602381565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610d7357507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610d835750610d8282611422565b5b9050919050565b600a81565b602781565b601e81565b6060600460008381526020019081526020016000208054610db990613bdf565b80601f0160208091040260200160405190810160405280929190818152602001828054610de590613bdf565b8015610e325780601f10610e0757610100808354040283529160200191610e32565b820191906000526020600020905b815481529060010190602001808311610e1557829003601f168201915b50505050509050919050565b602d81565b610e4b61148c565b610e668383836040518060200160405280600081525061150a565b505050565b600481565b600c81565b600f81565b602f81565b602281565b601181565b601581565b601281565b602a81565b610ea06116bb565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610ee65750610ee585610ee06116bb565b611241565b5b610f25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1c906137df565b60405180910390fd5b610f3285858585856116c3565b5050505050565b600381565b602e81565b601d81565b601681565b600181565b600d81565b602b81565b60608151835114610fa2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f99906138bf565b60405180910390fd5b6000835167ffffffffffffffff811115610fbf57610fbe613d18565b5b604051908082528060200260200182016040528015610fed5781602001602082028036833780820191505090505b50905060005b845181101561106a5761103a85828151811061101257611011613ce9565b5b602002602001015185838151811061102d5761102c613ce9565b5b6020026020010151610bda565b82828151811061104d5761104c613ce9565b5b6020026020010181815250508061106390613c42565b9050610ff3565b508091505092915050565b602981565b602881565b600b81565b602c81565b61109161148c565b60006004600084815260200190815260200160002080546110b190613bdf565b9050146110f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ea9061381f565b60405180910390fd5b8060046000848152602001908152602001600020908051906020019061111a929190612a4f565b505050565b600e81565b601081565b602481565b601381565b601f81565b61114061148c565b61114a60006119e5565b565b603081565b603281565b602081565b601481565b61116861148c565b611173338383611aab565b5050565b600881565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600981565b600781565b600281565b601981565b603181565b600581565b601b81565b6111db6111d46116bb565b8383611d7a565b5050565b602581565b6111ec61148c565b6111f7338383611ee7565b5050565b601a81565b601781565b601881565b602681565b602181565b61121c61148c565b6112378383836040518060200160405280600081525061212e565b505050565b600681565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6112dd6116bb565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061132357506113228561131d6116bb565b611241565b5b611362576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611359906137df565b60405180910390fd5b61136f858585858561235b565b5050505050565b61137e61148c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156113ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e59061377f565b60405180910390fd5b6113f7816119e5565b50565b601c81565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6114946116bb565b73ffffffffffffffffffffffffffffffffffffffff166114b261117c565b73ffffffffffffffffffffffffffffffffffffffff1614611508576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ff9061387f565b60405180910390fd5b565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561157a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611571906138ff565b60405180910390fd5b60006115846116bb565b90506000611591856125f7565b9050600061159e856125f7565b90506115af83600089858589612671565b8460008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461160e9190613ad3565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62898960405161168c92919061395a565b60405180910390a46116a383600089858589612679565b6116b283600089898989612681565b50505050505050565b600033905090565b8151835114611707576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fe906138df565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176e906137ff565b60405180910390fd5b60006117816116bb565b9050611791818787878787612671565b60005b84518110156119425760008582815181106117b2576117b1613ce9565b5b6020026020010151905060008583815181106117d1576117d0613ce9565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611872576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118699061385f565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119279190613ad3565b925050819055505050508061193b90613c42565b9050611794565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516119b99291906136eb565b60405180910390a46119cf818787878787612679565b6119dd818787878787612868565b505050505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611b1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b129061383f565b60405180910390fd5b8051825114611b5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b56906138df565b60405180910390fd5b6000611b696116bb565b9050611b8981856000868660405180602001604052806000815250612671565b60005b8351811015611cd6576000848281518110611baa57611ba9613ce9565b5b602002602001015190506000848381518110611bc957611bc8613ce9565b5b60200260200101519050600080600084815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611c6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c619061379f565b60405180910390fd5b81810360008085815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050508080611cce90613c42565b915050611b8c565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051611d4e9291906136eb565b60405180910390a4611d7481856000868660405180602001604052806000815250612679565b50505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611de9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de09061389f565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611eda9190613722565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611f57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4e9061383f565b60405180910390fd5b6000611f616116bb565b90506000611f6e846125f7565b90506000611f7b846125f7565b9050611f9b83876000858560405180602001604052806000815250612671565b600080600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905084811015612032576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120299061379f565b60405180910390fd5b84810360008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6289896040516120ff92919061395a565b60405180910390a461212584886000868660405180602001604052806000815250612679565b50505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561219e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612195906138ff565b60405180910390fd5b81518351146121e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d9906138df565b60405180910390fd5b60006121ec6116bb565b90506121fd81600087878787612671565b60005b84518110156122b65783818151811061221c5761221b613ce9565b5b602002602001015160008087848151811061223a57612239613ce9565b5b6020026020010151815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461229c9190613ad3565b9250508190555080806122ae90613c42565b915050612200565b508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161232e9291906136eb565b60405180910390a461234581600087878787612679565b61235481600087878787612868565b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156123cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c2906137ff565b60405180910390fd5b60006123d56116bb565b905060006123e2856125f7565b905060006123ef856125f7565b90506123ff838989858589612671565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905085811015612496576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248d9061385f565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461254b9190613ad3565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a6040516125c892919061395a565b60405180910390a46125de848a8a86868a612679565b6125ec848a8a8a8a8a612681565b505050505050505050565b60606000600167ffffffffffffffff81111561261657612615613d18565b5b6040519080825280602002602001820160405280156126445781602001602082028036833780820191505090505b509050828160008151811061265c5761265b613ce9565b5b60200260200101818152505080915050919050565b505050505050565b505050505050565b6126a08473ffffffffffffffffffffffffffffffffffffffff166113ff565b15612860578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b81526004016126e695949392919061366f565b602060405180830381600087803b15801561270057600080fd5b505af192505050801561273157506040513d601f19601f8201168201806040525081019061272e91906131c5565b60015b6127d75761273d613d47565b806308c379a0141561279a57506127526141f5565b8061275d575061279c565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612791919061373d565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ce9061391f565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461285e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128559061375f565b60405180910390fd5b505b505050505050565b6128878473ffffffffffffffffffffffffffffffffffffffff166113ff565b15612a47578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b81526004016128cd959493929190613607565b602060405180830381600087803b1580156128e757600080fd5b505af192505050801561291857506040513d601f19601f8201168201806040525081019061291591906131c5565b60015b6129be57612924613d47565b806308c379a0141561298157506129396141f5565b806129445750612983565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612978919061373d565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129b59061391f565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612a45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a3c9061375f565b60405180910390fd5b505b505050505050565b828054612a5b90613bdf565b90600052602060002090601f016020900481019282612a7d5760008555612ac4565b82601f10612a9657805160ff1916838001178555612ac4565b82800160010185558215612ac4579182015b82811115612ac3578251825591602001919060010190612aa8565b5b509050612ad19190612ad5565b5090565b5b80821115612aee576000816000905550600101612ad6565b5090565b6000612b05612b00846139a8565b613983565b90508083825260208201905082856020860282011115612b2857612b27613d6e565b5b60005b85811015612b585781612b3e8882612c56565b845260208401935060208301925050600181019050612b2b565b5050509392505050565b6000612b75612b70846139d4565b613983565b90508083825260208201905082856020860282011115612b9857612b97613d6e565b5b60005b85811015612bc85781612bae8882612d62565b845260208401935060208301925050600181019050612b9b565b5050509392505050565b6000612be5612be084613a00565b613983565b905082815260208101848484011115612c0157612c00613d73565b5b612c0c848285613b9d565b509392505050565b6000612c27612c2284613a31565b613983565b905082815260208101848484011115612c4357612c42613d73565b5b612c4e848285613b9d565b509392505050565b600081359050612c658161428b565b92915050565b600082601f830112612c8057612c7f613d69565b5b8135612c90848260208601612af2565b91505092915050565b600082601f830112612cae57612cad613d69565b5b8135612cbe848260208601612b62565b91505092915050565b600081359050612cd6816142a2565b92915050565b600081359050612ceb816142b9565b92915050565b600081519050612d00816142b9565b92915050565b600082601f830112612d1b57612d1a613d69565b5b8135612d2b848260208601612bd2565b91505092915050565b600082601f830112612d4957612d48613d69565b5b8135612d59848260208601612c14565b91505092915050565b600081359050612d71816142d0565b92915050565b600060208284031215612d8d57612d8c613d7d565b5b6000612d9b84828501612c56565b91505092915050565b60008060408385031215612dbb57612dba613d7d565b5b6000612dc985828601612c56565b9250506020612dda85828601612c56565b9150509250929050565b600080600080600060a08688031215612e0057612dff613d7d565b5b6000612e0e88828901612c56565b9550506020612e1f88828901612c56565b945050604086013567ffffffffffffffff811115612e4057612e3f613d78565b5b612e4c88828901612c99565b935050606086013567ffffffffffffffff811115612e6d57612e6c613d78565b5b612e7988828901612c99565b925050608086013567ffffffffffffffff811115612e9a57612e99613d78565b5b612ea688828901612d06565b9150509295509295909350565b600080600080600060a08688031215612ecf57612ece613d7d565b5b6000612edd88828901612c56565b9550506020612eee88828901612c56565b9450506040612eff88828901612d62565b9350506060612f1088828901612d62565b925050608086013567ffffffffffffffff811115612f3157612f30613d78565b5b612f3d88828901612d06565b9150509295509295909350565b600080600060608486031215612f6357612f62613d7d565b5b6000612f7186828701612c56565b935050602084013567ffffffffffffffff811115612f9257612f91613d78565b5b612f9e86828701612c99565b925050604084013567ffffffffffffffff811115612fbf57612fbe613d78565b5b612fcb86828701612c99565b9150509250925092565b60008060408385031215612fec57612feb613d7d565b5b6000612ffa85828601612c56565b925050602061300b85828601612cc7565b9150509250929050565b6000806040838503121561302c5761302b613d7d565b5b600061303a85828601612c56565b925050602061304b85828601612d62565b9150509250929050565b60008060006060848603121561306e5761306d613d7d565b5b600061307c86828701612c56565b935050602061308d86828701612d62565b925050604061309e86828701612d62565b9150509250925092565b600080604083850312156130bf576130be613d7d565b5b600083013567ffffffffffffffff8111156130dd576130dc613d78565b5b6130e985828601612c6b565b925050602083013567ffffffffffffffff81111561310a57613109613d78565b5b61311685828601612c99565b9150509250929050565b6000806040838503121561313757613136613d7d565b5b600083013567ffffffffffffffff81111561315557613154613d78565b5b61316185828601612c99565b925050602083013567ffffffffffffffff81111561318257613181613d78565b5b61318e85828601612c99565b9150509250929050565b6000602082840312156131ae576131ad613d7d565b5b60006131bc84828501612cdc565b91505092915050565b6000602082840312156131db576131da613d7d565b5b60006131e984828501612cf1565b91505092915050565b60006020828403121561320857613207613d7d565b5b600061321684828501612d62565b91505092915050565b6000806040838503121561323657613235613d7d565b5b600061324485828601612d62565b925050602083013567ffffffffffffffff81111561326557613264613d78565b5b61327185828601612d34565b9150509250929050565b6000806040838503121561329257613291613d7d565b5b60006132a085828601612d62565b92505060206132b185828601612d62565b9150509250929050565b60006132c783836135ce565b60208301905092915050565b6132dc81613b29565b82525050565b60006132ed82613a72565b6132f78185613aa0565b935061330283613a62565b8060005b8381101561333357815161331a88826132bb565b975061332583613a93565b925050600181019050613306565b5085935050505092915050565b61334981613b3b565b82525050565b600061335a82613a7d565b6133648185613ab1565b9350613374818560208601613bac565b61337d81613d82565b840191505092915050565b600061339382613a88565b61339d8185613ac2565b93506133ad818560208601613bac565b6133b681613d82565b840191505092915050565b60006133ce602883613ac2565b91506133d982613da0565b604082019050919050565b60006133f1602683613ac2565b91506133fc82613def565b604082019050919050565b6000613414602483613ac2565b915061341f82613e3e565b604082019050919050565b6000613437602a83613ac2565b915061344282613e8d565b604082019050919050565b600061345a602e83613ac2565b915061346582613edc565b604082019050919050565b600061347d602583613ac2565b915061348882613f2b565b604082019050919050565b60006134a0601483613ac2565b91506134ab82613f7a565b602082019050919050565b60006134c3602383613ac2565b91506134ce82613fa3565b604082019050919050565b60006134e6602a83613ac2565b91506134f182613ff2565b604082019050919050565b6000613509602083613ac2565b915061351482614041565b602082019050919050565b600061352c602983613ac2565b91506135378261406a565b604082019050919050565b600061354f602983613ac2565b915061355a826140b9565b604082019050919050565b6000613572602883613ac2565b915061357d82614108565b604082019050919050565b6000613595602183613ac2565b91506135a082614157565b604082019050919050565b60006135b8603483613ac2565b91506135c3826141a6565b604082019050919050565b6135d781613b93565b82525050565b6135e681613b93565b82525050565b600060208201905061360160008301846132d3565b92915050565b600060a08201905061361c60008301886132d3565b61362960208301876132d3565b818103604083015261363b81866132e2565b9050818103606083015261364f81856132e2565b90508181036080830152613663818461334f565b90509695505050505050565b600060a08201905061368460008301886132d3565b61369160208301876132d3565b61369e60408301866135dd565b6136ab60608301856135dd565b81810360808301526136bd818461334f565b90509695505050505050565b600060208201905081810360008301526136e381846132e2565b905092915050565b6000604082019050818103600083015261370581856132e2565b9050818103602083015261371981846132e2565b90509392505050565b60006020820190506137376000830184613340565b92915050565b600060208201905081810360008301526137578184613388565b905092915050565b60006020820190508181036000830152613778816133c1565b9050919050565b60006020820190508181036000830152613798816133e4565b9050919050565b600060208201905081810360008301526137b881613407565b9050919050565b600060208201905081810360008301526137d88161342a565b9050919050565b600060208201905081810360008301526137f88161344d565b9050919050565b6000602082019050818103600083015261381881613470565b9050919050565b6000602082019050818103600083015261383881613493565b9050919050565b60006020820190508181036000830152613858816134b6565b9050919050565b60006020820190508181036000830152613878816134d9565b9050919050565b60006020820190508181036000830152613898816134fc565b9050919050565b600060208201905081810360008301526138b88161351f565b9050919050565b600060208201905081810360008301526138d881613542565b9050919050565b600060208201905081810360008301526138f881613565565b9050919050565b6000602082019050818103600083015261391881613588565b9050919050565b60006020820190508181036000830152613938816135ab565b9050919050565b600060208201905061395460008301846135dd565b92915050565b600060408201905061396f60008301856135dd565b61397c60208301846135dd565b9392505050565b600061398d61399e565b90506139998282613c11565b919050565b6000604051905090565b600067ffffffffffffffff8211156139c3576139c2613d18565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156139ef576139ee613d18565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613a1b57613a1a613d18565b5b613a2482613d82565b9050602081019050919050565b600067ffffffffffffffff821115613a4c57613a4b613d18565b5b613a5582613d82565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b6000613ade82613b93565b9150613ae983613b93565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613b1e57613b1d613c8b565b5b828201905092915050565b6000613b3482613b73565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613bca578082015181840152602081019050613baf565b83811115613bd9576000848401525b50505050565b60006002820490506001821680613bf757607f821691505b60208210811415613c0b57613c0a613cba565b5b50919050565b613c1a82613d82565b810181811067ffffffffffffffff82111715613c3957613c38613d18565b5b80604052505050565b6000613c4d82613b93565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613c8057613c7f613c8b565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d1115613d665760046000803e613d63600051613d93565b90505b90565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160e01c9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206f7220617070726f766564000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f742073657420757269207477696365000000000000000000000000600082015250565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e7366657220746f206e6f6e2d4552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b600060443d101561420557614288565b61420d61399e565b60043d036004823e80513d602482011167ffffffffffffffff82111715614235575050614288565b808201805167ffffffffffffffff8111156142535750505050614288565b80602083010160043d038501811115614270575050505050614288565b61427f82602001850186613c11565b82955050505050505b90565b61429481613b29565b811461429f57600080fd5b50565b6142ab81613b3b565b81146142b657600080fd5b50565b6142c281613b47565b81146142cd57600080fd5b50565b6142d981613b93565b81146142e457600080fd5b5056fea26469706673582212200c05ec2665dd227f1ad37851e920dca29c4cc58a146f0c0f572ffc21c95d8f2a64736f6c63430008070033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106103e55760003560e01c806366fe39551161020a5780639970e55811610125578063c64626ff116100b8578063db34179511610087578063db34179514610b36578063e985e9c514610b54578063f242432a14610b84578063f2fde38b14610ba0578063fafe3b2214610bbc576103e5565b8063c64626ff14610ac0578063caae111214610ade578063d74e529214610afc578063d81d0a1514610b1a576103e5565b8063a5739b70116100f4578063a5739b7014610a4a578063b390c0ab14610a68578063bb3ae55614610a84578063c436843214610aa2576103e5565b80639970e558146109d45780639c58ee21146109f25780639e9a917f14610a10578063a22cb46514610a2e576103e5565b8063835716821161019d5780638ee77f471161016c5780638ee77f471461095c5780638f6ae46d1461097a57806396cd25ef1461099857806397f9e939146109b6576103e5565b806383571682146108e657806383ca4b6f1461090457806384806c33146109205780638da5cb5b1461093e576103e5565b8063715018a6116101d9578063715018a614610882578063765a351c1461088c5780637bd7a173146108aa5780637d2a38bd146108c8576103e5565b806366fe39551461080a578063678e4cdd1461082857806369c3e4a7146108465780636fd6dae314610864576103e5565b8063297a7937116103055780634560ac551161029857806351e55d4f1161026757806351e55d4f1461077657806354963cd7146107945780635677aaa1146107b257806357f7789e146107d05780635e472c9f146107ec576103e5565b80634560ac55146106ec5780634769c58d1461070a5780634e1273f4146107285780634fce128c14610758576103e5565b806337f1e238116102d457806337f1e238146106745780633a372e38146106925780633db10f6d146106b05780633ee569bf146106ce576103e5565b8063297a7937146105fe5780632e79b9691461061c5780632eb2c2d61461063a5780632fb42d7014610656576103e5565b8063156e29f61161037d5780631fd4d7121161034c5780631fd4d7121461058657806321489dda146105a457806324ed6e07146105c2578063260767f7146105e0576103e5565b8063156e29f61461051057806316ce049b1461052c5780631cd124a51461054a5780631d6a4aa914610568576103e5565b806308adf515116103b957806308adf515146104865780630c0c6df8146104a45780630e89341c146104c257806314c7226c146104f2576103e5565b8062fdd58e146103ea57806301456df01461041a57806301ffc9a71461043857806303c07fae14610468575b600080fd5b61040460048036038101906103ff9190613015565b610bda565b604051610411919061393f565b60405180910390f35b610422610ca3565b60405161042f919061393f565b60405180910390f35b610452600480360381019061044d9190613198565b610ca8565b60405161045f9190613722565b60405180910390f35b610470610d8a565b60405161047d919061393f565b60405180910390f35b61048e610d8f565b60405161049b919061393f565b60405180910390f35b6104ac610d94565b6040516104b9919061393f565b60405180910390f35b6104dc60048036038101906104d791906131f2565b610d99565b6040516104e9919061373d565b60405180910390f35b6104fa610e3e565b604051610507919061393f565b60405180910390f35b61052a60048036038101906105259190613055565b610e43565b005b610534610e6b565b604051610541919061393f565b60405180910390f35b610552610e70565b60405161055f919061393f565b60405180910390f35b610570610e75565b60405161057d919061393f565b60405180910390f35b61058e610e7a565b60405161059b919061393f565b60405180910390f35b6105ac610e7f565b6040516105b9919061393f565b60405180910390f35b6105ca610e84565b6040516105d7919061393f565b60405180910390f35b6105e8610e89565b6040516105f5919061393f565b60405180910390f35b610606610e8e565b604051610613919061393f565b60405180910390f35b610624610e93565b604051610631919061393f565b60405180910390f35b610654600480360381019061064f9190612de4565b610e98565b005b61065e610f39565b60405161066b919061393f565b60405180910390f35b61067c610f3e565b604051610689919061393f565b60405180910390f35b61069a610f43565b6040516106a7919061393f565b60405180910390f35b6106b8610f48565b6040516106c5919061393f565b60405180910390f35b6106d6610f4d565b6040516106e3919061393f565b60405180910390f35b6106f4610f52565b604051610701919061393f565b60405180910390f35b610712610f57565b60405161071f919061393f565b60405180910390f35b610742600480360381019061073d91906130a8565b610f5c565b60405161074f91906136c9565b60405180910390f35b610760611075565b60405161076d919061393f565b60405180910390f35b61077e61107a565b60405161078b919061393f565b60405180910390f35b61079c61107f565b6040516107a9919061393f565b60405180910390f35b6107ba611084565b6040516107c7919061393f565b60405180910390f35b6107ea60048036038101906107e5919061321f565b611089565b005b6107f461111f565b604051610801919061393f565b60405180910390f35b610812611124565b60405161081f919061393f565b60405180910390f35b610830611129565b60405161083d919061393f565b60405180910390f35b61084e61112e565b60405161085b919061393f565b60405180910390f35b61086c611133565b604051610879919061393f565b60405180910390f35b61088a611138565b005b61089461114c565b6040516108a1919061393f565b60405180910390f35b6108b2611151565b6040516108bf919061393f565b60405180910390f35b6108d0611156565b6040516108dd919061393f565b60405180910390f35b6108ee61115b565b6040516108fb919061393f565b60405180910390f35b61091e60048036038101906109199190613120565b611160565b005b610928611177565b604051610935919061393f565b60405180910390f35b61094661117c565b60405161095391906135ec565b60405180910390f35b6109646111a6565b604051610971919061393f565b60405180910390f35b6109826111ab565b60405161098f919061393f565b60405180910390f35b6109a06111b0565b6040516109ad919061393f565b60405180910390f35b6109be6111b5565b6040516109cb919061393f565b60405180910390f35b6109dc6111ba565b6040516109e9919061393f565b60405180910390f35b6109fa6111bf565b604051610a07919061393f565b60405180910390f35b610a186111c4565b604051610a25919061393f565b60405180910390f35b610a486004803603810190610a439190612fd5565b6111c9565b005b610a526111df565b604051610a5f919061393f565b60405180910390f35b610a826004803603810190610a7d919061327b565b6111e4565b005b610a8c6111fb565b604051610a99919061393f565b60405180910390f35b610aaa611200565b604051610ab7919061393f565b60405180910390f35b610ac8611205565b604051610ad5919061393f565b60405180910390f35b610ae661120a565b604051610af3919061393f565b60405180910390f35b610b0461120f565b604051610b11919061393f565b60405180910390f35b610b346004803603810190610b2f9190612f4a565b611214565b005b610b3e61123c565b604051610b4b919061393f565b60405180910390f35b610b6e6004803603810190610b699190612da4565b611241565b604051610b7b9190613722565b60405180910390f35b610b9e6004803603810190610b999190612eb3565b6112d5565b005b610bba6004803603810190610bb59190612d77565b611376565b005b610bc46113fa565b604051610bd1919061393f565b60405180910390f35b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c42906137bf565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b602381565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610d7357507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610d835750610d8282611422565b5b9050919050565b600a81565b602781565b601e81565b6060600460008381526020019081526020016000208054610db990613bdf565b80601f0160208091040260200160405190810160405280929190818152602001828054610de590613bdf565b8015610e325780601f10610e0757610100808354040283529160200191610e32565b820191906000526020600020905b815481529060010190602001808311610e1557829003601f168201915b50505050509050919050565b602d81565b610e4b61148c565b610e668383836040518060200160405280600081525061150a565b505050565b600481565b600c81565b600f81565b602f81565b602281565b601181565b601581565b601281565b602a81565b610ea06116bb565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610ee65750610ee585610ee06116bb565b611241565b5b610f25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1c906137df565b60405180910390fd5b610f3285858585856116c3565b5050505050565b600381565b602e81565b601d81565b601681565b600181565b600d81565b602b81565b60608151835114610fa2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f99906138bf565b60405180910390fd5b6000835167ffffffffffffffff811115610fbf57610fbe613d18565b5b604051908082528060200260200182016040528015610fed5781602001602082028036833780820191505090505b50905060005b845181101561106a5761103a85828151811061101257611011613ce9565b5b602002602001015185838151811061102d5761102c613ce9565b5b6020026020010151610bda565b82828151811061104d5761104c613ce9565b5b6020026020010181815250508061106390613c42565b9050610ff3565b508091505092915050565b602981565b602881565b600b81565b602c81565b61109161148c565b60006004600084815260200190815260200160002080546110b190613bdf565b9050146110f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ea9061381f565b60405180910390fd5b8060046000848152602001908152602001600020908051906020019061111a929190612a4f565b505050565b600e81565b601081565b602481565b601381565b601f81565b61114061148c565b61114a60006119e5565b565b603081565b603281565b602081565b601481565b61116861148c565b611173338383611aab565b5050565b600881565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600981565b600781565b600281565b601981565b603181565b600581565b601b81565b6111db6111d46116bb565b8383611d7a565b5050565b602581565b6111ec61148c565b6111f7338383611ee7565b5050565b601a81565b601781565b601881565b602681565b602181565b61121c61148c565b6112378383836040518060200160405280600081525061212e565b505050565b600681565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6112dd6116bb565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061132357506113228561131d6116bb565b611241565b5b611362576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611359906137df565b60405180910390fd5b61136f858585858561235b565b5050505050565b61137e61148c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156113ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e59061377f565b60405180910390fd5b6113f7816119e5565b50565b601c81565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6114946116bb565b73ffffffffffffffffffffffffffffffffffffffff166114b261117c565b73ffffffffffffffffffffffffffffffffffffffff1614611508576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ff9061387f565b60405180910390fd5b565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561157a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611571906138ff565b60405180910390fd5b60006115846116bb565b90506000611591856125f7565b9050600061159e856125f7565b90506115af83600089858589612671565b8460008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461160e9190613ad3565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62898960405161168c92919061395a565b60405180910390a46116a383600089858589612679565b6116b283600089898989612681565b50505050505050565b600033905090565b8151835114611707576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fe906138df565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176e906137ff565b60405180910390fd5b60006117816116bb565b9050611791818787878787612671565b60005b84518110156119425760008582815181106117b2576117b1613ce9565b5b6020026020010151905060008583815181106117d1576117d0613ce9565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611872576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118699061385f565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119279190613ad3565b925050819055505050508061193b90613c42565b9050611794565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516119b99291906136eb565b60405180910390a46119cf818787878787612679565b6119dd818787878787612868565b505050505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611b1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b129061383f565b60405180910390fd5b8051825114611b5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b56906138df565b60405180910390fd5b6000611b696116bb565b9050611b8981856000868660405180602001604052806000815250612671565b60005b8351811015611cd6576000848281518110611baa57611ba9613ce9565b5b602002602001015190506000848381518110611bc957611bc8613ce9565b5b60200260200101519050600080600084815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611c6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c619061379f565b60405180910390fd5b81810360008085815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050508080611cce90613c42565b915050611b8c565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051611d4e9291906136eb565b60405180910390a4611d7481856000868660405180602001604052806000815250612679565b50505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611de9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de09061389f565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611eda9190613722565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611f57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4e9061383f565b60405180910390fd5b6000611f616116bb565b90506000611f6e846125f7565b90506000611f7b846125f7565b9050611f9b83876000858560405180602001604052806000815250612671565b600080600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905084811015612032576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120299061379f565b60405180910390fd5b84810360008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6289896040516120ff92919061395a565b60405180910390a461212584886000868660405180602001604052806000815250612679565b50505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561219e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612195906138ff565b60405180910390fd5b81518351146121e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d9906138df565b60405180910390fd5b60006121ec6116bb565b90506121fd81600087878787612671565b60005b84518110156122b65783818151811061221c5761221b613ce9565b5b602002602001015160008087848151811061223a57612239613ce9565b5b6020026020010151815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461229c9190613ad3565b9250508190555080806122ae90613c42565b915050612200565b508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161232e9291906136eb565b60405180910390a461234581600087878787612679565b61235481600087878787612868565b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156123cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c2906137ff565b60405180910390fd5b60006123d56116bb565b905060006123e2856125f7565b905060006123ef856125f7565b90506123ff838989858589612671565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905085811015612496576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248d9061385f565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461254b9190613ad3565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a6040516125c892919061395a565b60405180910390a46125de848a8a86868a612679565b6125ec848a8a8a8a8a612681565b505050505050505050565b60606000600167ffffffffffffffff81111561261657612615613d18565b5b6040519080825280602002602001820160405280156126445781602001602082028036833780820191505090505b509050828160008151811061265c5761265b613ce9565b5b60200260200101818152505080915050919050565b505050505050565b505050505050565b6126a08473ffffffffffffffffffffffffffffffffffffffff166113ff565b15612860578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b81526004016126e695949392919061366f565b602060405180830381600087803b15801561270057600080fd5b505af192505050801561273157506040513d601f19601f8201168201806040525081019061272e91906131c5565b60015b6127d75761273d613d47565b806308c379a0141561279a57506127526141f5565b8061275d575061279c565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612791919061373d565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ce9061391f565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461285e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128559061375f565b60405180910390fd5b505b505050505050565b6128878473ffffffffffffffffffffffffffffffffffffffff166113ff565b15612a47578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b81526004016128cd959493929190613607565b602060405180830381600087803b1580156128e757600080fd5b505af192505050801561291857506040513d601f19601f8201168201806040525081019061291591906131c5565b60015b6129be57612924613d47565b806308c379a0141561298157506129396141f5565b806129445750612983565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612978919061373d565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129b59061391f565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612a45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a3c9061375f565b60405180910390fd5b505b505050505050565b828054612a5b90613bdf565b90600052602060002090601f016020900481019282612a7d5760008555612ac4565b82601f10612a9657805160ff1916838001178555612ac4565b82800160010185558215612ac4579182015b82811115612ac3578251825591602001919060010190612aa8565b5b509050612ad19190612ad5565b5090565b5b80821115612aee576000816000905550600101612ad6565b5090565b6000612b05612b00846139a8565b613983565b90508083825260208201905082856020860282011115612b2857612b27613d6e565b5b60005b85811015612b585781612b3e8882612c56565b845260208401935060208301925050600181019050612b2b565b5050509392505050565b6000612b75612b70846139d4565b613983565b90508083825260208201905082856020860282011115612b9857612b97613d6e565b5b60005b85811015612bc85781612bae8882612d62565b845260208401935060208301925050600181019050612b9b565b5050509392505050565b6000612be5612be084613a00565b613983565b905082815260208101848484011115612c0157612c00613d73565b5b612c0c848285613b9d565b509392505050565b6000612c27612c2284613a31565b613983565b905082815260208101848484011115612c4357612c42613d73565b5b612c4e848285613b9d565b509392505050565b600081359050612c658161428b565b92915050565b600082601f830112612c8057612c7f613d69565b5b8135612c90848260208601612af2565b91505092915050565b600082601f830112612cae57612cad613d69565b5b8135612cbe848260208601612b62565b91505092915050565b600081359050612cd6816142a2565b92915050565b600081359050612ceb816142b9565b92915050565b600081519050612d00816142b9565b92915050565b600082601f830112612d1b57612d1a613d69565b5b8135612d2b848260208601612bd2565b91505092915050565b600082601f830112612d4957612d48613d69565b5b8135612d59848260208601612c14565b91505092915050565b600081359050612d71816142d0565b92915050565b600060208284031215612d8d57612d8c613d7d565b5b6000612d9b84828501612c56565b91505092915050565b60008060408385031215612dbb57612dba613d7d565b5b6000612dc985828601612c56565b9250506020612dda85828601612c56565b9150509250929050565b600080600080600060a08688031215612e0057612dff613d7d565b5b6000612e0e88828901612c56565b9550506020612e1f88828901612c56565b945050604086013567ffffffffffffffff811115612e4057612e3f613d78565b5b612e4c88828901612c99565b935050606086013567ffffffffffffffff811115612e6d57612e6c613d78565b5b612e7988828901612c99565b925050608086013567ffffffffffffffff811115612e9a57612e99613d78565b5b612ea688828901612d06565b9150509295509295909350565b600080600080600060a08688031215612ecf57612ece613d7d565b5b6000612edd88828901612c56565b9550506020612eee88828901612c56565b9450506040612eff88828901612d62565b9350506060612f1088828901612d62565b925050608086013567ffffffffffffffff811115612f3157612f30613d78565b5b612f3d88828901612d06565b9150509295509295909350565b600080600060608486031215612f6357612f62613d7d565b5b6000612f7186828701612c56565b935050602084013567ffffffffffffffff811115612f9257612f91613d78565b5b612f9e86828701612c99565b925050604084013567ffffffffffffffff811115612fbf57612fbe613d78565b5b612fcb86828701612c99565b9150509250925092565b60008060408385031215612fec57612feb613d7d565b5b6000612ffa85828601612c56565b925050602061300b85828601612cc7565b9150509250929050565b6000806040838503121561302c5761302b613d7d565b5b600061303a85828601612c56565b925050602061304b85828601612d62565b9150509250929050565b60008060006060848603121561306e5761306d613d7d565b5b600061307c86828701612c56565b935050602061308d86828701612d62565b925050604061309e86828701612d62565b9150509250925092565b600080604083850312156130bf576130be613d7d565b5b600083013567ffffffffffffffff8111156130dd576130dc613d78565b5b6130e985828601612c6b565b925050602083013567ffffffffffffffff81111561310a57613109613d78565b5b61311685828601612c99565b9150509250929050565b6000806040838503121561313757613136613d7d565b5b600083013567ffffffffffffffff81111561315557613154613d78565b5b61316185828601612c99565b925050602083013567ffffffffffffffff81111561318257613181613d78565b5b61318e85828601612c99565b9150509250929050565b6000602082840312156131ae576131ad613d7d565b5b60006131bc84828501612cdc565b91505092915050565b6000602082840312156131db576131da613d7d565b5b60006131e984828501612cf1565b91505092915050565b60006020828403121561320857613207613d7d565b5b600061321684828501612d62565b91505092915050565b6000806040838503121561323657613235613d7d565b5b600061324485828601612d62565b925050602083013567ffffffffffffffff81111561326557613264613d78565b5b61327185828601612d34565b9150509250929050565b6000806040838503121561329257613291613d7d565b5b60006132a085828601612d62565b92505060206132b185828601612d62565b9150509250929050565b60006132c783836135ce565b60208301905092915050565b6132dc81613b29565b82525050565b60006132ed82613a72565b6132f78185613aa0565b935061330283613a62565b8060005b8381101561333357815161331a88826132bb565b975061332583613a93565b925050600181019050613306565b5085935050505092915050565b61334981613b3b565b82525050565b600061335a82613a7d565b6133648185613ab1565b9350613374818560208601613bac565b61337d81613d82565b840191505092915050565b600061339382613a88565b61339d8185613ac2565b93506133ad818560208601613bac565b6133b681613d82565b840191505092915050565b60006133ce602883613ac2565b91506133d982613da0565b604082019050919050565b60006133f1602683613ac2565b91506133fc82613def565b604082019050919050565b6000613414602483613ac2565b915061341f82613e3e565b604082019050919050565b6000613437602a83613ac2565b915061344282613e8d565b604082019050919050565b600061345a602e83613ac2565b915061346582613edc565b604082019050919050565b600061347d602583613ac2565b915061348882613f2b565b604082019050919050565b60006134a0601483613ac2565b91506134ab82613f7a565b602082019050919050565b60006134c3602383613ac2565b91506134ce82613fa3565b604082019050919050565b60006134e6602a83613ac2565b91506134f182613ff2565b604082019050919050565b6000613509602083613ac2565b915061351482614041565b602082019050919050565b600061352c602983613ac2565b91506135378261406a565b604082019050919050565b600061354f602983613ac2565b915061355a826140b9565b604082019050919050565b6000613572602883613ac2565b915061357d82614108565b604082019050919050565b6000613595602183613ac2565b91506135a082614157565b604082019050919050565b60006135b8603483613ac2565b91506135c3826141a6565b604082019050919050565b6135d781613b93565b82525050565b6135e681613b93565b82525050565b600060208201905061360160008301846132d3565b92915050565b600060a08201905061361c60008301886132d3565b61362960208301876132d3565b818103604083015261363b81866132e2565b9050818103606083015261364f81856132e2565b90508181036080830152613663818461334f565b90509695505050505050565b600060a08201905061368460008301886132d3565b61369160208301876132d3565b61369e60408301866135dd565b6136ab60608301856135dd565b81810360808301526136bd818461334f565b90509695505050505050565b600060208201905081810360008301526136e381846132e2565b905092915050565b6000604082019050818103600083015261370581856132e2565b9050818103602083015261371981846132e2565b90509392505050565b60006020820190506137376000830184613340565b92915050565b600060208201905081810360008301526137578184613388565b905092915050565b60006020820190508181036000830152613778816133c1565b9050919050565b60006020820190508181036000830152613798816133e4565b9050919050565b600060208201905081810360008301526137b881613407565b9050919050565b600060208201905081810360008301526137d88161342a565b9050919050565b600060208201905081810360008301526137f88161344d565b9050919050565b6000602082019050818103600083015261381881613470565b9050919050565b6000602082019050818103600083015261383881613493565b9050919050565b60006020820190508181036000830152613858816134b6565b9050919050565b60006020820190508181036000830152613878816134d9565b9050919050565b60006020820190508181036000830152613898816134fc565b9050919050565b600060208201905081810360008301526138b88161351f565b9050919050565b600060208201905081810360008301526138d881613542565b9050919050565b600060208201905081810360008301526138f881613565565b9050919050565b6000602082019050818103600083015261391881613588565b9050919050565b60006020820190508181036000830152613938816135ab565b9050919050565b600060208201905061395460008301846135dd565b92915050565b600060408201905061396f60008301856135dd565b61397c60208301846135dd565b9392505050565b600061398d61399e565b90506139998282613c11565b919050565b6000604051905090565b600067ffffffffffffffff8211156139c3576139c2613d18565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156139ef576139ee613d18565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613a1b57613a1a613d18565b5b613a2482613d82565b9050602081019050919050565b600067ffffffffffffffff821115613a4c57613a4b613d18565b5b613a5582613d82565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b6000613ade82613b93565b9150613ae983613b93565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613b1e57613b1d613c8b565b5b828201905092915050565b6000613b3482613b73565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613bca578082015181840152602081019050613baf565b83811115613bd9576000848401525b50505050565b60006002820490506001821680613bf757607f821691505b60208210811415613c0b57613c0a613cba565b5b50919050565b613c1a82613d82565b810181811067ffffffffffffffff82111715613c3957613c38613d18565b5b80604052505050565b6000613c4d82613b93565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613c8057613c7f613c8b565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d1115613d665760046000803e613d63600051613d93565b90505b90565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160e01c9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206f7220617070726f766564000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f742073657420757269207477696365000000000000000000000000600082015250565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e7366657220746f206e6f6e2d4552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b600060443d101561420557614288565b61420d61399e565b60043d036004823e80513d602482011167ffffffffffffffff82111715614235575050614288565b808201805167ffffffffffffffff8111156142535750505050614288565b80602083010160043d038501811115614270575050505050614288565b61427f82602001850186613c11565b82955050505050505b90565b61429481613b29565b811461429f57600080fd5b50565b6142ab81613b3b565b81146142b657600080fd5b50565b6142c281613b47565b81146142cd57600080fd5b50565b6142d981613b93565b81146142e457600080fd5b5056fea26469706673582212200c05ec2665dd227f1ad37851e920dca29c4cc58a146f0c0f572ffc21c95d8f2a64736f6c63430008070033

Deployed Bytecode Sourcemap

55377:5411:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39731:230;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56750:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38754:310;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55775:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56906;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56555;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59918:116;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57140:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60250:117;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55553:30;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55853:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55970;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57218;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56711;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56048;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56204;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56087;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57023;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41674:438;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55516:30;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57179:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56516;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56243;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55442:30;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55892:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57062;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40127:524;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56984:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56945;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55814;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57101;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60046:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55931:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56009;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56789;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56126;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56594;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18008:103;;;:::i;:::-;;57257:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57335;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56633;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56165;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60647:138;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55701:30;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17360:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55738:30;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55664;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55479;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56360:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57296;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55590:30;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56438:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40724:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56828:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60532:107;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56399:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56282;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56321;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56867;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56672;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60375:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55627:30;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40951:168;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41191:406;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18266:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56477:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39731:230;39817:7;39864:1;39845:21;;:7;:21;;;;39837:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;39931:9;:13;39941:2;39931:13;;;;;;;;;;;:22;39945:7;39931:22;;;;;;;;;;;;;;;;39924:29;;39731:230;;;;:::o;56750:32::-;56780:2;56750:32;:::o;38754:310::-;38856:4;38908:26;38893:41;;;:11;:41;;;;:110;;;;38966:37;38951:52;;;:11;:52;;;;38893:110;:163;;;;39020:36;39044:11;39020:23;:36::i;:::-;38893:163;38873:183;;38754:310;;;:::o;55775:32::-;55805:2;55775:32;:::o;56906:::-;56936:2;56906:32;:::o;56555:::-;56585:2;56555:32;:::o;59918:116::-;59978:13;60011:5;:14;60017:7;60011:14;;;;;;;;;;;60004:22;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59918:116;;;:::o;57140:32::-;57170:2;57140:32;:::o;60250:117::-;17246:13;:11;:13::i;:::-;60331:28:::1;60337:3;60342;60347:7;60331:28;;;;;;;;;;;::::0;:5:::1;:28::i;:::-;60250:117:::0;;;:::o;55553:30::-;55582:1;55553:30;:::o;55853:32::-;55883:2;55853:32;:::o;55970:::-;56000:2;55970:32;:::o;57218:::-;57248:2;57218:32;:::o;56711:::-;56741:2;56711:32;:::o;56048:::-;56078:2;56048:32;:::o;56204:::-;56234:2;56204:32;:::o;56087:::-;56117:2;56087:32;:::o;57023:::-;57053:2;57023:32;:::o;41674:438::-;41915:12;:10;:12::i;:::-;41907:20;;:4;:20;;;:60;;;;41931:36;41948:4;41954:12;:10;:12::i;:::-;41931:16;:36::i;:::-;41907:60;41885:156;;;;;;;;;;;;:::i;:::-;;;;;;;;;42052:52;42075:4;42081:2;42085:3;42090:7;42099:4;42052:22;:52::i;:::-;41674:438;;;;;:::o;55516:30::-;55545:1;55516:30;:::o;57179:32::-;57209:2;57179:32;:::o;56516:::-;56546:2;56516:32;:::o;56243:::-;56273:2;56243:32;:::o;55442:30::-;55471:1;55442:30;:::o;55892:32::-;55922:2;55892:32;:::o;57062:::-;57092:2;57062:32;:::o;40127:524::-;40283:16;40344:3;:10;40325:8;:15;:29;40317:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;40413:30;40460:8;:15;40446:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40413:63;;40494:9;40489:122;40513:8;:15;40509:1;:19;40489:122;;;40569:30;40579:8;40588:1;40579:11;;;;;;;;:::i;:::-;;;;;;;;40592:3;40596:1;40592:6;;;;;;;;:::i;:::-;;;;;;;;40569:9;:30::i;:::-;40550:13;40564:1;40550:16;;;;;;;;:::i;:::-;;;;;;;:49;;;;;40530:3;;;;:::i;:::-;;;40489:122;;;;40630:13;40623:20;;;40127:524;;;;:::o;56984:32::-;57014:2;56984:32;:::o;56945:::-;56975:2;56945:32;:::o;55814:::-;55844:2;55814:32;:::o;57101:::-;57131:2;57101:32;:::o;60046:192::-;17246:13;:11;:13::i;:::-;60171:1:::1;60145:5;:14;60151:7;60145:14;;;;;;;;;;;60139:28;;;;;:::i;:::-;;;:33;60131:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;60226:3;60209:5;:14;60215:7;60209:14;;;;;;;;;;;:20;;;;;;;;;;;;:::i;:::-;;60046:192:::0;;:::o;55931:32::-;55961:2;55931:32;:::o;56009:::-;56039:2;56009:32;:::o;56789:::-;56819:2;56789:32;:::o;56126:::-;56156:2;56126:32;:::o;56594:::-;56624:2;56594:32;:::o;18008:103::-;17246:13;:11;:13::i;:::-;18073:30:::1;18100:1;18073:18;:30::i;:::-;18008:103::o:0;57257:32::-;57287:2;57257:32;:::o;57335:::-;57365:2;57335:32;:::o;56633:::-;56663:2;56633:32;:::o;56165:::-;56195:2;56165:32;:::o;60647:138::-;17246:13;:11;:13::i;:::-;60739:38:::1;60750:10;60762:4;60768:8;60739:10;:38::i;:::-;60647:138:::0;;:::o;55701:30::-;55730:1;55701:30;:::o;17360:87::-;17406:7;17433:6;;;;;;;;;;;17426:13;;17360:87;:::o;55738:30::-;55767:1;55738:30;:::o;55664:::-;55693:1;55664:30;:::o;55479:::-;55508:1;55479:30;:::o;56360:32::-;56390:2;56360:32;:::o;57296:::-;57326:2;57296:32;:::o;55590:30::-;55619:1;55590:30;:::o;56438:32::-;56468:2;56438:32;:::o;40724:155::-;40819:52;40838:12;:10;:12::i;:::-;40852:8;40862;40819:18;:52::i;:::-;40724:155;;:::o;56828:32::-;56858:2;56828:32;:::o;60532:107::-;17246:13;:11;:13::i;:::-;60600:31:::1;60606:10;60618:3;60623:7;60600:5;:31::i;:::-;60532:107:::0;;:::o;56399:32::-;56429:2;56399:32;:::o;56282:::-;56312:2;56282:32;:::o;56321:::-;56351:2;56321:32;:::o;56867:::-;56897:2;56867:32;:::o;56672:::-;56702:2;56672:32;:::o;60375:149::-;17246:13;:11;:13::i;:::-;60481:35:::1;60492:3;60497:4;60503:8;60481:35;;;;;;;;;;;::::0;:10:::1;:35::i;:::-;60375:149:::0;;;:::o;55627:30::-;55656:1;55627:30;:::o;40951:168::-;41050:4;41074:18;:27;41093:7;41074:27;;;;;;;;;;;;;;;:37;41102:8;41074:37;;;;;;;;;;;;;;;;;;;;;;;;;41067:44;;40951:168;;;;:::o;41191:406::-;41407:12;:10;:12::i;:::-;41399:20;;:4;:20;;;:60;;;;41423:36;41440:4;41446:12;:10;:12::i;:::-;41423:16;:36::i;:::-;41399:60;41377:156;;;;;;;;;;;;:::i;:::-;;;;;;;;;41544:45;41562:4;41568:2;41572;41576:6;41584:4;41544:17;:45::i;:::-;41191:406;;;;;:::o;18266:201::-;17246:13;:11;:13::i;:::-;18375:1:::1;18355:22;;:8;:22;;;;18347:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;18431:28;18450:8;18431:18;:28::i;:::-;18266:201:::0;:::o;56477:32::-;56507:2;56477:32;:::o;20058:326::-;20118:4;20375:1;20353:7;:19;;;:23;20346:30;;20058:326;;;:::o;30035:157::-;30120:4;30159:25;30144:40;;;:11;:40;;;;30137:47;;30035:157;;;:::o;17525:132::-;17600:12;:10;:12::i;:::-;17589:23;;:7;:5;:7::i;:::-;:23;;;17581:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17525:132::o;46372:729::-;46539:1;46525:16;;:2;:16;;;;46517:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;46592:16;46611:12;:10;:12::i;:::-;46592:31;;46634:20;46657:21;46675:2;46657:17;:21::i;:::-;46634:44;;46689:24;46716:25;46734:6;46716:17;:25::i;:::-;46689:52;;46754:66;46775:8;46793:1;46797:2;46801:3;46806:7;46815:4;46754:20;:66::i;:::-;46854:6;46833:9;:13;46843:2;46833:13;;;;;;;;;;;:17;46847:2;46833:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;46913:2;46876:52;;46909:1;46876:52;;46891:8;46876:52;;;46917:2;46921:6;46876:52;;;;;;;:::i;:::-;;;;;;;;46941:65;46961:8;46979:1;46983:2;46987:3;46992:7;47001:4;46941:19;:65::i;:::-;47019:74;47050:8;47068:1;47072:2;47076;47080:6;47088:4;47019:30;:74::i;:::-;46506:595;;;46372:729;;;;:::o;15911:98::-;15964:7;15991:10;15984:17;;15911:98;:::o;43908:1146::-;44135:7;:14;44121:3;:10;:28;44113:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;44227:1;44213:16;;:2;:16;;;;44205:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;44284:16;44303:12;:10;:12::i;:::-;44284:31;;44328:60;44349:8;44359:4;44365:2;44369:3;44374:7;44383:4;44328:20;:60::i;:::-;44406:9;44401:421;44425:3;:10;44421:1;:14;44401:421;;;44457:10;44470:3;44474:1;44470:6;;;;;;;;:::i;:::-;;;;;;;;44457:19;;44491:14;44508:7;44516:1;44508:10;;;;;;;;:::i;:::-;;;;;;;;44491:27;;44535:19;44557:9;:13;44567:2;44557:13;;;;;;;;;;;:19;44571:4;44557:19;;;;;;;;;;;;;;;;44535:41;;44614:6;44599:11;:21;;44591:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;44747:6;44733:11;:20;44711:9;:13;44721:2;44711:13;;;;;;;;;;;:19;44725:4;44711:19;;;;;;;;;;;;;;;:42;;;;44804:6;44783:9;:13;44793:2;44783:13;;;;;;;;;;;:17;44797:2;44783:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;44442:380;;;44437:3;;;;:::i;:::-;;;44401:421;;;;44869:2;44839:47;;44863:4;44839:47;;44853:8;44839:47;;;44873:3;44878:7;44839:47;;;;;;;:::i;:::-;;;;;;;;44899:59;44919:8;44929:4;44935:2;44939:3;44944:7;44953:4;44899:19;:59::i;:::-;44971:75;45007:8;45017:4;45023:2;45027:3;45032:7;45041:4;44971:35;:75::i;:::-;44102:952;43908:1146;;;;;:::o;18627:191::-;18701:16;18720:6;;;;;;;;;;;18701:25;;18746:8;18737:6;;:17;;;;;;;;;;;;;;;;;;18801:8;18770:40;;18791:8;18770:40;;;;;;;;;;;;18690:128;18627:191;:::o;49673:969::-;49841:1;49825:18;;:4;:18;;;;49817:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;49916:7;:14;49902:3;:10;:28;49894:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;49988:16;50007:12;:10;:12::i;:::-;49988:31;;50032:66;50053:8;50063:4;50077:1;50081:3;50086:7;50032:66;;;;;;;;;;;;:20;:66::i;:::-;50116:9;50111:373;50135:3;:10;50131:1;:14;50111:373;;;50167:10;50180:3;50184:1;50180:6;;;;;;;;:::i;:::-;;;;;;;;50167:19;;50201:14;50218:7;50226:1;50218:10;;;;;;;;:::i;:::-;;;;;;;;50201:27;;50245:19;50267:9;:13;50277:2;50267:13;;;;;;;;;;;:19;50281:4;50267:19;;;;;;;;;;;;;;;;50245:41;;50324:6;50309:11;:21;;50301:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;50451:6;50437:11;:20;50415:9;:13;50425:2;50415:13;;;;;;;;;;;:19;50429:4;50415:19;;;;;;;;;;;;;;;:42;;;;50152:332;;;50147:3;;;;;:::i;:::-;;;;50111:373;;;;50539:1;50501:55;;50525:4;50501:55;;50515:8;50501:55;;;50543:3;50548:7;50501:55;;;;;;;:::i;:::-;;;;;;;;50569:65;50589:8;50599:4;50613:1;50617:3;50622:7;50569:65;;;;;;;;;;;;:19;:65::i;:::-;49806:836;49673:969;;;:::o;50785:331::-;50940:8;50931:17;;:5;:17;;;;50923:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;51043:8;51005:18;:25;51024:5;51005:25;;;;;;;;;;;;;;;:35;51031:8;51005:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;51089:8;51067:41;;51082:5;51067:41;;;51099:8;51067:41;;;;;;:::i;:::-;;;;;;;;50785:331;;;:::o;48615:808::-;48758:1;48742:18;;:4;:18;;;;48734:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;48813:16;48832:12;:10;:12::i;:::-;48813:31;;48855:20;48878:21;48896:2;48878:17;:21::i;:::-;48855:44;;48910:24;48937:25;48955:6;48937:17;:25::i;:::-;48910:52;;48975:66;48996:8;49006:4;49020:1;49024:3;49029:7;48975:66;;;;;;;;;;;;:20;:66::i;:::-;49054:19;49076:9;:13;49086:2;49076:13;;;;;;;;;;;:19;49090:4;49076:19;;;;;;;;;;;;;;;;49054:41;;49129:6;49114:11;:21;;49106:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;49248:6;49234:11;:20;49212:9;:13;49222:2;49212:13;;;;;;;;;;;:19;49226:4;49212:19;;;;;;;;;;;;;;;:42;;;;49322:1;49283:54;;49308:4;49283:54;;49298:8;49283:54;;;49326:2;49330:6;49283:54;;;;;;;:::i;:::-;;;;;;;;49350:65;49370:8;49380:4;49394:1;49398:3;49403:7;49350:65;;;;;;;;;;;;:19;:65::i;:::-;48723:700;;;;48615:808;;;:::o;47504:813::-;47696:1;47682:16;;:2;:16;;;;47674:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;47769:7;:14;47755:3;:10;:28;47747:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;47841:16;47860:12;:10;:12::i;:::-;47841:31;;47885:66;47906:8;47924:1;47928:2;47932:3;47937:7;47946:4;47885:20;:66::i;:::-;47969:9;47964:103;47988:3;:10;47984:1;:14;47964:103;;;48045:7;48053:1;48045:10;;;;;;;;:::i;:::-;;;;;;;;48020:9;:17;48030:3;48034:1;48030:6;;;;;;;;:::i;:::-;;;;;;;;48020:17;;;;;;;;;;;:21;48038:2;48020:21;;;;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;;;;;48000:3;;;;;:::i;:::-;;;;47964:103;;;;48120:2;48084:53;;48116:1;48084:53;;48098:8;48084:53;;;48124:3;48129:7;48084:53;;;;;;;:::i;:::-;;;;;;;;48150:65;48170:8;48188:1;48192:2;48196:3;48201:7;48210:4;48150:19;:65::i;:::-;48228:81;48264:8;48282:1;48286:2;48290:3;48295:7;48304:4;48228:35;:81::i;:::-;47663:654;47504:813;;;;:::o;42576:974::-;42778:1;42764:16;;:2;:16;;;;42756:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;42835:16;42854:12;:10;:12::i;:::-;42835:31;;42877:20;42900:21;42918:2;42900:17;:21::i;:::-;42877:44;;42932:24;42959:25;42977:6;42959:17;:25::i;:::-;42932:52;;42997:60;43018:8;43028:4;43034:2;43038:3;43043:7;43052:4;42997:20;:60::i;:::-;43070:19;43092:9;:13;43102:2;43092:13;;;;;;;;;;;:19;43106:4;43092:19;;;;;;;;;;;;;;;;43070:41;;43145:6;43130:11;:21;;43122:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;43270:6;43256:11;:20;43234:9;:13;43244:2;43234:13;;;;;;;;;;;:19;43248:4;43234:19;;;;;;;;;;;;;;;:42;;;;43319:6;43298:9;:13;43308:2;43298:13;;;;;;;;;;;:17;43312:2;43298:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;43374:2;43343:46;;43368:4;43343:46;;43358:8;43343:46;;;43378:2;43382:6;43343:46;;;;;;;:::i;:::-;;;;;;;;43402:59;43422:8;43432:4;43438:2;43442:3;43447:7;43456:4;43402:19;:59::i;:::-;43474:68;43505:8;43515:4;43521:2;43525;43529:6;43537:4;43474:30;:68::i;:::-;42745:805;;;;42576:974;;;;;:::o;55051:198::-;55117:16;55146:22;55185:1;55171:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55146:41;;55209:7;55198:5;55204:1;55198:8;;;;;;;;:::i;:::-;;;;;;;:18;;;;;55236:5;55229:12;;;55051:198;;;:::o;52074:221::-;;;;;;;:::o;53250:220::-;;;;;;;:::o;53478:744::-;53693:15;:2;:13;;;:15::i;:::-;53689:526;;;53746:2;53729:38;;;53768:8;53778:4;53784:2;53788:6;53796:4;53729:72;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;53725:479;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;54077:6;54070:14;;;;;;;;;;;:::i;:::-;;;;;;;;53725:479;;;54126:62;;;;;;;;;;:::i;:::-;;;;;;;;53725:479;53863:43;;;53851:55;;;:8;:55;;;;53847:154;;53931:50;;;;;;;;;;:::i;:::-;;;;;;;;53847:154;53802:214;53689:526;53478:744;;;;;;:::o;54230:813::-;54470:15;:2;:13;;;:15::i;:::-;54466:570;;;54523:2;54506:43;;;54550:8;54560:4;54566:3;54571:7;54580:4;54506:79;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;54502:523;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;54898:6;54891:14;;;;;;;;;;;:::i;:::-;;;;;;;;54502:523;;;54947:62;;;;;;;;;;:::i;:::-;;;;;;;;54502:523;54679:48;;;54667:60;;;:8;:60;;;;54663:159;;54752:50;;;;;;;;;;:::i;:::-;;;;;;;;54663:159;54586:251;54466:570;54230:813;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;769:::-;865:5;890:81;906:64;963:6;906:64;:::i;:::-;890:81;:::i;:::-;881:90;;991:5;1020:6;1013:5;1006:21;1054:4;1047:5;1043:16;1036:23;;1080:6;1130:3;1122:4;1114:6;1110:17;1105:3;1101:27;1098:36;1095:143;;;1149:79;;:::i;:::-;1095:143;1262:1;1247:238;1272:6;1269:1;1266:13;1247:238;;;1340:3;1369:37;1402:3;1390:10;1369:37;:::i;:::-;1364:3;1357:50;1436:4;1431:3;1427:14;1420:21;;1470:4;1465:3;1461:14;1454:21;;1307:178;1294:1;1291;1287:9;1282:14;;1247:238;;;1251:14;871:620;;769:722;;;;;:::o;1497:410::-;1574:5;1599:65;1615:48;1656:6;1615:48;:::i;:::-;1599:65;:::i;:::-;1590:74;;1687:6;1680:5;1673:21;1725:4;1718:5;1714:16;1763:3;1754:6;1749:3;1745:16;1742:25;1739:112;;;1770:79;;:::i;:::-;1739:112;1860:41;1894:6;1889:3;1884;1860:41;:::i;:::-;1580:327;1497:410;;;;;:::o;1913:412::-;1991:5;2016:66;2032:49;2074:6;2032:49;:::i;:::-;2016:66;:::i;:::-;2007:75;;2105:6;2098:5;2091:21;2143:4;2136:5;2132:16;2181:3;2172:6;2167:3;2163:16;2160:25;2157:112;;;2188:79;;:::i;:::-;2157:112;2278:41;2312:6;2307:3;2302;2278:41;:::i;:::-;1997:328;1913:412;;;;;:::o;2331:139::-;2377:5;2415:6;2402:20;2393:29;;2431:33;2458:5;2431:33;:::i;:::-;2331:139;;;;:::o;2493:370::-;2564:5;2613:3;2606:4;2598:6;2594:17;2590:27;2580:122;;2621:79;;:::i;:::-;2580:122;2738:6;2725:20;2763:94;2853:3;2845:6;2838:4;2830:6;2826:17;2763:94;:::i;:::-;2754:103;;2570:293;2493:370;;;;:::o;2886:::-;2957:5;3006:3;2999:4;2991:6;2987:17;2983:27;2973:122;;3014:79;;:::i;:::-;2973:122;3131:6;3118:20;3156:94;3246:3;3238:6;3231:4;3223:6;3219:17;3156:94;:::i;:::-;3147:103;;2963:293;2886:370;;;;:::o;3262:133::-;3305:5;3343:6;3330:20;3321:29;;3359:30;3383:5;3359:30;:::i;:::-;3262:133;;;;:::o;3401:137::-;3446:5;3484:6;3471:20;3462:29;;3500:32;3526:5;3500:32;:::i;:::-;3401:137;;;;:::o;3544:141::-;3600:5;3631:6;3625:13;3616:22;;3647:32;3673:5;3647:32;:::i;:::-;3544:141;;;;:::o;3704:338::-;3759:5;3808:3;3801:4;3793:6;3789:17;3785:27;3775:122;;3816:79;;:::i;:::-;3775:122;3933:6;3920:20;3958:78;4032:3;4024:6;4017:4;4009:6;4005:17;3958:78;:::i;:::-;3949:87;;3765:277;3704:338;;;;:::o;4062:340::-;4118:5;4167:3;4160:4;4152:6;4148:17;4144:27;4134:122;;4175:79;;:::i;:::-;4134:122;4292:6;4279:20;4317:79;4392:3;4384:6;4377:4;4369:6;4365:17;4317:79;:::i;:::-;4308:88;;4124:278;4062:340;;;;:::o;4408:139::-;4454:5;4492:6;4479:20;4470:29;;4508:33;4535:5;4508:33;:::i;:::-;4408:139;;;;:::o;4553:329::-;4612:6;4661:2;4649:9;4640:7;4636:23;4632:32;4629:119;;;4667:79;;:::i;:::-;4629:119;4787:1;4812:53;4857:7;4848:6;4837:9;4833:22;4812:53;:::i;:::-;4802:63;;4758:117;4553:329;;;;:::o;4888:474::-;4956:6;4964;5013:2;5001:9;4992:7;4988:23;4984:32;4981:119;;;5019:79;;:::i;:::-;4981:119;5139:1;5164:53;5209:7;5200:6;5189:9;5185:22;5164:53;:::i;:::-;5154:63;;5110:117;5266:2;5292:53;5337:7;5328:6;5317:9;5313:22;5292:53;:::i;:::-;5282:63;;5237:118;4888:474;;;;;:::o;5368:1509::-;5522:6;5530;5538;5546;5554;5603:3;5591:9;5582:7;5578:23;5574:33;5571:120;;;5610:79;;:::i;:::-;5571:120;5730:1;5755:53;5800:7;5791:6;5780:9;5776:22;5755:53;:::i;:::-;5745:63;;5701:117;5857:2;5883:53;5928:7;5919:6;5908:9;5904:22;5883:53;:::i;:::-;5873:63;;5828:118;6013:2;6002:9;5998:18;5985:32;6044:18;6036:6;6033:30;6030:117;;;6066:79;;:::i;:::-;6030:117;6171:78;6241:7;6232:6;6221:9;6217:22;6171:78;:::i;:::-;6161:88;;5956:303;6326:2;6315:9;6311:18;6298:32;6357:18;6349:6;6346:30;6343:117;;;6379:79;;:::i;:::-;6343:117;6484:78;6554:7;6545:6;6534:9;6530:22;6484:78;:::i;:::-;6474:88;;6269:303;6639:3;6628:9;6624:19;6611:33;6671:18;6663:6;6660:30;6657:117;;;6693:79;;:::i;:::-;6657:117;6798:62;6852:7;6843:6;6832:9;6828:22;6798:62;:::i;:::-;6788:72;;6582:288;5368:1509;;;;;;;;:::o;6883:1089::-;6987:6;6995;7003;7011;7019;7068:3;7056:9;7047:7;7043:23;7039:33;7036:120;;;7075:79;;:::i;:::-;7036:120;7195:1;7220:53;7265:7;7256:6;7245:9;7241:22;7220:53;:::i;:::-;7210:63;;7166:117;7322:2;7348:53;7393:7;7384:6;7373:9;7369:22;7348:53;:::i;:::-;7338:63;;7293:118;7450:2;7476:53;7521:7;7512:6;7501:9;7497:22;7476:53;:::i;:::-;7466:63;;7421:118;7578:2;7604:53;7649:7;7640:6;7629:9;7625:22;7604:53;:::i;:::-;7594:63;;7549:118;7734:3;7723:9;7719:19;7706:33;7766:18;7758:6;7755:30;7752:117;;;7788:79;;:::i;:::-;7752:117;7893:62;7947:7;7938:6;7927:9;7923:22;7893:62;:::i;:::-;7883:72;;7677:288;6883:1089;;;;;;;;:::o;7978:1039::-;8105:6;8113;8121;8170:2;8158:9;8149:7;8145:23;8141:32;8138:119;;;8176:79;;:::i;:::-;8138:119;8296:1;8321:53;8366:7;8357:6;8346:9;8342:22;8321:53;:::i;:::-;8311:63;;8267:117;8451:2;8440:9;8436:18;8423:32;8482:18;8474:6;8471:30;8468:117;;;8504:79;;:::i;:::-;8468:117;8609:78;8679:7;8670:6;8659:9;8655:22;8609:78;:::i;:::-;8599:88;;8394:303;8764:2;8753:9;8749:18;8736:32;8795:18;8787:6;8784:30;8781:117;;;8817:79;;:::i;:::-;8781:117;8922:78;8992:7;8983:6;8972:9;8968:22;8922:78;:::i;:::-;8912:88;;8707:303;7978:1039;;;;;:::o;9023:468::-;9088:6;9096;9145:2;9133:9;9124:7;9120:23;9116:32;9113:119;;;9151:79;;:::i;:::-;9113:119;9271:1;9296:53;9341:7;9332:6;9321:9;9317:22;9296:53;:::i;:::-;9286:63;;9242:117;9398:2;9424:50;9466:7;9457:6;9446:9;9442:22;9424:50;:::i;:::-;9414:60;;9369:115;9023:468;;;;;:::o;9497:474::-;9565:6;9573;9622:2;9610:9;9601:7;9597:23;9593:32;9590:119;;;9628:79;;:::i;:::-;9590:119;9748:1;9773:53;9818:7;9809:6;9798:9;9794:22;9773:53;:::i;:::-;9763:63;;9719:117;9875:2;9901:53;9946:7;9937:6;9926:9;9922:22;9901:53;:::i;:::-;9891:63;;9846:118;9497:474;;;;;:::o;9977:619::-;10054:6;10062;10070;10119:2;10107:9;10098:7;10094:23;10090:32;10087:119;;;10125:79;;:::i;:::-;10087:119;10245:1;10270:53;10315:7;10306:6;10295:9;10291:22;10270:53;:::i;:::-;10260:63;;10216:117;10372:2;10398:53;10443:7;10434:6;10423:9;10419:22;10398:53;:::i;:::-;10388:63;;10343:118;10500:2;10526:53;10571:7;10562:6;10551:9;10547:22;10526:53;:::i;:::-;10516:63;;10471:118;9977:619;;;;;:::o;10602:894::-;10720:6;10728;10777:2;10765:9;10756:7;10752:23;10748:32;10745:119;;;10783:79;;:::i;:::-;10745:119;10931:1;10920:9;10916:17;10903:31;10961:18;10953:6;10950:30;10947:117;;;10983:79;;:::i;:::-;10947:117;11088:78;11158:7;11149:6;11138:9;11134:22;11088:78;:::i;:::-;11078:88;;10874:302;11243:2;11232:9;11228:18;11215:32;11274:18;11266:6;11263:30;11260:117;;;11296:79;;:::i;:::-;11260:117;11401:78;11471:7;11462:6;11451:9;11447:22;11401:78;:::i;:::-;11391:88;;11186:303;10602:894;;;;;:::o;11502:::-;11620:6;11628;11677:2;11665:9;11656:7;11652:23;11648:32;11645:119;;;11683:79;;:::i;:::-;11645:119;11831:1;11820:9;11816:17;11803:31;11861:18;11853:6;11850:30;11847:117;;;11883:79;;:::i;:::-;11847:117;11988:78;12058:7;12049:6;12038:9;12034:22;11988:78;:::i;:::-;11978:88;;11774:302;12143:2;12132:9;12128:18;12115:32;12174:18;12166:6;12163:30;12160:117;;;12196:79;;:::i;:::-;12160:117;12301:78;12371:7;12362:6;12351:9;12347:22;12301:78;:::i;:::-;12291:88;;12086:303;11502:894;;;;;:::o;12402:327::-;12460:6;12509:2;12497:9;12488:7;12484:23;12480:32;12477:119;;;12515:79;;:::i;:::-;12477:119;12635:1;12660:52;12704:7;12695:6;12684:9;12680:22;12660:52;:::i;:::-;12650:62;;12606:116;12402:327;;;;:::o;12735:349::-;12804:6;12853:2;12841:9;12832:7;12828:23;12824:32;12821:119;;;12859:79;;:::i;:::-;12821:119;12979:1;13004:63;13059:7;13050:6;13039:9;13035:22;13004:63;:::i;:::-;12994:73;;12950:127;12735:349;;;;:::o;13090:329::-;13149:6;13198:2;13186:9;13177:7;13173:23;13169:32;13166:119;;;13204:79;;:::i;:::-;13166:119;13324:1;13349:53;13394:7;13385:6;13374:9;13370:22;13349:53;:::i;:::-;13339:63;;13295:117;13090:329;;;;:::o;13425:654::-;13503:6;13511;13560:2;13548:9;13539:7;13535:23;13531:32;13528:119;;;13566:79;;:::i;:::-;13528:119;13686:1;13711:53;13756:7;13747:6;13736:9;13732:22;13711:53;:::i;:::-;13701:63;;13657:117;13841:2;13830:9;13826:18;13813:32;13872:18;13864:6;13861:30;13858:117;;;13894:79;;:::i;:::-;13858:117;13999:63;14054:7;14045:6;14034:9;14030:22;13999:63;:::i;:::-;13989:73;;13784:288;13425:654;;;;;:::o;14085:474::-;14153:6;14161;14210:2;14198:9;14189:7;14185:23;14181:32;14178:119;;;14216:79;;:::i;:::-;14178:119;14336:1;14361:53;14406:7;14397:6;14386:9;14382:22;14361:53;:::i;:::-;14351:63;;14307:117;14463:2;14489:53;14534:7;14525:6;14514:9;14510:22;14489:53;:::i;:::-;14479:63;;14434:118;14085:474;;;;;:::o;14565:179::-;14634:10;14655:46;14697:3;14689:6;14655:46;:::i;:::-;14733:4;14728:3;14724:14;14710:28;;14565:179;;;;:::o;14750:118::-;14837:24;14855:5;14837:24;:::i;:::-;14832:3;14825:37;14750:118;;:::o;14904:732::-;15023:3;15052:54;15100:5;15052:54;:::i;:::-;15122:86;15201:6;15196:3;15122:86;:::i;:::-;15115:93;;15232:56;15282:5;15232:56;:::i;:::-;15311:7;15342:1;15327:284;15352:6;15349:1;15346:13;15327:284;;;15428:6;15422:13;15455:63;15514:3;15499:13;15455:63;:::i;:::-;15448:70;;15541:60;15594:6;15541:60;:::i;:::-;15531:70;;15387:224;15374:1;15371;15367:9;15362:14;;15327:284;;;15331:14;15627:3;15620:10;;15028:608;;;14904:732;;;;:::o;15642:109::-;15723:21;15738:5;15723:21;:::i;:::-;15718:3;15711:34;15642:109;;:::o;15757:360::-;15843:3;15871:38;15903:5;15871:38;:::i;:::-;15925:70;15988:6;15983:3;15925:70;:::i;:::-;15918:77;;16004:52;16049:6;16044:3;16037:4;16030:5;16026:16;16004:52;:::i;:::-;16081:29;16103:6;16081:29;:::i;:::-;16076:3;16072:39;16065:46;;15847:270;15757:360;;;;:::o;16123:364::-;16211:3;16239:39;16272:5;16239:39;:::i;:::-;16294:71;16358:6;16353:3;16294:71;:::i;:::-;16287:78;;16374:52;16419:6;16414:3;16407:4;16400:5;16396:16;16374:52;:::i;:::-;16451:29;16473:6;16451:29;:::i;:::-;16446:3;16442:39;16435:46;;16215:272;16123:364;;;;:::o;16493:366::-;16635:3;16656:67;16720:2;16715:3;16656:67;:::i;:::-;16649:74;;16732:93;16821:3;16732:93;:::i;:::-;16850:2;16845:3;16841:12;16834:19;;16493:366;;;:::o;16865:::-;17007:3;17028:67;17092:2;17087:3;17028:67;:::i;:::-;17021:74;;17104:93;17193:3;17104:93;:::i;:::-;17222:2;17217:3;17213:12;17206:19;;16865:366;;;:::o;17237:::-;17379:3;17400:67;17464:2;17459:3;17400:67;:::i;:::-;17393:74;;17476:93;17565:3;17476:93;:::i;:::-;17594:2;17589:3;17585:12;17578:19;;17237:366;;;:::o;17609:::-;17751:3;17772:67;17836:2;17831:3;17772:67;:::i;:::-;17765:74;;17848:93;17937:3;17848:93;:::i;:::-;17966:2;17961:3;17957:12;17950:19;;17609:366;;;:::o;17981:::-;18123:3;18144:67;18208:2;18203:3;18144:67;:::i;:::-;18137:74;;18220:93;18309:3;18220:93;:::i;:::-;18338:2;18333:3;18329:12;18322:19;;17981:366;;;:::o;18353:::-;18495:3;18516:67;18580:2;18575:3;18516:67;:::i;:::-;18509:74;;18592:93;18681:3;18592:93;:::i;:::-;18710:2;18705:3;18701:12;18694:19;;18353:366;;;:::o;18725:::-;18867:3;18888:67;18952:2;18947:3;18888:67;:::i;:::-;18881:74;;18964:93;19053:3;18964:93;:::i;:::-;19082:2;19077:3;19073:12;19066:19;;18725:366;;;:::o;19097:::-;19239:3;19260:67;19324:2;19319:3;19260:67;:::i;:::-;19253:74;;19336:93;19425:3;19336:93;:::i;:::-;19454:2;19449:3;19445:12;19438:19;;19097:366;;;:::o;19469:::-;19611:3;19632:67;19696:2;19691:3;19632:67;:::i;:::-;19625:74;;19708:93;19797:3;19708:93;:::i;:::-;19826:2;19821:3;19817:12;19810:19;;19469:366;;;:::o;19841:::-;19983:3;20004:67;20068:2;20063:3;20004:67;:::i;:::-;19997:74;;20080:93;20169:3;20080:93;:::i;:::-;20198:2;20193:3;20189:12;20182:19;;19841:366;;;:::o;20213:::-;20355:3;20376:67;20440:2;20435:3;20376:67;:::i;:::-;20369:74;;20452:93;20541:3;20452:93;:::i;:::-;20570:2;20565:3;20561:12;20554:19;;20213:366;;;:::o;20585:::-;20727:3;20748:67;20812:2;20807:3;20748:67;:::i;:::-;20741:74;;20824:93;20913:3;20824:93;:::i;:::-;20942:2;20937:3;20933:12;20926:19;;20585:366;;;:::o;20957:::-;21099:3;21120:67;21184:2;21179:3;21120:67;:::i;:::-;21113:74;;21196:93;21285:3;21196:93;:::i;:::-;21314:2;21309:3;21305:12;21298:19;;20957:366;;;:::o;21329:::-;21471:3;21492:67;21556:2;21551:3;21492:67;:::i;:::-;21485:74;;21568:93;21657:3;21568:93;:::i;:::-;21686:2;21681:3;21677:12;21670:19;;21329:366;;;:::o;21701:::-;21843:3;21864:67;21928:2;21923:3;21864:67;:::i;:::-;21857:74;;21940:93;22029:3;21940:93;:::i;:::-;22058:2;22053:3;22049:12;22042:19;;21701:366;;;:::o;22073:108::-;22150:24;22168:5;22150:24;:::i;:::-;22145:3;22138:37;22073:108;;:::o;22187:118::-;22274:24;22292:5;22274:24;:::i;:::-;22269:3;22262:37;22187:118;;:::o;22311:222::-;22404:4;22442:2;22431:9;22427:18;22419:26;;22455:71;22523:1;22512:9;22508:17;22499:6;22455:71;:::i;:::-;22311:222;;;;:::o;22539:1053::-;22862:4;22900:3;22889:9;22885:19;22877:27;;22914:71;22982:1;22971:9;22967:17;22958:6;22914:71;:::i;:::-;22995:72;23063:2;23052:9;23048:18;23039:6;22995:72;:::i;:::-;23114:9;23108:4;23104:20;23099:2;23088:9;23084:18;23077:48;23142:108;23245:4;23236:6;23142:108;:::i;:::-;23134:116;;23297:9;23291:4;23287:20;23282:2;23271:9;23267:18;23260:48;23325:108;23428:4;23419:6;23325:108;:::i;:::-;23317:116;;23481:9;23475:4;23471:20;23465:3;23454:9;23450:19;23443:49;23509:76;23580:4;23571:6;23509:76;:::i;:::-;23501:84;;22539:1053;;;;;;;;:::o;23598:751::-;23821:4;23859:3;23848:9;23844:19;23836:27;;23873:71;23941:1;23930:9;23926:17;23917:6;23873:71;:::i;:::-;23954:72;24022:2;24011:9;24007:18;23998:6;23954:72;:::i;:::-;24036;24104:2;24093:9;24089:18;24080:6;24036:72;:::i;:::-;24118;24186:2;24175:9;24171:18;24162:6;24118:72;:::i;:::-;24238:9;24232:4;24228:20;24222:3;24211:9;24207:19;24200:49;24266:76;24337:4;24328:6;24266:76;:::i;:::-;24258:84;;23598:751;;;;;;;;:::o;24355:373::-;24498:4;24536:2;24525:9;24521:18;24513:26;;24585:9;24579:4;24575:20;24571:1;24560:9;24556:17;24549:47;24613:108;24716:4;24707:6;24613:108;:::i;:::-;24605:116;;24355:373;;;;:::o;24734:634::-;24955:4;24993:2;24982:9;24978:18;24970:26;;25042:9;25036:4;25032:20;25028:1;25017:9;25013:17;25006:47;25070:108;25173:4;25164:6;25070:108;:::i;:::-;25062:116;;25225:9;25219:4;25215:20;25210:2;25199:9;25195:18;25188:48;25253:108;25356:4;25347:6;25253:108;:::i;:::-;25245:116;;24734:634;;;;;:::o;25374:210::-;25461:4;25499:2;25488:9;25484:18;25476:26;;25512:65;25574:1;25563:9;25559:17;25550:6;25512:65;:::i;:::-;25374:210;;;;:::o;25590:313::-;25703:4;25741:2;25730:9;25726:18;25718:26;;25790:9;25784:4;25780:20;25776:1;25765:9;25761:17;25754:47;25818:78;25891:4;25882:6;25818:78;:::i;:::-;25810:86;;25590:313;;;;:::o;25909:419::-;26075:4;26113:2;26102:9;26098:18;26090:26;;26162:9;26156:4;26152:20;26148:1;26137:9;26133:17;26126:47;26190:131;26316:4;26190:131;:::i;:::-;26182:139;;25909:419;;;:::o;26334:::-;26500:4;26538:2;26527:9;26523:18;26515:26;;26587:9;26581:4;26577:20;26573:1;26562:9;26558:17;26551:47;26615:131;26741:4;26615:131;:::i;:::-;26607:139;;26334:419;;;:::o;26759:::-;26925:4;26963:2;26952:9;26948:18;26940:26;;27012:9;27006:4;27002:20;26998:1;26987:9;26983:17;26976:47;27040:131;27166:4;27040:131;:::i;:::-;27032:139;;26759:419;;;:::o;27184:::-;27350:4;27388:2;27377:9;27373:18;27365:26;;27437:9;27431:4;27427:20;27423:1;27412:9;27408:17;27401:47;27465:131;27591:4;27465:131;:::i;:::-;27457:139;;27184:419;;;:::o;27609:::-;27775:4;27813:2;27802:9;27798:18;27790:26;;27862:9;27856:4;27852:20;27848:1;27837:9;27833:17;27826:47;27890:131;28016:4;27890:131;:::i;:::-;27882:139;;27609:419;;;:::o;28034:::-;28200:4;28238:2;28227:9;28223:18;28215:26;;28287:9;28281:4;28277:20;28273:1;28262:9;28258:17;28251:47;28315:131;28441:4;28315:131;:::i;:::-;28307:139;;28034:419;;;:::o;28459:::-;28625:4;28663:2;28652:9;28648:18;28640:26;;28712:9;28706:4;28702:20;28698:1;28687:9;28683:17;28676:47;28740:131;28866:4;28740:131;:::i;:::-;28732:139;;28459:419;;;:::o;28884:::-;29050:4;29088:2;29077:9;29073:18;29065:26;;29137:9;29131:4;29127:20;29123:1;29112:9;29108:17;29101:47;29165:131;29291:4;29165:131;:::i;:::-;29157:139;;28884:419;;;:::o;29309:::-;29475:4;29513:2;29502:9;29498:18;29490:26;;29562:9;29556:4;29552:20;29548:1;29537:9;29533:17;29526:47;29590:131;29716:4;29590:131;:::i;:::-;29582:139;;29309:419;;;:::o;29734:::-;29900:4;29938:2;29927:9;29923:18;29915:26;;29987:9;29981:4;29977:20;29973:1;29962:9;29958:17;29951:47;30015:131;30141:4;30015:131;:::i;:::-;30007:139;;29734:419;;;:::o;30159:::-;30325:4;30363:2;30352:9;30348:18;30340:26;;30412:9;30406:4;30402:20;30398:1;30387:9;30383:17;30376:47;30440:131;30566:4;30440:131;:::i;:::-;30432:139;;30159:419;;;:::o;30584:::-;30750:4;30788:2;30777:9;30773:18;30765:26;;30837:9;30831:4;30827:20;30823:1;30812:9;30808:17;30801:47;30865:131;30991:4;30865:131;:::i;:::-;30857:139;;30584:419;;;:::o;31009:::-;31175:4;31213:2;31202:9;31198:18;31190:26;;31262:9;31256:4;31252:20;31248:1;31237:9;31233:17;31226:47;31290:131;31416:4;31290:131;:::i;:::-;31282:139;;31009:419;;;:::o;31434:::-;31600:4;31638:2;31627:9;31623:18;31615:26;;31687:9;31681:4;31677:20;31673:1;31662:9;31658:17;31651:47;31715:131;31841:4;31715:131;:::i;:::-;31707:139;;31434:419;;;:::o;31859:::-;32025:4;32063:2;32052:9;32048:18;32040:26;;32112:9;32106:4;32102:20;32098:1;32087:9;32083:17;32076:47;32140:131;32266:4;32140:131;:::i;:::-;32132:139;;31859:419;;;:::o;32284:222::-;32377:4;32415:2;32404:9;32400:18;32392:26;;32428:71;32496:1;32485:9;32481:17;32472:6;32428:71;:::i;:::-;32284:222;;;;:::o;32512:332::-;32633:4;32671:2;32660:9;32656:18;32648:26;;32684:71;32752:1;32741:9;32737:17;32728:6;32684:71;:::i;:::-;32765:72;32833:2;32822:9;32818:18;32809:6;32765:72;:::i;:::-;32512:332;;;;;:::o;32850:129::-;32884:6;32911:20;;:::i;:::-;32901:30;;32940:33;32968:4;32960:6;32940:33;:::i;:::-;32850:129;;;:::o;32985:75::-;33018:6;33051:2;33045:9;33035:19;;32985:75;:::o;33066:311::-;33143:4;33233:18;33225:6;33222:30;33219:56;;;33255:18;;:::i;:::-;33219:56;33305:4;33297:6;33293:17;33285:25;;33365:4;33359;33355:15;33347:23;;33066:311;;;:::o;33383:::-;33460:4;33550:18;33542:6;33539:30;33536:56;;;33572:18;;:::i;:::-;33536:56;33622:4;33614:6;33610:17;33602:25;;33682:4;33676;33672:15;33664:23;;33383:311;;;:::o;33700:307::-;33761:4;33851:18;33843:6;33840:30;33837:56;;;33873:18;;:::i;:::-;33837:56;33911:29;33933:6;33911:29;:::i;:::-;33903:37;;33995:4;33989;33985:15;33977:23;;33700:307;;;:::o;34013:308::-;34075:4;34165:18;34157:6;34154:30;34151:56;;;34187:18;;:::i;:::-;34151:56;34225:29;34247:6;34225:29;:::i;:::-;34217:37;;34309:4;34303;34299:15;34291:23;;34013:308;;;:::o;34327:132::-;34394:4;34417:3;34409:11;;34447:4;34442:3;34438:14;34430:22;;34327:132;;;:::o;34465:114::-;34532:6;34566:5;34560:12;34550:22;;34465:114;;;:::o;34585:98::-;34636:6;34670:5;34664:12;34654:22;;34585:98;;;:::o;34689:99::-;34741:6;34775:5;34769:12;34759:22;;34689:99;;;:::o;34794:113::-;34864:4;34896;34891:3;34887:14;34879:22;;34794:113;;;:::o;34913:184::-;35012:11;35046:6;35041:3;35034:19;35086:4;35081:3;35077:14;35062:29;;34913:184;;;;:::o;35103:168::-;35186:11;35220:6;35215:3;35208:19;35260:4;35255:3;35251:14;35236:29;;35103:168;;;;:::o;35277:169::-;35361:11;35395:6;35390:3;35383:19;35435:4;35430:3;35426:14;35411:29;;35277:169;;;;:::o;35452:305::-;35492:3;35511:20;35529:1;35511:20;:::i;:::-;35506:25;;35545:20;35563:1;35545:20;:::i;:::-;35540:25;;35699:1;35631:66;35627:74;35624:1;35621:81;35618:107;;;35705:18;;:::i;:::-;35618:107;35749:1;35746;35742:9;35735:16;;35452:305;;;;:::o;35763:96::-;35800:7;35829:24;35847:5;35829:24;:::i;:::-;35818:35;;35763:96;;;:::o;35865:90::-;35899:7;35942:5;35935:13;35928:21;35917:32;;35865:90;;;:::o;35961:149::-;35997:7;36037:66;36030:5;36026:78;36015:89;;35961:149;;;:::o;36116:126::-;36153:7;36193:42;36186:5;36182:54;36171:65;;36116:126;;;:::o;36248:77::-;36285:7;36314:5;36303:16;;36248:77;;;:::o;36331:154::-;36415:6;36410:3;36405;36392:30;36477:1;36468:6;36463:3;36459:16;36452:27;36331:154;;;:::o;36491:307::-;36559:1;36569:113;36583:6;36580:1;36577:13;36569:113;;;36668:1;36663:3;36659:11;36653:18;36649:1;36644:3;36640:11;36633:39;36605:2;36602:1;36598:10;36593:15;;36569:113;;;36700:6;36697:1;36694:13;36691:101;;;36780:1;36771:6;36766:3;36762:16;36755:27;36691:101;36540:258;36491:307;;;:::o;36804:320::-;36848:6;36885:1;36879:4;36875:12;36865:22;;36932:1;36926:4;36922:12;36953:18;36943:81;;37009:4;37001:6;36997:17;36987:27;;36943:81;37071:2;37063:6;37060:14;37040:18;37037:38;37034:84;;;37090:18;;:::i;:::-;37034:84;36855:269;36804:320;;;:::o;37130:281::-;37213:27;37235:4;37213:27;:::i;:::-;37205:6;37201:40;37343:6;37331:10;37328:22;37307:18;37295:10;37292:34;37289:62;37286:88;;;37354:18;;:::i;:::-;37286:88;37394:10;37390:2;37383:22;37173:238;37130:281;;:::o;37417:233::-;37456:3;37479:24;37497:5;37479:24;:::i;:::-;37470:33;;37525:66;37518:5;37515:77;37512:103;;;37595:18;;:::i;:::-;37512:103;37642:1;37635:5;37631:13;37624:20;;37417:233;;;:::o;37656:180::-;37704:77;37701:1;37694:88;37801:4;37798:1;37791:15;37825:4;37822:1;37815:15;37842:180;37890:77;37887:1;37880:88;37987:4;37984:1;37977:15;38011:4;38008:1;38001:15;38028:180;38076:77;38073:1;38066:88;38173:4;38170:1;38163:15;38197:4;38194:1;38187:15;38214:180;38262:77;38259:1;38252:88;38359:4;38356:1;38349:15;38383:4;38380:1;38373:15;38400:183;38435:3;38473:1;38455:16;38452:23;38449:128;;;38511:1;38508;38505;38490:23;38533:34;38564:1;38558:8;38533:34;:::i;:::-;38526:41;;38449:128;38400:183;:::o;38589:117::-;38698:1;38695;38688:12;38712:117;38821:1;38818;38811:12;38835:117;38944:1;38941;38934:12;38958:117;39067:1;39064;39057:12;39081:117;39190:1;39187;39180:12;39204:102;39245:6;39296:2;39292:7;39287:2;39280:5;39276:14;39272:28;39262:38;;39204:102;;;:::o;39312:106::-;39356:8;39405:5;39400:3;39396:15;39375:36;;39312:106;;;:::o;39424:227::-;39564:34;39560:1;39552:6;39548:14;39541:58;39633:10;39628:2;39620:6;39616:15;39609:35;39424:227;:::o;39657:225::-;39797:34;39793:1;39785:6;39781:14;39774:58;39866:8;39861:2;39853:6;39849:15;39842:33;39657:225;:::o;39888:223::-;40028:34;40024:1;40016:6;40012:14;40005:58;40097:6;40092:2;40084:6;40080:15;40073:31;39888:223;:::o;40117:229::-;40257:34;40253:1;40245:6;40241:14;40234:58;40326:12;40321:2;40313:6;40309:15;40302:37;40117:229;:::o;40352:233::-;40492:34;40488:1;40480:6;40476:14;40469:58;40561:16;40556:2;40548:6;40544:15;40537:41;40352:233;:::o;40591:224::-;40731:34;40727:1;40719:6;40715:14;40708:58;40800:7;40795:2;40787:6;40783:15;40776:32;40591:224;:::o;40821:170::-;40961:22;40957:1;40949:6;40945:14;40938:46;40821:170;:::o;40997:222::-;41137:34;41133:1;41125:6;41121:14;41114:58;41206:5;41201:2;41193:6;41189:15;41182:30;40997:222;:::o;41225:229::-;41365:34;41361:1;41353:6;41349:14;41342:58;41434:12;41429:2;41421:6;41417:15;41410:37;41225:229;:::o;41460:182::-;41600:34;41596:1;41588:6;41584:14;41577:58;41460:182;:::o;41648:228::-;41788:34;41784:1;41776:6;41772:14;41765:58;41857:11;41852:2;41844:6;41840:15;41833:36;41648:228;:::o;41882:::-;42022:34;42018:1;42010:6;42006:14;41999:58;42091:11;42086:2;42078:6;42074:15;42067:36;41882:228;:::o;42116:227::-;42256:34;42252:1;42244:6;42240:14;42233:58;42325:10;42320:2;42312:6;42308:15;42301:35;42116:227;:::o;42349:220::-;42489:34;42485:1;42477:6;42473:14;42466:58;42558:3;42553:2;42545:6;42541:15;42534:28;42349:220;:::o;42575:239::-;42715:34;42711:1;42703:6;42699:14;42692:58;42784:22;42779:2;42771:6;42767:15;42760:47;42575:239;:::o;42820:711::-;42859:3;42897:4;42879:16;42876:26;42873:39;;;42905:5;;42873:39;42934:20;;:::i;:::-;43009:1;42991:16;42987:24;42984:1;42978:4;42963:49;43042:4;43036:11;43141:16;43134:4;43126:6;43122:17;43119:39;43086:18;43078:6;43075:30;43059:113;43056:146;;;43187:5;;;;43056:146;43233:6;43227:4;43223:17;43269:3;43263:10;43296:18;43288:6;43285:30;43282:43;;;43318:5;;;;;;43282:43;43366:6;43359:4;43354:3;43350:14;43346:27;43425:1;43407:16;43403:24;43397:4;43393:35;43388:3;43385:44;43382:57;;;43432:5;;;;;;;43382:57;43449;43497:6;43491:4;43487:17;43479:6;43475:30;43469:4;43449:57;:::i;:::-;43522:3;43515:10;;42863:668;;;;;42820:711;;:::o;43537:122::-;43610:24;43628:5;43610:24;:::i;:::-;43603:5;43600:35;43590:63;;43649:1;43646;43639:12;43590:63;43537:122;:::o;43665:116::-;43735:21;43750:5;43735:21;:::i;:::-;43728:5;43725:32;43715:60;;43771:1;43768;43761:12;43715:60;43665:116;:::o;43787:120::-;43859:23;43876:5;43859:23;:::i;:::-;43852:5;43849:34;43839:62;;43897:1;43894;43887:12;43839:62;43787:120;:::o;43913:122::-;43986:24;44004:5;43986:24;:::i;:::-;43979:5;43976:35;43966:63;;44025:1;44022;44015:12;43966:63;43913:122;:::o

Swarm Source

ipfs://0c05ec2665dd227f1ad37851e920dca29c4cc58a146f0c0f572ffc21c95d8f2a
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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