ETH Price: $3,371.72 (-3.29%)

Token

SHOP (SHOP)
 

Overview

Max Total Supply

99,612,728 SHOP

Holders

17,057 ( -0.006%)

Market

Price

$0.01 @ 0.000003 ETH (-1.15%)

Onchain Market Cap

$935,640.44

Circulating Supply Market Cap

$935,640.00

Other Info

Token Contract (WITH 18 Decimals)

Balance
669,928.55 SHOP

Value
$6,292.49 ( ~1.8663 Eth) [0.6725%]
0x0e5d37bf2e5d23ac5dac34b72950f4dd77be92d7
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Shopping.io is an eCommerce platform that allows users/customers to purchase goods online from major retailers such as Amazon, eBay, Walmart, and Home depot while checking out with cryptocurrency.

Market

Volume (24H):$1,558.37
Market Capitalization:$935,640.00
Circulating Supply:99,612,728.00 SHOP
Market Data Source: Coinmarketcap

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
SpiExt

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// File: contracts/utils/structs/EnumerableSet.sol


// OpenZeppelin Contracts v4.4.1 (utils/structs/EnumerableSet.sol)

pragma solidity ^0.8.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;
        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping(bytes32 => uint256) _indexes;
    }

    /**
     * @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(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) {
        return _values(set._inner);
    }

    // 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;

        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 on 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;

        assembly {
            result := store
        }

        return result;
    }
}

// File: contracts/utils/Strings.sol


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

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

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

// File: 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: contracts/access/IAccessControlEnumerable.sol


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

pragma solidity ^0.8.0;


/**
 * @dev External interface of AccessControlEnumerable declared to support ERC165 detection.
 */
interface IAccessControlEnumerable is IAccessControl {
    /**
     * @dev Returns one of the accounts that have `role`. `index` must be a
     * value between 0 and {getRoleMemberCount}, non-inclusive.
     *
     * Role bearers are not sorted in any particular way, and their ordering may
     * change at any point.
     *
     * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure
     * you perform all queries on the same block. See the following
     * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]
     * for more information.
     */
    function getRoleMember(bytes32 role, uint256 index) external view returns (address);

    /**
     * @dev Returns the number of accounts that have `role`. Can be used
     * together with {getRoleMember} to enumerate all bearers of a role.
     */
    function getRoleMemberCount(bytes32 role) external view returns (uint256);
}

// File: 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;
    }

}

// File: contracts/access/AccessControl.sol


// OpenZeppelin Contracts (last updated v4.5.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 {
    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 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(uint160(account), 20),
                        " 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.
     */
    function grantRole(bytes32 role, address account) external 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.
     */
    function revokeRole(bytes32 role, address account) external 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`.
     */
    function renounceRole(bytes32 role, address account) external 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.
     *
     * [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.
     */
    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.
     */
    function _revokeRole(bytes32 role, address account) internal virtual {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}

// File: contracts/access/AccessControlEnumerable.sol


// OpenZeppelin Contracts (last updated v4.5.0) (access/AccessControlEnumerable.sol)

pragma solidity ^0.8.0;




/**
 * @dev Extension of {AccessControl} that allows enumerating the members of each role.
 */
abstract contract AccessControlEnumerable is IAccessControlEnumerable, AccessControl {
    using EnumerableSet for EnumerableSet.AddressSet;

    mapping(bytes32 => EnumerableSet.AddressSet) private _roleMembers;

    bool public lastActionResult;

    event RoleIsNotExist(bytes32 role, address account);
    event RoleIsExit(bytes32 role, address account);
    /**
     * @dev Returns one of the accounts that have `role`. `index` must be a
     * value between 0 and {getRoleMemberCount}, non-inclusive.
     *
     * Role bearers are not sorted in any particular way, and their ordering may
     * change at any point.
     *
     * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure
     * you perform all queries on the same block. See the following
     * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]
     * for more information.
     */
    function getRoleMember(bytes32 role, uint256 index) external view virtual override returns (address) {
        return _roleMembers[role].at(index);
    }

    /**
     * @dev Returns the number of accounts that have `role`. Can be used
     * together with {getRoleMember} to enumerate all bearers of a role.
     */
    function getRoleMemberCount(bytes32 role) external view virtual override returns (uint256) {
        return _roleMembers[role].length();
    }

    /**
     * @dev Overload {_grantRole} to track enumerable memberships
     */
    function _grantRole(bytes32 role, address account) internal virtual override {
        super._grantRole(role, account);
        lastActionResult = _roleMembers[role].add(account);
    }

    /**
     * @dev Overload {_revokeRole} to track enumerable memberships
     */
    function _revokeRole(bytes32 role, address account) internal virtual override {
        super._revokeRole(role, account);
        lastActionResult =  _roleMembers[role].remove(account);
    }
}

// File: contracts/security/Pausable.sol


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

pragma solidity ^0.8.0;


/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

// File: contracts/IERC20.sol


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

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

    /**
     * @dev Moves `amount` tokens from the caller's account to `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);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

// File: contracts/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: contracts/ERC20.sol


// OpenZeppelin Contracts (last updated v4.5.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.zeppelin.solutions/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;

    mapping (address => bool) private _isExcludedFromFee;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    uint256 private feeRate;

    
    uint256 private _transferFeePoolBalance;

    bool private _transferFeePaused;

    
    /**
     * @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, "SpiExt: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "SpiExt: transfer from the zero address");
        require(to != address(0), "SpiExt: transfer to the zero address1");

        uint256 amountToTransfer = amount;
        uint256 transferFee = 0;

        //indicates if fee should be deducted from transfer
        bool takeFee = true;
        
        //if any account belongs to _isExcludedFromFee account then remove the fee
        if(_isExcludedFromFee[from] || _isExcludedFromFee[to]){
            takeFee = false;
        }

        if(!_transferFeePaused && takeFee) {
            transferFee = amount*feeRate/100;
            amountToTransfer -= transferFee;
        }

        _beforeTokenTransfer(from, to, amountToTransfer);

        uint256 fromBalance = balanceOf(from);
        require(fromBalance >= amount, "SpiExt: transfer amount exceeds balance");

        _transferFeePoolBalance += transferFee;
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _balances[to] += amountToTransfer;

        emit Transfer(from, to, amountToTransfer);

        _afterTokenTransfer(from, to, amountToTransfer);
    }

    /** @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), "SpiExt: mint to the zero address");

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

        _totalSupply += amount;
        _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), "SpiExt: burn from the zero address");

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

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "SpiExt: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

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

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

    /**ERC20r` 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), "SpiExt: approve from the zero address");
        require(spender != address(0), "SpiExt: 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, "SpiExt: 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 {}

    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    function _getFeeRate() internal view returns(uint256){
        return feeRate;
    }

    function _setFeeRate(uint256 _feeRate) internal {
        feeRate = _feeRate;
    }

    function _pauseTransferFee() internal {
        _transferFeePaused = true;
    }

    function _unpauseTransferFee() internal {
        _transferFeePaused = false;
    }

    function _getTransferFeePaused() internal view returns(bool) {
        return _transferFeePaused;
    }

    function getTransferFeePoolBalance() public view returns(uint256) {
        return _transferFeePoolBalance;
    }

    function _transferFromFeePool(uint256 amount, address to) internal returns(bool) {
        require(_transferFeePoolBalance >= amount, "SPIExt: amount should be lower than pool balance");
        _transferFeePoolBalance -= amount;
        _balances[to] += amount;
        return true;
    }

    function _excludeFromFee(address account) internal {
        _isExcludedFromFee[account] = true;
    }
    
    function _includeInFee(address account) internal {
        _isExcludedFromFee[account] = false;
    }

    function isExcludedFromFee(address account) public view returns(bool) {
        return _isExcludedFromFee[account];
    }
}

// File: contracts/extensions/ERC20Pausable.sol


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

pragma solidity ^0.8.0;



/**
 * @dev ERC20 token with pausable token transfers, minting and burning.
 *
 * Useful for scenarios such as preventing trades until the end of an evaluation
 * period, or having an emergency switch for freezing all token transfers in the
 * event of a large bug.
 */
abstract contract ERC20Pausable is ERC20, Pausable {
    /**
     * @dev See {ERC20-_beforeTokenTransfer}.
     *
     * Requirements:
     *
     * - the contract must not be paused.
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, amount);

        require(!paused(), "ERC20Pausable: token transfer while paused");
    }
}

// File: contracts/extensions/ERC20Burnable.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Burnable.sol)

pragma solidity ^0.8.0;



/**
 * @dev Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
abstract contract ERC20Burnable is Context, ERC20 {
    /**
     * @dev Destroys `amount` tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 amount) public virtual {
        _burn(_msgSender(), amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, deducting from the caller's
     * allowance.
     *
     * See {ERC20-_burn} and {ERC20-allowance}.
     *
     * Requirements:
     *
     * - the caller must have allowance for ``accounts``'s tokens of at least
     * `amount`.
     */
    function burnFrom(address account, uint256 amount) public virtual {
        _spendAllowance(account, _msgSender(), amount);
        _burn(account, amount);
    }
}

// File: contracts/SpiExt.sol



pragma solidity ^0.8.0;








contract SpiExt is Context, AccessControlEnumerable, ERC20Burnable, ERC20Pausable {
    bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
    bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE");
    bytes32 public constant MINT_APPROVER_ROLE = keccak256("MINTER_APPROVER");

    Approver[2] private adminApprovers;

    Approver[2] public mintApprovers;

    uint256 private adminTimelock;

    uint256 private mintTimelock;
   // address[2] public recoveryAdmin;

    struct Approver {  
        address approverAddress;  
        bool approved;
        uint256 timestamp; 
    }

    event TransferReceived(address _from, uint256 _amount);
    event TransferSent(address _from, address _destAddr, uint256 _amount);
    event CalledFallback(address, uint256);
    event MintingApproved(address);
    event MintingApprovalRevoked(address);
    event ActivityApproved(address);
    event ActivityApprovalRevoked(address);

    /**

     * @dev Grants `DEFAULT_ADMIN_ROLE`, `MINTER_ROLE` and `PAUSER_ROLE` to the
     * account that deploys the contract.
     *
     * See {ERC20-constructor}.
     */
    constructor(string memory name, string memory symbol, address adminApprover, address adminApprover2, address mintApprover, address mintApprover2) payable ERC20(name, symbol){
        _setupRole(DEFAULT_ADMIN_ROLE, _msgSender());
        _setupRole(MINTER_ROLE, _msgSender());
        _setupRole(PAUSER_ROLE, _msgSender());
        //Admin users adding
        adminApprovers[0].approverAddress = adminApprover;
        adminApprovers[0].approved = false;
        _grantRole(DEFAULT_ADMIN_ROLE, adminApprover);
        adminApprovers[1].approverAddress = adminApprover2;
        adminApprovers[1].approved = false;
        _grantRole(DEFAULT_ADMIN_ROLE, adminApprover2);
        //Mint approvals users adding
        mintApprovers[0].approverAddress = mintApprover;
        mintApprovers[0].approved = false;
        _grantRole(MINT_APPROVER_ROLE, mintApprover);
        mintApprovers[1].approverAddress = mintApprover2;
        mintApprovers[1].approved = false;
        _grantRole(MINT_APPROVER_ROLE, mintApprover2);
    }

    receive() payable external {
        emit TransferReceived(msg.sender, msg.value);
    } 
        
    fallback() payable external{
        emit CalledFallback(msg.sender, msg.value);
    }

    function transferFromContract(address payable to, uint256 amount) external onlyRole(DEFAULT_ADMIN_ROLE) {
        uint256 erc20balance = this.balanceOf(address(this));
        require(amount <= erc20balance, "SPIExt: balance is not sufficient for the transaction");
        this.transfer(to, amount);
        emit TransferSent(address(this), to, amount);
    }     

    function approveMint() external onlyRole(MINT_APPROVER_ROLE) {
        if( _msgSender() == mintApprovers[0].approverAddress) {
            mintApprovers[0].approved = true;
            mintApprovers[0].timestamp = block.timestamp;
        } else if (_msgSender() == mintApprovers[1].approverAddress) {
           mintApprovers[1].approved = true;
           mintApprovers[1].timestamp = block.timestamp;
        } 
        emit MintingApproved(_msgSender());
    }

    function revokeMintApproval() external onlyRole(MINT_APPROVER_ROLE) {
        if( _msgSender() == mintApprovers[0].approverAddress) {
            mintApprovers[0].approved = false;
        } else if (_msgSender() == mintApprovers[1].approverAddress) {
           mintApprovers[1].approved = false;
        } 
        emit MintingApprovalRevoked(_msgSender());
    }

    function getMintApprovalTimestamp() public view returns(uint256) {
        if(mintApprovers[0].approved && mintApprovers[1].approved) {
            return mintApprovers[0].timestamp > mintApprovers[1].timestamp ? mintApprovers[1].timestamp : mintApprovers[0].timestamp;
        } 
        if(mintApprovers[0].approved) {
            return mintApprovers[0].timestamp;
        }
        if(mintApprovers[1].approved) {
            return mintApprovers[1].timestamp;
        }
        return 0;
    }

    function isMintApproved() public view onlyRole(DEFAULT_ADMIN_ROLE) returns(bool) {
        uint256 mintApprovalTimestamp = getMintApprovalTimestamp();
        return mintApprovalTimestamp > 0 && block.timestamp > mintApprovalTimestamp + mintTimelock;
    }

    function resetMintApprovedInt() private {
        mintApprovers[0].approved = false;
        mintApprovers[1].approved = false;
    }

    function setMintApprover(address mintApprover, uint index) public onlyRole(DEFAULT_ADMIN_ROLE) {
        require(isApproved(), "SPIExt: Activity not approved");
        if(index >= 0 && index < mintApprovers.length) {
            mintApprovers[index].approverAddress = mintApprover;
            mintApprovers[index].approved = false;
            _grantRole(MINT_APPROVER_ROLE, mintApprover);
            resetApprovedInt();
        } 
    }

    /**
     * @dev Creates `amount` new tokens for `to`.
     *
     * See {ERC20-_mint}.
     *
     * Requirements:
     *
     * - the caller must have the `MINTER_ROLE`.
     */
    function mint(address to, uint256 amount) public virtual {
        require(hasRole(MINTER_ROLE, _msgSender()), "SPIExt: must have minter role to mint");
        require(isMintApproved(), "SpiExt: Minting not approved by approver");
        resetMintApprovedInt();
        _mint(to, amount);
    }

     /**
     * @dev Set flag to approve for critical activity within the token
     *
     *
     * Requirements:
     *
     * - the caller must have the `DEFAULT_ADMIN_ROLE`.
     */
    function approveActivity() external onlyRole(DEFAULT_ADMIN_ROLE) {
        require(adminApprovers[0].approverAddress == _msgSender() || adminApprovers[1].approverAddress == _msgSender(), "SPIExt: not enough permission for the operation");
        if(adminApprovers[0].approverAddress == _msgSender()) {
            adminApprovers[0].approved = true;
            adminApprovers[0].timestamp = block.timestamp;
        } else {
            adminApprovers[1].approved = true;
            adminApprovers[1].timestamp = block.timestamp;
        }
        emit ActivityApproved(_msgSender());
    }

    function revokeAdminApproval() external onlyRole(DEFAULT_ADMIN_ROLE) {
        require(adminApprovers[0].approverAddress == _msgSender() || adminApprovers[1].approverAddress == _msgSender(), "SPIExt: not enough permission for the operation");
        if( _msgSender() == adminApprovers[0].approverAddress) {
            adminApprovers[0].approved = false;
        } else if (_msgSender() == adminApprovers[1].approverAddress) {
            adminApprovers[1].approved = false;
        } 
        emit ActivityApprovalRevoked(_msgSender());
    }

    function getAdminApprovalTimestamp() public view onlyRole(DEFAULT_ADMIN_ROLE) returns(uint256) {
        if((adminApprovers[0].approved && adminApprovers[0].approverAddress != _msgSender()) 
            && (adminApprovers[1].approved && adminApprovers[1].approverAddress != _msgSender())) {
            return adminApprovers[0].timestamp > adminApprovers[1].timestamp ? adminApprovers[1].timestamp : adminApprovers[0].timestamp;
        } 
        if(adminApprovers[0].approved && adminApprovers[0].approverAddress != _msgSender()) {
            return adminApprovers[0].timestamp;
        }
        if(adminApprovers[1].approved && adminApprovers[1].approverAddress != _msgSender()) {
            return adminApprovers[1].timestamp;
        }
        return 0;
    }

    function isApproved() public view onlyRole(DEFAULT_ADMIN_ROLE) returns(bool) {
        if((!adminApprovers[0].approved && adminApprovers[1].approverAddress == _msgSender()) 
            || (!adminApprovers[1].approved && adminApprovers[0].approverAddress == _msgSender())) {
            return false;
        }
        uint256 adminApprovalTimestamp = getAdminApprovalTimestamp();
        return adminApprovalTimestamp > 0 && block.timestamp > adminApprovalTimestamp + adminTimelock;
    }

    function resetApprovedInt() private {
        adminApprovers[0].approved = false;
        adminApprovers[1].approved = false;
    }

    function setApprovalAdmin(address _recoveryAdmin, uint index) external onlyRole(DEFAULT_ADMIN_ROLE) {
        require(isApproved(), "SPIExt: Activity not approved"); 
        if(index>=0 && index< adminApprovers.length) {
            adminApprovers[index].approverAddress = _recoveryAdmin;
            _grantRole(DEFAULT_ADMIN_ROLE, _recoveryAdmin);
            resetApprovedInt();
        }
    }

    function getFeeRate() public view onlyRole(DEFAULT_ADMIN_ROLE) returns(uint256) {
        return _getFeeRate();
    }

    function setFeeRate(uint256 _feeRate) public onlyRole(DEFAULT_ADMIN_ROLE) {
        require(_feeRate != 0 && isApproved(), "SPIExt: Activity not approved"); 
        require(_feeRate <= 100, "SPIExt: Transfer Fee cannot exceed 100%");
        _setFeeRate(_feeRate);
    }
    
    function pauseTransferFee() public onlyRole(DEFAULT_ADMIN_ROLE) {
        _pauseTransferFee();    
    }

    function unpauseTransferFee() public onlyRole(DEFAULT_ADMIN_ROLE) {
        _unpauseTransferFee();    
    }

    function getTransactionFeePaused() public view returns(bool) {
        return _getTransferFeePaused();
    }

    /**
     * @dev Pauses all token transfers.
     *
     * See {ERC20Pausable} and {Pausable-_pause}.
     *
     * Requirements:
     *
     * - the caller must have the `PAUSER_ROLE`.
     */
    function pause() public virtual {
        require(hasRole(PAUSER_ROLE, _msgSender()), "SPIExt: must have pauser role to pause");
        _pause();
    }

    /**
     * @dev Unpauses all token transfers.
     *
     * See {ERC20Pausable} and {Pausable-_unpause}.
     *
     * Requirements:
     *
     * - the caller must have the `PAUSER_ROLE`.
     */
    function unpause() public virtual {
        require(hasRole(PAUSER_ROLE, _msgSender()), "SPIExt: must have pauser role to unpause");
        _unpause();
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual override(ERC20, ERC20Pausable) {
        super._beforeTokenTransfer(from, to, amount);
    }

    function excludeFromFee(address account) public onlyRole(DEFAULT_ADMIN_ROLE) {
        _excludeFromFee(account);
    }
    
    function includeInFee(address account) public onlyRole(DEFAULT_ADMIN_ROLE) {
        _includeInFee(account);
    }

    function revokeRole(bytes32 role, address account) external override onlyRole(DEFAULT_ADMIN_ROLE) {
        require(isApproved() || (adminApprovers[0].approverAddress != account && adminApprovers[1].approverAddress != account), "SPIExt: Role change for super admin not approved"); 
        super._revokeRole(role, account);
    }

    function transferFromFeePool(uint256 amount, address to) public onlyRole(DEFAULT_ADMIN_ROLE) returns(bool) {
        return _transferFromFeePool(amount, to);
    }

    function setAdminTimelock(uint256 timeLock) external onlyRole(DEFAULT_ADMIN_ROLE) {
        require(isApproved(), "SPIExt: Action is not approved");
        adminTimelock = timeLock;        
    }
 
    function setMintTimelock(uint256 timeLock) external onlyRole(DEFAULT_ADMIN_ROLE) {
        require(isApproved(), "SPIExt: Action is not approved");
        mintTimelock = timeLock;
    }

    function getAdminTimelock() external view onlyRole(DEFAULT_ADMIN_ROLE) returns(uint256) {
        return adminTimelock;
    }
 
    function getMintTimelock() external view onlyRole(DEFAULT_ADMIN_ROLE) returns(uint256) {
        return mintTimelock;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"address","name":"adminApprover","type":"address"},{"internalType":"address","name":"adminApprover2","type":"address"},{"internalType":"address","name":"mintApprover","type":"address"},{"internalType":"address","name":"mintApprover2","type":"address"}],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"","type":"address"}],"name":"ActivityApprovalRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"","type":"address"}],"name":"ActivityApproved","type":"event"},{"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":false,"internalType":"address","name":"","type":"address"},{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"CalledFallback","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"","type":"address"}],"name":"MintingApprovalRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"","type":"address"}],"name":"MintingApproved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"RoleIsExit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"RoleIsNotExist","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_from","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"TransferReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_from","type":"address"},{"indexed":false,"internalType":"address","name":"_destAddr","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"TransferSent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_APPROVER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSER_ROLE","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":[],"name":"approveActivity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"approveMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAdminApprovalTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAdminTimelock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFeeRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintApprovalTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintTimelock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTransactionFeePaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTransferFeePoolBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","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":[],"name":"isApproved","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isMintApproved","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastActionResult","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mintApprovers","outputs":[{"internalType":"address","name":"approverAddress","type":"address"},{"internalType":"bool","name":"approved","type":"bool"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pauseTransferFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"name":"revokeAdminApproval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revokeMintApproval","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":"uint256","name":"timeLock","type":"uint256"}],"name":"setAdminTimelock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recoveryAdmin","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"setApprovalAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_feeRate","type":"uint256"}],"name":"setFeeRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"mintApprover","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"setMintApprover","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"timeLock","type":"uint256"}],"name":"setMintTimelock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[{"internalType":"address payable","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFromContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"transferFromFeePool","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpauseTransferFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526040516200654b3803806200654b833981810160405281019062000029919062000805565b8585816007908051906020019062000043929190620006c0565b5080600890805190602001906200005c929190620006c0565b5050506000600b60016101000a81548160ff0219169083151502179055506200009e6000801b620000926200041260201b60201c565b6200041a60201b60201c565b620000df7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6620000d36200041260201b60201c565b6200041a60201b60201c565b620001207f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a620001146200041260201b60201c565b6200041a60201b60201c565b83600c60006002811062000139576200013862000a43565b5b6002020160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600c60006002811062000198576200019762000a43565b5b6002020160000160146101000a81548160ff021916908315150217905550620001cb6000801b856200043060201b60201c565b82600c600160028110620001e457620001e362000a43565b5b6002020160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600c60016002811062000243576200024262000a43565b5b6002020160000160146101000a81548160ff021916908315150217905550620002766000801b846200043060201b60201c565b8160106000600281106200028f576200028e62000a43565b5b6002020160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060006010600060028110620002ee57620002ed62000a43565b5b6002020160000160146101000a81548160ff0219169083151502179055506200033e7f72f147522acf4a21c7234c54cded1d238cc4bd9f48e5e7bc9ac78f0968197ec2836200043060201b60201c565b80601060016002811062000357576200035662000a43565b5b6002020160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060006010600160028110620003b657620003b562000a43565b5b6002020160000160146101000a81548160ff021916908315150217905550620004067f72f147522acf4a21c7234c54cded1d238cc4bd9f48e5e7bc9ac78f0968197ec2826200043060201b60201c565b50505050505062000ae0565b600033905090565b6200042c82826200043060201b60201c565b5050565b6200044782826200049060201b62002cf01760201c565b6200047381600160008581526020019081526020016000206200058160201b62002dd01790919060201c565b600260006101000a81548160ff0219169083151502179055505050565b620004a28282620005b960201b60201c565b6200057d57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620005226200041260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000620005b1836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6200062360201b60201c565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60006200063783836200069d60201b60201c565b6200069257826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905062000697565b600090505b92915050565b600080836001016000848152602001908152602001600020541415905092915050565b828054620006ce90620009a8565b90600052602060002090601f016020900481019282620006f257600085556200073e565b82601f106200070d57805160ff19168380011785556200073e565b828001600101855582156200073e579182015b828111156200073d57825182559160200191906001019062000720565b5b5090506200074d919062000751565b5090565b5b808211156200076c57600081600090555060010162000752565b5090565b600062000787620007818462000908565b620008df565b905082815260208101848484011115620007a657620007a562000aa6565b5b620007b384828562000972565b509392505050565b600081519050620007cc8162000ac6565b92915050565b600082601f830112620007ea57620007e962000aa1565b5b8151620007fc84826020860162000770565b91505092915050565b60008060008060008060c0878903121562000825576200082462000ab0565b5b600087015167ffffffffffffffff81111562000846576200084562000aab565b5b6200085489828a01620007d2565b965050602087015167ffffffffffffffff81111562000878576200087762000aab565b5b6200088689828a01620007d2565b95505060406200089989828a01620007bb565b9450506060620008ac89828a01620007bb565b9350506080620008bf89828a01620007bb565b92505060a0620008d289828a01620007bb565b9150509295509295509295565b6000620008eb620008fe565b9050620008f98282620009de565b919050565b6000604051905090565b600067ffffffffffffffff82111562000926576200092562000a72565b5b620009318262000ab5565b9050602081019050919050565b60006200094b8262000952565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60005b838110156200099257808201518184015260208101905062000975565b83811115620009a2576000848401525b50505050565b60006002820490506001821680620009c157607f821691505b60208210811415620009d857620009d762000a14565b5b50919050565b620009e98262000ab5565b810181811067ffffffffffffffff8211171562000a0b5762000a0a62000a72565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b62000ad1816200093e565b811462000add57600080fd5b50565b615a5b8062000af06000396000f3fe6080604052600436106103545760003560e01c80635342acb4116101c6578063a2d15e4e116100f7578063d9ed5f5611610095578063ea2f0b371161006f578063ea2f0b3714610c92578063f1c14f1714610cbb578063f43a217914610cfa578063fde7e9b614610d2557610394565b8063d9ed5f5614610c13578063dd62ed3e14610c2a578063e63ab1e914610c6757610394565b8063b02f6f98116100d1578063b02f6f9814610b57578063ca15c87314610b82578063d539139314610bbf578063d547741f14610bea57610394565b8063a2d15e4e14610aa0578063a457c2d714610add578063a9059cbb14610b1a57610394565b806379cc6790116101645780639010d07c1161013e5780639010d07c146109d057806391d1485414610a0d57806395d89b4114610a4a578063a217fddf14610a7557610394565b806379cc6790146109655780638456cb591461098e57806384e5eed0146109a557610394565b80635c975abb116101a05780635c975abb146108a75780636f314e0a146108d257806370a08231146108fd57806375ec97d31461093a57610394565b80635342acb41461081657806353d4efb714610853578063554fdf091461087e57610394565b80632f2ff15d116102a05780633f4ba83a1161023e57806342966c681161021857806342966c6814610784578063437823ec146107ad578063453d635c146107d657806345596e2e146107ed57610394565b80633f4ba83a1461071b57806340c10f1914610732578063411a26381461075b57610394565b80633897437d1161027a5780633897437d14610671578063395093511461068857806339c999bf146106c55780633bd1a144146106f057610394565b80632f2ff15d146105f4578063313ce5671461061d57806336568abe1461064857610394565b80631a88f3061161030d57806323b872dd116102e757806323b872dd14610538578063248a9ca31461057557806326717d10146105b257806328f371aa146105c957610394565b80631a88f306146104cd5780631a8a933a146104f6578063216cfc6d1461050d57610394565b80630260f3e4146103cf57806306fdde03146103f85780630719fa6a14610423578063095ea7b31461044e57806315bf27571461048b57806318160ddd146104a257610394565b36610394577ff1b03f708b9c39f453fe3f0cef84164c7d6f7df836df0796e1e9c2bce6ee397e333460405161038a929190614acb565b60405180910390a1005b7fe278b0fa22a3a7f750416b6434935cd5e35b37e34a8859b84d5ddb2118753d1333346040516103c5929190614acb565b60405180910390a1005b3480156103db57600080fd5b506103f660048036038101906103f19190614393565b610d4e565b005b34801561040457600080fd5b5061040d610e2d565b60405161041a9190614b2a565b60405180910390f35b34801561042f57600080fd5b50610438610ebf565b6040516104459190614af4565b60405180910390f35b34801561045a57600080fd5b5061047560048036038101906104709190614393565b610ed2565b6040516104829190614af4565b60405180910390f35b34801561049757600080fd5b506104a0610ef5565b005b3480156104ae57600080fd5b506104b7611196565b6040516104c49190614e8c565b60405180910390f35b3480156104d957600080fd5b506104f460048036038101906104ef91906142c0565b6111a0565b005b34801561050257600080fd5b5061050b61134c565b005b34801561051957600080fd5b50610522611516565b60405161052f9190614af4565b60405180910390f35b34801561054457600080fd5b5061055f600480360381019061055a9190614340565b611554565b60405161056c9190614af4565b60405180910390f35b34801561058157600080fd5b5061059c60048036038101906105979190614400565b611583565b6040516105a99190614b0f565b60405180910390f35b3480156105be57600080fd5b506105c76115a2565b005b3480156105d557600080fd5b506105de611879565b6040516105eb9190614af4565b60405180910390f35b34801561060057600080fd5b5061061b6004803603810190610616919061442d565b611a17565b005b34801561062957600080fd5b50610632611a38565b60405161063f9190614ea7565b60405180910390f35b34801561065457600080fd5b5061066f600480360381019061066a919061442d565b611a41565b005b34801561067d57600080fd5b50610686611ac4565b005b34801561069457600080fd5b506106af60048036038101906106aa9190614393565b611adc565b6040516106bc9190614af4565b60405180910390f35b3480156106d157600080fd5b506106da611b13565b6040516106e79190614e8c565b60405180910390f35b3480156106fc57600080fd5b50610705611ea4565b6040516107129190614e8c565b60405180910390f35b34801561072757600080fd5b50610730611ebc565b005b34801561073e57600080fd5b5061075960048036038101906107549190614393565b611f36565b005b34801561076757600080fd5b50610782600480360381019061077d9190614393565b612003565b005b34801561079057600080fd5b506107ab60048036038101906107a691906144ad565b612133565b005b3480156107b957600080fd5b506107d460048036038101906107cf9190614293565b612147565b005b3480156107e257600080fd5b506107eb612161565b005b3480156107f957600080fd5b50610814600480360381019061080f91906144ad565b612179565b005b34801561082257600080fd5b5061083d60048036038101906108389190614293565b61222b565b60405161084a9190614af4565b60405180910390f35b34801561085f57600080fd5b50610868612281565b6040516108759190614b0f565b60405180910390f35b34801561088a57600080fd5b506108a560048036038101906108a091906144ad565b6122a5565b005b3480156108b357600080fd5b506108bc612304565b6040516108c99190614af4565b60405180910390f35b3480156108de57600080fd5b506108e761231b565b6040516108f49190614af4565b60405180910390f35b34801561090957600080fd5b50610924600480360381019061091f9190614293565b61232a565b6040516109319190614e8c565b60405180910390f35b34801561094657600080fd5b5061094f612373565b60405161095c9190614e8c565b60405180910390f35b34801561097157600080fd5b5061098c60048036038101906109879190614393565b61237d565b005b34801561099a57600080fd5b506109a361239d565b005b3480156109b157600080fd5b506109ba612417565b6040516109c79190614e8c565b60405180910390f35b3480156109dc57600080fd5b506109f760048036038101906109f2919061446d565b612434565b604051610a049190614a19565b60405180910390f35b348015610a1957600080fd5b50610a346004803603810190610a2f919061442d565b612463565b604051610a419190614af4565b60405180910390f35b348015610a5657600080fd5b50610a5f6124cd565b604051610a6c9190614b2a565b60405180910390f35b348015610a8157600080fd5b50610a8a61255f565b604051610a979190614b0f565b60405180910390f35b348015610aac57600080fd5b50610ac76004803603810190610ac29190614507565b612566565b604051610ad49190614af4565b60405180910390f35b348015610ae957600080fd5b50610b046004803603810190610aff9190614393565b612588565b604051610b119190614af4565b60405180910390f35b348015610b2657600080fd5b50610b416004803603810190610b3c9190614393565b6125ff565b604051610b4e9190614af4565b60405180910390f35b348015610b6357600080fd5b50610b6c612622565b604051610b799190614e8c565b60405180910390f35b348015610b8e57600080fd5b50610ba96004803603810190610ba49190614400565b61263a565b604051610bb69190614e8c565b60405180910390f35b348015610bcb57600080fd5b50610bd461265e565b604051610be19190614b0f565b60405180910390f35b348015610bf657600080fd5b50610c116004803603810190610c0c919061442d565b612682565b005b348015610c1f57600080fd5b50610c286127cc565b005b348015610c3657600080fd5b50610c516004803603810190610c4c9190614300565b6129d8565b604051610c5e9190614e8c565b60405180910390f35b348015610c7357600080fd5b50610c7c612a5f565b604051610c899190614b0f565b60405180910390f35b348015610c9e57600080fd5b50610cb96004803603810190610cb49190614293565b612a83565b005b348015610cc757600080fd5b50610ce26004803603810190610cdd91906144ad565b612a9d565b604051610cf193929190614a94565b60405180910390f35b348015610d0657600080fd5b50610d0f612afa565b604051610d1c9190614e8c565b60405180910390f35b348015610d3157600080fd5b50610d4c6004803603810190610d4791906144ad565b612c91565b005b6000801b610d5b81612e00565b610d63611879565b610da2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9990614c0c565b60405180910390fd5b60008210158015610db35750600282105b15610e285782600c8360028110610dcd57610dcc6151f0565b5b6002020160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610e1f6000801b84612e14565b610e27612e60565b5b505050565b606060078054610e3c90615102565b80601f0160208091040260200160405190810160405280929190818152602001828054610e6890615102565b8015610eb55780601f10610e8a57610100808354040283529160200191610eb5565b820191906000526020600020905b815481529060010190602001808311610e9857829003601f168201915b5050505050905090565b600260009054906101000a900460ff1681565b600080610edd612ecc565b9050610eea818585612ed4565b600191505092915050565b6000801b610f0281612e00565b610f0a612ecc565b73ffffffffffffffffffffffffffffffffffffffff16600c600060028110610f3557610f346151f0565b5b6002020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480610fed5750610f82612ecc565b73ffffffffffffffffffffffffffffffffffffffff16600c600160028110610fad57610fac6151f0565b5b6002020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b61102c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102390614cac565b60405180910390fd5b611034612ecc565b73ffffffffffffffffffffffffffffffffffffffff16600c60006002811061105f5761105e6151f0565b5b6002020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156110fe576001600c6000600281106110ba576110b96151f0565b5b6002020160000160146101000a81548160ff02191690831515021790555042600c6000600281106110ee576110ed6151f0565b5b6002020160010181905550611155565b6001600c600160028110611115576111146151f0565b5b6002020160000160146101000a81548160ff02191690831515021790555042600c600160028110611149576111486151f0565b5b60020201600101819055505b7f354991f7d45d86476385f270a4e6068d2312b16787116b0b307d587687a8130d61117e612ecc565b60405161118b9190614a19565b60405180910390a150565b6000600654905090565b6000801b6111ad81612e00565b60003073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016111e89190614a19565b60206040518083038186803b15801561120057600080fd5b505afa158015611214573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061123891906144da565b90508083111561127d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127490614d2c565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85856040518363ffffffff1660e01b81526004016112b8929190614a34565b602060405180830381600087803b1580156112d257600080fd5b505af11580156112e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130a91906143d3565b507ffda3a3e0e1479b43cb1c701f7576187f4c4ad80768d627387e00184302f7d88e30858560405161133e93929190614a5d565b60405180910390a150505050565b7f72f147522acf4a21c7234c54cded1d238cc4bd9f48e5e7bc9ac78f0968197ec261137681612e00565b601060006002811061138b5761138a6151f0565b5b6002020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166113d1612ecc565b73ffffffffffffffffffffffffffffffffffffffff1614156114275760006010600060028110611404576114036151f0565b5b6002020160000160146101000a81548160ff0219169083151502179055506114d5565b601060016002811061143c5761143b6151f0565b5b6002020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611482612ecc565b73ffffffffffffffffffffffffffffffffffffffff1614156114d457600060106001600281106114b5576114b46151f0565b5b6002020160000160146101000a81548160ff0219169083151502179055505b5b7ff74e875e995b8c58f45bc239f052082f02f6b94385ea51551436baf352f56eea6114fe612ecc565b60405161150b9190614a19565b60405180910390a150565b60008060001b61152581612e00565b600061152f612afa565b905060008111801561154d57506015548161154a9190614ee9565b42115b9250505090565b60008061155f612ecc565b905061156c85828561309f565b61157785858561312b565b60019150509392505050565b6000806000838152602001908152602001600020600101549050919050565b6000801b6115af81612e00565b6115b7612ecc565b73ffffffffffffffffffffffffffffffffffffffff16600c6000600281106115e2576115e16151f0565b5b6002020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148061169a575061162f612ecc565b73ffffffffffffffffffffffffffffffffffffffff16600c60016002811061165a576116596151f0565b5b6002020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b6116d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d090614cac565b60405180910390fd5b600c6000600281106116ee576116ed6151f0565b5b6002020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611734612ecc565b73ffffffffffffffffffffffffffffffffffffffff16141561178a576000600c600060028110611767576117666151f0565b5b6002020160000160146101000a81548160ff021916908315150217905550611838565b600c60016002811061179f5761179e6151f0565b5b6002020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166117e5612ecc565b73ffffffffffffffffffffffffffffffffffffffff161415611837576000600c600160028110611818576118176151f0565b5b6002020160000160146101000a81548160ff0219169083151502179055505b5b7f0af94ac8780910f602d90cd22fe7df04e6e70290b6a72200ba5b146577fe5490611861612ecc565b60405161186e9190614a19565b60405180910390a150565b60008060001b61188881612e00565b600c60006002811061189d5761189c6151f0565b5b6002020160000160149054906101000a900460ff1615801561192d57506118c2612ecc565b73ffffffffffffffffffffffffffffffffffffffff16600c6001600281106118ed576118ec6151f0565b5b6002020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b806119d95750600c600160028110611948576119476151f0565b5b6002020160000160149054906101000a900460ff161580156119d8575061196d612ecc565b73ffffffffffffffffffffffffffffffffffffffff16600c600060028110611998576119976151f0565b5b6002020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b5b156119e75760009150611a13565b60006119f1611b13565b9050600081118015611a0f575060145481611a0c9190614ee9565b42115b9250505b5090565b611a2082611583565b611a2981612e00565b611a338383612e14565b505050565b60006012905090565b611a49612ecc565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611ab6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aad90614e4c565b60405180910390fd5b611ac08282613495565b5050565b6000801b611ad181612e00565b611ad96134e1565b50565b600080611ae7612ecc565b9050611b08818585611af985896129d8565b611b039190614ee9565b612ed4565b600191505092915050565b60008060001b611b2281612e00565b600c600060028110611b3757611b366151f0565b5b6002020160000160149054906101000a900460ff168015611bc75750611b5b612ecc565b73ffffffffffffffffffffffffffffffffffffffff16600c600060028110611b8657611b856151f0565b5b6002020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b8015611c745750600c600160028110611be357611be26151f0565b5b6002020160000160149054906101000a900460ff168015611c735750611c07612ecc565b73ffffffffffffffffffffffffffffffffffffffff16600c600160028110611c3257611c316151f0565b5b6002020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b5b15611cff57600c600160028110611c8e57611c8d6151f0565b5b6002020160010154600c600060028110611cab57611caa6151f0565b5b600202016001015411611cda57600c600060028110611ccd57611ccc6151f0565b5b6002020160010154611cf8565b600c600160028110611cef57611cee6151f0565b5b60020201600101545b9150611ea0565b600c600060028110611d1457611d136151f0565b5b6002020160000160149054906101000a900460ff168015611da45750611d38612ecc565b73ffffffffffffffffffffffffffffffffffffffff16600c600060028110611d6357611d626151f0565b5b6002020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b15611dcd57600c600060028110611dbe57611dbd6151f0565b5b60020201600101549150611ea0565b600c600160028110611de257611de16151f0565b5b6002020160000160149054906101000a900460ff168015611e725750611e06612ecc565b73ffffffffffffffffffffffffffffffffffffffff16600c600160028110611e3157611e306151f0565b5b6002020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b15611e9b57600c600160028110611e8c57611e8b6151f0565b5b60020201600101549150611ea0565b600091505b5090565b60008060001b611eb381612e00565b60145491505090565b611eed7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a611ee8612ecc565b612463565b611f2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2390614c2c565b60405180910390fd5b611f346134fe565b565b611f677f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6611f62612ecc565b612463565b611fa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9d90614c8c565b60405180910390fd5b611fae611516565b611fed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe490614dac565b60405180910390fd5b611ff56135a0565b611fff828261360c565b5050565b6000801b61201081612e00565b612018611879565b612057576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204e90614c0c565b60405180910390fd5b600082101580156120685750600282105b1561212e578260108360028110612082576120816151f0565b5b6002020160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000601083600281106120dd576120dc6151f0565b5b6002020160000160146101000a81548160ff0219169083151502179055506121257f72f147522acf4a21c7234c54cded1d238cc4bd9f48e5e7bc9ac78f0968197ec284612e14565b61212d612e60565b5b505050565b61214461213e612ecc565b8261376d565b50565b6000801b61215481612e00565b61215d82613946565b5050565b6000801b61216e81612e00565b6121766139a1565b50565b6000801b61218681612e00565b6000821415801561219b575061219a611879565b5b6121da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d190614c0c565b60405180910390fd5b606482111561221e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221590614bec565b60405180910390fd5b612227826139be565b5050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b7f72f147522acf4a21c7234c54cded1d238cc4bd9f48e5e7bc9ac78f0968197ec281565b6000801b6122b281612e00565b6122ba611879565b6122f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f090614e0c565b60405180910390fd5b816015819055505050565b6000600b60019054906101000a900460ff16905090565b60006123256139c8565b905090565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600a54905090565b61238f82612389612ecc565b8361309f565b612399828261376d565b5050565b6123ce7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6123c9612ecc565b612463565b61240d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240490614bcc565b60405180910390fd5b6124156139df565b565b60008060001b61242681612e00565b61242e613a82565b91505090565b600061245b8260016000868152602001908152602001600020613a8c90919063ffffffff16565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6060600880546124dc90615102565b80601f016020809104026020016040519081016040528092919081815260200182805461250890615102565b80156125555780601f1061252a57610100808354040283529160200191612555565b820191906000526020600020905b81548152906001019060200180831161253857829003601f168201915b5050505050905090565b6000801b81565b60008060001b61257581612e00565b61257f8484613aa6565b91505092915050565b600080612593612ecc565b905060006125a182866129d8565b9050838110156125e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125dd90614d0c565b60405180910390fd5b6125f38286868403612ed4565b60019250505092915050565b60008061260a612ecc565b905061261781858561312b565b600191505092915050565b60008060001b61263181612e00565b60155491505090565b600061265760016000848152602001908152602001600020613b66565b9050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b6000801b61268f81612e00565b612697611879565b8061277e57508173ffffffffffffffffffffffffffffffffffffffff16600c6000600281106126c9576126c86151f0565b5b6002020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415801561277d57508173ffffffffffffffffffffffffffffffffffffffff16600c60016002811061273c5761273b6151f0565b5b6002020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b5b6127bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b490614dcc565b60405180910390fd5b6127c78383613495565b505050565b7f72f147522acf4a21c7234c54cded1d238cc4bd9f48e5e7bc9ac78f0968197ec26127f681612e00565b601060006002811061280b5761280a6151f0565b5b6002020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612851612ecc565b73ffffffffffffffffffffffffffffffffffffffff1614156128c85760016010600060028110612884576128836151f0565b5b6002020160000160146101000a81548160ff0219169083151502179055504260106000600281106128b8576128b76151f0565b5b6002020160010181905550612997565b60106001600281106128dd576128dc6151f0565b5b6002020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612923612ecc565b73ffffffffffffffffffffffffffffffffffffffff1614156129965760016010600160028110612956576129556151f0565b5b6002020160000160146101000a81548160ff02191690831515021790555042601060016002811061298a576129896151f0565b5b60020201600101819055505b5b7fb6b0e3ceb3ec2d9414036579e6b47aa468ad88799888c775b31e0b4db285c8ac6129c0612ecc565b6040516129cd9190614a19565b60405180910390a150565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b6000801b612a9081612e00565b612a9982613b7b565b5050565b60108160028110612aad57600080fd5b600202016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060000160149054906101000a900460ff16908060010154905083565b60006010600060028110612b1157612b106151f0565b5b6002020160000160149054906101000a900460ff168015612b5857506010600160028110612b4257612b416151f0565b5b6002020160000160149054906101000a900460ff165b15612be3576010600160028110612b7257612b716151f0565b5b60020201600101546010600060028110612b8f57612b8e6151f0565b5b600202016001015411612bbe576010600060028110612bb157612bb06151f0565b5b6002020160010154612bdc565b6010600160028110612bd357612bd26151f0565b5b60020201600101545b9050612c8e565b6010600060028110612bf857612bf76151f0565b5b6002020160000160149054906101000a900460ff1615612c36576010600060028110612c2757612c266151f0565b5b60020201600101549050612c8e565b6010600160028110612c4b57612c4a6151f0565b5b6002020160000160149054906101000a900460ff1615612c89576010600160028110612c7a57612c796151f0565b5b60020201600101549050612c8e565b600090505b90565b6000801b612c9e81612e00565b612ca6611879565b612ce5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cdc90614e0c565b60405180910390fd5b816014819055505050565b612cfa8282612463565b612dcc57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612d71612ecc565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000612df8836000018373ffffffffffffffffffffffffffffffffffffffff1660001b613bd6565b905092915050565b612e1181612e0c612ecc565b613c46565b50565b612e1e8282612cf0565b612e438160016000858152602001908152602001600020612dd090919063ffffffff16565b600260006101000a81548160ff0219169083151502179055505050565b6000600c600060028110612e7757612e766151f0565b5b6002020160000160146101000a81548160ff0219169083151502179055506000600c600160028110612eac57612eab6151f0565b5b6002020160000160146101000a81548160ff021916908315150217905550565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612f44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f3b90614d4c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612fb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fab90614c6c565b60405180910390fd5b80600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516130929190614e8c565b60405180910390a3505050565b60006130ab84846129d8565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146131255781811015613117576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161310e90614d8c565b60405180910390fd5b6131248484848403612ed4565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561319b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319290614b4c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561320b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161320290614ccc565b60405180910390fd5b600081905060008060019050600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806132b85750600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156132c257600090505b600b60009054906101000a900460ff161580156132dc5750805b1561330c576064600954856132f19190614f70565b6132fb9190614f3f565b915081836133099190614fca565b92505b613317868685613ce3565b60006133228761232a565b905084811015613367576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335e90614dec565b60405180910390fd5b82600a60008282546133799190614ee9565b92505081905550848103600360008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555083600360008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546134159190614ee9565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516134799190614e8c565b60405180910390a361348c878786613cf3565b50505050505050565b61349f8282613cf8565b6134c48160016000858152602001908152602001600020613dd990919063ffffffff16565b600260006101000a81548160ff0219169083151502179055505050565b6000600b60006101000a81548160ff021916908315150217905550565b613506612304565b613545576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161353c90614bac565b60405180910390fd5b6000600b60016101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa613589612ecc565b6040516135969190614a19565b60405180910390a1565b600060106000600281106135b7576135b66151f0565b5b6002020160000160146101000a81548160ff021916908315150217905550600060106001600281106135ec576135eb6151f0565b5b6002020160000160146101000a81548160ff021916908315150217905550565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561367c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161367390614b8c565b60405180910390fd5b61368860008383613ce3565b806006600082825461369a9190614ee9565b9250508190555080600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546136f09190614ee9565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516137559190614e8c565b60405180910390a361376960008383613cf3565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156137dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137d490614e2c565b60405180910390fd5b6137e982600083613ce3565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015613870576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161386790614c4c565b60405180910390fd5b818103600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600660008282546138c89190614fca565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161392d9190614e8c565b60405180910390a361394183600084613cf3565b505050565b6001600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6001600b60006101000a81548160ff021916908315150217905550565b8060098190555050565b6000600b60009054906101000a900460ff16905090565b6139e7612304565b15613a27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a1e90614cec565b60405180910390fd5b6001600b60016101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258613a6b612ecc565b604051613a789190614a19565b60405180910390a1565b6000600954905090565b6000613a9b8360000183613e09565b60001c905092915050565b600082600a541015613aed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ae490614d6c565b60405180910390fd5b82600a6000828254613aff9190614fca565b9250508190555082600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613b559190614ee9565b925050819055506001905092915050565b6000613b7482600001613e34565b9050919050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000613be28383613e45565b613c3b578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050613c40565b600090505b92915050565b613c508282612463565b613cdf57613c758173ffffffffffffffffffffffffffffffffffffffff166014613e68565b613c838360001c6020613e68565b604051602001613c949291906149df565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613cd69190614b2a565b60405180910390fd5b5050565b613cee8383836140a4565b505050565b505050565b613d028282612463565b15613dd557600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550613d7a612ecc565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000613e01836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6140fc565b905092915050565b6000826000018281548110613e2157613e206151f0565b5b9060005260206000200154905092915050565b600081600001805490509050919050565b600080836001016000848152602001908152602001600020541415905092915050565b606060006002836002613e7b9190614f70565b613e859190614ee9565b67ffffffffffffffff811115613e9e57613e9d61521f565b5b6040519080825280601f01601f191660200182016040528015613ed05781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110613f0857613f076151f0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110613f6c57613f6b6151f0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002613fac9190614f70565b613fb69190614ee9565b90505b6001811115614056577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110613ff857613ff76151f0565b5b1a60f81b82828151811061400f5761400e6151f0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061404f906150d8565b9050613fb9565b506000841461409a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161409190614b6c565b60405180910390fd5b8091505092915050565b6140af838383614210565b6140b7612304565b156140f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016140ee90614e6c565b60405180910390fd5b505050565b6000808360010160008481526020019081526020016000205490506000811461420457600060018261412e9190614fca565b90506000600186600001805490506141469190614fca565b90508181146141b5576000866000018281548110614167576141666151f0565b5b906000526020600020015490508087600001848154811061418b5761418a6151f0565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b856000018054806141c9576141c86151c1565b5b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061420a565b60009150505b92915050565b505050565b600081359050614224816159b2565b92915050565b600081359050614239816159c9565b92915050565b60008151905061424e816159e0565b92915050565b600081359050614263816159f7565b92915050565b60008135905061427881615a0e565b92915050565b60008151905061428d81615a0e565b92915050565b6000602082840312156142a9576142a861524e565b5b60006142b784828501614215565b91505092915050565b600080604083850312156142d7576142d661524e565b5b60006142e58582860161422a565b92505060206142f685828601614269565b9150509250929050565b600080604083850312156143175761431661524e565b5b600061432585828601614215565b925050602061433685828601614215565b9150509250929050565b6000806000606084860312156143595761435861524e565b5b600061436786828701614215565b935050602061437886828701614215565b925050604061438986828701614269565b9150509250925092565b600080604083850312156143aa576143a961524e565b5b60006143b885828601614215565b92505060206143c985828601614269565b9150509250929050565b6000602082840312156143e9576143e861524e565b5b60006143f78482850161423f565b91505092915050565b6000602082840312156144165761441561524e565b5b600061442484828501614254565b91505092915050565b600080604083850312156144445761444361524e565b5b600061445285828601614254565b925050602061446385828601614215565b9150509250929050565b600080604083850312156144845761448361524e565b5b600061449285828601614254565b92505060206144a385828601614269565b9150509250929050565b6000602082840312156144c3576144c261524e565b5b60006144d184828501614269565b91505092915050565b6000602082840312156144f0576144ef61524e565b5b60006144fe8482850161427e565b91505092915050565b6000806040838503121561451e5761451d61524e565b5b600061452c85828601614269565b925050602061453d85828601614215565b9150509250929050565b6145508161506f565b82525050565b61455f81614ffe565b82525050565b61456e81615022565b82525050565b61457d8161502e565b82525050565b600061458e82614ec2565b6145988185614ecd565b93506145a88185602086016150a5565b6145b181615253565b840191505092915050565b60006145c782614ec2565b6145d18185614ede565b93506145e18185602086016150a5565b80840191505092915050565b60006145fa602683614ecd565b915061460582615264565b604082019050919050565b600061461d602083614ecd565b9150614628826152b3565b602082019050919050565b6000614640602083614ecd565b915061464b826152dc565b602082019050919050565b6000614663601483614ecd565b915061466e82615305565b602082019050919050565b6000614686602683614ecd565b91506146918261532e565b604082019050919050565b60006146a9602783614ecd565b91506146b48261537d565b604082019050919050565b60006146cc601d83614ecd565b91506146d7826153cc565b602082019050919050565b60006146ef602883614ecd565b91506146fa826153f5565b604082019050919050565b6000614712602383614ecd565b915061471d82615444565b604082019050919050565b6000614735602383614ecd565b915061474082615493565b604082019050919050565b6000614758602583614ecd565b9150614763826154e2565b604082019050919050565b600061477b602f83614ecd565b915061478682615531565b604082019050919050565b600061479e602583614ecd565b91506147a982615580565b604082019050919050565b60006147c1601083614ecd565b91506147cc826155cf565b602082019050919050565b60006147e4602683614ecd565b91506147ef826155f8565b604082019050919050565b6000614807603583614ecd565b915061481282615647565b604082019050919050565b600061482a602583614ecd565b915061483582615696565b604082019050919050565b600061484d603083614ecd565b9150614858826156e5565b604082019050919050565b6000614870601e83614ecd565b915061487b82615734565b602082019050919050565b6000614893602883614ecd565b915061489e8261575d565b604082019050919050565b60006148b6603083614ecd565b91506148c1826157ac565b604082019050919050565b60006148d9602783614ecd565b91506148e4826157fb565b604082019050919050565b60006148fc601e83614ecd565b91506149078261584a565b602082019050919050565b600061491f602283614ecd565b915061492a82615873565b604082019050919050565b6000614942601783614ede565b915061494d826158c2565b601782019050919050565b6000614965601183614ede565b9150614970826158eb565b601182019050919050565b6000614988602f83614ecd565b915061499382615914565b604082019050919050565b60006149ab602a83614ecd565b91506149b682615963565b604082019050919050565b6149ca81615058565b82525050565b6149d981615062565b82525050565b60006149ea82614935565b91506149f682856145bc565b9150614a0182614958565b9150614a0d82846145bc565b91508190509392505050565b6000602082019050614a2e6000830184614556565b92915050565b6000604082019050614a496000830185614547565b614a5660208301846149c1565b9392505050565b6000606082019050614a726000830186614556565b614a7f6020830185614547565b614a8c60408301846149c1565b949350505050565b6000606082019050614aa96000830186614556565b614ab66020830185614565565b614ac360408301846149c1565b949350505050565b6000604082019050614ae06000830185614556565b614aed60208301846149c1565b9392505050565b6000602082019050614b096000830184614565565b92915050565b6000602082019050614b246000830184614574565b92915050565b60006020820190508181036000830152614b448184614583565b905092915050565b60006020820190508181036000830152614b65816145ed565b9050919050565b60006020820190508181036000830152614b8581614610565b9050919050565b60006020820190508181036000830152614ba581614633565b9050919050565b60006020820190508181036000830152614bc581614656565b9050919050565b60006020820190508181036000830152614be581614679565b9050919050565b60006020820190508181036000830152614c058161469c565b9050919050565b60006020820190508181036000830152614c25816146bf565b9050919050565b60006020820190508181036000830152614c45816146e2565b9050919050565b60006020820190508181036000830152614c6581614705565b9050919050565b60006020820190508181036000830152614c8581614728565b9050919050565b60006020820190508181036000830152614ca58161474b565b9050919050565b60006020820190508181036000830152614cc58161476e565b9050919050565b60006020820190508181036000830152614ce581614791565b9050919050565b60006020820190508181036000830152614d05816147b4565b9050919050565b60006020820190508181036000830152614d25816147d7565b9050919050565b60006020820190508181036000830152614d45816147fa565b9050919050565b60006020820190508181036000830152614d658161481d565b9050919050565b60006020820190508181036000830152614d8581614840565b9050919050565b60006020820190508181036000830152614da581614863565b9050919050565b60006020820190508181036000830152614dc581614886565b9050919050565b60006020820190508181036000830152614de5816148a9565b9050919050565b60006020820190508181036000830152614e05816148cc565b9050919050565b60006020820190508181036000830152614e25816148ef565b9050919050565b60006020820190508181036000830152614e4581614912565b9050919050565b60006020820190508181036000830152614e658161497b565b9050919050565b60006020820190508181036000830152614e858161499e565b9050919050565b6000602082019050614ea160008301846149c1565b92915050565b6000602082019050614ebc60008301846149d0565b92915050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b6000614ef482615058565b9150614eff83615058565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614f3457614f33615134565b5b828201905092915050565b6000614f4a82615058565b9150614f5583615058565b925082614f6557614f64615163565b5b828204905092915050565b6000614f7b82615058565b9150614f8683615058565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614fbf57614fbe615134565b5b828202905092915050565b6000614fd582615058565b9150614fe083615058565b925082821015614ff357614ff2615134565b5b828203905092915050565b600061500982615038565b9050919050565b600061501b82615038565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b600061507a82615081565b9050919050565b600061508c82615093565b9050919050565b600061509e82615038565b9050919050565b60005b838110156150c35780820151818401526020810190506150a8565b838111156150d2576000848401525b50505050565b60006150e382615058565b915060008214156150f7576150f6615134565b5b600182039050919050565b6000600282049050600182168061511a57607f821691505b6020821081141561512e5761512d615192565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b6000601f19601f8301169050919050565b7f5370694578743a207472616e736665722066726f6d20746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f5370694578743a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f5350494578743a206d75737420686176652070617573657220726f6c6520746f60008201527f2070617573650000000000000000000000000000000000000000000000000000602082015250565b7f5350494578743a205472616e73666572204665652063616e6e6f74206578636560008201527f6564203130302500000000000000000000000000000000000000000000000000602082015250565b7f5350494578743a204163746976697479206e6f7420617070726f766564000000600082015250565b7f5350494578743a206d75737420686176652070617573657220726f6c6520746f60008201527f20756e7061757365000000000000000000000000000000000000000000000000602082015250565b7f5370694578743a206275726e20616d6f756e7420657863656564732062616c6160008201527f6e63650000000000000000000000000000000000000000000000000000000000602082015250565b7f5370694578743a20617070726f766520746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f5350494578743a206d7573742068617665206d696e74657220726f6c6520746f60008201527f206d696e74000000000000000000000000000000000000000000000000000000602082015250565b7f5350494578743a206e6f7420656e6f756768207065726d697373696f6e20666f60008201527f7220746865206f7065726174696f6e0000000000000000000000000000000000602082015250565b7f5370694578743a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737331000000000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f5370694578743a2064656372656173656420616c6c6f77616e63652062656c6f60008201527f77207a65726f0000000000000000000000000000000000000000000000000000602082015250565b7f5350494578743a2062616c616e6365206973206e6f742073756666696369656e60008201527f7420666f7220746865207472616e73616374696f6e0000000000000000000000602082015250565b7f5370694578743a20617070726f76652066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f5350494578743a20616d6f756e742073686f756c64206265206c6f776572207460008201527f68616e20706f6f6c2062616c616e636500000000000000000000000000000000602082015250565b7f5370694578743a20696e73756666696369656e7420616c6c6f77616e63650000600082015250565b7f5370694578743a204d696e74696e67206e6f7420617070726f7665642062792060008201527f617070726f766572000000000000000000000000000000000000000000000000602082015250565b7f5350494578743a20526f6c65206368616e676520666f7220737570657220616460008201527f6d696e206e6f7420617070726f76656400000000000000000000000000000000602082015250565b7f5370694578743a207472616e7366657220616d6f756e7420657863656564732060008201527f62616c616e636500000000000000000000000000000000000000000000000000602082015250565b7f5350494578743a20416374696f6e206973206e6f7420617070726f7665640000600082015250565b7f5370694578743a206275726e2066726f6d20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b7f45524332305061757361626c653a20746f6b656e207472616e7366657220776860008201527f696c652070617573656400000000000000000000000000000000000000000000602082015250565b6159bb81614ffe565b81146159c657600080fd5b50565b6159d281615010565b81146159dd57600080fd5b50565b6159e981615022565b81146159f457600080fd5b50565b615a008161502e565b8114615a0b57600080fd5b50565b615a1781615058565b8114615a2257600080fd5b5056fea2646970667358221220f8de59a9953b1bb8d26100e10ead3378f8d496da94f9b5fe87a43dc532dd89b164736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000006a4518ade8d4f10df01272135ca802b9396eccba000000000000000000000000192438d3ca981c1ca2b3efce215716cdcc40d7e50000000000000000000000006fca195293ec55921188bf2f05b4c73b60fd29d500000000000000000000000025c4885e3bb3af119ddeb44df7d94bea193b1bff000000000000000000000000000000000000000000000000000000000000000453484f500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000052053484f50000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106103545760003560e01c80635342acb4116101c6578063a2d15e4e116100f7578063d9ed5f5611610095578063ea2f0b371161006f578063ea2f0b3714610c92578063f1c14f1714610cbb578063f43a217914610cfa578063fde7e9b614610d2557610394565b8063d9ed5f5614610c13578063dd62ed3e14610c2a578063e63ab1e914610c6757610394565b8063b02f6f98116100d1578063b02f6f9814610b57578063ca15c87314610b82578063d539139314610bbf578063d547741f14610bea57610394565b8063a2d15e4e14610aa0578063a457c2d714610add578063a9059cbb14610b1a57610394565b806379cc6790116101645780639010d07c1161013e5780639010d07c146109d057806391d1485414610a0d57806395d89b4114610a4a578063a217fddf14610a7557610394565b806379cc6790146109655780638456cb591461098e57806384e5eed0146109a557610394565b80635c975abb116101a05780635c975abb146108a75780636f314e0a146108d257806370a08231146108fd57806375ec97d31461093a57610394565b80635342acb41461081657806353d4efb714610853578063554fdf091461087e57610394565b80632f2ff15d116102a05780633f4ba83a1161023e57806342966c681161021857806342966c6814610784578063437823ec146107ad578063453d635c146107d657806345596e2e146107ed57610394565b80633f4ba83a1461071b57806340c10f1914610732578063411a26381461075b57610394565b80633897437d1161027a5780633897437d14610671578063395093511461068857806339c999bf146106c55780633bd1a144146106f057610394565b80632f2ff15d146105f4578063313ce5671461061d57806336568abe1461064857610394565b80631a88f3061161030d57806323b872dd116102e757806323b872dd14610538578063248a9ca31461057557806326717d10146105b257806328f371aa146105c957610394565b80631a88f306146104cd5780631a8a933a146104f6578063216cfc6d1461050d57610394565b80630260f3e4146103cf57806306fdde03146103f85780630719fa6a14610423578063095ea7b31461044e57806315bf27571461048b57806318160ddd146104a257610394565b36610394577ff1b03f708b9c39f453fe3f0cef84164c7d6f7df836df0796e1e9c2bce6ee397e333460405161038a929190614acb565b60405180910390a1005b7fe278b0fa22a3a7f750416b6434935cd5e35b37e34a8859b84d5ddb2118753d1333346040516103c5929190614acb565b60405180910390a1005b3480156103db57600080fd5b506103f660048036038101906103f19190614393565b610d4e565b005b34801561040457600080fd5b5061040d610e2d565b60405161041a9190614b2a565b60405180910390f35b34801561042f57600080fd5b50610438610ebf565b6040516104459190614af4565b60405180910390f35b34801561045a57600080fd5b5061047560048036038101906104709190614393565b610ed2565b6040516104829190614af4565b60405180910390f35b34801561049757600080fd5b506104a0610ef5565b005b3480156104ae57600080fd5b506104b7611196565b6040516104c49190614e8c565b60405180910390f35b3480156104d957600080fd5b506104f460048036038101906104ef91906142c0565b6111a0565b005b34801561050257600080fd5b5061050b61134c565b005b34801561051957600080fd5b50610522611516565b60405161052f9190614af4565b60405180910390f35b34801561054457600080fd5b5061055f600480360381019061055a9190614340565b611554565b60405161056c9190614af4565b60405180910390f35b34801561058157600080fd5b5061059c60048036038101906105979190614400565b611583565b6040516105a99190614b0f565b60405180910390f35b3480156105be57600080fd5b506105c76115a2565b005b3480156105d557600080fd5b506105de611879565b6040516105eb9190614af4565b60405180910390f35b34801561060057600080fd5b5061061b6004803603810190610616919061442d565b611a17565b005b34801561062957600080fd5b50610632611a38565b60405161063f9190614ea7565b60405180910390f35b34801561065457600080fd5b5061066f600480360381019061066a919061442d565b611a41565b005b34801561067d57600080fd5b50610686611ac4565b005b34801561069457600080fd5b506106af60048036038101906106aa9190614393565b611adc565b6040516106bc9190614af4565b60405180910390f35b3480156106d157600080fd5b506106da611b13565b6040516106e79190614e8c565b60405180910390f35b3480156106fc57600080fd5b50610705611ea4565b6040516107129190614e8c565b60405180910390f35b34801561072757600080fd5b50610730611ebc565b005b34801561073e57600080fd5b5061075960048036038101906107549190614393565b611f36565b005b34801561076757600080fd5b50610782600480360381019061077d9190614393565b612003565b005b34801561079057600080fd5b506107ab60048036038101906107a691906144ad565b612133565b005b3480156107b957600080fd5b506107d460048036038101906107cf9190614293565b612147565b005b3480156107e257600080fd5b506107eb612161565b005b3480156107f957600080fd5b50610814600480360381019061080f91906144ad565b612179565b005b34801561082257600080fd5b5061083d60048036038101906108389190614293565b61222b565b60405161084a9190614af4565b60405180910390f35b34801561085f57600080fd5b50610868612281565b6040516108759190614b0f565b60405180910390f35b34801561088a57600080fd5b506108a560048036038101906108a091906144ad565b6122a5565b005b3480156108b357600080fd5b506108bc612304565b6040516108c99190614af4565b60405180910390f35b3480156108de57600080fd5b506108e761231b565b6040516108f49190614af4565b60405180910390f35b34801561090957600080fd5b50610924600480360381019061091f9190614293565b61232a565b6040516109319190614e8c565b60405180910390f35b34801561094657600080fd5b5061094f612373565b60405161095c9190614e8c565b60405180910390f35b34801561097157600080fd5b5061098c60048036038101906109879190614393565b61237d565b005b34801561099a57600080fd5b506109a361239d565b005b3480156109b157600080fd5b506109ba612417565b6040516109c79190614e8c565b60405180910390f35b3480156109dc57600080fd5b506109f760048036038101906109f2919061446d565b612434565b604051610a049190614a19565b60405180910390f35b348015610a1957600080fd5b50610a346004803603810190610a2f919061442d565b612463565b604051610a419190614af4565b60405180910390f35b348015610a5657600080fd5b50610a5f6124cd565b604051610a6c9190614b2a565b60405180910390f35b348015610a8157600080fd5b50610a8a61255f565b604051610a979190614b0f565b60405180910390f35b348015610aac57600080fd5b50610ac76004803603810190610ac29190614507565b612566565b604051610ad49190614af4565b60405180910390f35b348015610ae957600080fd5b50610b046004803603810190610aff9190614393565b612588565b604051610b119190614af4565b60405180910390f35b348015610b2657600080fd5b50610b416004803603810190610b3c9190614393565b6125ff565b604051610b4e9190614af4565b60405180910390f35b348015610b6357600080fd5b50610b6c612622565b604051610b799190614e8c565b60405180910390f35b348015610b8e57600080fd5b50610ba96004803603810190610ba49190614400565b61263a565b604051610bb69190614e8c565b60405180910390f35b348015610bcb57600080fd5b50610bd461265e565b604051610be19190614b0f565b60405180910390f35b348015610bf657600080fd5b50610c116004803603810190610c0c919061442d565b612682565b005b348015610c1f57600080fd5b50610c286127cc565b005b348015610c3657600080fd5b50610c516004803603810190610c4c9190614300565b6129d8565b604051610c5e9190614e8c565b60405180910390f35b348015610c7357600080fd5b50610c7c612a5f565b604051610c899190614b0f565b60405180910390f35b348015610c9e57600080fd5b50610cb96004803603810190610cb49190614293565b612a83565b005b348015610cc757600080fd5b50610ce26004803603810190610cdd91906144ad565b612a9d565b604051610cf193929190614a94565b60405180910390f35b348015610d0657600080fd5b50610d0f612afa565b604051610d1c9190614e8c565b60405180910390f35b348015610d3157600080fd5b50610d4c6004803603810190610d4791906144ad565b612c91565b005b6000801b610d5b81612e00565b610d63611879565b610da2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9990614c0c565b60405180910390fd5b60008210158015610db35750600282105b15610e285782600c8360028110610dcd57610dcc6151f0565b5b6002020160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610e1f6000801b84612e14565b610e27612e60565b5b505050565b606060078054610e3c90615102565b80601f0160208091040260200160405190810160405280929190818152602001828054610e6890615102565b8015610eb55780601f10610e8a57610100808354040283529160200191610eb5565b820191906000526020600020905b815481529060010190602001808311610e9857829003601f168201915b5050505050905090565b600260009054906101000a900460ff1681565b600080610edd612ecc565b9050610eea818585612ed4565b600191505092915050565b6000801b610f0281612e00565b610f0a612ecc565b73ffffffffffffffffffffffffffffffffffffffff16600c600060028110610f3557610f346151f0565b5b6002020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480610fed5750610f82612ecc565b73ffffffffffffffffffffffffffffffffffffffff16600c600160028110610fad57610fac6151f0565b5b6002020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b61102c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102390614cac565b60405180910390fd5b611034612ecc565b73ffffffffffffffffffffffffffffffffffffffff16600c60006002811061105f5761105e6151f0565b5b6002020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156110fe576001600c6000600281106110ba576110b96151f0565b5b6002020160000160146101000a81548160ff02191690831515021790555042600c6000600281106110ee576110ed6151f0565b5b6002020160010181905550611155565b6001600c600160028110611115576111146151f0565b5b6002020160000160146101000a81548160ff02191690831515021790555042600c600160028110611149576111486151f0565b5b60020201600101819055505b7f354991f7d45d86476385f270a4e6068d2312b16787116b0b307d587687a8130d61117e612ecc565b60405161118b9190614a19565b60405180910390a150565b6000600654905090565b6000801b6111ad81612e00565b60003073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016111e89190614a19565b60206040518083038186803b15801561120057600080fd5b505afa158015611214573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061123891906144da565b90508083111561127d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127490614d2c565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85856040518363ffffffff1660e01b81526004016112b8929190614a34565b602060405180830381600087803b1580156112d257600080fd5b505af11580156112e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130a91906143d3565b507ffda3a3e0e1479b43cb1c701f7576187f4c4ad80768d627387e00184302f7d88e30858560405161133e93929190614a5d565b60405180910390a150505050565b7f72f147522acf4a21c7234c54cded1d238cc4bd9f48e5e7bc9ac78f0968197ec261137681612e00565b601060006002811061138b5761138a6151f0565b5b6002020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166113d1612ecc565b73ffffffffffffffffffffffffffffffffffffffff1614156114275760006010600060028110611404576114036151f0565b5b6002020160000160146101000a81548160ff0219169083151502179055506114d5565b601060016002811061143c5761143b6151f0565b5b6002020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611482612ecc565b73ffffffffffffffffffffffffffffffffffffffff1614156114d457600060106001600281106114b5576114b46151f0565b5b6002020160000160146101000a81548160ff0219169083151502179055505b5b7ff74e875e995b8c58f45bc239f052082f02f6b94385ea51551436baf352f56eea6114fe612ecc565b60405161150b9190614a19565b60405180910390a150565b60008060001b61152581612e00565b600061152f612afa565b905060008111801561154d57506015548161154a9190614ee9565b42115b9250505090565b60008061155f612ecc565b905061156c85828561309f565b61157785858561312b565b60019150509392505050565b6000806000838152602001908152602001600020600101549050919050565b6000801b6115af81612e00565b6115b7612ecc565b73ffffffffffffffffffffffffffffffffffffffff16600c6000600281106115e2576115e16151f0565b5b6002020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148061169a575061162f612ecc565b73ffffffffffffffffffffffffffffffffffffffff16600c60016002811061165a576116596151f0565b5b6002020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b6116d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d090614cac565b60405180910390fd5b600c6000600281106116ee576116ed6151f0565b5b6002020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611734612ecc565b73ffffffffffffffffffffffffffffffffffffffff16141561178a576000600c600060028110611767576117666151f0565b5b6002020160000160146101000a81548160ff021916908315150217905550611838565b600c60016002811061179f5761179e6151f0565b5b6002020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166117e5612ecc565b73ffffffffffffffffffffffffffffffffffffffff161415611837576000600c600160028110611818576118176151f0565b5b6002020160000160146101000a81548160ff0219169083151502179055505b5b7f0af94ac8780910f602d90cd22fe7df04e6e70290b6a72200ba5b146577fe5490611861612ecc565b60405161186e9190614a19565b60405180910390a150565b60008060001b61188881612e00565b600c60006002811061189d5761189c6151f0565b5b6002020160000160149054906101000a900460ff1615801561192d57506118c2612ecc565b73ffffffffffffffffffffffffffffffffffffffff16600c6001600281106118ed576118ec6151f0565b5b6002020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b806119d95750600c600160028110611948576119476151f0565b5b6002020160000160149054906101000a900460ff161580156119d8575061196d612ecc565b73ffffffffffffffffffffffffffffffffffffffff16600c600060028110611998576119976151f0565b5b6002020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b5b156119e75760009150611a13565b60006119f1611b13565b9050600081118015611a0f575060145481611a0c9190614ee9565b42115b9250505b5090565b611a2082611583565b611a2981612e00565b611a338383612e14565b505050565b60006012905090565b611a49612ecc565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611ab6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aad90614e4c565b60405180910390fd5b611ac08282613495565b5050565b6000801b611ad181612e00565b611ad96134e1565b50565b600080611ae7612ecc565b9050611b08818585611af985896129d8565b611b039190614ee9565b612ed4565b600191505092915050565b60008060001b611b2281612e00565b600c600060028110611b3757611b366151f0565b5b6002020160000160149054906101000a900460ff168015611bc75750611b5b612ecc565b73ffffffffffffffffffffffffffffffffffffffff16600c600060028110611b8657611b856151f0565b5b6002020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b8015611c745750600c600160028110611be357611be26151f0565b5b6002020160000160149054906101000a900460ff168015611c735750611c07612ecc565b73ffffffffffffffffffffffffffffffffffffffff16600c600160028110611c3257611c316151f0565b5b6002020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b5b15611cff57600c600160028110611c8e57611c8d6151f0565b5b6002020160010154600c600060028110611cab57611caa6151f0565b5b600202016001015411611cda57600c600060028110611ccd57611ccc6151f0565b5b6002020160010154611cf8565b600c600160028110611cef57611cee6151f0565b5b60020201600101545b9150611ea0565b600c600060028110611d1457611d136151f0565b5b6002020160000160149054906101000a900460ff168015611da45750611d38612ecc565b73ffffffffffffffffffffffffffffffffffffffff16600c600060028110611d6357611d626151f0565b5b6002020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b15611dcd57600c600060028110611dbe57611dbd6151f0565b5b60020201600101549150611ea0565b600c600160028110611de257611de16151f0565b5b6002020160000160149054906101000a900460ff168015611e725750611e06612ecc565b73ffffffffffffffffffffffffffffffffffffffff16600c600160028110611e3157611e306151f0565b5b6002020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b15611e9b57600c600160028110611e8c57611e8b6151f0565b5b60020201600101549150611ea0565b600091505b5090565b60008060001b611eb381612e00565b60145491505090565b611eed7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a611ee8612ecc565b612463565b611f2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2390614c2c565b60405180910390fd5b611f346134fe565b565b611f677f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6611f62612ecc565b612463565b611fa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9d90614c8c565b60405180910390fd5b611fae611516565b611fed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe490614dac565b60405180910390fd5b611ff56135a0565b611fff828261360c565b5050565b6000801b61201081612e00565b612018611879565b612057576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204e90614c0c565b60405180910390fd5b600082101580156120685750600282105b1561212e578260108360028110612082576120816151f0565b5b6002020160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000601083600281106120dd576120dc6151f0565b5b6002020160000160146101000a81548160ff0219169083151502179055506121257f72f147522acf4a21c7234c54cded1d238cc4bd9f48e5e7bc9ac78f0968197ec284612e14565b61212d612e60565b5b505050565b61214461213e612ecc565b8261376d565b50565b6000801b61215481612e00565b61215d82613946565b5050565b6000801b61216e81612e00565b6121766139a1565b50565b6000801b61218681612e00565b6000821415801561219b575061219a611879565b5b6121da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d190614c0c565b60405180910390fd5b606482111561221e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221590614bec565b60405180910390fd5b612227826139be565b5050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b7f72f147522acf4a21c7234c54cded1d238cc4bd9f48e5e7bc9ac78f0968197ec281565b6000801b6122b281612e00565b6122ba611879565b6122f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f090614e0c565b60405180910390fd5b816015819055505050565b6000600b60019054906101000a900460ff16905090565b60006123256139c8565b905090565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600a54905090565b61238f82612389612ecc565b8361309f565b612399828261376d565b5050565b6123ce7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6123c9612ecc565b612463565b61240d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240490614bcc565b60405180910390fd5b6124156139df565b565b60008060001b61242681612e00565b61242e613a82565b91505090565b600061245b8260016000868152602001908152602001600020613a8c90919063ffffffff16565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6060600880546124dc90615102565b80601f016020809104026020016040519081016040528092919081815260200182805461250890615102565b80156125555780601f1061252a57610100808354040283529160200191612555565b820191906000526020600020905b81548152906001019060200180831161253857829003601f168201915b5050505050905090565b6000801b81565b60008060001b61257581612e00565b61257f8484613aa6565b91505092915050565b600080612593612ecc565b905060006125a182866129d8565b9050838110156125e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125dd90614d0c565b60405180910390fd5b6125f38286868403612ed4565b60019250505092915050565b60008061260a612ecc565b905061261781858561312b565b600191505092915050565b60008060001b61263181612e00565b60155491505090565b600061265760016000848152602001908152602001600020613b66565b9050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b6000801b61268f81612e00565b612697611879565b8061277e57508173ffffffffffffffffffffffffffffffffffffffff16600c6000600281106126c9576126c86151f0565b5b6002020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415801561277d57508173ffffffffffffffffffffffffffffffffffffffff16600c60016002811061273c5761273b6151f0565b5b6002020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b5b6127bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b490614dcc565b60405180910390fd5b6127c78383613495565b505050565b7f72f147522acf4a21c7234c54cded1d238cc4bd9f48e5e7bc9ac78f0968197ec26127f681612e00565b601060006002811061280b5761280a6151f0565b5b6002020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612851612ecc565b73ffffffffffffffffffffffffffffffffffffffff1614156128c85760016010600060028110612884576128836151f0565b5b6002020160000160146101000a81548160ff0219169083151502179055504260106000600281106128b8576128b76151f0565b5b6002020160010181905550612997565b60106001600281106128dd576128dc6151f0565b5b6002020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612923612ecc565b73ffffffffffffffffffffffffffffffffffffffff1614156129965760016010600160028110612956576129556151f0565b5b6002020160000160146101000a81548160ff02191690831515021790555042601060016002811061298a576129896151f0565b5b60020201600101819055505b5b7fb6b0e3ceb3ec2d9414036579e6b47aa468ad88799888c775b31e0b4db285c8ac6129c0612ecc565b6040516129cd9190614a19565b60405180910390a150565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b6000801b612a9081612e00565b612a9982613b7b565b5050565b60108160028110612aad57600080fd5b600202016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060000160149054906101000a900460ff16908060010154905083565b60006010600060028110612b1157612b106151f0565b5b6002020160000160149054906101000a900460ff168015612b5857506010600160028110612b4257612b416151f0565b5b6002020160000160149054906101000a900460ff165b15612be3576010600160028110612b7257612b716151f0565b5b60020201600101546010600060028110612b8f57612b8e6151f0565b5b600202016001015411612bbe576010600060028110612bb157612bb06151f0565b5b6002020160010154612bdc565b6010600160028110612bd357612bd26151f0565b5b60020201600101545b9050612c8e565b6010600060028110612bf857612bf76151f0565b5b6002020160000160149054906101000a900460ff1615612c36576010600060028110612c2757612c266151f0565b5b60020201600101549050612c8e565b6010600160028110612c4b57612c4a6151f0565b5b6002020160000160149054906101000a900460ff1615612c89576010600160028110612c7a57612c796151f0565b5b60020201600101549050612c8e565b600090505b90565b6000801b612c9e81612e00565b612ca6611879565b612ce5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cdc90614e0c565b60405180910390fd5b816014819055505050565b612cfa8282612463565b612dcc57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612d71612ecc565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000612df8836000018373ffffffffffffffffffffffffffffffffffffffff1660001b613bd6565b905092915050565b612e1181612e0c612ecc565b613c46565b50565b612e1e8282612cf0565b612e438160016000858152602001908152602001600020612dd090919063ffffffff16565b600260006101000a81548160ff0219169083151502179055505050565b6000600c600060028110612e7757612e766151f0565b5b6002020160000160146101000a81548160ff0219169083151502179055506000600c600160028110612eac57612eab6151f0565b5b6002020160000160146101000a81548160ff021916908315150217905550565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612f44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f3b90614d4c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612fb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fab90614c6c565b60405180910390fd5b80600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516130929190614e8c565b60405180910390a3505050565b60006130ab84846129d8565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146131255781811015613117576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161310e90614d8c565b60405180910390fd5b6131248484848403612ed4565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561319b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319290614b4c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561320b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161320290614ccc565b60405180910390fd5b600081905060008060019050600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806132b85750600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156132c257600090505b600b60009054906101000a900460ff161580156132dc5750805b1561330c576064600954856132f19190614f70565b6132fb9190614f3f565b915081836133099190614fca565b92505b613317868685613ce3565b60006133228761232a565b905084811015613367576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335e90614dec565b60405180910390fd5b82600a60008282546133799190614ee9565b92505081905550848103600360008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555083600360008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546134159190614ee9565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516134799190614e8c565b60405180910390a361348c878786613cf3565b50505050505050565b61349f8282613cf8565b6134c48160016000858152602001908152602001600020613dd990919063ffffffff16565b600260006101000a81548160ff0219169083151502179055505050565b6000600b60006101000a81548160ff021916908315150217905550565b613506612304565b613545576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161353c90614bac565b60405180910390fd5b6000600b60016101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa613589612ecc565b6040516135969190614a19565b60405180910390a1565b600060106000600281106135b7576135b66151f0565b5b6002020160000160146101000a81548160ff021916908315150217905550600060106001600281106135ec576135eb6151f0565b5b6002020160000160146101000a81548160ff021916908315150217905550565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561367c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161367390614b8c565b60405180910390fd5b61368860008383613ce3565b806006600082825461369a9190614ee9565b9250508190555080600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546136f09190614ee9565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516137559190614e8c565b60405180910390a361376960008383613cf3565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156137dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137d490614e2c565b60405180910390fd5b6137e982600083613ce3565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015613870576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161386790614c4c565b60405180910390fd5b818103600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600660008282546138c89190614fca565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161392d9190614e8c565b60405180910390a361394183600084613cf3565b505050565b6001600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6001600b60006101000a81548160ff021916908315150217905550565b8060098190555050565b6000600b60009054906101000a900460ff16905090565b6139e7612304565b15613a27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a1e90614cec565b60405180910390fd5b6001600b60016101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258613a6b612ecc565b604051613a789190614a19565b60405180910390a1565b6000600954905090565b6000613a9b8360000183613e09565b60001c905092915050565b600082600a541015613aed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ae490614d6c565b60405180910390fd5b82600a6000828254613aff9190614fca565b9250508190555082600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613b559190614ee9565b925050819055506001905092915050565b6000613b7482600001613e34565b9050919050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000613be28383613e45565b613c3b578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050613c40565b600090505b92915050565b613c508282612463565b613cdf57613c758173ffffffffffffffffffffffffffffffffffffffff166014613e68565b613c838360001c6020613e68565b604051602001613c949291906149df565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613cd69190614b2a565b60405180910390fd5b5050565b613cee8383836140a4565b505050565b505050565b613d028282612463565b15613dd557600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550613d7a612ecc565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000613e01836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6140fc565b905092915050565b6000826000018281548110613e2157613e206151f0565b5b9060005260206000200154905092915050565b600081600001805490509050919050565b600080836001016000848152602001908152602001600020541415905092915050565b606060006002836002613e7b9190614f70565b613e859190614ee9565b67ffffffffffffffff811115613e9e57613e9d61521f565b5b6040519080825280601f01601f191660200182016040528015613ed05781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110613f0857613f076151f0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110613f6c57613f6b6151f0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002613fac9190614f70565b613fb69190614ee9565b90505b6001811115614056577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110613ff857613ff76151f0565b5b1a60f81b82828151811061400f5761400e6151f0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061404f906150d8565b9050613fb9565b506000841461409a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161409190614b6c565b60405180910390fd5b8091505092915050565b6140af838383614210565b6140b7612304565b156140f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016140ee90614e6c565b60405180910390fd5b505050565b6000808360010160008481526020019081526020016000205490506000811461420457600060018261412e9190614fca565b90506000600186600001805490506141469190614fca565b90508181146141b5576000866000018281548110614167576141666151f0565b5b906000526020600020015490508087600001848154811061418b5761418a6151f0565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b856000018054806141c9576141c86151c1565b5b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061420a565b60009150505b92915050565b505050565b600081359050614224816159b2565b92915050565b600081359050614239816159c9565b92915050565b60008151905061424e816159e0565b92915050565b600081359050614263816159f7565b92915050565b60008135905061427881615a0e565b92915050565b60008151905061428d81615a0e565b92915050565b6000602082840312156142a9576142a861524e565b5b60006142b784828501614215565b91505092915050565b600080604083850312156142d7576142d661524e565b5b60006142e58582860161422a565b92505060206142f685828601614269565b9150509250929050565b600080604083850312156143175761431661524e565b5b600061432585828601614215565b925050602061433685828601614215565b9150509250929050565b6000806000606084860312156143595761435861524e565b5b600061436786828701614215565b935050602061437886828701614215565b925050604061438986828701614269565b9150509250925092565b600080604083850312156143aa576143a961524e565b5b60006143b885828601614215565b92505060206143c985828601614269565b9150509250929050565b6000602082840312156143e9576143e861524e565b5b60006143f78482850161423f565b91505092915050565b6000602082840312156144165761441561524e565b5b600061442484828501614254565b91505092915050565b600080604083850312156144445761444361524e565b5b600061445285828601614254565b925050602061446385828601614215565b9150509250929050565b600080604083850312156144845761448361524e565b5b600061449285828601614254565b92505060206144a385828601614269565b9150509250929050565b6000602082840312156144c3576144c261524e565b5b60006144d184828501614269565b91505092915050565b6000602082840312156144f0576144ef61524e565b5b60006144fe8482850161427e565b91505092915050565b6000806040838503121561451e5761451d61524e565b5b600061452c85828601614269565b925050602061453d85828601614215565b9150509250929050565b6145508161506f565b82525050565b61455f81614ffe565b82525050565b61456e81615022565b82525050565b61457d8161502e565b82525050565b600061458e82614ec2565b6145988185614ecd565b93506145a88185602086016150a5565b6145b181615253565b840191505092915050565b60006145c782614ec2565b6145d18185614ede565b93506145e18185602086016150a5565b80840191505092915050565b60006145fa602683614ecd565b915061460582615264565b604082019050919050565b600061461d602083614ecd565b9150614628826152b3565b602082019050919050565b6000614640602083614ecd565b915061464b826152dc565b602082019050919050565b6000614663601483614ecd565b915061466e82615305565b602082019050919050565b6000614686602683614ecd565b91506146918261532e565b604082019050919050565b60006146a9602783614ecd565b91506146b48261537d565b604082019050919050565b60006146cc601d83614ecd565b91506146d7826153cc565b602082019050919050565b60006146ef602883614ecd565b91506146fa826153f5565b604082019050919050565b6000614712602383614ecd565b915061471d82615444565b604082019050919050565b6000614735602383614ecd565b915061474082615493565b604082019050919050565b6000614758602583614ecd565b9150614763826154e2565b604082019050919050565b600061477b602f83614ecd565b915061478682615531565b604082019050919050565b600061479e602583614ecd565b91506147a982615580565b604082019050919050565b60006147c1601083614ecd565b91506147cc826155cf565b602082019050919050565b60006147e4602683614ecd565b91506147ef826155f8565b604082019050919050565b6000614807603583614ecd565b915061481282615647565b604082019050919050565b600061482a602583614ecd565b915061483582615696565b604082019050919050565b600061484d603083614ecd565b9150614858826156e5565b604082019050919050565b6000614870601e83614ecd565b915061487b82615734565b602082019050919050565b6000614893602883614ecd565b915061489e8261575d565b604082019050919050565b60006148b6603083614ecd565b91506148c1826157ac565b604082019050919050565b60006148d9602783614ecd565b91506148e4826157fb565b604082019050919050565b60006148fc601e83614ecd565b91506149078261584a565b602082019050919050565b600061491f602283614ecd565b915061492a82615873565b604082019050919050565b6000614942601783614ede565b915061494d826158c2565b601782019050919050565b6000614965601183614ede565b9150614970826158eb565b601182019050919050565b6000614988602f83614ecd565b915061499382615914565b604082019050919050565b60006149ab602a83614ecd565b91506149b682615963565b604082019050919050565b6149ca81615058565b82525050565b6149d981615062565b82525050565b60006149ea82614935565b91506149f682856145bc565b9150614a0182614958565b9150614a0d82846145bc565b91508190509392505050565b6000602082019050614a2e6000830184614556565b92915050565b6000604082019050614a496000830185614547565b614a5660208301846149c1565b9392505050565b6000606082019050614a726000830186614556565b614a7f6020830185614547565b614a8c60408301846149c1565b949350505050565b6000606082019050614aa96000830186614556565b614ab66020830185614565565b614ac360408301846149c1565b949350505050565b6000604082019050614ae06000830185614556565b614aed60208301846149c1565b9392505050565b6000602082019050614b096000830184614565565b92915050565b6000602082019050614b246000830184614574565b92915050565b60006020820190508181036000830152614b448184614583565b905092915050565b60006020820190508181036000830152614b65816145ed565b9050919050565b60006020820190508181036000830152614b8581614610565b9050919050565b60006020820190508181036000830152614ba581614633565b9050919050565b60006020820190508181036000830152614bc581614656565b9050919050565b60006020820190508181036000830152614be581614679565b9050919050565b60006020820190508181036000830152614c058161469c565b9050919050565b60006020820190508181036000830152614c25816146bf565b9050919050565b60006020820190508181036000830152614c45816146e2565b9050919050565b60006020820190508181036000830152614c6581614705565b9050919050565b60006020820190508181036000830152614c8581614728565b9050919050565b60006020820190508181036000830152614ca58161474b565b9050919050565b60006020820190508181036000830152614cc58161476e565b9050919050565b60006020820190508181036000830152614ce581614791565b9050919050565b60006020820190508181036000830152614d05816147b4565b9050919050565b60006020820190508181036000830152614d25816147d7565b9050919050565b60006020820190508181036000830152614d45816147fa565b9050919050565b60006020820190508181036000830152614d658161481d565b9050919050565b60006020820190508181036000830152614d8581614840565b9050919050565b60006020820190508181036000830152614da581614863565b9050919050565b60006020820190508181036000830152614dc581614886565b9050919050565b60006020820190508181036000830152614de5816148a9565b9050919050565b60006020820190508181036000830152614e05816148cc565b9050919050565b60006020820190508181036000830152614e25816148ef565b9050919050565b60006020820190508181036000830152614e4581614912565b9050919050565b60006020820190508181036000830152614e658161497b565b9050919050565b60006020820190508181036000830152614e858161499e565b9050919050565b6000602082019050614ea160008301846149c1565b92915050565b6000602082019050614ebc60008301846149d0565b92915050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b6000614ef482615058565b9150614eff83615058565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614f3457614f33615134565b5b828201905092915050565b6000614f4a82615058565b9150614f5583615058565b925082614f6557614f64615163565b5b828204905092915050565b6000614f7b82615058565b9150614f8683615058565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614fbf57614fbe615134565b5b828202905092915050565b6000614fd582615058565b9150614fe083615058565b925082821015614ff357614ff2615134565b5b828203905092915050565b600061500982615038565b9050919050565b600061501b82615038565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b600061507a82615081565b9050919050565b600061508c82615093565b9050919050565b600061509e82615038565b9050919050565b60005b838110156150c35780820151818401526020810190506150a8565b838111156150d2576000848401525b50505050565b60006150e382615058565b915060008214156150f7576150f6615134565b5b600182039050919050565b6000600282049050600182168061511a57607f821691505b6020821081141561512e5761512d615192565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b6000601f19601f8301169050919050565b7f5370694578743a207472616e736665722066726f6d20746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f5370694578743a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f5350494578743a206d75737420686176652070617573657220726f6c6520746f60008201527f2070617573650000000000000000000000000000000000000000000000000000602082015250565b7f5350494578743a205472616e73666572204665652063616e6e6f74206578636560008201527f6564203130302500000000000000000000000000000000000000000000000000602082015250565b7f5350494578743a204163746976697479206e6f7420617070726f766564000000600082015250565b7f5350494578743a206d75737420686176652070617573657220726f6c6520746f60008201527f20756e7061757365000000000000000000000000000000000000000000000000602082015250565b7f5370694578743a206275726e20616d6f756e7420657863656564732062616c6160008201527f6e63650000000000000000000000000000000000000000000000000000000000602082015250565b7f5370694578743a20617070726f766520746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f5350494578743a206d7573742068617665206d696e74657220726f6c6520746f60008201527f206d696e74000000000000000000000000000000000000000000000000000000602082015250565b7f5350494578743a206e6f7420656e6f756768207065726d697373696f6e20666f60008201527f7220746865206f7065726174696f6e0000000000000000000000000000000000602082015250565b7f5370694578743a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737331000000000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f5370694578743a2064656372656173656420616c6c6f77616e63652062656c6f60008201527f77207a65726f0000000000000000000000000000000000000000000000000000602082015250565b7f5350494578743a2062616c616e6365206973206e6f742073756666696369656e60008201527f7420666f7220746865207472616e73616374696f6e0000000000000000000000602082015250565b7f5370694578743a20617070726f76652066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f5350494578743a20616d6f756e742073686f756c64206265206c6f776572207460008201527f68616e20706f6f6c2062616c616e636500000000000000000000000000000000602082015250565b7f5370694578743a20696e73756666696369656e7420616c6c6f77616e63650000600082015250565b7f5370694578743a204d696e74696e67206e6f7420617070726f7665642062792060008201527f617070726f766572000000000000000000000000000000000000000000000000602082015250565b7f5350494578743a20526f6c65206368616e676520666f7220737570657220616460008201527f6d696e206e6f7420617070726f76656400000000000000000000000000000000602082015250565b7f5370694578743a207472616e7366657220616d6f756e7420657863656564732060008201527f62616c616e636500000000000000000000000000000000000000000000000000602082015250565b7f5350494578743a20416374696f6e206973206e6f7420617070726f7665640000600082015250565b7f5370694578743a206275726e2066726f6d20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b7f45524332305061757361626c653a20746f6b656e207472616e7366657220776860008201527f696c652070617573656400000000000000000000000000000000000000000000602082015250565b6159bb81614ffe565b81146159c657600080fd5b50565b6159d281615010565b81146159dd57600080fd5b50565b6159e981615022565b81146159f457600080fd5b50565b615a008161502e565b8114615a0b57600080fd5b50565b615a1781615058565b8114615a2257600080fd5b5056fea2646970667358221220f8de59a9953b1bb8d26100e10ead3378f8d496da94f9b5fe87a43dc532dd89b164736f6c63430008070033

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

00000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000006a4518ade8d4f10df01272135ca802b9396eccba000000000000000000000000192438d3ca981c1ca2b3efce215716cdcc40d7e50000000000000000000000006fca195293ec55921188bf2f05b4c73b60fd29d500000000000000000000000025c4885e3bb3af119ddeb44df7d94bea193b1bff000000000000000000000000000000000000000000000000000000000000000453484f500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000052053484f50000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): SHOP
Arg [1] : symbol (string): SHOP
Arg [2] : adminApprover (address): 0x6A4518AdE8d4F10DF01272135ca802b9396eCCBa
Arg [3] : adminApprover2 (address): 0x192438D3CA981c1cA2b3efcE215716CDcC40D7E5
Arg [4] : mintApprover (address): 0x6FCa195293Ec55921188Bf2F05b4C73b60fD29D5
Arg [5] : mintApprover2 (address): 0x25C4885E3bb3aF119ddEb44df7D94beA193b1bFF

-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [2] : 0000000000000000000000006a4518ade8d4f10df01272135ca802b9396eccba
Arg [3] : 000000000000000000000000192438d3ca981c1ca2b3efce215716cdcc40d7e5
Arg [4] : 0000000000000000000000006fca195293ec55921188bf2f05b4c73b60fd29d5
Arg [5] : 00000000000000000000000025c4885e3bb3af119ddeb44df7d94bea193b1bff
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [7] : 53484f5000000000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [9] : 2053484f50000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

51584:11924:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53840:39;53857:10;53869:9;53840:39;;;;;;;:::i;:::-;;;;;;;;51584:11924;;53947:37;53962:10;53974:9;53947:37;;;;;;;:::i;:::-;;;;;;;;51584:11924;59921:404;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37874:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27906:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40225:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57318:602;;;;;;;;;;;;;:::i;:::-;;38994:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54000:365;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54859:372;;;;;;;;;;;;;:::i;:::-;;55756:259;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41006:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23843:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57928:552;;;;;;;;;;;;;:::i;:::-;;59275:496;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24236:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38836:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25288:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60861:110;;;;;;;;;;;;;:::i;:::-;;41710:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58488:779;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63244:127;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61676:161;;;;;;;;;;;;;:::i;:::-;;56815:301;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56167:448;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50925:91;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62070:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60747:106;;;;;;;;;;;;;:::i;:::-;;60460:275;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49315:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51811:73;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63047:189;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30813:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60979:110;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39165:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48663:115;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51335:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61303:155;;;;;;;;;;;;;:::i;:::-;;60333:119;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28646:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22303:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38093:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21682:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62666:165;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42451:437;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39498:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63380:125;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28975:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51673:62;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62326:332;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54378:473;;;;;;;;;;;;;:::i;:::-;;39754:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51742:62;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62202:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51936:32;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;55239:509;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62839:199;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59921:404;21727:4;60001:18;;22175:16;22186:4;22175:10;:16::i;:::-;60040:12:::1;:10;:12::i;:::-;60032:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;60108:1;60101:5;:8;;:40;;;;;60120:21;60113:5;:28;60101:40;60098:220;;;60198:14;60158;60173:5;60158:21;;;;;;;:::i;:::-;;;;;:37;;;:54;;;;;;;;;;;;;;;;;;60227:46;21727:4;60238:18:::0;::::1;60258:14;60227:10;:46::i;:::-;60288:18;:16;:18::i;:::-;60098:220;59921:404:::0;;;:::o;37874:100::-;37928:13;37961:5;37954:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37874:100;:::o;27906:28::-;;;;;;;;;;;;;:::o;40225:201::-;40308:4;40325:13;40341:12;:10;:12::i;:::-;40325:28;;40364:32;40373:5;40380:7;40389:6;40364:8;:32::i;:::-;40414:4;40407:11;;;40225:201;;;;:::o;57318:602::-;21727:4;57363:18;;22175:16;22186:4;22175:10;:16::i;:::-;57439:12:::1;:10;:12::i;:::-;57402:49;;:14;57417:1;57402:17;;;;;;;:::i;:::-;;;;;:33;;;;;;;;;;;;:49;;;:102;;;;57492:12;:10;:12::i;:::-;57455:49;;:14;57470:1;57455:17;;;;;;;:::i;:::-;;;;;:33;;;;;;;;;;;;:49;;;57402:102;57394:162;;;;;;;;;;;;:::i;:::-;;;;;;;;;57607:12;:10;:12::i;:::-;57570:49;;:14;57585:1;57570:17;;;;;;;:::i;:::-;;;;;:33;;;;;;;;;;;;:49;;;57567:300;;;57665:4;57636:14;57651:1;57636:17;;;;;;;:::i;:::-;;;;;:26;;;:33;;;;;;;;;;;;;;;;;;57714:15;57684:14;57699:1;57684:17;;;;;;;:::i;:::-;;;;;:27;;:45;;;;57567:300;;;57791:4;57762:14;57777:1;57762:17;;;;;;;:::i;:::-;;;;;:26;;;:33;;;;;;;;;;;;;;;;;;57840:15;57810:14;57825:1;57810:17;;;;;;;:::i;:::-;;;;;:27;;:45;;;;57567:300;57882:30;57899:12;:10;:12::i;:::-;57882:30;;;;;;:::i;:::-;;;;;;;;57318:602:::0;:::o;38994:108::-;39055:7;39082:12;;39075:19;;38994:108;:::o;54000:365::-;21727:4;54084:18;;22175:16;22186:4;22175:10;:16::i;:::-;54115:20:::1;54138:4;:14;;;54161:4;54138:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54115:52;;54196:12;54186:6;:22;;54178:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;54277:4;:13;;;54291:2;54295:6;54277:25;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;54318:39;54339:4;54346:2;54350:6;54318:39;;;;;;;;:::i;:::-;;;;;;;;54104:261;54000:365:::0;;;:::o;54859:372::-;51856:28;22175:16;22186:4;22175:10;:16::i;:::-;54958:13:::1;54972:1;54958:16;;;;;;;:::i;:::-;;;;;:32;;;;;;;;;;;;54942:48;;:12;:10;:12::i;:::-;:48;;;54938:233;;;55035:5;55007:13;55021:1;55007:16;;;;;;;:::i;:::-;;;;;:25;;;:33;;;;;;;;;;;;;;;;;;54938:233;;;55078:13;55092:1;55078:16;;;;;;;:::i;:::-;;;;;:32;;;;;;;;;;;;55062:48;;:12;:10;:12::i;:::-;:48;;;55058:113;;;55154:5;55126:13;55140:1;55126:16;;;;;;;:::i;:::-;;;;;:25;;;:33;;;;;;;;;;;;;;;;;;55058:113;54938:233;55187:36;55210:12;:10;:12::i;:::-;55187:36;;;;;;:::i;:::-;;;;;;;;54859:372:::0;:::o;55756:259::-;55831:4;21727;55803:18;;22175:16;22186:4;22175:10;:16::i;:::-;55848:29:::1;55880:26;:24;:26::i;:::-;55848:58;;55948:1;55924:21;:25;:83;;;;;55995:12;;55971:21;:36;;;;:::i;:::-;55953:15;:54;55924:83;55917:90;;;55756:259:::0;;:::o;41006:295::-;41137:4;41154:15;41172:12;:10;:12::i;:::-;41154:30;;41195:38;41211:4;41217:7;41226:6;41195:15;:38::i;:::-;41244:27;41254:4;41260:2;41264:6;41244:9;:27::i;:::-;41289:4;41282:11;;;41006:295;;;;;:::o;23843:131::-;23917:7;23944:6;:12;23951:4;23944:12;;;;;;;;;;;:22;;;23937:29;;23843:131;;;:::o;57928:552::-;21727:4;57977:18;;22175:16;22186:4;22175:10;:16::i;:::-;58053:12:::1;:10;:12::i;:::-;58016:49;;:14;58031:1;58016:17;;;;;;;:::i;:::-;;;;;:33;;;;;;;;;;;;:49;;;:102;;;;58106:12;:10;:12::i;:::-;58069:49;;:14;58084:1;58069:17;;;;;;;:::i;:::-;;;;;:33;;;;;;;;;;;;:49;;;58016:102;58008:162;;;;;;;;;;;;:::i;:::-;;;;;;;;;58201:14;58216:1;58201:17;;;;;;;:::i;:::-;;;;;:33;;;;;;;;;;;;58185:49;;:12;:10;:12::i;:::-;:49;;;58181:238;;;58280:5;58251:14;58266:1;58251:17;;;;;;;:::i;:::-;;;;;:26;;;:34;;;;;;;;;;;;;;;;;;58181:238;;;58323:14;58338:1;58323:17;;;;;;;:::i;:::-;;;;;:33;;;;;;;;;;;;58307:49;;:12;:10;:12::i;:::-;:49;;;58303:116;;;58402:5;58373:14;58388:1;58373:17;;;;;;;:::i;:::-;;;;;:26;;;:34;;;;;;;;;;;;;;;;;;58303:116;58181:238;58435:37;58459:12;:10;:12::i;:::-;58435:37;;;;;;:::i;:::-;;;;;;;;57928:552:::0;:::o;59275:496::-;59346:4;21727;59318:18;;22175:16;22186:4;22175:10;:16::i;:::-;59368:14:::1;59383:1;59368:17;;;;;;;:::i;:::-;;;;;:26;;;;;;;;;;;;59367:27;:80;;;;;59435:12;:10;:12::i;:::-;59398:49;;:14;59413:1;59398:17;;;;;;;:::i;:::-;;;;;:33;;;;;;;;;;;;:49;;;59367:80;59366:182;;;;59468:14;59483:1;59468:17;;;;;;;:::i;:::-;;;;;:26;;;;;;;;;;;;59467:27;:80;;;;;59535:12;:10;:12::i;:::-;59498:49;;:14;59513:1;59498:17;;;;;;;:::i;:::-;;;;;:33;;;;;;;;;;;;:49;;;59467:80;59366:182;59363:226;;;59572:5;59565:12;;;;59363:226;59599:30;59632:27;:25;:27::i;:::-;59599:60;;59702:1;59677:22;:26;:86;;;;;59750:13;;59725:22;:38;;;;:::i;:::-;59707:15;:56;59677:86;59670:93;;;22202:1;59275:496:::0;;:::o;24236:149::-;24321:18;24334:4;24321:12;:18::i;:::-;22175:16;22186:4;22175:10;:16::i;:::-;24352:25:::1;24363:4;24369:7;24352:10;:25::i;:::-;24236:149:::0;;;:::o;38836:93::-;38894:5;38919:2;38912:9;;38836:93;:::o;25288:218::-;25397:12;:10;:12::i;:::-;25386:23;;:7;:23;;;25378:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;25472:26;25484:4;25490:7;25472:11;:26::i;:::-;25288:218;;:::o;60861:110::-;21727:4;60907:18;;22175:16;22186:4;22175:10;:16::i;:::-;60938:21:::1;:19;:21::i;:::-;60861:110:::0;:::o;41710:238::-;41798:4;41815:13;41831:12;:10;:12::i;:::-;41815:28;;41854:64;41863:5;41870:7;41907:10;41879:25;41889:5;41896:7;41879:9;:25::i;:::-;:38;;;;:::i;:::-;41854:8;:64::i;:::-;41936:4;41929:11;;;41710:238;;;;:::o;58488:779::-;58574:7;21727:4;58546:18;;22175:16;22186:4;22175:10;:16::i;:::-;58598:14:::1;58613:1;58598:17;;;;;;;:::i;:::-;;;;;:26;;;;;;;;;;;;:79;;;;;58665:12;:10;:12::i;:::-;58628:49;;:14;58643:1;58628:17;;;;;;;:::i;:::-;;;;;:33;;;;;;;;;;;;:49;;;;58598:79;58597:180;;;;;58697:14;58712:1;58697:17;;;;;;;:::i;:::-;;;;;:26;;;;;;;;;;;;:79;;;;;58764:12;:10;:12::i;:::-;58727:49;;:14;58742:1;58727:17;;;;;;;:::i;:::-;;;;;:33;;;;;;;;;;;;:49;;;;58697:79;58597:180;58594:336;;;58831:14;58846:1;58831:17;;;;;;;:::i;:::-;;;;;:27;;;58801:14;58816:1;58801:17;;;;;;;:::i;:::-;;;;;:27;;;:57;:117;;58891:14;58906:1;58891:17;;;;;;;:::i;:::-;;;;;:27;;;58801:117;;;58861:14;58876:1;58861:17;;;;;;;:::i;:::-;;;;;:27;;;58801:117;58794:124;;;;58594:336;58944:14;58959:1;58944:17;;;;;;;:::i;:::-;;;;;:26;;;;;;;;;;;;:79;;;;;59011:12;:10;:12::i;:::-;58974:49;;:14;58989:1;58974:17;;;;;;;:::i;:::-;;;;;:33;;;;;;;;;;;;:49;;;;58944:79;58941:145;;;59047:14;59062:1;59047:17;;;;;;;:::i;:::-;;;;;:27;;;59040:34;;;;58941:145;59099:14;59114:1;59099:17;;;;;;;:::i;:::-;;;;;:26;;;;;;;;;;;;:79;;;;;59166:12;:10;:12::i;:::-;59129:49;;:14;59144:1;59129:17;;;;;;;:::i;:::-;;;;;:33;;;;;;;;;;;;:49;;;;59099:79;59096:145;;;59202:14;59217:1;59202:17;;;;;;;:::i;:::-;;;;;:27;;;59195:34;;;;59096:145;59258:1;59251:8;;22202:1;58488:779:::0;;:::o;63244:127::-;63323:7;21727:4;63295:18;;22175:16;22186:4;22175:10;:16::i;:::-;63350:13:::1;;63343:20;;63244:127:::0;;:::o;61676:161::-;61729:34;51780:24;61750:12;:10;:12::i;:::-;61729:7;:34::i;:::-;61721:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;61819:10;:8;:10::i;:::-;61676:161::o;56815:301::-;56891:34;51711:24;56912:12;:10;:12::i;:::-;56891:7;:34::i;:::-;56883:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;56986:16;:14;:16::i;:::-;56978:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;57058:22;:20;:22::i;:::-;57091:17;57097:2;57101:6;57091:5;:17::i;:::-;56815:301;;:::o;56167:448::-;21727:4;56242:18;;22175:16;22186:4;22175:10;:16::i;:::-;56281:12:::1;:10;:12::i;:::-;56273:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;56350:1;56341:5;:10;;:42;;;;;56363:20;56355:5;:28;56341:42;56338:269;;;56439:12;56400:13;56414:5;56400:20;;;;;;;:::i;:::-;;;;;:36;;;:51;;;;;;;;;;;;;;;;;;56498:5;56466:13;56480:5;56466:20;;;;;;;:::i;:::-;;;;;:29;;;:37;;;;;;;;;;;;;;;;;;56518:44;51856:28;56549:12;56518:10;:44::i;:::-;56577:18;:16;:18::i;:::-;56338:269;56167:448:::0;;;:::o;50925:91::-;50981:27;50987:12;:10;:12::i;:::-;51001:6;50981:5;:27::i;:::-;50925:91;:::o;62070:120::-;21727:4;62127:18;;22175:16;22186:4;22175:10;:16::i;:::-;62158:24:::1;62174:7;62158:15;:24::i;:::-;62070:120:::0;;:::o;60747:106::-;21727:4;60791:18;;22175:16;22186:4;22175:10;:16::i;:::-;60822:19:::1;:17;:19::i;:::-;60747:106:::0;:::o;60460:275::-;21727:4;60514:18;;22175:16;22186:4;22175:10;:16::i;:::-;60565:1:::1;60553:8;:13;;:29;;;;;60570:12;:10;:12::i;:::-;60553:29;60545:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;60648:3;60636:8;:15;;60628:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;60706:21;60718:8;60706:11;:21::i;:::-;60460:275:::0;;:::o;49315:123::-;49379:4;49403:18;:27;49422:7;49403:27;;;;;;;;;;;;;;;;;;;;;;;;;49396:34;;49315:123;;;:::o;51811:73::-;51856:28;51811:73;:::o;63047:189::-;21727:4;63108:18;;22175:16;22186:4;22175:10;:16::i;:::-;63147:12:::1;:10;:12::i;:::-;63139:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;63220:8;63205:12;:23;;;;63047:189:::0;;:::o;30813:86::-;30860:4;30884:7;;;;;;;;;;;30877:14;;30813:86;:::o;60979:110::-;61034:4;61058:23;:21;:23::i;:::-;61051:30;;60979:110;:::o;39165:127::-;39239:7;39266:9;:18;39276:7;39266:18;;;;;;;;;;;;;;;;39259:25;;39165:127;;;:::o;48663:115::-;48720:7;48747:23;;48740:30;;48663:115;:::o;51335:164::-;51412:46;51428:7;51437:12;:10;:12::i;:::-;51451:6;51412:15;:46::i;:::-;51469:22;51475:7;51484:6;51469:5;:22::i;:::-;51335:164;;:::o;61303:155::-;61354:34;51780:24;61375:12;:10;:12::i;:::-;61354:7;:34::i;:::-;61346:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;61442:8;:6;:8::i;:::-;61303:155::o;60333:119::-;60404:7;21727:4;60376:18;;22175:16;22186:4;22175:10;:16::i;:::-;60431:13:::1;:11;:13::i;:::-;60424:20;;60333:119:::0;;:::o;28646:155::-;28738:7;28765:28;28787:5;28765:12;:18;28778:4;28765:18;;;;;;;;;;;:21;;:28;;;;:::i;:::-;28758:35;;28646:155;;;;:::o;22303:147::-;22389:4;22413:6;:12;22420:4;22413:12;;;;;;;;;;;:20;;:29;22434:7;22413:29;;;;;;;;;;;;;;;;;;;;;;;;;22406:36;;22303:147;;;;:::o;38093:104::-;38149:13;38182:7;38175:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38093:104;:::o;21682:49::-;21727:4;21682:49;;;:::o;62666:165::-;62767:4;21727;62739:18;;22175:16;22186:4;22175:10;:16::i;:::-;62791:32:::1;62812:6;62820:2;62791:20;:32::i;:::-;62784:39;;62666:165:::0;;;;;:::o;42451:437::-;42544:4;42561:13;42577:12;:10;:12::i;:::-;42561:28;;42600:24;42627:25;42637:5;42644:7;42627:9;:25::i;:::-;42600:52;;42691:15;42671:16;:35;;42663:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;42785:60;42794:5;42801:7;42829:15;42810:16;:34;42785:8;:60::i;:::-;42876:4;42869:11;;;;42451:437;;;;:::o;39498:193::-;39577:4;39594:13;39610:12;:10;:12::i;:::-;39594:28;;39633;39643:5;39650:2;39654:6;39633:9;:28::i;:::-;39679:4;39672:11;;;39498:193;;;;:::o;63380:125::-;63458:7;21727:4;63430:18;;22175:16;22186:4;22175:10;:16::i;:::-;63485:12:::1;;63478:19;;63380:125:::0;;:::o;28975:144::-;29057:7;29084:27;:12;:18;29097:4;29084:18;;;;;;;;;;;:25;:27::i;:::-;29077:34;;28975:144;;;:::o;51673:62::-;51711:24;51673:62;:::o;62326:332::-;21727:4;62404:18;;22175:16;22186:4;22175:10;:16::i;:::-;62443:12:::1;:10;:12::i;:::-;:110;;;;62497:7;62460:44;;:14;62475:1;62460:17;;;;;;;:::i;:::-;;;;;:33;;;;;;;;;;;;:44;;;;:92;;;;;62545:7;62508:44;;:14;62523:1;62508:17;;;;;;;:::i;:::-;;;;;:33;;;;;;;;;;;;:44;;;;62460:92;62443:110;62435:171;;;;;;;;;;;;:::i;:::-;;;;;;;;;62618:32;62636:4;62642:7;62618:17;:32::i;:::-;62326:332:::0;;;:::o;54378:473::-;51856:28;22175:16;22186:4;22175:10;:16::i;:::-;54470:13:::1;54484:1;54470:16;;;;;;;:::i;:::-;;;;;:32;;;;;;;;;;;;54454:48;;:12;:10;:12::i;:::-;:48;;;54450:348;;;54547:4;54519:13;54533:1;54519:16;;;;;;;:::i;:::-;;;;;:25;;;:32;;;;;;;;;;;;;;;;;;54595:15;54566:13;54580:1;54566:16;;;;;;;:::i;:::-;;;;;:26;;:44;;;;54450:348;;;54648:13;54662:1;54648:16;;;;;;;:::i;:::-;;;;;:32;;;;;;;;;;;;54632:48;;:12;:10;:12::i;:::-;:48;;;54628:170;;;54724:4;54696:13;54710:1;54696:16;;;;;;;:::i;:::-;;;;;:25;;;:32;;;;;;;;;;;;;;;;;;54771:15;54742:13;54756:1;54742:16;;;;;;;:::i;:::-;;;;;:26;;:44;;;;54628:170;54450:348;54814:29;54830:12;:10;:12::i;:::-;54814:29;;;;;;:::i;:::-;;;;;;;;54378:473:::0;:::o;39754:151::-;39843:7;39870:11;:18;39882:5;39870:18;;;;;;;;;;;;;;;:27;39889:7;39870:27;;;;;;;;;;;;;;;;39863:34;;39754:151;;;;:::o;51742:62::-;51780:24;51742:62;:::o;62202:116::-;21727:4;62257:18;;22175:16;22186:4;22175:10;:16::i;:::-;62288:22:::1;62302:7;62288:13;:22::i;:::-;62202:116:::0;;:::o;51936:32::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;55239:509::-;55295:7;55318:13;55332:1;55318:16;;;;;;;:::i;:::-;;;;;:25;;;;;;;;;;;;:54;;;;;55347:13;55361:1;55347:16;;;;;;;:::i;:::-;;;;;:25;;;;;;;;;;;;55318:54;55315:206;;;55425:13;55439:1;55425:16;;;;;;;:::i;:::-;;;;;:26;;;55396:13;55410:1;55396:16;;;;;;;:::i;:::-;;;;;:26;;;:55;:113;;55483:13;55497:1;55483:16;;;;;;;:::i;:::-;;;;;:26;;;55396:113;;;55454:13;55468:1;55454:16;;;;;;;:::i;:::-;;;;;:26;;;55396:113;55389:120;;;;55315:206;55535:13;55549:1;55535:16;;;;;;;:::i;:::-;;;;;:25;;;;;;;;;;;;55532:90;;;55584:13;55598:1;55584:16;;;;;;;:::i;:::-;;;;;:26;;;55577:33;;;;55532:90;55635:13;55649:1;55635:16;;;;;;;:::i;:::-;;;;;:25;;;;;;;;;;;;55632:90;;;55684:13;55698:1;55684:16;;;;;;;:::i;:::-;;;;;:26;;;55677:33;;;;55632:90;55739:1;55732:8;;55239:509;;:::o;62839:199::-;21727:4;62901:18;;22175:16;22186:4;22175:10;:16::i;:::-;62940:12:::1;:10;:12::i;:::-;62932:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;63014:8;62998:13;:24;;;;62839:199:::0;;:::o;26789:238::-;26873:22;26881:4;26887:7;26873;:22::i;:::-;26868:152;;26944:4;26912:6;:12;26919:4;26912:12;;;;;;;;;;;:20;;:29;26933:7;26912:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;26995:12;:10;:12::i;:::-;26968:40;;26986:7;26968:40;;26980:4;26968:40;;;;;;;;;;26868:152;26789:238;;:::o;7858:152::-;7928:4;7952:50;7957:3;:10;;7993:5;7977:23;;7969:32;;7952:4;:50::i;:::-;7945:57;;7858:152;;;;:::o;22754:105::-;22821:30;22832:4;22838:12;:10;:12::i;:::-;22821:10;:30::i;:::-;22754:105;:::o;29212:188::-;29300:31;29317:4;29323:7;29300:16;:31::i;:::-;29361;29384:7;29361:12;:18;29374:4;29361:18;;;;;;;;;;;:22;;:31;;;;:::i;:::-;29342:16;;:50;;;;;;;;;;;;;;;;;;29212:188;;:::o;59779:134::-;59855:5;59826:14;59841:1;59826:17;;;;;;;:::i;:::-;;;;;:26;;;:34;;;;;;;;;;;;;;;;;;59900:5;59871:14;59886:1;59871:17;;;;;;;:::i;:::-;;;;;:26;;;:34;;;;;;;;;;;;;;;;;;59779:134::o;19621:98::-;19674:7;19701:10;19694:17;;19621:98;:::o;46188:382::-;46341:1;46324:19;;:5;:19;;;;46316:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;46423:1;46404:21;;:7;:21;;;;46396:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;46508:6;46478:11;:18;46490:5;46478:18;;;;;;;;;;;;;;;:27;46497:7;46478:27;;;;;;;;;;;;;;;:36;;;;46546:7;46530:32;;46539:5;46530:32;;;46555:6;46530:32;;;;;;:::i;:::-;;;;;;;;46188:382;;;:::o;46861:454::-;46996:24;47023:25;47033:5;47040:7;47023:9;:25::i;:::-;46996:52;;47083:17;47063:16;:37;47059:249;;47145:6;47125:16;:26;;47117:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;47230:51;47239:5;47246:7;47274:6;47255:16;:25;47230:8;:51::i;:::-;47059:249;46985:330;46861:454;;;:::o;42896:1291::-;43043:1;43027:18;;:4;:18;;;;43019:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;43121:1;43107:16;;:2;:16;;;;43099:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;43178:24;43205:6;43178:33;;43222:19;43319:12;43334:4;43319:19;;43446:18;:24;43465:4;43446:24;;;;;;;;;;;;;;;;;;;;;;;;;:50;;;;43474:18;:22;43493:2;43474:22;;;;;;;;;;;;;;;;;;;;;;;;;43446:50;43443:96;;;43522:5;43512:15;;43443:96;43555:18;;;;;;;;;;;43554:19;:30;;;;;43577:7;43554:30;43551:140;;;43630:3;43622:7;;43615:6;:14;;;;:::i;:::-;:18;;;;:::i;:::-;43601:32;;43668:11;43648:31;;;;;:::i;:::-;;;43551:140;43703:48;43724:4;43730:2;43734:16;43703:20;:48::i;:::-;43764:19;43786:15;43796:4;43786:9;:15::i;:::-;43764:37;;43835:6;43820:11;:21;;43812:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;43925:11;43898:23;;:38;;;;;;;:::i;:::-;;;;;;;;44004:6;43990:11;:20;43972:9;:15;43982:4;43972:15;;;;;;;;;;;;;;;:38;;;;44049:16;44032:9;:13;44042:2;44032:13;;;;;;;;;;;;;;;;:33;;;;;;;:::i;:::-;;;;;;;;44098:2;44083:36;;44092:4;44083:36;;;44102:16;44083:36;;;;;;:::i;:::-;;;;;;;;44132:47;44152:4;44158:2;44162:16;44132:19;:47::i;:::-;43008:1179;;;;42896:1291;;;:::o;29494:194::-;29583:32;29601:4;29607:7;29583:17;:32::i;:::-;29646:34;29672:7;29646:12;:18;29659:4;29646:18;;;;;;;;;;;:25;;:34;;;;:::i;:::-;29626:16;;:54;;;;;;;;;;;;;;;;;;29494:194;;:::o;48457:85::-;48529:5;48508:18;;:26;;;;;;;;;;;;;;;;;;48457:85::o;31872:120::-;31416:8;:6;:8::i;:::-;31408:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;31941:5:::1;31931:7;;:15;;;;;;;;;;;;;;;;;;31962:22;31971:12;:10;:12::i;:::-;31962:22;;;;;;:::i;:::-;;;;;;;;31872:120::o:0;56023:136::-;56102:5;56074:13;56088:1;56074:16;;;;;;;:::i;:::-;;;;;:25;;;:33;;;;;;;;;;;;;;;;;;56146:5;56118:13;56132:1;56118:16;;;;;;;:::i;:::-;;;;;:25;;;:33;;;;;;;;;;;;;;;;;;56023:136::o;44474:400::-;44577:1;44558:21;;:7;:21;;;;44550:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;44629:49;44658:1;44662:7;44671:6;44629:20;:49::i;:::-;44707:6;44691:12;;:22;;;;;;;:::i;:::-;;;;;;;;44746:6;44724:9;:18;44734:7;44724:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;44789:7;44768:37;;44785:1;44768:37;;;44798:6;44768:37;;;;;;:::i;:::-;;;;;;;;44818:48;44846:1;44850:7;44859:6;44818:19;:48::i;:::-;44474:400;;:::o;45207:593::-;45310:1;45291:21;;:7;:21;;;;45283:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45364:49;45385:7;45402:1;45406:6;45364:20;:49::i;:::-;45426:22;45451:9;:18;45461:7;45451:18;;;;;;;;;;;;;;;;45426:43;;45506:6;45488:14;:24;;45480:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;45626:6;45609:14;:23;45588:9;:18;45598:7;45588:18;;;;;;;;;;;;;;;:44;;;;45670:6;45654:12;;:22;;;;;;;:::i;:::-;;;;;;;;45720:1;45694:37;;45703:7;45694:37;;;45724:6;45694:37;;;;;;:::i;:::-;;;;;;;;45744:48;45764:7;45781:1;45785:6;45744:19;:48::i;:::-;45272:528;45207:593;;:::o;49088:104::-;49180:4;49150:18;:27;49169:7;49150:27;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;49088:104;:::o;48367:82::-;48437:4;48416:18;;:25;;;;;;;;;;;;;;;;;;48367:82::o;48274:85::-;48343:8;48333:7;:18;;;;48274:85;:::o;48550:105::-;48605:4;48629:18;;;;;;;;;;;48622:25;;48550:105;:::o;31613:118::-;31139:8;:6;:8::i;:::-;31138:9;31130:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;31683:4:::1;31673:7;;:14;;;;;;;;;;;;;;;;;;31703:20;31710:12;:10;:12::i;:::-;31703:20;;;;;;:::i;:::-;;;;;;;;31613:118::o:0;48180:86::-;48225:7;48251;;48244:14;;48180:86;:::o;9154:158::-;9228:7;9279:22;9283:3;:10;;9295:5;9279:3;:22::i;:::-;9271:31;;9248:56;;9154:158;;;;:::o;48786:294::-;48861:4;48913:6;48886:23;;:33;;48878:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;49010:6;48983:23;;:33;;;;;;;:::i;:::-;;;;;;;;49044:6;49027:9;:13;49037:2;49027:13;;;;;;;;;;;;;;;;:23;;;;;;;:::i;:::-;;;;;;;;49068:4;49061:11;;48786:294;;;;:::o;8683:117::-;8746:7;8773:19;8781:3;:10;;8773:7;:19::i;:::-;8766:26;;8683:117;;;:::o;49204:103::-;49294:5;49264:18;:27;49283:7;49264:27;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;49204:103;:::o;1773:414::-;1836:4;1858:21;1868:3;1873:5;1858:9;:21::i;:::-;1853:327;;1896:3;:11;;1913:5;1896:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2079:3;:11;;:18;;;;2057:3;:12;;:19;2070:5;2057:19;;;;;;;;;;;:40;;;;2119:4;2112:11;;;;1853:327;2163:5;2156:12;;1773:414;;;;;:::o;23149:505::-;23238:22;23246:4;23252:7;23238;:22::i;:::-;23233:414;;23426:41;23454:7;23426:41;;23464:2;23426:19;:41::i;:::-;23540:38;23568:4;23560:13;;23575:2;23540:19;:38::i;:::-;23331:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;23277:358;;;;;;;;;;;:::i;:::-;;;;;;;;23233:414;23149:505;;:::o;61845:217::-;62010:44;62037:4;62043:2;62047:6;62010:26;:44::i;:::-;61845:217;;;:::o;48048:124::-;;;;:::o;27159:239::-;27243:22;27251:4;27257:7;27243;:22::i;:::-;27239:152;;;27314:5;27282:6;:12;27289:4;27282:12;;;;;;;;;;;:20;;:29;27303:7;27282:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;27366:12;:10;:12::i;:::-;27339:40;;27357:7;27339:40;;27351:4;27339:40;;;;;;;;;;27239:152;27159:239;;:::o;8186:158::-;8259:4;8283:53;8291:3;:10;;8327:5;8311:23;;8303:32;;8283:7;:53::i;:::-;8276:60;;8186:158;;;;:::o;4547:120::-;4614:7;4641:3;:11;;4653:5;4641:18;;;;;;;;:::i;:::-;;;;;;;;;;4634:25;;4547:120;;;;:::o;4084:109::-;4140:7;4167:3;:11;;:18;;;;4160:25;;4084:109;;;:::o;3869:129::-;3942:4;3989:1;3966:3;:12;;:19;3979:5;3966:19;;;;;;;;;;;;:24;;3959:31;;3869:129;;;;:::o;14215:451::-;14290:13;14316:19;14361:1;14352:6;14348:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;14338:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14316:47;;14374:15;:6;14381:1;14374:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;14400;:6;14407:1;14400:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;14431:9;14456:1;14447:6;14443:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;14431:26;;14426:135;14463:1;14459;:5;14426:135;;;14498:12;14519:3;14511:5;:11;14498:25;;;;;;;:::i;:::-;;;;;14486:6;14493:1;14486:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;14548:1;14538:11;;;;;14466:3;;;;:::i;:::-;;;14426:135;;;;14588:1;14579:5;:10;14571:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;14651:6;14637:21;;;14215:451;;;;:::o;50089:272::-;50232:44;50259:4;50265:2;50269:6;50232:26;:44::i;:::-;50298:8;:6;:8::i;:::-;50297:9;50289:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;50089:272;;;:::o;2363:1420::-;2429:4;2547:18;2568:3;:12;;:19;2581:5;2568:19;;;;;;;;;;;;2547:40;;2618:1;2604:10;:15;2600:1176;;2979:21;3016:1;3003:10;:14;;;;:::i;:::-;2979:38;;3032:17;3073:1;3052:3;:11;;:18;;;;:22;;;;:::i;:::-;3032:42;;3108:13;3095:9;:26;3091:405;;3142:17;3162:3;:11;;3174:9;3162:22;;;;;;;;:::i;:::-;;;;;;;;;;3142:42;;3316:9;3287:3;:11;;3299:13;3287:26;;;;;;;;:::i;:::-;;;;;;;;;:38;;;;3427:10;3401:3;:12;;:23;3414:9;3401:23;;;;;;;;;;;:36;;;;3123:373;3091:405;3577:3;:11;;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3672:3;:12;;:19;3685:5;3672:19;;;;;;;;;;;3665:26;;;3715:4;3708:11;;;;;;;2600:1176;3759:5;3752:12;;;2363:1420;;;;;:::o;47915:125::-;;;;:::o;7:139:1:-;53:5;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;7:139;;;;:::o;152:155::-;206:5;244:6;231:20;222:29;;260:41;295:5;260:41;:::i;:::-;152:155;;;;:::o;313:137::-;367:5;398:6;392:13;383:22;;414:30;438:5;414:30;:::i;:::-;313:137;;;;:::o;456:139::-;502:5;540:6;527:20;518:29;;556:33;583:5;556:33;:::i;:::-;456:139;;;;:::o;601:::-;647:5;685:6;672:20;663:29;;701:33;728:5;701:33;:::i;:::-;601:139;;;;:::o;746:143::-;803:5;834:6;828:13;819:22;;850:33;877:5;850:33;:::i;:::-;746:143;;;;:::o;895:329::-;954:6;1003:2;991:9;982:7;978:23;974:32;971:119;;;1009:79;;:::i;:::-;971:119;1129:1;1154:53;1199:7;1190:6;1179:9;1175:22;1154:53;:::i;:::-;1144:63;;1100:117;895:329;;;;:::o;1230:490::-;1306:6;1314;1363:2;1351:9;1342:7;1338:23;1334:32;1331:119;;;1369:79;;:::i;:::-;1331:119;1489:1;1514:61;1567:7;1558:6;1547:9;1543:22;1514:61;:::i;:::-;1504:71;;1460:125;1624:2;1650:53;1695:7;1686:6;1675:9;1671:22;1650:53;:::i;:::-;1640:63;;1595:118;1230:490;;;;;:::o;1726:474::-;1794:6;1802;1851:2;1839:9;1830:7;1826:23;1822:32;1819:119;;;1857:79;;:::i;:::-;1819:119;1977:1;2002:53;2047:7;2038:6;2027:9;2023:22;2002:53;:::i;:::-;1992:63;;1948:117;2104:2;2130:53;2175:7;2166:6;2155:9;2151:22;2130:53;:::i;:::-;2120:63;;2075:118;1726:474;;;;;:::o;2206:619::-;2283:6;2291;2299;2348:2;2336:9;2327:7;2323:23;2319:32;2316:119;;;2354:79;;:::i;:::-;2316:119;2474:1;2499:53;2544:7;2535:6;2524:9;2520:22;2499:53;:::i;:::-;2489:63;;2445:117;2601:2;2627:53;2672:7;2663:6;2652:9;2648:22;2627:53;:::i;:::-;2617:63;;2572:118;2729:2;2755:53;2800:7;2791:6;2780:9;2776:22;2755:53;:::i;:::-;2745:63;;2700:118;2206:619;;;;;:::o;2831:474::-;2899:6;2907;2956:2;2944:9;2935:7;2931:23;2927:32;2924:119;;;2962:79;;:::i;:::-;2924:119;3082:1;3107:53;3152:7;3143:6;3132:9;3128:22;3107:53;:::i;:::-;3097:63;;3053:117;3209:2;3235:53;3280:7;3271:6;3260:9;3256:22;3235:53;:::i;:::-;3225:63;;3180:118;2831:474;;;;;:::o;3311:345::-;3378:6;3427:2;3415:9;3406:7;3402:23;3398:32;3395:119;;;3433:79;;:::i;:::-;3395:119;3553:1;3578:61;3631:7;3622:6;3611:9;3607:22;3578:61;:::i;:::-;3568:71;;3524:125;3311:345;;;;:::o;3662:329::-;3721:6;3770:2;3758:9;3749:7;3745:23;3741:32;3738:119;;;3776:79;;:::i;:::-;3738:119;3896:1;3921:53;3966:7;3957:6;3946:9;3942:22;3921:53;:::i;:::-;3911:63;;3867:117;3662:329;;;;:::o;3997:474::-;4065:6;4073;4122:2;4110:9;4101:7;4097:23;4093:32;4090:119;;;4128:79;;:::i;:::-;4090:119;4248:1;4273:53;4318:7;4309:6;4298:9;4294:22;4273:53;:::i;:::-;4263:63;;4219:117;4375:2;4401:53;4446:7;4437:6;4426:9;4422:22;4401:53;:::i;:::-;4391:63;;4346:118;3997:474;;;;;:::o;4477:::-;4545:6;4553;4602:2;4590:9;4581:7;4577:23;4573:32;4570:119;;;4608:79;;:::i;:::-;4570:119;4728:1;4753:53;4798:7;4789:6;4778:9;4774:22;4753:53;:::i;:::-;4743:63;;4699:117;4855:2;4881:53;4926:7;4917:6;4906:9;4902:22;4881:53;:::i;:::-;4871:63;;4826:118;4477:474;;;;;:::o;4957:329::-;5016:6;5065:2;5053:9;5044:7;5040:23;5036:32;5033:119;;;5071:79;;:::i;:::-;5033:119;5191:1;5216:53;5261:7;5252:6;5241:9;5237:22;5216:53;:::i;:::-;5206:63;;5162:117;4957:329;;;;:::o;5292:351::-;5362:6;5411:2;5399:9;5390:7;5386:23;5382:32;5379:119;;;5417:79;;:::i;:::-;5379:119;5537:1;5562:64;5618:7;5609:6;5598:9;5594:22;5562:64;:::i;:::-;5552:74;;5508:128;5292:351;;;;:::o;5649:474::-;5717:6;5725;5774:2;5762:9;5753:7;5749:23;5745:32;5742:119;;;5780:79;;:::i;:::-;5742:119;5900:1;5925:53;5970:7;5961:6;5950:9;5946:22;5925:53;:::i;:::-;5915:63;;5871:117;6027:2;6053:53;6098:7;6089:6;6078:9;6074:22;6053:53;:::i;:::-;6043:63;;5998:118;5649:474;;;;;:::o;6129:147::-;6224:45;6263:5;6224:45;:::i;:::-;6219:3;6212:58;6129:147;;:::o;6282:118::-;6369:24;6387:5;6369:24;:::i;:::-;6364:3;6357:37;6282:118;;:::o;6406:109::-;6487:21;6502:5;6487:21;:::i;:::-;6482:3;6475:34;6406:109;;:::o;6521:118::-;6608:24;6626:5;6608:24;:::i;:::-;6603:3;6596:37;6521:118;;:::o;6645:364::-;6733:3;6761:39;6794:5;6761:39;:::i;:::-;6816:71;6880:6;6875:3;6816:71;:::i;:::-;6809:78;;6896:52;6941:6;6936:3;6929:4;6922:5;6918:16;6896:52;:::i;:::-;6973:29;6995:6;6973:29;:::i;:::-;6968:3;6964:39;6957:46;;6737:272;6645:364;;;;:::o;7015:377::-;7121:3;7149:39;7182:5;7149:39;:::i;:::-;7204:89;7286:6;7281:3;7204:89;:::i;:::-;7197:96;;7302:52;7347:6;7342:3;7335:4;7328:5;7324:16;7302:52;:::i;:::-;7379:6;7374:3;7370:16;7363:23;;7125:267;7015:377;;;;:::o;7398:366::-;7540:3;7561:67;7625:2;7620:3;7561:67;:::i;:::-;7554:74;;7637:93;7726:3;7637:93;:::i;:::-;7755:2;7750:3;7746:12;7739:19;;7398:366;;;:::o;7770:::-;7912:3;7933:67;7997:2;7992:3;7933:67;:::i;:::-;7926:74;;8009:93;8098:3;8009:93;:::i;:::-;8127:2;8122:3;8118:12;8111:19;;7770:366;;;:::o;8142:::-;8284:3;8305:67;8369:2;8364:3;8305:67;:::i;:::-;8298:74;;8381:93;8470:3;8381:93;:::i;:::-;8499:2;8494:3;8490:12;8483:19;;8142:366;;;:::o;8514:::-;8656:3;8677:67;8741:2;8736:3;8677:67;:::i;:::-;8670:74;;8753:93;8842:3;8753:93;:::i;:::-;8871:2;8866:3;8862:12;8855:19;;8514:366;;;:::o;8886:::-;9028:3;9049:67;9113:2;9108:3;9049:67;:::i;:::-;9042:74;;9125:93;9214:3;9125:93;:::i;:::-;9243:2;9238:3;9234:12;9227:19;;8886:366;;;:::o;9258:::-;9400:3;9421:67;9485:2;9480:3;9421:67;:::i;:::-;9414:74;;9497:93;9586:3;9497:93;:::i;:::-;9615:2;9610:3;9606:12;9599:19;;9258:366;;;:::o;9630:::-;9772:3;9793:67;9857:2;9852:3;9793:67;:::i;:::-;9786:74;;9869:93;9958:3;9869:93;:::i;:::-;9987:2;9982:3;9978:12;9971:19;;9630:366;;;:::o;10002:::-;10144:3;10165:67;10229:2;10224:3;10165:67;:::i;:::-;10158:74;;10241:93;10330:3;10241:93;:::i;:::-;10359:2;10354:3;10350:12;10343:19;;10002:366;;;:::o;10374:::-;10516:3;10537:67;10601:2;10596:3;10537:67;:::i;:::-;10530:74;;10613:93;10702:3;10613:93;:::i;:::-;10731:2;10726:3;10722:12;10715:19;;10374:366;;;:::o;10746:::-;10888:3;10909:67;10973:2;10968:3;10909:67;:::i;:::-;10902:74;;10985:93;11074:3;10985:93;:::i;:::-;11103:2;11098:3;11094:12;11087:19;;10746:366;;;:::o;11118:::-;11260:3;11281:67;11345:2;11340:3;11281:67;:::i;:::-;11274:74;;11357:93;11446:3;11357:93;:::i;:::-;11475:2;11470:3;11466:12;11459:19;;11118:366;;;:::o;11490:::-;11632:3;11653:67;11717:2;11712:3;11653:67;:::i;:::-;11646:74;;11729:93;11818:3;11729:93;:::i;:::-;11847:2;11842:3;11838:12;11831:19;;11490:366;;;:::o;11862:::-;12004:3;12025:67;12089:2;12084:3;12025:67;:::i;:::-;12018:74;;12101:93;12190:3;12101:93;:::i;:::-;12219:2;12214:3;12210:12;12203:19;;11862:366;;;:::o;12234:::-;12376:3;12397:67;12461:2;12456:3;12397:67;:::i;:::-;12390:74;;12473:93;12562:3;12473:93;:::i;:::-;12591:2;12586:3;12582:12;12575:19;;12234:366;;;:::o;12606:::-;12748:3;12769:67;12833:2;12828:3;12769:67;:::i;:::-;12762:74;;12845:93;12934:3;12845:93;:::i;:::-;12963:2;12958:3;12954:12;12947:19;;12606:366;;;:::o;12978:::-;13120:3;13141:67;13205:2;13200:3;13141:67;:::i;:::-;13134:74;;13217:93;13306:3;13217:93;:::i;:::-;13335:2;13330:3;13326:12;13319:19;;12978:366;;;:::o;13350:::-;13492:3;13513:67;13577:2;13572:3;13513:67;:::i;:::-;13506:74;;13589:93;13678:3;13589:93;:::i;:::-;13707:2;13702:3;13698:12;13691:19;;13350:366;;;:::o;13722:::-;13864:3;13885:67;13949:2;13944:3;13885:67;:::i;:::-;13878:74;;13961:93;14050:3;13961:93;:::i;:::-;14079:2;14074:3;14070:12;14063:19;;13722:366;;;:::o;14094:::-;14236:3;14257:67;14321:2;14316:3;14257:67;:::i;:::-;14250:74;;14333:93;14422:3;14333:93;:::i;:::-;14451:2;14446:3;14442:12;14435:19;;14094:366;;;:::o;14466:::-;14608:3;14629:67;14693:2;14688:3;14629:67;:::i;:::-;14622:74;;14705:93;14794:3;14705:93;:::i;:::-;14823:2;14818:3;14814:12;14807:19;;14466:366;;;:::o;14838:::-;14980:3;15001:67;15065:2;15060:3;15001:67;:::i;:::-;14994:74;;15077:93;15166:3;15077:93;:::i;:::-;15195:2;15190:3;15186:12;15179:19;;14838:366;;;:::o;15210:::-;15352:3;15373:67;15437:2;15432:3;15373:67;:::i;:::-;15366:74;;15449:93;15538:3;15449:93;:::i;:::-;15567:2;15562:3;15558:12;15551:19;;15210:366;;;:::o;15582:::-;15724:3;15745:67;15809:2;15804:3;15745:67;:::i;:::-;15738:74;;15821:93;15910:3;15821:93;:::i;:::-;15939:2;15934:3;15930:12;15923:19;;15582:366;;;:::o;15954:::-;16096:3;16117:67;16181:2;16176:3;16117:67;:::i;:::-;16110:74;;16193:93;16282:3;16193:93;:::i;:::-;16311:2;16306:3;16302:12;16295:19;;15954:366;;;:::o;16326:402::-;16486:3;16507:85;16589:2;16584:3;16507:85;:::i;:::-;16500:92;;16601:93;16690:3;16601:93;:::i;:::-;16719:2;16714:3;16710:12;16703:19;;16326:402;;;:::o;16734:::-;16894:3;16915:85;16997:2;16992:3;16915:85;:::i;:::-;16908:92;;17009:93;17098:3;17009:93;:::i;:::-;17127:2;17122:3;17118:12;17111:19;;16734:402;;;:::o;17142:366::-;17284:3;17305:67;17369:2;17364:3;17305:67;:::i;:::-;17298:74;;17381:93;17470:3;17381:93;:::i;:::-;17499:2;17494:3;17490:12;17483:19;;17142:366;;;:::o;17514:::-;17656:3;17677:67;17741:2;17736:3;17677:67;:::i;:::-;17670:74;;17753:93;17842:3;17753:93;:::i;:::-;17871:2;17866:3;17862:12;17855:19;;17514:366;;;:::o;17886:118::-;17973:24;17991:5;17973:24;:::i;:::-;17968:3;17961:37;17886:118;;:::o;18010:112::-;18093:22;18109:5;18093:22;:::i;:::-;18088:3;18081:35;18010:112;;:::o;18128:967::-;18510:3;18532:148;18676:3;18532:148;:::i;:::-;18525:155;;18697:95;18788:3;18779:6;18697:95;:::i;:::-;18690:102;;18809:148;18953:3;18809:148;:::i;:::-;18802:155;;18974:95;19065:3;19056:6;18974:95;:::i;:::-;18967:102;;19086:3;19079:10;;18128:967;;;;;:::o;19101:222::-;19194:4;19232:2;19221:9;19217:18;19209:26;;19245:71;19313:1;19302:9;19298:17;19289:6;19245:71;:::i;:::-;19101:222;;;;:::o;19329:348::-;19458:4;19496:2;19485:9;19481:18;19473:26;;19509:79;19585:1;19574:9;19570:17;19561:6;19509:79;:::i;:::-;19598:72;19666:2;19655:9;19651:18;19642:6;19598:72;:::i;:::-;19329:348;;;;;:::o;19683:458::-;19840:4;19878:2;19867:9;19863:18;19855:26;;19891:71;19959:1;19948:9;19944:17;19935:6;19891:71;:::i;:::-;19972:80;20048:2;20037:9;20033:18;20024:6;19972:80;:::i;:::-;20062:72;20130:2;20119:9;20115:18;20106:6;20062:72;:::i;:::-;19683:458;;;;;;:::o;20147:430::-;20290:4;20328:2;20317:9;20313:18;20305:26;;20341:71;20409:1;20398:9;20394:17;20385:6;20341:71;:::i;:::-;20422:66;20484:2;20473:9;20469:18;20460:6;20422:66;:::i;:::-;20498:72;20566:2;20555:9;20551:18;20542:6;20498:72;:::i;:::-;20147:430;;;;;;:::o;20583:332::-;20704:4;20742:2;20731:9;20727:18;20719:26;;20755:71;20823:1;20812:9;20808:17;20799:6;20755:71;:::i;:::-;20836:72;20904:2;20893:9;20889:18;20880:6;20836:72;:::i;:::-;20583:332;;;;;:::o;20921:210::-;21008:4;21046:2;21035:9;21031:18;21023:26;;21059:65;21121:1;21110:9;21106:17;21097:6;21059:65;:::i;:::-;20921:210;;;;:::o;21137:222::-;21230:4;21268:2;21257:9;21253:18;21245:26;;21281:71;21349:1;21338:9;21334:17;21325:6;21281:71;:::i;:::-;21137:222;;;;:::o;21365:313::-;21478:4;21516:2;21505:9;21501:18;21493:26;;21565:9;21559:4;21555:20;21551:1;21540:9;21536:17;21529:47;21593:78;21666:4;21657:6;21593:78;:::i;:::-;21585:86;;21365:313;;;;:::o;21684:419::-;21850:4;21888:2;21877:9;21873:18;21865:26;;21937:9;21931:4;21927:20;21923:1;21912:9;21908:17;21901:47;21965:131;22091:4;21965:131;:::i;:::-;21957:139;;21684:419;;;:::o;22109:::-;22275:4;22313:2;22302:9;22298:18;22290:26;;22362:9;22356:4;22352:20;22348:1;22337:9;22333:17;22326:47;22390:131;22516:4;22390:131;:::i;:::-;22382:139;;22109:419;;;:::o;22534:::-;22700:4;22738:2;22727:9;22723:18;22715:26;;22787:9;22781:4;22777:20;22773:1;22762:9;22758:17;22751:47;22815:131;22941:4;22815:131;:::i;:::-;22807:139;;22534:419;;;:::o;22959:::-;23125:4;23163:2;23152:9;23148:18;23140:26;;23212:9;23206:4;23202:20;23198:1;23187:9;23183:17;23176:47;23240:131;23366:4;23240:131;:::i;:::-;23232:139;;22959:419;;;:::o;23384:::-;23550:4;23588:2;23577:9;23573:18;23565:26;;23637:9;23631:4;23627:20;23623:1;23612:9;23608:17;23601:47;23665:131;23791:4;23665:131;:::i;:::-;23657:139;;23384:419;;;:::o;23809:::-;23975:4;24013:2;24002:9;23998:18;23990:26;;24062:9;24056:4;24052:20;24048:1;24037:9;24033:17;24026:47;24090:131;24216:4;24090:131;:::i;:::-;24082:139;;23809:419;;;:::o;24234:::-;24400:4;24438:2;24427:9;24423:18;24415:26;;24487:9;24481:4;24477:20;24473:1;24462:9;24458:17;24451:47;24515:131;24641:4;24515:131;:::i;:::-;24507:139;;24234:419;;;:::o;24659:::-;24825:4;24863:2;24852:9;24848:18;24840:26;;24912:9;24906:4;24902:20;24898:1;24887:9;24883:17;24876:47;24940:131;25066:4;24940:131;:::i;:::-;24932:139;;24659:419;;;:::o;25084:::-;25250:4;25288:2;25277:9;25273:18;25265:26;;25337:9;25331:4;25327:20;25323:1;25312:9;25308:17;25301:47;25365:131;25491:4;25365:131;:::i;:::-;25357:139;;25084:419;;;:::o;25509:::-;25675:4;25713:2;25702:9;25698:18;25690:26;;25762:9;25756:4;25752:20;25748:1;25737:9;25733:17;25726:47;25790:131;25916:4;25790:131;:::i;:::-;25782:139;;25509:419;;;:::o;25934:::-;26100:4;26138:2;26127:9;26123:18;26115:26;;26187:9;26181:4;26177:20;26173:1;26162:9;26158:17;26151:47;26215:131;26341:4;26215:131;:::i;:::-;26207:139;;25934:419;;;:::o;26359:::-;26525:4;26563:2;26552:9;26548:18;26540:26;;26612:9;26606:4;26602:20;26598:1;26587:9;26583:17;26576:47;26640:131;26766:4;26640:131;:::i;:::-;26632:139;;26359:419;;;:::o;26784:::-;26950:4;26988:2;26977:9;26973:18;26965:26;;27037:9;27031:4;27027:20;27023:1;27012:9;27008:17;27001:47;27065:131;27191:4;27065:131;:::i;:::-;27057:139;;26784:419;;;:::o;27209:::-;27375:4;27413:2;27402:9;27398:18;27390:26;;27462:9;27456:4;27452:20;27448:1;27437:9;27433:17;27426:47;27490:131;27616:4;27490:131;:::i;:::-;27482:139;;27209:419;;;:::o;27634:::-;27800:4;27838:2;27827:9;27823:18;27815:26;;27887:9;27881:4;27877:20;27873:1;27862:9;27858:17;27851:47;27915:131;28041:4;27915:131;:::i;:::-;27907:139;;27634:419;;;:::o;28059:::-;28225:4;28263:2;28252:9;28248:18;28240:26;;28312:9;28306:4;28302:20;28298:1;28287:9;28283:17;28276:47;28340:131;28466:4;28340:131;:::i;:::-;28332:139;;28059:419;;;:::o;28484:::-;28650:4;28688:2;28677:9;28673:18;28665:26;;28737:9;28731:4;28727:20;28723:1;28712:9;28708:17;28701:47;28765:131;28891:4;28765:131;:::i;:::-;28757:139;;28484:419;;;:::o;28909:::-;29075:4;29113:2;29102:9;29098:18;29090:26;;29162:9;29156:4;29152:20;29148:1;29137:9;29133:17;29126:47;29190:131;29316:4;29190:131;:::i;:::-;29182:139;;28909:419;;;:::o;29334:::-;29500:4;29538:2;29527:9;29523:18;29515:26;;29587:9;29581:4;29577:20;29573:1;29562:9;29558:17;29551:47;29615:131;29741:4;29615:131;:::i;:::-;29607:139;;29334:419;;;:::o;29759:::-;29925:4;29963:2;29952:9;29948:18;29940:26;;30012:9;30006:4;30002:20;29998:1;29987:9;29983:17;29976:47;30040:131;30166:4;30040:131;:::i;:::-;30032:139;;29759:419;;;:::o;30184:::-;30350:4;30388:2;30377:9;30373:18;30365:26;;30437:9;30431:4;30427:20;30423:1;30412:9;30408:17;30401:47;30465:131;30591:4;30465:131;:::i;:::-;30457:139;;30184:419;;;:::o;30609:::-;30775:4;30813:2;30802:9;30798:18;30790:26;;30862:9;30856:4;30852:20;30848:1;30837:9;30833:17;30826:47;30890:131;31016:4;30890:131;:::i;:::-;30882:139;;30609:419;;;:::o;31034:::-;31200:4;31238:2;31227:9;31223:18;31215:26;;31287:9;31281:4;31277:20;31273:1;31262:9;31258:17;31251:47;31315:131;31441:4;31315:131;:::i;:::-;31307:139;;31034:419;;;:::o;31459:::-;31625:4;31663:2;31652:9;31648:18;31640:26;;31712:9;31706:4;31702:20;31698:1;31687:9;31683:17;31676:47;31740:131;31866:4;31740:131;:::i;:::-;31732:139;;31459:419;;;:::o;31884:::-;32050:4;32088:2;32077:9;32073:18;32065:26;;32137:9;32131:4;32127:20;32123:1;32112:9;32108:17;32101:47;32165:131;32291:4;32165:131;:::i;:::-;32157:139;;31884:419;;;:::o;32309:::-;32475:4;32513:2;32502:9;32498:18;32490:26;;32562:9;32556:4;32552:20;32548:1;32537:9;32533:17;32526:47;32590:131;32716:4;32590:131;:::i;:::-;32582:139;;32309:419;;;:::o;32734:222::-;32827:4;32865:2;32854:9;32850:18;32842:26;;32878:71;32946:1;32935:9;32931:17;32922:6;32878:71;:::i;:::-;32734:222;;;;:::o;32962:214::-;33051:4;33089:2;33078:9;33074:18;33066:26;;33102:67;33166:1;33155:9;33151:17;33142:6;33102:67;:::i;:::-;32962:214;;;;:::o;33263:99::-;33315:6;33349:5;33343:12;33333:22;;33263:99;;;:::o;33368:169::-;33452:11;33486:6;33481:3;33474:19;33526:4;33521:3;33517:14;33502:29;;33368:169;;;;:::o;33543:148::-;33645:11;33682:3;33667:18;;33543:148;;;;:::o;33697:305::-;33737:3;33756:20;33774:1;33756:20;:::i;:::-;33751:25;;33790:20;33808:1;33790:20;:::i;:::-;33785:25;;33944:1;33876:66;33872:74;33869:1;33866:81;33863:107;;;33950:18;;:::i;:::-;33863:107;33994:1;33991;33987:9;33980:16;;33697:305;;;;:::o;34008:185::-;34048:1;34065:20;34083:1;34065:20;:::i;:::-;34060:25;;34099:20;34117:1;34099:20;:::i;:::-;34094:25;;34138:1;34128:35;;34143:18;;:::i;:::-;34128:35;34185:1;34182;34178:9;34173:14;;34008:185;;;;:::o;34199:348::-;34239:7;34262:20;34280:1;34262:20;:::i;:::-;34257:25;;34296:20;34314:1;34296:20;:::i;:::-;34291:25;;34484:1;34416:66;34412:74;34409:1;34406:81;34401:1;34394:9;34387:17;34383:105;34380:131;;;34491:18;;:::i;:::-;34380:131;34539:1;34536;34532:9;34521:20;;34199:348;;;;:::o;34553:191::-;34593:4;34613:20;34631:1;34613:20;:::i;:::-;34608:25;;34647:20;34665:1;34647:20;:::i;:::-;34642:25;;34686:1;34683;34680:8;34677:34;;;34691:18;;:::i;:::-;34677:34;34736:1;34733;34729:9;34721:17;;34553:191;;;;:::o;34750:96::-;34787:7;34816:24;34834:5;34816:24;:::i;:::-;34805:35;;34750:96;;;:::o;34852:104::-;34897:7;34926:24;34944:5;34926:24;:::i;:::-;34915:35;;34852:104;;;:::o;34962:90::-;34996:7;35039:5;35032:13;35025:21;35014:32;;34962:90;;;:::o;35058:77::-;35095:7;35124:5;35113:16;;35058:77;;;:::o;35141:126::-;35178:7;35218:42;35211:5;35207:54;35196:65;;35141:126;;;:::o;35273:77::-;35310:7;35339:5;35328:16;;35273:77;;;:::o;35356:86::-;35391:7;35431:4;35424:5;35420:16;35409:27;;35356:86;;;:::o;35448:134::-;35506:9;35539:37;35570:5;35539:37;:::i;:::-;35526:50;;35448:134;;;:::o;35588:126::-;35638:9;35671:37;35702:5;35671:37;:::i;:::-;35658:50;;35588:126;;;:::o;35720:113::-;35770:9;35803:24;35821:5;35803:24;:::i;:::-;35790:37;;35720:113;;;:::o;35839:307::-;35907:1;35917:113;35931:6;35928:1;35925:13;35917:113;;;36016:1;36011:3;36007:11;36001:18;35997:1;35992:3;35988:11;35981:39;35953:2;35950:1;35946:10;35941:15;;35917:113;;;36048:6;36045:1;36042:13;36039:101;;;36128:1;36119:6;36114:3;36110:16;36103:27;36039:101;35888:258;35839:307;;;:::o;36152:171::-;36191:3;36214:24;36232:5;36214:24;:::i;:::-;36205:33;;36260:4;36253:5;36250:15;36247:41;;;36268:18;;:::i;:::-;36247:41;36315:1;36308:5;36304:13;36297:20;;36152:171;;;:::o;36329:320::-;36373:6;36410:1;36404:4;36400:12;36390:22;;36457:1;36451:4;36447:12;36478:18;36468:81;;36534:4;36526:6;36522:17;36512:27;;36468:81;36596:2;36588:6;36585:14;36565:18;36562:38;36559:84;;;36615:18;;:::i;:::-;36559:84;36380:269;36329:320;;;:::o;36655:180::-;36703:77;36700:1;36693:88;36800:4;36797:1;36790:15;36824:4;36821:1;36814:15;36841:180;36889:77;36886:1;36879:88;36986:4;36983:1;36976:15;37010:4;37007:1;37000:15;37027:180;37075:77;37072:1;37065:88;37172:4;37169:1;37162:15;37196:4;37193:1;37186:15;37213:180;37261:77;37258:1;37251:88;37358:4;37355:1;37348:15;37382:4;37379:1;37372:15;37399:180;37447:77;37444:1;37437:88;37544:4;37541:1;37534:15;37568:4;37565:1;37558:15;37585:180;37633:77;37630:1;37623:88;37730:4;37727:1;37720:15;37754:4;37751:1;37744:15;37894:117;38003:1;38000;37993:12;38017:102;38058:6;38109:2;38105:7;38100:2;38093:5;38089:14;38085:28;38075:38;;38017:102;;;:::o;38125:225::-;38265:34;38261:1;38253:6;38249:14;38242:58;38334:8;38329:2;38321:6;38317:15;38310:33;38125:225;:::o;38356:182::-;38496:34;38492:1;38484:6;38480:14;38473:58;38356:182;:::o;38544:::-;38684:34;38680:1;38672:6;38668:14;38661:58;38544:182;:::o;38732:170::-;38872:22;38868:1;38860:6;38856:14;38849:46;38732:170;:::o;38908:225::-;39048:34;39044:1;39036:6;39032:14;39025:58;39117:8;39112:2;39104:6;39100:15;39093:33;38908:225;:::o;39139:226::-;39279:34;39275:1;39267:6;39263:14;39256:58;39348:9;39343:2;39335:6;39331:15;39324:34;39139:226;:::o;39371:179::-;39511:31;39507:1;39499:6;39495:14;39488:55;39371:179;:::o;39556:227::-;39696:34;39692:1;39684:6;39680:14;39673:58;39765:10;39760:2;39752:6;39748:15;39741:35;39556:227;:::o;39789:222::-;39929:34;39925:1;39917:6;39913:14;39906:58;39998:5;39993:2;39985:6;39981:15;39974:30;39789:222;:::o;40017:::-;40157:34;40153:1;40145:6;40141:14;40134:58;40226:5;40221:2;40213:6;40209:15;40202:30;40017:222;:::o;40245:224::-;40385:34;40381:1;40373:6;40369:14;40362:58;40454:7;40449:2;40441:6;40437:15;40430:32;40245:224;:::o;40475:234::-;40615:34;40611:1;40603:6;40599:14;40592:58;40684:17;40679:2;40671:6;40667:15;40660:42;40475:234;:::o;40715:224::-;40855:34;40851:1;40843:6;40839:14;40832:58;40924:7;40919:2;40911:6;40907:15;40900:32;40715:224;:::o;40945:166::-;41085:18;41081:1;41073:6;41069:14;41062:42;40945:166;:::o;41117:225::-;41257:34;41253:1;41245:6;41241:14;41234:58;41326:8;41321:2;41313:6;41309:15;41302:33;41117:225;:::o;41348:240::-;41488:34;41484:1;41476:6;41472:14;41465:58;41557:23;41552:2;41544:6;41540:15;41533:48;41348:240;:::o;41594:224::-;41734:34;41730:1;41722:6;41718:14;41711:58;41803:7;41798:2;41790:6;41786:15;41779:32;41594:224;:::o;41824:235::-;41964:34;41960:1;41952:6;41948:14;41941:58;42033:18;42028:2;42020:6;42016:15;42009:43;41824:235;:::o;42065:180::-;42205:32;42201:1;42193:6;42189:14;42182:56;42065:180;:::o;42251:227::-;42391:34;42387:1;42379:6;42375:14;42368:58;42460:10;42455:2;42447:6;42443:15;42436:35;42251:227;:::o;42484:235::-;42624:34;42620:1;42612:6;42608:14;42601:58;42693:18;42688:2;42680:6;42676:15;42669:43;42484:235;:::o;42725:226::-;42865:34;42861:1;42853:6;42849:14;42842:58;42934:9;42929:2;42921:6;42917:15;42910:34;42725:226;:::o;42957:180::-;43097:32;43093:1;43085:6;43081:14;43074:56;42957:180;:::o;43143:221::-;43283:34;43279:1;43271:6;43267:14;43260:58;43352:4;43347:2;43339:6;43335:15;43328:29;43143:221;:::o;43370:173::-;43510:25;43506:1;43498:6;43494:14;43487:49;43370:173;:::o;43549:167::-;43689:19;43685:1;43677:6;43673:14;43666:43;43549:167;:::o;43722:234::-;43862:34;43858:1;43850:6;43846:14;43839:58;43931:17;43926:2;43918:6;43914:15;43907:42;43722:234;:::o;43962:229::-;44102:34;44098:1;44090:6;44086:14;44079:58;44171:12;44166:2;44158:6;44154:15;44147:37;43962:229;:::o;44197:122::-;44270:24;44288:5;44270:24;:::i;:::-;44263:5;44260:35;44250:63;;44309:1;44306;44299:12;44250:63;44197:122;:::o;44325:138::-;44406:32;44432:5;44406:32;:::i;:::-;44399:5;44396:43;44386:71;;44453:1;44450;44443:12;44386:71;44325:138;:::o;44469:116::-;44539:21;44554:5;44539:21;:::i;:::-;44532:5;44529:32;44519:60;;44575:1;44572;44565:12;44519:60;44469:116;:::o;44591:122::-;44664:24;44682:5;44664:24;:::i;:::-;44657:5;44654:35;44644:63;;44703:1;44700;44693:12;44644:63;44591:122;:::o;44719:::-;44792:24;44810:5;44792:24;:::i;:::-;44785:5;44782:35;44772:63;;44831:1;44828;44821:12;44772:63;44719:122;:::o

Swarm Source

ipfs://f8de59a9953b1bb8d26100e10ead3378f8d496da94f9b5fe87a43dc532dd89b1
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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