Token Royale

Gaming 

Overview ERC20

Price
$0.01 @ 0.000355 AVAX (+15.14%)
Fully Diluted Market Cap
Total Supply:
20,000,101 ROY

Holders:
262 addresses

Transfers:
-

Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

OVERVIEW

Crypto Royale is a browser-based Battle Royale, where players compete for fame, glory and a little profit. The project received a Harmony Grant in 2021 and is growing rapidly.

Market

Volume (24H):$5,138.37
Market Capitalization:$507,162.00
Circulating Supply:100,000,303.00 ROY
Market Data Source: Coinmarketcap


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

Contract Source Code Verified (Exact Match)

Contract Name:
ROY

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

// Sources flattened with hardhat v2.9.9 https://hardhat.org

// File @openzeppelin/contracts/access/[email protected]

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/utils/[email protected]

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

pragma solidity ^0.8.0;

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

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


// File @openzeppelin/contracts/utils/[email protected]

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

pragma solidity ^0.8.0;

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

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // 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);
    }

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


// File @openzeppelin/contracts/utils/introspection/[email protected]

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

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/utils/introspection/[email protected]

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

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/access/[email protected]

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

pragma solidity ^0.8.0;




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

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

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

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

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

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

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

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

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

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

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

        _revokeRole(role, account);
    }

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

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

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

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


// File @openzeppelin/contracts/token/ERC20/[email protected]

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/token/ERC20/extensions/[email protected]

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

pragma solidity ^0.8.0;

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

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

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


// File @openzeppelin/contracts/token/ERC20/[email protected]

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

pragma solidity ^0.8.0;



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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

        return true;
    }

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

        _beforeTokenTransfer(from, to, amount);

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

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

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

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

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

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

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


// File contracts/Checkins.sol

pragma solidity 0.8.16;
contract CheckIns {
  event CheckedIn(address account, uint timestamp);
  mapping(address => uint) private _lastCheckIns;
  function checkIn() external {
    address account = msg.sender;
    uint timestamp = block.timestamp;
    _lastCheckIns[account ] = timestamp;
    emit CheckedIn(account , timestamp);
  }
  function getLastCheckIn(address account) external view returns(uint) {
    return _lastCheckIns[account];
  }
}


// File contracts/ROY.sol

pragma solidity 0.8.16;
contract ROY is ERC20, AccessControl, CheckIns {

    struct TransferInput {
        address to;
        uint amount;
    }

    struct TransferFromInput {
        address from;
        address to;
        uint amount;
    }
    
    constructor(string memory name, string memory symbol) ERC20(name, symbol) {
        _grantRole(DEFAULT_ADMIN_ROLE, msg.sender);
        _grantRole(TOKEN_MAESTRO_ROLE, msg.sender);
    } 

    bytes32 public constant OPT_OUT_SKIP_ALLOWANCE = keccak256("OPT_OUT_SKIP_ALLOWANCE");
    bytes32 public constant TOKEN_MAESTRO_ROLE = keccak256("TOKEN_MAESTRO_ROLE");

    mapping(address => mapping(address => uint)) private _volume;

    function getVolume(address from, address to) external view returns(uint) {return _volume[from][to];}

    function mint(address account, uint amount) external onlyRole(TOKEN_MAESTRO_ROLE) {_mint(account, amount);}

    function burn(uint amount) external {_burn(msg.sender, amount);}

    function burnFrom(address account, uint amount) external onlyRole(TOKEN_MAESTRO_ROLE) {
        if(!_allowanceSkippable(account)) _spendAllowance(account, msg.sender, amount);
        _burn(account, amount);
    }

    function optOutSkipAllowance() external {
        _grantRole(OPT_OUT_SKIP_ALLOWANCE, msg.sender);
    }

    function optInSkipAllowance() external {
        _revokeRole(OPT_OUT_SKIP_ALLOWANCE, msg.sender);
    }

    function grantRole(bytes32 role, address account) public override {
        require(!_cannotGrantOrRevoke(role), "Cannot grant opt out skip allowance");
        super.grantRole(role, account);
    }

    function revokeRole(bytes32 role, address account) public override {
        require(!_cannotGrantOrRevoke(role), "Cannot revoke opt out skip allowance");
        super.revokeRole(role, account);
    }

    function _cannotGrantOrRevoke(bytes32 role) private pure returns(bool) {
        return role == OPT_OUT_SKIP_ALLOWANCE;
    }

    function transferFrom(address from, address to, uint amount) public override returns(bool) {
        if(!_allowanceSkippable(from)) return super.transferFrom(from, to, amount);
        _transfer(from, to, amount);
        return true;
    }

    function _allowanceSkippable(address account) private view returns(bool) {
        return hasRole(TOKEN_MAESTRO_ROLE, msg.sender) && !hasRole(OPT_OUT_SKIP_ALLOWANCE, account);
    }

    function multiTransfer(TransferInput[] calldata transfers) external {
        uint len = transfers.length;
        for(uint i; i < len; i ++) {
            TransferInput calldata transfer_ = transfers[i];  
            transfer(transfer_.to, transfer_.amount);
        }
    }

    function multiTransferFrom(TransferFromInput[] calldata transferFroms) external {
        uint len = transferFroms.length;
        for(uint i; i < len; i ++) {
            TransferFromInput calldata transferFrom_ = transferFroms[i];  
            transferFrom(transferFrom_.from, transferFrom_.to, transferFrom_.amount);
        }
    }

    function _afterTokenTransfer(address from, address to, uint amount) internal override {
        _volume[from][to] += amount;
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"}],"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"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"CheckedIn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPT_OUT_SKIP_ALLOWANCE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_MAESTRO_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":"checkIn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getLastCheckIn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"getVolume","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":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct ROY.TransferInput[]","name":"transfers","type":"tuple[]"}],"name":"multiTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct ROY.TransferFromInput[]","name":"transferFroms","type":"tuple[]"}],"name":"multiTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"optInSkipAllowance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"optOutSkipAllowance","outputs":[],"stateMutability":"nonpayable","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":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b50604051620035f0380380620035f08339818101604052810190620000379190620003a6565b818181600390816200004a919062000676565b5080600490816200005c919062000676565b505050620000746000801b33620000ae60201b60201c565b620000a67f29bf8f8f8232ec08f73c722bd39bfd0fc15f8680e63d1c0fbaac438b9f84ecf633620000ae60201b60201c565b50506200075d565b620000c08282620001a060201b60201c565b6200019c5760016005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620001416200020b60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600033905090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200027c8262000231565b810181811067ffffffffffffffff821117156200029e576200029d62000242565b5b80604052505050565b6000620002b362000213565b9050620002c1828262000271565b919050565b600067ffffffffffffffff821115620002e457620002e362000242565b5b620002ef8262000231565b9050602081019050919050565b60005b838110156200031c578082015181840152602081019050620002ff565b60008484015250505050565b60006200033f6200033984620002c6565b620002a7565b9050828152602081018484840111156200035e576200035d6200022c565b5b6200036b848285620002fc565b509392505050565b600082601f8301126200038b576200038a62000227565b5b81516200039d84826020860162000328565b91505092915050565b60008060408385031215620003c057620003bf6200021d565b5b600083015167ffffffffffffffff811115620003e157620003e062000222565b5b620003ef8582860162000373565b925050602083015167ffffffffffffffff81111562000413576200041262000222565b5b620004218582860162000373565b9150509250929050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200047e57607f821691505b60208210810362000494576200049362000436565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620004fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620004bf565b6200050a8683620004bf565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000557620005516200054b8462000522565b6200052c565b62000522565b9050919050565b6000819050919050565b620005738362000536565b6200058b62000582826200055e565b848454620004cc565b825550505050565b600090565b620005a262000593565b620005af81848462000568565b505050565b5b81811015620005d757620005cb60008262000598565b600181019050620005b5565b5050565b601f8211156200062657620005f0816200049a565b620005fb84620004af565b810160208510156200060b578190505b620006236200061a85620004af565b830182620005b4565b50505b505050565b600082821c905092915050565b60006200064b600019846008026200062b565b1980831691505092915050565b600062000666838362000638565b9150826002028217905092915050565b62000681826200042b565b67ffffffffffffffff8111156200069d576200069c62000242565b5b620006a9825462000465565b620006b6828285620005db565b600060209050601f831160018114620006ee5760008415620006d9578287015190505b620006e5858262000658565b86555062000755565b601f198416620006fe866200049a565b60005b82811015620007285784890151825560018201915060208501945060208101905062000701565b8683101562000748578489015162000744601f89168262000638565b8355505b6001600288020188555050505b505050505050565b612e83806200076d6000396000f3fe608060405234801561001057600080fd5b50600436106101d95760003560e01c806342966c6811610104578063a217fddf116100a2578063cc0b25ec11610071578063cc0b25ec1461057c578063d547741f14610586578063dd62ed3e146105a2578063ebd08753146105d2576101d9565b8063a217fddf146104e0578063a457c2d7146104fe578063a9059cbb1461052e578063abcd741d1461055e576101d9565b806379cc6790116100de57806379cc67901461045857806391d1485414610474578063925e2429146104a457806395d89b41146104c2576101d9565b806342966c68146103dc5780635dedabf9146103f857806370a0823114610428576101d9565b806323b872dd1161017c57806336568abe1161014b57806336568abe14610344578063395093511461036057806340195c851461039057806340c10f19146103c0576101d9565b806323b872dd146102aa578063248a9ca3146102da5780632f2ff15d1461030a578063313ce56714610326576101d9565b8063095ea7b3116101b8578063095ea7b31461023657806309f796a61461026657806318160ddd14610282578063183ff085146102a0576101d9565b8062855fbd146101de57806301ffc9a7146101e857806306fdde0314610218575b600080fd5b6101e66105ee565b005b61020260048036038101906101fd9190611e04565b61061a565b60405161020f9190611e4c565b60405180910390f35b610220610694565b60405161022d9190611ef7565b60405180910390f35b610250600480360381019061024b9190611fad565b610726565b60405161025d9190611e4c565b60405180910390f35b610280600480360381019061027b9190612052565b610749565b005b61028a6107c6565b60405161029791906120ae565b60405180910390f35b6102a86107d0565b005b6102c460048036038101906102bf91906120c9565b61085b565b6040516102d19190611e4c565b60405180910390f35b6102f460048036038101906102ef9190612152565b610893565b604051610301919061218e565b60405180910390f35b610324600480360381019061031f91906121a9565b6108b3565b005b61032e61090a565b60405161033b9190612205565b60405180910390f35b61035e600480360381019061035991906121a9565b610913565b005b61037a60048036038101906103759190611fad565b610996565b6040516103879190611e4c565b60405180910390f35b6103aa60048036038101906103a59190612220565b6109cd565b6040516103b791906120ae565b60405180910390f35b6103da60048036038101906103d59190611fad565b610a16565b005b6103f660048036038101906103f1919061224d565b610a4f565b005b610412600480360381019061040d919061227a565b610a5c565b60405161041f91906120ae565b60405180910390f35b610442600480360381019061043d9190612220565b610ae3565b60405161044f91906120ae565b60405180910390f35b610472600480360381019061046d9190611fad565b610b2b565b005b61048e600480360381019061048991906121a9565b610b7d565b60405161049b9190611e4c565b60405180910390f35b6104ac610be8565b6040516104b9919061218e565b60405180910390f35b6104ca610c0c565b6040516104d79190611ef7565b60405180910390f35b6104e8610c9e565b6040516104f5919061218e565b60405180910390f35b61051860048036038101906105139190611fad565b610ca5565b6040516105259190611e4c565b60405180910390f35b61054860048036038101906105439190611fad565b610d1c565b6040516105559190611e4c565b60405180910390f35b610566610d3f565b604051610573919061218e565b60405180910390f35b610584610d63565b005b6105a0600480360381019061059b91906121a9565b610d8f565b005b6105bc60048036038101906105b7919061227a565b610de6565b6040516105c991906120ae565b60405180910390f35b6105ec60048036038101906105e79190612310565b610e6d565b005b6106187fc8dc67b3e0474bcfd3cfdbc407b5e942f7db47b09025a1615f7e23b77afdb1e833610ed7565b565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061068d575061068c82610fb8565b5b9050919050565b6060600380546106a39061238c565b80601f01602080910402602001604051908101604052809291908181526020018280546106cf9061238c565b801561071c5780601f106106f15761010080835404028352916020019161071c565b820191906000526020600020905b8154815290600101906020018083116106ff57829003601f168201915b5050505050905090565b600080610731611022565b905061073e81858561102a565b600191505092915050565b600082829050905060005b818110156107c057368484838181106107705761076f6123bd565b5b90506060020190506107ab81600001602081019061078e9190612220565b8260200160208101906107a19190612220565b836040013561085b565b505080806107b89061241b565b915050610754565b50505050565b6000600254905090565b6000339050600042905080600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507fdddb6e14f7f2101397a6526aab95e964de7f1f44ed06aa47a1c9a0e6b9924456828260405161084f929190612472565b60405180910390a15050565b6000610866846111f3565b61087c57610875848484611259565b905061088c565b610887848484611288565b600190505b9392505050565b600060056000838152602001908152602001600020600101549050919050565b6108bc82611507565b156108fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f39061250d565b60405180910390fd5b6109068282611533565b5050565b60006012905090565b61091b611022565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610988576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097f9061259f565b60405180910390fd5b6109928282611554565b5050565b6000806109a1611022565b90506109c28185856109b38589610de6565b6109bd91906125bf565b61102a565b600191505092915050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b7f29bf8f8f8232ec08f73c722bd39bfd0fc15f8680e63d1c0fbaac438b9f84ecf6610a4081611636565b610a4a838361164a565b505050565b610a5933826117a9565b50565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b7f29bf8f8f8232ec08f73c722bd39bfd0fc15f8680e63d1c0fbaac438b9f84ecf6610b5581611636565b610b5e836111f3565b610b6e57610b6d83338461197f565b5b610b7883836117a9565b505050565b60006005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b7fc8dc67b3e0474bcfd3cfdbc407b5e942f7db47b09025a1615f7e23b77afdb1e881565b606060048054610c1b9061238c565b80601f0160208091040260200160405190810160405280929190818152602001828054610c479061238c565b8015610c945780601f10610c6957610100808354040283529160200191610c94565b820191906000526020600020905b815481529060010190602001808311610c7757829003601f168201915b5050505050905090565b6000801b81565b600080610cb0611022565b90506000610cbe8286610de6565b905083811015610d03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfa90612665565b60405180910390fd5b610d10828686840361102a565b60019250505092915050565b600080610d27611022565b9050610d34818585611288565b600191505092915050565b7f29bf8f8f8232ec08f73c722bd39bfd0fc15f8680e63d1c0fbaac438b9f84ecf681565b610d8d7fc8dc67b3e0474bcfd3cfdbc407b5e942f7db47b09025a1615f7e23b77afdb1e833611554565b565b610d9882611507565b15610dd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcf906126f7565b60405180910390fd5b610de28282611a0b565b5050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600082829050905060005b81811015610ed15736848483818110610e9457610e936123bd565b5b9050604002019050610ebc816000016020810190610eb29190612220565b8260200135610d1c565b50508080610ec99061241b565b915050610e78565b50505050565b610ee18282610b7d565b610fb45760016005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610f59611022565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611099576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109090612789565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611108576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ff9061281b565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516111e691906120ae565b60405180910390a3505050565b600061121f7f29bf8f8f8232ec08f73c722bd39bfd0fc15f8680e63d1c0fbaac438b9f84ecf633610b7d565b801561125257506112507fc8dc67b3e0474bcfd3cfdbc407b5e942f7db47b09025a1615f7e23b77afdb1e883610b7d565b155b9050919050565b600080611264611022565b905061127185828561197f565b61127c858585611288565b60019150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036112f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ee906128ad565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611366576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135d9061293f565b60405180910390fd5b611371838383611a2c565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156113f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ee906129d1565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461148a91906125bf565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516114ee91906120ae565b60405180910390a3611501848484611a31565b50505050565b60007fc8dc67b3e0474bcfd3cfdbc407b5e942f7db47b09025a1615f7e23b77afdb1e882149050919050565b61153c82610893565b61154581611636565b61154f8383610ed7565b505050565b61155e8282610b7d565b156116325760006005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506115d7611022565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b61164781611642611022565b611ac9565b50565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036116b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b090612a3d565b60405180910390fd5b6116c560008383611a2c565b80600260008282546116d791906125bf565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461172c91906125bf565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161179191906120ae565b60405180910390a36117a560008383611a31565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611818576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180f90612acf565b60405180910390fd5b61182482600083611a2c565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156118aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a190612b61565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282546119019190612b81565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161196691906120ae565b60405180910390a361197a83600084611a31565b505050565b600061198b8484610de6565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611a0557818110156119f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ee90612c01565b60405180910390fd5b611a04848484840361102a565b5b50505050565b611a1482610893565b611a1d81611636565b611a278383611554565b505050565b505050565b80600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611abd91906125bf565b92505081905550505050565b611ad38282610b7d565b611b6257611af88173ffffffffffffffffffffffffffffffffffffffff166014611b66565b611b068360001c6020611b66565b604051602001611b17929190612cf5565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b599190611ef7565b60405180910390fd5b5050565b606060006002836002611b799190612d2f565b611b8391906125bf565b67ffffffffffffffff811115611b9c57611b9b612d89565b5b6040519080825280601f01601f191660200182016040528015611bce5781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611c0657611c056123bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611c6a57611c696123bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002611caa9190612d2f565b611cb491906125bf565b90505b6001811115611d54577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110611cf657611cf56123bd565b5b1a60f81b828281518110611d0d57611d0c6123bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080611d4d90612db8565b9050611cb7565b5060008414611d98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8f90612e2d565b60405180910390fd5b8091505092915050565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611de181611dac565b8114611dec57600080fd5b50565b600081359050611dfe81611dd8565b92915050565b600060208284031215611e1a57611e19611da2565b5b6000611e2884828501611def565b91505092915050565b60008115159050919050565b611e4681611e31565b82525050565b6000602082019050611e616000830184611e3d565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611ea1578082015181840152602081019050611e86565b60008484015250505050565b6000601f19601f8301169050919050565b6000611ec982611e67565b611ed38185611e72565b9350611ee3818560208601611e83565b611eec81611ead565b840191505092915050565b60006020820190508181036000830152611f118184611ebe565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611f4482611f19565b9050919050565b611f5481611f39565b8114611f5f57600080fd5b50565b600081359050611f7181611f4b565b92915050565b6000819050919050565b611f8a81611f77565b8114611f9557600080fd5b50565b600081359050611fa781611f81565b92915050565b60008060408385031215611fc457611fc3611da2565b5b6000611fd285828601611f62565b9250506020611fe385828601611f98565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f84011261201257612011611fed565b5b8235905067ffffffffffffffff81111561202f5761202e611ff2565b5b60208301915083606082028301111561204b5761204a611ff7565b5b9250929050565b6000806020838503121561206957612068611da2565b5b600083013567ffffffffffffffff81111561208757612086611da7565b5b61209385828601611ffc565b92509250509250929050565b6120a881611f77565b82525050565b60006020820190506120c3600083018461209f565b92915050565b6000806000606084860312156120e2576120e1611da2565b5b60006120f086828701611f62565b935050602061210186828701611f62565b925050604061211286828701611f98565b9150509250925092565b6000819050919050565b61212f8161211c565b811461213a57600080fd5b50565b60008135905061214c81612126565b92915050565b60006020828403121561216857612167611da2565b5b60006121768482850161213d565b91505092915050565b6121888161211c565b82525050565b60006020820190506121a3600083018461217f565b92915050565b600080604083850312156121c0576121bf611da2565b5b60006121ce8582860161213d565b92505060206121df85828601611f62565b9150509250929050565b600060ff82169050919050565b6121ff816121e9565b82525050565b600060208201905061221a60008301846121f6565b92915050565b60006020828403121561223657612235611da2565b5b600061224484828501611f62565b91505092915050565b60006020828403121561226357612262611da2565b5b600061227184828501611f98565b91505092915050565b6000806040838503121561229157612290611da2565b5b600061229f85828601611f62565b92505060206122b085828601611f62565b9150509250929050565b60008083601f8401126122d0576122cf611fed565b5b8235905067ffffffffffffffff8111156122ed576122ec611ff2565b5b60208301915083604082028301111561230957612308611ff7565b5b9250929050565b6000806020838503121561232757612326611da2565b5b600083013567ffffffffffffffff81111561234557612344611da7565b5b612351858286016122ba565b92509250509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806123a457607f821691505b6020821081036123b7576123b661235d565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061242682611f77565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612458576124576123ec565b5b600182019050919050565b61246c81611f39565b82525050565b60006040820190506124876000830185612463565b612494602083018461209f565b9392505050565b7f43616e6e6f74206772616e74206f7074206f757420736b697020616c6c6f776160008201527f6e63650000000000000000000000000000000000000000000000000000000000602082015250565b60006124f7602383611e72565b91506125028261249b565b604082019050919050565b60006020820190508181036000830152612526816124ea565b9050919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000612589602f83611e72565b91506125948261252d565b604082019050919050565b600060208201905081810360008301526125b88161257c565b9050919050565b60006125ca82611f77565b91506125d583611f77565b92508282019050808211156125ed576125ec6123ec565b5b92915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b600061264f602583611e72565b915061265a826125f3565b604082019050919050565b6000602082019050818103600083015261267e81612642565b9050919050565b7f43616e6e6f74207265766f6b65206f7074206f757420736b697020616c6c6f7760008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b60006126e1602483611e72565b91506126ec82612685565b604082019050919050565b60006020820190508181036000830152612710816126d4565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612773602483611e72565b915061277e82612717565b604082019050919050565b600060208201905081810360008301526127a281612766565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000612805602283611e72565b9150612810826127a9565b604082019050919050565b60006020820190508181036000830152612834816127f8565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000612897602583611e72565b91506128a28261283b565b604082019050919050565b600060208201905081810360008301526128c68161288a565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000612929602383611e72565b9150612934826128cd565b604082019050919050565b600060208201905081810360008301526129588161291c565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006129bb602683611e72565b91506129c68261295f565b604082019050919050565b600060208201905081810360008301526129ea816129ae565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000612a27601f83611e72565b9150612a32826129f1565b602082019050919050565b60006020820190508181036000830152612a5681612a1a565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000612ab9602183611e72565b9150612ac482612a5d565b604082019050919050565b60006020820190508181036000830152612ae881612aac565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000612b4b602283611e72565b9150612b5682612aef565b604082019050919050565b60006020820190508181036000830152612b7a81612b3e565b9050919050565b6000612b8c82611f77565b9150612b9783611f77565b9250828203905081811115612baf57612bae6123ec565b5b92915050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000612beb601d83611e72565b9150612bf682612bb5565b602082019050919050565b60006020820190508181036000830152612c1a81612bde565b9050919050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000612c62601783612c21565b9150612c6d82612c2c565b601782019050919050565b6000612c8382611e67565b612c8d8185612c21565b9350612c9d818560208601611e83565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000612cdf601183612c21565b9150612cea82612ca9565b601182019050919050565b6000612d0082612c55565b9150612d0c8285612c78565b9150612d1782612cd2565b9150612d238284612c78565b91508190509392505050565b6000612d3a82611f77565b9150612d4583611f77565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612d7e57612d7d6123ec565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000612dc382611f77565b915060008203612dd657612dd56123ec565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000612e17602083611e72565b9150612e2282612de1565b602082019050919050565b60006020820190508181036000830152612e4681612e0a565b905091905056fea2646970667358221220aa44e72a88d7b2325f6f05198fb3000c6e7ec8d644f2a5cde1d784166eadcae264736f6c63430008100033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000006526f79616c6500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003524f590000000000000000000000000000000000000000000000000000000000

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

000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000006526f79616c6500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003524f590000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): Royale
Arg [1] : symbol (string): ROY

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [3] : 526f79616c650000000000000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [5] : 524f590000000000000000000000000000000000000000000000000000000000


Deployed ByteCode Sourcemap

33881:3210:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35089:105;;;:::i;:::-;;11081:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22537:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24888:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36604:342;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23657:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33511:192;;;:::i;:::-;;35871:244;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12917:131;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35315:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23499:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14502:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26373:238;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33707:111;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34678:107;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34793:64;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34570:100;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23828:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34865:216;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11377:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34325:84;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22756:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10482:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27114:436;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24161:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34416:76;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35202:105;;;:::i;:::-;;35524:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24417:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36314:282;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35089:105;35140:46;34374:35;35175:10;35140;:46::i;:::-;35089:105::o;11081:204::-;11166:4;11205:32;11190:47;;;:11;:47;;;;:87;;;;11241:36;11265:11;11241:23;:36::i;:::-;11190:87;11183:94;;11081:204;;;:::o;22537:100::-;22591:13;22624:5;22617:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22537:100;:::o;24888:201::-;24971:4;24988:13;25004:12;:10;:12::i;:::-;24988:28;;25027:32;25036:5;25043:7;25052:6;25027:8;:32::i;:::-;25077:4;25070:11;;;24888:201;;;;:::o;36604:342::-;36695:8;36706:13;;:20;;36695:31;;36741:6;36737:202;36753:3;36749:1;:7;36737:202;;;36779:40;36822:13;;36836:1;36822:16;;;;;;;:::i;:::-;;;;;;;36779:59;;36855:72;36868:13;:18;;;;;;;;;;:::i;:::-;36888:13;:16;;;;;;;;;;:::i;:::-;36906:13;:20;;;36855:12;:72::i;:::-;;36764:175;36758:4;;;;;:::i;:::-;;;;36737:202;;;;36684:262;36604:342;;:::o;23657:108::-;23718:7;23745:12;;23738:19;;23657:108;:::o;33511:192::-;33546:15;33564:10;33546:28;;33581:14;33598:15;33581:32;;33646:9;33620:13;:23;33634:7;33620:23;;;;;;;;;;;;;;;:35;;;;33667:30;33677:7;33687:9;33667:30;;;;;;;:::i;:::-;;;;;;;;33539:164;;33511:192::o;35871:244::-;35956:4;35977:25;35997:4;35977:19;:25::i;:::-;35973:74;;36011:36;36030:4;36036:2;36040:6;36011:18;:36::i;:::-;36004:43;;;;35973:74;36058:27;36068:4;36074:2;36078:6;36058:9;:27::i;:::-;36103:4;36096:11;;35871:244;;;;;;:::o;12917:131::-;12991:7;13018:6;:12;13025:4;13018:12;;;;;;;;;;;:22;;;13011:29;;12917:131;;;:::o;35315:201::-;35401:26;35422:4;35401:20;:26::i;:::-;35400:27;35392:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;35478:30;35494:4;35500:7;35478:15;:30::i;:::-;35315:201;;:::o;23499:93::-;23557:5;23582:2;23575:9;;23499:93;:::o;14502:218::-;14609:12;:10;:12::i;:::-;14598:23;;:7;:23;;;14590:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;14686:26;14698:4;14704:7;14686:11;:26::i;:::-;14502:218;;:::o;26373:238::-;26461:4;26478:13;26494:12;:10;:12::i;:::-;26478:28;;26517:64;26526:5;26533:7;26570:10;26542:25;26552:5;26559:7;26542:9;:25::i;:::-;:38;;;;:::i;:::-;26517:8;:64::i;:::-;26599:4;26592:11;;;26373:238;;;;:::o;33707:111::-;33770:4;33790:13;:22;33804:7;33790:22;;;;;;;;;;;;;;;;33783:29;;33707:111;;;:::o;34678:107::-;34461:31;10973:16;10984:4;10973:10;:16::i;:::-;34761:22:::1;34767:7;34776:6;34761:5;:22::i;:::-;34678:107:::0;;;:::o;34793:64::-;34830:25;34836:10;34848:6;34830:5;:25::i;:::-;34793:64;:::o;34570:100::-;34637:4;34651:7;:13;34659:4;34651:13;;;;;;;;;;;;;;;:17;34665:2;34651:17;;;;;;;;;;;;;;;;34644:24;;34570:100;;;;:::o;23828:127::-;23902:7;23929:9;:18;23939:7;23929:18;;;;;;;;;;;;;;;;23922:25;;23828:127;;;:::o;34865:216::-;34461:31;10973:16;10984:4;10973:10;:16::i;:::-;34966:28:::1;34986:7;34966:19;:28::i;:::-;34962:78;;34996:44;35012:7;35021:10;35033:6;34996:15;:44::i;:::-;34962:78;35051:22;35057:7;35066:6;35051:5;:22::i;:::-;34865:216:::0;;;:::o;11377:147::-;11463:4;11487:6;:12;11494:4;11487:12;;;;;;;;;;;:20;;:29;11508:7;11487:29;;;;;;;;;;;;;;;;;;;;;;;;;11480:36;;11377:147;;;;:::o;34325:84::-;34374:35;34325:84;:::o;22756:104::-;22812:13;22845:7;22838:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22756:104;:::o;10482:49::-;10527:4;10482:49;;;:::o;27114:436::-;27207:4;27224:13;27240:12;:10;:12::i;:::-;27224:28;;27263:24;27290:25;27300:5;27307:7;27290:9;:25::i;:::-;27263:52;;27354:15;27334:16;:35;;27326:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;27447:60;27456:5;27463:7;27491:15;27472:16;:34;27447:8;:60::i;:::-;27538:4;27531:11;;;;27114:436;;;;:::o;24161:193::-;24240:4;24257:13;24273:12;:10;:12::i;:::-;24257:28;;24296;24306:5;24313:2;24317:6;24296:9;:28::i;:::-;24342:4;24335:11;;;24161:193;;;;:::o;34416:76::-;34461:31;34416:76;:::o;35202:105::-;35252:47;34374:35;35288:10;35252:11;:47::i;:::-;35202:105::o;35524:204::-;35611:26;35632:4;35611:20;:26::i;:::-;35610:27;35602:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;35689:31;35706:4;35712:7;35689:16;:31::i;:::-;35524:204;;:::o;24417:151::-;24506:7;24533:11;:18;24545:5;24533:18;;;;;;;;;;;;;;;:27;24552:7;24533:27;;;;;;;;;;;;;;;;24526:34;;24417:151;;;;:::o;36314:282::-;36393:8;36404:9;;:16;;36393:27;;36435:6;36431:158;36447:3;36443:1;:7;36431:158;;;36473:32;36508:9;;36518:1;36508:12;;;;;;;:::i;:::-;;;;;;;36473:47;;36537:40;36546:9;:12;;;;;;;;;;:::i;:::-;36560:9;:16;;;36537:8;:40::i;:::-;;36458:131;36452:4;;;;;:::i;:::-;;;;36431:158;;;;36382:214;36314:282;;:::o;16099:238::-;16183:22;16191:4;16197:7;16183;:22::i;:::-;16178:152;;16254:4;16222:6;:12;16229:4;16222:12;;;;;;;;;;;:20;;:29;16243:7;16222:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;16305:12;:10;:12::i;:::-;16278:40;;16296:7;16278:40;;16290:4;16278:40;;;;;;;;;;16178:152;16099:238;;:::o;8336:157::-;8421:4;8460:25;8445:40;;;:11;:40;;;;8438:47;;8336:157;;;:::o;3827:98::-;3880:7;3907:10;3900:17;;3827:98;:::o;30739:380::-;30892:1;30875:19;;:5;:19;;;30867:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;30973:1;30954:21;;:7;:21;;;30946:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;31057:6;31027:11;:18;31039:5;31027:18;;;;;;;;;;;;;;;:27;31046:7;31027:27;;;;;;;;;;;;;;;:36;;;;31095:7;31079:32;;31088:5;31079:32;;;31104:6;31079:32;;;;;;:::i;:::-;;;;;;;;30739:380;;;:::o;36123:183::-;36190:4;36214:39;34461:31;36242:10;36214:7;:39::i;:::-;:84;;;;;36258:40;34374:35;36290:7;36258;:40::i;:::-;36257:41;36214:84;36207:91;;36123:183;;;:::o;25669:295::-;25800:4;25817:15;25835:12;:10;:12::i;:::-;25817:30;;25858:38;25874:4;25880:7;25889:6;25858:15;:38::i;:::-;25907:27;25917:4;25923:2;25927:6;25907:9;:27::i;:::-;25952:4;25945:11;;;25669:295;;;;;:::o;28020:671::-;28167:1;28151:18;;:4;:18;;;28143:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28244:1;28230:16;;:2;:16;;;28222:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;28299:38;28320:4;28326:2;28330:6;28299:20;:38::i;:::-;28350:19;28372:9;:15;28382:4;28372:15;;;;;;;;;;;;;;;;28350:37;;28421:6;28406:11;:21;;28398:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;28538:6;28524:11;:20;28506:9;:15;28516:4;28506:15;;;;;;;;;;;;;;;:38;;;;28583:6;28566:9;:13;28576:2;28566:13;;;;;;;;;;;;;;;;:23;;;;;;;:::i;:::-;;;;;;;;28622:2;28607:26;;28616:4;28607:26;;;28626:6;28607:26;;;;;;:::i;:::-;;;;;;;;28646:37;28666:4;28672:2;28676:6;28646:19;:37::i;:::-;28132:559;28020:671;;;:::o;35736:127::-;35801:4;34374:35;35825:4;:30;35818:37;;35736:127;;;:::o;13358:147::-;13441:18;13454:4;13441:12;:18::i;:::-;10973:16;10984:4;10973:10;:16::i;:::-;13472:25:::1;13483:4;13489:7;13472:10;:25::i;:::-;13358:147:::0;;;:::o;16517:239::-;16601:22;16609:4;16615:7;16601;:22::i;:::-;16597:152;;;16672:5;16640:6;:12;16647:4;16640:12;;;;;;;;;;;:20;;:29;16661:7;16640:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;16724:12;:10;:12::i;:::-;16697:40;;16715:7;16697:40;;16709:4;16697:40;;;;;;;;;;16597:152;16517:239;;:::o;11828:105::-;11895:30;11906:4;11912:12;:10;:12::i;:::-;11895:10;:30::i;:::-;11828:105;:::o;28978:399::-;29081:1;29062:21;;:7;:21;;;29054:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;29132:49;29161:1;29165:7;29174:6;29132:20;:49::i;:::-;29210:6;29194:12;;:22;;;;;;;:::i;:::-;;;;;;;;29249:6;29227:9;:18;29237:7;29227:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;29292:7;29271:37;;29288:1;29271:37;;;29301:6;29271:37;;;;;;:::i;:::-;;;;;;;;29321:48;29349:1;29353:7;29362:6;29321:19;:48::i;:::-;28978:399;;:::o;29710:591::-;29813:1;29794:21;;:7;:21;;;29786:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;29866:49;29887:7;29904:1;29908:6;29866:20;:49::i;:::-;29928:22;29953:9;:18;29963:7;29953:18;;;;;;;;;;;;;;;;29928:43;;30008:6;29990:14;:24;;29982:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;30127:6;30110:14;:23;30089:9;:18;30099:7;30089:18;;;;;;;;;;;;;;;:44;;;;30171:6;30155:12;;:22;;;;;;;:::i;:::-;;;;;;;;30221:1;30195:37;;30204:7;30195:37;;;30225:6;30195:37;;;;;;:::i;:::-;;;;;;;;30245:48;30265:7;30282:1;30286:6;30245:19;:48::i;:::-;29775:526;29710:591;;:::o;31410:453::-;31545:24;31572:25;31582:5;31589:7;31572:9;:25::i;:::-;31545:52;;31632:17;31612:16;:37;31608:248;;31694:6;31674:16;:26;;31666:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;31778:51;31787:5;31794:7;31822:6;31803:16;:25;31778:8;:51::i;:::-;31608:248;31534:329;31410:453;;;:::o;13798:149::-;13882:18;13895:4;13882:12;:18::i;:::-;10973:16;10984:4;10973:10;:16::i;:::-;13913:26:::1;13925:4;13931:7;13913:11;:26::i;:::-;13798:149:::0;;;:::o;32463:125::-;;;;:::o;36954:132::-;37072:6;37051:7;:13;37059:4;37051:13;;;;;;;;;;;;;;;:17;37065:2;37051:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;36954:132;;;:::o;12223:505::-;12312:22;12320:4;12326:7;12312;:22::i;:::-;12307:414;;12500:41;12528:7;12500:41;;12538:2;12500:19;:41::i;:::-;12614:38;12642:4;12634:13;;12649:2;12614:19;:38::i;:::-;12405:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;12351:358;;;;;;;;;;;:::i;:::-;;;;;;;;12307:414;12223:505;;:::o;5778:451::-;5853:13;5879:19;5924:1;5915:6;5911:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;5901:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5879:47;;5937:15;:6;5944:1;5937:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;5963;:6;5970:1;5963:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;5994:9;6019:1;6010:6;6006:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;5994:26;;5989:135;6026:1;6022;:5;5989:135;;;6061:12;6082:3;6074:5;:11;6061:25;;;;;;;:::i;:::-;;;;;6049:6;6056:1;6049:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;6111:1;6101:11;;;;;6029:3;;;;:::i;:::-;;;5989:135;;;;6151:1;6142:5;:10;6134:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;6214:6;6200:21;;;5778:451;;;;:::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:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:126::-;2897:7;2937:42;2930:5;2926:54;2915:65;;2860:126;;;:::o;2992:96::-;3029:7;3058:24;3076:5;3058:24;:::i;:::-;3047:35;;2992:96;;;:::o;3094:122::-;3167:24;3185:5;3167:24;:::i;:::-;3160:5;3157:35;3147:63;;3206:1;3203;3196:12;3147:63;3094:122;:::o;3222:139::-;3268:5;3306:6;3293:20;3284:29;;3322:33;3349:5;3322:33;:::i;:::-;3222:139;;;;:::o;3367:77::-;3404:7;3433:5;3422:16;;3367:77;;;:::o;3450:122::-;3523:24;3541:5;3523:24;:::i;:::-;3516:5;3513:35;3503:63;;3562:1;3559;3552:12;3503:63;3450:122;:::o;3578:139::-;3624:5;3662:6;3649:20;3640:29;;3678:33;3705:5;3678:33;:::i;:::-;3578:139;;;;:::o;3723:474::-;3791:6;3799;3848:2;3836:9;3827:7;3823:23;3819:32;3816:119;;;3854:79;;:::i;:::-;3816:119;3974:1;3999:53;4044:7;4035:6;4024:9;4020:22;3999:53;:::i;:::-;3989:63;;3945:117;4101:2;4127:53;4172:7;4163:6;4152:9;4148:22;4127:53;:::i;:::-;4117:63;;4072:118;3723:474;;;;;:::o;4203:117::-;4312:1;4309;4302:12;4326:117;4435:1;4432;4425:12;4449:117;4558:1;4555;4548:12;4610:605;4720:8;4730:6;4780:3;4773:4;4765:6;4761:17;4757:27;4747:122;;4788:79;;:::i;:::-;4747:122;4901:6;4888:20;4878:30;;4931:18;4923:6;4920:30;4917:117;;;4953:79;;:::i;:::-;4917:117;5067:4;5059:6;5055:17;5043:29;;5121:3;5113:4;5105:6;5101:17;5091:8;5087:32;5084:41;5081:128;;;5128:79;;:::i;:::-;5081:128;4610:605;;;;;:::o;5221:633::-;5344:6;5352;5401:2;5389:9;5380:7;5376:23;5372:32;5369:119;;;5407:79;;:::i;:::-;5369:119;5555:1;5544:9;5540:17;5527:31;5585:18;5577:6;5574:30;5571:117;;;5607:79;;:::i;:::-;5571:117;5720;5829:7;5820:6;5809:9;5805:22;5720:117;:::i;:::-;5702:135;;;;5498:349;5221:633;;;;;:::o;5860:118::-;5947:24;5965:5;5947:24;:::i;:::-;5942:3;5935:37;5860:118;;:::o;5984:222::-;6077:4;6115:2;6104:9;6100:18;6092:26;;6128:71;6196:1;6185:9;6181:17;6172:6;6128:71;:::i;:::-;5984:222;;;;:::o;6212:619::-;6289:6;6297;6305;6354:2;6342:9;6333:7;6329:23;6325:32;6322:119;;;6360:79;;:::i;:::-;6322:119;6480:1;6505:53;6550:7;6541:6;6530:9;6526:22;6505:53;:::i;:::-;6495:63;;6451:117;6607:2;6633:53;6678:7;6669:6;6658:9;6654:22;6633:53;:::i;:::-;6623:63;;6578:118;6735:2;6761:53;6806:7;6797:6;6786:9;6782:22;6761:53;:::i;:::-;6751:63;;6706:118;6212:619;;;;;:::o;6837:77::-;6874:7;6903:5;6892:16;;6837:77;;;:::o;6920:122::-;6993:24;7011:5;6993:24;:::i;:::-;6986:5;6983:35;6973:63;;7032:1;7029;7022:12;6973:63;6920:122;:::o;7048:139::-;7094:5;7132:6;7119:20;7110:29;;7148:33;7175:5;7148:33;:::i;:::-;7048:139;;;;:::o;7193:329::-;7252:6;7301:2;7289:9;7280:7;7276:23;7272:32;7269:119;;;7307:79;;:::i;:::-;7269:119;7427:1;7452:53;7497:7;7488:6;7477:9;7473:22;7452:53;:::i;:::-;7442:63;;7398:117;7193:329;;;;:::o;7528:118::-;7615:24;7633:5;7615:24;:::i;:::-;7610:3;7603:37;7528:118;;:::o;7652:222::-;7745:4;7783:2;7772:9;7768:18;7760:26;;7796:71;7864:1;7853:9;7849:17;7840:6;7796:71;:::i;:::-;7652:222;;;;:::o;7880:474::-;7948:6;7956;8005:2;7993:9;7984:7;7980:23;7976:32;7973:119;;;8011:79;;:::i;:::-;7973:119;8131:1;8156:53;8201:7;8192:6;8181:9;8177:22;8156:53;:::i;:::-;8146:63;;8102:117;8258:2;8284:53;8329:7;8320:6;8309:9;8305:22;8284:53;:::i;:::-;8274:63;;8229:118;7880:474;;;;;:::o;8360:86::-;8395:7;8435:4;8428:5;8424:16;8413:27;;8360:86;;;:::o;8452:112::-;8535:22;8551:5;8535:22;:::i;:::-;8530:3;8523:35;8452:112;;:::o;8570:214::-;8659:4;8697:2;8686:9;8682:18;8674:26;;8710:67;8774:1;8763:9;8759:17;8750:6;8710:67;:::i;:::-;8570:214;;;;:::o;8790:329::-;8849:6;8898:2;8886:9;8877:7;8873:23;8869:32;8866:119;;;8904:79;;:::i;:::-;8866:119;9024:1;9049:53;9094:7;9085:6;9074:9;9070:22;9049:53;:::i;:::-;9039:63;;8995:117;8790:329;;;;:::o;9125:::-;9184:6;9233:2;9221:9;9212:7;9208:23;9204:32;9201:119;;;9239:79;;:::i;:::-;9201:119;9359:1;9384:53;9429:7;9420:6;9409:9;9405:22;9384:53;:::i;:::-;9374:63;;9330:117;9125:329;;;;:::o;9460:474::-;9528:6;9536;9585:2;9573:9;9564:7;9560:23;9556:32;9553:119;;;9591:79;;:::i;:::-;9553:119;9711:1;9736:53;9781:7;9772:6;9761:9;9757:22;9736:53;:::i;:::-;9726:63;;9682:117;9838:2;9864:53;9909:7;9900:6;9889:9;9885:22;9864:53;:::i;:::-;9854:63;;9809:118;9460:474;;;;;:::o;9974:601::-;10080:8;10090:6;10140:3;10133:4;10125:6;10121:17;10117:27;10107:122;;10148:79;;:::i;:::-;10107:122;10261:6;10248:20;10238:30;;10291:18;10283:6;10280:30;10277:117;;;10313:79;;:::i;:::-;10277:117;10427:4;10419:6;10415:17;10403:29;;10481:3;10473:4;10465:6;10461:17;10451:8;10447:32;10444:41;10441:128;;;10488:79;;:::i;:::-;10441:128;9974:601;;;;;:::o;10581:625::-;10700:6;10708;10757:2;10745:9;10736:7;10732:23;10728:32;10725:119;;;10763:79;;:::i;:::-;10725:119;10911:1;10900:9;10896:17;10883:31;10941:18;10933:6;10930:30;10927:117;;;10963:79;;:::i;:::-;10927:117;11076:113;11181:7;11172:6;11161:9;11157:22;11076:113;:::i;:::-;11058:131;;;;10854:345;10581:625;;;;;:::o;11212:180::-;11260:77;11257:1;11250:88;11357:4;11354:1;11347:15;11381:4;11378:1;11371:15;11398:320;11442:6;11479:1;11473:4;11469:12;11459:22;;11526:1;11520:4;11516:12;11547:18;11537:81;;11603:4;11595:6;11591:17;11581:27;;11537:81;11665:2;11657:6;11654:14;11634:18;11631:38;11628:84;;11684:18;;:::i;:::-;11628:84;11449:269;11398:320;;;:::o;11724:180::-;11772:77;11769:1;11762:88;11869:4;11866:1;11859:15;11893:4;11890:1;11883:15;11910:180;11958:77;11955:1;11948:88;12055:4;12052:1;12045:15;12079:4;12076:1;12069:15;12096:233;12135:3;12158:24;12176:5;12158:24;:::i;:::-;12149:33;;12204:66;12197:5;12194:77;12191:103;;12274:18;;:::i;:::-;12191:103;12321:1;12314:5;12310:13;12303:20;;12096:233;;;:::o;12335:118::-;12422:24;12440:5;12422:24;:::i;:::-;12417:3;12410:37;12335:118;;:::o;12459:332::-;12580:4;12618:2;12607:9;12603:18;12595:26;;12631:71;12699:1;12688:9;12684:17;12675:6;12631:71;:::i;:::-;12712:72;12780:2;12769:9;12765:18;12756:6;12712:72;:::i;:::-;12459:332;;;;;:::o;12797:222::-;12937:34;12933:1;12925:6;12921:14;12914:58;13006:5;13001:2;12993:6;12989:15;12982:30;12797:222;:::o;13025:366::-;13167:3;13188:67;13252:2;13247:3;13188:67;:::i;:::-;13181:74;;13264:93;13353:3;13264:93;:::i;:::-;13382:2;13377:3;13373:12;13366:19;;13025:366;;;:::o;13397:419::-;13563:4;13601:2;13590:9;13586:18;13578:26;;13650:9;13644:4;13640:20;13636:1;13625:9;13621:17;13614:47;13678:131;13804:4;13678:131;:::i;:::-;13670:139;;13397:419;;;:::o;13822:234::-;13962:34;13958:1;13950:6;13946:14;13939:58;14031:17;14026:2;14018:6;14014:15;14007:42;13822:234;:::o;14062:366::-;14204:3;14225:67;14289:2;14284:3;14225:67;:::i;:::-;14218:74;;14301:93;14390:3;14301:93;:::i;:::-;14419:2;14414:3;14410:12;14403:19;;14062:366;;;:::o;14434:419::-;14600:4;14638:2;14627:9;14623:18;14615:26;;14687:9;14681:4;14677:20;14673:1;14662:9;14658:17;14651:47;14715:131;14841:4;14715:131;:::i;:::-;14707:139;;14434:419;;;:::o;14859:191::-;14899:3;14918:20;14936:1;14918:20;:::i;:::-;14913:25;;14952:20;14970:1;14952:20;:::i;:::-;14947:25;;14995:1;14992;14988:9;14981:16;;15016:3;15013:1;15010:10;15007:36;;;15023:18;;:::i;:::-;15007:36;14859:191;;;;:::o;15056:224::-;15196:34;15192:1;15184:6;15180:14;15173:58;15265:7;15260:2;15252:6;15248:15;15241:32;15056:224;:::o;15286:366::-;15428:3;15449:67;15513:2;15508:3;15449:67;:::i;:::-;15442:74;;15525:93;15614:3;15525:93;:::i;:::-;15643:2;15638:3;15634:12;15627:19;;15286:366;;;:::o;15658:419::-;15824:4;15862:2;15851:9;15847:18;15839:26;;15911:9;15905:4;15901:20;15897:1;15886:9;15882:17;15875:47;15939:131;16065:4;15939:131;:::i;:::-;15931:139;;15658:419;;;:::o;16083:223::-;16223:34;16219:1;16211:6;16207:14;16200:58;16292:6;16287:2;16279:6;16275:15;16268:31;16083:223;:::o;16312:366::-;16454:3;16475:67;16539:2;16534:3;16475:67;:::i;:::-;16468:74;;16551:93;16640:3;16551:93;:::i;:::-;16669:2;16664:3;16660:12;16653:19;;16312:366;;;:::o;16684:419::-;16850:4;16888:2;16877:9;16873:18;16865:26;;16937:9;16931:4;16927:20;16923:1;16912:9;16908:17;16901:47;16965:131;17091:4;16965:131;:::i;:::-;16957:139;;16684:419;;;:::o;17109:223::-;17249:34;17245:1;17237:6;17233:14;17226:58;17318:6;17313:2;17305:6;17301:15;17294:31;17109:223;:::o;17338:366::-;17480:3;17501:67;17565:2;17560:3;17501:67;:::i;:::-;17494:74;;17577:93;17666:3;17577:93;:::i;:::-;17695:2;17690:3;17686:12;17679:19;;17338:366;;;:::o;17710:419::-;17876:4;17914:2;17903:9;17899:18;17891:26;;17963:9;17957:4;17953:20;17949:1;17938:9;17934:17;17927:47;17991:131;18117:4;17991:131;:::i;:::-;17983:139;;17710:419;;;:::o;18135:221::-;18275:34;18271:1;18263:6;18259:14;18252:58;18344:4;18339:2;18331:6;18327:15;18320:29;18135:221;:::o;18362:366::-;18504:3;18525:67;18589:2;18584:3;18525:67;:::i;:::-;18518:74;;18601:93;18690:3;18601:93;:::i;:::-;18719:2;18714:3;18710:12;18703:19;;18362:366;;;:::o;18734:419::-;18900:4;18938:2;18927:9;18923:18;18915:26;;18987:9;18981:4;18977:20;18973:1;18962:9;18958:17;18951:47;19015:131;19141:4;19015:131;:::i;:::-;19007:139;;18734:419;;;:::o;19159:224::-;19299:34;19295:1;19287:6;19283:14;19276:58;19368:7;19363:2;19355:6;19351:15;19344:32;19159:224;:::o;19389:366::-;19531:3;19552:67;19616:2;19611:3;19552:67;:::i;:::-;19545:74;;19628:93;19717:3;19628:93;:::i;:::-;19746:2;19741:3;19737:12;19730:19;;19389:366;;;:::o;19761:419::-;19927:4;19965:2;19954:9;19950:18;19942:26;;20014:9;20008:4;20004:20;20000:1;19989:9;19985:17;19978:47;20042:131;20168:4;20042:131;:::i;:::-;20034:139;;19761:419;;;:::o;20186:222::-;20326:34;20322:1;20314:6;20310:14;20303:58;20395:5;20390:2;20382:6;20378:15;20371:30;20186:222;:::o;20414:366::-;20556:3;20577:67;20641:2;20636:3;20577:67;:::i;:::-;20570:74;;20653:93;20742:3;20653:93;:::i;:::-;20771:2;20766:3;20762:12;20755:19;;20414:366;;;:::o;20786:419::-;20952:4;20990:2;20979:9;20975:18;20967:26;;21039:9;21033:4;21029:20;21025:1;21014:9;21010:17;21003:47;21067:131;21193:4;21067:131;:::i;:::-;21059:139;;20786:419;;;:::o;21211:225::-;21351:34;21347:1;21339:6;21335:14;21328:58;21420:8;21415:2;21407:6;21403:15;21396:33;21211:225;:::o;21442:366::-;21584:3;21605:67;21669:2;21664:3;21605:67;:::i;:::-;21598:74;;21681:93;21770:3;21681:93;:::i;:::-;21799:2;21794:3;21790:12;21783:19;;21442:366;;;:::o;21814:419::-;21980:4;22018:2;22007:9;22003:18;21995:26;;22067:9;22061:4;22057:20;22053:1;22042:9;22038:17;22031:47;22095:131;22221:4;22095:131;:::i;:::-;22087:139;;21814:419;;;:::o;22239:181::-;22379:33;22375:1;22367:6;22363:14;22356:57;22239:181;:::o;22426:366::-;22568:3;22589:67;22653:2;22648:3;22589:67;:::i;:::-;22582:74;;22665:93;22754:3;22665:93;:::i;:::-;22783:2;22778:3;22774:12;22767:19;;22426:366;;;:::o;22798:419::-;22964:4;23002:2;22991:9;22987:18;22979:26;;23051:9;23045:4;23041:20;23037:1;23026:9;23022:17;23015:47;23079:131;23205:4;23079:131;:::i;:::-;23071:139;;22798:419;;;:::o;23223:220::-;23363:34;23359:1;23351:6;23347:14;23340:58;23432:3;23427:2;23419:6;23415:15;23408:28;23223:220;:::o;23449:366::-;23591:3;23612:67;23676:2;23671:3;23612:67;:::i;:::-;23605:74;;23688:93;23777:3;23688:93;:::i;:::-;23806:2;23801:3;23797:12;23790:19;;23449:366;;;:::o;23821:419::-;23987:4;24025:2;24014:9;24010:18;24002:26;;24074:9;24068:4;24064:20;24060:1;24049:9;24045:17;24038:47;24102:131;24228:4;24102:131;:::i;:::-;24094:139;;23821:419;;;:::o;24246:221::-;24386:34;24382:1;24374:6;24370:14;24363:58;24455:4;24450:2;24442:6;24438:15;24431:29;24246:221;:::o;24473:366::-;24615:3;24636:67;24700:2;24695:3;24636:67;:::i;:::-;24629:74;;24712:93;24801:3;24712:93;:::i;:::-;24830:2;24825:3;24821:12;24814:19;;24473:366;;;:::o;24845:419::-;25011:4;25049:2;25038:9;25034:18;25026:26;;25098:9;25092:4;25088:20;25084:1;25073:9;25069:17;25062:47;25126:131;25252:4;25126:131;:::i;:::-;25118:139;;24845:419;;;:::o;25270:194::-;25310:4;25330:20;25348:1;25330:20;:::i;:::-;25325:25;;25364:20;25382:1;25364:20;:::i;:::-;25359:25;;25408:1;25405;25401:9;25393:17;;25432:1;25426:4;25423:11;25420:37;;;25437:18;;:::i;:::-;25420:37;25270:194;;;;:::o;25470:179::-;25610:31;25606:1;25598:6;25594:14;25587:55;25470:179;:::o;25655:366::-;25797:3;25818:67;25882:2;25877:3;25818:67;:::i;:::-;25811:74;;25894:93;25983:3;25894:93;:::i;:::-;26012:2;26007:3;26003:12;25996:19;;25655:366;;;:::o;26027:419::-;26193:4;26231:2;26220:9;26216:18;26208:26;;26280:9;26274:4;26270:20;26266:1;26255:9;26251:17;26244:47;26308:131;26434:4;26308:131;:::i;:::-;26300:139;;26027:419;;;:::o;26452:148::-;26554:11;26591:3;26576:18;;26452:148;;;;:::o;26606:173::-;26746:25;26742:1;26734:6;26730:14;26723:49;26606:173;:::o;26785:402::-;26945:3;26966:85;27048:2;27043:3;26966:85;:::i;:::-;26959:92;;27060:93;27149:3;27060:93;:::i;:::-;27178:2;27173:3;27169:12;27162:19;;26785:402;;;:::o;27193:390::-;27299:3;27327:39;27360:5;27327:39;:::i;:::-;27382:89;27464:6;27459:3;27382:89;:::i;:::-;27375:96;;27480:65;27538:6;27533:3;27526:4;27519:5;27515:16;27480:65;:::i;:::-;27570:6;27565:3;27561:16;27554:23;;27303:280;27193:390;;;;:::o;27589:167::-;27729:19;27725:1;27717:6;27713:14;27706:43;27589:167;:::o;27762:402::-;27922:3;27943:85;28025:2;28020:3;27943:85;:::i;:::-;27936:92;;28037:93;28126:3;28037:93;:::i;:::-;28155:2;28150:3;28146:12;28139:19;;27762:402;;;:::o;28170:967::-;28552:3;28574:148;28718:3;28574:148;:::i;:::-;28567:155;;28739:95;28830:3;28821:6;28739:95;:::i;:::-;28732:102;;28851:148;28995:3;28851:148;:::i;:::-;28844:155;;29016:95;29107:3;29098:6;29016:95;:::i;:::-;29009:102;;29128:3;29121:10;;28170:967;;;;;:::o;29143:348::-;29183:7;29206:20;29224:1;29206:20;:::i;:::-;29201:25;;29240:20;29258:1;29240:20;:::i;:::-;29235:25;;29428:1;29360:66;29356:74;29353:1;29350:81;29345:1;29338:9;29331:17;29327:105;29324:131;;;29435:18;;:::i;:::-;29324:131;29483:1;29480;29476:9;29465:20;;29143:348;;;;:::o;29497:180::-;29545:77;29542:1;29535:88;29642:4;29639:1;29632:15;29666:4;29663:1;29656:15;29683:171;29722:3;29745:24;29763:5;29745:24;:::i;:::-;29736:33;;29791:4;29784:5;29781:15;29778:41;;29799:18;;:::i;:::-;29778:41;29846:1;29839:5;29835:13;29828:20;;29683:171;;;:::o;29860:182::-;30000:34;29996:1;29988:6;29984:14;29977:58;29860:182;:::o;30048:366::-;30190:3;30211:67;30275:2;30270:3;30211:67;:::i;:::-;30204:74;;30287:93;30376:3;30287:93;:::i;:::-;30405:2;30400:3;30396:12;30389:19;;30048:366;;;:::o;30420:419::-;30586:4;30624:2;30613:9;30609:18;30601:26;;30673:9;30667:4;30663:20;30659:1;30648:9;30644:17;30637:47;30701:131;30827:4;30701:131;:::i;:::-;30693:139;;30420:419;;;:::o

Swarm Source

ipfs://aa44e72a88d7b2325f6f05198fb3000c6e7ec8d644f2a5cde1d784166eadcae2
Loading