ETH Price: $3,290.42 (-3.27%)

Token

Party Dice (DICE)

Overview

Max Total Supply

925,104.498623512000031205 DICE

Holders

1,358 (0.00%)

Market

Price

$0.0203 @ 0.000006 ETH

Onchain Market Cap

$18,754.21

Circulating Supply Market Cap

$0.00

Other Info

Token Contract (WITH 18 Decimals)

Balance
10 DICE

Value
$0.20 ( ~6.07824805000609E-05 ETH) [0.0011%]
0x42814cfb08b3a1f9fedd618d35e4e2a156b4488b
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

RISKY.LOL is creating a new standard of decentralized staking and gaming in the web3 space. Launch centered on Arbitrum One; RISKY.LOL intends to expand to all chains as the de-facto DeFi house standard.

Contract Source Code Verified (Exact Match)

Contract Name:
DiceV2

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Arbiscan.io on 2023-03-01
*/

//██████  ██ ███████ ██   ██ ██    ██    ██       ██████  ██      
//██   ██ ██ ██      ██  ██   ██  ██     ██      ██    ██ ██      
//██████  ██ ███████ █████     ████      ██      ██    ██ ██      
//██   ██ ██      ██ ██  ██     ██       ██      ██    ██ ██      
//██   ██ ██ ███████ ██   ██    ██    ██ ███████  ██████  ███████ 

pragma solidity ^0.8.0;
library EnumerableSet {
    struct Set {
        bytes32[] _values;
        mapping(bytes32 => uint256) _indexes;
    }
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {
            // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            if (lastIndex != toDeleteIndex) {
                bytes32 lastValue = set._values[lastIndex];

                // Move the last value to the index where the value to delete is
                set._values[toDeleteIndex] = lastValue;
                // Update the index for the moved value
                set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex
            }

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        return set._values[index];
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function _values(Set storage set) private view returns (bytes32[] memory) {
        return set._values;
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
        bytes32[] memory store = _values(set._inner);
        bytes32[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(AddressSet storage set) internal view returns (address[] memory) {
        bytes32[] memory store = _values(set._inner);
        address[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(UintSet storage set) internal view returns (uint256[] memory) {
        bytes32[] memory store = _values(set._inner);
        uint256[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/utils/math/Math.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;




/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

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

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= amount;
        }

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

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


// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)

pragma solidity ^0.8.0;

/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {AccessControl-_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) external view returns (bool);

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {AccessControl-_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) external;
}

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


// OpenZeppelin Contracts (last updated v4.8.0) (access/AccessControl.sol)

pragma solidity ^0.8.0;





/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role);
        _;
    }

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

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view virtual override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `_msgSender()` is missing `role`.
     * Overriding this function changes the behavior of the {onlyRole} modifier.
     *
     * Format of the revert message is described in {_checkRole}.
     *
     * _Available since v4.6._
     */
    function _checkRole(bytes32 role) internal view virtual {
        _checkRole(role, _msgSender());
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     */
    function _checkRole(bytes32 role, address account) internal view virtual {
        if (!hasRole(role, account)) {
            revert(
                string(
                    abi.encodePacked(
                        "AccessControl: account ",
                        Strings.toHexString(account),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     *
     * May emit a {RoleGranted} event.
     */
    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     *
     * May emit a {RoleRevoked} event.
     */
    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been revoked `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     *
     * May emit a {RoleRevoked} event.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * May emit a {RoleGranted} event.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     *
     * NOTE: This function is deprecated in favor of {_grantRole}.
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * Internal function without access restriction.
     *
     * May emit a {RoleGranted} event.
     */
    function _grantRole(bytes32 role, address account) internal virtual {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * Internal function without access restriction.
     *
     * May emit a {RoleRevoked} event.
     */
    function _revokeRole(bytes32 role, address account) internal virtual {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}

// File: contracts/10_stinkyFlipV2.sol

//SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.9;




interface iPing {
    function ping(address txOrigin, address msgSender, address tknSender, address tknRecipient, uint256 amount, uint256 netAmount) external;
}

contract DiceV2 is ERC20, AccessControl {


    using EnumerableSet for EnumerableSet.AddressSet;
    bytes32 public constant MINTER = keccak256("MINTER");
    EnumerableSet.AddressSet private routerAddresses;
    EnumerableSet.AddressSet private pingAddresses;
	EnumerableSet.AddressSet private minterAddresses;
	EnumerableSet.AddressSet private taxlessAddresses;
    bool public transfersEnabled = true;
    address public taxReceiver;
    uint256 public taxPercent;
    mapping(address => bool) public taxExclusions;

    modifier onlyAdmin {
		require(hasRole(DEFAULT_ADMIN_ROLE, msg.sender), "Caller is not the owner");
		_;
	}

	modifier onlyMinter {
		require(hasRole(MINTER, msg.sender), "Caller is not a minter");
		_;
	}

    constructor() ERC20("Party Dice", "DICE") {
        _setupRole(DEFAULT_ADMIN_ROLE, msg.sender);
        uint256 totalSupply = 1000000000 * 1e18;
        _mint(msg.sender, totalSupply);
    }

    function setPingAddresses(address[] memory _pingAddresses, bool add) external onlyAdmin {
    	for (uint256 i = 0; i < _pingAddresses.length; i++) {
        	if (add) {
            	pingAddresses.add(_pingAddresses[i]);
        	} 
			else {
            	pingAddresses.remove(_pingAddresses[i]);
        	}
		}
	}

    function setRouterAddresses(address[] memory _routerAddresses, bool add) external onlyAdmin {
    	for (uint256 i = 0; i < _routerAddresses.length; i++) {
        	if (add) {
            	routerAddresses.add(_routerAddresses[i]);
        	} 
			else {
            	routerAddresses.remove(_routerAddresses[i]);
        	}
		}
	}

	function setMinterAddresses(address[] memory _minterAddresses, bool enabled) external onlyAdmin {
		for (uint256 i = 0; i < _minterAddresses.length; i++) {
        	if (enabled) {
            	grantRole(MINTER, _minterAddresses[i]);
				minterAddresses.add(_minterAddresses[i]);
        	} 
        	else {
            	revokeRole(MINTER, _minterAddresses[i]);
				minterAddresses.remove(_minterAddresses[i]);
        	}
		}
    }

	function setTaxExclusion(address[] memory _taxlessAddresses, bool excluded) external onlyAdmin {
		for (uint256 i = 0; i < _taxlessAddresses.length; i++) {
    		if (excluded) {
            	taxlessAddresses.add(_taxlessAddresses[i]);
        	} 
			else {
            	taxlessAddresses.remove(_taxlessAddresses[i]);
        	}
		}
	}

	function getEnumerableSets() public view returns (
	address[] memory routerAddressesArr, 
	address[] memory pingAddressesArr, 
	address[] memory minterAddressesArr, 
	address[] memory taxlessAddressesArr) {
    	routerAddressesArr = new address[](routerAddresses.length());
    	for (uint256 i = 0; i < routerAddressesArr.length; i++) {
        	routerAddressesArr[i] = routerAddresses.at(i);
    	}
    	pingAddressesArr = new address[](pingAddresses.length());
    	for (uint256 i = 0; i < pingAddressesArr.length; i++) {
        	pingAddressesArr[i] = pingAddresses.at(i);
    	}
    	minterAddressesArr = new address[](minterAddresses.length());
    	for (uint256 i = 0; i < minterAddressesArr.length; i++) {
       		minterAddressesArr[i] = minterAddresses.at(i);
    	}
    	taxlessAddressesArr = new address[](taxlessAddresses.length());
    	for (uint256 i = 0; i < taxlessAddressesArr.length; i++) {
        	taxlessAddressesArr[i] = taxlessAddresses.at(i);
    	}
	}

    function setTaxParams(address _taxReceiver, uint256 _taxPercent) external onlyAdmin{
        require(_taxPercent <= 100, "Tax percent must be <= 100");
        taxReceiver = _taxReceiver;
        taxPercent = _taxPercent;
    }

    function transferEnabled(bool enabled) external onlyAdmin {
        transfersEnabled = enabled;
    }

    function _transfer(address from, address to, uint256 amount) internal override {
        require(transfersEnabled, "Transfers are disabled");
    	if (amount == 0) {
        	super._transfer(from, to, 0);
        	return;
    	}
    	bool isRouter = routerAddresses.contains(from) || routerAddresses.contains(to);
    	bool isTaxExcluded = taxlessAddresses.contains(from) || taxlessAddresses.contains(to);
    	uint256 fees = isRouter && !isTaxExcluded ? calculateTax(amount) : 0;
    	uint256 netAmount = amount - fees;
    	if (fees > 0) {
        	super._transfer(from, taxReceiver, fees);
    	}
    	super._transfer(from, to, netAmount);
    	if (isRouter) {
        	for (uint256 i = 0; i < pingAddresses.length(); i++) {
        		iPing(pingAddresses.at(i)).ping(tx.origin, msg.sender, from, to, amount, netAmount);
        	}
   		}
	}

    function modularmint(address to, uint256 amount) external onlyMinter returns (bool) {
        _mint(to, amount);
        return true;
    }

    function modularburn(address from, uint256 amount) external onlyMinter returns (bool) {
        _burn(from, amount);
        return true;
    }

    function calculateTax(uint256 amount) internal view returns (uint256) {
        return (amount * taxPercent) / 100;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getEnumerableSets","outputs":[{"internalType":"address[]","name":"routerAddressesArr","type":"address[]"},{"internalType":"address[]","name":"pingAddressesArr","type":"address[]"},{"internalType":"address[]","name":"minterAddressesArr","type":"address[]"},{"internalType":"address[]","name":"taxlessAddressesArr","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"modularburn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"modularmint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_minterAddresses","type":"address[]"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setMinterAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_pingAddresses","type":"address[]"},{"internalType":"bool","name":"add","type":"bool"}],"name":"setPingAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_routerAddresses","type":"address[]"},{"internalType":"bool","name":"add","type":"bool"}],"name":"setRouterAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_taxlessAddresses","type":"address[]"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"setTaxExclusion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_taxReceiver","type":"address"},{"internalType":"uint256","name":"_taxPercent","type":"uint256"}],"name":"setTaxParams","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"taxExclusions","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"transferEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transfersEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

60806040526001600e60006101000a81548160ff0219169083151502179055503480156200002c57600080fd5b506040518060400160405280600a81526020017f50617274792044696365000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f44494345000000000000000000000000000000000000000000000000000000008152508160039080519060200190620000b1929190620003ff565b508060049080519060200190620000ca929190620003ff565b505050620000e26000801b336200010c60201b60201c565b60006b033b2e3c9fd0803ce800000090506200010533826200012260201b60201c565b506200065b565b6200011e82826200029060201b60201c565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000195576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200018c9062000510565b60405180910390fd5b620001a9600083836200038260201b60201c565b8060026000828254620001bd91906200056b565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620002709190620005d9565b60405180910390a36200028c600083836200038760201b60201c565b5050565b620002a282826200038c60201b60201c565b6200037e5760016005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555062000323620003f760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b505050565b505050565b60006005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600033905090565b8280546200040d9062000625565b90600052602060002090601f0160209004810192826200043157600085556200047d565b82601f106200044c57805160ff19168380011785556200047d565b828001600101855582156200047d579182015b828111156200047c5782518255916020019190600101906200045f565b5b5090506200048c919062000490565b5090565b5b80821115620004ab57600081600090555060010162000491565b5090565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000620004f8601f83620004af565b91506200050582620004c0565b602082019050919050565b600060208201905081810360008301526200052b81620004e9565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620005788262000532565b9150620005858362000532565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115620005bd57620005bc6200053c565b5b828201905092915050565b620005d38162000532565b82525050565b6000602082019050620005f06000830184620005c8565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200063e57607f821691505b60208210811415620006555762000654620005f6565b5b50919050565b613b92806200066b6000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c806370a082311161010f578063d547741f116100a2578063ed35a8f911610071578063ed35a8f914610605578063f030a76314610635578063f836a69714610656578063fe6d812414610672576101f0565b8063d547741f1461057f578063d85d2e601461059b578063dd62ed3e146105b7578063e6ef73d6146105e7576101f0565b8063a217fddf116100de578063a217fddf146104e3578063a457c2d714610501578063a9059cbb14610531578063bef97c8714610561576101f0565b806370a08231146104475780637541f41c1461047757806391d148541461049557806395d89b41146104c5576101f0565b8063313ce567116101875780635a9d1c31116101565780635a9d1c31146103d75780635e3eb5ef146103f357806369fb78441461040f5780636fb3caee1461042b576101f0565b8063313ce5671461033d57806336568abe1461035b578063395093511461037757806356a3dbc2146103a7576101f0565b806318160ddd116101c357806318160ddd146102a357806323b872dd146102c1578063248a9ca3146102f15780632f2ff15d14610321576101f0565b806301ffc9a7146101f557806306fdde0314610225578063095ea7b3146102435780630c1936b914610273575b600080fd5b61020f600480360381019061020a919061280c565b610690565b60405161021c9190612854565b60405180910390f35b61022d61070a565b60405161023a9190612908565b60405180910390f35b61025d600480360381019061025891906129be565b61079c565b60405161026a9190612854565b60405180910390f35b61028d600480360381019061028891906129fe565b6107bf565b60405161029a9190612854565b60405180910390f35b6102ab6107df565b6040516102b89190612a3a565b60405180910390f35b6102db60048036038101906102d69190612a55565b6107e9565b6040516102e89190612854565b60405180910390f35b61030b60048036038101906103069190612ade565b610818565b6040516103189190612b1a565b60405180910390f35b61033b60048036038101906103369190612b35565b610838565b005b610345610859565b6040516103529190612b91565b60405180910390f35b61037560048036038101906103709190612b35565b610862565b005b610391600480360381019061038c91906129be565b6108e5565b60405161039e9190612854565b60405180910390f35b6103c160048036038101906103bc91906129be565b61091c565b6040516103ce9190612854565b60405180910390f35b6103f160048036038101906103ec9190612bd8565b61099b565b005b61040d60048036038101906104089190612d4d565b610a04565b005b61042960048036038101906104249190612d4d565b610ade565b005b61044560048036038101906104409190612d4d565b610c40565b005b610461600480360381019061045c91906129fe565b610d1a565b60405161046e9190612a3a565b60405180910390f35b61047f610d62565b60405161048c9190612a3a565b60405180910390f35b6104af60048036038101906104aa9190612b35565b610d68565b6040516104bc9190612854565b60405180910390f35b6104cd610dd3565b6040516104da9190612908565b60405180910390f35b6104eb610e65565b6040516104f89190612b1a565b60405180910390f35b61051b600480360381019061051691906129be565b610e6c565b6040516105289190612854565b60405180910390f35b61054b600480360381019061054691906129be565b610ee3565b6040516105589190612854565b60405180910390f35b610569610f06565b6040516105769190612854565b60405180910390f35b61059960048036038101906105949190612b35565b610f19565b005b6105b560048036038101906105b091906129be565b610f3a565b005b6105d160048036038101906105cc9190612da9565b611016565b6040516105de9190612a3a565b60405180910390f35b6105ef61109d565b6040516105fc9190612df8565b60405180910390f35b61061f600480360381019061061a91906129be565b6110c3565b60405161062c9190612854565b60405180910390f35b61063d611142565b60405161064d9493929190612ed1565b60405180910390f35b610670600480360381019061066b9190612d4d565b6114a2565b005b61067a61157c565b6040516106879190612b1a565b60405180910390f35b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107035750610702826115a0565b5b9050919050565b60606003805461071990612f61565b80601f016020809104026020016040519081016040528092919081815260200182805461074590612f61565b80156107925780601f1061076757610100808354040283529160200191610792565b820191906000526020600020905b81548152906001019060200180831161077557829003601f168201915b5050505050905090565b6000806107a761160a565b90506107b4818585611612565b600191505092915050565b60106020528060005260406000206000915054906101000a900460ff1681565b6000600254905090565b6000806107f461160a565b90506108018582856117dd565b61080c858585611869565b60019150509392505050565b600060056000838152602001908152602001600020600101549050919050565b61084182610818565b61084a81611a6f565b6108548383611a83565b505050565b60006012905090565b61086a61160a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146108d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ce90613005565b60405180910390fd5b6108e18282611b64565b5050565b6000806108f061160a565b90506109118185856109028589611016565b61090c9190613054565b611612565b600191505092915050565b60006109487ff0887ba65ee2024ea881d91b74c2450ef19e1557f03bed3ea9f16b037cbe2dc933610d68565b610987576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097e906130f6565b60405180910390fd5b6109918383611c46565b6001905092915050565b6109a86000801b33610d68565b6109e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109de90613162565b60405180910390fd5b80600e60006101000a81548160ff02191690831515021790555050565b610a116000801b33610d68565b610a50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4790613162565b60405180910390fd5b60005b8251811015610ad9578115610a9657610a90838281518110610a7857610a77613182565b5b6020026020010151600c611e1490919063ffffffff16565b50610ac6565b610ac4838281518110610aac57610aab613182565b5b6020026020010151600c611e4490919063ffffffff16565b505b8080610ad1906131b1565b915050610a53565b505050565b610aeb6000801b33610d68565b610b2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2190613162565b60405180910390fd5b60005b8251811015610c3b578115610bb457610b807ff0887ba65ee2024ea881d91b74c2450ef19e1557f03bed3ea9f16b037cbe2dc9848381518110610b7357610b72613182565b5b6020026020010151610838565b610bae838281518110610b9657610b95613182565b5b6020026020010151600a611e1490919063ffffffff16565b50610c28565b610bf87ff0887ba65ee2024ea881d91b74c2450ef19e1557f03bed3ea9f16b037cbe2dc9848381518110610beb57610bea613182565b5b6020026020010151610f19565b610c26838281518110610c0e57610c0d613182565b5b6020026020010151600a611e4490919063ffffffff16565b505b8080610c33906131b1565b915050610b2d565b505050565b610c4d6000801b33610d68565b610c8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8390613162565b60405180910390fd5b60005b8251811015610d15578115610cd257610ccc838281518110610cb457610cb3613182565b5b60200260200101516008611e1490919063ffffffff16565b50610d02565b610d00838281518110610ce857610ce7613182565b5b60200260200101516008611e4490919063ffffffff16565b505b8080610d0d906131b1565b915050610c8f565b505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600f5481565b60006005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060048054610de290612f61565b80601f0160208091040260200160405190810160405280929190818152602001828054610e0e90612f61565b8015610e5b5780601f10610e3057610100808354040283529160200191610e5b565b820191906000526020600020905b815481529060010190602001808311610e3e57829003601f168201915b5050505050905090565b6000801b81565b600080610e7761160a565b90506000610e858286611016565b905083811015610eca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec19061326c565b60405180910390fd5b610ed78286868403611612565b60019250505092915050565b600080610eee61160a565b9050610efb818585611869565b600191505092915050565b600e60009054906101000a900460ff1681565b610f2282610818565b610f2b81611a6f565b610f358383611b64565b505050565b610f476000801b33610d68565b610f86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7d90613162565b60405180910390fd5b6064811115610fca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc1906132d8565b60405180910390fd5b81600e60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600f819055505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600e60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006110ef7ff0887ba65ee2024ea881d91b74c2450ef19e1557f03bed3ea9f16b037cbe2dc933610d68565b61112e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611125906130f6565b60405180910390fd5b6111388383611e74565b6001905092915050565b6060806060806111526006611fcb565b67ffffffffffffffff81111561116b5761116a612c0a565b5b6040519080825280602002602001820160405280156111995781602001602082028036833780820191505090505b50935060005b845181101561121c576111bc816006611fe090919063ffffffff16565b8582815181106111cf576111ce613182565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080611214906131b1565b91505061119f565b506112276008611fcb565b67ffffffffffffffff8111156112405761123f612c0a565b5b60405190808252806020026020018201604052801561126e5781602001602082028036833780820191505090505b50925060005b83518110156112f157611291816008611fe090919063ffffffff16565b8482815181106112a4576112a3613182565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080806112e9906131b1565b915050611274565b506112fc600a611fcb565b67ffffffffffffffff81111561131557611314612c0a565b5b6040519080825280602002602001820160405280156113435781602001602082028036833780820191505090505b50915060005b82518110156113c65761136681600a611fe090919063ffffffff16565b83828151811061137957611378613182565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080806113be906131b1565b915050611349565b506113d1600c611fcb565b67ffffffffffffffff8111156113ea576113e9612c0a565b5b6040519080825280602002602001820160405280156114185781602001602082028036833780820191505090505b50905060005b815181101561149b5761143b81600c611fe090919063ffffffff16565b82828151811061144e5761144d613182565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080611493906131b1565b91505061141e565b5090919293565b6114af6000801b33610d68565b6114ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e590613162565b60405180910390fd5b60005b82518110156115775781156115345761152e83828151811061151657611515613182565b5b60200260200101516006611e1490919063ffffffff16565b50611564565b61156283828151811061154a57611549613182565b5b60200260200101516006611e4490919063ffffffff16565b505b808061156f906131b1565b9150506114f1565b505050565b7ff0887ba65ee2024ea881d91b74c2450ef19e1557f03bed3ea9f16b037cbe2dc981565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611682576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116799061336a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e9906133fc565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516117d09190612a3a565b60405180910390a3505050565b60006117e98484611016565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146118635781811015611855576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184c90613468565b60405180910390fd5b6118628484848403611612565b5b50505050565b600e60009054906101000a900460ff166118b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118af906134d4565b60405180910390fd5b60008114156118d2576118cd83836000611ffa565b611a6a565b60006118e884600661227290919063ffffffff16565b80611903575061190283600661227290919063ffffffff16565b5b9050600061191b85600c61227290919063ffffffff16565b80611936575061193584600c61227290919063ffffffff16565b5b90506000828015611945575081155b61195057600061195a565b611959846122a2565b5b90506000818561196a91906134f4565b905060008211156119a3576119a287600e60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611ffa565b5b6119ae878783611ffa565b8315611a655760005b6119c16008611fcb565b811015611a63576119dc816008611fe090919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff1663fa57892f32338b8b8b886040518763ffffffff1660e01b8152600401611a1e96959493929190613528565b600060405180830381600087803b158015611a3857600080fd5b505af1158015611a4c573d6000803e3d6000fd5b505050508080611a5b906131b1565b9150506119b7565b505b505050505b505050565b611a8081611a7b61160a565b6122c5565b50565b611a8d8282610d68565b611b605760016005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611b0561160a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b611b6e8282610d68565b15611c425760006005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611be761160a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cad906135fb565b60405180910390fd5b611cc28260008361234a565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611d48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3f9061368d565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611dfb9190612a3a565b60405180910390a3611e0f8360008461234f565b505050565b6000611e3c836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612354565b905092915050565b6000611e6c836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6123c4565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ee4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edb906136f9565b60405180910390fd5b611ef06000838361234a565b8060026000828254611f029190613054565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611fb39190612a3a565b60405180910390a3611fc76000838361234f565b5050565b6000611fd9826000016124d8565b9050919050565b6000611fef83600001836124e9565b60001c905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561206a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120619061378b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d19061381d565b60405180910390fd5b6120e583838361234a565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561216b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612162906138af565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516122599190612a3a565b60405180910390a361226c84848461234f565b50505050565b600061229a836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612514565b905092915050565b60006064600f54836122b491906138cf565b6122be9190613958565b9050919050565b6122cf8282610d68565b612346576122dc81612537565b6122ea8360001c6020612564565b6040516020016122fb929190613a5d565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233d9190612908565b60405180910390fd5b5050565b505050565b505050565b60006123608383612514565b6123b95782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506123be565b600090505b92915050565b600080836001016000848152602001908152602001600020549050600081146124cc5760006001826123f691906134f4565b905060006001866000018054905061240e91906134f4565b905081811461247d57600086600001828154811061242f5761242e613182565b5b906000526020600020015490508087600001848154811061245357612452613182565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b8560000180548061249157612490613a97565b5b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506124d2565b60009150505b92915050565b600081600001805490509050919050565b600082600001828154811061250157612500613182565b5b9060005260206000200154905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b606061255d8273ffffffffffffffffffffffffffffffffffffffff16601460ff16612564565b9050919050565b60606000600283600261257791906138cf565b6125819190613054565b67ffffffffffffffff81111561259a57612599612c0a565b5b6040519080825280601f01601f1916602001820160405280156125cc5781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061260457612603613182565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061266857612667613182565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026126a891906138cf565b6126b29190613054565b90505b6001811115612752577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106126f4576126f3613182565b5b1a60f81b82828151811061270b5761270a613182565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061274b90613ac6565b90506126b5565b5060008414612796576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278d90613b3c565b60405180910390fd5b8091505092915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6127e9816127b4565b81146127f457600080fd5b50565b600081359050612806816127e0565b92915050565b600060208284031215612822576128216127aa565b5b6000612830848285016127f7565b91505092915050565b60008115159050919050565b61284e81612839565b82525050565b60006020820190506128696000830184612845565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156128a957808201518184015260208101905061288e565b838111156128b8576000848401525b50505050565b6000601f19601f8301169050919050565b60006128da8261286f565b6128e4818561287a565b93506128f481856020860161288b565b6128fd816128be565b840191505092915050565b6000602082019050818103600083015261292281846128cf565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006129558261292a565b9050919050565b6129658161294a565b811461297057600080fd5b50565b6000813590506129828161295c565b92915050565b6000819050919050565b61299b81612988565b81146129a657600080fd5b50565b6000813590506129b881612992565b92915050565b600080604083850312156129d5576129d46127aa565b5b60006129e385828601612973565b92505060206129f4858286016129a9565b9150509250929050565b600060208284031215612a1457612a136127aa565b5b6000612a2284828501612973565b91505092915050565b612a3481612988565b82525050565b6000602082019050612a4f6000830184612a2b565b92915050565b600080600060608486031215612a6e57612a6d6127aa565b5b6000612a7c86828701612973565b9350506020612a8d86828701612973565b9250506040612a9e868287016129a9565b9150509250925092565b6000819050919050565b612abb81612aa8565b8114612ac657600080fd5b50565b600081359050612ad881612ab2565b92915050565b600060208284031215612af457612af36127aa565b5b6000612b0284828501612ac9565b91505092915050565b612b1481612aa8565b82525050565b6000602082019050612b2f6000830184612b0b565b92915050565b60008060408385031215612b4c57612b4b6127aa565b5b6000612b5a85828601612ac9565b9250506020612b6b85828601612973565b9150509250929050565b600060ff82169050919050565b612b8b81612b75565b82525050565b6000602082019050612ba66000830184612b82565b92915050565b612bb581612839565b8114612bc057600080fd5b50565b600081359050612bd281612bac565b92915050565b600060208284031215612bee57612bed6127aa565b5b6000612bfc84828501612bc3565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612c42826128be565b810181811067ffffffffffffffff82111715612c6157612c60612c0a565b5b80604052505050565b6000612c746127a0565b9050612c808282612c39565b919050565b600067ffffffffffffffff821115612ca057612c9f612c0a565b5b602082029050602081019050919050565b600080fd5b6000612cc9612cc484612c85565b612c6a565b90508083825260208201905060208402830185811115612cec57612ceb612cb1565b5b835b81811015612d155780612d018882612973565b845260208401935050602081019050612cee565b5050509392505050565b600082601f830112612d3457612d33612c05565b5b8135612d44848260208601612cb6565b91505092915050565b60008060408385031215612d6457612d636127aa565b5b600083013567ffffffffffffffff811115612d8257612d816127af565b5b612d8e85828601612d1f565b9250506020612d9f85828601612bc3565b9150509250929050565b60008060408385031215612dc057612dbf6127aa565b5b6000612dce85828601612973565b9250506020612ddf85828601612973565b9150509250929050565b612df28161294a565b82525050565b6000602082019050612e0d6000830184612de9565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612e488161294a565b82525050565b6000612e5a8383612e3f565b60208301905092915050565b6000602082019050919050565b6000612e7e82612e13565b612e888185612e1e565b9350612e9383612e2f565b8060005b83811015612ec4578151612eab8882612e4e565b9750612eb683612e66565b925050600181019050612e97565b5085935050505092915050565b60006080820190508181036000830152612eeb8187612e73565b90508181036020830152612eff8186612e73565b90508181036040830152612f138185612e73565b90508181036060830152612f278184612e73565b905095945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612f7957607f821691505b60208210811415612f8d57612f8c612f32565b5b50919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000612fef602f8361287a565b9150612ffa82612f93565b604082019050919050565b6000602082019050818103600083015261301e81612fe2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061305f82612988565b915061306a83612988565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561309f5761309e613025565b5b828201905092915050565b7f43616c6c6572206973206e6f742061206d696e74657200000000000000000000600082015250565b60006130e060168361287a565b91506130eb826130aa565b602082019050919050565b6000602082019050818103600083015261310f816130d3565b9050919050565b7f43616c6c6572206973206e6f7420746865206f776e6572000000000000000000600082015250565b600061314c60178361287a565b915061315782613116565b602082019050919050565b6000602082019050818103600083015261317b8161313f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006131bc82612988565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156131ef576131ee613025565b5b600182019050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b600061325660258361287a565b9150613261826131fa565b604082019050919050565b6000602082019050818103600083015261328581613249565b9050919050565b7f5461782070657263656e74206d757374206265203c3d20313030000000000000600082015250565b60006132c2601a8361287a565b91506132cd8261328c565b602082019050919050565b600060208201905081810360008301526132f1816132b5565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061335460248361287a565b915061335f826132f8565b604082019050919050565b6000602082019050818103600083015261338381613347565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006133e660228361287a565b91506133f18261338a565b604082019050919050565b60006020820190508181036000830152613415816133d9565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000613452601d8361287a565b915061345d8261341c565b602082019050919050565b6000602082019050818103600083015261348181613445565b9050919050565b7f5472616e7366657273206172652064697361626c656400000000000000000000600082015250565b60006134be60168361287a565b91506134c982613488565b602082019050919050565b600060208201905081810360008301526134ed816134b1565b9050919050565b60006134ff82612988565b915061350a83612988565b92508282101561351d5761351c613025565b5b828203905092915050565b600060c08201905061353d6000830189612de9565b61354a6020830188612de9565b6135576040830187612de9565b6135646060830186612de9565b6135716080830185612a2b565b61357e60a0830184612a2b565b979650505050505050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006135e560218361287a565b91506135f082613589565b604082019050919050565b60006020820190508181036000830152613614816135d8565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b600061367760228361287a565b91506136828261361b565b604082019050919050565b600060208201905081810360008301526136a68161366a565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006136e3601f8361287a565b91506136ee826136ad565b602082019050919050565b60006020820190508181036000830152613712816136d6565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061377560258361287a565b915061378082613719565b604082019050919050565b600060208201905081810360008301526137a481613768565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061380760238361287a565b9150613812826137ab565b604082019050919050565b60006020820190508181036000830152613836816137fa565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600061389960268361287a565b91506138a48261383d565b604082019050919050565b600060208201905081810360008301526138c88161388c565b9050919050565b60006138da82612988565b91506138e583612988565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561391e5761391d613025565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061396382612988565b915061396e83612988565b92508261397e5761397d613929565b5b828204905092915050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b60006139ca601783613989565b91506139d582613994565b601782019050919050565b60006139eb8261286f565b6139f58185613989565b9350613a0581856020860161288b565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000613a47601183613989565b9150613a5282613a11565b601182019050919050565b6000613a68826139bd565b9150613a7482856139e0565b9150613a7f82613a3a565b9150613a8b82846139e0565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6000613ad182612988565b91506000821415613ae557613ae4613025565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000613b2660208361287a565b9150613b3182613af0565b602082019050919050565b60006020820190508181036000830152613b5581613b19565b905091905056fea26469706673582212203372a5bf0add906734ad6444342451a7dceba5dde12eef63bcf67899e7573a5864736f6c63430008090033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101f05760003560e01c806370a082311161010f578063d547741f116100a2578063ed35a8f911610071578063ed35a8f914610605578063f030a76314610635578063f836a69714610656578063fe6d812414610672576101f0565b8063d547741f1461057f578063d85d2e601461059b578063dd62ed3e146105b7578063e6ef73d6146105e7576101f0565b8063a217fddf116100de578063a217fddf146104e3578063a457c2d714610501578063a9059cbb14610531578063bef97c8714610561576101f0565b806370a08231146104475780637541f41c1461047757806391d148541461049557806395d89b41146104c5576101f0565b8063313ce567116101875780635a9d1c31116101565780635a9d1c31146103d75780635e3eb5ef146103f357806369fb78441461040f5780636fb3caee1461042b576101f0565b8063313ce5671461033d57806336568abe1461035b578063395093511461037757806356a3dbc2146103a7576101f0565b806318160ddd116101c357806318160ddd146102a357806323b872dd146102c1578063248a9ca3146102f15780632f2ff15d14610321576101f0565b806301ffc9a7146101f557806306fdde0314610225578063095ea7b3146102435780630c1936b914610273575b600080fd5b61020f600480360381019061020a919061280c565b610690565b60405161021c9190612854565b60405180910390f35b61022d61070a565b60405161023a9190612908565b60405180910390f35b61025d600480360381019061025891906129be565b61079c565b60405161026a9190612854565b60405180910390f35b61028d600480360381019061028891906129fe565b6107bf565b60405161029a9190612854565b60405180910390f35b6102ab6107df565b6040516102b89190612a3a565b60405180910390f35b6102db60048036038101906102d69190612a55565b6107e9565b6040516102e89190612854565b60405180910390f35b61030b60048036038101906103069190612ade565b610818565b6040516103189190612b1a565b60405180910390f35b61033b60048036038101906103369190612b35565b610838565b005b610345610859565b6040516103529190612b91565b60405180910390f35b61037560048036038101906103709190612b35565b610862565b005b610391600480360381019061038c91906129be565b6108e5565b60405161039e9190612854565b60405180910390f35b6103c160048036038101906103bc91906129be565b61091c565b6040516103ce9190612854565b60405180910390f35b6103f160048036038101906103ec9190612bd8565b61099b565b005b61040d60048036038101906104089190612d4d565b610a04565b005b61042960048036038101906104249190612d4d565b610ade565b005b61044560048036038101906104409190612d4d565b610c40565b005b610461600480360381019061045c91906129fe565b610d1a565b60405161046e9190612a3a565b60405180910390f35b61047f610d62565b60405161048c9190612a3a565b60405180910390f35b6104af60048036038101906104aa9190612b35565b610d68565b6040516104bc9190612854565b60405180910390f35b6104cd610dd3565b6040516104da9190612908565b60405180910390f35b6104eb610e65565b6040516104f89190612b1a565b60405180910390f35b61051b600480360381019061051691906129be565b610e6c565b6040516105289190612854565b60405180910390f35b61054b600480360381019061054691906129be565b610ee3565b6040516105589190612854565b60405180910390f35b610569610f06565b6040516105769190612854565b60405180910390f35b61059960048036038101906105949190612b35565b610f19565b005b6105b560048036038101906105b091906129be565b610f3a565b005b6105d160048036038101906105cc9190612da9565b611016565b6040516105de9190612a3a565b60405180910390f35b6105ef61109d565b6040516105fc9190612df8565b60405180910390f35b61061f600480360381019061061a91906129be565b6110c3565b60405161062c9190612854565b60405180910390f35b61063d611142565b60405161064d9493929190612ed1565b60405180910390f35b610670600480360381019061066b9190612d4d565b6114a2565b005b61067a61157c565b6040516106879190612b1a565b60405180910390f35b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107035750610702826115a0565b5b9050919050565b60606003805461071990612f61565b80601f016020809104026020016040519081016040528092919081815260200182805461074590612f61565b80156107925780601f1061076757610100808354040283529160200191610792565b820191906000526020600020905b81548152906001019060200180831161077557829003601f168201915b5050505050905090565b6000806107a761160a565b90506107b4818585611612565b600191505092915050565b60106020528060005260406000206000915054906101000a900460ff1681565b6000600254905090565b6000806107f461160a565b90506108018582856117dd565b61080c858585611869565b60019150509392505050565b600060056000838152602001908152602001600020600101549050919050565b61084182610818565b61084a81611a6f565b6108548383611a83565b505050565b60006012905090565b61086a61160a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146108d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ce90613005565b60405180910390fd5b6108e18282611b64565b5050565b6000806108f061160a565b90506109118185856109028589611016565b61090c9190613054565b611612565b600191505092915050565b60006109487ff0887ba65ee2024ea881d91b74c2450ef19e1557f03bed3ea9f16b037cbe2dc933610d68565b610987576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097e906130f6565b60405180910390fd5b6109918383611c46565b6001905092915050565b6109a86000801b33610d68565b6109e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109de90613162565b60405180910390fd5b80600e60006101000a81548160ff02191690831515021790555050565b610a116000801b33610d68565b610a50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4790613162565b60405180910390fd5b60005b8251811015610ad9578115610a9657610a90838281518110610a7857610a77613182565b5b6020026020010151600c611e1490919063ffffffff16565b50610ac6565b610ac4838281518110610aac57610aab613182565b5b6020026020010151600c611e4490919063ffffffff16565b505b8080610ad1906131b1565b915050610a53565b505050565b610aeb6000801b33610d68565b610b2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2190613162565b60405180910390fd5b60005b8251811015610c3b578115610bb457610b807ff0887ba65ee2024ea881d91b74c2450ef19e1557f03bed3ea9f16b037cbe2dc9848381518110610b7357610b72613182565b5b6020026020010151610838565b610bae838281518110610b9657610b95613182565b5b6020026020010151600a611e1490919063ffffffff16565b50610c28565b610bf87ff0887ba65ee2024ea881d91b74c2450ef19e1557f03bed3ea9f16b037cbe2dc9848381518110610beb57610bea613182565b5b6020026020010151610f19565b610c26838281518110610c0e57610c0d613182565b5b6020026020010151600a611e4490919063ffffffff16565b505b8080610c33906131b1565b915050610b2d565b505050565b610c4d6000801b33610d68565b610c8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8390613162565b60405180910390fd5b60005b8251811015610d15578115610cd257610ccc838281518110610cb457610cb3613182565b5b60200260200101516008611e1490919063ffffffff16565b50610d02565b610d00838281518110610ce857610ce7613182565b5b60200260200101516008611e4490919063ffffffff16565b505b8080610d0d906131b1565b915050610c8f565b505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600f5481565b60006005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060048054610de290612f61565b80601f0160208091040260200160405190810160405280929190818152602001828054610e0e90612f61565b8015610e5b5780601f10610e3057610100808354040283529160200191610e5b565b820191906000526020600020905b815481529060010190602001808311610e3e57829003601f168201915b5050505050905090565b6000801b81565b600080610e7761160a565b90506000610e858286611016565b905083811015610eca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec19061326c565b60405180910390fd5b610ed78286868403611612565b60019250505092915050565b600080610eee61160a565b9050610efb818585611869565b600191505092915050565b600e60009054906101000a900460ff1681565b610f2282610818565b610f2b81611a6f565b610f358383611b64565b505050565b610f476000801b33610d68565b610f86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7d90613162565b60405180910390fd5b6064811115610fca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc1906132d8565b60405180910390fd5b81600e60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600f819055505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600e60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006110ef7ff0887ba65ee2024ea881d91b74c2450ef19e1557f03bed3ea9f16b037cbe2dc933610d68565b61112e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611125906130f6565b60405180910390fd5b6111388383611e74565b6001905092915050565b6060806060806111526006611fcb565b67ffffffffffffffff81111561116b5761116a612c0a565b5b6040519080825280602002602001820160405280156111995781602001602082028036833780820191505090505b50935060005b845181101561121c576111bc816006611fe090919063ffffffff16565b8582815181106111cf576111ce613182565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080611214906131b1565b91505061119f565b506112276008611fcb565b67ffffffffffffffff8111156112405761123f612c0a565b5b60405190808252806020026020018201604052801561126e5781602001602082028036833780820191505090505b50925060005b83518110156112f157611291816008611fe090919063ffffffff16565b8482815181106112a4576112a3613182565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080806112e9906131b1565b915050611274565b506112fc600a611fcb565b67ffffffffffffffff81111561131557611314612c0a565b5b6040519080825280602002602001820160405280156113435781602001602082028036833780820191505090505b50915060005b82518110156113c65761136681600a611fe090919063ffffffff16565b83828151811061137957611378613182565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080806113be906131b1565b915050611349565b506113d1600c611fcb565b67ffffffffffffffff8111156113ea576113e9612c0a565b5b6040519080825280602002602001820160405280156114185781602001602082028036833780820191505090505b50905060005b815181101561149b5761143b81600c611fe090919063ffffffff16565b82828151811061144e5761144d613182565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080611493906131b1565b91505061141e565b5090919293565b6114af6000801b33610d68565b6114ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e590613162565b60405180910390fd5b60005b82518110156115775781156115345761152e83828151811061151657611515613182565b5b60200260200101516006611e1490919063ffffffff16565b50611564565b61156283828151811061154a57611549613182565b5b60200260200101516006611e4490919063ffffffff16565b505b808061156f906131b1565b9150506114f1565b505050565b7ff0887ba65ee2024ea881d91b74c2450ef19e1557f03bed3ea9f16b037cbe2dc981565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611682576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116799061336a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e9906133fc565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516117d09190612a3a565b60405180910390a3505050565b60006117e98484611016565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146118635781811015611855576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184c90613468565b60405180910390fd5b6118628484848403611612565b5b50505050565b600e60009054906101000a900460ff166118b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118af906134d4565b60405180910390fd5b60008114156118d2576118cd83836000611ffa565b611a6a565b60006118e884600661227290919063ffffffff16565b80611903575061190283600661227290919063ffffffff16565b5b9050600061191b85600c61227290919063ffffffff16565b80611936575061193584600c61227290919063ffffffff16565b5b90506000828015611945575081155b61195057600061195a565b611959846122a2565b5b90506000818561196a91906134f4565b905060008211156119a3576119a287600e60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611ffa565b5b6119ae878783611ffa565b8315611a655760005b6119c16008611fcb565b811015611a63576119dc816008611fe090919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff1663fa57892f32338b8b8b886040518763ffffffff1660e01b8152600401611a1e96959493929190613528565b600060405180830381600087803b158015611a3857600080fd5b505af1158015611a4c573d6000803e3d6000fd5b505050508080611a5b906131b1565b9150506119b7565b505b505050505b505050565b611a8081611a7b61160a565b6122c5565b50565b611a8d8282610d68565b611b605760016005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611b0561160a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b611b6e8282610d68565b15611c425760006005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611be761160a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cad906135fb565b60405180910390fd5b611cc28260008361234a565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611d48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3f9061368d565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611dfb9190612a3a565b60405180910390a3611e0f8360008461234f565b505050565b6000611e3c836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612354565b905092915050565b6000611e6c836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6123c4565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ee4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edb906136f9565b60405180910390fd5b611ef06000838361234a565b8060026000828254611f029190613054565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611fb39190612a3a565b60405180910390a3611fc76000838361234f565b5050565b6000611fd9826000016124d8565b9050919050565b6000611fef83600001836124e9565b60001c905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561206a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120619061378b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d19061381d565b60405180910390fd5b6120e583838361234a565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561216b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612162906138af565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516122599190612a3a565b60405180910390a361226c84848461234f565b50505050565b600061229a836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612514565b905092915050565b60006064600f54836122b491906138cf565b6122be9190613958565b9050919050565b6122cf8282610d68565b612346576122dc81612537565b6122ea8360001c6020612564565b6040516020016122fb929190613a5d565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233d9190612908565b60405180910390fd5b5050565b505050565b505050565b60006123608383612514565b6123b95782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506123be565b600090505b92915050565b600080836001016000848152602001908152602001600020549050600081146124cc5760006001826123f691906134f4565b905060006001866000018054905061240e91906134f4565b905081811461247d57600086600001828154811061242f5761242e613182565b5b906000526020600020015490508087600001848154811061245357612452613182565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b8560000180548061249157612490613a97565b5b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506124d2565b60009150505b92915050565b600081600001805490509050919050565b600082600001828154811061250157612500613182565b5b9060005260206000200154905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b606061255d8273ffffffffffffffffffffffffffffffffffffffff16601460ff16612564565b9050919050565b60606000600283600261257791906138cf565b6125819190613054565b67ffffffffffffffff81111561259a57612599612c0a565b5b6040519080825280601f01601f1916602001820160405280156125cc5781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061260457612603613182565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061266857612667613182565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026126a891906138cf565b6126b29190613054565b90505b6001811115612752577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106126f4576126f3613182565b5b1a60f81b82828151811061270b5761270a613182565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061274b90613ac6565b90506126b5565b5060008414612796576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278d90613b3c565b60405180910390fd5b8091505092915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6127e9816127b4565b81146127f457600080fd5b50565b600081359050612806816127e0565b92915050565b600060208284031215612822576128216127aa565b5b6000612830848285016127f7565b91505092915050565b60008115159050919050565b61284e81612839565b82525050565b60006020820190506128696000830184612845565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156128a957808201518184015260208101905061288e565b838111156128b8576000848401525b50505050565b6000601f19601f8301169050919050565b60006128da8261286f565b6128e4818561287a565b93506128f481856020860161288b565b6128fd816128be565b840191505092915050565b6000602082019050818103600083015261292281846128cf565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006129558261292a565b9050919050565b6129658161294a565b811461297057600080fd5b50565b6000813590506129828161295c565b92915050565b6000819050919050565b61299b81612988565b81146129a657600080fd5b50565b6000813590506129b881612992565b92915050565b600080604083850312156129d5576129d46127aa565b5b60006129e385828601612973565b92505060206129f4858286016129a9565b9150509250929050565b600060208284031215612a1457612a136127aa565b5b6000612a2284828501612973565b91505092915050565b612a3481612988565b82525050565b6000602082019050612a4f6000830184612a2b565b92915050565b600080600060608486031215612a6e57612a6d6127aa565b5b6000612a7c86828701612973565b9350506020612a8d86828701612973565b9250506040612a9e868287016129a9565b9150509250925092565b6000819050919050565b612abb81612aa8565b8114612ac657600080fd5b50565b600081359050612ad881612ab2565b92915050565b600060208284031215612af457612af36127aa565b5b6000612b0284828501612ac9565b91505092915050565b612b1481612aa8565b82525050565b6000602082019050612b2f6000830184612b0b565b92915050565b60008060408385031215612b4c57612b4b6127aa565b5b6000612b5a85828601612ac9565b9250506020612b6b85828601612973565b9150509250929050565b600060ff82169050919050565b612b8b81612b75565b82525050565b6000602082019050612ba66000830184612b82565b92915050565b612bb581612839565b8114612bc057600080fd5b50565b600081359050612bd281612bac565b92915050565b600060208284031215612bee57612bed6127aa565b5b6000612bfc84828501612bc3565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612c42826128be565b810181811067ffffffffffffffff82111715612c6157612c60612c0a565b5b80604052505050565b6000612c746127a0565b9050612c808282612c39565b919050565b600067ffffffffffffffff821115612ca057612c9f612c0a565b5b602082029050602081019050919050565b600080fd5b6000612cc9612cc484612c85565b612c6a565b90508083825260208201905060208402830185811115612cec57612ceb612cb1565b5b835b81811015612d155780612d018882612973565b845260208401935050602081019050612cee565b5050509392505050565b600082601f830112612d3457612d33612c05565b5b8135612d44848260208601612cb6565b91505092915050565b60008060408385031215612d6457612d636127aa565b5b600083013567ffffffffffffffff811115612d8257612d816127af565b5b612d8e85828601612d1f565b9250506020612d9f85828601612bc3565b9150509250929050565b60008060408385031215612dc057612dbf6127aa565b5b6000612dce85828601612973565b9250506020612ddf85828601612973565b9150509250929050565b612df28161294a565b82525050565b6000602082019050612e0d6000830184612de9565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612e488161294a565b82525050565b6000612e5a8383612e3f565b60208301905092915050565b6000602082019050919050565b6000612e7e82612e13565b612e888185612e1e565b9350612e9383612e2f565b8060005b83811015612ec4578151612eab8882612e4e565b9750612eb683612e66565b925050600181019050612e97565b5085935050505092915050565b60006080820190508181036000830152612eeb8187612e73565b90508181036020830152612eff8186612e73565b90508181036040830152612f138185612e73565b90508181036060830152612f278184612e73565b905095945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612f7957607f821691505b60208210811415612f8d57612f8c612f32565b5b50919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000612fef602f8361287a565b9150612ffa82612f93565b604082019050919050565b6000602082019050818103600083015261301e81612fe2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061305f82612988565b915061306a83612988565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561309f5761309e613025565b5b828201905092915050565b7f43616c6c6572206973206e6f742061206d696e74657200000000000000000000600082015250565b60006130e060168361287a565b91506130eb826130aa565b602082019050919050565b6000602082019050818103600083015261310f816130d3565b9050919050565b7f43616c6c6572206973206e6f7420746865206f776e6572000000000000000000600082015250565b600061314c60178361287a565b915061315782613116565b602082019050919050565b6000602082019050818103600083015261317b8161313f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006131bc82612988565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156131ef576131ee613025565b5b600182019050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b600061325660258361287a565b9150613261826131fa565b604082019050919050565b6000602082019050818103600083015261328581613249565b9050919050565b7f5461782070657263656e74206d757374206265203c3d20313030000000000000600082015250565b60006132c2601a8361287a565b91506132cd8261328c565b602082019050919050565b600060208201905081810360008301526132f1816132b5565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061335460248361287a565b915061335f826132f8565b604082019050919050565b6000602082019050818103600083015261338381613347565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006133e660228361287a565b91506133f18261338a565b604082019050919050565b60006020820190508181036000830152613415816133d9565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000613452601d8361287a565b915061345d8261341c565b602082019050919050565b6000602082019050818103600083015261348181613445565b9050919050565b7f5472616e7366657273206172652064697361626c656400000000000000000000600082015250565b60006134be60168361287a565b91506134c982613488565b602082019050919050565b600060208201905081810360008301526134ed816134b1565b9050919050565b60006134ff82612988565b915061350a83612988565b92508282101561351d5761351c613025565b5b828203905092915050565b600060c08201905061353d6000830189612de9565b61354a6020830188612de9565b6135576040830187612de9565b6135646060830186612de9565b6135716080830185612a2b565b61357e60a0830184612a2b565b979650505050505050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006135e560218361287a565b91506135f082613589565b604082019050919050565b60006020820190508181036000830152613614816135d8565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b600061367760228361287a565b91506136828261361b565b604082019050919050565b600060208201905081810360008301526136a68161366a565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006136e3601f8361287a565b91506136ee826136ad565b602082019050919050565b60006020820190508181036000830152613712816136d6565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061377560258361287a565b915061378082613719565b604082019050919050565b600060208201905081810360008301526137a481613768565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061380760238361287a565b9150613812826137ab565b604082019050919050565b60006020820190508181036000830152613836816137fa565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600061389960268361287a565b91506138a48261383d565b604082019050919050565b600060208201905081810360008301526138c88161388c565b9050919050565b60006138da82612988565b91506138e583612988565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561391e5761391d613025565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061396382612988565b915061396e83612988565b92508261397e5761397d613929565b5b828204905092915050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b60006139ca601783613989565b91506139d582613994565b601782019050919050565b60006139eb8261286f565b6139f58185613989565b9350613a0581856020860161288b565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000613a47601183613989565b9150613a5282613a11565b601182019050919050565b6000613a68826139bd565b9150613a7482856139e0565b9150613a7f82613a3a565b9150613a8b82846139e0565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6000613ad182612988565b91506000821415613ae557613ae4613025565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000613b2660208361287a565b9150613b3182613af0565b602082019050919050565b60006020820190508181036000830152613b5581613b19565b905091905056fea26469706673582212203372a5bf0add906734ad6444342451a7dceba5dde12eef63bcf67899e7573a5864736f6c63430008090033

Deployed Bytecode Sourcemap

58412:5082:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52464:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35658:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38009:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58897:45;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36778:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38790:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54287:131;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54728:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36620:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55872:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39494:238;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63214:146;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62083:103;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60491:343;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60045:441;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59374:322;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36949:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58865:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52760:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35877:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51865:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40235:436;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37282:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58790:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55168:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61844:231;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37538:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58832:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63064:142;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60839:997;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;59704:336;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58518:52;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52464:204;52549:4;52588:32;52573:47;;;:11;:47;;;;:87;;;;52624:36;52648:11;52624:23;:36::i;:::-;52573:87;52566:94;;52464:204;;;:::o;35658:100::-;35712:13;35745:5;35738:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35658:100;:::o;38009:201::-;38092:4;38109:13;38125:12;:10;:12::i;:::-;38109:28;;38148:32;38157:5;38164:7;38173:6;38148:8;:32::i;:::-;38198:4;38191:11;;;38009:201;;;;:::o;58897:45::-;;;;;;;;;;;;;;;;;;;;;;:::o;36778:108::-;36839:7;36866:12;;36859:19;;36778:108;:::o;38790:295::-;38921:4;38938:15;38956:12;:10;:12::i;:::-;38938:30;;38979:38;38995:4;39001:7;39010:6;38979:15;:38::i;:::-;39028:27;39038:4;39044:2;39048:6;39028:9;:27::i;:::-;39073:4;39066:11;;;38790:295;;;;;:::o;54287:131::-;54361:7;54388:6;:12;54395:4;54388:12;;;;;;;;;;;:22;;;54381:29;;54287:131;;;:::o;54728:147::-;54811:18;54824:4;54811:12;:18::i;:::-;52356:16;52367:4;52356:10;:16::i;:::-;54842:25:::1;54853:4;54859:7;54842:10;:25::i;:::-;54728:147:::0;;;:::o;36620:93::-;36678:5;36703:2;36696:9;;36620:93;:::o;55872:218::-;55979:12;:10;:12::i;:::-;55968:23;;:7;:23;;;55960:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;56056:26;56068:4;56074:7;56056:11;:26::i;:::-;55872:218;;:::o;39494:238::-;39582:4;39599:13;39615:12;:10;:12::i;:::-;39599:28;;39638:64;39647:5;39654:7;39691:10;39663:25;39673:5;39680:7;39663:9;:25::i;:::-;:38;;;;:::i;:::-;39638:8;:64::i;:::-;39720:4;39713:11;;;39494:238;;;;:::o;63214:146::-;63294:4;59099:27;58551:19;59115:10;59099:7;:27::i;:::-;59091:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;63311:19:::1;63317:4;63323:6;63311:5;:19::i;:::-;63348:4;63341:11;;63214:146:::0;;;;:::o;62083:103::-;58983:39;51910:4;58991:18;;59011:10;58983:7;:39::i;:::-;58975:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;62171:7:::1;62152:16;;:26;;;;;;;;;;;;;;;;;;62083:103:::0;:::o;60491:343::-;58983:39;51910:4;58991:18;;59011:10;58983:7;:39::i;:::-;58975:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;60596:9:::1;60591:239;60615:17;:24;60611:1;:28;60591:239;;;60659:8;60655:170;;;60685:42;60706:17;60724:1;60706:20;;;;;;;;:::i;:::-;;;;;;;;60685:16;:20;;:42;;;;:::i;:::-;;60655:170;;;60767:45;60791:17;60809:1;60791:20;;;;;;;;:::i;:::-;;;;;;;;60767:16;:23;;:45;;;;:::i;:::-;;60655:170;60641:3;;;;;:::i;:::-;;;;60591:239;;;;60491:343:::0;;:::o;60045:441::-;58983:39;51910:4;58991:18;;59011:10;58983:7;:39::i;:::-;58975:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;60151:9:::1;60146:333;60170:16;:23;60166:1;:27;60146:333;;;60216:7;60212:262;;;60241:38;58551:19;60259:16;60276:1;60259:19;;;;;;;;:::i;:::-;;;;;;;;60241:9;:38::i;:::-;60286:40;60306:16;60323:1;60306:19;;;;;;;;:::i;:::-;;;;;;;;60286:15;:19;;:40;;;;:::i;:::-;;60212:262;;;60372:39;58551:19;60391:16;60408:1;60391:19;;;;;;;;:::i;:::-;;;;;;;;60372:10;:39::i;:::-;60418:43;60441:16;60458:1;60441:19;;;;;;;;:::i;:::-;;;;;;;;60418:15;:22;;:43;;;;:::i;:::-;;60212:262;60195:3;;;;;:::i;:::-;;;;60146:333;;;;60045:441:::0;;:::o;59374:322::-;58983:39;51910:4;58991:18;;59011:10;58983:7;:39::i;:::-;58975:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;59475:9:::1;59470:222;59494:14;:21;59490:1;:25;59470:222;;;59538:3;59534:153;;;59559:36;59577:14;59592:1;59577:17;;;;;;;;:::i;:::-;;;;;;;;59559:13;:17;;:36;;;;:::i;:::-;;59534:153;;;59635:39;59656:14;59671:1;59656:17;;;;;;;;:::i;:::-;;;;;;;;59635:13;:20;;:39;;;;:::i;:::-;;59534:153;59517:3;;;;;:::i;:::-;;;;59470:222;;;;59374:322:::0;;:::o;36949:127::-;37023:7;37050:9;:18;37060:7;37050:18;;;;;;;;;;;;;;;;37043:25;;36949:127;;;:::o;58865:25::-;;;;:::o;52760:147::-;52846:4;52870:6;:12;52877:4;52870:12;;;;;;;;;;;:20;;:29;52891:7;52870:29;;;;;;;;;;;;;;;;;;;;;;;;;52863:36;;52760:147;;;;:::o;35877:104::-;35933:13;35966:7;35959:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35877:104;:::o;51865:49::-;51910:4;51865:49;;;:::o;40235:436::-;40328:4;40345:13;40361:12;:10;:12::i;:::-;40345:28;;40384:24;40411:25;40421:5;40428:7;40411:9;:25::i;:::-;40384:52;;40475:15;40455:16;:35;;40447:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;40568:60;40577:5;40584:7;40612:15;40593:16;:34;40568:8;:60::i;:::-;40659:4;40652:11;;;;40235:436;;;;:::o;37282:193::-;37361:4;37378:13;37394:12;:10;:12::i;:::-;37378:28;;37417;37427:5;37434:2;37438:6;37417:9;:28::i;:::-;37463:4;37456:11;;;37282:193;;;;:::o;58790:35::-;;;;;;;;;;;;;:::o;55168:149::-;55252:18;55265:4;55252:12;:18::i;:::-;52356:16;52367:4;52356:10;:16::i;:::-;55283:26:::1;55295:4;55301:7;55283:11;:26::i;:::-;55168:149:::0;;;:::o;61844:231::-;58983:39;51910:4;58991:18;;59011:10;58983:7;:39::i;:::-;58975:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;61961:3:::1;61946:11;:18;;61938:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;62020:12;62006:11;;:26;;;;;;;;;;;;;;;;;;62056:11;62043:10;:24;;;;61844:231:::0;;:::o;37538:151::-;37627:7;37654:11;:18;37666:5;37654:18;;;;;;;;;;;;;;;:27;37673:7;37654:27;;;;;;;;;;;;;;;;37647:34;;37538:151;;;;:::o;58832:26::-;;;;;;;;;;;;;:::o;63064:142::-;63142:4;59099:27;58551:19;59115:10;59099:7;:27::i;:::-;59091:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;63159:17:::1;63165:2;63169:6;63159:5;:17::i;:::-;63194:4;63187:11;;63064:142:::0;;;;:::o;60839:997::-;60892:35;60932:33;60970:35;61010:36;61091:24;:15;:22;:24::i;:::-;61077:39;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61056:60;;61129:9;61124:122;61148:18;:25;61144:1;:29;61124:122;;;61216:21;61235:1;61216:15;:18;;:21;;;;:::i;:::-;61192:18;61211:1;61192:21;;;;;;;;:::i;:::-;;;;;;;:45;;;;;;;;;;;61175:3;;;;;:::i;:::-;;;;61124:122;;;;61286:22;:13;:20;:22::i;:::-;61272:37;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61253:56;;61322:9;61317:116;61341:16;:23;61337:1;:27;61317:116;;;61405:19;61422:1;61405:13;:16;;:19;;;;:::i;:::-;61383:16;61400:1;61383:19;;;;;;;;:::i;:::-;;;;;;;:41;;;;;;;;;;;61366:3;;;;;:::i;:::-;;;;61317:116;;;;61475:24;:15;:22;:24::i;:::-;61461:39;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61440:60;;61513:9;61508:122;61532:18;:25;61528:1;:29;61508:122;;;61600:21;61619:1;61600:15;:18;;:21;;;;:::i;:::-;61576:18;61595:1;61576:21;;;;;;;;:::i;:::-;;;;;;;:45;;;;;;;;;;;61559:3;;;;;:::i;:::-;;;;61508:122;;;;61673:25;:16;:23;:25::i;:::-;61659:40;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61637:62;;61712:9;61707:125;61731:19;:26;61727:1;:30;61707:125;;;61801:22;61821:1;61801:16;:19;;:22;;;;:::i;:::-;61776:19;61796:1;61776:22;;;;;;;;:::i;:::-;;;;;;;:47;;;;;;;;;;;61759:3;;;;;:::i;:::-;;;;61707:125;;;;60839:997;;;;:::o;59704:336::-;58983:39;51910:4;58991:18;;59011:10;58983:7;:39::i;:::-;58975:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;59809:9:::1;59804:232;59828:16;:23;59824:1;:27;59804:232;;;59874:3;59870:161;;;59895:40;59915:16;59932:1;59915:19;;;;;;;;:::i;:::-;;;;;;;;59895:15;:19;;:40;;;;:::i;:::-;;59870:161;;;59975:43;59998:16;60015:1;59998:19;;;;;;;;:::i;:::-;;;;;;;;59975:15;:22;;:43;;;;:::i;:::-;;59870:161;59853:3;;;;;:::i;:::-;;;;59804:232;;;;59704:336:::0;;:::o;58518:52::-;58551:19;58518:52;:::o;17258:157::-;17343:4;17382:25;17367:40;;;:11;:40;;;;17360:47;;17258:157;;;:::o;33300:98::-;33353:7;33380:10;33373:17;;33300:98;:::o;44262:380::-;44415:1;44398:19;;:5;:19;;;;44390:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44496:1;44477:21;;:7;:21;;;;44469:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44580:6;44550:11;:18;44562:5;44550:18;;;;;;;;;;;;;;;:27;44569:7;44550:27;;;;;;;;;;;;;;;:36;;;;44618:7;44602:32;;44611:5;44602:32;;;44627:6;44602:32;;;;;;:::i;:::-;;;;;;;;44262:380;;;:::o;44933:453::-;45068:24;45095:25;45105:5;45112:7;45095:9;:25::i;:::-;45068:52;;45155:17;45135:16;:37;45131:248;;45217:6;45197:16;:26;;45189:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45301:51;45310:5;45317:7;45345:6;45326:16;:25;45301:8;:51::i;:::-;45131:248;45057:329;44933:453;;;:::o;62194:862::-;62292:16;;;;;;;;;;;62284:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;62357:1;62347:6;:11;62343:84;;;62372:28;62388:4;62394:2;62398:1;62372:15;:28::i;:::-;62412:7;;62343:84;62434:13;62450:30;62475:4;62450:15;:24;;:30;;;;:::i;:::-;:62;;;;62484:28;62509:2;62484:15;:24;;:28;;;;:::i;:::-;62450:62;62434:78;;62520:18;62541:31;62567:4;62541:16;:25;;:31;;;;:::i;:::-;:64;;;;62576:29;62602:2;62576:16;:25;;:29;;;;:::i;:::-;62541:64;62520:85;;62613:12;62628:8;:26;;;;;62641:13;62640:14;62628:26;:53;;62680:1;62628:53;;;62657:20;62670:6;62657:12;:20::i;:::-;62628:53;62613:68;;62689:17;62718:4;62709:6;:13;;;;:::i;:::-;62689:33;;62741:1;62734:4;:8;62730:75;;;62756:40;62772:4;62778:11;;;;;;;;;;;62791:4;62756:15;:40::i;:::-;62730:75;62812:36;62828:4;62834:2;62838:9;62812:15;:36::i;:::-;62860:8;62856:196;;;62887:9;62882:162;62906:22;:13;:20;:22::i;:::-;62902:1;:26;62882:162;;;62954:19;62971:1;62954:13;:16;;:19;;;;:::i;:::-;62948:31;;;62980:9;62991:10;63003:4;63009:2;63013:6;63021:9;62948:83;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62930:3;;;;;:::i;:::-;;;;62882:162;;;;62856:196;62273:783;;;;62194:862;;;;:::o;53211:105::-;53278:30;53289:4;53295:12;:10;:12::i;:::-;53278:10;:30::i;:::-;53211:105;:::o;57469:238::-;57553:22;57561:4;57567:7;57553;:22::i;:::-;57548:152;;57624:4;57592:6;:12;57599:4;57592:12;;;;;;;;;;;:20;;:29;57613:7;57592:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;57675:12;:10;:12::i;:::-;57648:40;;57666:7;57648:40;;57660:4;57648:40;;;;;;;;;;57548:152;57469:238;;:::o;57887:239::-;57971:22;57979:4;57985:7;57971;:22::i;:::-;57967:152;;;58042:5;58010:6;:12;58017:4;58010:12;;;;;;;;;;;:20;;:29;58031:7;58010:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;58094:12;:10;:12::i;:::-;58067:40;;58085:7;58067:40;;58079:4;58067:40;;;;;;;;;;57967:152;57887:239;;:::o;43149:675::-;43252:1;43233:21;;:7;:21;;;;43225:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;43305:49;43326:7;43343:1;43347:6;43305:20;:49::i;:::-;43367:22;43392:9;:18;43402:7;43392:18;;;;;;;;;;;;;;;;43367:43;;43447:6;43429:14;:24;;43421:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;43566:6;43549:14;:23;43528:9;:18;43538:7;43528:18;;;;;;;;;;;;;;;:44;;;;43683:6;43667:12;;:22;;;;;;;;;;;43744:1;43718:37;;43727:7;43718:37;;;43748:6;43718:37;;;;;;:::i;:::-;;;;;;;;43768:48;43788:7;43805:1;43809:6;43768:19;:48::i;:::-;43214:610;43149:675;;:::o;7069:152::-;7139:4;7163:50;7168:3;:10;;7204:5;7188:23;;7180:32;;7163:4;:50::i;:::-;7156:57;;7069:152;;;;:::o;7397:158::-;7470:4;7494:53;7502:3;:10;;7538:5;7522:23;;7514:32;;7494:7;:53::i;:::-;7487:60;;7397:158;;;;:::o;42268:548::-;42371:1;42352:21;;:7;:21;;;;42344:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;42422:49;42451:1;42455:7;42464:6;42422:20;:49::i;:::-;42500:6;42484:12;;:22;;;;;;;:::i;:::-;;;;;;;;42677:6;42655:9;:18;42665:7;42655:18;;;;;;;;;;;;;;;;:28;;;;;;;;;;;42731:7;42710:37;;42727:1;42710:37;;;42740:6;42710:37;;;;;;:::i;:::-;;;;;;;;42760:48;42788:1;42792:7;42801:6;42760:19;:48::i;:::-;42268:548;;:::o;7894:117::-;7957:7;7984:19;7992:3;:10;;7984:7;:19::i;:::-;7977:26;;7894:117;;;:::o;8365:158::-;8439:7;8490:22;8494:3;:10;;8506:5;8490:3;:22::i;:::-;8482:31;;8459:56;;8365:158;;;;:::o;41141:840::-;41288:1;41272:18;;:4;:18;;;;41264:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41365:1;41351:16;;:2;:16;;;;41343:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;41420:38;41441:4;41447:2;41451:6;41420:20;:38::i;:::-;41471:19;41493:9;:15;41503:4;41493:15;;;;;;;;;;;;;;;;41471:37;;41542:6;41527:11;:21;;41519:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;41659:6;41645:11;:20;41627:9;:15;41637:4;41627:15;;;;;;;;;;;;;;;:38;;;;41862:6;41845:9;:13;41855:2;41845:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;41912:2;41897:26;;41906:4;41897:26;;;41916:6;41897:26;;;;;;:::i;:::-;;;;;;;;41936:37;41956:4;41962:2;41966:6;41936:19;:37::i;:::-;41253:728;41141:840;;;:::o;7641:167::-;7721:4;7745:55;7755:3;:10;;7791:5;7775:23;;7767:32;;7745:9;:55::i;:::-;7738:62;;7641:167;;;;:::o;63368:123::-;63429:7;63480:3;63466:10;;63457:6;:19;;;;:::i;:::-;63456:27;;;;:::i;:::-;63449:34;;63368:123;;;:::o;53606:492::-;53695:22;53703:4;53709:7;53695;:22::i;:::-;53690:401;;53883:28;53903:7;53883:19;:28::i;:::-;53984:38;54012:4;54004:13;;54019:2;53984:19;:38::i;:::-;53788:257;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53734:345;;;;;;;;;;;:::i;:::-;;;;;;;;53690:401;53606:492;;:::o;45986:125::-;;;;:::o;46715:124::-;;;;:::o;800:414::-;863:4;885:21;895:3;900:5;885:9;:21::i;:::-;880:327;;923:3;:11;;940:5;923:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1106:3;:11;;:18;;;;1084:3;:12;;:19;1097:5;1084:19;;;;;;;;;;;:40;;;;1146:4;1139:11;;;;880:327;1190:5;1183:12;;800:414;;;;;:::o;1390:1420::-;1456:4;1574:18;1595:3;:12;;:19;1608:5;1595:19;;;;;;;;;;;;1574:40;;1645:1;1631:10;:15;1627:1176;;2006:21;2043:1;2030:10;:14;;;;:::i;:::-;2006:38;;2059:17;2100:1;2079:3;:11;;:18;;;;:22;;;;:::i;:::-;2059:42;;2135:13;2122:9;:26;2118:405;;2169:17;2189:3;:11;;2201:9;2189:22;;;;;;;;:::i;:::-;;;;;;;;;;2169:42;;2343:9;2314:3;:11;;2326:13;2314:26;;;;;;;;:::i;:::-;;;;;;;;;:38;;;;2454:10;2428:3;:12;;:23;2441:9;2428:23;;;;;;;;;;;:36;;;;2150:373;2118:405;2604:3;:11;;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2699:3;:12;;:19;2712:5;2699:19;;;;;;;;;;;2692:26;;;2742:4;2735:11;;;;;;;1627:1176;2786:5;2779:12;;;1390:1420;;;;;:::o;3111:109::-;3167:7;3194:3;:11;;:18;;;;3187:25;;3111:109;;;:::o;3574:120::-;3641:7;3668:3;:11;;3680:5;3668:18;;;;;;;;:::i;:::-;;;;;;;;;;3661:25;;3574:120;;;;:::o;2896:129::-;2969:4;3016:1;2993:3;:12;;:19;3006:5;2993:19;;;;;;;;;;;;:24;;2986:31;;2896:129;;;;:::o;32463:151::-;32521:13;32554:52;32582:4;32566:22;;30618:2;32554:52;;:11;:52::i;:::-;32547:59;;32463:151;;;:::o;31859:447::-;31934:13;31960:19;32005:1;31996:6;31992:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;31982:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31960:47;;32018:15;:6;32025:1;32018:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;32044;:6;32051:1;32044:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;32075:9;32100:1;32091:6;32087:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;32075:26;;32070:131;32107:1;32103;:5;32070:131;;;32142:8;32159:3;32151:5;:11;32142:21;;;;;;;:::i;:::-;;;;;32130:6;32137:1;32130:9;;;;;;;;:::i;:::-;;;;;:33;;;;;;;;;;;32188:1;32178:11;;;;;32110:3;;;;:::i;:::-;;;32070:131;;;;32228:1;32219:5;:10;32211:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;32291:6;32277:21;;;31859:447;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:126::-;2945:7;2985:42;2978:5;2974:54;2963:65;;2908:126;;;:::o;3040:96::-;3077:7;3106:24;3124:5;3106:24;:::i;:::-;3095:35;;3040:96;;;:::o;3142:122::-;3215:24;3233:5;3215:24;:::i;:::-;3208:5;3205:35;3195:63;;3254:1;3251;3244:12;3195:63;3142:122;:::o;3270:139::-;3316:5;3354:6;3341:20;3332:29;;3370:33;3397:5;3370:33;:::i;:::-;3270:139;;;;:::o;3415:77::-;3452:7;3481:5;3470:16;;3415:77;;;:::o;3498:122::-;3571:24;3589:5;3571:24;:::i;:::-;3564:5;3561:35;3551:63;;3610:1;3607;3600:12;3551:63;3498:122;:::o;3626:139::-;3672:5;3710:6;3697:20;3688:29;;3726:33;3753:5;3726:33;:::i;:::-;3626:139;;;;:::o;3771:474::-;3839:6;3847;3896:2;3884:9;3875:7;3871:23;3867:32;3864:119;;;3902:79;;:::i;:::-;3864:119;4022:1;4047:53;4092:7;4083:6;4072:9;4068:22;4047:53;:::i;:::-;4037:63;;3993:117;4149:2;4175:53;4220:7;4211:6;4200:9;4196:22;4175:53;:::i;:::-;4165:63;;4120:118;3771:474;;;;;:::o;4251:329::-;4310:6;4359:2;4347:9;4338:7;4334:23;4330:32;4327:119;;;4365:79;;:::i;:::-;4327:119;4485:1;4510:53;4555:7;4546:6;4535:9;4531:22;4510:53;:::i;:::-;4500:63;;4456:117;4251:329;;;;:::o;4586:118::-;4673:24;4691:5;4673:24;:::i;:::-;4668:3;4661:37;4586:118;;:::o;4710:222::-;4803:4;4841:2;4830:9;4826:18;4818:26;;4854:71;4922:1;4911:9;4907:17;4898:6;4854:71;:::i;:::-;4710:222;;;;:::o;4938:619::-;5015:6;5023;5031;5080:2;5068:9;5059:7;5055:23;5051:32;5048:119;;;5086:79;;:::i;:::-;5048:119;5206:1;5231:53;5276:7;5267:6;5256:9;5252:22;5231:53;:::i;:::-;5221:63;;5177:117;5333:2;5359:53;5404:7;5395:6;5384:9;5380:22;5359:53;:::i;:::-;5349:63;;5304:118;5461:2;5487:53;5532:7;5523:6;5512:9;5508:22;5487:53;:::i;:::-;5477:63;;5432:118;4938:619;;;;;:::o;5563:77::-;5600:7;5629:5;5618:16;;5563:77;;;:::o;5646:122::-;5719:24;5737:5;5719:24;:::i;:::-;5712:5;5709:35;5699:63;;5758:1;5755;5748:12;5699:63;5646:122;:::o;5774:139::-;5820:5;5858:6;5845:20;5836:29;;5874:33;5901:5;5874:33;:::i;:::-;5774:139;;;;:::o;5919:329::-;5978:6;6027:2;6015:9;6006:7;6002:23;5998:32;5995:119;;;6033:79;;:::i;:::-;5995:119;6153:1;6178:53;6223:7;6214:6;6203:9;6199:22;6178:53;:::i;:::-;6168:63;;6124:117;5919:329;;;;:::o;6254:118::-;6341:24;6359:5;6341:24;:::i;:::-;6336:3;6329:37;6254:118;;:::o;6378:222::-;6471:4;6509:2;6498:9;6494:18;6486:26;;6522:71;6590:1;6579:9;6575:17;6566:6;6522:71;:::i;:::-;6378:222;;;;:::o;6606:474::-;6674:6;6682;6731:2;6719:9;6710:7;6706:23;6702:32;6699:119;;;6737:79;;:::i;:::-;6699:119;6857:1;6882:53;6927:7;6918:6;6907:9;6903:22;6882:53;:::i;:::-;6872:63;;6828:117;6984:2;7010:53;7055:7;7046:6;7035:9;7031:22;7010:53;:::i;:::-;7000:63;;6955:118;6606:474;;;;;:::o;7086:86::-;7121:7;7161:4;7154:5;7150:16;7139:27;;7086:86;;;:::o;7178:112::-;7261:22;7277:5;7261:22;:::i;:::-;7256:3;7249:35;7178:112;;:::o;7296:214::-;7385:4;7423:2;7412:9;7408:18;7400:26;;7436:67;7500:1;7489:9;7485:17;7476:6;7436:67;:::i;:::-;7296:214;;;;:::o;7516:116::-;7586:21;7601:5;7586:21;:::i;:::-;7579:5;7576:32;7566:60;;7622:1;7619;7612:12;7566:60;7516:116;:::o;7638:133::-;7681:5;7719:6;7706:20;7697:29;;7735:30;7759:5;7735:30;:::i;:::-;7638:133;;;;:::o;7777:323::-;7833:6;7882:2;7870:9;7861:7;7857:23;7853:32;7850:119;;;7888:79;;:::i;:::-;7850:119;8008:1;8033:50;8075:7;8066:6;8055:9;8051:22;8033:50;:::i;:::-;8023:60;;7979:114;7777:323;;;;:::o;8106:117::-;8215:1;8212;8205:12;8229:180;8277:77;8274:1;8267:88;8374:4;8371:1;8364:15;8398:4;8395:1;8388:15;8415:281;8498:27;8520:4;8498:27;:::i;:::-;8490:6;8486:40;8628:6;8616:10;8613:22;8592:18;8580:10;8577:34;8574:62;8571:88;;;8639:18;;:::i;:::-;8571:88;8679:10;8675:2;8668:22;8458:238;8415:281;;:::o;8702:129::-;8736:6;8763:20;;:::i;:::-;8753:30;;8792:33;8820:4;8812:6;8792:33;:::i;:::-;8702:129;;;:::o;8837:311::-;8914:4;9004:18;8996:6;8993:30;8990:56;;;9026:18;;:::i;:::-;8990:56;9076:4;9068:6;9064:17;9056:25;;9136:4;9130;9126:15;9118:23;;8837:311;;;:::o;9154:117::-;9263:1;9260;9253:12;9294:710;9390:5;9415:81;9431:64;9488:6;9431:64;:::i;:::-;9415:81;:::i;:::-;9406:90;;9516:5;9545:6;9538:5;9531:21;9579:4;9572:5;9568:16;9561:23;;9632:4;9624:6;9620:17;9612:6;9608:30;9661:3;9653:6;9650:15;9647:122;;;9680:79;;:::i;:::-;9647:122;9795:6;9778:220;9812:6;9807:3;9804:15;9778:220;;;9887:3;9916:37;9949:3;9937:10;9916:37;:::i;:::-;9911:3;9904:50;9983:4;9978:3;9974:14;9967:21;;9854:144;9838:4;9833:3;9829:14;9822:21;;9778:220;;;9782:21;9396:608;;9294:710;;;;;:::o;10027:370::-;10098:5;10147:3;10140:4;10132:6;10128:17;10124:27;10114:122;;10155:79;;:::i;:::-;10114:122;10272:6;10259:20;10297:94;10387:3;10379:6;10372:4;10364:6;10360:17;10297:94;:::i;:::-;10288:103;;10104:293;10027:370;;;;:::o;10403:678::-;10493:6;10501;10550:2;10538:9;10529:7;10525:23;10521:32;10518:119;;;10556:79;;:::i;:::-;10518:119;10704:1;10693:9;10689:17;10676:31;10734:18;10726:6;10723:30;10720:117;;;10756:79;;:::i;:::-;10720:117;10861:78;10931:7;10922:6;10911:9;10907:22;10861:78;:::i;:::-;10851:88;;10647:302;10988:2;11014:50;11056:7;11047:6;11036:9;11032:22;11014:50;:::i;:::-;11004:60;;10959:115;10403:678;;;;;:::o;11087:474::-;11155:6;11163;11212:2;11200:9;11191:7;11187:23;11183:32;11180:119;;;11218:79;;:::i;:::-;11180:119;11338:1;11363:53;11408:7;11399:6;11388:9;11384:22;11363:53;:::i;:::-;11353:63;;11309:117;11465:2;11491:53;11536:7;11527:6;11516:9;11512:22;11491:53;:::i;:::-;11481:63;;11436:118;11087:474;;;;;:::o;11567:118::-;11654:24;11672:5;11654:24;:::i;:::-;11649:3;11642:37;11567:118;;:::o;11691:222::-;11784:4;11822:2;11811:9;11807:18;11799:26;;11835:71;11903:1;11892:9;11888:17;11879:6;11835:71;:::i;:::-;11691:222;;;;:::o;11919:114::-;11986:6;12020:5;12014:12;12004:22;;11919:114;;;:::o;12039:184::-;12138:11;12172:6;12167:3;12160:19;12212:4;12207:3;12203:14;12188:29;;12039:184;;;;:::o;12229:132::-;12296:4;12319:3;12311:11;;12349:4;12344:3;12340:14;12332:22;;12229:132;;;:::o;12367:108::-;12444:24;12462:5;12444:24;:::i;:::-;12439:3;12432:37;12367:108;;:::o;12481:179::-;12550:10;12571:46;12613:3;12605:6;12571:46;:::i;:::-;12649:4;12644:3;12640:14;12626:28;;12481:179;;;;:::o;12666:113::-;12736:4;12768;12763:3;12759:14;12751:22;;12666:113;;;:::o;12815:732::-;12934:3;12963:54;13011:5;12963:54;:::i;:::-;13033:86;13112:6;13107:3;13033:86;:::i;:::-;13026:93;;13143:56;13193:5;13143:56;:::i;:::-;13222:7;13253:1;13238:284;13263:6;13260:1;13257:13;13238:284;;;13339:6;13333:13;13366:63;13425:3;13410:13;13366:63;:::i;:::-;13359:70;;13452:60;13505:6;13452:60;:::i;:::-;13442:70;;13298:224;13285:1;13282;13278:9;13273:14;;13238:284;;;13242:14;13538:3;13531:10;;12939:608;;;12815:732;;;;:::o;13553:1157::-;13930:4;13968:3;13957:9;13953:19;13945:27;;14018:9;14012:4;14008:20;14004:1;13993:9;13989:17;13982:47;14046:108;14149:4;14140:6;14046:108;:::i;:::-;14038:116;;14201:9;14195:4;14191:20;14186:2;14175:9;14171:18;14164:48;14229:108;14332:4;14323:6;14229:108;:::i;:::-;14221:116;;14384:9;14378:4;14374:20;14369:2;14358:9;14354:18;14347:48;14412:108;14515:4;14506:6;14412:108;:::i;:::-;14404:116;;14567:9;14561:4;14557:20;14552:2;14541:9;14537:18;14530:48;14595:108;14698:4;14689:6;14595:108;:::i;:::-;14587:116;;13553:1157;;;;;;;:::o;14716:180::-;14764:77;14761:1;14754:88;14861:4;14858:1;14851:15;14885:4;14882:1;14875:15;14902:320;14946:6;14983:1;14977:4;14973:12;14963:22;;15030:1;15024:4;15020:12;15051:18;15041:81;;15107:4;15099:6;15095:17;15085:27;;15041:81;15169:2;15161:6;15158:14;15138:18;15135:38;15132:84;;;15188:18;;:::i;:::-;15132:84;14953:269;14902:320;;;:::o;15228:234::-;15368:34;15364:1;15356:6;15352:14;15345:58;15437:17;15432:2;15424:6;15420:15;15413:42;15228:234;:::o;15468:366::-;15610:3;15631:67;15695:2;15690:3;15631:67;:::i;:::-;15624:74;;15707:93;15796:3;15707:93;:::i;:::-;15825:2;15820:3;15816:12;15809:19;;15468:366;;;:::o;15840:419::-;16006:4;16044:2;16033:9;16029:18;16021:26;;16093:9;16087:4;16083:20;16079:1;16068:9;16064:17;16057:47;16121:131;16247:4;16121:131;:::i;:::-;16113:139;;15840:419;;;:::o;16265:180::-;16313:77;16310:1;16303:88;16410:4;16407:1;16400:15;16434:4;16431:1;16424:15;16451:305;16491:3;16510:20;16528:1;16510:20;:::i;:::-;16505:25;;16544:20;16562:1;16544:20;:::i;:::-;16539:25;;16698:1;16630:66;16626:74;16623:1;16620:81;16617:107;;;16704:18;;:::i;:::-;16617:107;16748:1;16745;16741:9;16734:16;;16451:305;;;;:::o;16762:172::-;16902:24;16898:1;16890:6;16886:14;16879:48;16762:172;:::o;16940:366::-;17082:3;17103:67;17167:2;17162:3;17103:67;:::i;:::-;17096:74;;17179:93;17268:3;17179:93;:::i;:::-;17297:2;17292:3;17288:12;17281:19;;16940:366;;;:::o;17312:419::-;17478:4;17516:2;17505:9;17501:18;17493:26;;17565:9;17559:4;17555:20;17551:1;17540:9;17536:17;17529:47;17593:131;17719:4;17593:131;:::i;:::-;17585:139;;17312:419;;;:::o;17737:173::-;17877:25;17873:1;17865:6;17861:14;17854:49;17737:173;:::o;17916:366::-;18058:3;18079:67;18143:2;18138:3;18079:67;:::i;:::-;18072:74;;18155:93;18244:3;18155:93;:::i;:::-;18273:2;18268:3;18264:12;18257:19;;17916:366;;;:::o;18288:419::-;18454:4;18492:2;18481:9;18477:18;18469:26;;18541:9;18535:4;18531:20;18527:1;18516:9;18512:17;18505:47;18569:131;18695:4;18569:131;:::i;:::-;18561:139;;18288:419;;;:::o;18713:180::-;18761:77;18758:1;18751:88;18858:4;18855:1;18848:15;18882:4;18879:1;18872:15;18899:233;18938:3;18961:24;18979:5;18961:24;:::i;:::-;18952:33;;19007:66;19000:5;18997:77;18994:103;;;19077:18;;:::i;:::-;18994:103;19124:1;19117:5;19113:13;19106:20;;18899:233;;;:::o;19138:224::-;19278:34;19274:1;19266:6;19262:14;19255:58;19347:7;19342:2;19334:6;19330:15;19323:32;19138:224;:::o;19368:366::-;19510:3;19531:67;19595:2;19590:3;19531:67;:::i;:::-;19524:74;;19607:93;19696:3;19607:93;:::i;:::-;19725:2;19720:3;19716:12;19709:19;;19368:366;;;:::o;19740:419::-;19906:4;19944:2;19933:9;19929:18;19921:26;;19993:9;19987:4;19983:20;19979:1;19968:9;19964:17;19957:47;20021:131;20147:4;20021:131;:::i;:::-;20013:139;;19740:419;;;:::o;20165:176::-;20305:28;20301:1;20293:6;20289:14;20282:52;20165:176;:::o;20347:366::-;20489:3;20510:67;20574:2;20569:3;20510:67;:::i;:::-;20503:74;;20586:93;20675:3;20586:93;:::i;:::-;20704:2;20699:3;20695:12;20688:19;;20347:366;;;:::o;20719:419::-;20885:4;20923:2;20912:9;20908:18;20900:26;;20972:9;20966:4;20962:20;20958:1;20947:9;20943:17;20936:47;21000:131;21126:4;21000:131;:::i;:::-;20992:139;;20719:419;;;:::o;21144:223::-;21284:34;21280:1;21272:6;21268:14;21261:58;21353:6;21348:2;21340:6;21336:15;21329:31;21144:223;:::o;21373:366::-;21515:3;21536:67;21600:2;21595:3;21536:67;:::i;:::-;21529:74;;21612:93;21701:3;21612:93;:::i;:::-;21730:2;21725:3;21721:12;21714:19;;21373:366;;;:::o;21745:419::-;21911:4;21949:2;21938:9;21934:18;21926:26;;21998:9;21992:4;21988:20;21984:1;21973:9;21969:17;21962:47;22026:131;22152:4;22026:131;:::i;:::-;22018:139;;21745:419;;;:::o;22170:221::-;22310:34;22306:1;22298:6;22294:14;22287:58;22379:4;22374:2;22366:6;22362:15;22355:29;22170:221;:::o;22397:366::-;22539:3;22560:67;22624:2;22619:3;22560:67;:::i;:::-;22553:74;;22636:93;22725:3;22636:93;:::i;:::-;22754:2;22749:3;22745:12;22738:19;;22397:366;;;:::o;22769:419::-;22935:4;22973:2;22962:9;22958:18;22950:26;;23022:9;23016:4;23012:20;23008:1;22997:9;22993:17;22986:47;23050:131;23176:4;23050:131;:::i;:::-;23042:139;;22769:419;;;:::o;23194:179::-;23334:31;23330:1;23322:6;23318:14;23311:55;23194:179;:::o;23379:366::-;23521:3;23542:67;23606:2;23601:3;23542:67;:::i;:::-;23535:74;;23618:93;23707:3;23618:93;:::i;:::-;23736:2;23731:3;23727:12;23720:19;;23379:366;;;:::o;23751:419::-;23917:4;23955:2;23944:9;23940:18;23932:26;;24004:9;23998:4;23994:20;23990:1;23979:9;23975:17;23968:47;24032:131;24158:4;24032:131;:::i;:::-;24024:139;;23751:419;;;:::o;24176:172::-;24316:24;24312:1;24304:6;24300:14;24293:48;24176:172;:::o;24354:366::-;24496:3;24517:67;24581:2;24576:3;24517:67;:::i;:::-;24510:74;;24593:93;24682:3;24593:93;:::i;:::-;24711:2;24706:3;24702:12;24695:19;;24354:366;;;:::o;24726:419::-;24892:4;24930:2;24919:9;24915:18;24907:26;;24979:9;24973:4;24969:20;24965:1;24954:9;24950:17;24943:47;25007:131;25133:4;25007:131;:::i;:::-;24999:139;;24726:419;;;:::o;25151:191::-;25191:4;25211:20;25229:1;25211:20;:::i;:::-;25206:25;;25245:20;25263:1;25245:20;:::i;:::-;25240:25;;25284:1;25281;25278:8;25275:34;;;25289:18;;:::i;:::-;25275:34;25334:1;25331;25327:9;25319:17;;25151:191;;;;:::o;25348:775::-;25581:4;25619:3;25608:9;25604:19;25596:27;;25633:71;25701:1;25690:9;25686:17;25677:6;25633:71;:::i;:::-;25714:72;25782:2;25771:9;25767:18;25758:6;25714:72;:::i;:::-;25796;25864:2;25853:9;25849:18;25840:6;25796:72;:::i;:::-;25878;25946:2;25935:9;25931:18;25922:6;25878:72;:::i;:::-;25960:73;26028:3;26017:9;26013:19;26004:6;25960:73;:::i;:::-;26043;26111:3;26100:9;26096:19;26087:6;26043:73;:::i;:::-;25348:775;;;;;;;;;:::o;26129:220::-;26269:34;26265:1;26257:6;26253:14;26246:58;26338:3;26333:2;26325:6;26321:15;26314:28;26129:220;:::o;26355:366::-;26497:3;26518:67;26582:2;26577:3;26518:67;:::i;:::-;26511:74;;26594:93;26683:3;26594:93;:::i;:::-;26712:2;26707:3;26703:12;26696:19;;26355:366;;;:::o;26727:419::-;26893:4;26931:2;26920:9;26916:18;26908:26;;26980:9;26974:4;26970:20;26966:1;26955:9;26951:17;26944:47;27008:131;27134:4;27008:131;:::i;:::-;27000:139;;26727:419;;;:::o;27152:221::-;27292:34;27288:1;27280:6;27276:14;27269:58;27361:4;27356:2;27348:6;27344:15;27337:29;27152:221;:::o;27379:366::-;27521:3;27542:67;27606:2;27601:3;27542:67;:::i;:::-;27535:74;;27618:93;27707:3;27618:93;:::i;:::-;27736:2;27731:3;27727:12;27720:19;;27379:366;;;:::o;27751:419::-;27917:4;27955:2;27944:9;27940:18;27932:26;;28004:9;27998:4;27994:20;27990:1;27979:9;27975:17;27968:47;28032:131;28158:4;28032:131;:::i;:::-;28024:139;;27751:419;;;:::o;28176:181::-;28316:33;28312:1;28304:6;28300:14;28293:57;28176:181;:::o;28363:366::-;28505:3;28526:67;28590:2;28585:3;28526:67;:::i;:::-;28519:74;;28602:93;28691:3;28602:93;:::i;:::-;28720:2;28715:3;28711:12;28704:19;;28363:366;;;:::o;28735:419::-;28901:4;28939:2;28928:9;28924:18;28916:26;;28988:9;28982:4;28978:20;28974:1;28963:9;28959:17;28952:47;29016:131;29142:4;29016:131;:::i;:::-;29008:139;;28735:419;;;:::o;29160:224::-;29300:34;29296:1;29288:6;29284:14;29277:58;29369:7;29364:2;29356:6;29352:15;29345:32;29160:224;:::o;29390:366::-;29532:3;29553:67;29617:2;29612:3;29553:67;:::i;:::-;29546:74;;29629:93;29718:3;29629:93;:::i;:::-;29747:2;29742:3;29738:12;29731:19;;29390:366;;;:::o;29762:419::-;29928:4;29966:2;29955:9;29951:18;29943:26;;30015:9;30009:4;30005:20;30001:1;29990:9;29986:17;29979:47;30043:131;30169:4;30043:131;:::i;:::-;30035:139;;29762:419;;;:::o;30187:222::-;30327:34;30323:1;30315:6;30311:14;30304:58;30396:5;30391:2;30383:6;30379:15;30372:30;30187:222;:::o;30415:366::-;30557:3;30578:67;30642:2;30637:3;30578:67;:::i;:::-;30571:74;;30654:93;30743:3;30654:93;:::i;:::-;30772:2;30767:3;30763:12;30756:19;;30415:366;;;:::o;30787:419::-;30953:4;30991:2;30980:9;30976:18;30968:26;;31040:9;31034:4;31030:20;31026:1;31015:9;31011:17;31004:47;31068:131;31194:4;31068:131;:::i;:::-;31060:139;;30787:419;;;:::o;31212:225::-;31352:34;31348:1;31340:6;31336:14;31329:58;31421:8;31416:2;31408:6;31404:15;31397:33;31212:225;:::o;31443:366::-;31585:3;31606:67;31670:2;31665:3;31606:67;:::i;:::-;31599:74;;31682:93;31771:3;31682:93;:::i;:::-;31800:2;31795:3;31791:12;31784:19;;31443:366;;;:::o;31815:419::-;31981:4;32019:2;32008:9;32004:18;31996:26;;32068:9;32062:4;32058:20;32054:1;32043:9;32039:17;32032:47;32096:131;32222:4;32096:131;:::i;:::-;32088:139;;31815:419;;;:::o;32240:348::-;32280:7;32303:20;32321:1;32303:20;:::i;:::-;32298:25;;32337:20;32355:1;32337:20;:::i;:::-;32332:25;;32525:1;32457:66;32453:74;32450:1;32447:81;32442:1;32435:9;32428:17;32424:105;32421:131;;;32532:18;;:::i;:::-;32421:131;32580:1;32577;32573:9;32562:20;;32240:348;;;;:::o;32594:180::-;32642:77;32639:1;32632:88;32739:4;32736:1;32729:15;32763:4;32760:1;32753:15;32780:185;32820:1;32837:20;32855:1;32837:20;:::i;:::-;32832:25;;32871:20;32889:1;32871:20;:::i;:::-;32866:25;;32910:1;32900:35;;32915:18;;:::i;:::-;32900:35;32957:1;32954;32950:9;32945:14;;32780:185;;;;:::o;32971:148::-;33073:11;33110:3;33095:18;;32971:148;;;;:::o;33125:173::-;33265:25;33261:1;33253:6;33249:14;33242:49;33125:173;:::o;33304:402::-;33464:3;33485:85;33567:2;33562:3;33485:85;:::i;:::-;33478:92;;33579:93;33668:3;33579:93;:::i;:::-;33697:2;33692:3;33688:12;33681:19;;33304:402;;;:::o;33712:377::-;33818:3;33846:39;33879:5;33846:39;:::i;:::-;33901:89;33983:6;33978:3;33901:89;:::i;:::-;33894:96;;33999:52;34044:6;34039:3;34032:4;34025:5;34021:16;33999:52;:::i;:::-;34076:6;34071:3;34067:16;34060:23;;33822:267;33712:377;;;;:::o;34095:167::-;34235:19;34231:1;34223:6;34219:14;34212:43;34095:167;:::o;34268:402::-;34428:3;34449:85;34531:2;34526:3;34449:85;:::i;:::-;34442:92;;34543:93;34632:3;34543:93;:::i;:::-;34661:2;34656:3;34652:12;34645:19;;34268:402;;;:::o;34676:967::-;35058:3;35080:148;35224:3;35080:148;:::i;:::-;35073:155;;35245:95;35336:3;35327:6;35245:95;:::i;:::-;35238:102;;35357:148;35501:3;35357:148;:::i;:::-;35350:155;;35522:95;35613:3;35604:6;35522:95;:::i;:::-;35515:102;;35634:3;35627:10;;34676:967;;;;;:::o;35649:180::-;35697:77;35694:1;35687:88;35794:4;35791:1;35784:15;35818:4;35815:1;35808:15;35835:171;35874:3;35897:24;35915:5;35897:24;:::i;:::-;35888:33;;35943:4;35936:5;35933:15;35930:41;;;35951:18;;:::i;:::-;35930:41;35998:1;35991:5;35987:13;35980:20;;35835:171;;;:::o;36012:182::-;36152:34;36148:1;36140:6;36136:14;36129:58;36012:182;:::o;36200:366::-;36342:3;36363:67;36427:2;36422:3;36363:67;:::i;:::-;36356:74;;36439:93;36528:3;36439:93;:::i;:::-;36557:2;36552:3;36548:12;36541:19;;36200:366;;;:::o;36572:419::-;36738:4;36776:2;36765:9;36761:18;36753:26;;36825:9;36819:4;36815:20;36811:1;36800:9;36796:17;36789:47;36853:131;36979:4;36853:131;:::i;:::-;36845:139;;36572:419;;;:::o

Swarm Source

ipfs://3372a5bf0add906734ad6444342451a7dceba5dde12eef63bcf67899e7573a58
[ 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.