ETH Price: $1,860.58 (+0.03%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

TokenTracker

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Approve245064642026-02-21 16:33:593 days ago1771691639IN
0xcA9b8D6d...aD1990786
0 ETH0.000006810.14674419
Approve244858462026-02-18 19:34:596 days ago1771443299IN
0xcA9b8D6d...aD1990786
0 ETH0.000099132.13718079
Approve244026322026-02-07 4:43:2317 days ago1770439403IN
0xcA9b8D6d...aD1990786
0 ETH0.00001140.24422888
Approve243818362026-02-04 6:56:4720 days ago1770188207IN
0xcA9b8D6d...aD1990786
0 ETH0.000100542.15642002
Approve243661052026-02-02 2:10:5922 days ago1769998259IN
0xcA9b8D6d...aD1990786
0 ETH0.000008720.18689227
Approve243584122026-02-01 0:24:1123 days ago1769905451IN
0xcA9b8D6d...aD1990786
0 ETH0.000008490.32039219
Approve243584102026-02-01 0:23:4723 days ago1769905427IN
0xcA9b8D6d...aD1990786
0 ETH0.000006990.15069421
Approve242914962026-01-22 16:23:4733 days ago1769099027IN
0xcA9b8D6d...aD1990786
0 ETH0.000011110.23952707
Approve242722702026-01-20 0:00:5935 days ago1768867259IN
0xcA9b8D6d...aD1990786
0 ETH0.000094052.02766688
Approve242654012026-01-19 1:02:1136 days ago1768784531IN
0xcA9b8D6d...aD1990786
0 ETH0.000006850.14774111
Approve242624802026-01-18 15:17:1137 days ago1768749431IN
0xcA9b8D6d...aD1990786
0 ETH0.000047981.0277728
Approve242465112026-01-16 9:52:2339 days ago1768557143IN
0xcA9b8D6d...aD1990786
0 ETH0.000001860.04000944
Approve242040402026-01-10 11:36:3545 days ago1768044995IN
0xcA9b8D6d...aD1990786
0 ETH0.000001530.03293962
Approve241034002025-12-27 10:34:3559 days ago1766831675IN
0xcA9b8D6d...aD1990786
0 ETH0.000094362.03320667
Approve241033682025-12-27 10:28:1159 days ago1766831291IN
0xcA9b8D6d...aD1990786
0 ETH0.000094512.0369584
Transfer240973362025-12-26 14:15:1160 days ago1766758511IN
0xcA9b8D6d...aD1990786
0 ETH0.000135482.06431
Approve240972202025-12-26 13:51:3560 days ago1766757095IN
0xcA9b8D6d...aD1990786
0 ETH0.000096162.07210438
Approve240922082025-12-25 21:04:3560 days ago1766696675IN
0xcA9b8D6d...aD1990786
0 ETH0.000025341.03884442
Approve240811452025-12-24 8:00:3562 days ago1766563235IN
0xcA9b8D6d...aD1990786
0 ETH0.000094132.02943371
Approve240672332025-12-22 9:24:2364 days ago1766395463IN
0xcA9b8D6d...aD1990786
0 ETH0.000094052.02718813
Approve240196382025-12-15 17:57:1171 days ago1765821431IN
0xcA9b8D6d...aD1990786
0 ETH0.000057772.18019837
Approve240196362025-12-15 17:56:4771 days ago1765821407IN
0xcA9b8D6d...aD1990786
0 ETH0.000100762.17181162
Approve240195842025-12-15 17:46:1171 days ago1765820771IN
0xcA9b8D6d...aD1990786
0 ETH0.000011470.2458288
Approve240195812025-12-15 17:45:3571 days ago1765820735IN
0xcA9b8D6d...aD1990786
0 ETH0.000099752.14993199
Approve240195762025-12-15 17:44:3571 days ago1765820675IN
0xcA9b8D6d...aD1990786
0 ETH0.000099992.15510041
View all transactions

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Method Block
From
To
Transmit Interch...214379842024-12-19 17:13:11432 days ago1734628391
0xcA9b8D6d...aD1990786
0.0099 ETH
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

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

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.