ETH Price: $2,063.05 (-0.93%)
 

Overview

Max Total Supply

91,857,799.488553789379384174 CATBOY

Holders

235 ( 0.426%)

Total Transfers

-

Market

Price

$0.01 @ 0.000004 ETH (+1.60%)

Onchain Market Cap

$767,626.24

Circulating Supply Market Cap

$903,710.00

Other Info

Token Contract (WITH 18 Decimals)

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

OVERVIEW

Catboy is a cat-themed community driven token where innovation meet community.

Market

Volume (24H):$240,599.00
Market Capitalization:$903,710.00
Circulating Supply:108,142,201.00 CATBOY
Market Data Source: Coinmarketcap

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Catboy

Compiler Version
v0.8.28+commit.7893614a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-12-03
*/

// SPDX-License-Identifier: UNLICENSED

pragma solidity ^0.8.0;

/**
 * @title IInterchainTokenStandard interface
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IInterchainTokenStandard {
    /**
     * @notice Implementation of the interchainTransfer method.
     * @dev We chose to either pass `metadata` as raw data on a remote contract call, or if no data is passed, just do a transfer.
     * A different implementation could use metadata to specify a function to invoke, or for other purposes as well.
     * @param destinationChain The destination chain identifier.
     * @param recipient The bytes representation of the address of the recipient.
     * @param amount The amount of token to be transferred.
     * @param metadata Optional metadata for the call for additional effects (such as calling a destination contract).
     */
    function interchainTransfer(
        string calldata destinationChain,
        bytes calldata recipient,
        uint256 amount,
        bytes calldata metadata
    ) external payable;

    /**
     * @notice Implementation of the interchainTransferFrom method
     * @dev We chose to either pass `metadata` as raw data on a remote contract call, or, if no data is passed, just do a transfer.
     * A different implementation could use metadata to specify a function to invoke, or for other purposes as well.
     * @param sender The sender of the tokens. They need to have approved `msg.sender` before this is called.
     * @param destinationChain The string representation of the destination chain.
     * @param recipient The bytes representation of the address of the recipient.
     * @param amount The amount of token to be transferred.
     * @param metadata Optional metadata for the call for additional effects (such as calling a destination contract.)
     */
    function interchainTransferFrom(
        address sender,
        string calldata destinationChain,
        bytes calldata recipient,
        uint256 amount,
        bytes calldata metadata
    ) external payable;
}
/**
 * @title ITransmitInterchainToken Interface
 * @notice Interface for transmiting interchain tokens via the interchain token service
 */
interface ITransmitInterchainToken {
    /**
     * @notice Transmit an interchain transfer for the given tokenId.
     * @dev Only callable by a token registered under a tokenId.
     * @param tokenId The tokenId of the token (which must be the msg.sender).
     * @param sourceAddress The address where the token is coming from.
     * @param destinationChain The name of the chain to send tokens to.
     * @param destinationAddress The destinationAddress for the interchainTransfer.
     * @param amount The amount of token to give.
     * @param metadata Optional metadata for the call for additional effects (such as calling a destination contract).
     */
    function transmitInterchainTransfer(
        bytes32 tokenId,
        address sourceAddress,
        string calldata destinationChain,
        bytes memory destinationAddress,
        uint256 amount,
        bytes calldata metadata
    ) external payable;
}
/**
 * @title An example implementation of the IInterchainTokenStandard.
 * @notice The is an abstract contract that needs to be extended with an ERC20 implementation. See `InterchainToken` for an example implementation.
 */
abstract contract InterchainTokenStandard is IInterchainTokenStandard {
    /**
     * @notice Getter for the tokenId used for this token.
     * @dev Needs to be overwritten.
     * @return tokenId_ The tokenId that this token is registerred under.
     */
    function interchainTokenId() public view virtual returns (bytes32 tokenId_);

    /**
     * @notice Getter for the interchain token service.
     * @dev Needs to be overwritten.
     * @return service The address of the interchain token service.
     */
    function interchainTokenService() public view virtual returns (address service);

    /**
     * @notice Implementation of the interchainTransfer method
     * @dev We chose to either pass `metadata` as raw data on a remote contract call, or if no data is passed, just do a transfer.
     * A different implementation could use metadata to specify a function to invoke, or for other purposes as well.
     * @param destinationChain The destination chain identifier.
     * @param recipient The bytes representation of the address of the recipient.
     * @param amount The amount of token to be transferred.
     * @param metadata Either empty, just to facilitate an interchain transfer, or the data to be passed for an interchain contract call with transfer
     * as per semantics defined by the token service.
     */
    function interchainTransfer(
        string calldata destinationChain,
        bytes calldata recipient,
        uint256 amount,
        bytes calldata metadata
    ) external payable {
        address sender = msg.sender;

        _beforeInterchainTransfer(msg.sender, destinationChain, recipient, amount, metadata);

        ITransmitInterchainToken(interchainTokenService()).transmitInterchainTransfer{ value: msg.value }(
            interchainTokenId(),
            sender,
            destinationChain,
            recipient,
            amount,
            metadata
        );
    }

    /**
     * @notice Implementation of the interchainTransferFrom method
     * @dev We chose to either pass `metadata` as raw data on a remote contract call, or, if no data is passed, just do a transfer.
     * A different implementation could use metadata to specify a function to invoke, or for other purposes as well.
     * @param sender The sender of the tokens. They need to have approved `msg.sender` before this is called.
     * @param destinationChain The string representation of the destination chain.
     * @param recipient The bytes representation of the address of the recipient.
     * @param amount The amount of token to be transferred.
     * @param metadata Either empty, just to facilitate an interchain transfer, or the data to be passed to an interchain contract call and transfer.
     */
    function interchainTransferFrom(
        address sender,
        string calldata destinationChain,
        bytes calldata recipient,
        uint256 amount,
        bytes calldata metadata
    ) external payable {
        _spendAllowance(sender, msg.sender, amount);

        _beforeInterchainTransfer(sender, destinationChain, recipient, amount, metadata);

        ITransmitInterchainToken(interchainTokenService()).transmitInterchainTransfer{ value: msg.value }(
            interchainTokenId(),
            sender,
            destinationChain,
            recipient,
            amount,
            metadata
        );
    }

    /**
     * @notice A method to be overwritten that will be called before an interchain transfer. One can approve the tokenManager here if needed,
     * to allow users for a 1-call transfer in case of a lock-unlock token manager.
     * @param from The sender of the tokens. They need to have approved `msg.sender` before this is called.
     * @param destinationChain The string representation of the destination chain.
     * @param destinationAddress The bytes representation of the address of the recipient.
     * @param amount The amount of token to be transferred.
     * @param metadata Either empty, just to facilitate an interchain transfer, or the data to be passed to an interchain contract call and transfer.
     */
    function _beforeInterchainTransfer(
        address from,
        string calldata destinationChain,
        bytes calldata destinationAddress,
        uint256 amount,
        bytes calldata metadata
    ) internal virtual {}

    /**
     * @notice A method to be overwritten that will decrease the allowance of the `spender` from `sender` by `amount`.
     * @dev Needs to be overwritten. This provides flexibility for the choice of ERC20 implementation used. Must revert if allowance is not sufficient.
     */
    function _spendAllowance(address sender, address spender, uint256 amount) internal virtual;
}
/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    error InvalidAccount();

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

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

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

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

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

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

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

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}
/**
 * @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 guidelines: functions revert instead
 * of 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 IERC20 {
    mapping(address => uint256) public override balanceOf;

    mapping(address => mapping(address => uint256)) public override allowance;

    uint256 public override totalSupply;
    uint256 internal constant UINT256_MAX = type(uint256).max;

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

    /**
     * @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) external virtual override returns (bool) {
        _approve(msg.sender, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external virtual override returns (bool) {
        uint256 _allowance = allowance[sender][msg.sender];

        if (_allowance != UINT256_MAX) {
            _approve(sender, msg.sender, _allowance - amount);
        }

        _transfer(sender, recipient, 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) external virtual returns (bool) {
        _approve(msg.sender, spender, allowance[msg.sender][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) external virtual returns (bool) {
        _approve(msg.sender, spender, allowance[msg.sender][spender] - subtractedValue);
        return true;
    }

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

        balanceOf[sender] -= amount;
        balanceOf[recipient] += amount;
        emit Transfer(sender, recipient, amount);
    }

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

        totalSupply += amount;
        balanceOf[account] += amount;
        emit Transfer(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 {
        if (account == address(0)) revert InvalidAccount();

        balanceOf[account] -= amount;
        totalSupply -= amount;
        emit Transfer(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 {
        if (owner == address(0) || spender == address(0)) revert InvalidAccount();

        allowance[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }
}
/**
 * @title RolesConstants
 * @notice This contract contains enum values representing different contract roles.
 */
contract RolesConstants {
    enum Roles {
        MINTER,
        OPERATOR,
        FLOW_LIMITER
    }
}
/**
 * @title IRolesBase Interface
 * @notice IRolesBase is an interface that abstracts the implementation of a
 * contract with role control internal functions.
 */
interface IRolesBase {
    error MissingRole(address account, uint8 role);
    error MissingAllRoles(address account, uint256 accountRoles);
    error MissingAnyOfRoles(address account, uint256 accountRoles);

    error InvalidProposedRoles(address fromAccount, address toAccount, uint256 accountRoles);

    event RolesProposed(address indexed fromAccount, address indexed toAccount, uint256 accountRoles);
    event RolesAdded(address indexed account, uint256 accountRoles);
    event RolesRemoved(address indexed account, uint256 accountRoles);

    /**
     * @notice Checks if an account has a role.
     * @param account The address to check
     * @param role The role to check
     * @return True if the account has the role, false otherwise
     */
    function hasRole(address account, uint8 role) external view returns (bool);
}
/**
 * @title IMinter Interface
 * @notice An interface for a contract module which provides a basic access control mechanism, where
 * there is an account (a minter) that can be granted exclusive access to specific functions.
 */
interface IMinter is IRolesBase {
    /**
     * @notice Change the minter of the contract.
     * @dev Can only be called by the current minter.
     * @param minter_ The address of the new minter.
     */
    function transferMintership(address minter_) external;

    /**
     * @notice Proposed a change of the minter of the contract.
     * @dev Can only be called by the current minter.
     * @param minter_ The address of the new minter.
     */
    function proposeMintership(address minter_) external;

    /**
     * @notice Accept a change of the minter of the contract.
     * @dev Can only be called by the proposed minter.
     * @param fromMinter The previous minter.
     */
    function acceptMintership(address fromMinter) external;

    /**
     * @notice Query if an address is a minter
     * @param addr the address to query for
     * @return bool Boolean value representing whether or not the address is a minter.
     */
    function isMinter(address addr) external view returns (bool);
}

/**
 * @title Minter Contract
 * @notice A contract module which provides a basic access control mechanism, where
 * there is an account (a minter) that can be granted exclusive access to
 * specific functions.
 * @dev This module is used through inheritance.
 */


/**
 * @title RolesBase
 * @notice A contract module which provides a set if internal functions
 * for implementing role control features.
 */
contract RolesBase is IRolesBase {
    bytes32 internal constant ROLES_PREFIX = keccak256('roles');
    bytes32 internal constant PROPOSE_ROLES_PREFIX = keccak256('propose-roles');

    /**
     * @notice Modifier that throws an error if called by any account missing the role.
     */
    modifier onlyRole(uint8 role) {
        if (!_hasRole(_getRoles(msg.sender), role)) revert MissingRole(msg.sender, role);

        _;
    }

    /**
     * @notice Modifier that throws an error if called by an account without all the roles.
     */
    modifier withEveryRole(uint8[] memory roles) {
        uint256 accountRoles = _toAccountRoles(roles);
        if (!_hasAllTheRoles(_getRoles(msg.sender), accountRoles)) revert MissingAllRoles(msg.sender, accountRoles);

        _;
    }

    /**
     * @notice Modifier that throws an error if called by an account without any of the roles.
     */
    modifier withAnyRole(uint8[] memory roles) {
        uint256 accountRoles = _toAccountRoles(roles);
        if (!_hasAnyOfRoles(_getRoles(msg.sender), accountRoles)) revert MissingAnyOfRoles(msg.sender, accountRoles);

        _;
    }

    /**
     * @notice Checks if an account has a role.
     * @param account The address to check
     * @param role The role to check
     * @return True if the account has the role, false otherwise
     */
    function hasRole(address account, uint8 role) public view returns (bool) {
        return _hasRole(_getRoles(account), role);
    }

    /**
     * @notice Internal function to convert an array of roles to a uint256.
     * @param roles The roles to convert
     * @return accountRoles The roles in uint256 format
     */
    function _toAccountRoles(uint8[] memory roles) internal pure returns (uint256) {
        uint256 length = roles.length;
        uint256 accountRoles;

        for (uint256 i = 0; i < length; ++i) {
            accountRoles |= (1 << roles[i]);
        }

        return accountRoles;
    }

    /**
     * @notice Internal function to get the key of the roles mapping.
     * @param account The address to get the key for
     * @return key The key of the roles mapping
     */
    function _rolesKey(address account) internal view virtual returns (bytes32 key) {
        return keccak256(abi.encodePacked(ROLES_PREFIX, account));
    }

    /**
     * @notice Internal function to get the roles of an account.
     * @param account The address to get the roles for
     * @return accountRoles The roles of the account in uint256 format
     */
    function _getRoles(address account) internal view returns (uint256 accountRoles) {
        bytes32 key = _rolesKey(account);
        assembly {
            accountRoles := sload(key)
        }
    }

    /**
     * @notice Internal function to set the roles of an account.
     * @param account The address to set the roles for
     * @param accountRoles The roles to set
     */
    function _setRoles(address account, uint256 accountRoles) private {
        bytes32 key = _rolesKey(account);
        assembly {
            sstore(key, accountRoles)
        }
    }

    /**
     * @notice Internal function to get the key of the proposed roles mapping.
     * @param fromAccount The address of the current role
     * @param toAccount The address of the pending role
     * @return key The key of the proposed roles mapping
     */
    function _proposalKey(address fromAccount, address toAccount) internal view virtual returns (bytes32 key) {
        return keccak256(abi.encodePacked(PROPOSE_ROLES_PREFIX, fromAccount, toAccount));
    }

    /**
     * @notice Internal function to get the proposed roles of an account.
     * @param fromAccount The address of the current role
     * @param toAccount The address of the pending role
     * @return proposedRoles_ The proposed roles of the account in uint256 format
     */
    function _getProposedRoles(address fromAccount, address toAccount) internal view returns (uint256 proposedRoles_) {
        bytes32 key = _proposalKey(fromAccount, toAccount);
        assembly {
            proposedRoles_ := sload(key)
        }
    }

    /**
     * @notice Internal function to set the proposed roles of an account.
     * @param fromAccount The address of the current role
     * @param toAccount The address of the pending role
     * @param proposedRoles_ The proposed roles to set in uint256 format
     */
    function _setProposedRoles(
        address fromAccount,
        address toAccount,
        uint256 proposedRoles_
    ) private {
        bytes32 key = _proposalKey(fromAccount, toAccount);
        assembly {
            sstore(key, proposedRoles_)
        }
    }

    /**
     * @notice Internal function to add a role to an account.
     * @dev emits a RolesAdded event.
     * @param account The address to add the role to
     * @param role The role to add
     */
    function _addRole(address account, uint8 role) internal {
        _addAccountRoles(account, 1 << role);
    }

    /**
     * @notice Internal function to add roles to an account.
     * @dev emits a RolesAdded event.
     * @dev Called in the constructor to set the initial roles.
     * @param account The address to add roles to
     * @param roles The roles to add
     */
    function _addRoles(address account, uint8[] memory roles) internal {
        _addAccountRoles(account, _toAccountRoles(roles));
    }

    /**
     * @notice Internal function to add roles to an account.
     * @dev emits a RolesAdded event.
     * @dev Called in the constructor to set the initial roles.
     * @param account The address to add roles to
     * @param accountRoles The roles to add
     */
    function _addAccountRoles(address account, uint256 accountRoles) internal {
        uint256 newAccountRoles = _getRoles(account) | accountRoles;

        _setRoles(account, newAccountRoles);

        emit RolesAdded(account, accountRoles);
    }

    /**
     * @notice Internal function to remove a role from an account.
     * @dev emits a RolesRemoved event.
     * @param account The address to remove the role from
     * @param role The role to remove
     */
    function _removeRole(address account, uint8 role) internal {
        _removeAccountRoles(account, 1 << role);
    }

    /**
     * @notice Internal function to remove roles from an account.
     * @dev emits a RolesRemoved event.
     * @param account The address to remove roles from
     * @param roles The roles to remove
     */
    function _removeRoles(address account, uint8[] memory roles) internal {
        _removeAccountRoles(account, _toAccountRoles(roles));
    }

    /**
     * @notice Internal function to remove roles from an account.
     * @dev emits a RolesRemoved event.
     * @param account The address to remove roles from
     * @param accountRoles The roles to remove
     */
    function _removeAccountRoles(address account, uint256 accountRoles) internal {
        uint256 newAccountRoles = _getRoles(account) & ~accountRoles;

        _setRoles(account, newAccountRoles);

        emit RolesRemoved(account, accountRoles);
    }

    /**
     * @notice Internal function to check if an account has a role.
     * @param accountRoles The roles of the account in uint256 format
     * @param role The role to check
     * @return True if the account has the role, false otherwise
     */
    function _hasRole(uint256 accountRoles, uint8 role) internal pure returns (bool) {
        return accountRoles & (1 << role) != 0;
    }

    /**
     * @notice Internal function to check if an account has all the roles.
     * @param hasAccountRoles The roles of the account in uint256 format
     * @param mustHaveAccountRoles The roles the account must have
     * @return True if the account has all the roles, false otherwise
     */
    function _hasAllTheRoles(uint256 hasAccountRoles, uint256 mustHaveAccountRoles) internal pure returns (bool) {
        return (hasAccountRoles & mustHaveAccountRoles) == mustHaveAccountRoles;
    }

    /**
     * @notice Internal function to check if an account has any of the roles.
     * @param hasAccountRoles The roles of the account in uint256 format
     * @param mustHaveAnyAccountRoles The roles to check in uint256 format
     * @return True if the account has any of the roles, false otherwise
     */
    function _hasAnyOfRoles(uint256 hasAccountRoles, uint256 mustHaveAnyAccountRoles) internal pure returns (bool) {
        return (hasAccountRoles & mustHaveAnyAccountRoles) != 0;
    }

    /**
     * @notice Internal function to propose to transfer roles of message sender to a new account.
     * @dev Original account must have all the proposed roles.
     * @dev Emits a RolesProposed event.
     * @dev Roles are not transferred until the new role accepts the role transfer.
     * @param fromAccount The address of the current roles
     * @param toAccount The address to transfer roles to
     * @param role The role to transfer
     */
    function _proposeRole(
        address fromAccount,
        address toAccount,
        uint8 role
    ) internal {
        _proposeAccountRoles(fromAccount, toAccount, 1 << role);
    }

    /**
     * @notice Internal function to propose to transfer roles of message sender to a new account.
     * @dev Original account must have all the proposed roles.
     * @dev Emits a RolesProposed event.
     * @dev Roles are not transferred until the new role accepts the role transfer.
     * @param fromAccount The address of the current roles
     * @param toAccount The address to transfer roles to
     * @param roles The roles to transfer
     */
    function _proposeRoles(
        address fromAccount,
        address toAccount,
        uint8[] memory roles
    ) internal {
        _proposeAccountRoles(fromAccount, toAccount, _toAccountRoles(roles));
    }

    /**
     * @notice Internal function to propose to transfer roles of message sender to a new account.
     * @dev Original account must have all the proposed roles.
     * @dev Emits a RolesProposed event.
     * @dev Roles are not transferred until the new role accepts the role transfer.
     * @param fromAccount The address of the current roles
     * @param toAccount The address to transfer roles to
     * @param accountRoles The account roles to transfer
     */
    function _proposeAccountRoles(
        address fromAccount,
        address toAccount,
        uint256 accountRoles
    ) internal {
        if (!_hasAllTheRoles(_getRoles(fromAccount), accountRoles)) revert MissingAllRoles(fromAccount, accountRoles);

        _setProposedRoles(fromAccount, toAccount, accountRoles);

        emit RolesProposed(fromAccount, toAccount, accountRoles);
    }

    /**
     * @notice Internal function to accept roles transferred from another account.
     * @dev Pending account needs to pass all the proposed roles.
     * @dev Emits RolesRemoved and RolesAdded events.
     * @param fromAccount The address of the current role
     * @param role The role to accept
     */
    function _acceptRole(
        address fromAccount,
        address toAccount,
        uint8 role
    ) internal virtual {
        _acceptAccountRoles(fromAccount, toAccount, 1 << role);
    }

    /**
     * @notice Internal function to accept roles transferred from another account.
     * @dev Pending account needs to pass all the proposed roles.
     * @dev Emits RolesRemoved and RolesAdded events.
     * @param fromAccount The address of the current role
     * @param roles The roles to accept
     */
    function _acceptRoles(
        address fromAccount,
        address toAccount,
        uint8[] memory roles
    ) internal virtual {
        _acceptAccountRoles(fromAccount, toAccount, _toAccountRoles(roles));
    }

    /**
     * @notice Internal function to accept roles transferred from another account.
     * @dev Pending account needs to pass all the proposed roles.
     * @dev Emits RolesRemoved and RolesAdded events.
     * @param fromAccount The address of the current role
     * @param accountRoles The account roles to accept
     */
    function _acceptAccountRoles(
        address fromAccount,
        address toAccount,
        uint256 accountRoles
    ) internal virtual {
        if (_getProposedRoles(fromAccount, toAccount) != accountRoles) {
            revert InvalidProposedRoles(fromAccount, toAccount, accountRoles);
        }

        _setProposedRoles(fromAccount, toAccount, 0);
        _transferAccountRoles(fromAccount, toAccount, accountRoles);
    }

    /**
     * @notice Internal function to transfer roles from one account to another.
     * @dev Original account must have all the proposed roles.
     * @param fromAccount The address of the current role
     * @param toAccount The address to transfer role to
     * @param role The role to transfer
     */
    function _transferRole(
        address fromAccount,
        address toAccount,
        uint8 role
    ) internal {
        _transferAccountRoles(fromAccount, toAccount, 1 << role);
    }

    /**
     * @notice Internal function to transfer roles from one account to another.
     * @dev Original account must have all the proposed roles.
     * @param fromAccount The address of the current role
     * @param toAccount The address to transfer role to
     * @param roles The roles to transfer
     */
    function _transferRoles(
        address fromAccount,
        address toAccount,
        uint8[] memory roles
    ) internal {
        _transferAccountRoles(fromAccount, toAccount, _toAccountRoles(roles));
    }

    /**
     * @notice Internal function to transfer roles from one account to another.
     * @dev Original account must have all the proposed roles.
     * @param fromAccount The address of the current role
     * @param toAccount The address to transfer role to
     * @param accountRoles The account roles to transfer
     */
    function _transferAccountRoles(
        address fromAccount,
        address toAccount,
        uint256 accountRoles
    ) internal {
        if (!_hasAllTheRoles(_getRoles(fromAccount), accountRoles)) revert MissingAllRoles(fromAccount, accountRoles);

        _removeAccountRoles(fromAccount, accountRoles);
        _addAccountRoles(toAccount, accountRoles);
    }
}

contract Minter is IMinter, RolesBase, RolesConstants {
    /**
     * @notice Internal function that stores the new minter address in the correct storage slot.
     * @param minter_ The address of the new minter.
     */
    function _addMinter(address minter_) internal {
        _addRole(minter_, uint8(Roles.MINTER));
    }

    /**
     * @notice Changes the minter of the contract.
     * @dev Can only be called by the current minter.
     * @param minter_ The address of the new minter.
     */
    function transferMintership(address minter_) external onlyRole(uint8(Roles.MINTER)) {
        _transferRole(msg.sender, minter_, uint8(Roles.MINTER));
    }

    /**
     * @notice Proposes a change of the minter of the contract.
     * @dev Can only be called by the current minter.
     * @param minter_ The address of the new minter.
     */
    function proposeMintership(address minter_) external onlyRole(uint8(Roles.MINTER)) {
        _proposeRole(msg.sender, minter_, uint8(Roles.MINTER));
    }

    /**
     * @notice Accept a change of the minter of the contract.
     * @dev Can only be called by the proposed minter.
     * @param fromMinter The previous minter.
     */
    function acceptMintership(address fromMinter) external {
        _acceptRole(fromMinter, msg.sender, uint8(Roles.MINTER));
    }

    /**
     * @notice Query if an address is a minter
     * @param addr the address to query for
     * @return bool Boolean value representing whether or not the address is a minter.
     */
    function isMinter(address addr) external view returns (bool) {
        return hasRole(addr, uint8(Roles.MINTER));
    }
}

/**
 * @title IERC20MintableBurnable Interface
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20MintableBurnable {
    /**
     * @notice Function to mint new tokens.
     * @dev Can only be called by the minter address.
     * @param to The address that will receive the minted tokens.
     * @param amount The amount of tokens to mint.
     */
    function mint(address to, uint256 amount) external;

    /**
     * @notice Function to burn tokens.
     * @dev Can only be called by the minter address.
     * @param from The address that will have its tokens burnt.
     * @param amount The amount of tokens to burn.
     */
    function burn(address from, uint256 amount) external;
}

interface IDEXFactory {
    function createPair(address tokenA, address tokenB) external returns (address pair);
}

interface IDEXRouter {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);

    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}


contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    function owner() public view returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() external virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

/**
 * Utility library of inline functions on addresses
 */
library Address {
    /**
     * Returns whether the target address is a contract
     * @dev This function will return false if invoked during the constructor of a contract,
     * as the code is not actually created until after the constructor finishes.
     * @param account address of the account to check
     * @return whether the target address is a contract
     */
    function isContract(address account) internal view returns (bool) {
        uint256 size;
        // XXX Currently there is no better way to check if there is a contract in an address
        // than to check the size of the code at that address.
        // See https://ethereum.stackexchange.com/a/14016/36603
        // for more details about how this works.
        // TODO Check this again before the Serenity release, because all addresses will be
        // contracts then.
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }
}

library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        return c;
    }
}

contract Catboy is Ownable, InterchainTokenStandard, ERC20, Minter, IERC20MintableBurnable {
    using SafeMath for uint256;
    using Address for address;
    //events
    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);
    event SellFeesChanged(uint256 _marketingFee);
    event BuyFeesChanged(uint256 _marketingFee);
    event TransferFeeChanged(uint256 _transferFee);
    event SetFeeReceivers(address _marketingReceiver);
    event ChangedSwapBack(bool _enabled, uint256 _amount);
    event SetFeeExempt(address _addr, bool _value);
    event InitialDistributionFinished(bool _value);

    address public service;
    bytes32 public tokenId;
    bool internal tokenManagerRequiresApproval_ = true;
    address private WETH;

    string  constant public name = "Catboy";
    string constant public symbol = "CATBOY";
    uint8 constant public decimals = 18;
    uint256 constant public maxSupply = 200000000* 10 ** decimals;
    uint256 constant public initialSupply = 100000000* 10 ** decimals;
    address[] public _markerPairs;
    mapping (address => bool) public automatedMarketMakerPairs;

    //transfer fee
    uint256 private transferFee = 0;
    
    //totalFees
    uint256 private totalBuyFee = 3;
    uint256 private totalSellFee = 3;
    uint256 constant public maxFee = 5; 

    uint256 constant private feeDenominator  = 100;

    address private marketingFeeReceiver = 0x230265e5F1d1b43D3f56409E9D78b7eb4Cd4c1f1;

    IDEXRouter public router;
    address public pair;
    bool public swapEnabled = true;
    uint256 public swapThreshold = initialSupply * 1 / 5000;

    bool private inSwap;
    modifier swapping() { inSwap = true; _; inSwap = false; }
    mapping (address => bool) public isFeeExempt;


    constructor(address service_, bytes32 tokenId_) {
        _addMinter(msg.sender);
        service = service_;
        tokenId = tokenId_; 
        router = IDEXRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        WETH = router.WETH();
        pair = IDEXFactory(router.factory()).createPair(WETH, address(this));

        setAutomatedMarketMakerPair(pair, true);
        isFeeExempt[msg.sender] = true;
        allowance[address(this)][address(router)] = type(uint256).max;
        _mint(msg.sender, initialSupply );
    }

    function interchainTokenService() public view override returns (address) {
        return service;
    }

    function interchainTokenId() public view override returns (bytes32) {
        return tokenId;
    }

    function _beforeInterchainTransfer(
        address sender,
        string calldata /*destinationChain*/,
        bytes calldata /*destinationAddress*/,
        uint256 amount,
        bytes calldata /*metadata*/
    ) internal override {
        if (!tokenManagerRequiresApproval_) return;
        address serviceAddress = service;
        uint256 allowance_ = allowance[sender][serviceAddress];
        if (allowance_ != UINT256_MAX) {
            if (allowance_ > UINT256_MAX - amount) {
                allowance_ = UINT256_MAX - amount;
            }

            _approve(sender, serviceAddress, allowance_ + amount);
        }
    }

    function _spendAllowance(address sender, address spender, uint256 amount) internal override {
        uint256 _allowance = allowance[sender][spender];

        if (_allowance != UINT256_MAX) {
            _approve(sender, spender, _allowance - amount);
        }
    }

    function setTokenManagerRequiresApproval(bool requiresApproval) external onlyOwner {
        tokenManagerRequiresApproval_ = requiresApproval;
    }

    function mint(address account, uint256 amount) external onlyRole(uint8(Roles.MINTER)) {
        require(totalSupply + amount <= maxSupply, "Cant mint that much");
        _mint(account, amount);
    }

    function burn(address account, uint256 amount) external onlyRole(uint8(Roles.MINTER)) {
        _burn(account, amount);
    }

    function setTokenId(bytes32 tokenId_) external onlyOwner {
        tokenId = tokenId_;
    }

    function setServiceAddress(address _service) external onlyOwner {
        service = _service;
    }

    function _transfer(address sender, address recipient, uint256 amount) internal virtual override {
        if(inSwap){ _basicTransfer(sender, recipient, amount); 
        return;}

        if(shouldSwapBack()){ swapBack(); }

        uint256 amountReceived = amount; 

        if(automatedMarketMakerPairs[sender]) { //buy
            if(!isFeeExempt[recipient]) {
                amountReceived = takeBuyFee(sender, amount);
            }

        } else if(automatedMarketMakerPairs[recipient]) { //sell
            if(!isFeeExempt[sender]) {
                amountReceived = takeSellFee(sender, amount);
            }
        } else {	
            if (!isFeeExempt[sender]) {	
                amountReceived = takeTransferFee(sender, amount);	
            }
        }

        balanceOf[sender] = balanceOf[sender].sub(amount);
        balanceOf[recipient] = balanceOf[recipient].add(amountReceived);
        emit Transfer(sender, recipient, amountReceived);
    }

    function _basicTransfer(address sender, address recipient, uint256 amount) internal returns (bool) {
        balanceOf[sender] = balanceOf[sender].sub(amount, "Insufficient Balance");
        balanceOf[recipient] = balanceOf[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
        return true;
    }
    // Fees
    function takeBuyFee(address sender, uint256 amount) internal returns (uint256){

        uint256 feeAmount = amount.mul(totalBuyFee).div(feeDenominator);

        balanceOf[address(this)] = balanceOf[address(this)].add(feeAmount);
        emit Transfer(sender, address(this), feeAmount);

        return amount.sub(feeAmount);
    }

    function takeSellFee(address sender, uint256 amount) internal returns (uint256){
        uint256 feeAmount = amount.mul(totalSellFee).div(feeDenominator);

        balanceOf[address(this)] = balanceOf[address(this)].add(feeAmount);
        emit Transfer(sender, address(this), feeAmount);

        return amount.sub(feeAmount);
            
    }

    function takeTransferFee(address sender, uint256 amount) internal returns (uint256){
        uint256 feeAmount = amount.mul(transferFee).div(feeDenominator);
          
            
        if (feeAmount > 0) {
            balanceOf[address(this)] = balanceOf[address(this)].add(feeAmount);	
            emit Transfer(sender, address(this), feeAmount); 
        }
            	
        return amount.sub(feeAmount);	
    }    

    function shouldSwapBack() internal view returns (bool) {
        return
        !automatedMarketMakerPairs[msg.sender]
        && !inSwap
        && swapEnabled
        && balanceOf[address(this)] >= swapThreshold;
    }

    function swapBack() internal swapping {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = WETH;

        router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            balanceOf[address(this)],
            0,
            path,
            marketingFeeReceiver,
            block.timestamp
        );
    }

    // Admin Functions
    function setIsFeeExempt(address holder, bool exempt) external onlyOwner {
        isFeeExempt[holder] = exempt;

        emit SetFeeExempt(holder, exempt);
    }
    function setBuyFee(uint256 _marketingFee) external onlyOwner {
        totalBuyFee = _marketingFee;
        require(totalBuyFee <= maxFee, "Fees cannot be more than 5%");

        emit BuyFeesChanged(_marketingFee);
    }

    function setSellFee(uint256 _marketingFee) external onlyOwner {
        totalSellFee = _marketingFee;
        require(totalSellFee <= maxFee, "Fees cannot be more than 5%");

        emit SellFeesChanged(_marketingFee);
    }

    function setTransferFee(uint256 _transferFee) external onlyOwner {	
        require(_transferFee < maxFee, "Fees cannot be higher than 5%");	
        transferFee = _transferFee;	

	    emit TransferFeeChanged(_transferFee);	
    }


    function setFeeReceiver(address _marketingFeeReceiver) external onlyOwner {
        require( _marketingFeeReceiver != address(0), "Zero Address validation" );
        require(!_marketingFeeReceiver.isContract(), "Is a contract");
        marketingFeeReceiver = _marketingFeeReceiver;
    
        emit SetFeeReceivers(_marketingFeeReceiver);
    }

    function setSwapBackSettings(bool _enabled, uint256 _amount) external onlyOwner {
        require(_amount > 0, "Can't be 0");
        swapEnabled = _enabled;
        swapThreshold = _amount;

        emit ChangedSwapBack(_enabled, _amount);
    }

    function setAutomatedMarketMakerPair(address _pair, bool _value) public onlyOwner {
            require(automatedMarketMakerPairs[_pair] != _value, "Value already set");

            automatedMarketMakerPairs[_pair] = _value;

            if(_value){
                _markerPairs.push(_pair);
            }else{
                require(_markerPairs.length > 1, "Required 1 pair");
                for (uint256 i = 0; i < _markerPairs.length; i++) {
                    if (_markerPairs[i] == _pair) {
                        _markerPairs[i] = _markerPairs[_markerPairs.length - 1];
                        _markerPairs.pop();
                        break;
                    }
                }
            }

            emit SetAutomatedMarketMakerPair(_pair, _value);
        }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"service_","type":"address"},{"internalType":"bytes32","name":"tokenId_","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"InvalidAccount","type":"error"},{"inputs":[{"internalType":"address","name":"fromAccount","type":"address"},{"internalType":"address","name":"toAccount","type":"address"},{"internalType":"uint256","name":"accountRoles","type":"uint256"}],"name":"InvalidProposedRoles","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"accountRoles","type":"uint256"}],"name":"MissingAllRoles","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"accountRoles","type":"uint256"}],"name":"MissingAnyOfRoles","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint8","name":"role","type":"uint8"}],"name":"MissingRole","type":"error"},{"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":"uint256","name":"_marketingFee","type":"uint256"}],"name":"BuyFeesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"_enabled","type":"bool"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"ChangedSwapBack","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"_value","type":"bool"}],"name":"InitialDistributionFinished","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"accountRoles","type":"uint256"}],"name":"RolesAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"fromAccount","type":"address"},{"indexed":true,"internalType":"address","name":"toAccount","type":"address"},{"indexed":false,"internalType":"uint256","name":"accountRoles","type":"uint256"}],"name":"RolesProposed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"accountRoles","type":"uint256"}],"name":"RolesRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_marketingFee","type":"uint256"}],"name":"SellFeesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_addr","type":"address"},{"indexed":false,"internalType":"bool","name":"_value","type":"bool"}],"name":"SetFeeExempt","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_marketingReceiver","type":"address"}],"name":"SetFeeReceivers","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_transferFee","type":"uint256"}],"name":"TransferFeeChanged","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_markerPairs","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"fromMinter","type":"address"}],"name":"acceptMintership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","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":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","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"},{"internalType":"uint8","name":"role","type":"uint8"}],"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":[],"name":"initialSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"interchainTokenId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"interchainTokenService","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"destinationChain","type":"string"},{"internalType":"bytes","name":"recipient","type":"bytes"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"metadata","type":"bytes"}],"name":"interchainTransfer","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"string","name":"destinationChain","type":"string"},{"internalType":"bytes","name":"recipient","type":"bytes"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"metadata","type":"bytes"}],"name":"interchainTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isFeeExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"minter_","type":"address"}],"name":"proposeMintership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IDEXRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"service","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_pair","type":"address"},{"internalType":"bool","name":"_value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingFee","type":"uint256"}],"name":"setBuyFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_marketingFeeReceiver","type":"address"}],"name":"setFeeReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setIsFeeExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingFee","type":"uint256"}],"name":"setSellFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_service","type":"address"}],"name":"setServiceAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setSwapBackSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"tokenId_","type":"bytes32"}],"name":"setTokenId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"requiresApproval","type":"bool"}],"name":"setTokenManagerRequiresApproval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_transferFee","type":"uint256"}],"name":"setTransferFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"minter_","type":"address"}],"name":"transferMintership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526006805460ff191660011790555f6009556003600a818155600b91909155600c80546001600160a01b03191673230265e5f1d1b43d3f56409e9d78b7eb4cd4c1f1179055600e805460ff60a01b1916600160a01b1790556113889061006b90601290610893565b610079906305f5e1006108a8565b6100849060016108a8565b61008e91906108bf565b600f5534801561009c575f5ffd5b506040516131e23803806131e28339810160408190526100bb916108f9565b5f80546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506101043361032d565b600480546001600160a01b03199081166001600160a01b0385161782556005839055600d8054737a250d5630b4cf539739df2c5dacb4c659f2488d921682179055604080516315ab88c960e31b81529051919263ad5c46489282820192602092908290030181865afa15801561017c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101a09190610923565b60068054610100600160a81b0319166101006001600160a01b0393841602179055600d546040805163c45a015560e01b81529051919092169163c45a01559160048083019260209291908290030181865afa158015610201573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102259190610923565b6006546040516364e329cb60e11b81526001600160a01b036101009092048216600482015230602482015291169063c9c65396906044016020604051808303815f875af1158015610278573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061029c9190610923565b600e80546001600160a01b0319166001600160a01b039290921691821790556102c690600161033a565b335f818152601160209081526040808320805460ff1916600117905530835260028252808320600d546001600160a01b0316845290915290205f199055610326906103136012600a610893565b610321906305f5e1006108a8565b6105ed565b505061098a565b610337815f61069a565b50565b5f546001600160a01b031633146103985760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6001600160a01b0382165f9081526008602052604090205481151560ff9091161515036103fb5760405162461bcd60e51b815260206004820152601160248201527015985b1d5948185b1c9958591e481cd95d607a1b604482015260640161038f565b6001600160a01b0382165f908152600860205260409020805460ff1916821580159190911790915561047657600780546001810182555f919091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180546001600160a01b0319166001600160a01b0384161790556105b2565b6007546001106104ba5760405162461bcd60e51b815260206004820152600f60248201526e2932b8bab4b932b21018903830b4b960891b604482015260640161038f565b5f5b6007548110156105b057826001600160a01b0316600782815481106104e3576104e361093c565b5f918252602090912001546001600160a01b0316036105a8576007805461050c90600190610950565b8154811061051c5761051c61093c565b5f91825260209091200154600780546001600160a01b0390921691839081106105475761054761093c565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550600780548061058357610583610963565b5f8281526020902081015f1990810180546001600160a01b03191690550190556105b0565b6001016104bc565b505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab905f90a35050565b6001600160a01b03821661061457604051630da30f6560e31b815260040160405180910390fd5b8060035f8282546106259190610977565b90915550506001600160a01b0382165f9081526001602052604081208054839290610651908490610977565b90915550506040518181526001600160a01b038316905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6106aa82600160ff84161b6106ae565b5050565b5f816106b98461070e565b1790506106c68382610721565b826001600160a01b03167f34e73c57659d4b6809b53db4feee9b007b892e978114eda420d2991aba1501438360405161070191815260200190565b60405180910390a2505050565b5f8061071983610733565b549392505050565b5f61072b83610733565b919091555050565b5f7fde9bdca322e1a848f72215bc15cf2c87fe7749145789a9ee281a2a6290af26ab8260405160200161077d92919091825260601b6001600160601b031916602082015260340190565b604051602081830303815290604052805190602001209050919050565b634e487b7160e01b5f52601160045260245ffd5b6001815b60018411156107e9578085048111156107cd576107cd61079a565b60018416156107db57908102905b60019390931c9280026107b2565b935093915050565b5f826107ff5750600161088d565b8161080b57505f61088d565b8160018114610821576002811461082b57610847565b600191505061088d565b60ff84111561083c5761083c61079a565b50506001821b61088d565b5060208310610133831016604e8410600b841016171561086a575081810a61088d565b6108765f1984846107ae565b805f19048211156108895761088961079a565b0290505b92915050565b5f6108a160ff8416836107f1565b9392505050565b808202811582820484141761088d5761088d61079a565b5f826108d957634e487b7160e01b5f52601260045260245ffd5b500490565b80516001600160a01b03811681146108f4575f5ffd5b919050565b5f5f6040838503121561090a575f5ffd5b610913836108de565b9150602083015190509250929050565b5f60208284031215610933575f5ffd5b6108a1826108de565b634e487b7160e01b5f52603260045260245ffd5b8181038181111561088d5761088d61079a565b634e487b7160e01b5f52603160045260245ffd5b8082018082111561088d5761088d61079a565b61284b806109975f395ff3fe608060405260043610610280575f3560e01c80638f02bb5b11610155578063b62496f5116100be578063df20fd4911610078578063df20fd49146107bc578063e1d5584c146107db578063efdcd974146107fa578063f2fde38b14610819578063f6e3964014610838578063f887ea4014610857575f5ffd5b8063b62496f5146106f3578063bc0ba3c514610721578063cf86a95a14610734578063d598d4c914610753578063d5abeb0114610772578063dd62ed3e14610786575f5ffd5b8063a457c2d71161010f578063a457c2d714610645578063a60fee3714610664578063a8aa1b3114610677578063a9059cbb14610696578063aa271e1a146106b5578063b5ef694d146106d4575f5ffd5b80638f02bb5b1461057957806395a8c58d1461059857806395d89b41146105b75780639a7a23d6146105e85780639c176677146106075780639dc29fac14610626575f5ffd5b8063313ce567116101f7578063658d4b7f116101b1578063658d4b7f146104c05780636ddd1713146104df57806370a08231146104ff578063715018a61461052a5780638b4cee081461053e5780638da5cb5b1461055d575f5ffd5b8063313ce567146103fb578063378dc3dc1461042157806339509351146104355780633f4218e01461045457806340c10f191461048257806341fe9a25146104a1575f5ffd5b806309c6bed91161024857806309c6bed91461034e5780630cc835a31461037f578063129d81881461039e57806317d70f7c146103b257806318160ddd146103c757806323b872dd146103dc575f5ffd5b8063014250041461028457806301f59d16146102a55780630445b667146102cc57806306fdde03146102e1578063095ea7b31461031f575b5f5ffd5b34801561028f575f5ffd5b506102a361029e3660046121ef565b610876565b005b3480156102b0575f5ffd5b506102b9600581565b6040519081526020015b60405180910390f35b3480156102d7575f5ffd5b506102b9600f5481565b3480156102ec575f5ffd5b5061031260405180604001604052806006815260200165436174626f7960d01b81525081565b6040516102c39190612208565b34801561032a575f5ffd5b5061033e610339366004612253565b6108bb565b60405190151581526020016102c3565b348015610359575f5ffd5b506004546001600160a01b03165b6040516001600160a01b0390911681526020016102c3565b34801561038a575f5ffd5b506102a361039936600461227b565b6108d1565b3480156103a9575f5ffd5b506005546102b9565b3480156103bd575f5ffd5b506102b960055481565b3480156103d2575f5ffd5b506102b960035481565b3480156103e7575f5ffd5b5061033e6103f6366004612292565b610987565b348015610406575f5ffd5b5061040f601281565b60405160ff90911681526020016102c3565b34801561042c575f5ffd5b506102b96109dc565b348015610440575f5ffd5b5061033e61044f366004612253565b6109f9565b34801561045f575f5ffd5b5061033e61046e3660046122cc565b60116020525f908152604090205460ff1681565b34801561048d575f5ffd5b506102a361049c366004612253565b610a2f565b3480156104ac575f5ffd5b506102a36104bb36600461227b565b610aec565b3480156104cb575f5ffd5b506102a36104da3660046122e5565b610b1a565b3480156104ea575f5ffd5b50600e5461033e90600160a01b900460ff1681565b34801561050a575f5ffd5b506102b96105193660046122cc565b60016020525f908152604090205481565b348015610535575f5ffd5b506102a3610ba6565b348015610549575f5ffd5b506102a361055836600461227b565b610c17565b348015610568575f5ffd5b505f546001600160a01b0316610367565b348015610584575f5ffd5b506102a361059336600461227b565b610cc6565b3480156105a3575f5ffd5b5061033e6105b2366004612316565b610d74565b3480156105c2575f5ffd5b5061031260405180604001604052806006815260200165434154424f5960d01b81525081565b3480156105f3575f5ffd5b506102a36106023660046122e5565b610d95565b348015610612575f5ffd5b506102a36106213660046122cc565b611013565b348015610631575f5ffd5b506102a3610640366004612253565b611021565b348015610650575f5ffd5b5061033e61065f366004612253565b611060565b6102a3610672366004612395565b611096565b348015610682575f5ffd5b50600e54610367906001600160a01b031681565b3480156106a1575f5ffd5b5061033e6106b0366004612253565b611139565b3480156106c0575f5ffd5b5061033e6106cf3660046122cc565b611145565b3480156106df575f5ffd5b506102a36106ee3660046122cc565b611150565b3480156106fe575f5ffd5b5061033e61070d3660046122cc565b60086020525f908152604090205460ff1681565b6102a361072f36600461244d565b611194565b34801561073f575f5ffd5b506102a361074e3660046122cc565b6111f5565b34801561075e575f5ffd5b50600454610367906001600160a01b031681565b34801561077d575f5ffd5b506102b9611235565b348015610791575f5ffd5b506102b96107a03660046124f5565b600260209081525f928352604080842090915290825290205481565b3480156107c7575f5ffd5b506102a36107d636600461251d565b61124f565b3480156107e6575f5ffd5b506103676107f536600461227b565b61130c565b348015610805575f5ffd5b506102a36108143660046122cc565b611334565b348015610824575f5ffd5b506102a36108333660046122cc565b611449565b348015610843575f5ffd5b506102a36108523660046122cc565b611530565b348015610862575f5ffd5b50600d54610367906001600160a01b031681565b5f546001600160a01b031633146108a85760405162461bcd60e51b815260040161089f90612537565b60405180910390fd5b6006805460ff1916911515919091179055565b5f6108c733848461157b565b5060015b92915050565b5f546001600160a01b031633146108fa5760405162461bcd60e51b815260040161089f90612537565b600a81905560058111156109505760405162461bcd60e51b815260206004820152601b60248201527f466565732063616e6e6f74206265206d6f7265207468616e2035250000000000604482015260640161089f565b6040518181527f22496f1e43538f1e72fcdc74c7005cc33947acd216d721ac0361817fc0fb0fc5906020015b60405180910390a150565b6001600160a01b0383165f9081526002602090815260408083203384529091528120545f1981146109c6576109c685336109c18685612580565b61157b565b6109d1858585611617565b506001949350505050565b6109e86012600a612676565b6109f6906305f5e100612684565b81565b335f8181526002602090815260408083206001600160a01b038716845290915281205490916108c79185906109c190869061269b565b5f610a49610a3c336117ae565b600160ff84161b16151590565b610a715760405163bb6c163960e01b815233600482015260ff8216602482015260440161089f565b610a7d6012600a612676565b610a8b90630bebc200612684565b82600354610a99919061269b565b1115610add5760405162461bcd60e51b8152602060048201526013602482015272086c2dce840dad2dce840e8d0c2e840daeac6d606b1b604482015260640161089f565b610ae783836117c1565b505050565b5f546001600160a01b03163314610b155760405162461bcd60e51b815260040161089f90612537565b600555565b5f546001600160a01b03163314610b435760405162461bcd60e51b815260040161089f90612537565b6001600160a01b0382165f81815260116020908152604091829020805460ff19168515159081179091558251938452908301527f2f640a0ab7e2a6d9ec57f3932923908568f2984073dcebac1b9a3db32debe91d91015b60405180910390a15050565b5f546001600160a01b03163314610bcf5760405162461bcd60e51b815260040161089f90612537565b5f80546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a35f80546001600160a01b0319169055565b5f546001600160a01b03163314610c405760405162461bcd60e51b815260040161089f90612537565b600b8190556005811115610c965760405162461bcd60e51b815260206004820152601b60248201527f466565732063616e6e6f74206265206d6f7265207468616e2035250000000000604482015260640161089f565b6040518181527f6ea2659bf9e8a83fbcc990dfeef1304bff4c9217e77dc922e4135b8cb31f4ed59060200161097c565b5f546001600160a01b03163314610cef5760405162461bcd60e51b815260040161089f90612537565b60058110610d3f5760405162461bcd60e51b815260206004820152601d60248201527f466565732063616e6e6f7420626520686967686572207468616e203525000000604482015260640161089f565b60098190556040518181527f0496ed1e61eb69727f9659a8e859288db4758ffb1f744d1c1424634f90a257f49060200161097c565b5f610d8e610d81846117ae565b600160ff85161b16151590565b9392505050565b5f546001600160a01b03163314610dbe5760405162461bcd60e51b815260040161089f90612537565b6001600160a01b0382165f9081526008602052604090205481151560ff909116151503610e215760405162461bcd60e51b815260206004820152601160248201527015985b1d5948185b1c9958591e481cd95d607a1b604482015260640161089f565b6001600160a01b0382165f908152600860205260409020805460ff19168215801591909117909155610e9c57600780546001810182555f919091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180546001600160a01b0319166001600160a01b038416179055610fd8565b600754600110610ee05760405162461bcd60e51b815260206004820152600f60248201526e2932b8bab4b932b21018903830b4b960891b604482015260640161089f565b5f5b600754811015610fd657826001600160a01b031660078281548110610f0957610f096126ae565b5f918252602090912001546001600160a01b031603610fce5760078054610f3290600190612580565b81548110610f4257610f426126ae565b5f91825260209091200154600780546001600160a01b039092169183908110610f6d57610f6d6126ae565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506007805480610fa957610fa96126c2565b5f8281526020902081015f1990810180546001600160a01b0319169055019055610fd6565b600101610ee2565b505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab905f90a35050565b61101e81335f61185c565b50565b5f61102e610a3c336117ae565b6110565760405163bb6c163960e01b815233600482015260ff8216602482015260440161089f565b610ae7838361186d565b335f8181526002602090815260408083206001600160a01b038716845290915281205490916108c79185906109c1908690612580565b6110a1883385611902565b6110b1888888888888888861193e565b6004546001600160a01b03166001600160a01b03166370756cde346110d560055490565b8b8b8b8b8b8b8b8b6040518b63ffffffff1660e01b8152600401611101999897969594939291906126fe565b5f604051808303818588803b158015611118575f5ffd5b505af115801561112a573d5f5f3e3d5ffd5b50505050505050505050505050565b5f6108c7338484611617565b5f6108cb8282610d74565b5f61115d610a3c336117ae565b6111855760405163bb6c163960e01b815233600482015260ff8216602482015260440161089f565b61119033835f6119ba565b5050565b336111a5818989898989898961193e565b6004546001600160a01b03166001600160a01b03166370756cde346111c960055490565b848c8c8c8c8c8c8c6040518b63ffffffff1660e01b8152600401611101999897969594939291906126fe565b5f611202610a3c336117ae565b61122a5760405163bb6c163960e01b815233600482015260ff8216602482015260440161089f565b61119033835f6119cb565b6112416012600a612676565b6109f690630bebc200612684565b5f546001600160a01b031633146112785760405162461bcd60e51b815260040161089f90612537565b5f81116112b45760405162461bcd60e51b815260206004820152600a602482015269043616e277420626520360b41b604482015260640161089f565b600e805460ff60a01b1916600160a01b84151590810291909117909155600f82905560408051918252602082018390527fbb6a036f87bc4903f9d59c9f83a8733a8e8004a0a17b29bf1a817b4fe6bcf6bd9101610b9a565b6007818154811061131b575f80fd5b5f918252602090912001546001600160a01b0316905081565b5f546001600160a01b0316331461135d5760405162461bcd60e51b815260040161089f90612537565b6001600160a01b0381166113b35760405162461bcd60e51b815260206004820152601760248201527f5a65726f20416464726573732076616c69646174696f6e000000000000000000604482015260640161089f565b6001600160a01b0381163b156113fb5760405162461bcd60e51b815260206004820152600d60248201526c125cc8184818dbdb9d1c9858dd609a1b604482015260640161089f565b600c80546001600160a01b0319166001600160a01b0383169081179091556040519081527f3706f0349a7351b2a7320ec005e9ba21ba416302294690e59ab8e773c009bd599060200161097c565b5f546001600160a01b031633146114725760405162461bcd60e51b815260040161089f90612537565b6001600160a01b0381166114d75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161089f565b5f80546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35f80546001600160a01b0319166001600160a01b0392909216919091179055565b5f546001600160a01b031633146115595760405162461bcd60e51b815260040161089f90612537565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316158061159857506001600160a01b038216155b156115b657604051630da30f6560e31b815260040160405180910390fd5b6001600160a01b038381165f8181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60105460ff16156116335761162d8383836119dc565b50505050565b61163b611aac565b1561164857611648611b04565b6001600160a01b0383165f90815260086020526040902054819060ff161561169b576001600160a01b0383165f9081526011602052604090205460ff16611696576116938483611c15565b90505b611710565b6001600160a01b0383165f9081526008602052604090205460ff16156116e4576001600160a01b0384165f9081526011602052604090205460ff16611696576116938483611caa565b6001600160a01b0384165f9081526011602052604090205460ff166117105761170d8483611cc6565b90505b6001600160a01b0384165f908152600160205260409020546117329083611d09565b6001600160a01b038086165f9081526001602052604080822093909355908516815220546117609082611d4a565b6001600160a01b038085165f8181526001602052604090819020939093559151908616905f5160206127f65f395f51905f52906117a09085815260200190565b60405180910390a350505050565b5f5f6117b983611da8565b549392505050565b6001600160a01b0382166117e857604051630da30f6560e31b815260040160405180910390fd5b8060035f8282546117f9919061269b565b90915550506001600160a01b0382165f908152600160205260408120805483929061182590849061269b565b90915550506040518181526001600160a01b038316905f905f5160206127f65f395f51905f52906020015b60405180910390a35050565b610ae78383600160ff85161b611e14565b6001600160a01b03821661189457604051630da30f6560e31b815260040160405180910390fd5b6001600160a01b0382165f90815260016020526040812080548392906118bb908490612580565b925050819055508060035f8282546118d39190612580565b90915550506040518181525f906001600160a01b038416905f5160206127f65f395f51905f5290602001611850565b6001600160a01b038084165f908152600260209081526040808320938616835292905220545f19811461162d5761162d84846109c18585612580565b60065460ff16156119b0576004546001600160a01b038981165f9081526002602090815260408083209390941680835292905291909120545f1981146119ad57611989855f19612580565b81111561199e5761199b855f19612580565b90505b6119ad8a836109c1888561269b565b50505b5050505050505050565b610ae78383600160ff85161b611e6d565b610ae78383600160ff85161b611eff565b6040805180820182526014815273496e73756666696369656e742042616c616e636560601b6020808301919091526001600160a01b0386165f908152600190915291822054611a2c918490611f4e565b6001600160a01b038086165f908152600160205260408082209390935590851681522054611a5a9083611d4a565b6001600160a01b038085165f8181526001602052604090819020939093559151908616905f5160206127f65f395f51905f5290611a9a9086815260200190565b60405180910390a35060019392505050565b335f9081526008602052604081205460ff16158015611ace575060105460ff16155b8015611ae35750600e54600160a01b900460ff165b8015611aff5750600f54305f9081526001602052604090205410155b905090565b6010805460ff191660011790556040805160028082526060820183525f9260208301908036833701905050905030815f81518110611b4457611b446126ae565b6001600160a01b03928316602091820292909201015260065482516101009091049091169082906001908110611b7c57611b7c6126ae565b6001600160a01b03928316602091820292909201810191909152600d54305f9081526001909252604080832054600c54915163791ac94760e01b81529285169463791ac94794611bdb9492939092889291909116904290600401612766565b5f604051808303815f87803b158015611bf2575f5ffd5b505af1158015611c04573d5f5f3e3d5ffd5b50506010805460ff19169055505050565b5f5f611c376064611c31600a5486611f8690919063ffffffff16565b90612004565b305f90815260016020526040902054909150611c539082611d4a565b305f81815260016020526040908190209290925590516001600160a01b038616905f5160206127f65f395f51905f5290611c909085815260200190565b60405180910390a3611ca28382611d09565b949350505050565b5f5f611c376064611c31600b5486611f8690919063ffffffff16565b5f5f611ce26064611c3160095486611f8690919063ffffffff16565b90508015611d0357305f90815260016020526040902054611c539082611d4a565b611ca283825b5f610d8e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611f4e565b5f80611d56838561269b565b905083811015610d8e5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640161089f565b5f7fde9bdca322e1a848f72215bc15cf2c87fe7749145789a9ee281a2a6290af26ab82604051602001611df792919091825260601b6bffffffffffffffffffffffff1916602082015260340190565b604051602081830303815290604052805190602001209050919050565b80611e1f8484612045565b14611e575760405163018013f960e61b81526001600160a01b038085166004830152831660248201526044810182905260640161089f565b611e6283835f61205a565b610ae7838383611eff565b611e80611e79846117ae565b8216821490565b611eaf57604051631fe9beed60e21b81526001600160a01b03841660048201526024810182905260440161089f565b611eba83838361205a565b816001600160a01b0316836001600160a01b03167ff7158d1591c2cf17c0e6b9459d86365c47fe0969c79f40ef49e0c437d8f399148360405161160a91815260200190565b611f0b611e79846117ae565b611f3a57604051631fe9beed60e21b81526001600160a01b03841660048201526024810182905260440161089f565b611f44838261206e565b610ae782826120cf565b5f8184841115611f715760405162461bcd60e51b815260040161089f9190612208565b505f611f7d8486612580565b95945050505050565b5f825f03611f9557505f6108cb565b5f611fa08385612684565b905082611fad85836127d6565b14610d8e5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b606482015260840161089f565b5f610d8e83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612122565b5f5f612051848461214e565b54949350505050565b5f612065848461214e565b91909155505050565b5f811961207a846117ae565b16905061208783826121c9565b826001600160a01b03167fccf920c8facee98a9c2a6c6124f2857b87b17e9f3a819bfcc6945196ee77366b836040516120c291815260200190565b60405180910390a2505050565b5f816120da846117ae565b1790506120e783826121c9565b826001600160a01b03167f34e73c57659d4b6809b53db4feee9b007b892e978114eda420d2991aba150143836040516120c291815260200190565b5f81836121425760405162461bcd60e51b815260040161089f9190612208565b505f611f7d84866127d6565b5f7ff96e07b2f4fbb81c31567d2b261589af429e98f0958d53f7e6ad5d63aea0ab7c83836040516020016121ab93929190928352606091821b6bffffffffffffffffffffffff199081166020850152911b16603482015260480190565b60405160208183030381529060405280519060200120905092915050565b5f6121d383611da8565b919091555050565b803580151581146121ea575f5ffd5b919050565b5f602082840312156121ff575f5ffd5b610d8e826121db565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80356001600160a01b03811681146121ea575f5ffd5b5f5f60408385031215612264575f5ffd5b61226d8361223d565b946020939093013593505050565b5f6020828403121561228b575f5ffd5b5035919050565b5f5f5f606084860312156122a4575f5ffd5b6122ad8461223d565b92506122bb6020850161223d565b929592945050506040919091013590565b5f602082840312156122dc575f5ffd5b610d8e8261223d565b5f5f604083850312156122f6575f5ffd5b6122ff8361223d565b915061230d602084016121db565b90509250929050565b5f5f60408385031215612327575f5ffd5b6123308361223d565b9150602083013560ff81168114612345575f5ffd5b809150509250929050565b5f5f83601f840112612360575f5ffd5b50813567ffffffffffffffff811115612377575f5ffd5b60208301915083602082850101111561238e575f5ffd5b9250929050565b5f5f5f5f5f5f5f5f60a0898b0312156123ac575f5ffd5b6123b58961223d565b9750602089013567ffffffffffffffff8111156123d0575f5ffd5b6123dc8b828c01612350565b909850965050604089013567ffffffffffffffff8111156123fb575f5ffd5b6124078b828c01612350565b90965094505060608901359250608089013567ffffffffffffffff81111561242d575f5ffd5b6124398b828c01612350565b999c989b5096995094979396929594505050565b5f5f5f5f5f5f5f6080888a031215612463575f5ffd5b873567ffffffffffffffff811115612479575f5ffd5b6124858a828b01612350565b909850965050602088013567ffffffffffffffff8111156124a4575f5ffd5b6124b08a828b01612350565b90965094505060408801359250606088013567ffffffffffffffff8111156124d6575f5ffd5b6124e28a828b01612350565b989b979a50959850939692959293505050565b5f5f60408385031215612506575f5ffd5b61250f8361223d565b915061230d6020840161223d565b5f5f6040838503121561252e575f5ffd5b61226d836121db565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b818103818111156108cb576108cb61256c565b6001815b60018411156125ce578085048111156125b2576125b261256c565b60018416156125c057908102905b60019390931c928002612597565b935093915050565b5f826125e4575060016108cb565b816125f057505f6108cb565b816001811461260657600281146126105761262c565b60019150506108cb565b60ff8411156126215761262161256c565b50506001821b6108cb565b5060208310610133831016604e8410600b841016171561264f575081810a6108cb565b61265b5f198484612593565b805f190482111561266e5761266e61256c565b029392505050565b5f610d8e60ff8416836125d6565b80820281158282048414176108cb576108cb61256c565b808201808211156108cb576108cb61256c565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b8981526001600160a01b038916602082015260c0604082018190525f90612728908301898b6126d6565b828103606084015261273b81888a6126d6565b905085608084015282810360a08401526127568185876126d6565b9c9b505050505050505050505050565b5f60a0820187835286602084015260a0604084015280865180835260c0850191506020880192505f5b818110156127b65783516001600160a01b031683526020938401939092019160010161278f565b50506001600160a01b039590951660608401525050608001529392505050565b5f826127f057634e487b7160e01b5f52601260045260245ffd5b50049056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212207e076500e64ace7a10e6ff41a8ced4d0671e0b189414d26763f8acfef6c6592f64736f6c634300081c0033000000000000000000000000b5fb4be02232b1bba4dc8f81dc24c26980de9e3c74656d7000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405260043610610280575f3560e01c80638f02bb5b11610155578063b62496f5116100be578063df20fd4911610078578063df20fd49146107bc578063e1d5584c146107db578063efdcd974146107fa578063f2fde38b14610819578063f6e3964014610838578063f887ea4014610857575f5ffd5b8063b62496f5146106f3578063bc0ba3c514610721578063cf86a95a14610734578063d598d4c914610753578063d5abeb0114610772578063dd62ed3e14610786575f5ffd5b8063a457c2d71161010f578063a457c2d714610645578063a60fee3714610664578063a8aa1b3114610677578063a9059cbb14610696578063aa271e1a146106b5578063b5ef694d146106d4575f5ffd5b80638f02bb5b1461057957806395a8c58d1461059857806395d89b41146105b75780639a7a23d6146105e85780639c176677146106075780639dc29fac14610626575f5ffd5b8063313ce567116101f7578063658d4b7f116101b1578063658d4b7f146104c05780636ddd1713146104df57806370a08231146104ff578063715018a61461052a5780638b4cee081461053e5780638da5cb5b1461055d575f5ffd5b8063313ce567146103fb578063378dc3dc1461042157806339509351146104355780633f4218e01461045457806340c10f191461048257806341fe9a25146104a1575f5ffd5b806309c6bed91161024857806309c6bed91461034e5780630cc835a31461037f578063129d81881461039e57806317d70f7c146103b257806318160ddd146103c757806323b872dd146103dc575f5ffd5b8063014250041461028457806301f59d16146102a55780630445b667146102cc57806306fdde03146102e1578063095ea7b31461031f575b5f5ffd5b34801561028f575f5ffd5b506102a361029e3660046121ef565b610876565b005b3480156102b0575f5ffd5b506102b9600581565b6040519081526020015b60405180910390f35b3480156102d7575f5ffd5b506102b9600f5481565b3480156102ec575f5ffd5b5061031260405180604001604052806006815260200165436174626f7960d01b81525081565b6040516102c39190612208565b34801561032a575f5ffd5b5061033e610339366004612253565b6108bb565b60405190151581526020016102c3565b348015610359575f5ffd5b506004546001600160a01b03165b6040516001600160a01b0390911681526020016102c3565b34801561038a575f5ffd5b506102a361039936600461227b565b6108d1565b3480156103a9575f5ffd5b506005546102b9565b3480156103bd575f5ffd5b506102b960055481565b3480156103d2575f5ffd5b506102b960035481565b3480156103e7575f5ffd5b5061033e6103f6366004612292565b610987565b348015610406575f5ffd5b5061040f601281565b60405160ff90911681526020016102c3565b34801561042c575f5ffd5b506102b96109dc565b348015610440575f5ffd5b5061033e61044f366004612253565b6109f9565b34801561045f575f5ffd5b5061033e61046e3660046122cc565b60116020525f908152604090205460ff1681565b34801561048d575f5ffd5b506102a361049c366004612253565b610a2f565b3480156104ac575f5ffd5b506102a36104bb36600461227b565b610aec565b3480156104cb575f5ffd5b506102a36104da3660046122e5565b610b1a565b3480156104ea575f5ffd5b50600e5461033e90600160a01b900460ff1681565b34801561050a575f5ffd5b506102b96105193660046122cc565b60016020525f908152604090205481565b348015610535575f5ffd5b506102a3610ba6565b348015610549575f5ffd5b506102a361055836600461227b565b610c17565b348015610568575f5ffd5b505f546001600160a01b0316610367565b348015610584575f5ffd5b506102a361059336600461227b565b610cc6565b3480156105a3575f5ffd5b5061033e6105b2366004612316565b610d74565b3480156105c2575f5ffd5b5061031260405180604001604052806006815260200165434154424f5960d01b81525081565b3480156105f3575f5ffd5b506102a36106023660046122e5565b610d95565b348015610612575f5ffd5b506102a36106213660046122cc565b611013565b348015610631575f5ffd5b506102a3610640366004612253565b611021565b348015610650575f5ffd5b5061033e61065f366004612253565b611060565b6102a3610672366004612395565b611096565b348015610682575f5ffd5b50600e54610367906001600160a01b031681565b3480156106a1575f5ffd5b5061033e6106b0366004612253565b611139565b3480156106c0575f5ffd5b5061033e6106cf3660046122cc565b611145565b3480156106df575f5ffd5b506102a36106ee3660046122cc565b611150565b3480156106fe575f5ffd5b5061033e61070d3660046122cc565b60086020525f908152604090205460ff1681565b6102a361072f36600461244d565b611194565b34801561073f575f5ffd5b506102a361074e3660046122cc565b6111f5565b34801561075e575f5ffd5b50600454610367906001600160a01b031681565b34801561077d575f5ffd5b506102b9611235565b348015610791575f5ffd5b506102b96107a03660046124f5565b600260209081525f928352604080842090915290825290205481565b3480156107c7575f5ffd5b506102a36107d636600461251d565b61124f565b3480156107e6575f5ffd5b506103676107f536600461227b565b61130c565b348015610805575f5ffd5b506102a36108143660046122cc565b611334565b348015610824575f5ffd5b506102a36108333660046122cc565b611449565b348015610843575f5ffd5b506102a36108523660046122cc565b611530565b348015610862575f5ffd5b50600d54610367906001600160a01b031681565b5f546001600160a01b031633146108a85760405162461bcd60e51b815260040161089f90612537565b60405180910390fd5b6006805460ff1916911515919091179055565b5f6108c733848461157b565b5060015b92915050565b5f546001600160a01b031633146108fa5760405162461bcd60e51b815260040161089f90612537565b600a81905560058111156109505760405162461bcd60e51b815260206004820152601b60248201527f466565732063616e6e6f74206265206d6f7265207468616e2035250000000000604482015260640161089f565b6040518181527f22496f1e43538f1e72fcdc74c7005cc33947acd216d721ac0361817fc0fb0fc5906020015b60405180910390a150565b6001600160a01b0383165f9081526002602090815260408083203384529091528120545f1981146109c6576109c685336109c18685612580565b61157b565b6109d1858585611617565b506001949350505050565b6109e86012600a612676565b6109f6906305f5e100612684565b81565b335f8181526002602090815260408083206001600160a01b038716845290915281205490916108c79185906109c190869061269b565b5f610a49610a3c336117ae565b600160ff84161b16151590565b610a715760405163bb6c163960e01b815233600482015260ff8216602482015260440161089f565b610a7d6012600a612676565b610a8b90630bebc200612684565b82600354610a99919061269b565b1115610add5760405162461bcd60e51b8152602060048201526013602482015272086c2dce840dad2dce840e8d0c2e840daeac6d606b1b604482015260640161089f565b610ae783836117c1565b505050565b5f546001600160a01b03163314610b155760405162461bcd60e51b815260040161089f90612537565b600555565b5f546001600160a01b03163314610b435760405162461bcd60e51b815260040161089f90612537565b6001600160a01b0382165f81815260116020908152604091829020805460ff19168515159081179091558251938452908301527f2f640a0ab7e2a6d9ec57f3932923908568f2984073dcebac1b9a3db32debe91d91015b60405180910390a15050565b5f546001600160a01b03163314610bcf5760405162461bcd60e51b815260040161089f90612537565b5f80546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a35f80546001600160a01b0319169055565b5f546001600160a01b03163314610c405760405162461bcd60e51b815260040161089f90612537565b600b8190556005811115610c965760405162461bcd60e51b815260206004820152601b60248201527f466565732063616e6e6f74206265206d6f7265207468616e2035250000000000604482015260640161089f565b6040518181527f6ea2659bf9e8a83fbcc990dfeef1304bff4c9217e77dc922e4135b8cb31f4ed59060200161097c565b5f546001600160a01b03163314610cef5760405162461bcd60e51b815260040161089f90612537565b60058110610d3f5760405162461bcd60e51b815260206004820152601d60248201527f466565732063616e6e6f7420626520686967686572207468616e203525000000604482015260640161089f565b60098190556040518181527f0496ed1e61eb69727f9659a8e859288db4758ffb1f744d1c1424634f90a257f49060200161097c565b5f610d8e610d81846117ae565b600160ff85161b16151590565b9392505050565b5f546001600160a01b03163314610dbe5760405162461bcd60e51b815260040161089f90612537565b6001600160a01b0382165f9081526008602052604090205481151560ff909116151503610e215760405162461bcd60e51b815260206004820152601160248201527015985b1d5948185b1c9958591e481cd95d607a1b604482015260640161089f565b6001600160a01b0382165f908152600860205260409020805460ff19168215801591909117909155610e9c57600780546001810182555f919091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180546001600160a01b0319166001600160a01b038416179055610fd8565b600754600110610ee05760405162461bcd60e51b815260206004820152600f60248201526e2932b8bab4b932b21018903830b4b960891b604482015260640161089f565b5f5b600754811015610fd657826001600160a01b031660078281548110610f0957610f096126ae565b5f918252602090912001546001600160a01b031603610fce5760078054610f3290600190612580565b81548110610f4257610f426126ae565b5f91825260209091200154600780546001600160a01b039092169183908110610f6d57610f6d6126ae565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506007805480610fa957610fa96126c2565b5f8281526020902081015f1990810180546001600160a01b0319169055019055610fd6565b600101610ee2565b505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab905f90a35050565b61101e81335f61185c565b50565b5f61102e610a3c336117ae565b6110565760405163bb6c163960e01b815233600482015260ff8216602482015260440161089f565b610ae7838361186d565b335f8181526002602090815260408083206001600160a01b038716845290915281205490916108c79185906109c1908690612580565b6110a1883385611902565b6110b1888888888888888861193e565b6004546001600160a01b03166001600160a01b03166370756cde346110d560055490565b8b8b8b8b8b8b8b8b6040518b63ffffffff1660e01b8152600401611101999897969594939291906126fe565b5f604051808303818588803b158015611118575f5ffd5b505af115801561112a573d5f5f3e3d5ffd5b50505050505050505050505050565b5f6108c7338484611617565b5f6108cb8282610d74565b5f61115d610a3c336117ae565b6111855760405163bb6c163960e01b815233600482015260ff8216602482015260440161089f565b61119033835f6119ba565b5050565b336111a5818989898989898961193e565b6004546001600160a01b03166001600160a01b03166370756cde346111c960055490565b848c8c8c8c8c8c8c6040518b63ffffffff1660e01b8152600401611101999897969594939291906126fe565b5f611202610a3c336117ae565b61122a5760405163bb6c163960e01b815233600482015260ff8216602482015260440161089f565b61119033835f6119cb565b6112416012600a612676565b6109f690630bebc200612684565b5f546001600160a01b031633146112785760405162461bcd60e51b815260040161089f90612537565b5f81116112b45760405162461bcd60e51b815260206004820152600a602482015269043616e277420626520360b41b604482015260640161089f565b600e805460ff60a01b1916600160a01b84151590810291909117909155600f82905560408051918252602082018390527fbb6a036f87bc4903f9d59c9f83a8733a8e8004a0a17b29bf1a817b4fe6bcf6bd9101610b9a565b6007818154811061131b575f80fd5b5f918252602090912001546001600160a01b0316905081565b5f546001600160a01b0316331461135d5760405162461bcd60e51b815260040161089f90612537565b6001600160a01b0381166113b35760405162461bcd60e51b815260206004820152601760248201527f5a65726f20416464726573732076616c69646174696f6e000000000000000000604482015260640161089f565b6001600160a01b0381163b156113fb5760405162461bcd60e51b815260206004820152600d60248201526c125cc8184818dbdb9d1c9858dd609a1b604482015260640161089f565b600c80546001600160a01b0319166001600160a01b0383169081179091556040519081527f3706f0349a7351b2a7320ec005e9ba21ba416302294690e59ab8e773c009bd599060200161097c565b5f546001600160a01b031633146114725760405162461bcd60e51b815260040161089f90612537565b6001600160a01b0381166114d75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161089f565b5f80546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35f80546001600160a01b0319166001600160a01b0392909216919091179055565b5f546001600160a01b031633146115595760405162461bcd60e51b815260040161089f90612537565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316158061159857506001600160a01b038216155b156115b657604051630da30f6560e31b815260040160405180910390fd5b6001600160a01b038381165f8181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60105460ff16156116335761162d8383836119dc565b50505050565b61163b611aac565b1561164857611648611b04565b6001600160a01b0383165f90815260086020526040902054819060ff161561169b576001600160a01b0383165f9081526011602052604090205460ff16611696576116938483611c15565b90505b611710565b6001600160a01b0383165f9081526008602052604090205460ff16156116e4576001600160a01b0384165f9081526011602052604090205460ff16611696576116938483611caa565b6001600160a01b0384165f9081526011602052604090205460ff166117105761170d8483611cc6565b90505b6001600160a01b0384165f908152600160205260409020546117329083611d09565b6001600160a01b038086165f9081526001602052604080822093909355908516815220546117609082611d4a565b6001600160a01b038085165f8181526001602052604090819020939093559151908616905f5160206127f65f395f51905f52906117a09085815260200190565b60405180910390a350505050565b5f5f6117b983611da8565b549392505050565b6001600160a01b0382166117e857604051630da30f6560e31b815260040160405180910390fd5b8060035f8282546117f9919061269b565b90915550506001600160a01b0382165f908152600160205260408120805483929061182590849061269b565b90915550506040518181526001600160a01b038316905f905f5160206127f65f395f51905f52906020015b60405180910390a35050565b610ae78383600160ff85161b611e14565b6001600160a01b03821661189457604051630da30f6560e31b815260040160405180910390fd5b6001600160a01b0382165f90815260016020526040812080548392906118bb908490612580565b925050819055508060035f8282546118d39190612580565b90915550506040518181525f906001600160a01b038416905f5160206127f65f395f51905f5290602001611850565b6001600160a01b038084165f908152600260209081526040808320938616835292905220545f19811461162d5761162d84846109c18585612580565b60065460ff16156119b0576004546001600160a01b038981165f9081526002602090815260408083209390941680835292905291909120545f1981146119ad57611989855f19612580565b81111561199e5761199b855f19612580565b90505b6119ad8a836109c1888561269b565b50505b5050505050505050565b610ae78383600160ff85161b611e6d565b610ae78383600160ff85161b611eff565b6040805180820182526014815273496e73756666696369656e742042616c616e636560601b6020808301919091526001600160a01b0386165f908152600190915291822054611a2c918490611f4e565b6001600160a01b038086165f908152600160205260408082209390935590851681522054611a5a9083611d4a565b6001600160a01b038085165f8181526001602052604090819020939093559151908616905f5160206127f65f395f51905f5290611a9a9086815260200190565b60405180910390a35060019392505050565b335f9081526008602052604081205460ff16158015611ace575060105460ff16155b8015611ae35750600e54600160a01b900460ff165b8015611aff5750600f54305f9081526001602052604090205410155b905090565b6010805460ff191660011790556040805160028082526060820183525f9260208301908036833701905050905030815f81518110611b4457611b446126ae565b6001600160a01b03928316602091820292909201015260065482516101009091049091169082906001908110611b7c57611b7c6126ae565b6001600160a01b03928316602091820292909201810191909152600d54305f9081526001909252604080832054600c54915163791ac94760e01b81529285169463791ac94794611bdb9492939092889291909116904290600401612766565b5f604051808303815f87803b158015611bf2575f5ffd5b505af1158015611c04573d5f5f3e3d5ffd5b50506010805460ff19169055505050565b5f5f611c376064611c31600a5486611f8690919063ffffffff16565b90612004565b305f90815260016020526040902054909150611c539082611d4a565b305f81815260016020526040908190209290925590516001600160a01b038616905f5160206127f65f395f51905f5290611c909085815260200190565b60405180910390a3611ca28382611d09565b949350505050565b5f5f611c376064611c31600b5486611f8690919063ffffffff16565b5f5f611ce26064611c3160095486611f8690919063ffffffff16565b90508015611d0357305f90815260016020526040902054611c539082611d4a565b611ca283825b5f610d8e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611f4e565b5f80611d56838561269b565b905083811015610d8e5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640161089f565b5f7fde9bdca322e1a848f72215bc15cf2c87fe7749145789a9ee281a2a6290af26ab82604051602001611df792919091825260601b6bffffffffffffffffffffffff1916602082015260340190565b604051602081830303815290604052805190602001209050919050565b80611e1f8484612045565b14611e575760405163018013f960e61b81526001600160a01b038085166004830152831660248201526044810182905260640161089f565b611e6283835f61205a565b610ae7838383611eff565b611e80611e79846117ae565b8216821490565b611eaf57604051631fe9beed60e21b81526001600160a01b03841660048201526024810182905260440161089f565b611eba83838361205a565b816001600160a01b0316836001600160a01b03167ff7158d1591c2cf17c0e6b9459d86365c47fe0969c79f40ef49e0c437d8f399148360405161160a91815260200190565b611f0b611e79846117ae565b611f3a57604051631fe9beed60e21b81526001600160a01b03841660048201526024810182905260440161089f565b611f44838261206e565b610ae782826120cf565b5f8184841115611f715760405162461bcd60e51b815260040161089f9190612208565b505f611f7d8486612580565b95945050505050565b5f825f03611f9557505f6108cb565b5f611fa08385612684565b905082611fad85836127d6565b14610d8e5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b606482015260840161089f565b5f610d8e83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612122565b5f5f612051848461214e565b54949350505050565b5f612065848461214e565b91909155505050565b5f811961207a846117ae565b16905061208783826121c9565b826001600160a01b03167fccf920c8facee98a9c2a6c6124f2857b87b17e9f3a819bfcc6945196ee77366b836040516120c291815260200190565b60405180910390a2505050565b5f816120da846117ae565b1790506120e783826121c9565b826001600160a01b03167f34e73c57659d4b6809b53db4feee9b007b892e978114eda420d2991aba150143836040516120c291815260200190565b5f81836121425760405162461bcd60e51b815260040161089f9190612208565b505f611f7d84866127d6565b5f7ff96e07b2f4fbb81c31567d2b261589af429e98f0958d53f7e6ad5d63aea0ab7c83836040516020016121ab93929190928352606091821b6bffffffffffffffffffffffff199081166020850152911b16603482015260480190565b60405160208183030381529060405280519060200120905092915050565b5f6121d383611da8565b919091555050565b803580151581146121ea575f5ffd5b919050565b5f602082840312156121ff575f5ffd5b610d8e826121db565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80356001600160a01b03811681146121ea575f5ffd5b5f5f60408385031215612264575f5ffd5b61226d8361223d565b946020939093013593505050565b5f6020828403121561228b575f5ffd5b5035919050565b5f5f5f606084860312156122a4575f5ffd5b6122ad8461223d565b92506122bb6020850161223d565b929592945050506040919091013590565b5f602082840312156122dc575f5ffd5b610d8e8261223d565b5f5f604083850312156122f6575f5ffd5b6122ff8361223d565b915061230d602084016121db565b90509250929050565b5f5f60408385031215612327575f5ffd5b6123308361223d565b9150602083013560ff81168114612345575f5ffd5b809150509250929050565b5f5f83601f840112612360575f5ffd5b50813567ffffffffffffffff811115612377575f5ffd5b60208301915083602082850101111561238e575f5ffd5b9250929050565b5f5f5f5f5f5f5f5f60a0898b0312156123ac575f5ffd5b6123b58961223d565b9750602089013567ffffffffffffffff8111156123d0575f5ffd5b6123dc8b828c01612350565b909850965050604089013567ffffffffffffffff8111156123fb575f5ffd5b6124078b828c01612350565b90965094505060608901359250608089013567ffffffffffffffff81111561242d575f5ffd5b6124398b828c01612350565b999c989b5096995094979396929594505050565b5f5f5f5f5f5f5f6080888a031215612463575f5ffd5b873567ffffffffffffffff811115612479575f5ffd5b6124858a828b01612350565b909850965050602088013567ffffffffffffffff8111156124a4575f5ffd5b6124b08a828b01612350565b90965094505060408801359250606088013567ffffffffffffffff8111156124d6575f5ffd5b6124e28a828b01612350565b989b979a50959850939692959293505050565b5f5f60408385031215612506575f5ffd5b61250f8361223d565b915061230d6020840161223d565b5f5f6040838503121561252e575f5ffd5b61226d836121db565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b818103818111156108cb576108cb61256c565b6001815b60018411156125ce578085048111156125b2576125b261256c565b60018416156125c057908102905b60019390931c928002612597565b935093915050565b5f826125e4575060016108cb565b816125f057505f6108cb565b816001811461260657600281146126105761262c565b60019150506108cb565b60ff8411156126215761262161256c565b50506001821b6108cb565b5060208310610133831016604e8410600b841016171561264f575081810a6108cb565b61265b5f198484612593565b805f190482111561266e5761266e61256c565b029392505050565b5f610d8e60ff8416836125d6565b80820281158282048414176108cb576108cb61256c565b808201808211156108cb576108cb61256c565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b8981526001600160a01b038916602082015260c0604082018190525f90612728908301898b6126d6565b828103606084015261273b81888a6126d6565b905085608084015282810360a08401526127568185876126d6565b9c9b505050505050505050505050565b5f60a0820187835286602084015260a0604084015280865180835260c0850191506020880192505f5b818110156127b65783516001600160a01b031683526020938401939092019160010161278f565b50506001600160a01b039590951660608401525050608001529392505050565b5f826127f057634e487b7160e01b5f52601260045260245ffd5b50049056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212207e076500e64ace7a10e6ff41a8ced4d0671e0b189414d26763f8acfef6c6592f64736f6c634300081c0033

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

000000000000000000000000b5fb4be02232b1bba4dc8f81dc24c26980de9e3c74656d7000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : service_ (address): 0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C
Arg [1] : tokenId_ (bytes32): 0x74656d7000000000000000000000000000000000000000000000000000000000

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000b5fb4be02232b1bba4dc8f81dc24c26980de9e3c
Arg [1] : 74656d7000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

43301:9699:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46827:150;;;;;;;;;;-1:-1:-1;46827:150:0;;;;;:::i;:::-;;:::i;:::-;;44618:34;;;;;;;;;;;;44651:1;44618:34;;;;;510:25:1;;;498:2;483:18;44618:34:0;;;;;;;;44901:55;;;;;;;;;;;;;;;;44082:39;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;44082:39:0;;;;;;;;;;;;:::i;13214:169::-;;;;;;;;;;-1:-1:-1;13214:169:0;;;;;:::i;:::-;;:::i;:::-;;;1617:14:1;;1610:22;1592:41;;1580:2;1565:18;13214:169:0;1452:187:1;45658:106:0;;;;;;;;;;-1:-1:-1;45749:7:0;;-1:-1:-1;;;;;45749:7:0;45658:106;;;-1:-1:-1;;;;;1808:32:1;;;1790:51;;1778:2;1763:18;45658:106:0;1644:203:1;50858:226:0;;;;;;;;;;-1:-1:-1;50858:226:0;;;;;:::i;:::-;;:::i;45772:101::-;;;;;;;;;;-1:-1:-1;45858:7:0;;45772:101;;43967:22;;;;;;;;;;;;;;;;12406:35;;;;;;;;;;;;;;;;13865:375;;;;;;;;;;-1:-1:-1;13865:375:0;;;;;:::i;:::-;;:::i;44175:35::-;;;;;;;;;;;;44208:2;44175:35;;;;;2816:4:1;2804:17;;;2786:36;;2774:2;2759:18;44175:35:0;2644:184:1;44285:65:0;;;;;;;;;;;;;:::i;14649:211::-;;;;;;;;;;-1:-1:-1;14649:211:0;;;;;:::i;:::-;;:::i;45054:44::-;;;;;;;;;;-1:-1:-1;45054:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;46985:203;;;;;;;;;;-1:-1:-1;46985:203:0;;;;;:::i;:::-;;:::i;47331:94::-;;;;;;;;;;-1:-1:-1;47331:94:0;;;;;:::i;:::-;;:::i;50687:165::-;;;;;;;;;;-1:-1:-1;50687:165:0;;;;;:::i;:::-;;:::i;44864:30::-;;;;;;;;;;-1:-1:-1;44864:30:0;;;;-1:-1:-1;;;44864:30:0;;;;;;12262:53;;;;;;;;;;-1:-1:-1;12262:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;40668:150;;;;;;;;;;;;;:::i;51092:230::-;;;;;;;;;;-1:-1:-1;51092:230:0;;;;;:::i;:::-;;:::i;40454:79::-;;;;;;;;;;-1:-1:-1;40492:7:0;40519:6;-1:-1:-1;;;;;40519:6:0;40454:79;;51330:235;;;;;;;;;;-1:-1:-1;51330:235:0;;;;;:::i;:::-;;:::i;22591:133::-;;;;;;;;;;-1:-1:-1;22591:133:0;;;;;:::i;:::-;;:::i;44128:40::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;44128:40:0;;;;;52196:801;;;;;;;;;;-1:-1:-1;52196:801:0;;;;;:::i;:::-;;:::i;37066:130::-;;;;;;;;;;-1:-1:-1;37066:130:0;;;;;:::i;:::-;;:::i;47196:127::-;;;;;;;;;;-1:-1:-1;47196:127:0;;;;;:::i;:::-;;:::i;15363:221::-;;;;;;;;;;-1:-1:-1;15363:221:0;;;;;:::i;:::-;;:::i;6243:648::-;;;;;;:::i;:::-;;:::i;44838:19::-;;;;;;;;;;-1:-1:-1;44838:19:0;;;;-1:-1:-1;;;;;44838:19:0;;;12719:175;;;;;;;;;;-1:-1:-1;12719:175:0;;;;;:::i;:::-;;:::i;37403:121::-;;;;;;;;;;-1:-1:-1;37403:121:0;;;;;:::i;:::-;;:::i;36718:156::-;;;;;;;;;;-1:-1:-1;36718:156:0;;;;;:::i;:::-;;:::i;44393:58::-;;;;;;;;;;-1:-1:-1;44393:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;4801:607;;;;;;:::i;:::-;;:::i;36360:158::-;;;;;;;;;;-1:-1:-1;36360:158:0;;;;;:::i;:::-;;:::i;43938:22::-;;;;;;;;;;-1:-1:-1;43938:22:0;;;;-1:-1:-1;;;;;43938:22:0;;;44217:61;;;;;;;;;;;;;:::i;12324:73::-;;;;;;;;;;-1:-1:-1;12324:73:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;51936:252;;;;;;;;;;-1:-1:-1;51936:252:0;;;;;:::i;:::-;;:::i;44357:29::-;;;;;;;;;;-1:-1:-1;44357:29:0;;;;;:::i;:::-;;:::i;51575:353::-;;;;;;;;;;-1:-1:-1;51575:353:0;;;;;:::i;:::-;;:::i;40826:244::-;;;;;;;;;;-1:-1:-1;40826:244:0;;;;;:::i;:::-;;:::i;47433:101::-;;;;;;;;;;-1:-1:-1;47433:101:0;;;;;:::i;:::-;;:::i;44807:24::-;;;;;;;;;;-1:-1:-1;44807:24:0;;;;-1:-1:-1;;;;;44807:24:0;;;46827:150;40581:6;;-1:-1:-1;;;;;40581:6:0;39864:10;40581:22;40573:67;;;;-1:-1:-1;;;40573:67:0;;;;;;;:::i;:::-;;;;;;;;;46921:29:::1;:48:::0;;-1:-1:-1;;46921:48:0::1;::::0;::::1;;::::0;;;::::1;::::0;;46827:150::o;13214:169::-;13299:4;13316:37;13325:10;13337:7;13346:6;13316:8;:37::i;:::-;-1:-1:-1;13371:4:0;13214:169;;;;;:::o;50858:226::-;40581:6;;-1:-1:-1;;;;;40581:6:0;39864:10;40581:22;40573:67;;;;-1:-1:-1;;;40573:67:0;;;;;;;:::i;:::-;50930:11:::1;:27:::0;;;44651:1:::1;50976:21:::0;::::1;;50968:61;;;::::0;-1:-1:-1;;;50968:61:0;;7876:2:1;50968:61:0::1;::::0;::::1;7858:21:1::0;7915:2;7895:18;;;7888:30;7954:29;7934:18;;;7927:57;8001:18;;50968:61:0::1;7674:351:1::0;50968:61:0::1;51047:29;::::0;510:25:1;;;51047:29:0::1;::::0;498:2:1;483:18;51047:29:0::1;;;;;;;;50858:226:::0;:::o;13865:375::-;-1:-1:-1;;;;;14011:17:0;;13973:4;14011:17;;;:9;:17;;;;;;;;14029:10;14011:29;;;;;;;;-1:-1:-1;;14057:25:0;;14053:107;;14099:49;14108:6;14116:10;14128:19;14141:6;14128:10;:19;:::i;:::-;14099:8;:49::i;:::-;14172:36;14182:6;14190:9;14201:6;14172:9;:36::i;:::-;-1:-1:-1;14228:4:0;;13865:375;-1:-1:-1;;;;13865:375:0:o;44285:65::-;44336:14;44208:2;44336;:14;:::i;:::-;44325:25;;:9;:25;:::i;:::-;44285:65;:::o;14649:211::-;14765:10;14739:4;14786:21;;;:9;:21;;;;;;;;-1:-1:-1;;;;;14786:30:0;;;;;;;;;;14739:4;;14756:74;;14777:7;;14786:43;;14819:10;;14786:43;:::i;46985:203::-;47056:12;21549:37;21558:21;21568:10;21558:9;:21::i;:::-;28874:1;:9;;;;28858:26;:31;;;28759:138;21549:37;21544:80;;21595:29;;-1:-1:-1;;;21595:29:0;;21607:10;21595:29;;;10332:51:1;10431:4;10419:17;;10399:18;;;10392:45;10305:18;;21595:29:0;10162:281:1;21544:80:0;44264:14:::1;44208:2;44264;:14;:::i;:::-;44253:25;::::0;:9:::1;:25;:::i;:::-;47104:6;47090:11;;:20;;;;:::i;:::-;:33;;47082:65;;;::::0;-1:-1:-1;;;47082:65:0;;10650:2:1;47082:65:0::1;::::0;::::1;10632:21:1::0;10689:2;10669:18;;;10662:30;-1:-1:-1;;;10708:18:1;;;10701:49;10767:18;;47082:65:0::1;10448:343:1::0;47082:65:0::1;47158:22;47164:7;47173:6;47158:5;:22::i;:::-;46985:203:::0;;;:::o;47331:94::-;40581:6;;-1:-1:-1;;;;;40581:6:0;39864:10;40581:22;40573:67;;;;-1:-1:-1;;;40573:67:0;;;;;;;:::i;:::-;47399:7:::1;:18:::0;47331:94::o;50687:165::-;40581:6;;-1:-1:-1;;;;;40581:6:0;39864:10;40581:22;40573:67;;;;-1:-1:-1;;;40573:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;50770:19:0;::::1;;::::0;;;:11:::1;:19;::::0;;;;;;;;:28;;-1:-1:-1;;50770:28:0::1;::::0;::::1;;::::0;;::::1;::::0;;;50816;;10964:51:1;;;11031:18;;;11024:50;50816:28:0::1;::::0;10937:18:1;50816:28:0::1;;;;;;;;50687:165:::0;;:::o;40668:150::-;40581:6;;-1:-1:-1;;;;;40581:6:0;39864:10;40581:22;40573:67;;;;-1:-1:-1;;;40573:67:0;;;;;;;:::i;:::-;40777:1:::1;40761:6:::0;;40740:40:::1;::::0;-1:-1:-1;;;;;40761:6:0;;::::1;::::0;40740:40:::1;::::0;40777:1;;40740:40:::1;40808:1;40791:19:::0;;-1:-1:-1;;;;;;40791:19:0::1;::::0;;40668:150::o;51092:230::-;40581:6;;-1:-1:-1;;;;;40581:6:0;39864:10;40581:22;40573:67;;;;-1:-1:-1;;;40573:67:0;;;;;;;:::i;:::-;51165:12:::1;:28:::0;;;44651:1:::1;51212:22:::0;::::1;;51204:62;;;::::0;-1:-1:-1;;;51204:62:0;;7876:2:1;51204:62:0::1;::::0;::::1;7858:21:1::0;7915:2;7895:18;;;7888:30;7954:29;7934:18;;;7927:57;8001:18;;51204:62:0::1;7674:351:1::0;51204:62:0::1;51284:30;::::0;510:25:1;;;51284:30:0::1;::::0;498:2:1;483:18;51284:30:0::1;364:177:1::0;51330:235:0;40581:6;;-1:-1:-1;;;;;40581:6:0;39864:10;40581:22;40573:67;;;;-1:-1:-1;;;40573:67:0;;;;;;;:::i;:::-;44651:1:::1;51415:12;:21;51407:63;;;::::0;-1:-1:-1;;;51407:63:0;;11287:2:1;51407:63:0::1;::::0;::::1;11269:21:1::0;11326:2;11306:18;;;11299:30;11365:31;11345:18;;;11338:59;11414:18;;51407:63:0::1;11085:353:1::0;51407:63:0::1;51482:11;:26:::0;;;51524:32:::1;::::0;510:25:1;;;51524:32:0::1;::::0;498:2:1;483:18;51524:32:0::1;364:177:1::0;22591:133:0;22658:4;22682:34;22691:18;22701:7;22691:9;:18::i;:::-;28874:1;:9;;;;28858:26;:31;;;28759:138;22682:34;22675:41;22591:133;-1:-1:-1;;;22591:133:0:o;52196:801::-;40581:6;;-1:-1:-1;;;;;40581:6:0;39864:10;40581:22;40573:67;;;;-1:-1:-1;;;40573:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;52301:32:0;::::1;;::::0;;;:25:::1;:32;::::0;;;;;:42;::::1;;:32;::::0;;::::1;:42;;::::0;52293:72:::1;;;::::0;-1:-1:-1;;;52293:72:0;;11645:2:1;52293:72:0::1;::::0;::::1;11627:21:1::0;11684:2;11664:18;;;11657:30;-1:-1:-1;;;11703:18:1;;;11696:47;11760:18;;52293:72:0::1;11443:341:1::0;52293:72:0::1;-1:-1:-1::0;;;;;52382:32:0;::::1;;::::0;;;:25:::1;:32;::::0;;;;:41;;-1:-1:-1;;52382:41:0::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;;;52440:482:::1;;52469:12;:24:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;52469:24:0;;;;;::::1;::::0;;-1:-1:-1;;;;;;52469:24:0::1;-1:-1:-1::0;;;;;52469:24:0;::::1;;::::0;;52440:482:::1;;;52540:12;:19:::0;52562:1:::1;-1:-1:-1::0;52532:51:0::1;;;::::0;-1:-1:-1;;;52532:51:0;;11991:2:1;52532:51:0::1;::::0;::::1;11973:21:1::0;12030:2;12010:18;;;12003:30;-1:-1:-1;;;12049:18:1;;;12042:45;12104:18;;52532:51:0::1;11789:339:1::0;52532:51:0::1;52607:9;52602:305;52626:12;:19:::0;52622:23;::::1;52602:305;;;52698:5;-1:-1:-1::0;;;;;52679:24:0::1;:12;52692:1;52679:15;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;52679:15:0::1;:24:::0;52675:213:::1;;52750:12;52763:19:::0;;:23:::1;::::0;52785:1:::1;::::0;52763:23:::1;:::i;:::-;52750:37;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;52732:12:::1;:15:::0;;-1:-1:-1;;;;;52750:37:0;;::::1;::::0;52745:1;;52732:15;::::1;;;;;:::i;:::-;;;;;;;;;:55;;;;;-1:-1:-1::0;;;;;52732:55:0::1;;;;;-1:-1:-1::0;;;;;52732:55:0::1;;;;;;52814:12;:18;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;52814:18:0;;;;;-1:-1:-1;;;;;;52814:18:0::1;::::0;;;;;52859:5:::1;;52675:213;52647:3;;52602:305;;;;52440:482;52943:42;::::0;;::::1;;::::0;-1:-1:-1;;;;;52943:42:0;::::1;::::0;::::1;::::0;;;::::1;52196:801:::0;;:::o;37066:130::-;37132:56;37144:10;37156;37174:12;37132:11;:56::i;:::-;37066:130;:::o;47196:127::-;47267:12;21549:37;21558:21;21568:10;21558:9;:21::i;21549:37::-;21544:80;;21595:29;;-1:-1:-1;;;21595:29:0;;21607:10;21595:29;;;10332:51:1;10431:4;10419:17;;10399:18;;;10392:45;10305:18;;21595:29:0;10162:281:1;21544:80:0;47293:22:::1;47299:7;47308:6;47293:5;:22::i;15363:221::-:0;15484:10;15458:4;15505:21;;;:9;:21;;;;;;;;-1:-1:-1;;;;;15505:30:0;;;;;;;;;;15458:4;;15475:79;;15496:7;;15505:48;;15538:15;;15505:48;:::i;6243:648::-;6472:43;6488:6;6496:10;6508:6;6472:15;:43::i;:::-;6528:80;6554:6;6562:16;;6580:9;;6591:6;6599:8;;6528:25;:80::i;:::-;45749:7;;-1:-1:-1;;;;;45749:7:0;-1:-1:-1;;;;;6621:77:0;;6707:9;6733:19;45858:7;;;45772:101;6733:19;6767:6;6788:16;;6819:9;;6843:6;6864:8;;6621:262;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6243:648;;;;;;;;:::o;12719:175::-;12807:4;12824:40;12834:10;12846:9;12857:6;12824:9;:40::i;37403:121::-;37458:4;37482:34;37490:4;37458;22591:133;:::i;36718:156::-;36786:12;21549:37;21558:21;21568:10;21558:9;:21::i;21549:37::-;21544:80;;21595:29;;-1:-1:-1;;;21595:29:0;;21607:10;21595:29;;;10332:51:1;10431:4;10419:17;;10399:18;;;10392:45;10305:18;;21595:29:0;10162:281:1;21544:80:0;36812:54:::1;36825:10;36837:7:::0;36852:12:::1;36812;:54::i;:::-;36718:156:::0;;:::o;4801:607::-;5018:10;5041:84;5018:10;5079:16;;5097:9;;5108:6;5116:8;;5041:25;:84::i;:::-;45749:7;;-1:-1:-1;;;;;45749:7:0;-1:-1:-1;;;;;5138:77:0;;5224:9;5250:19;45858:7;;;45772:101;5250:19;5284:6;5305:16;;5336:9;;5360:6;5381:8;;5138:262;;;;;;;;;;;;;;;;;;;;;;;:::i;36360:158::-;36429:12;21549:37;21558:21;21568:10;21558:9;:21::i;21549:37::-;21544:80;;21595:29;;-1:-1:-1;;;21595:29:0;;21607:10;21595:29;;;10332:51:1;10431:4;10419:17;;10399:18;;;10392:45;10305:18;;21595:29:0;10162:281:1;21544:80:0;36455:55:::1;36469:10;36481:7:::0;36496:12:::1;36455:13;:55::i;44217:61::-:0;44264:14;44208:2;44264;:14;:::i;:::-;44253:25;;:9;:25;:::i;51936:252::-;40581:6;;-1:-1:-1;;;;;40581:6:0;39864:10;40581:22;40573:67;;;;-1:-1:-1;;;40573:67:0;;;;;;;:::i;:::-;52045:1:::1;52035:7;:11;52027:34;;;::::0;-1:-1:-1;;;52027:34:0;;13742:2:1;52027:34:0::1;::::0;::::1;13724:21:1::0;13781:2;13761:18;;;13754:30;-1:-1:-1;;;13800:18:1;;;13793:40;13850:18;;52027:34:0::1;13540:334:1::0;52027:34:0::1;52072:11;:22:::0;;-1:-1:-1;;;;52072:22:0::1;-1:-1:-1::0;;;52072:22:0;::::1;;::::0;;::::1;::::0;;;::::1;::::0;;;52105:13:::1;:23:::0;;;52146:34:::1;::::0;;14047:41:1;;;14119:2;14104:18;;14097:34;;;52146::0::1;::::0;14020:18:1;52146:34:0::1;13879:258:1::0;44357:29:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44357:29:0;;-1:-1:-1;44357:29:0;:::o;51575:353::-;40581:6;;-1:-1:-1;;;;;40581:6:0;39864:10;40581:22;40573:67;;;;-1:-1:-1;;;40573:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;51669:35:0;::::1;51660:73;;;::::0;-1:-1:-1;;;51660:73:0;;14344:2:1;51660:73:0::1;::::0;::::1;14326:21:1::0;14383:2;14363:18;;;14356:30;14422:25;14402:18;;;14395:53;14465:18;;51660:73:0::1;14142:347:1::0;51660:73:0::1;-1:-1:-1::0;;;;;51753:32:0;::::1;42098:20:::0;42137:8;51744:61:::1;;;::::0;-1:-1:-1;;;51744:61:0;;14696:2:1;51744:61:0::1;::::0;::::1;14678:21:1::0;14735:2;14715:18;;;14708:30;-1:-1:-1;;;14754:18:1;;;14747:43;14807:18;;51744:61:0::1;14494:337:1::0;51744:61:0::1;51816:20;:44:::0;;-1:-1:-1;;;;;;51816:44:0::1;-1:-1:-1::0;;;;;51816:44:0;::::1;::::0;;::::1;::::0;;;51882:38:::1;::::0;1790:51:1;;;51882:38:0::1;::::0;1778:2:1;1763:18;51882:38:0::1;1644:203:1::0;40826:244:0;40581:6;;-1:-1:-1;;;;;40581:6:0;39864:10;40581:22;40573:67;;;;-1:-1:-1;;;40573:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;40915:22:0;::::1;40907:73;;;::::0;-1:-1:-1;;;40907:73:0;;15038:2:1;40907:73:0::1;::::0;::::1;15020:21:1::0;15077:2;15057:18;;;15050:30;15116:34;15096:18;;;15089:62;-1:-1:-1;;;15167:18:1;;;15160:36;15213:19;;40907:73:0::1;14836:402:1::0;40907:73:0::1;41017:6;::::0;;40996:38:::1;::::0;-1:-1:-1;;;;;40996:38:0;;::::1;::::0;41017:6;::::1;::::0;40996:38:::1;::::0;::::1;41045:6;:17:::0;;-1:-1:-1;;;;;;41045:17:0::1;-1:-1:-1::0;;;;;41045:17:0;;;::::1;::::0;;;::::1;::::0;;40826:244::o;47433:101::-;40581:6;;-1:-1:-1;;;;;40581:6:0;39864:10;40581:22;40573:67;;;;-1:-1:-1;;;40573:67:0;;;;;;;:::i;:::-;47508:7:::1;:18:::0;;-1:-1:-1;;;;;;47508:18:0::1;-1:-1:-1::0;;;;;47508:18:0;;;::::1;::::0;;;::::1;::::0;;47433:101::o;17961:270::-;-1:-1:-1;;;;;18059:19:0;;;;:44;;-1:-1:-1;;;;;;18082:21:0;;;18059:44;18055:73;;;18112:16;;-1:-1:-1;;;18112:16:0;;;;;;;;;;;18055:73;-1:-1:-1;;;;;18141:16:0;;;;;;;:9;:16;;;;;;;;:25;;;;;;;;;;;;;:34;;;18191:32;;510:25:1;;;18191:32:0;;483:18:1;18191:32:0;;;;;;;;17961:270;;;:::o;47542:992::-;47652:6;;;;47649:73;;;47661:41;47676:6;47684:9;47695:6;47661:14;:41::i;:::-;;47542:992;;;:::o;47649:73::-;47737:16;:14;:16::i;:::-;47734:35;;;47756:10;:8;:10::i;:::-;-1:-1:-1;;;;;47829:33:0;;47781:22;47829:33;;;:25;:33;;;;;;47806:6;;47829:33;;47826:506;;;-1:-1:-1;;;;;47889:22:0;;;;;;:11;:22;;;;;;;;47885:106;;47949:26;47960:6;47968;47949:10;:26::i;:::-;47932:43;;47885:106;47826:506;;;-1:-1:-1;;;;;48013:36:0;;;;;;:25;:36;;;;;;;;48010:322;;;-1:-1:-1;;;;;48077:19:0;;;;;;:11;:19;;;;;;;;48073:104;;48134:27;48146:6;48154;48134:11;:27::i;48010:322::-;-1:-1:-1;;;;;48215:19:0;;;;;;:11;:19;;;;;;;;48210:111;;48273:31;48289:6;48297;48273:15;:31::i;:::-;48256:48;;48210:111;-1:-1:-1;;;;;48364:17:0;;;;;;:9;:17;;;;;;:29;;48386:6;48364:21;:29::i;:::-;-1:-1:-1;;;;;48344:17:0;;;;;;;:9;:17;;;;;;:49;;;;48427:20;;;;;;;:40;;48452:14;48427:24;:40::i;:::-;-1:-1:-1;;;;;48404:20:0;;;;;;;:9;:20;;;;;;;:63;;;;48483:43;;;;;;-1:-1:-1;;;;;;;;;;;48483:43:0;;;48511:14;510:25:1;;498:2;483:18;;364:177;48483:43:0;;;;;;;;47638:896;47542:992;;;:::o;23799:203::-;23858:20;23891:11;23905:18;23915:7;23905:9;:18::i;:::-;23974:10;;23799:203;-1:-1:-1;;;23799:203:0:o;16670:260::-;-1:-1:-1;;;;;16750:21:0;;16746:50;;16780:16;;-1:-1:-1;;;16780:16:0;;;;;;;;;;;16746:50;16824:6;16809:11;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;16841:18:0;;;;;;:9;:18;;;;;:28;;16863:6;;16841:18;:28;;16863:6;;16841:28;:::i;:::-;;;;-1:-1:-1;;16885:37:0;;510:25:1;;;-1:-1:-1;;;;;16885:37:0;;;16902:1;;-1:-1:-1;;;;;;;;;;;16885:37:0;498:2:1;483:18;16885:37:0;;;;;;;;16670:260;;:::o;32505:197::-;32640:54;32660:11;32673:9;32684:1;:9;;;;32640:19;:54::i;17263:260::-;-1:-1:-1;;;;;17343:21:0;;17339:50;;17373:16;;-1:-1:-1;;;17373:16:0;;;;;;;;;;;17339:50;-1:-1:-1;;;;;17402:18:0;;;;;;:9;:18;;;;;:28;;17424:6;;17402:18;:28;;17424:6;;17402:28;:::i;:::-;;;;;;;;17456:6;17441:11;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;17478:37:0;;510:25:1;;;17504:1:0;;-1:-1:-1;;;;;17478:37:0;;;-1:-1:-1;;;;;;;;;;;17478:37:0;498:2:1;483:18;17478:37:0;364:177:1;46545:274:0;-1:-1:-1;;;;;46669:17:0;;;46648:18;46669:17;;;:9;:17;;;;;;;;:26;;;;;;;;;;-1:-1:-1;;46712:25:0;;46708:104;;46754:46;46763:6;46771:7;46780:19;46793:6;46780:10;:19;:::i;45881:656::-;46140:29;;;;46135:43;46171:7;46135:43;46213:7;;-1:-1:-1;;;;;46252:17:0;;;46188:22;46252:17;;;:9;:17;;;;;;;;46213:7;;;;46252:33;;;;;;;;;;;-1:-1:-1;;46300:25:0;;46296:234;;46359:20;46373:6;-1:-1:-1;;46359:20:0;:::i;:::-;46346:10;:33;46342:107;;;46413:20;46427:6;-1:-1:-1;;46413:20:0;:::i;:::-;46400:33;;46342:107;46465:53;46474:6;46482:14;46498:19;46511:6;46498:10;:19;:::i;46465:53::-;46124:413;;45881:656;;;;;;;;;:::o;30400:191::-;30528:55;30549:11;30562:9;30573:1;:9;;;;30528:20;:55::i;34372:193::-;34501:56;34523:11;34536:9;34547:1;:9;;;;34501:21;:56::i;48542:330::-;48672:53;;;;;;;;;;;-1:-1:-1;;;48672:53:0;;;;;;;;-1:-1:-1;;;;;48672:17:0;;48635:4;48672:17;;;:9;:17;;;;;;;:53;;48694:6;;48672:21;:53::i;:::-;-1:-1:-1;;;;;48652:17:0;;;;;;;:9;:17;;;;;;:73;;;;48759:20;;;;;;;:32;;48784:6;48759:24;:32::i;:::-;-1:-1:-1;;;;;48736:20:0;;;;;;;:9;:20;;;;;;;:55;;;;48807:35;;;;;;-1:-1:-1;;;;;;;;;;;48807:35:0;;;48835:6;510:25:1;;498:2;483:18;;364:177;48807:35:0;;;;;;;;-1:-1:-1;48860:4:0;48542:330;;;;;:::o;50045:226::-;50154:10;50094:4;50128:37;;;:25;:37;;;;;;;;50127:38;:58;;;;-1:-1:-1;50179:6:0;;;;50178:7;50127:58;:82;;;;-1:-1:-1;50198:11:0;;-1:-1:-1;;;50198:11:0;;;;50127:82;:136;;;;-1:-1:-1;50250:13:0;;50240:4;50222:24;;;;:9;:24;;;;;;:41;;50127:136;50111:152;;50045:226;:::o;50279:376::-;45013:6;:13;;-1:-1:-1;;45013:13:0;45022:4;45013:13;;;50352:16:::1;::::0;;50366:1:::1;50352:16:::0;;;;;::::1;::::0;;-1:-1:-1;;50352:16:0::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;50352:16:0::1;50328:40;;50397:4;50379;50384:1;50379:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;50379:23:0;;::::1;:7;::::0;;::::1;::::0;;;;;:23;50423:4:::1;::::0;50413:7;;50423:4:::1;::::0;;::::1;::::0;;::::1;::::0;50413;;50423::::1;::::0;50413:7;::::1;;;;;:::i;:::-;-1:-1:-1::0;;;;;50413:14:0;;::::1;:7;::::0;;::::1;::::0;;;;;;:14;;;;50440:6:::1;::::0;50530:4:::1;50440:6;50512:24:::0;;;50440:6;50512:24;;;;;;;;50586:20:::1;::::0;50440:207;;-1:-1:-1;;;50440:207:0;;:6;;::::1;::::0;:57:::1;::::0;:207:::1;::::0;50512:24;;50440:6;;50567:4;;50586:20;;;::::1;::::0;50621:15:::1;::::0;50440:207:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;45031:6:0;:14;;-1:-1:-1;;45031:14:0;;;-1:-1:-1;;;50279:376:0:o;48891:340::-;48961:7;48982:17;49002:43;44705:3;49002:23;49013:11;;49002:6;:10;;:23;;;;:::i;:::-;:27;;:43::i;:::-;49103:4;49085:24;;;;:9;:24;;;;;;48982:63;;-1:-1:-1;49085:39:0;;48982:63;49085:28;:39::i;:::-;49076:4;49058:24;;;;:9;:24;;;;;;;:66;;;;49140:42;;-1:-1:-1;;;;;49140:42:0;;;-1:-1:-1;;;;;;;;;;;49140:42:0;;;49172:9;510:25:1;;498:2;483:18;;364:177;49140:42:0;;;;;;;;49202:21;:6;49213:9;49202:10;:21::i;:::-;49195:28;48891:340;-1:-1:-1;;;;48891:340:0:o;49239:354::-;49310:7;49329:17;49349:44;44705:3;49349:24;49360:12;;49349:6;:10;;:24;;;;:::i;49601:432::-;49676:7;49695:17;49715:43;44705:3;49715:23;49726:11;;49715:6;:10;;:23;;;;:::i;:43::-;49695:63;-1:-1:-1;49799:13:0;;49795:176;;49874:4;49856:24;;;;:9;:24;;;;;;:39;;49885:9;49856:28;:39::i;49795:176::-;50003:21;:6;50014:9;42371:136;42429:7;42456:43;42460:1;42463;42456:43;;;;;;;;;;;;;;;;;:3;:43::i;42184:181::-;42242:7;;42274:5;42278:1;42274;:5;:::i;:::-;42262:17;;42303:1;42298;:6;;42290:46;;;;-1:-1:-1;;;42290:46:0;;16541:2:1;42290:46:0;;;16523:21:1;16580:2;16560:18;;;16553:30;16619:29;16599:18;;;16592:57;16666:18;;42290:46:0;16339:351:1;23423:156:0;23490:11;21287:18;23562:7;23531:39;;;;;;;;16852:19:1;;;16909:2;16905:15;-1:-1:-1;;16901:53:1;16896:2;16887:12;;16880:75;16980:2;16971:12;;16695:294;23531:39:0;;;;;;;;;;;;;23521:50;;;;;;23514:57;;23423:156;;;:::o;33602:442::-;33804:12;33759:41;33777:11;33790:9;33759:17;:41::i;:::-;:57;33755:155;;33840:58;;-1:-1:-1;;;33840:58:0;;-1:-1:-1;;;;;17214:32:1;;;33840:58:0;;;17196:51:1;17283:32;;17263:18;;;17256:60;17332:18;;;17325:34;;;17169:18;;33840:58:0;16994:371:1;33755:155:0;33922:44;33940:11;33953:9;33964:1;33922:17;:44::i;:::-;33977:59;33999:11;34012:9;34023:12;33977:21;:59::i;31775:400::-;31926:53;31942:22;31952:11;31942:9;:22::i;:::-;29340:38;;29339:64;;;29212:199;31926:53;31921:109;;31988:42;;-1:-1:-1;;;31988:42:0;;-1:-1:-1;;;;;17562:32:1;;31988:42:0;;;17544:51:1;17611:18;;;17604:34;;;17517:18;;31988:42:0;17370:274:1;31921:109:0;32043:55;32061:11;32074:9;32085:12;32043:17;:55::i;:::-;32143:9;-1:-1:-1;;;;;32116:51:0;32130:11;-1:-1:-1;;;;;32116:51:0;;32154:12;32116:51;;;;510:25:1;;498:2;483:18;;364:177;35457:375:0;35609:53;35625:22;35635:11;35625:9;:22::i;35609:53::-;35604:109;;35671:42;;-1:-1:-1;;;35671:42:0;;-1:-1:-1;;;;;17562:32:1;;35671:42:0;;;17544:51:1;17611:18;;;17604:34;;;17517:18;;35671:42:0;17370:274:1;35604:109:0;35726:46;35746:11;35759:12;35726:19;:46::i;:::-;35783:41;35800:9;35811:12;35783:16;:41::i;42513:192::-;42599:7;42635:12;42627:6;;;;42619:29;;;;-1:-1:-1;;;42619:29:0;;;;;;;;:::i;:::-;-1:-1:-1;42659:9:0;42671:5;42675:1;42671;:5;:::i;:::-;42659:17;42513:192;-1:-1:-1;;;;;42513:192:0:o;42711:250::-;42769:7;42793:1;42798;42793:6;42789:47;;-1:-1:-1;42823:1:0;42816:8;;42789:47;42848:9;42860:5;42864:1;42860;:5;:::i;:::-;42848:17;-1:-1:-1;42893:1:0;42884:5;42888:1;42848:17;42884:5;:::i;:::-;:10;42876:56;;;;-1:-1:-1;;;42876:56:0;;18073:2:1;42876:56:0;;;18055:21:1;18112:2;18092:18;;;18085:30;18151:34;18131:18;;;18124:62;-1:-1:-1;;;18202:18:1;;;18195:31;18243:19;;42876:56:0;17871:397:1;42967:132:0;43025:7;43052:39;43056:1;43059;43052:39;;;;;;;;;;;;;;;;;:3;:39::i;25167:256::-;25257:22;25292:11;25306:36;25319:11;25332:9;25306:12;:36::i;:::-;25395:10;;25167:256;-1:-1:-1;;;;25167:256:0:o;25714:274::-;25858:11;25872:36;25885:11;25898:9;25872:12;:36::i;:::-;25943:27;;;;-1:-1:-1;;;25714:274:0:o;28232:257::-;28320:23;28368:12;28367:13;28346:18;28356:7;28346:9;:18::i;:::-;:34;28320:60;;28393:35;28403:7;28412:15;28393:9;:35::i;:::-;28459:7;-1:-1:-1;;;;;28446:35:0;;28468:12;28446:35;;;;510:25:1;;498:2;483:18;;364:177;28446:35:0;;;;;;;;28309:180;28232:257;;:::o;27021:251::-;27106:23;27153:12;27132:18;27142:7;27132:9;:18::i;:::-;:33;27106:59;;27178:35;27188:7;27197:15;27178:9;:35::i;:::-;27242:7;-1:-1:-1;;;;;27231:33:0;;27251:12;27231:33;;;;510:25:1;;498:2;483:18;;364:177;43105:189:0;43191:7;43226:12;43219:5;43211:28;;;;-1:-1:-1;;;43211:28:0;;;;;;;;:::i;:::-;-1:-1:-1;43250:9:0;43262:5;43266:1;43262;:5;:::i;24662:205::-;24755:11;21361:26;24835:11;24848:9;24796:62;;;;;;;;;18458:19:1;;;18515:2;18511:15;;;-1:-1:-1;;18507:53:1;;;18502:2;18493:12;;18486:75;18595:15;;18591:53;18586:2;18577:12;;18570:75;18670:2;18661:12;;18273:406;24796:62:0;;;;;;;;;;;;;24786:73;;;;;;24779:80;;24662:205;;;;:::o;24195:187::-;24272:11;24286:18;24296:7;24286:9;:18::i;:::-;24339:25;;;;-1:-1:-1;;24195:187:0:o;14:160:1:-;79:20;;135:13;;128:21;118:32;;108:60;;164:1;161;154:12;108:60;14:160;;;:::o;179:180::-;235:6;288:2;276:9;267:7;263:23;259:32;256:52;;;304:1;301;294:12;256:52;327:26;343:9;327:26;:::i;546:418::-;695:2;684:9;677:21;658:4;727:6;721:13;770:6;765:2;754:9;750:18;743:34;829:6;824:2;816:6;812:15;807:2;796:9;792:18;786:50;885:1;880:2;871:6;860:9;856:22;852:31;845:42;955:2;948;944:7;939:2;931:6;927:15;923:29;912:9;908:45;904:54;896:62;;;546:418;;;;:::o;969:173::-;1037:20;;-1:-1:-1;;;;;1086:31:1;;1076:42;;1066:70;;1132:1;1129;1122:12;1147:300;1215:6;1223;1276:2;1264:9;1255:7;1251:23;1247:32;1244:52;;;1292:1;1289;1282:12;1244:52;1315:29;1334:9;1315:29;:::i;:::-;1305:39;1413:2;1398:18;;;;1385:32;;-1:-1:-1;;;1147:300:1:o;1852:226::-;1911:6;1964:2;1952:9;1943:7;1939:23;1935:32;1932:52;;;1980:1;1977;1970:12;1932:52;-1:-1:-1;2025:23:1;;1852:226;-1:-1:-1;1852:226:1:o;2265:374::-;2342:6;2350;2358;2411:2;2399:9;2390:7;2386:23;2382:32;2379:52;;;2427:1;2424;2417:12;2379:52;2450:29;2469:9;2450:29;:::i;:::-;2440:39;;2498:38;2532:2;2521:9;2517:18;2498:38;:::i;:::-;2265:374;;2488:48;;-1:-1:-1;;;2605:2:1;2590:18;;;;2577:32;;2265:374::o;2833:186::-;2892:6;2945:2;2933:9;2924:7;2920:23;2916:32;2913:52;;;2961:1;2958;2951:12;2913:52;2984:29;3003:9;2984:29;:::i;3209:254::-;3274:6;3282;3335:2;3323:9;3314:7;3310:23;3306:32;3303:52;;;3351:1;3348;3341:12;3303:52;3374:29;3393:9;3374:29;:::i;:::-;3364:39;;3422:35;3453:2;3442:9;3438:18;3422:35;:::i;:::-;3412:45;;3209:254;;;;;:::o;3468:343::-;3534:6;3542;3595:2;3583:9;3574:7;3570:23;3566:32;3563:52;;;3611:1;3608;3601:12;3563:52;3634:29;3653:9;3634:29;:::i;:::-;3624:39;;3713:2;3702:9;3698:18;3685:32;3757:4;3750:5;3746:16;3739:5;3736:27;3726:55;;3777:1;3774;3767:12;3726:55;3800:5;3790:15;;;3468:343;;;;;:::o;3816:348::-;3868:8;3878:6;3932:3;3925:4;3917:6;3913:17;3909:27;3899:55;;3950:1;3947;3940:12;3899:55;-1:-1:-1;3973:20:1;;4016:18;4005:30;;4002:50;;;4048:1;4045;4038:12;4002:50;4085:4;4077:6;4073:17;4061:29;;4137:3;4130:4;4121:6;4113;4109:19;4105:30;4102:39;4099:59;;;4154:1;4151;4144:12;4099:59;3816:348;;;;;:::o;4169:1209::-;4298:6;4306;4314;4322;4330;4338;4346;4354;4407:3;4395:9;4386:7;4382:23;4378:33;4375:53;;;4424:1;4421;4414:12;4375:53;4447:29;4466:9;4447:29;:::i;:::-;4437:39;;4527:2;4516:9;4512:18;4499:32;4554:18;4546:6;4543:30;4540:50;;;4586:1;4583;4576:12;4540:50;4625:59;4676:7;4667:6;4656:9;4652:22;4625:59;:::i;:::-;4703:8;;-1:-1:-1;4599:85:1;-1:-1:-1;;4791:2:1;4776:18;;4763:32;4820:18;4807:32;;4804:52;;;4852:1;4849;4842:12;4804:52;4891:61;4944:7;4933:8;4922:9;4918:24;4891:61;:::i;:::-;4971:8;;-1:-1:-1;4865:87:1;-1:-1:-1;;5075:2:1;5060:18;;5047:32;;-1:-1:-1;5156:3:1;5141:19;;5128:33;5186:18;5173:32;;5170:52;;;5218:1;5215;5208:12;5170:52;5257:61;5310:7;5299:8;5288:9;5284:24;5257:61;:::i;:::-;4169:1209;;;;-1:-1:-1;4169:1209:1;;-1:-1:-1;4169:1209:1;;;;;;5337:8;-1:-1:-1;;;4169:1209:1:o;5383:1134::-;5503:6;5511;5519;5527;5535;5543;5551;5604:3;5592:9;5583:7;5579:23;5575:33;5572:53;;;5621:1;5618;5611:12;5572:53;5661:9;5648:23;5694:18;5686:6;5683:30;5680:50;;;5726:1;5723;5716:12;5680:50;5765:59;5816:7;5807:6;5796:9;5792:22;5765:59;:::i;:::-;5843:8;;-1:-1:-1;5739:85:1;-1:-1:-1;;5931:2:1;5916:18;;5903:32;5960:18;5947:32;;5944:52;;;5992:1;5989;5982:12;5944:52;6031:61;6084:7;6073:8;6062:9;6058:24;6031:61;:::i;:::-;6111:8;;-1:-1:-1;6005:87:1;-1:-1:-1;;6215:2:1;6200:18;;6187:32;;-1:-1:-1;6296:2:1;6281:18;;6268:32;6325:18;6312:32;;6309:52;;;6357:1;6354;6347:12;6309:52;6396:61;6449:7;6438:8;6427:9;6423:24;6396:61;:::i;:::-;5383:1134;;;;-1:-1:-1;5383:1134:1;;-1:-1:-1;5383:1134:1;;;;6370:87;;-1:-1:-1;;;5383:1134:1:o;6522:260::-;6590:6;6598;6651:2;6639:9;6630:7;6626:23;6622:32;6619:52;;;6667:1;6664;6657:12;6619:52;6690:29;6709:9;6690:29;:::i;:::-;6680:39;;6738:38;6772:2;6761:9;6757:18;6738:38;:::i;6787:294::-;6852:6;6860;6913:2;6901:9;6892:7;6888:23;6884:32;6881:52;;;6929:1;6926;6919:12;6881:52;6952:26;6968:9;6952:26;:::i;7313:356::-;7515:2;7497:21;;;7534:18;;;7527:30;7593:34;7588:2;7573:18;;7566:62;7660:2;7645:18;;7313:356::o;8030:127::-;8091:10;8086:3;8082:20;8079:1;8072:31;8122:4;8119:1;8112:15;8146:4;8143:1;8136:15;8162:128;8229:9;;;8250:11;;;8247:37;;;8264:18;;:::i;8295:375::-;8383:1;8401:5;8415:249;8436:1;8426:8;8423:15;8415:249;;;8486:4;8481:3;8477:14;8471:4;8468:24;8465:50;;;8495:18;;:::i;:::-;8545:1;8535:8;8531:16;8528:49;;;8559:16;;;;8528:49;8642:1;8638:16;;;;;8598:15;;8415:249;;;8295:375;;;;;;:::o;8675:902::-;8724:5;8754:8;8744:80;;-1:-1:-1;8795:1:1;8809:5;;8744:80;8843:4;8833:76;;-1:-1:-1;8880:1:1;8894:5;;8833:76;8925:4;8943:1;8938:59;;;;9011:1;9006:174;;;;8918:262;;8938:59;8968:1;8959:10;;8982:5;;;9006:174;9043:3;9033:8;9030:17;9027:43;;;9050:18;;:::i;:::-;-1:-1:-1;;9106:1:1;9092:16;;9165:5;;8918:262;;9264:2;9254:8;9251:16;9245:3;9239:4;9236:13;9232:36;9226:2;9216:8;9213:16;9208:2;9202:4;9199:12;9195:35;9192:77;9189:203;;;-1:-1:-1;9301:19:1;;;9377:5;;9189:203;9424:42;-1:-1:-1;;9449:8:1;9443:4;9424:42;:::i;:::-;9502:6;9498:1;9494:6;9490:19;9481:7;9478:32;9475:58;;;9513:18;;:::i;:::-;9551:20;;8675:902;-1:-1:-1;;;8675:902:1:o;9582:140::-;9640:5;9669:47;9710:4;9700:8;9696:19;9690:4;9669:47;:::i;9727:168::-;9800:9;;;9831;;9848:15;;;9842:22;;9828:37;9818:71;;9869:18;;:::i;9900:125::-;9965:9;;;9986:10;;;9983:36;;;9999:18;;:::i;12133:127::-;12194:10;12189:3;12185:20;12182:1;12175:31;12225:4;12222:1;12215:15;12249:4;12246:1;12239:15;12265:127;12326:10;12321:3;12317:20;12314:1;12307:31;12357:4;12354:1;12347:15;12381:4;12378:1;12371:15;12397:267;12486:6;12481:3;12474:19;12538:6;12531:5;12524:4;12519:3;12515:14;12502:43;-1:-1:-1;12590:1:1;12565:16;;;12583:4;12561:27;;;12554:38;;;;12646:2;12625:15;;;-1:-1:-1;;12621:29:1;12612:39;;;12608:50;;12397:267::o;12669:866::-;13006:25;;;-1:-1:-1;;;;;13067:32:1;;13062:2;13047:18;;13040:60;13136:3;13131:2;13116:18;;13109:31;;;-1:-1:-1;;13163:63:1;;13206:19;;13198:6;13190;13163:63;:::i;:::-;13274:9;13266:6;13262:22;13257:2;13246:9;13242:18;13235:50;13308;13351:6;13343;13335;13308:50;:::i;:::-;13294:64;;13395:6;13389:3;13378:9;13374:19;13367:35;13451:9;13443:6;13439:22;13433:3;13422:9;13418:19;13411:51;13479:50;13522:6;13514;13506;13479:50;:::i;:::-;13471:58;12669:866;-1:-1:-1;;;;;;;;;;;;12669:866:1:o;15375:959::-;15637:4;15685:3;15674:9;15670:19;15716:6;15705:9;15698:25;15759:6;15754:2;15743:9;15739:18;15732:34;15802:3;15797:2;15786:9;15782:18;15775:31;15826:6;15861;15855:13;15892:6;15884;15877:22;15930:3;15919:9;15915:19;15908:26;;15969:2;15961:6;15957:15;15943:29;;15990:1;16000:195;16014:6;16011:1;16008:13;16000:195;;;16079:13;;-1:-1:-1;;;;;16075:39:1;16063:52;;16144:2;16170:15;;;;16135:12;;;;16111:1;16029:9;16000:195;;;-1:-1:-1;;;;;;;16251:32:1;;;;16246:2;16231:18;;16224:60;-1:-1:-1;;16315:3:1;16300:19;16293:35;16212:3;15375:959;-1:-1:-1;;;15375:959:1:o;17649:217::-;17689:1;17715;17705:132;;17759:10;17754:3;17750:20;17747:1;17740:31;17794:4;17791:1;17784:15;17822:4;17819:1;17812:15;17705:132;-1:-1:-1;17851:9:1;;17649:217::o

Swarm Source

ipfs://7e076500e64ace7a10e6ff41a8ced4d0671e0b189414d26763f8acfef6c6592f
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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