ETH Price: $3,323.61 (-2.67%)

Token

Moon Ape Lab (MAL)
 

Overview

Max Total Supply

1,855,782.9500000000000804 MAL

Holders

186

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
3than.eth
Balance
4,543.5 MAL

Value
$0.00
0x506C4C4325b133B9dC277B00b58b01c606aC6ddD
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
MAL

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

pragma solidity ^0.8.7;

// SPDX-License-Identifier: MIT

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

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


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)
/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol)
/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

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

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


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

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

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


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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

        return true;
    }

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

        _beforeTokenTransfer(from, to, amount);

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

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Spend `amount` form the allowance of `owner` toward `spender`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

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

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


// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)
/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}


// est funkcija ClaimTax (4el mozhet polu4it tax) kotoraja mozhet bqt vqpolnena drugim kontraktom esli nado (dlja buduwego kontrakta)
interface IStaking {
  function getAccumulatedAmount(address staker) external view returns (uint256);
}

contract MAL is ERC20, ReentrancyGuard, Ownable {
    IStaking public STAKING;

    uint256 public MAX_SUPPLY;
    bool public tokenCapSet;

    uint256 public spendTaxAmount;
    bool public spendTaxCollectionStopped;
    uint256 public withdrawTaxPercent;
    bool public withdrawTaxCollectionStopped;

    uint256 public totalTaxCollected; // on withdraw & spend (can be claimed)
    uint256 public totalClaimedTax; // how many MAL has been claimed

    bool public isPaused; // deposit, withdraw, transfer
    bool public isDepositPaused;
    bool public isWithdrawPaused;
    bool public isTransferPaused;

    mapping (address => bool) private _isAuthorised;
    address[] public authorisedLog;

    mapping(address => uint256) public depositedAmount;
    mapping(address => uint256) public spentAmount;

    uint256 public moonRoyaleTicketPrice;

    modifier onlyAuthorised {
      require(_isAuthorised[_msgSender()], "Not Authorised");
      _;
    }

    modifier whenNotPaused {
      require(!isPaused, "Transfers paused!");
      _;
    }

    event Withdraw(address indexed userAddress, uint256 amount, uint256 tax);
    event Deposit(address indexed userAddress, uint256 amount);
    event DepositFor(address indexed caller, address indexed userAddress, uint256 amount);
    event Spend(address indexed caller, address indexed userAddress, uint256 amount, uint256 tax);
    event ClaimTax(address indexed caller, address indexed userAddress, uint256 amount);
    event InternalTransfer(address indexed from, address indexed to, uint256 amount);
    event RoyaleTicketsPurchase(address indexed buyer, uint256 amount);

    constructor(address _staking) ERC20("Moon Ape Lab", "MAL") {
      _isAuthorised[_msgSender()] = true;
      isPaused = true;
      isTransferPaused = true;
      isWithdrawPaused = true;

      withdrawTaxPercent = 30;
      spendTaxAmount = 0;

      STAKING = IStaking(_staking);
      _isAuthorised[_staking] = true;
    }

    /**
    * @dev Returns current spendable/withdrawable balance of a specific user. This balance can be spent by user for other collections purchase without
    *      withdrawing to ERC-20 MAL or this balance can be withdrawn to ERC-20 MAL.
    */
    function getUserBalance(address user) public view returns (uint256) {
      return (STAKING.getAccumulatedAmount(user) + depositedAmount[user] - spentAmount[user]);
    }

    /**
    * @dev Returns total deposited amount for address
    */
    function getUserSpentAmount(address user) public view returns (uint256) {
      return spentAmount[user];
    }

    /**
    * @dev Returns total deposited amount for address
    */
    function getUserDepositedAmount(address user) public view returns (uint256) {
      return depositedAmount[user];
    }

    /**
    * @dev Function to deposit ERC-20 MAL to the in-game balance in order to purchases other MOON APE LAB collections with in-game MAL tokens.
    */
    function depositMAL(uint256 amount) public nonReentrant whenNotPaused {
      require(!isDepositPaused, "Deposit Paused");
      require(balanceOf(_msgSender()) >= amount, "Insufficient balance");

      _burn(_msgSender(), amount);
      depositedAmount[_msgSender()] += amount;

      emit Deposit(
        _msgSender(),
        amount
      );
    }

    /**
    * @dev Function to withdraw in-game MAL to ERC-20 MAL.
    */
    function withdrawMAL(uint256 amount) public nonReentrant whenNotPaused {
      require(!isWithdrawPaused, "Withdraw Paused");
      require(getUserBalance(_msgSender()) >= amount, "Insufficient balance");
      uint256 tax = withdrawTaxCollectionStopped ? 0 : (amount * withdrawTaxPercent) / 100;

      spentAmount[_msgSender()] += amount;
      totalTaxCollected += tax;
      _mint(_msgSender(), (amount - tax));

      emit Withdraw(
        _msgSender(),
        amount,
        tax
      );
    }

    /**
    * @dev Function to transfer game MAL from one account to another.
    */
    function transferMAL(address to, uint256 amount) public nonReentrant whenNotPaused {
      require(!isTransferPaused, "Transfer Paused");
      require(getUserBalance(_msgSender()) >= amount, "Insufficient balance");

      spentAmount[_msgSender()] += amount;
      depositedAmount[to] += amount;

      emit InternalTransfer(
        _msgSender(),
        to,
        amount
      );
    }

    function purchaseRoyaleTickets(uint256 ticketsAmount) public nonReentrant{
      require(moonRoyaleTicketPrice > 0, "Moon Royale is not yet enabled");
      require(ticketsAmount > 0, "Please purchase at least 1 Moon Royale Ticket");
      uint256 totalPrice = moonRoyaleTicketPrice * ticketsAmount;
      require(getUserBalance(_msgSender()) >= totalPrice, "Insufficient balance");
      spentAmount[_msgSender()] += totalPrice;
      emit RoyaleTicketsPurchase(_msgSender(), ticketsAmount);
    }

    /**
    * @dev Function to spend user balance. Can be called by other authorised contracts. To be used for internal purchases of other NFTs, etc.
    */
    function spendMAL(address user, uint256 amount) external onlyAuthorised nonReentrant {
      require(getUserBalance(user) >= amount, "Insufficient balance");
      uint256 tax = spendTaxCollectionStopped ? 0 : (amount * spendTaxAmount) / 100;

      spentAmount[user] += amount;
      totalTaxCollected += tax;

      emit Spend(
        _msgSender(),
        user,
        amount,
        tax
      );
    }

    function _depositMALFor(address user, uint256 amount) internal {
      require(user != address(0), "Deposit to 0 address");
      depositedAmount[user] += amount;

      emit DepositFor(_msgSender(), user, amount);
    }

    /**
    * @dev Function to deposit tokens to a user balance. Can be only called by an authorised contracts.
    */
    function depositMALFor(address user, uint256 amount) public onlyAuthorised nonReentrant {
      _depositMALFor(user, amount);
    }

    /**
    * @dev Function to mint tokens to a user balance. Can be only called by an authorised contracts.
    */
    function mintFor(address user, uint256 amount) external onlyAuthorised nonReentrant {
      if (tokenCapSet) require(totalSupply() + amount <= MAX_SUPPLY, "You try to mint more than max supply");
      _mint(user, amount);
    }

     function giveMAL(address user, uint256 amount) public onlyOwner{
      depositedAmount[user] += amount;
    }

    /**
    * @dev Function to claim tokens from the tax accumulated pot. Can be only called by an authorised contracts.
    */
    function claimMALTax(address user, uint256 amount) public onlyAuthorised nonReentrant {
      require(totalTaxCollected >= amount, "Insufficiend tax balance");

      totalTaxCollected -= amount;
      depositedAmount[user] += amount;
      totalClaimedTax += amount;

      emit ClaimTax(
        _msgSender(),
        user,
        amount
      );
    }

    /**
    * @dev Function returns maxSupply set by contract owner. By default returns error (Max supply is not set).
    */
    function getMaxSupply() public view returns (uint256) {
      require(tokenCapSet, "Max supply is not set");
      return MAX_SUPPLY;
    }

    /*
      CONTRACT OWNER FUNCTIONS
    */

    /**
    * @dev Function allows contract owner to set total supply of MAL token.
    */
    function setTokenCap(uint256 tokenCup) public onlyOwner {
      require(totalSupply() < tokenCup, "Value is smaller than the number of existing tokens");
      require(!tokenCapSet, "Token cap has been already set");

      MAX_SUPPLY = tokenCup;
    }

    /**
    * @dev Function allows contract owner to add authorised address.
    */
    function authorise(address addressToAuth) public onlyOwner {
      _isAuthorised[addressToAuth] = true;
      authorisedLog.push(addressToAuth);
    }

    /**
    * @dev Function allows contract owner to add unauthorised address.
    */
    function unauthorise(address addressToUnAuth) public onlyOwner {
      _isAuthorised[addressToUnAuth] = false;
    }

    /**
    * @dev Function allows contract owner update the address of staking address.
    */
    function updateMALStakingContract(address _staking_address) public onlyOwner {
      STAKING = IStaking(_staking_address);
      authorise(_staking_address);
    }

    /**
    * @dev Function allows contract owner to update limmit of tax on withdraw.
    */
    function updateWithdrawTaxPercent(uint256 _taxPercent) public onlyOwner {
      require(_taxPercent <= 100, "Wrong value passed");
      withdrawTaxPercent = _taxPercent;
    }

    /**
    * @dev Function allows contract owner to update tax amount on spend.
    */
    function updateSpendTaxAmount(uint256 _taxPercent) public onlyOwner {
      require(_taxPercent <= 100, "Wrong value passed");
      spendTaxAmount = _taxPercent;
    }

    /**
    * @dev Function allows contract owner to stop tax collection on withdraw.
    */
    function stopTaxCollectionOnWithdraw(bool _stop) public onlyOwner {
      withdrawTaxCollectionStopped = _stop;
    }

    /**
    * @dev Function allows contract owner to stop tax collection on spend.
    */
    function stopTaxCollectionOnSpend(bool _stop) public onlyOwner {
      spendTaxCollectionStopped = _stop;
    }

    /**
    * @dev Function allows contract owner to pause all in-game MAL transactions.
    */
    function pauseMAL(bool _to_pause) public onlyOwner {
      isPaused = _to_pause;
    }

    /**
    * @dev Function allows contract owner to pause in game MAL transfers.
    */
    function pauseTransfers(bool _pause) public onlyOwner {
      isTransferPaused = _pause;
    }

    function setMoonRoyaleTicketPrice(uint256 _newPrice) public onlyOwner{
      moonRoyaleTicketPrice = _newPrice;
    }

    /**
    * @dev Function allows contract owner to pause in game MAL withdraw.
    */
    function pauseWithdrawals(bool _pause) public onlyOwner {
      isWithdrawPaused = _pause;
    }

    /**
    * @dev Function allows contract owner to pause in game MAL deposit.
    */
    function pauseDeposits(bool _pause) public onlyOwner {
      isDepositPaused = _pause;
    }

    /**
    * @dev Function allows contract owner to withdraw ETH accidentally dropped to the contract.
    */
    function withdrawETH() external onlyOwner {
      payable(owner()).transfer(address(this).balance);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_staking","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ClaimTax","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DepositFor","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":"amount","type":"uint256"}],"name":"InternalTransfer","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":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RoyaleTicketsPurchase","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tax","type":"uint256"}],"name":"Spend","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":true,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tax","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STAKING","outputs":[{"internalType":"contract IStaking","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addressToAuth","type":"address"}],"name":"authorise","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"authorisedLog","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"claimMALTax","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":"uint256","name":"amount","type":"uint256"}],"name":"depositMAL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositMALFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"depositedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserDepositedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserSpentAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"giveMAL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isDepositPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isTransferPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isWithdrawPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"moonRoyaleTicketPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[{"internalType":"bool","name":"_pause","type":"bool"}],"name":"pauseDeposits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_to_pause","type":"bool"}],"name":"pauseMAL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_pause","type":"bool"}],"name":"pauseTransfers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_pause","type":"bool"}],"name":"pauseWithdrawals","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"ticketsAmount","type":"uint256"}],"name":"purchaseRoyaleTickets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setMoonRoyaleTicketPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenCup","type":"uint256"}],"name":"setTokenCap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"spendMAL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"spendTaxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"spendTaxCollectionStopped","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"spentAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_stop","type":"bool"}],"name":"stopTaxCollectionOnSpend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_stop","type":"bool"}],"name":"stopTaxCollectionOnWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenCapSet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalClaimedTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTaxCollected","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferMAL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addressToUnAuth","type":"address"}],"name":"unauthorise","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_staking_address","type":"address"}],"name":"updateMALStakingContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_taxPercent","type":"uint256"}],"name":"updateSpendTaxAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_taxPercent","type":"uint256"}],"name":"updateWithdrawTaxPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawMAL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawTaxCollectionStopped","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawTaxPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b50604051620027533803806200275383398101604081905262000034916200021d565b6040518060400160405280600c81526020016b26b7b7b71020b832902630b160a11b8152506040518060400160405280600381526020016213505360ea1b81525081600390805190602001906200008d92919062000177565b508051620000a390600490602084019062000177565b5050600160055550620000b63362000125565b33600090815260116020526040808220805460ff1990811660019081179092556010805463ffff00ff19166301010001179055601e600c55600a849055600780546001600160a01b0319166001600160a01b03969096169586179055938352912080549092161790556200028c565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b82805462000185906200024f565b90600052602060002090601f016020900481019282620001a95760008555620001f4565b82601f10620001c457805160ff1916838001178555620001f4565b82800160010185558215620001f4579182015b82811115620001f4578251825591602001919060010190620001d7565b506200020292915062000206565b5090565b5b8082111562000202576000815560010162000207565b6000602082840312156200023057600080fd5b81516001600160a01b03811681146200024857600080fd5b9392505050565b600181811c908216806200026457607f821691505b602082108114156200028657634e487b7160e01b600052602260045260246000fd5b50919050565b6124b7806200029c6000396000f3fe608060405234801561001057600080fd5b506004361061038e5760003560e01c8063715018a6116101de578063a457c2d71161010f578063e086e5ec116100ad578063f4cc87ba1161007c578063f4cc87ba146107b6578063f560d0b2146107c9578063f84e8d17146107db578063fec061531461080457600080fd5b8063e086e5ec14610775578063e8bb603d1461077d578063f11aafe114610790578063f2fde38b146107a357600080fd5b8063c82bc61d116100e9578063c82bc61d1461070d578063d8454a8214610720578063da1919b314610729578063dd62ed3e1461073c57600080fd5b8063a457c2d7146106da578063a9059cbb146106ed578063b187bd261461070057600080fd5b806388d19ec01161017c57806395d89b411161015657806395d89b411461069857806397610f30146106a05780639982b6a8146106b3578063a1a1ef43146106c657600080fd5b806388d19ec01461064d5780638b46648f146106605780638da5cb5b1461067357600080fd5b80637e22e39d116101b85780637e22e39d1461061157806380833d781461061e57806384a85b0d1461063157806384b4efea1461064457600080fd5b8063715018a6146105e3578063738b62e5146105eb57806374c8ac0b146105fe57600080fd5b8063459f6f50116102c357806362498970116102615780636d031d0a116102305780636d031d0a1461057a5780636f92a74a1461059a57806370a08231146105ad578063710cf8e6146105d657600080fd5b8063624989701461052e57806363114dfb1461054157806366e6c8af1461055457806367800b5f1461056757600080fd5b80634c0f38c21161029d5780634c0f38c2146104d757806351a25566146104df57806356769693146104f257806359d7d9de1461051b57600080fd5b8063459f6f501461049157806347734892146104a45780634a4643f7146104b757600080fd5b806323b872dd11610330578063313ce5671161030a578063313ce5671461045357806332cb6b0c146104625780633515cd1d1461046b578063395093511461047e57600080fd5b806323b872dd146104245780632854bc7e146104375780632fabdc531461044a57600080fd5b806317f6660a1161036c57806317f6660a146103e957806318160ddd146103fc5780631be8823e1461040e578063200847dd1461041757600080fd5b80630579442d1461039357806306fdde03146103a8578063095ea7b3146103c6575b600080fd5b6103a66103a136600461222a565b61080d565b005b6103b0610853565b6040516103bd919061227e565b60405180910390f35b6103d96103d4366004612200565b6108e5565b60405190151581526020016103bd565b6103a66103f736600461224c565b6108fd565b6002545b6040519081526020016103bd565b610400600f5481565b6009546103d99060ff1681565b6103d96104323660046121c4565b610a24565b6103a661044536600461224c565b610a48565b61040060155481565b604051601281526020016103bd565b61040060085481565b6103a661047936600461224c565b610b3d565b6103d961048c366004612200565b610b6c565b6103a661049f36600461224c565b610bab565b6104006104b236600461216f565b610c20565b6104006104c536600461216f565b60136020526000908152604090205481565b610400610cd7565b6103a66104ed36600461222a565b610d2b565b61040061050036600461216f565b6001600160a01b031660009081526014602052604090205490565b6103a661052936600461222a565b610d68565b6103a661053c366004612200565b610da5565b6103a661054f366004612200565b610ef5565b6103a661056236600461216f565b610f50565b6010546103d99062010000900460ff1681565b61040061058836600461216f565b60146020526000908152604090205481565b6103a66105a836600461224c565b610fe0565b6104006105bb36600461216f565b6001600160a01b031660009081526020819052604090205490565b600d546103d99060ff1681565b6103a6611055565b6103a66105f936600461222a565b61108b565b6103a661060c366004612200565b6110cf565b600b546103d99060ff1681565b6103a661062c36600461216f565b611139565b6103a661063f366004612200565b611184565b610400600c5481565b6103a661065b366004612200565b6112cd565b6103a661066e36600461224c565b61141a565b6006546001600160a01b03165b6040516001600160a01b0390911681526020016103bd565b6103b0611594565b600754610680906001600160a01b031681565b6103a66106c136600461224c565b6115a3565b6010546103d9906301000000900460ff1681565b6103d96106e8366004612200565b61171e565b6103d96106fb366004612200565b6117b0565b6010546103d99060ff1681565b61068061071b36600461224c565b6117be565b610400600e5481565b6103a6610737366004612200565b6117e8565b61040061074a366004612191565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6103a66118c5565b6103a661078b36600461216f565b61192b565b6103a661079e36600461222a565b611979565b6103a66107b136600461216f565b6119c1565b6103a66107c436600461222a565b611a59565b6010546103d990610100900460ff1681565b6104006107e936600461216f565b6001600160a01b031660009081526013602052604090205490565b610400600a5481565b6006546001600160a01b031633146108405760405162461bcd60e51b815260040161083790612329565b60405180910390fd5b6010805460ff1916911515919091179055565b60606003805461086290612430565b80601f016020809104026020016040519081016040528092919081815260200182805461088e90612430565b80156108db5780601f106108b0576101008083540402835291602001916108db565b820191906000526020600020905b8154815290600101906020018083116108be57829003601f168201915b5050505050905090565b6000336108f3818585611a9f565b5060019392505050565b600260055414156109205760405162461bcd60e51b815260040161083790612389565b600260055560105460ff16156109485760405162461bcd60e51b81526004016108379061235e565b601054610100900460ff16156109915760405162461bcd60e51b815260206004820152600e60248201526d11195c1bdcda5d0814185d5cd95960921b6044820152606401610837565b8061099b336105bb565b10156109b95760405162461bcd60e51b8152600401610837906122fb565b6109c33382611bc4565b33600090815260136020526040812080548392906109e29084906123c0565b909155505060405181815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9060200160405180910390a2506001600555565b600033610a32858285611d0a565b610a3d858585611d9c565b506001949350505050565b6006546001600160a01b03163314610a725760405162461bcd60e51b815260040161083790612329565b80610a7c60025490565b10610ae55760405162461bcd60e51b815260206004820152603360248201527f56616c756520697320736d616c6c6572207468616e20746865206e756d626572604482015272206f66206578697374696e6720746f6b656e7360681b6064820152608401610837565b60095460ff1615610b385760405162461bcd60e51b815260206004820152601e60248201527f546f6b656e2063617020686173206265656e20616c72656164792073657400006044820152606401610837565b600855565b6006546001600160a01b03163314610b675760405162461bcd60e51b815260040161083790612329565b601555565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091906108f39082908690610ba69087906123c0565b611a9f565b6006546001600160a01b03163314610bd55760405162461bcd60e51b815260040161083790612329565b6064811115610c1b5760405162461bcd60e51b815260206004820152601260248201527115dc9bdb99c81d985b1d59481c185cdcd95960721b6044820152606401610837565b600c55565b6001600160a01b038181166000818152601460209081526040808320546013909252808320546007549151630412966760e01b815260048101959095529294919391169063041296679060240160206040518083038186803b158015610c8557600080fd5b505afa158015610c99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cbd9190612265565b610cc791906123c0565b610cd19190612419565b92915050565b60095460009060ff16610d245760405162461bcd60e51b815260206004820152601560248201527413585e081cdd5c1c1b1e481a5cc81b9bdd081cd95d605a1b6044820152606401610837565b5060085490565b6006546001600160a01b03163314610d555760405162461bcd60e51b815260040161083790612329565b600d805460ff1916911515919091179055565b6006546001600160a01b03163314610d925760405162461bcd60e51b815260040161083790612329565b600b805460ff1916911515919091179055565b3360009081526011602052604090205460ff16610dd45760405162461bcd60e51b8152600401610837906122d3565b60026005541415610df75760405162461bcd60e51b815260040161083790612389565b6002600555600e54811115610e4e5760405162461bcd60e51b815260206004820152601860248201527f496e73756666696369656e64207461782062616c616e636500000000000000006044820152606401610837565b80600e6000828254610e609190612419565b90915550506001600160a01b03821660009081526013602052604081208054839290610e8d9084906123c0565b9250508190555080600f6000828254610ea691906123c0565b90915550506040518181526001600160a01b0383169033907f1ad2283cc65e3e122c0a874bda25abbd844e8ae88fa9512b4849ee1b58b6570d906020015b60405180910390a350506001600555565b6006546001600160a01b03163314610f1f5760405162461bcd60e51b815260040161083790612329565b6001600160a01b03821660009081526013602052604081208054839290610f479084906123c0565b90915550505050565b6006546001600160a01b03163314610f7a5760405162461bcd60e51b815260040161083790612329565b6001600160a01b03166000818152601160205260408120805460ff191660019081179091556012805491820181559091527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec34440180546001600160a01b0319169091179055565b6006546001600160a01b0316331461100a5760405162461bcd60e51b815260040161083790612329565b60648111156110505760405162461bcd60e51b815260206004820152601260248201527115dc9bdb99c81d985b1d59481c185cdcd95960721b6044820152606401610837565b600a55565b6006546001600160a01b0316331461107f5760405162461bcd60e51b815260040161083790612329565b6110896000611f6a565b565b6006546001600160a01b031633146110b55760405162461bcd60e51b815260040161083790612329565b601080549115156101000261ff0019909216919091179055565b3360009081526011602052604090205460ff166110fe5760405162461bcd60e51b8152600401610837906122d3565b600260055414156111215760405162461bcd60e51b815260040161083790612389565b60026005556111308282611fbc565b50506001600555565b6006546001600160a01b031633146111635760405162461bcd60e51b815260040161083790612329565b6001600160a01b03166000908152601160205260409020805460ff19169055565b3360009081526011602052604090205460ff166111b35760405162461bcd60e51b8152600401610837906122d3565b600260055414156111d65760405162461bcd60e51b815260040161083790612389565b6002600555806111e583610c20565b10156112035760405162461bcd60e51b8152600401610837906122fb565b600b5460009060ff1661122f576064600a548361122091906123fa565b61122a91906123d8565b611232565b60005b6001600160a01b03841660009081526014602052604081208054929350849290919061125f9084906123c0565b9250508190555080600e600082825461127891906123c0565b909155505060408051838152602081018390526001600160a01b0385169133917fed8cfe3600cacf009dc67354491d44da19a77f26a4aed42181ba6824ccb35d72910160405180910390a35050600160055550565b600260055414156112f05760405162461bcd60e51b815260040161083790612389565b600260055560105460ff16156113185760405162461bcd60e51b81526004016108379061235e565b6010546301000000900460ff16156113645760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8814185d5cd959608a1b6044820152606401610837565b8061136e33610c20565b101561138c5760405162461bcd60e51b8152600401610837906122fb565b33600090815260146020526040812080548392906113ab9084906123c0565b90915550506001600160a01b038216600090815260136020526040812080548392906113d89084906123c0565b90915550506040518181526001600160a01b0383169033907fe2080c8fc8d86c864d8dc081fadaebf2be7191086615e786f954420f13ed122a90602001610ee4565b6002600554141561143d5760405162461bcd60e51b815260040161083790612389565b60026005556015546114915760405162461bcd60e51b815260206004820152601e60248201527f4d6f6f6e20526f79616c65206973206e6f742079657420656e61626c656400006044820152606401610837565b600081116114f75760405162461bcd60e51b815260206004820152602d60248201527f506c65617365207075726368617365206174206c656173742031204d6f6f6e2060448201526c149bde585b1948151a58dad95d609a1b6064820152608401610837565b60008160155461150791906123fa565b90508061151333610c20565b10156115315760405162461bcd60e51b8152600401610837906122fb565b33600090815260146020526040812080548392906115509084906123c0565b909155505060405182815233907f46e93d89a39d5873a1f394a0857c5fea2c828c411062dacf6b3508af3f99bc22906020015b60405180910390a250506001600555565b60606004805461086290612430565b600260055414156115c65760405162461bcd60e51b815260040161083790612389565b600260055560105460ff16156115ee5760405162461bcd60e51b81526004016108379061235e565b60105462010000900460ff16156116395760405162461bcd60e51b815260206004820152600f60248201526e15da5d1a191c985dc814185d5cd959608a1b6044820152606401610837565b8061164333610c20565b10156116615760405162461bcd60e51b8152600401610837906122fb565b600d5460009060ff1661168d576064600c548361167e91906123fa565b61168891906123d8565b611690565b60005b336000908152601460205260408120805492935084929091906116b49084906123c0565b9250508190555080600e60008282546116cd91906123c0565b909155506116e69050336116e18385612419565b61207b565b604080518381526020810183905233917ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689101611583565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909190838110156117a35760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610837565b610a3d8286868403611a9f565b6000336108f3818585611d9c565b601281815481106117ce57600080fd5b6000918252602090912001546001600160a01b0316905081565b3360009081526011602052604090205460ff166118175760405162461bcd60e51b8152600401610837906122d3565b6002600554141561183a5760405162461bcd60e51b815260040161083790612389565b600260055560095460ff16156118bb576008548161185760025490565b61186191906123c0565b11156118bb5760405162461bcd60e51b8152602060048201526024808201527f596f752074727920746f206d696e74206d6f7265207468616e206d617820737560448201526370706c7960e01b6064820152608401610837565b611130828261207b565b6006546001600160a01b031633146118ef5760405162461bcd60e51b815260040161083790612329565b6006546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015611928573d6000803e3d6000fd5b50565b6006546001600160a01b031633146119555760405162461bcd60e51b815260040161083790612329565b600780546001600160a01b0319166001600160a01b03831617905561192881610f50565b6006546001600160a01b031633146119a35760405162461bcd60e51b815260040161083790612329565b6010805491151563010000000263ff00000019909216919091179055565b6006546001600160a01b031633146119eb5760405162461bcd60e51b815260040161083790612329565b6001600160a01b038116611a505760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610837565b61192881611f6a565b6006546001600160a01b03163314611a835760405162461bcd60e51b815260040161083790612329565b60108054911515620100000262ff000019909216919091179055565b6001600160a01b038316611b015760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610837565b6001600160a01b038216611b625760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610837565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038216611c245760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610837565b6001600160a01b03821660009081526020819052604090205481811015611c985760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610837565b6001600160a01b0383166000908152602081905260408120838303905560028054849290611cc7908490612419565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611bb7565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114611d965781811015611d895760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610837565b611d968484848403611a9f565b50505050565b6001600160a01b038316611e005760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610837565b6001600160a01b038216611e625760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610837565b6001600160a01b03831660009081526020819052604090205481811015611eda5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610837565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290611f119084906123c0565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611f5d91815260200190565b60405180910390a3611d96565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0382166120095760405162461bcd60e51b81526020600482015260146024820152734465706f73697420746f2030206164647265737360601b6044820152606401610837565b6001600160a01b038216600090815260136020526040812080548392906120319084906123c0565b90915550506040518181526001600160a01b0383169033907f6b64443f4cc3aac2df66fff76675a29dc321ce9efebffb006f528db1690179a0906020015b60405180910390a35050565b6001600160a01b0382166120d15760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610837565b80600260008282546120e391906123c0565b90915550506001600160a01b038216600090815260208190526040812080548392906121109084906123c0565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200161206f565b80356001600160a01b038116811461216a57600080fd5b919050565b60006020828403121561218157600080fd5b61218a82612153565b9392505050565b600080604083850312156121a457600080fd5b6121ad83612153565b91506121bb60208401612153565b90509250929050565b6000806000606084860312156121d957600080fd5b6121e284612153565b92506121f060208501612153565b9150604084013590509250925092565b6000806040838503121561221357600080fd5b61221c83612153565b946020939093013593505050565b60006020828403121561223c57600080fd5b8135801515811461218a57600080fd5b60006020828403121561225e57600080fd5b5035919050565b60006020828403121561227757600080fd5b5051919050565b600060208083528351808285015260005b818110156122ab5785810183015185820160400152820161228f565b818111156122bd576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252600e908201526d139bdd08105d5d1a1bdc9a5cd95960921b604082015260600190565b602080825260149082015273496e73756666696369656e742062616c616e636560601b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601190820152705472616e7366657273207061757365642160781b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b600082198211156123d3576123d361246b565b500190565b6000826123f557634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156124145761241461246b565b500290565b60008282101561242b5761242b61246b565b500390565b600181811c9082168061244457607f821691505b6020821081141561246557634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fdfea2646970667358221220942a104b6fa3950d78589e1b989ea93043cbacdbf09c9fa4d4f87b0e64c92e0b64736f6c6343000807003300000000000000000000000000a103267a22971375c3c37d6e1f1bdfb548e946

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061038e5760003560e01c8063715018a6116101de578063a457c2d71161010f578063e086e5ec116100ad578063f4cc87ba1161007c578063f4cc87ba146107b6578063f560d0b2146107c9578063f84e8d17146107db578063fec061531461080457600080fd5b8063e086e5ec14610775578063e8bb603d1461077d578063f11aafe114610790578063f2fde38b146107a357600080fd5b8063c82bc61d116100e9578063c82bc61d1461070d578063d8454a8214610720578063da1919b314610729578063dd62ed3e1461073c57600080fd5b8063a457c2d7146106da578063a9059cbb146106ed578063b187bd261461070057600080fd5b806388d19ec01161017c57806395d89b411161015657806395d89b411461069857806397610f30146106a05780639982b6a8146106b3578063a1a1ef43146106c657600080fd5b806388d19ec01461064d5780638b46648f146106605780638da5cb5b1461067357600080fd5b80637e22e39d116101b85780637e22e39d1461061157806380833d781461061e57806384a85b0d1461063157806384b4efea1461064457600080fd5b8063715018a6146105e3578063738b62e5146105eb57806374c8ac0b146105fe57600080fd5b8063459f6f50116102c357806362498970116102615780636d031d0a116102305780636d031d0a1461057a5780636f92a74a1461059a57806370a08231146105ad578063710cf8e6146105d657600080fd5b8063624989701461052e57806363114dfb1461054157806366e6c8af1461055457806367800b5f1461056757600080fd5b80634c0f38c21161029d5780634c0f38c2146104d757806351a25566146104df57806356769693146104f257806359d7d9de1461051b57600080fd5b8063459f6f501461049157806347734892146104a45780634a4643f7146104b757600080fd5b806323b872dd11610330578063313ce5671161030a578063313ce5671461045357806332cb6b0c146104625780633515cd1d1461046b578063395093511461047e57600080fd5b806323b872dd146104245780632854bc7e146104375780632fabdc531461044a57600080fd5b806317f6660a1161036c57806317f6660a146103e957806318160ddd146103fc5780631be8823e1461040e578063200847dd1461041757600080fd5b80630579442d1461039357806306fdde03146103a8578063095ea7b3146103c6575b600080fd5b6103a66103a136600461222a565b61080d565b005b6103b0610853565b6040516103bd919061227e565b60405180910390f35b6103d96103d4366004612200565b6108e5565b60405190151581526020016103bd565b6103a66103f736600461224c565b6108fd565b6002545b6040519081526020016103bd565b610400600f5481565b6009546103d99060ff1681565b6103d96104323660046121c4565b610a24565b6103a661044536600461224c565b610a48565b61040060155481565b604051601281526020016103bd565b61040060085481565b6103a661047936600461224c565b610b3d565b6103d961048c366004612200565b610b6c565b6103a661049f36600461224c565b610bab565b6104006104b236600461216f565b610c20565b6104006104c536600461216f565b60136020526000908152604090205481565b610400610cd7565b6103a66104ed36600461222a565b610d2b565b61040061050036600461216f565b6001600160a01b031660009081526014602052604090205490565b6103a661052936600461222a565b610d68565b6103a661053c366004612200565b610da5565b6103a661054f366004612200565b610ef5565b6103a661056236600461216f565b610f50565b6010546103d99062010000900460ff1681565b61040061058836600461216f565b60146020526000908152604090205481565b6103a66105a836600461224c565b610fe0565b6104006105bb36600461216f565b6001600160a01b031660009081526020819052604090205490565b600d546103d99060ff1681565b6103a6611055565b6103a66105f936600461222a565b61108b565b6103a661060c366004612200565b6110cf565b600b546103d99060ff1681565b6103a661062c36600461216f565b611139565b6103a661063f366004612200565b611184565b610400600c5481565b6103a661065b366004612200565b6112cd565b6103a661066e36600461224c565b61141a565b6006546001600160a01b03165b6040516001600160a01b0390911681526020016103bd565b6103b0611594565b600754610680906001600160a01b031681565b6103a66106c136600461224c565b6115a3565b6010546103d9906301000000900460ff1681565b6103d96106e8366004612200565b61171e565b6103d96106fb366004612200565b6117b0565b6010546103d99060ff1681565b61068061071b36600461224c565b6117be565b610400600e5481565b6103a6610737366004612200565b6117e8565b61040061074a366004612191565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6103a66118c5565b6103a661078b36600461216f565b61192b565b6103a661079e36600461222a565b611979565b6103a66107b136600461216f565b6119c1565b6103a66107c436600461222a565b611a59565b6010546103d990610100900460ff1681565b6104006107e936600461216f565b6001600160a01b031660009081526013602052604090205490565b610400600a5481565b6006546001600160a01b031633146108405760405162461bcd60e51b815260040161083790612329565b60405180910390fd5b6010805460ff1916911515919091179055565b60606003805461086290612430565b80601f016020809104026020016040519081016040528092919081815260200182805461088e90612430565b80156108db5780601f106108b0576101008083540402835291602001916108db565b820191906000526020600020905b8154815290600101906020018083116108be57829003601f168201915b5050505050905090565b6000336108f3818585611a9f565b5060019392505050565b600260055414156109205760405162461bcd60e51b815260040161083790612389565b600260055560105460ff16156109485760405162461bcd60e51b81526004016108379061235e565b601054610100900460ff16156109915760405162461bcd60e51b815260206004820152600e60248201526d11195c1bdcda5d0814185d5cd95960921b6044820152606401610837565b8061099b336105bb565b10156109b95760405162461bcd60e51b8152600401610837906122fb565b6109c33382611bc4565b33600090815260136020526040812080548392906109e29084906123c0565b909155505060405181815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9060200160405180910390a2506001600555565b600033610a32858285611d0a565b610a3d858585611d9c565b506001949350505050565b6006546001600160a01b03163314610a725760405162461bcd60e51b815260040161083790612329565b80610a7c60025490565b10610ae55760405162461bcd60e51b815260206004820152603360248201527f56616c756520697320736d616c6c6572207468616e20746865206e756d626572604482015272206f66206578697374696e6720746f6b656e7360681b6064820152608401610837565b60095460ff1615610b385760405162461bcd60e51b815260206004820152601e60248201527f546f6b656e2063617020686173206265656e20616c72656164792073657400006044820152606401610837565b600855565b6006546001600160a01b03163314610b675760405162461bcd60e51b815260040161083790612329565b601555565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091906108f39082908690610ba69087906123c0565b611a9f565b6006546001600160a01b03163314610bd55760405162461bcd60e51b815260040161083790612329565b6064811115610c1b5760405162461bcd60e51b815260206004820152601260248201527115dc9bdb99c81d985b1d59481c185cdcd95960721b6044820152606401610837565b600c55565b6001600160a01b038181166000818152601460209081526040808320546013909252808320546007549151630412966760e01b815260048101959095529294919391169063041296679060240160206040518083038186803b158015610c8557600080fd5b505afa158015610c99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cbd9190612265565b610cc791906123c0565b610cd19190612419565b92915050565b60095460009060ff16610d245760405162461bcd60e51b815260206004820152601560248201527413585e081cdd5c1c1b1e481a5cc81b9bdd081cd95d605a1b6044820152606401610837565b5060085490565b6006546001600160a01b03163314610d555760405162461bcd60e51b815260040161083790612329565b600d805460ff1916911515919091179055565b6006546001600160a01b03163314610d925760405162461bcd60e51b815260040161083790612329565b600b805460ff1916911515919091179055565b3360009081526011602052604090205460ff16610dd45760405162461bcd60e51b8152600401610837906122d3565b60026005541415610df75760405162461bcd60e51b815260040161083790612389565b6002600555600e54811115610e4e5760405162461bcd60e51b815260206004820152601860248201527f496e73756666696369656e64207461782062616c616e636500000000000000006044820152606401610837565b80600e6000828254610e609190612419565b90915550506001600160a01b03821660009081526013602052604081208054839290610e8d9084906123c0565b9250508190555080600f6000828254610ea691906123c0565b90915550506040518181526001600160a01b0383169033907f1ad2283cc65e3e122c0a874bda25abbd844e8ae88fa9512b4849ee1b58b6570d906020015b60405180910390a350506001600555565b6006546001600160a01b03163314610f1f5760405162461bcd60e51b815260040161083790612329565b6001600160a01b03821660009081526013602052604081208054839290610f479084906123c0565b90915550505050565b6006546001600160a01b03163314610f7a5760405162461bcd60e51b815260040161083790612329565b6001600160a01b03166000818152601160205260408120805460ff191660019081179091556012805491820181559091527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec34440180546001600160a01b0319169091179055565b6006546001600160a01b0316331461100a5760405162461bcd60e51b815260040161083790612329565b60648111156110505760405162461bcd60e51b815260206004820152601260248201527115dc9bdb99c81d985b1d59481c185cdcd95960721b6044820152606401610837565b600a55565b6006546001600160a01b0316331461107f5760405162461bcd60e51b815260040161083790612329565b6110896000611f6a565b565b6006546001600160a01b031633146110b55760405162461bcd60e51b815260040161083790612329565b601080549115156101000261ff0019909216919091179055565b3360009081526011602052604090205460ff166110fe5760405162461bcd60e51b8152600401610837906122d3565b600260055414156111215760405162461bcd60e51b815260040161083790612389565b60026005556111308282611fbc565b50506001600555565b6006546001600160a01b031633146111635760405162461bcd60e51b815260040161083790612329565b6001600160a01b03166000908152601160205260409020805460ff19169055565b3360009081526011602052604090205460ff166111b35760405162461bcd60e51b8152600401610837906122d3565b600260055414156111d65760405162461bcd60e51b815260040161083790612389565b6002600555806111e583610c20565b10156112035760405162461bcd60e51b8152600401610837906122fb565b600b5460009060ff1661122f576064600a548361122091906123fa565b61122a91906123d8565b611232565b60005b6001600160a01b03841660009081526014602052604081208054929350849290919061125f9084906123c0565b9250508190555080600e600082825461127891906123c0565b909155505060408051838152602081018390526001600160a01b0385169133917fed8cfe3600cacf009dc67354491d44da19a77f26a4aed42181ba6824ccb35d72910160405180910390a35050600160055550565b600260055414156112f05760405162461bcd60e51b815260040161083790612389565b600260055560105460ff16156113185760405162461bcd60e51b81526004016108379061235e565b6010546301000000900460ff16156113645760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8814185d5cd959608a1b6044820152606401610837565b8061136e33610c20565b101561138c5760405162461bcd60e51b8152600401610837906122fb565b33600090815260146020526040812080548392906113ab9084906123c0565b90915550506001600160a01b038216600090815260136020526040812080548392906113d89084906123c0565b90915550506040518181526001600160a01b0383169033907fe2080c8fc8d86c864d8dc081fadaebf2be7191086615e786f954420f13ed122a90602001610ee4565b6002600554141561143d5760405162461bcd60e51b815260040161083790612389565b60026005556015546114915760405162461bcd60e51b815260206004820152601e60248201527f4d6f6f6e20526f79616c65206973206e6f742079657420656e61626c656400006044820152606401610837565b600081116114f75760405162461bcd60e51b815260206004820152602d60248201527f506c65617365207075726368617365206174206c656173742031204d6f6f6e2060448201526c149bde585b1948151a58dad95d609a1b6064820152608401610837565b60008160155461150791906123fa565b90508061151333610c20565b10156115315760405162461bcd60e51b8152600401610837906122fb565b33600090815260146020526040812080548392906115509084906123c0565b909155505060405182815233907f46e93d89a39d5873a1f394a0857c5fea2c828c411062dacf6b3508af3f99bc22906020015b60405180910390a250506001600555565b60606004805461086290612430565b600260055414156115c65760405162461bcd60e51b815260040161083790612389565b600260055560105460ff16156115ee5760405162461bcd60e51b81526004016108379061235e565b60105462010000900460ff16156116395760405162461bcd60e51b815260206004820152600f60248201526e15da5d1a191c985dc814185d5cd959608a1b6044820152606401610837565b8061164333610c20565b10156116615760405162461bcd60e51b8152600401610837906122fb565b600d5460009060ff1661168d576064600c548361167e91906123fa565b61168891906123d8565b611690565b60005b336000908152601460205260408120805492935084929091906116b49084906123c0565b9250508190555080600e60008282546116cd91906123c0565b909155506116e69050336116e18385612419565b61207b565b604080518381526020810183905233917ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689101611583565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909190838110156117a35760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610837565b610a3d8286868403611a9f565b6000336108f3818585611d9c565b601281815481106117ce57600080fd5b6000918252602090912001546001600160a01b0316905081565b3360009081526011602052604090205460ff166118175760405162461bcd60e51b8152600401610837906122d3565b6002600554141561183a5760405162461bcd60e51b815260040161083790612389565b600260055560095460ff16156118bb576008548161185760025490565b61186191906123c0565b11156118bb5760405162461bcd60e51b8152602060048201526024808201527f596f752074727920746f206d696e74206d6f7265207468616e206d617820737560448201526370706c7960e01b6064820152608401610837565b611130828261207b565b6006546001600160a01b031633146118ef5760405162461bcd60e51b815260040161083790612329565b6006546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015611928573d6000803e3d6000fd5b50565b6006546001600160a01b031633146119555760405162461bcd60e51b815260040161083790612329565b600780546001600160a01b0319166001600160a01b03831617905561192881610f50565b6006546001600160a01b031633146119a35760405162461bcd60e51b815260040161083790612329565b6010805491151563010000000263ff00000019909216919091179055565b6006546001600160a01b031633146119eb5760405162461bcd60e51b815260040161083790612329565b6001600160a01b038116611a505760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610837565b61192881611f6a565b6006546001600160a01b03163314611a835760405162461bcd60e51b815260040161083790612329565b60108054911515620100000262ff000019909216919091179055565b6001600160a01b038316611b015760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610837565b6001600160a01b038216611b625760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610837565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038216611c245760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610837565b6001600160a01b03821660009081526020819052604090205481811015611c985760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610837565b6001600160a01b0383166000908152602081905260408120838303905560028054849290611cc7908490612419565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611bb7565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114611d965781811015611d895760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610837565b611d968484848403611a9f565b50505050565b6001600160a01b038316611e005760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610837565b6001600160a01b038216611e625760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610837565b6001600160a01b03831660009081526020819052604090205481811015611eda5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610837565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290611f119084906123c0565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611f5d91815260200190565b60405180910390a3611d96565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0382166120095760405162461bcd60e51b81526020600482015260146024820152734465706f73697420746f2030206164647265737360601b6044820152606401610837565b6001600160a01b038216600090815260136020526040812080548392906120319084906123c0565b90915550506040518181526001600160a01b0383169033907f6b64443f4cc3aac2df66fff76675a29dc321ce9efebffb006f528db1690179a0906020015b60405180910390a35050565b6001600160a01b0382166120d15760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610837565b80600260008282546120e391906123c0565b90915550506001600160a01b038216600090815260208190526040812080548392906121109084906123c0565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200161206f565b80356001600160a01b038116811461216a57600080fd5b919050565b60006020828403121561218157600080fd5b61218a82612153565b9392505050565b600080604083850312156121a457600080fd5b6121ad83612153565b91506121bb60208401612153565b90509250929050565b6000806000606084860312156121d957600080fd5b6121e284612153565b92506121f060208501612153565b9150604084013590509250925092565b6000806040838503121561221357600080fd5b61221c83612153565b946020939093013593505050565b60006020828403121561223c57600080fd5b8135801515811461218a57600080fd5b60006020828403121561225e57600080fd5b5035919050565b60006020828403121561227757600080fd5b5051919050565b600060208083528351808285015260005b818110156122ab5785810183015185820160400152820161228f565b818111156122bd576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252600e908201526d139bdd08105d5d1a1bdc9a5cd95960921b604082015260600190565b602080825260149082015273496e73756666696369656e742062616c616e636560601b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601190820152705472616e7366657273207061757365642160781b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b600082198211156123d3576123d361246b565b500190565b6000826123f557634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156124145761241461246b565b500290565b60008282101561242b5761242b61246b565b500390565b600181811c9082168061244457607f821691505b6020821081141561246557634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fdfea2646970667358221220942a104b6fa3950d78589e1b989ea93043cbacdbf09c9fa4d4f87b0e64c92e0b64736f6c63430008070033

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

00000000000000000000000000a103267a22971375c3c37d6e1f1bdfb548e946

-----Decoded View---------------
Arg [0] : _staking (address): 0x00a103267A22971375C3C37d6E1f1BDfb548e946

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000000a103267a22971375c3c37d6e1f1bdfb548e946


Deployed Bytecode Sourcemap

22490:10617:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32075:88;;;;;;:::i;:::-;;:::i;:::-;;8784:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11135:201;;;;;;:::i;:::-;;:::i;:::-;;;2265:14:1;;2258:22;2240:41;;2228:2;2213:18;11135:201:0;2100:187:1;25508:363:0;;;;;;:::i;:::-;;:::i;9904:108::-;9992:12;;9904:108;;;13771:25:1;;;13759:2;13744:18;9904:108:0;13625:177:1;22889:30:0;;;;;;22609:23;;;;;;;;;11916:295;;;;;;:::i;:::-;;:::i;29984:257::-;;;;;;:::i;:::-;;:::i;23330:36::-;;;;;;9746:93;;;9829:2;14202:36:1;;14190:2;14175:18;9746:93:0;14060:184:1;22577:25:0;;;;;;32367:119;;;;;;:::i;:::-;;:::i;12620:240::-;;;;;;:::i;:::-;;:::i;31082:179::-;;;;;;:::i;:::-;;:::i;24773:172::-;;;;;;:::i;:::-;;:::i;23218:50::-;;;;;;:::i;:::-;;;;;;;;;;;;;;29690:142;;;:::i;31635:119::-;;;;;;:::i;:::-;;:::i;25025:113::-;;;;;;:::i;:::-;-1:-1:-1;;;;;25113:17:0;25088:7;25113:17;;;:11;:17;;;;;;;25025:113;31855;;;;;;:::i;:::-;;:::i;29186:367::-;;;;;;:::i;:::-;;:::i;28936:111::-;;;;;;:::i;:::-;;:::i;30336:153::-;;;;;;:::i;:::-;;:::i;23053:28::-;;;;;;;;;;;;23275:46;;;;;;:::i;:::-;;;;;;;;;;;;;;31360:171;;;;;;:::i;:::-;;:::i;10075:127::-;;;;;;:::i;:::-;-1:-1:-1;;;;;10176:18:0;10149:7;10176:18;;;;;;;;;;;;10075:127;22761:40;;;;;;;;;2497:103;;;:::i;32781:94::-;;;;;;:::i;:::-;;:::i;28436:133::-;;;;;;:::i;:::-;;:::i;22677:37::-;;;;;;;;;30586:118;;;;;;:::i;:::-;;:::i;27652:421::-;;;;;;:::i;:::-;;:::i;22721:33::-;;;;;;26568:403;;;;;;:::i;:::-;;:::i;26979:505::-;;;;;;:::i;:::-;;:::i;1846:87::-;1919:6;;-1:-1:-1;;;;;1919:6:0;1846:87;;;-1:-1:-1;;;;;2056:32:1;;;2038:51;;2026:2;2011:18;1846:87:0;1892:203:1;9003:104:0;;;:::i;22545:23::-;;;;;-1:-1:-1;;;;;22545:23:0;;;25956:516;;;;;;:::i;:::-;;:::i;23088:28::-;;;;;;;;;;;;13363:438;;;;;;:::i;:::-;;:::i;10408:193::-;;;;;;:::i;:::-;;:::i;22961:20::-;;;;;;;;;23179:30;;;;;;:::i;:::-;;:::i;22810:32::-;;;;;;28696:231;;;;;;:::i;:::-;;:::i;10664:151::-;;;;;;:::i;:::-;-1:-1:-1;;;;;10780:18:0;;;10753:7;10780:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;10664:151;32997:107;;;:::i;30811:166::-;;;;;;:::i;:::-;;:::i;32263:96::-;;;;;;:::i;:::-;;:::i;2755:201::-;;;;;;:::i;:::-;;:::i;32585:98::-;;;;;;:::i;:::-;;:::i;23019:27::-;;;;;;;;;;;;25218:121;;;;;;:::i;:::-;-1:-1:-1;;;;;25310:21:0;25285:7;25310:21;;;:15;:21;;;;;;;25218:121;22641:29;;;;;;32075:88;1919:6;;-1:-1:-1;;;;;1919:6:0;736:10;2066:23;2058:68;;;;-1:-1:-1;;;2058:68:0;;;;;;;:::i;:::-;;;;;;;;;32135:8:::1;:20:::0;;-1:-1:-1;;32135:20:0::1;::::0;::::1;;::::0;;;::::1;::::0;;32075:88::o;8784:100::-;8838:13;8871:5;8864:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8784:100;:::o;11135:201::-;11218:4;736:10;11274:32;736:10;11290:7;11299:6;11274:8;:32::i;:::-;-1:-1:-1;11324:4:0;;11135:201;-1:-1:-1;;;11135:201:0:o;25508:363::-;21297:1;21895:7;;:19;;21887:63;;;;-1:-1:-1;;;21887:63:0;;;;;;;:::i;:::-;21297:1;22028:7;:18;23529:8:::1;::::0;::::1;;23528:9;23520:39;;;;-1:-1:-1::0;;;23520:39:0::1;;;;;;;:::i;:::-;25596:15:::2;::::0;::::2;::::0;::::2;;;25595:16;25587:43;;;::::0;-1:-1:-1;;;25587:43:0;;3724:2:1;25587:43:0::2;::::0;::::2;3706:21:1::0;3763:2;3743:18;;;3736:30;-1:-1:-1;;;3782:18:1;;;3775:44;3836:18;;25587:43:0::2;3522:338:1::0;25587:43:0::2;25674:6:::0;25647:23:::2;736:10:::0;25657:12:::2;656:98:::0;25647:23:::2;:33;;25639:66;;;;-1:-1:-1::0;;;25639:66:0::2;;;;;;;:::i;:::-;25716:27;736:10:::0;25736:6:::2;25716:5;:27::i;:::-;736:10:::0;25752:29:::2;::::0;;;:15:::2;:29;::::0;;;;:39;;25785:6;;25752:29;:39:::2;::::0;25785:6;;25752:39:::2;:::i;:::-;::::0;;;-1:-1:-1;;25807:56:0::2;::::0;13771:25:1;;;736:10:0;;25807:56:::2;::::0;13759:2:1;13744:18;25807:56:0::2;;;;;;;-1:-1:-1::0;21253:1:0;22207:7;:22;25508:363::o;11916:295::-;12047:4;736:10;12105:38;12121:4;736:10;12136:6;12105:15;:38::i;:::-;12154:27;12164:4;12170:2;12174:6;12154:9;:27::i;:::-;-1:-1:-1;12199:4:0;;11916:295;-1:-1:-1;;;;11916:295:0:o;29984:257::-;1919:6;;-1:-1:-1;;;;;1919:6:0;736:10;2066:23;2058:68;;;;-1:-1:-1;;;2058:68:0;;;;;;;:::i;:::-;30073:8:::1;30057:13;9992:12:::0;;;9904:108;30057:13:::1;:24;30049:88;;;::::0;-1:-1:-1;;;30049:88:0;;10028:2:1;30049:88:0::1;::::0;::::1;10010:21:1::0;10067:2;10047:18;;;10040:30;10106:34;10086:18;;;10079:62;-1:-1:-1;;;10157:18:1;;;10150:49;10216:19;;30049:88:0::1;9826:415:1::0;30049:88:0::1;30155:11;::::0;::::1;;30154:12;30146:55;;;::::0;-1:-1:-1;;;30146:55:0;;7850:2:1;30146:55:0::1;::::0;::::1;7832:21:1::0;7889:2;7869:18;;;7862:30;7928:32;7908:18;;;7901:60;7978:18;;30146:55:0::1;7648:354:1::0;30146:55:0::1;30212:10;:21:::0;29984:257::o;32367:119::-;1919:6;;-1:-1:-1;;;;;1919:6:0;736:10;2066:23;2058:68;;;;-1:-1:-1;;;2058:68:0;;;;;;;:::i;:::-;32445:21:::1;:33:::0;32367:119::o;12620:240::-;736:10;12708:4;12789:18;;;:11;:18;;;;;;;;-1:-1:-1;;;;;12789:27:0;;;;;;;;;;12708:4;;736:10;12764:66;;736:10;;12789:27;;:40;;12819:10;;12789:40;:::i;:::-;12764:8;:66::i;31082:179::-;1919:6;;-1:-1:-1;;;;;1919:6:0;736:10;2066:23;2058:68;;;;-1:-1:-1;;;2058:68:0;;;;;;;:::i;:::-;31186:3:::1;31171:11;:18;;31163:49;;;::::0;-1:-1:-1;;;31163:49:0;;8562:2:1;31163:49:0::1;::::0;::::1;8544:21:1::0;8601:2;8581:18;;;8574:30;-1:-1:-1;;;8620:18:1;;;8613:48;8678:18;;31163:49:0::1;8360:342:1::0;31163:49:0::1;31221:18;:32:::0;31082:179::o;24773:172::-;-1:-1:-1;;;;;24919:17:0;;;24832:7;24919:17;;;:11;:17;;;;;;;;;24895:15;:21;;;;;;;24858:7;;:34;;-1:-1:-1;;;24858:34:0;;;;;2038:51:1;;;;24832:7:0;;24919:17;;24858:7;;;:28;;2011:18:1;;24858:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:58;;;;:::i;:::-;:78;;;;:::i;:::-;24850:87;24773:172;-1:-1:-1;;24773:172:0:o;29690:142::-;29761:11;;29735:7;;29761:11;;29753:45;;;;-1:-1:-1;;;29753:45:0;;10792:2:1;29753:45:0;;;10774:21:1;10831:2;10811:18;;;10804:30;-1:-1:-1;;;10850:18:1;;;10843:51;10911:18;;29753:45:0;10590:345:1;29753:45:0;-1:-1:-1;29814:10:0;;;29690:142::o;31635:119::-;1919:6;;-1:-1:-1;;;;;1919:6:0;736:10;2066:23;2058:68;;;;-1:-1:-1;;;2058:68:0;;;;;;;:::i;:::-;31710:28:::1;:36:::0;;-1:-1:-1;;31710:36:0::1;::::0;::::1;;::::0;;;::::1;::::0;;31635:119::o;31855:113::-;1919:6;;-1:-1:-1;;;;;1919:6:0;736:10;2066:23;2058:68;;;;-1:-1:-1;;;2058:68:0;;;;;;;:::i;:::-;31927:25:::1;:33:::0;;-1:-1:-1;;31927:33:0::1;::::0;::::1;;::::0;;;::::1;::::0;;31855:113::o;29186:367::-;736:10;23416:27;;;;:13;:27;;;;;;;;23408:54;;;;-1:-1:-1;;;23408:54:0;;;;;;;:::i;:::-;21297:1:::1;21895:7;;:19;;21887:63;;;;-1:-1:-1::0;;;21887:63:0::1;;;;;;;:::i;:::-;21297:1;22028:7;:18:::0;29289:17:::2;::::0;:27;-1:-1:-1;29289:27:0::2;29281:64;;;::::0;-1:-1:-1;;;29281:64:0;;8209:2:1;29281:64:0::2;::::0;::::2;8191:21:1::0;8248:2;8228:18;;;8221:30;8287:26;8267:18;;;8260:54;8331:18;;29281:64:0::2;8007:348:1::0;29281:64:0::2;29377:6;29356:17;;:27;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;29392:21:0;::::2;;::::0;;;:15:::2;:21;::::0;;;;:31;;29417:6;;29392:21;:31:::2;::::0;29417:6;;29392:31:::2;:::i;:::-;;;;;;;;29451:6;29432:15;;:25;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;29473:72:0::2;::::0;13771:25:1;;;-1:-1:-1;;;;;29473:72:0;::::2;::::0;736:10;;29473:72:::2;::::0;13759:2:1;13744:18;29473:72:0::2;;;;;;;;-1:-1:-1::0;;21253:1:0::1;22207:7;:22:::0;29186:367::o;28936:111::-;1919:6;;-1:-1:-1;;;;;1919:6:0;736:10;2066:23;2058:68;;;;-1:-1:-1;;;2058:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29008:21:0;::::1;;::::0;;;:15:::1;:21;::::0;;;;:31;;29033:6;;29008:21;:31:::1;::::0;29033:6;;29008:31:::1;:::i;:::-;::::0;;;-1:-1:-1;;;;28936:111:0:o;30336:153::-;1919:6;;-1:-1:-1;;;;;1919:6:0;736:10;2066:23;2058:68;;;;-1:-1:-1;;;2058:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30404:28:0::1;;::::0;;;:13:::1;:28;::::0;;;;:35;;-1:-1:-1;;30404:35:0::1;30435:4;30404:35:::0;;::::1;::::0;;;30448:13:::1;:33:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;30448:33:0::1;::::0;;::::1;::::0;;30336:153::o;31360:171::-;1919:6;;-1:-1:-1;;;;;1919:6:0;736:10;2066:23;2058:68;;;;-1:-1:-1;;;2058:68:0;;;;;;;:::i;:::-;31460:3:::1;31445:11;:18;;31437:49;;;::::0;-1:-1:-1;;;31437:49:0;;8562:2:1;31437:49:0::1;::::0;::::1;8544:21:1::0;8601:2;8581:18;;;8574:30;-1:-1:-1;;;8620:18:1;;;8613:48;8678:18;;31437:49:0::1;8360:342:1::0;31437:49:0::1;31495:14;:28:::0;31360:171::o;2497:103::-;1919:6;;-1:-1:-1;;;;;1919:6:0;736:10;2066:23;2058:68;;;;-1:-1:-1;;;2058:68:0;;;;;;;:::i;:::-;2562:30:::1;2589:1;2562:18;:30::i;:::-;2497:103::o:0;32781:94::-;1919:6;;-1:-1:-1;;;;;1919:6:0;736:10;2066:23;2058:68;;;;-1:-1:-1;;;2058:68:0;;;;;;;:::i;:::-;32843:15:::1;:24:::0;;;::::1;;;;-1:-1:-1::0;;32843:24:0;;::::1;::::0;;;::::1;::::0;;32781:94::o;28436:133::-;736:10;23416:27;;;;:13;:27;;;;;;;;23408:54;;;;-1:-1:-1;;;23408:54:0;;;;;;;:::i;:::-;21297:1:::1;21895:7;;:19;;21887:63;;;;-1:-1:-1::0;;;21887:63:0::1;;;;;;;:::i;:::-;21297:1;22028:7;:18:::0;28533:28:::2;28548:4:::0;28554:6;28533:14:::2;:28::i;:::-;-1:-1:-1::0;;21253:1:0::1;22207:7;:22:::0;28436:133::o;30586:118::-;1919:6;;-1:-1:-1;;;;;1919:6:0;736:10;2066:23;2058:68;;;;-1:-1:-1;;;2058:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30658:30:0::1;30691:5;30658:30:::0;;;:13:::1;:30;::::0;;;;:38;;-1:-1:-1;;30658:38:0::1;::::0;;30586:118::o;27652:421::-;736:10;23416:27;;;;:13;:27;;;;;;;;23408:54;;;;-1:-1:-1;;;23408:54:0;;;;;;;:::i;:::-;21297:1:::1;21895:7;;:19;;21887:63;;;;-1:-1:-1::0;;;21887:63:0::1;;;;;;;:::i;:::-;21297:1;22028:7;:18:::0;27778:6;27754:20:::2;27769:4:::0;27754:14:::2;:20::i;:::-;:30;;27746:63;;;;-1:-1:-1::0;;;27746:63:0::2;;;;;;;:::i;:::-;27832:25;::::0;27818:11:::2;::::0;27832:25:::2;;:63;;27892:3;27874:14;;27865:6;:23;;;;:::i;:::-;27864:31;;;;:::i;:::-;27832:63;;;27860:1;27832:63;-1:-1:-1::0;;;;;27906:17:0;::::2;;::::0;;;:11:::2;:17;::::0;;;;:27;;27818:77;;-1:-1:-1;27927:6:0;;27906:17;;;:27:::2;::::0;27927:6;;27906:27:::2;:::i;:::-;;;;;;;;27963:3;27942:17;;:24;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;27982:83:0::2;::::0;;13981:25:1;;;14037:2;14022:18;;14015:34;;;-1:-1:-1;;;;;27982:83:0;::::2;::::0;736:10;;27982:83:::2;::::0;13954:18:1;27982:83:0::2;;;;;;;-1:-1:-1::0;;21253:1:0::1;22207:7;:22:::0;-1:-1:-1;27652:421:0:o;26568:403::-;21297:1;21895:7;;:19;;21887:63;;;;-1:-1:-1;;;21887:63:0;;;;;;;:::i;:::-;21297:1;22028:7;:18;23529:8:::1;::::0;::::1;;23528:9;23520:39;;;;-1:-1:-1::0;;;23520:39:0::1;;;;;;;:::i;:::-;26669:16:::2;::::0;;;::::2;;;26668:17;26660:45;;;::::0;-1:-1:-1;;;26660:45:0;;10448:2:1;26660:45:0::2;::::0;::::2;10430:21:1::0;10487:2;10467:18;;;10460:30;-1:-1:-1;;;10506:18:1;;;10499:45;10561:18;;26660:45:0::2;10246:339:1::0;26660:45:0::2;26754:6:::0;26722:28:::2;736:10:::0;24773:172;:::i;26722:28::-:2;:38;;26714:71;;;;-1:-1:-1::0;;;26714:71:0::2;;;;;;;:::i;:::-;736:10:::0;26796:25:::2;::::0;;;:11:::2;:25;::::0;;;;:35;;26825:6;;26796:25;:35:::2;::::0;26825:6;;26796:35:::2;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;26840:19:0;::::2;;::::0;;;:15:::2;:19;::::0;;;;:29;;26863:6;;26840:19;:29:::2;::::0;26863:6;;26840:29:::2;:::i;:::-;::::0;;;-1:-1:-1;;26885:78:0::2;::::0;13771:25:1;;;-1:-1:-1;;;;;26885:78:0;::::2;::::0;736:10;;26885:78:::2;::::0;13759:2:1;13744:18;26885:78:0::2;13625:177:1::0;26979:505:0;21297:1;21895:7;;:19;;21887:63;;;;-1:-1:-1;;;21887:63:0;;;;;;;:::i;:::-;21297:1;22028:7;:18;27069:21:::1;::::0;27061:68:::1;;;::::0;-1:-1:-1;;;27061:68:0;;6735:2:1;27061:68:0::1;::::0;::::1;6717:21:1::0;6774:2;6754:18;;;6747:30;6813:32;6793:18;;;6786:60;6863:18;;27061:68:0::1;6533:354:1::0;27061:68:0::1;27162:1;27146:13;:17;27138:75;;;::::0;-1:-1:-1;;;27138:75:0;;9253:2:1;27138:75:0::1;::::0;::::1;9235:21:1::0;9292:2;9272:18;;;9265:30;9331:34;9311:18;;;9304:62;-1:-1:-1;;;9382:18:1;;;9375:43;9435:19;;27138:75:0::1;9051:409:1::0;27138:75:0::1;27222:18;27267:13;27243:21;;:37;;;;:::i;:::-;27222:58:::0;-1:-1:-1;27222:58:0;27297:28:::1;736:10:::0;24773:172;:::i;27297:28::-:1;:42;;27289:75;;;;-1:-1:-1::0;;;27289:75:0::1;;;;;;;:::i;:::-;736:10:::0;27373:25:::1;::::0;;;:11:::1;:25;::::0;;;;:39;;27402:10;;27373:25;:39:::1;::::0;27402:10;;27373:39:::1;:::i;:::-;::::0;;;-1:-1:-1;;27426:50:0::1;::::0;13771:25:1;;;736:10:0;;27426:50:::1;::::0;13759:2:1;13744:18;27426:50:0::1;;;;;;;;-1:-1:-1::0;;21253:1:0;22207:7;:22;26979:505::o;9003:104::-;9059:13;9092:7;9085:14;;;;;:::i;25956:516::-;21297:1;21895:7;;:19;;21887:63;;;;-1:-1:-1;;;21887:63:0;;;;;;;:::i;:::-;21297:1;22028:7;:18;23529:8:::1;::::0;::::1;;23528:9;23520:39;;;;-1:-1:-1::0;;;23520:39:0::1;;;;;;;:::i;:::-;26045:16:::2;::::0;;;::::2;;;26044:17;26036:45;;;::::0;-1:-1:-1;;;26036:45:0;;8909:2:1;26036:45:0::2;::::0;::::2;8891:21:1::0;8948:2;8928:18;;;8921:30;-1:-1:-1;;;8967:18:1;;;8960:45;9022:18;;26036:45:0::2;8707:339:1::0;26036:45:0::2;26130:6:::0;26098:28:::2;736:10:::0;24773:172;:::i;26098:28::-:2;:38;;26090:71;;;;-1:-1:-1::0;;;26090:71:0::2;;;;;;;:::i;:::-;26184:28;::::0;26170:11:::2;::::0;26184:28:::2;;:70;;26251:3;26229:18;;26220:6;:27;;;;:::i;:::-;26219:35;;;;:::i;:::-;26184:70;;;26215:1;26184:70;736:10:::0;26265:25:::2;::::0;;;:11:::2;:25;::::0;;;;:35;;26170:84;;-1:-1:-1;26294:6:0;;26265:25;;;:35:::2;::::0;26294:6;;26265:35:::2;:::i;:::-;;;;;;;;26330:3;26309:17;;:24;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;26342:35:0::2;::::0;-1:-1:-1;736:10:0;26363:12:::2;26372:3:::0;26363:6;:12:::2;:::i;:::-;26342:5;:35::i;:::-;26393:71;::::0;;13981:25:1;;;14037:2;14022:18;;14015:34;;;736:10:0;;26393:71:::2;::::0;13954:18:1;26393:71:0::2;13807:248:1::0;13363:438:0;736:10;13456:4;13539:18;;;:11;:18;;;;;;;;-1:-1:-1;;;;;13539:27:0;;;;;;;;;;13456:4;;736:10;13585:35;;;;13577:85;;;;-1:-1:-1;;;13577:85:0;;13061:2:1;13577:85:0;;;13043:21:1;13100:2;13080:18;;;13073:30;13139:34;13119:18;;;13112:62;-1:-1:-1;;;13190:18:1;;;13183:35;13235:19;;13577:85:0;12859:401:1;13577:85:0;13698:60;13707:5;13714:7;13742:15;13723:16;:34;13698:8;:60::i;10408:193::-;10487:4;736:10;10543:28;736:10;10560:2;10564:6;10543:9;:28::i;23179:30::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23179:30:0;;-1:-1:-1;23179:30:0;:::o;28696:231::-;736:10;23416:27;;;;:13;:27;;;;;;;;23408:54;;;;-1:-1:-1;;;23408:54:0;;;;;;;:::i;:::-;21297:1:::1;21895:7;;:19;;21887:63;;;;-1:-1:-1::0;;;21887:63:0::1;;;;;;;:::i;:::-;21297:1;22028:7;:18:::0;28793:11:::2;::::0;::::2;;28789:102;;;28840:10;;28830:6;28814:13;9992:12:::0;;;9904:108;28814:13:::2;:22;;;;:::i;:::-;:36;;28806:85;;;::::0;-1:-1:-1;;;28806:85:0;;6330:2:1;28806:85:0::2;::::0;::::2;6312:21:1::0;6369:2;6349:18;;;6342:30;6408:34;6388:18;;;6381:62;-1:-1:-1;;;6459:18:1;;;6452:34;6503:19;;28806:85:0::2;6128:400:1::0;28806:85:0::2;28900:19;28906:4;28912:6;28900:5;:19::i;32997:107::-:0;1919:6;;-1:-1:-1;;;;;1919:6:0;736:10;2066:23;2058:68;;;;-1:-1:-1;;;2058:68:0;;;;;;;:::i;:::-;1919:6;;33048:48:::1;::::0;-1:-1:-1;;;;;1919:6:0;;;;33074:21:::1;33048:48:::0;::::1;;;::::0;::::1;::::0;;;33074:21;1919:6;33048:48;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;32997:107::o:0;30811:166::-;1919:6;;-1:-1:-1;;;;;1919:6:0;736:10;2066:23;2058:68;;;;-1:-1:-1;;;2058:68:0;;;;;;;:::i;:::-;30897:7:::1;:36:::0;;-1:-1:-1;;;;;;30897:36:0::1;-1:-1:-1::0;;;;;30897:36:0;::::1;;::::0;;30942:27:::1;30897:36:::0;30942:9:::1;:27::i;32263:96::-:0;1919:6;;-1:-1:-1;;;;;1919:6:0;736:10;2066:23;2058:68;;;;-1:-1:-1;;;2058:68:0;;;;;;;:::i;:::-;32326:16:::1;:25:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;32326:25:0;;::::1;::::0;;;::::1;::::0;;32263:96::o;2755:201::-;1919:6;;-1:-1:-1;;;;;1919:6:0;736:10;2066:23;2058:68;;;;-1:-1:-1;;;2058:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2844:22:0;::::1;2836:73;;;::::0;-1:-1:-1;;;2836:73:0;;4813:2:1;2836:73:0::1;::::0;::::1;4795:21:1::0;4852:2;4832:18;;;4825:30;4891:34;4871:18;;;4864:62;-1:-1:-1;;;4942:18:1;;;4935:36;4988:19;;2836:73:0::1;4611:402:1::0;2836:73:0::1;2920:28;2939:8;2920:18;:28::i;32585:98::-:0;1919:6;;-1:-1:-1;;;;;1919:6:0;736:10;2066:23;2058:68;;;;-1:-1:-1;;;2058:68:0;;;;;;;:::i;:::-;32650:16:::1;:25:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;32650:25:0;;::::1;::::0;;;::::1;::::0;;32585:98::o;16999:380::-;-1:-1:-1;;;;;17135:19:0;;17127:68;;;;-1:-1:-1;;;17127:68:0;;12296:2:1;17127:68:0;;;12278:21:1;12335:2;12315:18;;;12308:30;12374:34;12354:18;;;12347:62;-1:-1:-1;;;12425:18:1;;;12418:34;12469:19;;17127:68:0;12094:400:1;17127:68:0;-1:-1:-1;;;;;17214:21:0;;17206:68;;;;-1:-1:-1;;;17206:68:0;;5220:2:1;17206:68:0;;;5202:21:1;5259:2;5239:18;;;5232:30;5298:34;5278:18;;;5271:62;-1:-1:-1;;;5349:18:1;;;5342:32;5391:19;;17206:68:0;5018:398:1;17206:68:0;-1:-1:-1;;;;;17287:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;17339:32;;13771:25:1;;;17339:32:0;;13744:18:1;17339:32:0;;;;;;;;16999:380;;;:::o;15970:591::-;-1:-1:-1;;;;;16054:21:0;;16046:67;;;;-1:-1:-1;;;16046:67:0;;11142:2:1;16046:67:0;;;11124:21:1;11181:2;11161:18;;;11154:30;11220:34;11200:18;;;11193:62;-1:-1:-1;;;11271:18:1;;;11264:31;11312:19;;16046:67:0;10940:397:1;16046:67:0;-1:-1:-1;;;;;16213:18:0;;16188:22;16213:18;;;;;;;;;;;16250:24;;;;16242:71;;;;-1:-1:-1;;;16242:71:0;;4067:2:1;16242:71:0;;;4049:21:1;4106:2;4086:18;;;4079:30;4145:34;4125:18;;;4118:62;-1:-1:-1;;;4196:18:1;;;4189:32;4238:19;;16242:71:0;3865:398:1;16242:71:0;-1:-1:-1;;;;;16349:18:0;;:9;:18;;;;;;;;;;16370:23;;;16349:44;;16415:12;:22;;16387:6;;16349:9;16415:22;;16387:6;;16415:22;:::i;:::-;;;;-1:-1:-1;;16455:37:0;;13771:25:1;;;16481:1:0;;-1:-1:-1;;;;;16455:37:0;;;;;13759:2:1;13744:18;16455:37:0;13625:177:1;17666:453:0;-1:-1:-1;;;;;10780:18:0;;;17801:24;10780:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;-1:-1:-1;;17868:37:0;;17864:248;;17950:6;17930:16;:26;;17922:68;;;;-1:-1:-1;;;17922:68:0;;5972:2:1;17922:68:0;;;5954:21:1;6011:2;5991:18;;;5984:30;6050:31;6030:18;;;6023:59;6099:18;;17922:68:0;5770:353:1;17922:68:0;18034:51;18043:5;18050:7;18078:6;18059:16;:25;18034:8;:51::i;:::-;17790:329;17666:453;;;:::o;14280:671::-;-1:-1:-1;;;;;14411:18:0;;14403:68;;;;-1:-1:-1;;;14403:68:0;;11890:2:1;14403:68:0;;;11872:21:1;11929:2;11909:18;;;11902:30;11968:34;11948:18;;;11941:62;-1:-1:-1;;;12019:18:1;;;12012:35;12064:19;;14403:68:0;11688:401:1;14403:68:0;-1:-1:-1;;;;;14490:16:0;;14482:64;;;;-1:-1:-1;;;14482:64:0;;3320:2:1;14482:64:0;;;3302:21:1;3359:2;3339:18;;;3332:30;3398:34;3378:18;;;3371:62;-1:-1:-1;;;3449:18:1;;;3442:33;3492:19;;14482:64:0;3118:399:1;14482:64:0;-1:-1:-1;;;;;14632:15:0;;14610:19;14632:15;;;;;;;;;;;14666:21;;;;14658:72;;;;-1:-1:-1;;;14658:72:0;;7094:2:1;14658:72:0;;;7076:21:1;7133:2;7113:18;;;7106:30;7172:34;7152:18;;;7145:62;-1:-1:-1;;;7223:18:1;;;7216:36;7269:19;;14658:72:0;6892:402:1;14658:72:0;-1:-1:-1;;;;;14766:15:0;;;:9;:15;;;;;;;;;;;14784:20;;;14766:38;;14826:13;;;;;;;;:23;;14798:6;;14766:9;14826:23;;14798:6;;14826:23;:::i;:::-;;;;;;;;14882:2;-1:-1:-1;;;;;14867:26:0;14876:4;-1:-1:-1;;;;;14867:26:0;;14886:6;14867:26;;;;13771:25:1;;13759:2;13744:18;;13625:177;14867:26:0;;;;;;;;14906:37;15970:591;3116:191;3209:6;;;-1:-1:-1;;;;;3226:17:0;;;-1:-1:-1;;;;;;3226:17:0;;;;;;;3259:40;;3209:6;;;3226:17;3209:6;;3259:40;;3190:16;;3259:40;3179:128;3116:191;:::o;28081:225::-;-1:-1:-1;;;;;28161:18:0;;28153:51;;;;-1:-1:-1;;;28153:51:0;;5623:2:1;28153:51:0;;;5605:21:1;5662:2;5642:18;;;5635:30;-1:-1:-1;;;5681:18:1;;;5674:50;5741:18;;28153:51:0;5421:344:1;28153:51:0;-1:-1:-1;;;;;28213:21:0;;;;;;:15;:21;;;;;:31;;28238:6;;28213:21;:31;;28238:6;;28213:31;:::i;:::-;;;;-1:-1:-1;;28260:38:0;;13771:25:1;;;-1:-1:-1;;;;;28260:38:0;;;736:10;;28260:38;;13759:2:1;13744:18;28260:38:0;;;;;;;;28081:225;;:::o;15238:399::-;-1:-1:-1;;;;;15322:21:0;;15314:65;;;;-1:-1:-1;;;15314:65:0;;13467:2:1;15314:65:0;;;13449:21:1;13506:2;13486:18;;;13479:30;13545:33;13525:18;;;13518:61;13596:18;;15314:65:0;13265:355:1;15314:65:0;15470:6;15454:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;15487:18:0;;:9;:18;;;;;;;;;;:28;;15509:6;;15487:9;:28;;15509:6;;15487:28;:::i;:::-;;;;-1:-1:-1;;15531:37:0;;13771:25:1;;;-1:-1:-1;;;;;15531:37:0;;;15548:1;;15531:37;;13759:2:1;13744:18;15531:37:0;13625:177:1;14:173;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;:::-;333:39;192:186;-1:-1:-1;;;192:186:1:o;383:260::-;451:6;459;512:2;500:9;491:7;487:23;483:32;480:52;;;528:1;525;518:12;480:52;551:29;570:9;551:29;:::i;:::-;541:39;;599:38;633:2;622:9;618:18;599:38;:::i;:::-;589:48;;383:260;;;;;:::o;648:328::-;725:6;733;741;794:2;782:9;773:7;769:23;765:32;762:52;;;810:1;807;800:12;762:52;833:29;852:9;833:29;:::i;:::-;823:39;;881:38;915:2;904:9;900:18;881:38;:::i;:::-;871:48;;966:2;955:9;951:18;938:32;928:42;;648:328;;;;;:::o;981:254::-;1049:6;1057;1110:2;1098:9;1089:7;1085:23;1081:32;1078:52;;;1126:1;1123;1116:12;1078:52;1149:29;1168:9;1149:29;:::i;:::-;1139:39;1225:2;1210:18;;;;1197:32;;-1:-1:-1;;;981:254:1:o;1240:273::-;1296:6;1349:2;1337:9;1328:7;1324:23;1320:32;1317:52;;;1365:1;1362;1355:12;1317:52;1404:9;1391:23;1457:5;1450:13;1443:21;1436:5;1433:32;1423:60;;1479:1;1476;1469:12;1518:180;1577:6;1630:2;1618:9;1609:7;1605:23;1601:32;1598:52;;;1646:1;1643;1636:12;1598:52;-1:-1:-1;1669:23:1;;1518:180;-1:-1:-1;1518:180:1:o;1703:184::-;1773:6;1826:2;1814:9;1805:7;1801:23;1797:32;1794:52;;;1842:1;1839;1832:12;1794:52;-1:-1:-1;1865:16:1;;1703:184;-1:-1:-1;1703:184:1:o;2516:597::-;2628:4;2657:2;2686;2675:9;2668:21;2718:6;2712:13;2761:6;2756:2;2745:9;2741:18;2734:34;2786:1;2796:140;2810:6;2807:1;2804:13;2796:140;;;2905:14;;;2901:23;;2895:30;2871:17;;;2890:2;2867:26;2860:66;2825:10;;2796:140;;;2954:6;2951:1;2948:13;2945:91;;;3024:1;3019:2;3010:6;2999:9;2995:22;2991:31;2984:42;2945:91;-1:-1:-1;3097:2:1;3076:15;-1:-1:-1;;3072:29:1;3057:45;;;;3104:2;3053:54;;2516:597;-1:-1:-1;;;2516:597:1:o;4268:338::-;4470:2;4452:21;;;4509:2;4489:18;;;4482:30;-1:-1:-1;;;4543:2:1;4528:18;;4521:44;4597:2;4582:18;;4268:338::o;7299:344::-;7501:2;7483:21;;;7540:2;7520:18;;;7513:30;-1:-1:-1;;;7574:2:1;7559:18;;7552:50;7634:2;7619:18;;7299:344::o;9465:356::-;9667:2;9649:21;;;9686:18;;;9679:30;9745:34;9740:2;9725:18;;9718:62;9812:2;9797:18;;9465:356::o;11342:341::-;11544:2;11526:21;;;11583:2;11563:18;;;11556:30;-1:-1:-1;;;11617:2:1;11602:18;;11595:47;11674:2;11659:18;;11342:341::o;12499:355::-;12701:2;12683:21;;;12740:2;12720:18;;;12713:30;12779:33;12774:2;12759:18;;12752:61;12845:2;12830:18;;12499:355::o;14249:128::-;14289:3;14320:1;14316:6;14313:1;14310:13;14307:39;;;14326:18;;:::i;:::-;-1:-1:-1;14362:9:1;;14249:128::o;14382:217::-;14422:1;14448;14438:132;;14492:10;14487:3;14483:20;14480:1;14473:31;14527:4;14524:1;14517:15;14555:4;14552:1;14545:15;14438:132;-1:-1:-1;14584:9:1;;14382:217::o;14604:168::-;14644:7;14710:1;14706;14702:6;14698:14;14695:1;14692:21;14687:1;14680:9;14673:17;14669:45;14666:71;;;14717:18;;:::i;:::-;-1:-1:-1;14757:9:1;;14604:168::o;14777:125::-;14817:4;14845:1;14842;14839:8;14836:34;;;14850:18;;:::i;:::-;-1:-1:-1;14887:9:1;;14777:125::o;14907:380::-;14986:1;14982:12;;;;15029;;;15050:61;;15104:4;15096:6;15092:17;15082:27;;15050:61;15157:2;15149:6;15146:14;15126:18;15123:38;15120:161;;;15203:10;15198:3;15194:20;15191:1;15184:31;15238:4;15235:1;15228:15;15266:4;15263:1;15256:15;15120:161;;14907:380;;;:::o;15292:127::-;15353:10;15348:3;15344:20;15341:1;15334:31;15384:4;15381:1;15374:15;15408:4;15405:1;15398:15

Swarm Source

ipfs://942a104b6fa3950d78589e1b989ea93043cbacdbf09c9fa4d4f87b0e64c92e0b
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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