MATIC Price: $0.687826 (-3.43%)
Gas: 34 GWei
 

Overview

Max Total Supply

4,757.0000000000000005 Titan

Holders

1,357

Total Transfers

-

Market

Price

$0.00 @ 0.000000 MATIC

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
KoiosTitanTokenBulk

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2021-10-21
*/

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



pragma solidity ^0.8.0;

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

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



pragma solidity ^0.8.0;


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

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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

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

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



pragma solidity ^0.8.0;





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

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

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

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

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

    /**
     * @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 {
        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 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) public virtual override onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

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

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

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * [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}.
     * ====
     */
    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);
    }

    function _grantRole(bytes32 role, address account) private {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    function _revokeRole(bytes32 role, address account) private {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}

// File: @openzeppelin/contracts/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;

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

    /**
     * @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) public view 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) public view override returns (uint256) {
        return _roleMembers[role].length();
    }

    /**
     * @dev Overload {grantRole} to track enumerable memberships
     */
    function grantRole(bytes32 role, address account) public virtual override(AccessControl, IAccessControl) {
        super.grantRole(role, account);
        _roleMembers[role].add(account);
    }

    /**
     * @dev Overload {revokeRole} to track enumerable memberships
     */
    function revokeRole(bytes32 role, address account) public virtual override(AccessControl, IAccessControl) {
        super.revokeRole(role, account);
        _roleMembers[role].remove(account);
    }

    /**
     * @dev Overload {renounceRole} to track enumerable memberships
     */
    function renounceRole(bytes32 role, address account) public virtual override(AccessControl, IAccessControl) {
        super.renounceRole(role, account);
        _roleMembers[role].remove(account);
    }

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

// File: @openzeppelin/contracts/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: @openzeppelin/contracts/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 `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, 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 `sender` to `recipient` 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 sender,
        address recipient,
        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: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol



pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/contracts/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;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, 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}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), 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}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - 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) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][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) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        return true;
    }

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

        _beforeTokenTransfer(sender, recipient, amount);

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

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

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

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/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: @openzeppelin/contracts/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 {
        uint256 currentAllowance = allowance(account, _msgSender());
        require(currentAllowance >= amount, "ERC20: burn amount exceeds allowance");
        unchecked {
            _approve(account, _msgSender(), currentAllowance - amount);
        }
        _burn(account, amount);
    }
}

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



pragma solidity ^0.8.0;






/**
 * @dev {ERC20} token, including:
 *
 *  - ability for holders to burn (destroy) their tokens
 *  - a minter role that allows for token minting (creation)
 *  - a pauser role that allows to stop all token transfers
 *
 * This contract uses {AccessControl} to lock permissioned functions using the
 * different roles - head to its documentation for details.
 *
 * The account that deploys the contract will be granted the minter and pauser
 * roles, as well as the default admin role, which will let it grant both minter
 * and pauser roles to other accounts.
 */
contract ERC20PresetMinterPauser is Context, AccessControlEnumerable, ERC20Burnable, ERC20Pausable {
    bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
    bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE");

    /**
     * @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) ERC20(name, symbol) {
        _setupRole(DEFAULT_ADMIN_ROLE, _msgSender());

        _setupRole(MINTER_ROLE, _msgSender());
        _setupRole(PAUSER_ROLE, _msgSender());
    }

    /**
     * @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()), "ERC20PresetMinterPauser: must have minter role to mint");
        _mint(to, amount);
    }

    /**
     * @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()), "ERC20PresetMinterPauser: 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()), "ERC20PresetMinterPauser: 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);
    }
}

// File: token.sol

// KoiosTitanToken for https://www.koios.world

pragma solidity ^0.8.9;


contract KoiosTitanTokenBulk is ERC20PresetMinterPauser { // this adds the mint function
    bool public transfersEnabled=false; // initially disable transfers
    //Also inherits the following roles: 'DEFAULT_ADMIN_ROLE', 'MINTER_ROLE' and 'PAUSER_ROLE'
    bytes32 public constant ENABLETRANSFER_ROLE = keccak256("ENABLETRANSFER_ROLE");
    bytes32 public constant TRANSFER_ROLE       = keccak256("TRANSFER_ROLE"); // whitelist for transfers
    bytes32 public constant BULKTRANSFER_ROLE   = keccak256("BULKTRANSFER_ROLE"); // whitelist for bulk transfers

    constructor () ERC20PresetMinterPauser("Titan", "Titan") { 
       _setupRole(ENABLETRANSFER_ROLE, _msgSender());
       _setupRole(TRANSFER_ROLE, _msgSender());
    }   
  
    function enableTransfers(bool _transfersEnabled) public { // enable/disable transfers
        require(hasRole(ENABLETRANSFER_ROLE, _msgSender()), "Must have enabletransfer role to change");
        transfersEnabled = _transfersEnabled;
    }

    function _beforeTokenTransfer(address from,address to,uint256 amount) internal override {
        super._beforeTokenTransfer(from,to,amount); // check paused
        if (transfersEnabled     ||
            from == address(0)   ||
            hasRole(TRANSFER_ROLE, _msgSender()) ||
            hasRole(TRANSFER_ROLE, from) ||
            hasRole(TRANSFER_ROLE, to) 
        ) {
            return;  // transaction is ok
        }
        revert("Transfers disabled");
    }
    
    function transferBulk(address[] calldata recipients, uint256[] calldata amounts) public returns (bool) {      
        require(recipients.length == amounts.length,"Same length required");
        require(hasRole(BULKTRANSFER_ROLE, _msgSender()), "Must have bulktransfer role");
        for(uint256 i=0; i<recipients.length; i++)          
           _transfer(msg.sender, recipients[i], amounts[i]); // also requires TRANSFER_ROLE
        return true;
    }    
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":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":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":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"BULKTRANSFER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ENABLETRANSFER_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":"PAUSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRANSFER_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":[{"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":"bool","name":"_transfersEnabled","type":"bool"}],"name":"enableTransfers","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","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":"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":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"transferBulk","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transfersEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600760016101000a81548160ff0219169083151502179055503480156200002c57600080fd5b506040518060400160405280600581526020017f546974616e0000000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f546974616e00000000000000000000000000000000000000000000000000000081525081818160059080519060200190620000b3929190620004b0565b508060069080519060200190620000cc929190620004b0565b5050506000600760006101000a81548160ff0219169083151502179055506200010e6000801b620001026200021a60201b60201c565b6200022260201b60201c565b6200014f7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6620001436200021a60201b60201c565b6200022260201b60201c565b620001907f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a620001846200021a60201b60201c565b6200022260201b60201c565b5050620001d37f0aa6b7e6a4b9c47a105227fb9bb96ff0c45b9d9585e5e01551ea383aa6e2f358620001c76200021a60201b60201c565b6200022260201b60201c565b620002147f8502233096d909befbda0999bb8ea2f3a6be3c138b9fbf003752a4c8bce86f6c620002086200021a60201b60201c565b6200022260201b60201c565b620005c5565b600033905090565b6200023982826200026a60201b620012251760201c565b6200026581600160008581526020019081526020016000206200028060201b620012331790919060201c565b505050565b6200027c8282620002b860201b60201c565b5050565b6000620002b0836000018373ffffffffffffffffffffffffffffffffffffffff1660001b620003a960201b60201c565b905092915050565b620002ca82826200042360201b60201c565b620003a557600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506200034a6200021a60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000620003bd83836200048d60201b60201c565b620004185782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506200041d565b600090505b92915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b828054620004be906200058f565b90600052602060002090601f016020900481019282620004e257600085556200052e565b82601f10620004fd57805160ff19168380011785556200052e565b828001600101855582156200052e579182015b828111156200052d57825182559160200191906001019062000510565b5b5090506200053d919062000541565b5090565b5b808211156200055c57600081600090555060010162000542565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620005a857607f821691505b60208210811415620005bf57620005be62000560565b5b50919050565b613bb080620005d56000396000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c806379cc67901161011a578063a9059cbb116100ad578063d547741f1161007c578063d547741f14610617578063dd62ed3e14610633578063e63ab1e914610663578063f0ab392314610681578063f41e60c51461069f57610206565b8063a9059cbb1461057b578063bef97c87146105ab578063ca15c873146105c9578063d5391393146105f957610206565b80639316c3e7116100e95780639316c3e7146104df57806395d89b411461050f578063a217fddf1461052d578063a457c2d71461054b57610206565b806379cc6790146104595780638456cb59146104755780639010d07c1461047f57806391d14854146104af57610206565b8063313ce5671161019d57806340c10f191161016c57806340c10f19146103b557806342966c68146103d15780635bffbfdb146103ed5780635c975abb1461040b57806370a082311461042957610206565b8063313ce5671461034157806336568abe1461035f578063395093511461037b5780633f4ba83a146103ab57610206565b8063206b60f9116101d9578063206b60f9146102a757806323b872dd146102c5578063248a9ca3146102f55780632f2ff15d1461032557610206565b806301ffc9a71461020b57806306fdde031461023b578063095ea7b31461025957806318160ddd14610289575b600080fd5b610225600480360381019061022091906125d8565b6106bb565b6040516102329190612620565b60405180910390f35b610243610735565b60405161025091906126d4565b60405180910390f35b610273600480360381019061026e919061278a565b6107c7565b6040516102809190612620565b60405180910390f35b6102916107e5565b60405161029e91906127d9565b60405180910390f35b6102af6107ef565b6040516102bc919061280d565b60405180910390f35b6102df60048036038101906102da9190612828565b610813565b6040516102ec9190612620565b60405180910390f35b61030f600480360381019061030a91906128a7565b61090b565b60405161031c919061280d565b60405180910390f35b61033f600480360381019061033a91906128d4565b61092a565b005b61034961095e565b6040516103569190612930565b60405180910390f35b610379600480360381019061037491906128d4565b610967565b005b6103956004803603810190610390919061278a565b61099b565b6040516103a29190612620565b60405180910390f35b6103b3610a47565b005b6103cf60048036038101906103ca919061278a565b610ac1565b005b6103eb60048036038101906103e6919061294b565b610b3f565b005b6103f5610b53565b604051610402919061280d565b60405180910390f35b610413610b77565b6040516104209190612620565b60405180910390f35b610443600480360381019061043e9190612978565b610b8e565b60405161045091906127d9565b60405180910390f35b610473600480360381019061046e919061278a565b610bd7565b005b61047d610c52565b005b610499600480360381019061049491906129a5565b610ccc565b6040516104a691906129f4565b60405180910390f35b6104c960048036038101906104c491906128d4565b610cfb565b6040516104d69190612620565b60405180910390f35b6104f960048036038101906104f49190612aca565b610d65565b6040516105069190612620565b60405180910390f35b610517610e98565b60405161052491906126d4565b60405180910390f35b610535610f2a565b604051610542919061280d565b60405180910390f35b6105656004803603810190610560919061278a565b610f31565b6040516105729190612620565b60405180910390f35b6105956004803603810190610590919061278a565b61101c565b6040516105a29190612620565b60405180910390f35b6105b361103a565b6040516105c09190612620565b60405180910390f35b6105e360048036038101906105de91906128a7565b61104d565b6040516105f091906127d9565b60405180910390f35b610601611071565b60405161060e919061280d565b60405180910390f35b610631600480360381019061062c91906128d4565b611095565b005b61064d60048036038101906106489190612b4b565b6110c9565b60405161065a91906127d9565b60405180910390f35b61066b611150565b604051610678919061280d565b60405180910390f35b610689611174565b604051610696919061280d565b60405180910390f35b6106b960048036038101906106b49190612bb7565b611198565b005b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061072e575061072d82611263565b5b9050919050565b60606005805461074490612c13565b80601f016020809104026020016040519081016040528092919081815260200182805461077090612c13565b80156107bd5780601f10610792576101008083540402835291602001916107bd565b820191906000526020600020905b8154815290600101906020018083116107a057829003601f168201915b5050505050905090565b60006107db6107d46112dd565b84846112e5565b6001905092915050565b6000600454905090565b7f8502233096d909befbda0999bb8ea2f3a6be3c138b9fbf003752a4c8bce86f6c81565b60006108208484846114b0565b6000600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061086b6112dd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156108eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e290612cb7565b60405180910390fd5b6108ff856108f76112dd565b8584036112e5565b60019150509392505050565b6000806000838152602001908152602001600020600101549050919050565b6109348282611734565b610959816001600085815260200190815260200160002061123390919063ffffffff16565b505050565b60006012905090565b610971828261175d565b61099681600160008581526020019081526020016000206117e090919063ffffffff16565b505050565b6000610a3d6109a86112dd565b8484600360006109b66112dd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610a389190612d06565b6112e5565b6001905092915050565b610a787f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610a736112dd565b610cfb565b610ab7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aae90612dce565b60405180910390fd5b610abf611810565b565b610af27f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610aed6112dd565b610cfb565b610b31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2890612e60565b60405180910390fd5b610b3b82826118b2565b5050565b610b50610b4a6112dd565b82611a13565b50565b7f59fc6dd6f4ddf76f822cfeab79d756e55501947efa48a1a7715a4799b38f2b7581565b6000600760009054906101000a900460ff16905090565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000610bea83610be56112dd565b6110c9565b905081811015610c2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2690612ef2565b60405180910390fd5b610c4383610c3b6112dd565b8484036112e5565b610c4d8383611a13565b505050565b610c837f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610c7e6112dd565b610cfb565b610cc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb990612f84565b60405180910390fd5b610cca611bec565b565b6000610cf38260016000868152602001908152602001600020611c8f90919063ffffffff16565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000828290508585905014610daf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da690612ff0565b60405180910390fd5b610de07f59fc6dd6f4ddf76f822cfeab79d756e55501947efa48a1a7715a4799b38f2b75610ddb6112dd565b610cfb565b610e1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e169061305c565b60405180910390fd5b60005b85859050811015610e8b57610e7833878784818110610e4457610e4361307c565b5b9050602002016020810190610e599190612978565b868685818110610e6c57610e6b61307c565b5b905060200201356114b0565b8080610e83906130ab565b915050610e22565b5060019050949350505050565b606060068054610ea790612c13565b80601f0160208091040260200160405190810160405280929190818152602001828054610ed390612c13565b8015610f205780601f10610ef557610100808354040283529160200191610f20565b820191906000526020600020905b815481529060010190602001808311610f0357829003601f168201915b5050505050905090565b6000801b81565b60008060036000610f406112dd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610ffd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff490613166565b60405180910390fd5b6110116110086112dd565b858584036112e5565b600191505092915050565b60006110306110296112dd565b84846114b0565b6001905092915050565b600760019054906101000a900460ff1681565b600061106a60016000848152602001908152602001600020611ca9565b9050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b61109f8282611cbe565b6110c481600160008581526020019081526020016000206117e090919063ffffffff16565b505050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b7f0aa6b7e6a4b9c47a105227fb9bb96ff0c45b9d9585e5e01551ea383aa6e2f35881565b6111c97f0aa6b7e6a4b9c47a105227fb9bb96ff0c45b9d9585e5e01551ea383aa6e2f3586111c46112dd565b610cfb565b611208576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ff906131f8565b60405180910390fd5b80600760016101000a81548160ff02191690831515021790555050565b61122f8282611ce7565b5050565b600061125b836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611dc7565b905092915050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806112d657506112d582611e37565b5b9050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611355576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134c9061328a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bc9061331c565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516114a391906127d9565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611520576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611517906133ae565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611590576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158790613440565b60405180910390fd5b61159b838383611ea1565b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611622576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611619906134d2565b60405180910390fd5b818103600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116b79190612d06565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161171b91906127d9565b60405180910390a361172e848484611fd7565b50505050565b61173d8261090b565b61174e816117496112dd565b611fdc565b6117588383611ce7565b505050565b6117656112dd565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146117d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c990613564565b60405180910390fd5b6117dc8282612079565b5050565b6000611808836000018373ffffffffffffffffffffffffffffffffffffffff1660001b61215a565b905092915050565b611818610b77565b611857576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184e906135d0565b60405180910390fd5b6000600760006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61189b6112dd565b6040516118a891906129f4565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611922576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119199061363c565b60405180910390fd5b61192e60008383611ea1565b80600460008282546119409190612d06565b9250508190555080600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119969190612d06565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516119fb91906127d9565b60405180910390a3611a0f60008383611fd7565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7a906136ce565b60405180910390fd5b611a8f82600083611ea1565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611b16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0d90613760565b60405180910390fd5b818103600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160046000828254611b6e9190613780565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611bd391906127d9565b60405180910390a3611be783600084611fd7565b505050565b611bf4610b77565b15611c34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2b90613800565b60405180910390fd5b6001600760006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611c786112dd565b604051611c8591906129f4565b60405180910390a1565b6000611c9e836000018361226e565b60001c905092915050565b6000611cb782600001612299565b9050919050565b611cc78261090b565b611cd881611cd36112dd565b611fdc565b611ce28383612079565b505050565b611cf18282610cfb565b611dc357600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611d686112dd565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000611dd383836122aa565b611e2c578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050611e31565b600090505b92915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611eac8383836122cd565b600760019054906101000a900460ff1680611ef35750600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b80611f2b5750611f2a7f8502233096d909befbda0999bb8ea2f3a6be3c138b9fbf003752a4c8bce86f6c611f256112dd565b610cfb565b5b80611f5c5750611f5b7f8502233096d909befbda0999bb8ea2f3a6be3c138b9fbf003752a4c8bce86f6c84610cfb565b5b80611f8d5750611f8c7f8502233096d909befbda0999bb8ea2f3a6be3c138b9fbf003752a4c8bce86f6c83610cfb565b5b15611f9757611fd2565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc99061386c565b60405180910390fd5b505050565b505050565b611fe68282610cfb565b6120755761200b8173ffffffffffffffffffffffffffffffffffffffff1660146122dd565b6120198360001c60206122dd565b60405160200161202a929190613960565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206c91906126d4565b60405180910390fd5b5050565b6120838282610cfb565b1561215657600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506120fb6112dd565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000808360010160008481526020019081526020016000205490506000811461226257600060018261218c9190613780565b90506000600186600001805490506121a49190613780565b90508181146122135760008660000182815481106121c5576121c461307c565b5b90600052602060002001549050808760000184815481106121e9576121e861307c565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b856000018054806122275761222661399a565b5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050612268565b60009150505b92915050565b60008260000182815481106122865761228561307c565b5b9060005260206000200154905092915050565b600081600001805490509050919050565b600080836001016000848152602001908152602001600020541415905092915050565b6122d8838383612519565b505050565b6060600060028360026122f091906139c9565b6122fa9190612d06565b67ffffffffffffffff81111561231357612312613a23565b5b6040519080825280601f01601f1916602001820160405280156123455781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061237d5761237c61307c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106123e1576123e061307c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000600184600261242191906139c9565b61242b9190612d06565b90505b60018111156124cb577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061246d5761246c61307c565b5b1a60f81b8282815181106124845761248361307c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806124c490613a52565b905061242e565b506000841461250f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250690613ac8565b60405180910390fd5b8091505092915050565b612524838383612571565b61252c610b77565b1561256c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256390613b5a565b60405180910390fd5b505050565b505050565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6125b581612580565b81146125c057600080fd5b50565b6000813590506125d2816125ac565b92915050565b6000602082840312156125ee576125ed612576565b5b60006125fc848285016125c3565b91505092915050565b60008115159050919050565b61261a81612605565b82525050565b60006020820190506126356000830184612611565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561267557808201518184015260208101905061265a565b83811115612684576000848401525b50505050565b6000601f19601f8301169050919050565b60006126a68261263b565b6126b08185612646565b93506126c0818560208601612657565b6126c98161268a565b840191505092915050565b600060208201905081810360008301526126ee818461269b565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612721826126f6565b9050919050565b61273181612716565b811461273c57600080fd5b50565b60008135905061274e81612728565b92915050565b6000819050919050565b61276781612754565b811461277257600080fd5b50565b6000813590506127848161275e565b92915050565b600080604083850312156127a1576127a0612576565b5b60006127af8582860161273f565b92505060206127c085828601612775565b9150509250929050565b6127d381612754565b82525050565b60006020820190506127ee60008301846127ca565b92915050565b6000819050919050565b612807816127f4565b82525050565b600060208201905061282260008301846127fe565b92915050565b60008060006060848603121561284157612840612576565b5b600061284f8682870161273f565b93505060206128608682870161273f565b925050604061287186828701612775565b9150509250925092565b612884816127f4565b811461288f57600080fd5b50565b6000813590506128a18161287b565b92915050565b6000602082840312156128bd576128bc612576565b5b60006128cb84828501612892565b91505092915050565b600080604083850312156128eb576128ea612576565b5b60006128f985828601612892565b925050602061290a8582860161273f565b9150509250929050565b600060ff82169050919050565b61292a81612914565b82525050565b60006020820190506129456000830184612921565b92915050565b60006020828403121561296157612960612576565b5b600061296f84828501612775565b91505092915050565b60006020828403121561298e5761298d612576565b5b600061299c8482850161273f565b91505092915050565b600080604083850312156129bc576129bb612576565b5b60006129ca85828601612892565b92505060206129db85828601612775565b9150509250929050565b6129ee81612716565b82525050565b6000602082019050612a0960008301846129e5565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112612a3457612a33612a0f565b5b8235905067ffffffffffffffff811115612a5157612a50612a14565b5b602083019150836020820283011115612a6d57612a6c612a19565b5b9250929050565b60008083601f840112612a8a57612a89612a0f565b5b8235905067ffffffffffffffff811115612aa757612aa6612a14565b5b602083019150836020820283011115612ac357612ac2612a19565b5b9250929050565b60008060008060408587031215612ae457612ae3612576565b5b600085013567ffffffffffffffff811115612b0257612b0161257b565b5b612b0e87828801612a1e565b9450945050602085013567ffffffffffffffff811115612b3157612b3061257b565b5b612b3d87828801612a74565b925092505092959194509250565b60008060408385031215612b6257612b61612576565b5b6000612b708582860161273f565b9250506020612b818582860161273f565b9150509250929050565b612b9481612605565b8114612b9f57600080fd5b50565b600081359050612bb181612b8b565b92915050565b600060208284031215612bcd57612bcc612576565b5b6000612bdb84828501612ba2565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612c2b57607f821691505b60208210811415612c3f57612c3e612be4565b5b50919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b6000612ca1602883612646565b9150612cac82612c45565b604082019050919050565b60006020820190508181036000830152612cd081612c94565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612d1182612754565b9150612d1c83612754565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612d5157612d50612cd7565b5b828201905092915050565b7f45524332305072657365744d696e7465725061757365723a206d75737420686160008201527f76652070617573657220726f6c6520746f20756e706175736500000000000000602082015250565b6000612db8603983612646565b9150612dc382612d5c565b604082019050919050565b60006020820190508181036000830152612de781612dab565b9050919050565b7f45524332305072657365744d696e7465725061757365723a206d75737420686160008201527f7665206d696e74657220726f6c6520746f206d696e7400000000000000000000602082015250565b6000612e4a603683612646565b9150612e5582612dee565b604082019050919050565b60006020820190508181036000830152612e7981612e3d565b9050919050565b7f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f7760008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b6000612edc602483612646565b9150612ee782612e80565b604082019050919050565b60006020820190508181036000830152612f0b81612ecf565b9050919050565b7f45524332305072657365744d696e7465725061757365723a206d75737420686160008201527f76652070617573657220726f6c6520746f207061757365000000000000000000602082015250565b6000612f6e603783612646565b9150612f7982612f12565b604082019050919050565b60006020820190508181036000830152612f9d81612f61565b9050919050565b7f53616d65206c656e677468207265717569726564000000000000000000000000600082015250565b6000612fda601483612646565b9150612fe582612fa4565b602082019050919050565b6000602082019050818103600083015261300981612fcd565b9050919050565b7f4d75737420686176652062756c6b7472616e7366657220726f6c650000000000600082015250565b6000613046601b83612646565b915061305182613010565b602082019050919050565b6000602082019050818103600083015261307581613039565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006130b682612754565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156130e9576130e8612cd7565b5b600182019050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000613150602583612646565b915061315b826130f4565b604082019050919050565b6000602082019050818103600083015261317f81613143565b9050919050565b7f4d757374206861766520656e61626c657472616e7366657220726f6c6520746f60008201527f206368616e676500000000000000000000000000000000000000000000000000602082015250565b60006131e2602783612646565b91506131ed82613186565b604082019050919050565b60006020820190508181036000830152613211816131d5565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613274602483612646565b915061327f82613218565b604082019050919050565b600060208201905081810360008301526132a381613267565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000613306602283612646565b9150613311826132aa565b604082019050919050565b60006020820190508181036000830152613335816132f9565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000613398602583612646565b91506133a38261333c565b604082019050919050565b600060208201905081810360008301526133c78161338b565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061342a602383612646565b9150613435826133ce565b604082019050919050565b600060208201905081810360008301526134598161341d565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006134bc602683612646565b91506134c782613460565b604082019050919050565b600060208201905081810360008301526134eb816134af565b9050919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b600061354e602f83612646565b9150613559826134f2565b604082019050919050565b6000602082019050818103600083015261357d81613541565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b60006135ba601483612646565b91506135c582613584565b602082019050919050565b600060208201905081810360008301526135e9816135ad565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000613626601f83612646565b9150613631826135f0565b602082019050919050565b6000602082019050818103600083015261365581613619565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006136b8602183612646565b91506136c38261365c565b604082019050919050565b600060208201905081810360008301526136e7816136ab565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b600061374a602283612646565b9150613755826136ee565b604082019050919050565b600060208201905081810360008301526137798161373d565b9050919050565b600061378b82612754565b915061379683612754565b9250828210156137a9576137a8612cd7565b5b828203905092915050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b60006137ea601083612646565b91506137f5826137b4565b602082019050919050565b60006020820190508181036000830152613819816137dd565b9050919050565b7f5472616e73666572732064697361626c65640000000000000000000000000000600082015250565b6000613856601283612646565b915061386182613820565b602082019050919050565b6000602082019050818103600083015261388581613849565b9050919050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b60006138cd60178361388c565b91506138d882613897565b601782019050919050565b60006138ee8261263b565b6138f8818561388c565b9350613908818560208601612657565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b600061394a60118361388c565b915061395582613914565b601182019050919050565b600061396b826138c0565b915061397782856138e3565b91506139828261393d565b915061398e82846138e3565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60006139d482612754565b91506139df83612754565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a1857613a17612cd7565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000613a5d82612754565b91506000821415613a7157613a70612cd7565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000613ab2602083612646565b9150613abd82613a7c565b602082019050919050565b60006020820190508181036000830152613ae181613aa5565b9050919050565b7f45524332305061757361626c653a20746f6b656e207472616e7366657220776860008201527f696c652070617573656400000000000000000000000000000000000000000000602082015250565b6000613b44602a83612646565b9150613b4f82613ae8565b604082019050919050565b60006020820190508181036000830152613b7381613b37565b905091905056fea2646970667358221220f0be741e88c026a2541c26f4cfe1b2cf45f6edb5881fdf60c3695df5d0b9ca0164736f6c63430008090033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102065760003560e01c806379cc67901161011a578063a9059cbb116100ad578063d547741f1161007c578063d547741f14610617578063dd62ed3e14610633578063e63ab1e914610663578063f0ab392314610681578063f41e60c51461069f57610206565b8063a9059cbb1461057b578063bef97c87146105ab578063ca15c873146105c9578063d5391393146105f957610206565b80639316c3e7116100e95780639316c3e7146104df57806395d89b411461050f578063a217fddf1461052d578063a457c2d71461054b57610206565b806379cc6790146104595780638456cb59146104755780639010d07c1461047f57806391d14854146104af57610206565b8063313ce5671161019d57806340c10f191161016c57806340c10f19146103b557806342966c68146103d15780635bffbfdb146103ed5780635c975abb1461040b57806370a082311461042957610206565b8063313ce5671461034157806336568abe1461035f578063395093511461037b5780633f4ba83a146103ab57610206565b8063206b60f9116101d9578063206b60f9146102a757806323b872dd146102c5578063248a9ca3146102f55780632f2ff15d1461032557610206565b806301ffc9a71461020b57806306fdde031461023b578063095ea7b31461025957806318160ddd14610289575b600080fd5b610225600480360381019061022091906125d8565b6106bb565b6040516102329190612620565b60405180910390f35b610243610735565b60405161025091906126d4565b60405180910390f35b610273600480360381019061026e919061278a565b6107c7565b6040516102809190612620565b60405180910390f35b6102916107e5565b60405161029e91906127d9565b60405180910390f35b6102af6107ef565b6040516102bc919061280d565b60405180910390f35b6102df60048036038101906102da9190612828565b610813565b6040516102ec9190612620565b60405180910390f35b61030f600480360381019061030a91906128a7565b61090b565b60405161031c919061280d565b60405180910390f35b61033f600480360381019061033a91906128d4565b61092a565b005b61034961095e565b6040516103569190612930565b60405180910390f35b610379600480360381019061037491906128d4565b610967565b005b6103956004803603810190610390919061278a565b61099b565b6040516103a29190612620565b60405180910390f35b6103b3610a47565b005b6103cf60048036038101906103ca919061278a565b610ac1565b005b6103eb60048036038101906103e6919061294b565b610b3f565b005b6103f5610b53565b604051610402919061280d565b60405180910390f35b610413610b77565b6040516104209190612620565b60405180910390f35b610443600480360381019061043e9190612978565b610b8e565b60405161045091906127d9565b60405180910390f35b610473600480360381019061046e919061278a565b610bd7565b005b61047d610c52565b005b610499600480360381019061049491906129a5565b610ccc565b6040516104a691906129f4565b60405180910390f35b6104c960048036038101906104c491906128d4565b610cfb565b6040516104d69190612620565b60405180910390f35b6104f960048036038101906104f49190612aca565b610d65565b6040516105069190612620565b60405180910390f35b610517610e98565b60405161052491906126d4565b60405180910390f35b610535610f2a565b604051610542919061280d565b60405180910390f35b6105656004803603810190610560919061278a565b610f31565b6040516105729190612620565b60405180910390f35b6105956004803603810190610590919061278a565b61101c565b6040516105a29190612620565b60405180910390f35b6105b361103a565b6040516105c09190612620565b60405180910390f35b6105e360048036038101906105de91906128a7565b61104d565b6040516105f091906127d9565b60405180910390f35b610601611071565b60405161060e919061280d565b60405180910390f35b610631600480360381019061062c91906128d4565b611095565b005b61064d60048036038101906106489190612b4b565b6110c9565b60405161065a91906127d9565b60405180910390f35b61066b611150565b604051610678919061280d565b60405180910390f35b610689611174565b604051610696919061280d565b60405180910390f35b6106b960048036038101906106b49190612bb7565b611198565b005b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061072e575061072d82611263565b5b9050919050565b60606005805461074490612c13565b80601f016020809104026020016040519081016040528092919081815260200182805461077090612c13565b80156107bd5780601f10610792576101008083540402835291602001916107bd565b820191906000526020600020905b8154815290600101906020018083116107a057829003601f168201915b5050505050905090565b60006107db6107d46112dd565b84846112e5565b6001905092915050565b6000600454905090565b7f8502233096d909befbda0999bb8ea2f3a6be3c138b9fbf003752a4c8bce86f6c81565b60006108208484846114b0565b6000600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061086b6112dd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156108eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e290612cb7565b60405180910390fd5b6108ff856108f76112dd565b8584036112e5565b60019150509392505050565b6000806000838152602001908152602001600020600101549050919050565b6109348282611734565b610959816001600085815260200190815260200160002061123390919063ffffffff16565b505050565b60006012905090565b610971828261175d565b61099681600160008581526020019081526020016000206117e090919063ffffffff16565b505050565b6000610a3d6109a86112dd565b8484600360006109b66112dd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610a389190612d06565b6112e5565b6001905092915050565b610a787f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610a736112dd565b610cfb565b610ab7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aae90612dce565b60405180910390fd5b610abf611810565b565b610af27f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610aed6112dd565b610cfb565b610b31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2890612e60565b60405180910390fd5b610b3b82826118b2565b5050565b610b50610b4a6112dd565b82611a13565b50565b7f59fc6dd6f4ddf76f822cfeab79d756e55501947efa48a1a7715a4799b38f2b7581565b6000600760009054906101000a900460ff16905090565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000610bea83610be56112dd565b6110c9565b905081811015610c2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2690612ef2565b60405180910390fd5b610c4383610c3b6112dd565b8484036112e5565b610c4d8383611a13565b505050565b610c837f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610c7e6112dd565b610cfb565b610cc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb990612f84565b60405180910390fd5b610cca611bec565b565b6000610cf38260016000868152602001908152602001600020611c8f90919063ffffffff16565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000828290508585905014610daf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da690612ff0565b60405180910390fd5b610de07f59fc6dd6f4ddf76f822cfeab79d756e55501947efa48a1a7715a4799b38f2b75610ddb6112dd565b610cfb565b610e1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e169061305c565b60405180910390fd5b60005b85859050811015610e8b57610e7833878784818110610e4457610e4361307c565b5b9050602002016020810190610e599190612978565b868685818110610e6c57610e6b61307c565b5b905060200201356114b0565b8080610e83906130ab565b915050610e22565b5060019050949350505050565b606060068054610ea790612c13565b80601f0160208091040260200160405190810160405280929190818152602001828054610ed390612c13565b8015610f205780601f10610ef557610100808354040283529160200191610f20565b820191906000526020600020905b815481529060010190602001808311610f0357829003601f168201915b5050505050905090565b6000801b81565b60008060036000610f406112dd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610ffd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff490613166565b60405180910390fd5b6110116110086112dd565b858584036112e5565b600191505092915050565b60006110306110296112dd565b84846114b0565b6001905092915050565b600760019054906101000a900460ff1681565b600061106a60016000848152602001908152602001600020611ca9565b9050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b61109f8282611cbe565b6110c481600160008581526020019081526020016000206117e090919063ffffffff16565b505050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b7f0aa6b7e6a4b9c47a105227fb9bb96ff0c45b9d9585e5e01551ea383aa6e2f35881565b6111c97f0aa6b7e6a4b9c47a105227fb9bb96ff0c45b9d9585e5e01551ea383aa6e2f3586111c46112dd565b610cfb565b611208576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ff906131f8565b60405180910390fd5b80600760016101000a81548160ff02191690831515021790555050565b61122f8282611ce7565b5050565b600061125b836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611dc7565b905092915050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806112d657506112d582611e37565b5b9050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611355576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134c9061328a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bc9061331c565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516114a391906127d9565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611520576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611517906133ae565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611590576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158790613440565b60405180910390fd5b61159b838383611ea1565b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611622576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611619906134d2565b60405180910390fd5b818103600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116b79190612d06565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161171b91906127d9565b60405180910390a361172e848484611fd7565b50505050565b61173d8261090b565b61174e816117496112dd565b611fdc565b6117588383611ce7565b505050565b6117656112dd565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146117d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c990613564565b60405180910390fd5b6117dc8282612079565b5050565b6000611808836000018373ffffffffffffffffffffffffffffffffffffffff1660001b61215a565b905092915050565b611818610b77565b611857576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184e906135d0565b60405180910390fd5b6000600760006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61189b6112dd565b6040516118a891906129f4565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611922576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119199061363c565b60405180910390fd5b61192e60008383611ea1565b80600460008282546119409190612d06565b9250508190555080600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119969190612d06565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516119fb91906127d9565b60405180910390a3611a0f60008383611fd7565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7a906136ce565b60405180910390fd5b611a8f82600083611ea1565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611b16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0d90613760565b60405180910390fd5b818103600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160046000828254611b6e9190613780565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611bd391906127d9565b60405180910390a3611be783600084611fd7565b505050565b611bf4610b77565b15611c34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2b90613800565b60405180910390fd5b6001600760006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611c786112dd565b604051611c8591906129f4565b60405180910390a1565b6000611c9e836000018361226e565b60001c905092915050565b6000611cb782600001612299565b9050919050565b611cc78261090b565b611cd881611cd36112dd565b611fdc565b611ce28383612079565b505050565b611cf18282610cfb565b611dc357600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611d686112dd565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000611dd383836122aa565b611e2c578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050611e31565b600090505b92915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611eac8383836122cd565b600760019054906101000a900460ff1680611ef35750600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b80611f2b5750611f2a7f8502233096d909befbda0999bb8ea2f3a6be3c138b9fbf003752a4c8bce86f6c611f256112dd565b610cfb565b5b80611f5c5750611f5b7f8502233096d909befbda0999bb8ea2f3a6be3c138b9fbf003752a4c8bce86f6c84610cfb565b5b80611f8d5750611f8c7f8502233096d909befbda0999bb8ea2f3a6be3c138b9fbf003752a4c8bce86f6c83610cfb565b5b15611f9757611fd2565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc99061386c565b60405180910390fd5b505050565b505050565b611fe68282610cfb565b6120755761200b8173ffffffffffffffffffffffffffffffffffffffff1660146122dd565b6120198360001c60206122dd565b60405160200161202a929190613960565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206c91906126d4565b60405180910390fd5b5050565b6120838282610cfb565b1561215657600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506120fb6112dd565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000808360010160008481526020019081526020016000205490506000811461226257600060018261218c9190613780565b90506000600186600001805490506121a49190613780565b90508181146122135760008660000182815481106121c5576121c461307c565b5b90600052602060002001549050808760000184815481106121e9576121e861307c565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b856000018054806122275761222661399a565b5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050612268565b60009150505b92915050565b60008260000182815481106122865761228561307c565b5b9060005260206000200154905092915050565b600081600001805490509050919050565b600080836001016000848152602001908152602001600020541415905092915050565b6122d8838383612519565b505050565b6060600060028360026122f091906139c9565b6122fa9190612d06565b67ffffffffffffffff81111561231357612312613a23565b5b6040519080825280601f01601f1916602001820160405280156123455781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061237d5761237c61307c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106123e1576123e061307c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000600184600261242191906139c9565b61242b9190612d06565b90505b60018111156124cb577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061246d5761246c61307c565b5b1a60f81b8282815181106124845761248361307c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806124c490613a52565b905061242e565b506000841461250f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250690613ac8565b60405180910390fd5b8091505092915050565b612524838383612571565b61252c610b77565b1561256c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256390613b5a565b60405180910390fd5b505050565b505050565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6125b581612580565b81146125c057600080fd5b50565b6000813590506125d2816125ac565b92915050565b6000602082840312156125ee576125ed612576565b5b60006125fc848285016125c3565b91505092915050565b60008115159050919050565b61261a81612605565b82525050565b60006020820190506126356000830184612611565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561267557808201518184015260208101905061265a565b83811115612684576000848401525b50505050565b6000601f19601f8301169050919050565b60006126a68261263b565b6126b08185612646565b93506126c0818560208601612657565b6126c98161268a565b840191505092915050565b600060208201905081810360008301526126ee818461269b565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612721826126f6565b9050919050565b61273181612716565b811461273c57600080fd5b50565b60008135905061274e81612728565b92915050565b6000819050919050565b61276781612754565b811461277257600080fd5b50565b6000813590506127848161275e565b92915050565b600080604083850312156127a1576127a0612576565b5b60006127af8582860161273f565b92505060206127c085828601612775565b9150509250929050565b6127d381612754565b82525050565b60006020820190506127ee60008301846127ca565b92915050565b6000819050919050565b612807816127f4565b82525050565b600060208201905061282260008301846127fe565b92915050565b60008060006060848603121561284157612840612576565b5b600061284f8682870161273f565b93505060206128608682870161273f565b925050604061287186828701612775565b9150509250925092565b612884816127f4565b811461288f57600080fd5b50565b6000813590506128a18161287b565b92915050565b6000602082840312156128bd576128bc612576565b5b60006128cb84828501612892565b91505092915050565b600080604083850312156128eb576128ea612576565b5b60006128f985828601612892565b925050602061290a8582860161273f565b9150509250929050565b600060ff82169050919050565b61292a81612914565b82525050565b60006020820190506129456000830184612921565b92915050565b60006020828403121561296157612960612576565b5b600061296f84828501612775565b91505092915050565b60006020828403121561298e5761298d612576565b5b600061299c8482850161273f565b91505092915050565b600080604083850312156129bc576129bb612576565b5b60006129ca85828601612892565b92505060206129db85828601612775565b9150509250929050565b6129ee81612716565b82525050565b6000602082019050612a0960008301846129e5565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112612a3457612a33612a0f565b5b8235905067ffffffffffffffff811115612a5157612a50612a14565b5b602083019150836020820283011115612a6d57612a6c612a19565b5b9250929050565b60008083601f840112612a8a57612a89612a0f565b5b8235905067ffffffffffffffff811115612aa757612aa6612a14565b5b602083019150836020820283011115612ac357612ac2612a19565b5b9250929050565b60008060008060408587031215612ae457612ae3612576565b5b600085013567ffffffffffffffff811115612b0257612b0161257b565b5b612b0e87828801612a1e565b9450945050602085013567ffffffffffffffff811115612b3157612b3061257b565b5b612b3d87828801612a74565b925092505092959194509250565b60008060408385031215612b6257612b61612576565b5b6000612b708582860161273f565b9250506020612b818582860161273f565b9150509250929050565b612b9481612605565b8114612b9f57600080fd5b50565b600081359050612bb181612b8b565b92915050565b600060208284031215612bcd57612bcc612576565b5b6000612bdb84828501612ba2565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612c2b57607f821691505b60208210811415612c3f57612c3e612be4565b5b50919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b6000612ca1602883612646565b9150612cac82612c45565b604082019050919050565b60006020820190508181036000830152612cd081612c94565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612d1182612754565b9150612d1c83612754565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612d5157612d50612cd7565b5b828201905092915050565b7f45524332305072657365744d696e7465725061757365723a206d75737420686160008201527f76652070617573657220726f6c6520746f20756e706175736500000000000000602082015250565b6000612db8603983612646565b9150612dc382612d5c565b604082019050919050565b60006020820190508181036000830152612de781612dab565b9050919050565b7f45524332305072657365744d696e7465725061757365723a206d75737420686160008201527f7665206d696e74657220726f6c6520746f206d696e7400000000000000000000602082015250565b6000612e4a603683612646565b9150612e5582612dee565b604082019050919050565b60006020820190508181036000830152612e7981612e3d565b9050919050565b7f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f7760008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b6000612edc602483612646565b9150612ee782612e80565b604082019050919050565b60006020820190508181036000830152612f0b81612ecf565b9050919050565b7f45524332305072657365744d696e7465725061757365723a206d75737420686160008201527f76652070617573657220726f6c6520746f207061757365000000000000000000602082015250565b6000612f6e603783612646565b9150612f7982612f12565b604082019050919050565b60006020820190508181036000830152612f9d81612f61565b9050919050565b7f53616d65206c656e677468207265717569726564000000000000000000000000600082015250565b6000612fda601483612646565b9150612fe582612fa4565b602082019050919050565b6000602082019050818103600083015261300981612fcd565b9050919050565b7f4d75737420686176652062756c6b7472616e7366657220726f6c650000000000600082015250565b6000613046601b83612646565b915061305182613010565b602082019050919050565b6000602082019050818103600083015261307581613039565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006130b682612754565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156130e9576130e8612cd7565b5b600182019050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000613150602583612646565b915061315b826130f4565b604082019050919050565b6000602082019050818103600083015261317f81613143565b9050919050565b7f4d757374206861766520656e61626c657472616e7366657220726f6c6520746f60008201527f206368616e676500000000000000000000000000000000000000000000000000602082015250565b60006131e2602783612646565b91506131ed82613186565b604082019050919050565b60006020820190508181036000830152613211816131d5565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613274602483612646565b915061327f82613218565b604082019050919050565b600060208201905081810360008301526132a381613267565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000613306602283612646565b9150613311826132aa565b604082019050919050565b60006020820190508181036000830152613335816132f9565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000613398602583612646565b91506133a38261333c565b604082019050919050565b600060208201905081810360008301526133c78161338b565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061342a602383612646565b9150613435826133ce565b604082019050919050565b600060208201905081810360008301526134598161341d565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006134bc602683612646565b91506134c782613460565b604082019050919050565b600060208201905081810360008301526134eb816134af565b9050919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b600061354e602f83612646565b9150613559826134f2565b604082019050919050565b6000602082019050818103600083015261357d81613541565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b60006135ba601483612646565b91506135c582613584565b602082019050919050565b600060208201905081810360008301526135e9816135ad565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000613626601f83612646565b9150613631826135f0565b602082019050919050565b6000602082019050818103600083015261365581613619565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006136b8602183612646565b91506136c38261365c565b604082019050919050565b600060208201905081810360008301526136e7816136ab565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b600061374a602283612646565b9150613755826136ee565b604082019050919050565b600060208201905081810360008301526137798161373d565b9050919050565b600061378b82612754565b915061379683612754565b9250828210156137a9576137a8612cd7565b5b828203905092915050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b60006137ea601083612646565b91506137f5826137b4565b602082019050919050565b60006020820190508181036000830152613819816137dd565b9050919050565b7f5472616e73666572732064697361626c65640000000000000000000000000000600082015250565b6000613856601283612646565b915061386182613820565b602082019050919050565b6000602082019050818103600083015261388581613849565b9050919050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b60006138cd60178361388c565b91506138d882613897565b601782019050919050565b60006138ee8261263b565b6138f8818561388c565b9350613908818560208601612657565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b600061394a60118361388c565b915061395582613914565b601182019050919050565b600061396b826138c0565b915061397782856138e3565b91506139828261393d565b915061398e82846138e3565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60006139d482612754565b91506139df83612754565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a1857613a17612cd7565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000613a5d82612754565b91506000821415613a7157613a70612cd7565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000613ab2602083612646565b9150613abd82613a7c565b602082019050919050565b60006020820190508181036000830152613ae181613aa5565b9050919050565b7f45524332305061757361626c653a20746f6b656e207472616e7366657220776860008201527f696c652070617573656400000000000000000000000000000000000000000000602082015250565b6000613b44602a83612646565b9150613b4f82613ae8565b604082019050919050565b60006020820190508181036000830152613b7381613b37565b905091905056fea2646970667358221220f0be741e88c026a2541c26f4cfe1b2cf45f6edb5881fdf60c3695df5d0b9ca0164736f6c63430008090033

Deployed Bytecode Sourcemap

54279:1971:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29036:214;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39280:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41447:169;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40400:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54626:72;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42098:492;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25332:123;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30394:196;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40242:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30979:205;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42999:215;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53768:178;;;:::i;:::-;;52959:205;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50604:91;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54732:76;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32527:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40571:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51014:368;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53378:172;;;:::i;:::-;;29849:145;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24217:139;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55780:463;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39499:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23308:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43717:413;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40911:175;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54373:34;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30168:134;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52201:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30683:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41149:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52270:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54541:78;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55032:244;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29036:214;29121:4;29160:42;29145:57;;;:11;:57;;;;:97;;;;29206:36;29230:11;29206:23;:36::i;:::-;29145:97;29138:104;;29036:214;;;:::o;39280:100::-;39334:13;39367:5;39360:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39280:100;:::o;41447:169::-;41530:4;41547:39;41556:12;:10;:12::i;:::-;41570:7;41579:6;41547:8;:39::i;:::-;41604:4;41597:11;;41447:169;;;;:::o;40400:108::-;40461:7;40488:12;;40481:19;;40400:108;:::o;54626:72::-;54672:26;54626:72;:::o;42098:492::-;42238:4;42255:36;42265:6;42273:9;42284:6;42255:9;:36::i;:::-;42304:24;42331:11;:19;42343:6;42331:19;;;;;;;;;;;;;;;:33;42351:12;:10;:12::i;:::-;42331:33;;;;;;;;;;;;;;;;42304:60;;42403:6;42383:16;:26;;42375:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;42490:57;42499:6;42507:12;:10;:12::i;:::-;42540:6;42521:16;:25;42490:8;:57::i;:::-;42578:4;42571:11;;;42098:492;;;;;:::o;25332:123::-;25398:7;25425:6;:12;25432:4;25425:12;;;;;;;;;;;:22;;;25418:29;;25332:123;;;:::o;30394:196::-;30510:30;30526:4;30532:7;30510:15;:30::i;:::-;30551:31;30574:7;30551:12;:18;30564:4;30551:18;;;;;;;;;;;:22;;:31;;;;:::i;:::-;;30394:196;;:::o;40242:93::-;40300:5;40325:2;40318:9;;40242:93;:::o;30979:205::-;31098:33;31117:4;31123:7;31098:18;:33::i;:::-;31142:34;31168:7;31142:12;:18;31155:4;31142:18;;;;;;;;;;;:25;;:34;;;;:::i;:::-;;30979:205;;:::o;42999:215::-;43087:4;43104:80;43113:12;:10;:12::i;:::-;43127:7;43173:10;43136:11;:25;43148:12;:10;:12::i;:::-;43136:25;;;;;;;;;;;;;;;:34;43162:7;43136:34;;;;;;;;;;;;;;;;:47;;;;:::i;:::-;43104:8;:80::i;:::-;43202:4;43195:11;;42999:215;;;;:::o;53768:178::-;53821:34;52308:24;53842:12;:10;:12::i;:::-;53821:7;:34::i;:::-;53813:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;53928:10;:8;:10::i;:::-;53768:178::o;52959:205::-;53035:34;52239:24;53056:12;:10;:12::i;:::-;53035:7;:34::i;:::-;53027:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;53139:17;53145:2;53149:6;53139:5;:17::i;:::-;52959:205;;:::o;50604:91::-;50660:27;50666:12;:10;:12::i;:::-;50680:6;50660:5;:27::i;:::-;50604:91;:::o;54732:76::-;54778:30;54732:76;:::o;32527:86::-;32574:4;32598:7;;;;;;;;;;;32591:14;;32527:86;:::o;40571:127::-;40645:7;40672:9;:18;40682:7;40672:18;;;;;;;;;;;;;;;;40665:25;;40571:127;;;:::o;51014:368::-;51091:24;51118:32;51128:7;51137:12;:10;:12::i;:::-;51118:9;:32::i;:::-;51091:59;;51189:6;51169:16;:26;;51161:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;51272:58;51281:7;51290:12;:10;:12::i;:::-;51323:6;51304:16;:25;51272:8;:58::i;:::-;51352:22;51358:7;51367:6;51352:5;:22::i;:::-;51080:302;51014:368;;:::o;53378:172::-;53429:34;52308:24;53450:12;:10;:12::i;:::-;53429:7;:34::i;:::-;53421:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;53534:8;:6;:8::i;:::-;53378:172::o;29849:145::-;29931:7;29958:28;29980:5;29958:12;:18;29971:4;29958:18;;;;;;;;;;;:21;;:28;;;;:::i;:::-;29951:35;;29849:145;;;;:::o;24217:139::-;24295:4;24319:6;:12;24326:4;24319:12;;;;;;;;;;;:20;;:29;24340:7;24319:29;;;;;;;;;;;;;;;;;;;;;;;;;24312:36;;24217:139;;;;:::o;55780:463::-;55877:4;55929:7;;:14;;55908:10;;:17;;:35;55900:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;55986:40;54778:30;56013:12;:10;:12::i;:::-;55986:7;:40::i;:::-;55978:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;56073:9;56069:113;56088:10;;:17;;56086:1;:19;56069:113;;;56134:48;56144:10;56156;;56167:1;56156:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;56171:7;;56179:1;56171:10;;;;;;;:::i;:::-;;;;;;;;56134:9;:48::i;:::-;56107:3;;;;;:::i;:::-;;;;56069:113;;;;56231:4;56224:11;;55780:463;;;;;;:::o;39499:104::-;39555:13;39588:7;39581:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39499:104;:::o;23308:49::-;23353:4;23308:49;;;:::o;43717:413::-;43810:4;43827:24;43854:11;:25;43866:12;:10;:12::i;:::-;43854:25;;;;;;;;;;;;;;;:34;43880:7;43854:34;;;;;;;;;;;;;;;;43827:61;;43927:15;43907:16;:35;;43899:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;44020:67;44029:12;:10;:12::i;:::-;44043:7;44071:15;44052:16;:34;44020:8;:67::i;:::-;44118:4;44111:11;;;43717:413;;;;:::o;40911:175::-;40997:4;41014:42;41024:12;:10;:12::i;:::-;41038:9;41049:6;41014:9;:42::i;:::-;41074:4;41067:11;;40911:175;;;;:::o;54373:34::-;;;;;;;;;;;;;:::o;30168:134::-;30240:7;30267:27;:12;:18;30280:4;30267:18;;;;;;;;;;;:25;:27::i;:::-;30260:34;;30168:134;;;:::o;52201:62::-;52239:24;52201:62;:::o;30683:201::-;30800:31;30817:4;30823:7;30800:16;:31::i;:::-;30842:34;30868:7;30842:12;:18;30855:4;30842:18;;;;;;;;;;;:25;;:34;;;;:::i;:::-;;30683:201;;:::o;41149:151::-;41238:7;41265:11;:18;41277:5;41265:18;;;;;;;;;;;;;;;:27;41284:7;41265:27;;;;;;;;;;;;;;;;41258:34;;41149:151;;;;:::o;52270:62::-;52308:24;52270:62;:::o;54541:78::-;54587:32;54541:78;:::o;55032:244::-;55135:42;54587:32;55164:12;:10;:12::i;:::-;55135:7;:42::i;:::-;55127:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;55251:17;55232:16;;:36;;;;;;;;;;;;;;;;;;55032:244;:::o;27566:112::-;27645:25;27656:4;27662:7;27645:10;:25::i;:::-;27566:112;;:::o;7804:152::-;7874:4;7898:50;7903:3;:10;;7939:5;7923:23;;7915:32;;7898:4;:50::i;:::-;7891:57;;7804:152;;;;:::o;23921:204::-;24006:4;24045:32;24030:47;;;:11;:47;;;;:87;;;;24081:36;24105:11;24081:23;:36::i;:::-;24030:87;24023:94;;23921:204;;;:::o;21192:98::-;21245:7;21272:10;21265:17;;21192:98;:::o;47401:380::-;47554:1;47537:19;;:5;:19;;;;47529:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47635:1;47616:21;;:7;:21;;;;47608:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47719:6;47689:11;:18;47701:5;47689:18;;;;;;;;;;;;;;;:27;47708:7;47689:27;;;;;;;;;;;;;;;:36;;;;47757:7;47741:32;;47750:5;47741:32;;;47766:6;47741:32;;;;;;:::i;:::-;;;;;;;;47401:380;;;:::o;44620:733::-;44778:1;44760:20;;:6;:20;;;;44752:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;44862:1;44841:23;;:9;:23;;;;44833:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;44917:47;44938:6;44946:9;44957:6;44917:20;:47::i;:::-;44977:21;45001:9;:17;45011:6;45001:17;;;;;;;;;;;;;;;;44977:41;;45054:6;45037:13;:23;;45029:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;45175:6;45159:13;:22;45139:9;:17;45149:6;45139:17;;;;;;;;;;;;;;;:42;;;;45227:6;45203:9;:20;45213:9;45203:20;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;45268:9;45251:35;;45260:6;45251:35;;;45279:6;45251:35;;;;;;:::i;:::-;;;;;;;;45299:46;45319:6;45327:9;45338:6;45299:19;:46::i;:::-;44741:612;44620:733;;;:::o;25717:147::-;25800:18;25813:4;25800:12;:18::i;:::-;23799:30;23810:4;23816:12;:10;:12::i;:::-;23799:10;:30::i;:::-;25831:25:::1;25842:4;25848:7;25831:10;:25::i;:::-;25717:147:::0;;;:::o;26765:218::-;26872:12;:10;:12::i;:::-;26861:23;;:7;:23;;;26853:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;26949:26;26961:4;26967:7;26949:11;:26::i;:::-;26765:218;;:::o;8132:158::-;8205:4;8229:53;8237:3;:10;;8273:5;8257:23;;8249:32;;8229:7;:53::i;:::-;8222:60;;8132:158;;;;:::o;33586:120::-;33130:8;:6;:8::i;:::-;33122:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;33655:5:::1;33645:7;;:15;;;;;;;;;;;;;;;;;;33676:22;33685:12;:10;:12::i;:::-;33676:22;;;;;;:::i;:::-;;;;;;;;33586:120::o:0;45640:399::-;45743:1;45724:21;;:7;:21;;;;45716:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;45794:49;45823:1;45827:7;45836:6;45794:20;:49::i;:::-;45872:6;45856:12;;:22;;;;;;;:::i;:::-;;;;;;;;45911:6;45889:9;:18;45899:7;45889:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;45954:7;45933:37;;45950:1;45933:37;;;45963:6;45933:37;;;;;;:::i;:::-;;;;;;;;45983:48;46011:1;46015:7;46024:6;45983:19;:48::i;:::-;45640:399;;:::o;46372:591::-;46475:1;46456:21;;:7;:21;;;;46448:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;46528:49;46549:7;46566:1;46570:6;46528:20;:49::i;:::-;46590:22;46615:9;:18;46625:7;46615:18;;;;;;;;;;;;;;;;46590:43;;46670:6;46652:14;:24;;46644:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;46789:6;46772:14;:23;46751:9;:18;46761:7;46751:18;;;;;;;;;;;;;;;:44;;;;46833:6;46817:12;;:22;;;;;;;:::i;:::-;;;;;;;;46883:1;46857:37;;46866:7;46857:37;;;46887:6;46857:37;;;;;;:::i;:::-;;;;;;;;46907:48;46927:7;46944:1;46948:6;46907:19;:48::i;:::-;46437:526;46372:591;;:::o;33327:118::-;32853:8;:6;:8::i;:::-;32852:9;32844:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;33397:4:::1;33387:7;;:14;;;;;;;;;;;;;;;;;;33417:20;33424:12;:10;:12::i;:::-;33417:20;;;;;;:::i;:::-;;;;;;;;33327:118::o:0;9100:158::-;9174:7;9225:22;9229:3;:10;;9241:5;9225:3;:22::i;:::-;9217:31;;9194:56;;9100:158;;;;:::o;8629:117::-;8692:7;8719:19;8727:3;:10;;8719:7;:19::i;:::-;8712:26;;8629:117;;;:::o;26109:149::-;26193:18;26206:4;26193:12;:18::i;:::-;23799:30;23810:4;23816:12;:10;:12::i;:::-;23799:10;:30::i;:::-;26224:26:::1;26236:4;26242:7;26224:11;:26::i;:::-;26109:149:::0;;;:::o;28069:229::-;28144:22;28152:4;28158:7;28144;:22::i;:::-;28139:152;;28215:4;28183:6;:12;28190:4;28183:12;;;;;;;;;;;:20;;:29;28204:7;28183:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;28266:12;:10;:12::i;:::-;28239:40;;28257:7;28239:40;;28251:4;28239:40;;;;;;;;;;28139:152;28069:229;;:::o;1719:414::-;1782:4;1804:21;1814:3;1819:5;1804:9;:21::i;:::-;1799:327;;1842:3;:11;;1859:5;1842:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2025:3;:11;;:18;;;;2003:3;:12;;:19;2016:5;2003:19;;;;;;;;;;;:40;;;;2065:4;2058:11;;;;1799:327;2109:5;2102:12;;1719:414;;;;;:::o;14156:157::-;14241:4;14280:25;14265:40;;;:11;:40;;;;14258:47;;14156:157;;;:::o;55284:484::-;55383:42;55410:4;55415:2;55418:6;55383:26;:42::i;:::-;55456:16;;;;;;;;;;;:55;;;;55509:1;55493:18;;:4;:18;;;55456:55;:110;;;;55530:36;54672:26;55553:12;:10;:12::i;:::-;55530:7;:36::i;:::-;55456:110;:155;;;;55583:28;54672:26;55606:4;55583:7;:28::i;:::-;55456:155;:198;;;;55628:26;54672;55651:2;55628:7;:26::i;:::-;55456:198;55452:270;;;55682:7;;55452:270;55732:28;;;;;;;;;;:::i;:::-;;;;;;;;55284:484;;;;:::o;49110:124::-;;;;:::o;24646:497::-;24727:22;24735:4;24741:7;24727;:22::i;:::-;24722:414;;24915:41;24943:7;24915:41;;24953:2;24915:19;:41::i;:::-;25029:38;25057:4;25049:13;;25064:2;25029:19;:38::i;:::-;24820:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;24766:358;;;;;;;;;;;:::i;:::-;;;;;;;;24722:414;24646:497;;:::o;28306:230::-;28381:22;28389:4;28395:7;28381;:22::i;:::-;28377:152;;;28452:5;28420:6;:12;28427:4;28420:12;;;;;;;;;;;:20;;:29;28441:7;28420:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;28504:12;:10;:12::i;:::-;28477:40;;28495:7;28477:40;;28489:4;28477:40;;;;;;;;;;28377:152;28306:230;;:::o;2309:1420::-;2375:4;2493:18;2514:3;:12;;:19;2527:5;2514:19;;;;;;;;;;;;2493:40;;2564:1;2550:10;:15;2546:1176;;2925:21;2962:1;2949:10;:14;;;;:::i;:::-;2925:38;;2978:17;3019:1;2998:3;:11;;:18;;;;:22;;;;:::i;:::-;2978:42;;3054:13;3041:9;:26;3037:405;;3088:17;3108:3;:11;;3120:9;3108:22;;;;;;;;:::i;:::-;;;;;;;;;;3088:42;;3262:9;3233:3;:11;;3245:13;3233:26;;;;;;;;:::i;:::-;;;;;;;;;:38;;;;3373:10;3347:3;:12;;:23;3360:9;3347:23;;;;;;;;;;;:36;;;;3069:373;3037:405;3523:3;:11;;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3618:3;:12;;:19;3631:5;3618:19;;;;;;;;;;;3611:26;;;3661:4;3654:11;;;;;;;2546:1176;3705:5;3698:12;;;2309:1420;;;;;:::o;4493:120::-;4560:7;4587:3;:11;;4599:5;4587:18;;;;;;;;:::i;:::-;;;;;;;;;;4580:25;;4493:120;;;;:::o;4030:109::-;4086:7;4113:3;:11;;:18;;;;4106:25;;4030:109;;;:::o;3815:129::-;3888:4;3935:1;3912:3;:12;;:19;3925:5;3912:19;;;;;;;;;;;;:24;;3905:31;;3815:129;;;;:::o;53954:217::-;54119:44;54146:4;54152:2;54156:6;54119:26;:44::i;:::-;53954:217;;;:::o;15932:451::-;16007:13;16033:19;16078:1;16069:6;16065:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;16055:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16033:47;;16091:15;:6;16098:1;16091:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;16117;:6;16124:1;16117:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;16148:9;16173:1;16164:6;16160:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;16148:26;;16143:135;16180:1;16176;:5;16143:135;;;16215:12;16236:3;16228:5;:11;16215:25;;;;;;;:::i;:::-;;;;;16203:6;16210:1;16203:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;16265:1;16255:11;;;;;16183:3;;;;:::i;:::-;;;16143:135;;;;16305:1;16296:5;:10;16288:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;16368:6;16354:21;;;15932:451;;;;:::o;49834:272::-;49977:44;50004:4;50010:2;50014:6;49977:26;:44::i;:::-;50043:8;:6;:8::i;:::-;50042:9;50034:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;49834:272;;;:::o;48381:125::-;;;;:::o;88:117:1:-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:126::-;2945:7;2985:42;2978:5;2974:54;2963:65;;2908:126;;;:::o;3040:96::-;3077:7;3106:24;3124:5;3106:24;:::i;:::-;3095:35;;3040:96;;;:::o;3142:122::-;3215:24;3233:5;3215:24;:::i;:::-;3208:5;3205:35;3195:63;;3254:1;3251;3244:12;3195:63;3142:122;:::o;3270:139::-;3316:5;3354:6;3341:20;3332:29;;3370:33;3397:5;3370:33;:::i;:::-;3270:139;;;;:::o;3415:77::-;3452:7;3481:5;3470:16;;3415:77;;;:::o;3498:122::-;3571:24;3589:5;3571:24;:::i;:::-;3564:5;3561:35;3551:63;;3610:1;3607;3600:12;3551:63;3498:122;:::o;3626:139::-;3672:5;3710:6;3697:20;3688:29;;3726:33;3753:5;3726:33;:::i;:::-;3626:139;;;;:::o;3771:474::-;3839:6;3847;3896:2;3884:9;3875:7;3871:23;3867:32;3864:119;;;3902:79;;:::i;:::-;3864:119;4022:1;4047:53;4092:7;4083:6;4072:9;4068:22;4047:53;:::i;:::-;4037:63;;3993:117;4149:2;4175:53;4220:7;4211:6;4200:9;4196:22;4175:53;:::i;:::-;4165:63;;4120:118;3771:474;;;;;:::o;4251:118::-;4338:24;4356:5;4338:24;:::i;:::-;4333:3;4326:37;4251:118;;:::o;4375:222::-;4468:4;4506:2;4495:9;4491:18;4483:26;;4519:71;4587:1;4576:9;4572:17;4563:6;4519:71;:::i;:::-;4375:222;;;;:::o;4603:77::-;4640:7;4669:5;4658:16;;4603:77;;;:::o;4686:118::-;4773:24;4791:5;4773:24;:::i;:::-;4768:3;4761:37;4686:118;;:::o;4810:222::-;4903:4;4941:2;4930:9;4926:18;4918:26;;4954:71;5022:1;5011:9;5007:17;4998:6;4954:71;:::i;:::-;4810:222;;;;:::o;5038:619::-;5115:6;5123;5131;5180:2;5168:9;5159:7;5155:23;5151:32;5148:119;;;5186:79;;:::i;:::-;5148:119;5306:1;5331:53;5376:7;5367:6;5356:9;5352:22;5331:53;:::i;:::-;5321:63;;5277:117;5433:2;5459:53;5504:7;5495:6;5484:9;5480:22;5459:53;:::i;:::-;5449:63;;5404:118;5561:2;5587:53;5632:7;5623:6;5612:9;5608:22;5587:53;:::i;:::-;5577:63;;5532:118;5038:619;;;;;:::o;5663:122::-;5736:24;5754:5;5736:24;:::i;:::-;5729:5;5726:35;5716:63;;5775:1;5772;5765:12;5716:63;5663:122;:::o;5791:139::-;5837:5;5875:6;5862:20;5853:29;;5891:33;5918:5;5891:33;:::i;:::-;5791:139;;;;:::o;5936:329::-;5995:6;6044:2;6032:9;6023:7;6019:23;6015:32;6012:119;;;6050:79;;:::i;:::-;6012:119;6170:1;6195:53;6240:7;6231:6;6220:9;6216:22;6195:53;:::i;:::-;6185:63;;6141:117;5936:329;;;;:::o;6271:474::-;6339:6;6347;6396:2;6384:9;6375:7;6371:23;6367:32;6364:119;;;6402:79;;:::i;:::-;6364:119;6522:1;6547:53;6592:7;6583:6;6572:9;6568:22;6547:53;:::i;:::-;6537:63;;6493:117;6649:2;6675:53;6720:7;6711:6;6700:9;6696:22;6675:53;:::i;:::-;6665:63;;6620:118;6271:474;;;;;:::o;6751:86::-;6786:7;6826:4;6819:5;6815:16;6804:27;;6751:86;;;:::o;6843:112::-;6926:22;6942:5;6926:22;:::i;:::-;6921:3;6914:35;6843:112;;:::o;6961:214::-;7050:4;7088:2;7077:9;7073:18;7065:26;;7101:67;7165:1;7154:9;7150:17;7141:6;7101:67;:::i;:::-;6961:214;;;;:::o;7181:329::-;7240:6;7289:2;7277:9;7268:7;7264:23;7260:32;7257:119;;;7295:79;;:::i;:::-;7257:119;7415:1;7440:53;7485:7;7476:6;7465:9;7461:22;7440:53;:::i;:::-;7430:63;;7386:117;7181:329;;;;:::o;7516:::-;7575:6;7624:2;7612:9;7603:7;7599:23;7595:32;7592:119;;;7630:79;;:::i;:::-;7592:119;7750:1;7775:53;7820:7;7811:6;7800:9;7796:22;7775:53;:::i;:::-;7765:63;;7721:117;7516:329;;;;:::o;7851:474::-;7919:6;7927;7976:2;7964:9;7955:7;7951:23;7947:32;7944:119;;;7982:79;;:::i;:::-;7944:119;8102:1;8127:53;8172:7;8163:6;8152:9;8148:22;8127:53;:::i;:::-;8117:63;;8073:117;8229:2;8255:53;8300:7;8291:6;8280:9;8276:22;8255:53;:::i;:::-;8245:63;;8200:118;7851:474;;;;;:::o;8331:118::-;8418:24;8436:5;8418:24;:::i;:::-;8413:3;8406:37;8331:118;;:::o;8455:222::-;8548:4;8586:2;8575:9;8571:18;8563:26;;8599:71;8667:1;8656:9;8652:17;8643:6;8599:71;:::i;:::-;8455:222;;;;:::o;8683:117::-;8792:1;8789;8782:12;8806:117;8915:1;8912;8905:12;8929:117;9038:1;9035;9028:12;9069:568;9142:8;9152:6;9202:3;9195:4;9187:6;9183:17;9179:27;9169:122;;9210:79;;:::i;:::-;9169:122;9323:6;9310:20;9300:30;;9353:18;9345:6;9342:30;9339:117;;;9375:79;;:::i;:::-;9339:117;9489:4;9481:6;9477:17;9465:29;;9543:3;9535:4;9527:6;9523:17;9513:8;9509:32;9506:41;9503:128;;;9550:79;;:::i;:::-;9503:128;9069:568;;;;;:::o;9660:::-;9733:8;9743:6;9793:3;9786:4;9778:6;9774:17;9770:27;9760:122;;9801:79;;:::i;:::-;9760:122;9914:6;9901:20;9891:30;;9944:18;9936:6;9933:30;9930:117;;;9966:79;;:::i;:::-;9930:117;10080:4;10072:6;10068:17;10056:29;;10134:3;10126:4;10118:6;10114:17;10104:8;10100:32;10097:41;10094:128;;;10141:79;;:::i;:::-;10094:128;9660:568;;;;;:::o;10234:934::-;10356:6;10364;10372;10380;10429:2;10417:9;10408:7;10404:23;10400:32;10397:119;;;10435:79;;:::i;:::-;10397:119;10583:1;10572:9;10568:17;10555:31;10613:18;10605:6;10602:30;10599:117;;;10635:79;;:::i;:::-;10599:117;10748:80;10820:7;10811:6;10800:9;10796:22;10748:80;:::i;:::-;10730:98;;;;10526:312;10905:2;10894:9;10890:18;10877:32;10936:18;10928:6;10925:30;10922:117;;;10958:79;;:::i;:::-;10922:117;11071:80;11143:7;11134:6;11123:9;11119:22;11071:80;:::i;:::-;11053:98;;;;10848:313;10234:934;;;;;;;:::o;11174:474::-;11242:6;11250;11299:2;11287:9;11278:7;11274:23;11270:32;11267:119;;;11305:79;;:::i;:::-;11267:119;11425:1;11450:53;11495:7;11486:6;11475:9;11471:22;11450:53;:::i;:::-;11440:63;;11396:117;11552:2;11578:53;11623:7;11614:6;11603:9;11599:22;11578:53;:::i;:::-;11568:63;;11523:118;11174:474;;;;;:::o;11654:116::-;11724:21;11739:5;11724:21;:::i;:::-;11717:5;11714:32;11704:60;;11760:1;11757;11750:12;11704:60;11654:116;:::o;11776:133::-;11819:5;11857:6;11844:20;11835:29;;11873:30;11897:5;11873:30;:::i;:::-;11776:133;;;;:::o;11915:323::-;11971:6;12020:2;12008:9;11999:7;11995:23;11991:32;11988:119;;;12026:79;;:::i;:::-;11988:119;12146:1;12171:50;12213:7;12204:6;12193:9;12189:22;12171:50;:::i;:::-;12161:60;;12117:114;11915:323;;;;:::o;12244:180::-;12292:77;12289:1;12282:88;12389:4;12386:1;12379:15;12413:4;12410:1;12403:15;12430:320;12474:6;12511:1;12505:4;12501:12;12491:22;;12558:1;12552:4;12548:12;12579:18;12569:81;;12635:4;12627:6;12623:17;12613:27;;12569:81;12697:2;12689:6;12686:14;12666:18;12663:38;12660:84;;;12716:18;;:::i;:::-;12660:84;12481:269;12430:320;;;:::o;12756:227::-;12896:34;12892:1;12884:6;12880:14;12873:58;12965:10;12960:2;12952:6;12948:15;12941:35;12756:227;:::o;12989:366::-;13131:3;13152:67;13216:2;13211:3;13152:67;:::i;:::-;13145:74;;13228:93;13317:3;13228:93;:::i;:::-;13346:2;13341:3;13337:12;13330:19;;12989:366;;;:::o;13361:419::-;13527:4;13565:2;13554:9;13550:18;13542:26;;13614:9;13608:4;13604:20;13600:1;13589:9;13585:17;13578:47;13642:131;13768:4;13642:131;:::i;:::-;13634:139;;13361:419;;;:::o;13786:180::-;13834:77;13831:1;13824:88;13931:4;13928:1;13921:15;13955:4;13952:1;13945:15;13972:305;14012:3;14031:20;14049:1;14031:20;:::i;:::-;14026:25;;14065:20;14083:1;14065:20;:::i;:::-;14060:25;;14219:1;14151:66;14147:74;14144:1;14141:81;14138:107;;;14225:18;;:::i;:::-;14138:107;14269:1;14266;14262:9;14255:16;;13972:305;;;;:::o;14283:244::-;14423:34;14419:1;14411:6;14407:14;14400:58;14492:27;14487:2;14479:6;14475:15;14468:52;14283:244;:::o;14533:366::-;14675:3;14696:67;14760:2;14755:3;14696:67;:::i;:::-;14689:74;;14772:93;14861:3;14772:93;:::i;:::-;14890:2;14885:3;14881:12;14874:19;;14533:366;;;:::o;14905:419::-;15071:4;15109:2;15098:9;15094:18;15086:26;;15158:9;15152:4;15148:20;15144:1;15133:9;15129:17;15122:47;15186:131;15312:4;15186:131;:::i;:::-;15178:139;;14905:419;;;:::o;15330:241::-;15470:34;15466:1;15458:6;15454:14;15447:58;15539:24;15534:2;15526:6;15522:15;15515:49;15330:241;:::o;15577:366::-;15719:3;15740:67;15804:2;15799:3;15740:67;:::i;:::-;15733:74;;15816:93;15905:3;15816:93;:::i;:::-;15934:2;15929:3;15925:12;15918:19;;15577:366;;;:::o;15949:419::-;16115:4;16153:2;16142:9;16138:18;16130:26;;16202:9;16196:4;16192:20;16188:1;16177:9;16173:17;16166:47;16230:131;16356:4;16230:131;:::i;:::-;16222:139;;15949:419;;;:::o;16374:223::-;16514:34;16510:1;16502:6;16498:14;16491:58;16583:6;16578:2;16570:6;16566:15;16559:31;16374:223;:::o;16603:366::-;16745:3;16766:67;16830:2;16825:3;16766:67;:::i;:::-;16759:74;;16842:93;16931:3;16842:93;:::i;:::-;16960:2;16955:3;16951:12;16944:19;;16603:366;;;:::o;16975:419::-;17141:4;17179:2;17168:9;17164:18;17156:26;;17228:9;17222:4;17218:20;17214:1;17203:9;17199:17;17192:47;17256:131;17382:4;17256:131;:::i;:::-;17248:139;;16975:419;;;:::o;17400:242::-;17540:34;17536:1;17528:6;17524:14;17517:58;17609:25;17604:2;17596:6;17592:15;17585:50;17400:242;:::o;17648:366::-;17790:3;17811:67;17875:2;17870:3;17811:67;:::i;:::-;17804:74;;17887:93;17976:3;17887:93;:::i;:::-;18005:2;18000:3;17996:12;17989:19;;17648:366;;;:::o;18020:419::-;18186:4;18224:2;18213:9;18209:18;18201:26;;18273:9;18267:4;18263:20;18259:1;18248:9;18244:17;18237:47;18301:131;18427:4;18301:131;:::i;:::-;18293:139;;18020:419;;;:::o;18445:170::-;18585:22;18581:1;18573:6;18569:14;18562:46;18445:170;:::o;18621:366::-;18763:3;18784:67;18848:2;18843:3;18784:67;:::i;:::-;18777:74;;18860:93;18949:3;18860:93;:::i;:::-;18978:2;18973:3;18969:12;18962:19;;18621:366;;;:::o;18993:419::-;19159:4;19197:2;19186:9;19182:18;19174:26;;19246:9;19240:4;19236:20;19232:1;19221:9;19217:17;19210:47;19274:131;19400:4;19274:131;:::i;:::-;19266:139;;18993:419;;;:::o;19418:177::-;19558:29;19554:1;19546:6;19542:14;19535:53;19418:177;:::o;19601:366::-;19743:3;19764:67;19828:2;19823:3;19764:67;:::i;:::-;19757:74;;19840:93;19929:3;19840:93;:::i;:::-;19958:2;19953:3;19949:12;19942:19;;19601:366;;;:::o;19973:419::-;20139:4;20177:2;20166:9;20162:18;20154:26;;20226:9;20220:4;20216:20;20212:1;20201:9;20197:17;20190:47;20254:131;20380:4;20254:131;:::i;:::-;20246:139;;19973:419;;;:::o;20398:180::-;20446:77;20443:1;20436:88;20543:4;20540:1;20533:15;20567:4;20564:1;20557:15;20584:233;20623:3;20646:24;20664:5;20646:24;:::i;:::-;20637:33;;20692:66;20685:5;20682:77;20679:103;;;20762:18;;:::i;:::-;20679:103;20809:1;20802:5;20798:13;20791:20;;20584:233;;;:::o;20823:224::-;20963:34;20959:1;20951:6;20947:14;20940:58;21032:7;21027:2;21019:6;21015:15;21008:32;20823:224;:::o;21053:366::-;21195:3;21216:67;21280:2;21275:3;21216:67;:::i;:::-;21209:74;;21292:93;21381:3;21292:93;:::i;:::-;21410:2;21405:3;21401:12;21394:19;;21053:366;;;:::o;21425:419::-;21591:4;21629:2;21618:9;21614:18;21606:26;;21678:9;21672:4;21668:20;21664:1;21653:9;21649:17;21642:47;21706:131;21832:4;21706:131;:::i;:::-;21698:139;;21425:419;;;:::o;21850:226::-;21990:34;21986:1;21978:6;21974:14;21967:58;22059:9;22054:2;22046:6;22042:15;22035:34;21850:226;:::o;22082:366::-;22224:3;22245:67;22309:2;22304:3;22245:67;:::i;:::-;22238:74;;22321:93;22410:3;22321:93;:::i;:::-;22439:2;22434:3;22430:12;22423:19;;22082:366;;;:::o;22454:419::-;22620:4;22658:2;22647:9;22643:18;22635:26;;22707:9;22701:4;22697:20;22693:1;22682:9;22678:17;22671:47;22735:131;22861:4;22735:131;:::i;:::-;22727:139;;22454:419;;;:::o;22879:223::-;23019:34;23015:1;23007:6;23003:14;22996:58;23088:6;23083:2;23075:6;23071:15;23064:31;22879:223;:::o;23108:366::-;23250:3;23271:67;23335:2;23330:3;23271:67;:::i;:::-;23264:74;;23347:93;23436:3;23347:93;:::i;:::-;23465:2;23460:3;23456:12;23449:19;;23108:366;;;:::o;23480:419::-;23646:4;23684:2;23673:9;23669:18;23661:26;;23733:9;23727:4;23723:20;23719:1;23708:9;23704:17;23697:47;23761:131;23887:4;23761:131;:::i;:::-;23753:139;;23480:419;;;:::o;23905:221::-;24045:34;24041:1;24033:6;24029:14;24022:58;24114:4;24109:2;24101:6;24097:15;24090:29;23905:221;:::o;24132:366::-;24274:3;24295:67;24359:2;24354:3;24295:67;:::i;:::-;24288:74;;24371:93;24460:3;24371:93;:::i;:::-;24489:2;24484:3;24480:12;24473:19;;24132:366;;;:::o;24504:419::-;24670:4;24708:2;24697:9;24693:18;24685:26;;24757:9;24751:4;24747:20;24743:1;24732:9;24728:17;24721:47;24785:131;24911:4;24785:131;:::i;:::-;24777:139;;24504:419;;;:::o;24929:224::-;25069:34;25065:1;25057:6;25053:14;25046:58;25138:7;25133:2;25125:6;25121:15;25114:32;24929:224;:::o;25159:366::-;25301:3;25322:67;25386:2;25381:3;25322:67;:::i;:::-;25315:74;;25398:93;25487:3;25398:93;:::i;:::-;25516:2;25511:3;25507:12;25500:19;;25159:366;;;:::o;25531:419::-;25697:4;25735:2;25724:9;25720:18;25712:26;;25784:9;25778:4;25774:20;25770:1;25759:9;25755:17;25748:47;25812:131;25938:4;25812:131;:::i;:::-;25804:139;;25531:419;;;:::o;25956:222::-;26096:34;26092:1;26084:6;26080:14;26073:58;26165:5;26160:2;26152:6;26148:15;26141:30;25956:222;:::o;26184:366::-;26326:3;26347:67;26411:2;26406:3;26347:67;:::i;:::-;26340:74;;26423:93;26512:3;26423:93;:::i;:::-;26541:2;26536:3;26532:12;26525:19;;26184:366;;;:::o;26556:419::-;26722:4;26760:2;26749:9;26745:18;26737:26;;26809:9;26803:4;26799:20;26795:1;26784:9;26780:17;26773:47;26837:131;26963:4;26837:131;:::i;:::-;26829:139;;26556:419;;;:::o;26981:225::-;27121:34;27117:1;27109:6;27105:14;27098:58;27190:8;27185:2;27177:6;27173:15;27166:33;26981:225;:::o;27212:366::-;27354:3;27375:67;27439:2;27434:3;27375:67;:::i;:::-;27368:74;;27451:93;27540:3;27451:93;:::i;:::-;27569:2;27564:3;27560:12;27553:19;;27212:366;;;:::o;27584:419::-;27750:4;27788:2;27777:9;27773:18;27765:26;;27837:9;27831:4;27827:20;27823:1;27812:9;27808:17;27801:47;27865:131;27991:4;27865:131;:::i;:::-;27857:139;;27584:419;;;:::o;28009:234::-;28149:34;28145:1;28137:6;28133:14;28126:58;28218:17;28213:2;28205:6;28201:15;28194:42;28009:234;:::o;28249:366::-;28391:3;28412:67;28476:2;28471:3;28412:67;:::i;:::-;28405:74;;28488:93;28577:3;28488:93;:::i;:::-;28606:2;28601:3;28597:12;28590:19;;28249:366;;;:::o;28621:419::-;28787:4;28825:2;28814:9;28810:18;28802:26;;28874:9;28868:4;28864:20;28860:1;28849:9;28845:17;28838:47;28902:131;29028:4;28902:131;:::i;:::-;28894:139;;28621:419;;;:::o;29046:170::-;29186:22;29182:1;29174:6;29170:14;29163:46;29046:170;:::o;29222:366::-;29364:3;29385:67;29449:2;29444:3;29385:67;:::i;:::-;29378:74;;29461:93;29550:3;29461:93;:::i;:::-;29579:2;29574:3;29570:12;29563:19;;29222:366;;;:::o;29594:419::-;29760:4;29798:2;29787:9;29783:18;29775:26;;29847:9;29841:4;29837:20;29833:1;29822:9;29818:17;29811:47;29875:131;30001:4;29875:131;:::i;:::-;29867:139;;29594:419;;;:::o;30019:181::-;30159:33;30155:1;30147:6;30143:14;30136:57;30019:181;:::o;30206:366::-;30348:3;30369:67;30433:2;30428:3;30369:67;:::i;:::-;30362:74;;30445:93;30534:3;30445:93;:::i;:::-;30563:2;30558:3;30554:12;30547:19;;30206:366;;;:::o;30578:419::-;30744:4;30782:2;30771:9;30767:18;30759:26;;30831:9;30825:4;30821:20;30817:1;30806:9;30802:17;30795:47;30859:131;30985:4;30859:131;:::i;:::-;30851:139;;30578:419;;;:::o;31003:220::-;31143:34;31139:1;31131:6;31127:14;31120:58;31212:3;31207:2;31199:6;31195:15;31188:28;31003:220;:::o;31229:366::-;31371:3;31392:67;31456:2;31451:3;31392:67;:::i;:::-;31385:74;;31468:93;31557:3;31468:93;:::i;:::-;31586:2;31581:3;31577:12;31570:19;;31229:366;;;:::o;31601:419::-;31767:4;31805:2;31794:9;31790:18;31782:26;;31854:9;31848:4;31844:20;31840:1;31829:9;31825:17;31818:47;31882:131;32008:4;31882:131;:::i;:::-;31874:139;;31601:419;;;:::o;32026:221::-;32166:34;32162:1;32154:6;32150:14;32143:58;32235:4;32230:2;32222:6;32218:15;32211:29;32026:221;:::o;32253:366::-;32395:3;32416:67;32480:2;32475:3;32416:67;:::i;:::-;32409:74;;32492:93;32581:3;32492:93;:::i;:::-;32610:2;32605:3;32601:12;32594:19;;32253:366;;;:::o;32625:419::-;32791:4;32829:2;32818:9;32814:18;32806:26;;32878:9;32872:4;32868:20;32864:1;32853:9;32849:17;32842:47;32906:131;33032:4;32906:131;:::i;:::-;32898:139;;32625:419;;;:::o;33050:191::-;33090:4;33110:20;33128:1;33110:20;:::i;:::-;33105:25;;33144:20;33162:1;33144:20;:::i;:::-;33139:25;;33183:1;33180;33177:8;33174:34;;;33188:18;;:::i;:::-;33174:34;33233:1;33230;33226:9;33218:17;;33050:191;;;;:::o;33247:166::-;33387:18;33383:1;33375:6;33371:14;33364:42;33247:166;:::o;33419:366::-;33561:3;33582:67;33646:2;33641:3;33582:67;:::i;:::-;33575:74;;33658:93;33747:3;33658:93;:::i;:::-;33776:2;33771:3;33767:12;33760:19;;33419:366;;;:::o;33791:419::-;33957:4;33995:2;33984:9;33980:18;33972:26;;34044:9;34038:4;34034:20;34030:1;34019:9;34015:17;34008:47;34072:131;34198:4;34072:131;:::i;:::-;34064:139;;33791:419;;;:::o;34216:168::-;34356:20;34352:1;34344:6;34340:14;34333:44;34216:168;:::o;34390:366::-;34532:3;34553:67;34617:2;34612:3;34553:67;:::i;:::-;34546:74;;34629:93;34718:3;34629:93;:::i;:::-;34747:2;34742:3;34738:12;34731:19;;34390:366;;;:::o;34762:419::-;34928:4;34966:2;34955:9;34951:18;34943:26;;35015:9;35009:4;35005:20;35001:1;34990:9;34986:17;34979:47;35043:131;35169:4;35043:131;:::i;:::-;35035:139;;34762:419;;;:::o;35187:148::-;35289:11;35326:3;35311:18;;35187:148;;;;:::o;35341:173::-;35481:25;35477:1;35469:6;35465:14;35458:49;35341:173;:::o;35520:402::-;35680:3;35701:85;35783:2;35778:3;35701:85;:::i;:::-;35694:92;;35795:93;35884:3;35795:93;:::i;:::-;35913:2;35908:3;35904:12;35897:19;;35520:402;;;:::o;35928:377::-;36034:3;36062:39;36095:5;36062:39;:::i;:::-;36117:89;36199:6;36194:3;36117:89;:::i;:::-;36110:96;;36215:52;36260:6;36255:3;36248:4;36241:5;36237:16;36215:52;:::i;:::-;36292:6;36287:3;36283:16;36276:23;;36038:267;35928:377;;;;:::o;36311:167::-;36451:19;36447:1;36439:6;36435:14;36428:43;36311:167;:::o;36484:402::-;36644:3;36665:85;36747:2;36742:3;36665:85;:::i;:::-;36658:92;;36759:93;36848:3;36759:93;:::i;:::-;36877:2;36872:3;36868:12;36861:19;;36484:402;;;:::o;36892:967::-;37274:3;37296:148;37440:3;37296:148;:::i;:::-;37289:155;;37461:95;37552:3;37543:6;37461:95;:::i;:::-;37454:102;;37573:148;37717:3;37573:148;:::i;:::-;37566:155;;37738:95;37829:3;37820:6;37738:95;:::i;:::-;37731:102;;37850:3;37843:10;;36892:967;;;;;:::o;37865:180::-;37913:77;37910:1;37903:88;38010:4;38007:1;38000:15;38034:4;38031:1;38024:15;38051:348;38091:7;38114:20;38132:1;38114:20;:::i;:::-;38109:25;;38148:20;38166:1;38148:20;:::i;:::-;38143:25;;38336:1;38268:66;38264:74;38261:1;38258:81;38253:1;38246:9;38239:17;38235:105;38232:131;;;38343:18;;:::i;:::-;38232:131;38391:1;38388;38384:9;38373:20;;38051:348;;;;:::o;38405:180::-;38453:77;38450:1;38443:88;38550:4;38547:1;38540:15;38574:4;38571:1;38564:15;38591:171;38630:3;38653:24;38671:5;38653:24;:::i;:::-;38644:33;;38699:4;38692:5;38689:15;38686:41;;;38707:18;;:::i;:::-;38686:41;38754:1;38747:5;38743:13;38736:20;;38591:171;;;:::o;38768:182::-;38908:34;38904:1;38896:6;38892:14;38885:58;38768:182;:::o;38956:366::-;39098:3;39119:67;39183:2;39178:3;39119:67;:::i;:::-;39112:74;;39195:93;39284:3;39195:93;:::i;:::-;39313:2;39308:3;39304:12;39297:19;;38956:366;;;:::o;39328:419::-;39494:4;39532:2;39521:9;39517:18;39509:26;;39581:9;39575:4;39571:20;39567:1;39556:9;39552:17;39545:47;39609:131;39735:4;39609:131;:::i;:::-;39601:139;;39328:419;;;:::o;39753:229::-;39893:34;39889:1;39881:6;39877:14;39870:58;39962:12;39957:2;39949:6;39945:15;39938:37;39753:229;:::o;39988:366::-;40130:3;40151:67;40215:2;40210:3;40151:67;:::i;:::-;40144:74;;40227:93;40316:3;40227:93;:::i;:::-;40345:2;40340:3;40336:12;40329:19;;39988:366;;;:::o;40360:419::-;40526:4;40564:2;40553:9;40549:18;40541:26;;40613:9;40607:4;40603:20;40599:1;40588:9;40584:17;40577:47;40641:131;40767:4;40641:131;:::i;:::-;40633:139;;40360:419;;;:::o

Swarm Source

ipfs://f0be741e88c026a2541c26f4cfe1b2cf45f6edb5881fdf60c3695df5d0b9ca01
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.