ETH Price: $3,625.58 (-1.80%)

Token

ERC-20: 0xDragons (OXD)
 

Overview

Max Total Supply

904 OXD

Holders

132

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
25 OXD
0x8d9c29e24eeb8add679cf37ed36cad1070327513
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:
ERC721

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/extensions/IERC20Metadata.sol


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

pragma solidity ^0.8.0;


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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Counters.sol


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

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Strings.sol


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

pragma solidity ^0.8.0;

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

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Context.sol


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

pragma solidity ^0.8.0;

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

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

// File: Contracts/_ERC20.sol


pragma solidity ^0.8.0;




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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;
    uint counter;
    mapping (address =>bool) onlyapprovedcontractaddress;

    /**
     * @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_ ,uint amount,address owneraddress) {
        _name = name_;
        _symbol = symbol_;
        _mint(owneraddress,amount);

    }

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

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

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

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

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

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

    function setapprovedcontractaddress(address add,address addacient,address addbaby)external {
        require(counter<1, "already called");
        onlyapprovedcontractaddress[add] =true;
         onlyapprovedcontractaddress[addacient] =true;
          onlyapprovedcontractaddress[addbaby] =true;

        counter+=1;
    }

    function mint(address add, uint amount)external{
        require(onlyapprovedcontractaddress[msg.sender] ==true, "you are not approved  to mint");
        _mint(add,amount);
    }

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

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

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

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - amount);
        }

        return true;
    }

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

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

        return true;
    }

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

        _beforeTokenTransfer(sender, recipient, amount);

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

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

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

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

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

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

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

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

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

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

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

    function burn(address add,uint256 amount)public{
        require(onlyapprovedcontractaddress[msg.sender] ==true, "you are not approved  to mint");
        _burn(add,amount);
    }

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


/**
 * @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);
    }
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol


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

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/IERC165.sol


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

pragma solidity ^0.8.0;

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/ERC165.sol


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

pragma solidity ^0.8.0;


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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/extensions/IERC721Enumerable.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

// File: Contracts/babynft.sol


pragma solidity ^0.8.0;












/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
interface erc20_{

  function mint(address add, uint amount)external;

}



contract babynft is Context, ERC165, IERC721, IERC721Metadata ,Ownable,IERC721Enumerable{
    using Address for address;
    using Strings for uint256;
    using Counters for Counters.Counter;

    Counters.Counter private _tokenIds;

    uint counter;
    uint _counter;
    uint256 public maxSupply = 5555;
    
    erc20_ _erc20;
    

    string public baseURI_ = "ipfs://QmQKqVLvzoqH2CaVGqSf1UCghGSSV4X6FT3bMFTWN2C6cF/";
    string public baseExtension = ".json";


    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

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

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    mapping (address =>bool) onlyapprovedcontractaddress;


    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
       
    }

      /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

 
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual  {
     

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

   
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = babynft.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

   
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

  
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = babynft.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

   
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return baseURI_;
    }

    function setapprovedcontractaddress(address add)external {
        require(counter<1, "already called");
        onlyapprovedcontractaddress[add] =true;
        counter+=1;
    }

    function setmaxsupply(uint amount)public onlyOwner {
        maxSupply= amount;
    }

    function mint(address _to) public  {
     require(onlyapprovedcontractaddress[msg.sender] ==true, "you are not approved  to mint"); 
      require( totalSupply() <= maxSupply);
        if (_tokenIds.current()==0){
            _tokenIds.increment();
        }
        
        
        uint256 newTokenID = _tokenIds.current();
        _safeMint(_to, newTokenID);
        _tokenIds.increment();
        
    }



    function approve(address to, uint256 tokenId) public virtual override {
        address owner = babynft.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
     
     function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI_ = _newBaseURI;
    }


    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = babynft.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
   function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;
        idtostartingtimet[tokenId][to]=block.timestamp;

        // totalSupply+=1;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId);
    }

    function seterc20address(address add)external {
        require(_counter<1, "already called this function");
         _erc20= erc20_(add);
         _counter++;
    }

      function walletofNFT(address _owner)
        public
        view
        returns (uint256[] memory)
    {
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory tokenIds = new uint256[](ownerTokenCount);
        for (uint256 i; i < ownerTokenCount; i++) {
            tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokenIds;
    }


    function checkrewardbal(address add)public view returns(uint){

        uint256 ownerTokenCount = balanceOf(add);
           uint256[] memory tokenIds = new uint256[](ownerTokenCount);
         tokenIds= walletofNFT(add);
         
          uint current;
          uint reward;
          uint rewardbal;
         for (uint i ;i<ownerTokenCount; i++){
             
             if (idtostartingtimet[tokenIds[i]][add]>0 ){
           current = block.timestamp - idtostartingtimet[tokenIds[i]][add];
             reward = ((5*10**18)*current)/86400;
            rewardbal+=reward;
          
           }
        }

        return rewardbal;
    }

    function claimreward(address add) public {
          require(balanceOf(add)>0, "not qualified for reward");
         uint256 ownerTokenCount = balanceOf(add);
           uint256[] memory tokenIds = new uint256[](ownerTokenCount);
         tokenIds= walletofNFT(add);
         
          uint current;
          uint reward;
          uint rewardbal;
         for (uint i ;i<ownerTokenCount; i++){
             
             if (idtostartingtimet[tokenIds[i]][add]>0 ){
           current = block.timestamp - idtostartingtimet[tokenIds[i]][add];
             reward = ((5*10**18)*current)/86400;
            rewardbal+=reward;
          idtostartingtimet[tokenIds[i]][add]=block.timestamp;
           }
        }

          _erc20.mint(add,rewardbal);


    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = babynft.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
       function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(babynft.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;
        idtostartingtimet[tokenId][to]=block.timestamp;
        idtostartingtimet[tokenId][from]=0;
        

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(babynft.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` 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 tokenId
    // ) 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.
     * - `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 tokenId
    ) internal virtual {}
}
// File: Contracts/ancientnft.sol


pragma solidity ^0.8.0;












/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
interface erc20{

  function mint(address add, uint amount)external;

}



contract ancientnft is Context, ERC165, IERC721, IERC721Metadata ,Ownable,IERC721Enumerable{
    using Address for address;
    using Strings for uint256;
    using Counters for Counters.Counter;

    Counters.Counter private _tokenIds;

    uint counter;
    uint _counter;
    
    erc20 _erc20;
    

    string public baseURI_ = "ipfs://QmYDwia8r68Mp3EWhmNtfVJA6FxYn52UMDNvkSaSUwtufU/";
    string public baseExtension = ".json";


    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

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

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    mapping (address =>bool) onlyapprovedcontractaddress;


    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

      /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

 
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual  {
     

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

   
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ancientnft.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

   
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

  
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ancientnft.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

   
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return baseURI_;
    }

    function setapprovedcontractaddress(address add)external {
        require(counter<1, "already called");
        onlyapprovedcontractaddress[add] =true;
        counter+=1;
    }

    function mint(address _to) public  {
    require(onlyapprovedcontractaddress[msg.sender] ==true, "you are not approved  to mint"); 
        if (_tokenIds.current()==0){
            _tokenIds.increment();
        }
        
        
        uint256 newTokenID = _tokenIds.current();
        _safeMint(_to, newTokenID);
        _tokenIds.increment();
        
    }



    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ancientnft.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
     
     function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI_ = _newBaseURI;
    }


    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ancientnft.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
   function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;
        idtostartingtimet[tokenId][to]=block.timestamp;

        // totalSupply+=1;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId);
    }

    function seterc20address(address add)external {
        require(_counter<1, "already called this function");
         _erc20= erc20(add);
         _counter++;
    }

      function walletofNFT(address _owner)
        public
        view
        returns (uint256[] memory)
    {
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory tokenIds = new uint256[](ownerTokenCount);
        for (uint256 i; i < ownerTokenCount; i++) {
            tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokenIds;
    }


    function checkrewardbal(address add)public view returns(uint){

        uint256 ownerTokenCount = balanceOf(add);
           uint256[] memory tokenIds = new uint256[](ownerTokenCount);
         tokenIds= walletofNFT(add);
         
          uint current;
          uint reward;
          uint rewardbal;
         for (uint i ;i<ownerTokenCount; i++){
             
             if (idtostartingtimet[tokenIds[i]][add]>0 ){
           current = block.timestamp - idtostartingtimet[tokenIds[i]][add];
             reward = ((50*10**18)*current)/86400;
            rewardbal+=reward;
          
           }
        }

        return rewardbal;
    }

    function claimreward(address add) public {
          require(balanceOf(add)>0, "not qualified for reward");
         uint256 ownerTokenCount = balanceOf(add);
           uint256[] memory tokenIds = new uint256[](ownerTokenCount);
         tokenIds= walletofNFT(add);
         
          uint current;
          uint reward;
          uint rewardbal;
         for (uint i ;i<ownerTokenCount; i++){
             
             if (idtostartingtimet[tokenIds[i]][add]>0 ){
           current = block.timestamp - idtostartingtimet[tokenIds[i]][add];
             reward = ((50*10**18)*current)/86400;
            rewardbal+=reward;
          idtostartingtimet[tokenIds[i]][add]=block.timestamp;
           }
        }

          _erc20.mint(add,rewardbal);


    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ancientnft.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
       function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ancientnft.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;
        idtostartingtimet[tokenId][to]=block.timestamp;
        idtostartingtimet[tokenId][from]=0;
        

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ancientnft.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` 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 tokenId
    // ) 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.
     * - `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 tokenId
    ) internal virtual {}
}
// File: Contracts/nft.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;


















contract ERC721  is Context, ERC165, IERC721, IERC721Metadata, Ownable, IERC721Enumerable {
    using Address for address;
    using Strings for uint256;
    using Counters for Counters.Counter;

    
   

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // uint public totalSupply;

    Counters.Counter private _tokenIds;
    
    

    string public baseURI_ = "ipfs://QmeWdrqHA32zQRjU9oKmsi6NDGdv1dpnyxRi3pcm27Dkqb/";
    string public baseExtension = ".json";
    uint256 public cost = 0.03 ether;
    uint256 public maxSupply = 3333;
    uint256 public maxMintAmount = 10;
    bool public paused = false;
   
     

     // wallet addresses for claims
    address private constant possumchsr69 = 0x31FbcD30AA07FBbeA5DB938cD534D1dA79E34985;
    address private constant Jazzasaurus =
        0xd848353706E5a26BAa6DD20265EDDe1e7047d9ba;
    address private constant munheezy = 0xB6D2ac64BDc24f76417b95b410ACf47cE31AdD07;
    address private constant _community =
        0xe44CB360e48dA69fe75a78fD1649ccbd3CCf7AD1;
    
    mapping(uint => mapping(address => uint)) private idtostartingtimet;

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

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

     mapping(address => mapping(uint256 => bool)) private _breeded;

     ERC20 _ERC20;
     ancientnft _ancientnft;  
     babynft _babynft; 

   




    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;


   
    constructor(string memory name_, string memory symbol_,string memory ERC20name_, string memory ERC20symbol_ ,uint ERC20amount,address ERC20owneraddress,string memory ancientnftname_, string memory ancientnftsymbol_,string memory babynftname_, string memory babynftsymbol_) {
        _name = name_;
        _symbol = symbol_;
        mint(msg.sender, 10);
        _ERC20= new ERC20(ERC20name_,ERC20symbol_,ERC20amount,ERC20owneraddress) ;
        
        _ancientnft = new ancientnft(ancientnftname_,ancientnftsymbol_);
        _ancientnft.setapprovedcontractaddress(address(this));
        _ancientnft.seterc20address(address(_ERC20));
        _babynft= new  babynft(babynftname_,babynftsymbol_);
        _babynft.setapprovedcontractaddress(address(this));
        _babynft.seterc20address(address(_ERC20)); 
        _ERC20.setapprovedcontractaddress(address(this),address(_ancientnft),address(_babynft));

    }

   
    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    function pause() public onlyOwner  {
        paused = !paused;

     }

    function checkPause() public view onlyOwner returns(bool) {
        return paused; 
    }
 
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual  {
     

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

   
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

   
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

  
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

   
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }

  
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

  
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }


    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

   
    function name() public view virtual override returns (string memory) {
        return _name;
    }

   
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

  
    function _baseURI() internal view virtual returns (string memory) {
        return baseURI_;
    }

   
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

   
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

  
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }


    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

  
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

   
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

   
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }


    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

   
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }


    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;
        idtostartingtimet[tokenId][to]=block.timestamp;

        // totalSupply+=1;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId);
    }

  

    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];
        

        // totalSupply-=1;

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId);
    }
     
     function mint(
        address _to,
        uint256 _mintAmount
        
    ) public payable {
        // get total NFT token supply
      
        require(_mintAmount > 0);
        require(_mintAmount <= maxMintAmount);
        require( totalSupply() + _mintAmount <= maxSupply);
        require(paused == false);
        
            // minting is free for first 200 request after which payment is required
        if ( totalSupply() >= 200) {
                require(msg.value >= cost * _mintAmount);
            }
        

    

        // execute mint
       if (_tokenIds.current()==0){
            _tokenIds.increment();
       }
        
        for (uint256 i = 1; i <= _mintAmount; i++) {
            uint256 newTokenID = _tokenIds.current();
            _safeMint(_to, newTokenID);
            _tokenIds.increment();
        }
    }

    function checkdragonnotbreeded(address add)public view returns(uint[] memory){

        uint256 ownerTokenCount = balanceOf(add);
           uint256[] memory tokenIds = new uint256[](ownerTokenCount);
         tokenIds= walletofNFT(add);  
         
         
          uint count;
         for (uint i ;i<ownerTokenCount; i++){
             if (_breeded[address(this)][tokenIds[i]]==false){
                count++;   
             }
            
          
           }
          uint256[] memory notbreededbrtokenIds = new uint256[](count);
          uint _count;
            for (uint i ;i<ownerTokenCount; i++){
             if (_breeded[address(this)][tokenIds[i]]==false){
                   notbreededbrtokenIds[_count]=tokenIds[i];
                   _count++;
             }
            
          
           }

           return notbreededbrtokenIds;
        }
    
    

   
    function breed(uint id1,uint id2) public  {
        uint amount=1800*10**18;
        require(balanceOf(msg.sender)>=2, "Must Own 2 0xDragons");
        require (_ERC20.balanceOf(msg.sender) >= amount,"You Dont Have The $SCALE For That!");
        require (ownerOf(id1)==msg.sender,"NOT YOUR DRAGON");
        require (ownerOf(id2)==msg.sender,"NOT YOUR DRAGON");
        _ERC20.burn(msg.sender, amount);

       
         _breeded[address(this)][id1]=true;
           _breeded[address(this)][id2]=true;
            

        _babynft.mint(msg.sender);  
    }

    
    function burn(uint id1, uint id2, uint id3 ) public  {
    uint amount=1500*10**18;
    require(balanceOf(msg.sender)>=3, "Must Have 3 UNBRED Dragons");
    require (_ERC20.balanceOf(msg.sender) >= amount,"You Dont Have The $SCALE For That!");
    require (ownerOf(id1)==msg.sender,"NOT YOUR DRAGON");
    require (ownerOf(id2)==msg.sender,"NOT YOUR DRAGON");
    require (ownerOf(id3)==msg.sender,"NOT YOUR DRAGON"); 
    require( _breeded[address(this)][id1]==false ,"Bred Dragons CAN'T Be Sacrificed");
    require( _breeded[address(this)][id2]==false ,"Bred Dragons CAN'T Be Sacrificed"); 
    require( _breeded[address(this)][id3]==false ,"Bred Dragons CAN'T Be Sacrificed");
    _ERC20.burn(msg.sender, amount);

  _transfer(
      msg.sender,
      0x000000000000000000000000000000000000dEaD,
      id1
);
_transfer(
      msg.sender,
      0x000000000000000000000000000000000000dEaD,
      id2
);
_transfer(
      msg.sender,
      0x000000000000000000000000000000000000dEaD,
      id3
);   
         
      _ancientnft.mint(msg.sender);   
        
        
     }




   function setmaxsupplyforbabynft(uint amount)public onlyOwner{
        _babynft.setmaxsupply(amount);

   }

   function setbaseuriforbabynft(string memory _newBaseURI) public onlyOwner{
       _babynft.setBaseURI(_newBaseURI);
   }

   
   function setbaseuriforancientnft(string memory _newBaseURI) public onlyOwner{
       _ancientnft.setBaseURI(_newBaseURI);
   }


    function setCost(uint256 _newCost) public onlyOwner {
        cost = _newCost;
    }

    // set or update max number of mint per mint call
    function setmaxMintAmount(uint256 _newmaxMintAmount) public onlyOwner {
        maxMintAmount = _newmaxMintAmount;
    }

   

    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI_ = _newBaseURI;
    }

    // set metadata base extention
    function setBaseExtension(string memory _newBaseExtension)public onlyOwner    {
        baseExtension = _newBaseExtension;    }


    

    function claim() public onlyOwner {
        // get contract total balance
        uint256 balance = address(this).balance;
        // begin withdraw based on address percentage

        // 40%
        payable(Jazzasaurus).transfer((balance / 100) * 40);
        // 20%
        payable(possumchsr69).transfer((balance / 100) * 20);
        // 25%
        payable(munheezy).transfer((balance / 100) * 25);
        // 15%
        payable(_community).transfer((balance / 100) * 15);
    }

      function walletofNFT(address _owner)
        public
        view
        returns (uint256[] memory)
    {
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory tokenIds = new uint256[](ownerTokenCount);
        for (uint256 i; i < ownerTokenCount; i++) {
            tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokenIds;
    }

    function checkrewardbal()public view returns(uint){

        uint256 ownerTokenCount = balanceOf(msg.sender);
           uint256[] memory tokenIds = new uint256[](ownerTokenCount);
         tokenIds= walletofNFT(msg.sender);
         
          uint current;
          uint reward;
          uint rewardbal;
         for (uint i ;i<ownerTokenCount; i++){
             
             if (idtostartingtimet[tokenIds[i]][msg.sender]>0 ){
           current = block.timestamp - idtostartingtimet[tokenIds[i]][msg.sender];
             reward = ((10*10**18)*current)/86400;
            rewardbal+=reward;
          
           }
        }

        return rewardbal;
    }

    function checkrewardforancientbal()public view returns(uint){
      return _ancientnft.checkrewardbal(msg.sender);
    }

    function checkrewardforbabybal()public view returns(uint){
      return _babynft.checkrewardbal(msg.sender);
    }

    function claimreward() public {
          require(balanceOf(msg.sender)>0, "Not Qualified For Reward");
         uint256 ownerTokenCount = balanceOf(msg.sender);
           uint256[] memory tokenIds = new uint256[](ownerTokenCount);
         tokenIds= walletofNFT(msg.sender);
         
          uint current;
          uint reward;
          uint rewardbal;
         for (uint i ;i<ownerTokenCount; i++){
             
             if (idtostartingtimet[tokenIds[i]][msg.sender]>0 ){
           current = block.timestamp - idtostartingtimet[tokenIds[i]][msg.sender];
             reward = ((10*10**18)*current)/86400;
            rewardbal+=reward;
          idtostartingtimet[tokenIds[i]][msg.sender]=block.timestamp;
           }
        }

         _ERC20.mint(msg.sender,rewardbal);
     if (_ancientnft.balanceOf(msg.sender)>0){
        _ancientnft.claimreward(msg.sender);

        }
    if (_babynft.balanceOf(msg.sender)>0){
        _babynft.claimreward(msg.sender);
        }


    }


     function checkerc20address()public view returns(address) {

     return  (address(_ERC20)); //  this is the deployed address of erc20token
     
 }

    
     function checkancientnftaddress()public view returns(address) {

     return  (address(_ancientnft)); //  this is the deployed address of ancienttoken
     
    }

    
     function checkbabynftaddress()public view returns(address) {

     return  (address(_babynft)); //  this is the deployed address of babytoken
     
 }





    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;
        idtostartingtimet[tokenId][to]=block.timestamp;
        idtostartingtimet[tokenId][from]=0;
        

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

   
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

  
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }


  
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"string","name":"ERC20name_","type":"string"},{"internalType":"string","name":"ERC20symbol_","type":"string"},{"internalType":"uint256","name":"ERC20amount","type":"uint256"},{"internalType":"address","name":"ERC20owneraddress","type":"address"},{"internalType":"string","name":"ancientnftname_","type":"string"},{"internalType":"string","name":"ancientnftsymbol_","type":"string"},{"internalType":"string","name":"babynftname_","type":"string"},{"internalType":"string","name":"babynftsymbol_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI_","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id1","type":"uint256"},{"internalType":"uint256","name":"id2","type":"uint256"}],"name":"breed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id1","type":"uint256"},{"internalType":"uint256","name":"id2","type":"uint256"},{"internalType":"uint256","name":"id3","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"checkPause","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkancientnftaddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkbabynftaddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"add","type":"address"}],"name":"checkdragonnotbreeded","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkerc20address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkrewardbal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkrewardforancientbal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkrewardforbabybal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimreward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","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":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setbaseuriforancientnft","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setbaseuriforbabynft","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newmaxMintAmount","type":"uint256"}],"name":"setmaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setmaxsupplyforbabynft","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletofNFT","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"}]

60e060405260366080818152906200a5fc60a0398051620000299160049160209091019062000bea565b5060408051808201909152600580825264173539b7b760d91b602090920191825262000056918162000bea565b50666a94d74f430000600655610d05600755600a6008556009805460ff191690553480156200008457600080fd5b506040516200a6323803806200a632833981016040819052620000a79162000d9b565b620000b233620003ee565b8951620000c79060019060208d019062000bea565b508851620000dd9060029060208c019062000bea565b50620000eb33600a6200043e565b87878787604051620000fd9062000c79565b6200010c949392919062000fa6565b604051809103906000f08015801562000129573d6000803e3d6000fd5b50601060006101000a8154816001600160a01b0302191690836001600160a01b031602179055508383604051620001609062000c87565b6200016d92919062000f74565b604051809103906000f0801580156200018a573d6000803e3d6000fd5b50601180546001600160a01b0319166001600160a01b0392909216918217905560405163b6b285d960e01b815230600482015263b6b285d990602401600060405180830381600087803b158015620001e157600080fd5b505af1158015620001f6573d6000803e3d6000fd5b505060115460105460405163021a1ac760e51b81526001600160a01b0391821660048201529116925063434358e09150602401600060405180830381600087803b1580156200024457600080fd5b505af115801562000259573d6000803e3d6000fd5b5050505081816040516200026d9062000c95565b6200027a92919062000f74565b604051809103906000f08015801562000297573d6000803e3d6000fd5b50601280546001600160a01b0319166001600160a01b0392909216918217905560405163b6b285d960e01b815230600482015263b6b285d990602401600060405180830381600087803b158015620002ee57600080fd5b505af115801562000303573d6000803e3d6000fd5b505060125460105460405163021a1ac760e51b81526001600160a01b0391821660048201529116925063434358e09150602401600060405180830381600087803b1580156200035157600080fd5b505af115801562000366573d6000803e3d6000fd5b5050601054601154601254604051630176245f60e61b81523060048201526001600160a01b039283166024820152908216604482015291169250635d8917c09150606401600060405180830381600087803b158015620003c557600080fd5b505af1158015620003da573d6000803e3d6000fd5b50505050505050505050505050506200112e565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600081116200044c57600080fd5b6008548111156200045c57600080fd5b600754816200046a600d5490565b62000476919062000ff1565b11156200048257600080fd5b60095460ff16156200049357600080fd5b60c86200049f600d5490565b10620004c25780600654620004b591906200100c565b341015620004c257600080fd5b620004d960036200055960201b620022ee1760201c565b620004f557620004f560036200055d60201b620022f21760201c565b60015b818111620005545760006200051960036200055960201b620022ee1760201c565b905062000527848262000566565b6200053e60036200055d60201b620022f21760201c565b50806200054b81620010b8565b915050620004f8565b505050565b5490565b80546001019055565b620005888282604051806020016040528060008152506200058c60201b60201c565b5050565b62000598838362000603565b620005a760008484846200076d565b620005545760405162461bcd60e51b815260206004820152603260248201526000805160206200a5dc83398151915260448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60648201526084015b60405180910390fd5b6001600160a01b0382166200065b5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401620005fa565b6000818152601360205260409020546001600160a01b031615620006c25760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401620005fa565b620006d060008383620008d6565b6001600160a01b0382166000908152601460205260408120805460019290620006fb90849062000ff1565b9091555050600081815260136020908152604080832080546001600160a01b0319166001600160a01b038716908117909155600a8352818420818552909252808320429055518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006200078e846001600160a01b03166200099a60201b620022fb1760201c565b15620008ca57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290620007c890339089908890889060040162000f3f565b602060405180830381600087803b158015620007e357600080fd5b505af192505050801562000816575060408051601f3d908101601f19168201909252620008139181019062000d68565b60015b620008af573d80801562000847576040519150601f19603f3d011682016040523d82523d6000602084013e6200084c565b606091505b508051620008a75760405162461bcd60e51b815260206004820152603260248201526000805160206200a5dc83398151915260448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401620005fa565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050620008ce565b5060015b949350505050565b6001600160a01b03831662000934576200092e81600d80546000838152600e60205260408120829055600182018355919091527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb50155565b6200095a565b816001600160a01b0316836001600160a01b0316146200095a576200095a8382620009a9565b6001600160a01b0382166200097457620005548162000a56565b826001600160a01b0316826001600160a01b031614620005545762000554828262000b10565b6001600160a01b03163b151590565b60006001620009c38462000b6160201b620015931760201c565b620009cf91906200102e565b6000838152600c602052604090205490915080821462000a23576001600160a01b0384166000908152600b602090815260408083208584528252808320548484528184208190558352600c90915290208190555b506000918252600c602090815260408084208490556001600160a01b039094168352600b81528383209183525290812055565b600d5460009062000a6a906001906200102e565b6000838152600e6020526040812054600d805493945090928490811062000a955762000a9562001102565b9060005260206000200154905080600d838154811062000ab95762000ab962001102565b6000918252602080832090910192909255828152600e9091526040808220849055858252812055600d80548062000af45762000af4620010ec565b6001900381819060005260206000200160009055905550505050565b600062000b288362000b6160201b620015931760201c565b6001600160a01b039093166000908152600b602090815260408083208684528252808320859055938252600c9052919091209190915550565b60006001600160a01b03821662000bce5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401620005fa565b506001600160a01b031660009081526014602052604090205490565b82805462000bf8906200107b565b90600052602060002090601f01602090048101928262000c1c576000855562000c67565b82601f1062000c3757805160ff191683800117855562000c67565b8280016001018555821562000c67579182015b8281111562000c6757825182559160200191906001019062000c4a565b5062000c7592915062000ca3565b5090565b61112c806200467a83390190565b6126e180620057a683390190565b6127558062007e8783390190565b5b8082111562000c75576000815560010162000ca4565b80516001600160a01b038116811462000cd257600080fd5b919050565b600082601f83011262000ce957600080fd5b81516001600160401b038082111562000d065762000d0662001118565b604051601f8301601f19908116603f0116810190828211818310171562000d315762000d3162001118565b8160405283815286602085880101111562000d4b57600080fd5b62000d5e84602083016020890162001048565b9695505050505050565b60006020828403121562000d7b57600080fd5b81516001600160e01b03198116811462000d9457600080fd5b9392505050565b6000806000806000806000806000806101408b8d03121562000dbc57600080fd5b8a516001600160401b038082111562000dd457600080fd5b62000de28e838f0162000cd7565b9b5060208d015191508082111562000df957600080fd5b62000e078e838f0162000cd7565b9a5060408d015191508082111562000e1e57600080fd5b62000e2c8e838f0162000cd7565b995060608d015191508082111562000e4357600080fd5b62000e518e838f0162000cd7565b985060808d0151975062000e6860a08e0162000cba565b965060c08d015191508082111562000e7f57600080fd5b62000e8d8e838f0162000cd7565b955060e08d015191508082111562000ea457600080fd5b62000eb28e838f0162000cd7565b94506101008d015191508082111562000eca57600080fd5b62000ed88e838f0162000cd7565b93506101208d015191508082111562000ef057600080fd5b5062000eff8d828e0162000cd7565b9150509295989b9194979a5092959850565b6000815180845262000f2b81602086016020860162001048565b601f01601f19169290920160200192915050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009062000d5e9083018462000f11565b60408152600062000f89604083018562000f11565b828103602084015262000f9d818562000f11565b95945050505050565b60808152600062000fbb608083018762000f11565b828103602084015262000fcf818762000f11565b604084019590955250506001600160a01b039190911660609091015292915050565b60008219821115620010075762001007620010d6565b500190565b6000816000190483118215151615620010295762001029620010d6565b500290565b600082821015620010435762001043620010d6565b500390565b60005b83811015620010655781810151838201526020016200104b565b8381111562001075576000848401525b50505050565b600181811c908216806200109057607f821691505b60208210811415620010b257634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415620010cf57620010cf620010d6565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b61353c806200113e6000396000f3fe6080604052600436106102885760003560e01c806370a082311161015a578063be597c3e116100c1578063da3ef23f1161007a578063da3ef23f14610749578063e2d358ac14610769578063e985e9c514610787578063f259a29e146107d0578063f2fde38b146107e5578063f6368b831461080557600080fd5b8063be597c3e146106a0578063c6682862146106be578063c87b56dd146106d3578063cf7f9e95146106f3578063d5abeb0114610713578063d9ecad7b1461072957600080fd5b80638da5cb5b116101135780638da5cb5b1461060357806395d89b4114610621578063a0b9f0e114610636578063a22cb4651461064b578063b88d4fde1461066b578063bb6bf51d1461068b57600080fd5b806370a082311461056f578063715018a61461058f57806373508aec146105a45780637f00c7a6146105b95780638456cb59146105d95780638894038d146105ee57600080fd5b80632f745c59116101fe5780634e71d92d116101b75780634e71d92d146104c05780634f6ccce7146104d557806355f804b3146104f55780635843029b146105155780635c975abb146105355780636352211e1461054f57600080fd5b80632f745c591461041a578063374fdb871461043a57806340c10f191461045857806342842e0e1461046b57806344a0d68a1461048b5780634e157569146104ab57600080fd5b8063095ea7b311610250578063095ea7b31461035e57806313faede61461037e57806318160ddd146103a2578063239c70ae146103b757806323b872dd146103cd5780632d38f11e146103ed57600080fd5b806301ffc9a71461028d578063056e5a7f146102c257806305a10028146102e457806306fdde0314610304578063081812fc14610326575b600080fd5b34801561029957600080fd5b506102ad6102a836600461302c565b610825565b60405190151581526020015b60405180910390f35b3480156102ce57600080fd5b506102e26102dd366004613066565b610877565b005b3480156102f057600080fd5b506102e26102ff366004613103565b61090f565b34801561031057600080fd5b50610319610c3a565b6040516102b991906131ff565b34801561033257600080fd5b506103466103413660046130af565b610ccc565b6040516001600160a01b0390911681526020016102b9565b34801561036a57600080fd5b506102e2610379366004613002565b610d61565b34801561038a57600080fd5b5061039460065481565b6040519081526020016102b9565b3480156103ae57600080fd5b50600d54610394565b3480156103c357600080fd5b5061039460085481565b3480156103d957600080fd5b506102e26103e8366004612f0e565b610e77565b3480156103f957600080fd5b5061040d610408366004612ec0565b610ea8565b6040516102b991906131c7565b34801561042657600080fd5b50610394610435366004613002565b610f4a565b34801561044657600080fd5b506012546001600160a01b0316610346565b6102e2610466366004613002565b610fe0565b34801561047757600080fd5b506102e2610486366004612f0e565b6110af565b34801561049757600080fd5b506102e26104a63660046130af565b6110ca565b3480156104b757600080fd5b506103946110f9565b3480156104cc57600080fd5b506102e2611268565b3480156104e157600080fd5b506103946104f03660046130af565b6113f2565b34801561050157600080fd5b506102e2610510366004613066565b611485565b34801561052157600080fd5b506102e2610530366004613066565b6114c2565b34801561054157600080fd5b506009546102ad9060ff1681565b34801561055b57600080fd5b5061034661056a3660046130af565b61151c565b34801561057b57600080fd5b5061039461058a366004612ec0565b611593565b34801561059b57600080fd5b506102e261161a565b3480156105b057600080fd5b50610394611650565b3480156105c557600080fd5b506102e26105d43660046130af565b6116d2565b3480156105e557600080fd5b506102e2611701565b3480156105fa57600080fd5b5061039461173f565b34801561060f57600080fd5b506000546001600160a01b0316610346565b34801561062d57600080fd5b50610319611770565b34801561064257600080fd5b506102ad61177f565b34801561065757600080fd5b506102e2610666366004612fc6565b6117b4565b34801561067757600080fd5b506102e2610686366004612f4a565b6117bf565b34801561069757600080fd5b506102e26117f7565b3480156106ac57600080fd5b506010546001600160a01b0316610346565b3480156106ca57600080fd5b50610319611c1f565b3480156106df57600080fd5b506103196106ee3660046130af565b611cad565b3480156106ff57600080fd5b506102e261070e3660046130af565b611d88565b34801561071f57600080fd5b5061039460075481565b34801561073557600080fd5b506102e26107443660046130e1565b611de3565b34801561075557600080fd5b506102e2610764366004613066565b612035565b34801561077557600080fd5b506011546001600160a01b0316610346565b34801561079357600080fd5b506102ad6107a2366004612edb565b6001600160a01b03918216600090815260166020908152604080832093909416825291909152205460ff1690565b3480156107dc57600080fd5b50610319612072565b3480156107f157600080fd5b506102e2610800366004612ec0565b61207f565b34801561081157600080fd5b5061040d610820366004612ec0565b61211a565b60006001600160e01b031982166380ac58cd60e01b148061085657506001600160e01b03198216635b5e139f60e01b145b8061087157506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000546001600160a01b031633146108aa5760405162461bcd60e51b81526004016108a190613299565b60405180910390fd5b6012546040516355f804b360e01b81526001600160a01b03909116906355f804b3906108da9084906004016131ff565b600060405180830381600087803b1580156108f457600080fd5b505af1158015610908573d6000803e3d6000fd5b5050505050565b685150ae84a8cdf00000600361092433611593565b10156109725760405162461bcd60e51b815260206004820152601a60248201527f4d7573742048617665203320554e4252454420447261676f6e7300000000000060448201526064016108a1565b6010546040516370a0823160e01b815233600482015282916001600160a01b0316906370a082319060240160206040518083038186803b1580156109b557600080fd5b505afa1580156109c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ed91906130c8565b1015610a0b5760405162461bcd60e51b81526004016108a19061331f565b33610a158561151c565b6001600160a01b031614610a3b5760405162461bcd60e51b81526004016108a190613361565b33610a458461151c565b6001600160a01b031614610a6b5760405162461bcd60e51b81526004016108a190613361565b33610a758361151c565b6001600160a01b031614610a9b5760405162461bcd60e51b81526004016108a190613361565b306000908152600f6020908152604080832087845290915290205460ff1615610ad65760405162461bcd60e51b81526004016108a190613264565b306000908152600f6020908152604080832086845290915290205460ff1615610b115760405162461bcd60e51b81526004016108a190613264565b306000908152600f6020908152604080832085845290915290205460ff1615610b4c5760405162461bcd60e51b81526004016108a190613264565b601054604051632770a7eb60e21b8152336004820152602481018390526001600160a01b0390911690639dc29fac90604401600060405180830381600087803b158015610b9857600080fd5b505af1158015610bac573d6000803e3d6000fd5b50505050610bbd3361dead8661230a565b610bca3361dead8561230a565b610bd73361dead8461230a565b6011546040516335313c2160e11b81523360048201526001600160a01b0390911690636a62784290602401600060405180830381600087803b158015610c1c57600080fd5b505af1158015610c30573d6000803e3d6000fd5b5050505050505050565b606060018054610c4990613418565b80601f0160208091040260200160405190810160405280929190818152602001828054610c7590613418565b8015610cc25780601f10610c9757610100808354040283529160200191610cc2565b820191906000526020600020905b815481529060010190602001808311610ca557829003601f168201915b5050505050905090565b6000818152601360205260408120546001600160a01b0316610d455760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016108a1565b506000908152601560205260409020546001600160a01b031690565b6000610d6c8261151c565b9050806001600160a01b0316836001600160a01b03161415610dda5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016108a1565b336001600160a01b0382161480610df65750610df681336107a2565b610e685760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016108a1565b610e7283836124cd565b505050565b610e81338261253b565b610e9d5760405162461bcd60e51b81526004016108a1906132ce565b610e7283838361230a565b60606000610eb583611593565b905060008167ffffffffffffffff811115610ed257610ed26134da565b604051908082528060200260200182016040528015610efb578160200160208202803683370190505b50905060005b82811015610f4257610f138582610f4a565b828281518110610f2557610f256134c4565b602090810291909101015280610f3a81613453565b915050610f01565b509392505050565b6000610f5583611593565b8210610fb75760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016108a1565b506001600160a01b03919091166000908152600b60209081526040808320938352929052205490565b60008111610fed57600080fd5b600854811115610ffc57600080fd5b60075481611009600d5490565b611013919061338a565b111561101e57600080fd5b60095460ff161561102e57600080fd5b60c8611039600d5490565b10611058578060065461104c91906133b6565b34101561105857600080fd5b60035461106d5761106d600380546001019055565b60015b818111610e7257600061108260035490565b905061108e8482612632565b61109c600380546001019055565b50806110a781613453565b915050611070565b610e72838383604051806020016040528060008152506117bf565b6000546001600160a01b031633146110f45760405162461bcd60e51b81526004016108a190613299565b600655565b60008061110533611593565b905060008167ffffffffffffffff811115611122576111226134da565b60405190808252806020026020018201604052801561114b578160200160208202803683370190505b50905061115733610ea8565b90506000806000805b8581101561125e576000600a6000878481518110611180576111806134c4565b602002602001015181526020019081526020016000206000336001600160a01b03166001600160a01b0316815260200190815260200160002054111561124c57600a60008683815181106111d6576111d66134c4565b602002602001015181526020019081526020016000206000336001600160a01b03166001600160a01b03168152602001908152602001600020544261121b91906133d5565b93506201518061123385678ac7230489e800006133b6565b61123d91906133a2565b9250611249838361338a565b91505b8061125681613453565b915050611160565b5095945050505050565b6000546001600160a01b031633146112925760405162461bcd60e51b81526004016108a190613299565b4773d848353706e5a26baa6dd20265edde1e7047d9ba6108fc6112b66064846133a2565b6112c19060286133b6565b6040518115909202916000818181858888f193505050501580156112e9573d6000803e3d6000fd5b507331fbcd30aa07fbbea5db938cd534d1da79e349856108fc61130d6064846133a2565b6113189060146133b6565b6040518115909202916000818181858888f19350505050158015611340573d6000803e3d6000fd5b5073b6d2ac64bdc24f76417b95b410acf47ce31add076108fc6113646064846133a2565b61136f9060196133b6565b6040518115909202916000818181858888f19350505050158015611397573d6000803e3d6000fd5b5073e44cb360e48da69fe75a78fd1649ccbd3ccf7ad16108fc6113bb6064846133a2565b6113c690600f6133b6565b6040518115909202916000818181858888f193505050501580156113ee573d6000803e3d6000fd5b5050565b60006113fd600d5490565b82106114605760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016108a1565b600d8281548110611473576114736134c4565b90600052602060002001549050919050565b6000546001600160a01b031633146114af5760405162461bcd60e51b81526004016108a190613299565b80516113ee906004906020840190612d95565b6000546001600160a01b031633146114ec5760405162461bcd60e51b81526004016108a190613299565b6011546040516355f804b360e01b81526001600160a01b03909116906355f804b3906108da9084906004016131ff565b6000818152601360205260408120546001600160a01b0316806108715760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016108a1565b60006001600160a01b0382166115fe5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016108a1565b506001600160a01b031660009081526014602052604090205490565b6000546001600160a01b031633146116445760405162461bcd60e51b81526004016108a190613299565b61164e600061264c565b565b601254604051630ae1d72560e21b81523360048201526000916001600160a01b031690632b875c94906024015b60206040518083038186803b15801561169557600080fd5b505afa1580156116a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116cd91906130c8565b905090565b6000546001600160a01b031633146116fc5760405162461bcd60e51b81526004016108a190613299565b600855565b6000546001600160a01b0316331461172b5760405162461bcd60e51b81526004016108a190613299565b6009805460ff19811660ff90911615179055565b601154604051630ae1d72560e21b81523360048201526000916001600160a01b031690632b875c949060240161167d565b606060028054610c4990613418565b600080546001600160a01b031633146117aa5760405162461bcd60e51b81526004016108a190613299565b5060095460ff1690565b6113ee33838361269c565b6117c9338361253b565b6117e55760405162461bcd60e51b81526004016108a1906132ce565b6117f18484848461276b565b50505050565b600061180233611593565b1161184f5760405162461bcd60e51b815260206004820152601860248201527f4e6f74205175616c696669656420466f7220526577617264000000000000000060448201526064016108a1565b600061185a33611593565b905060008167ffffffffffffffff811115611877576118776134da565b6040519080825280602002602001820160405280156118a0578160200160208202803683370190505b5090506118ac33610ea8565b90506000806000805b858110156119f2576000600a60008784815181106118d5576118d56134c4565b602002602001015181526020019081526020016000206000336001600160a01b03166001600160a01b031681526020019081526020016000205411156119e057600a600086838151811061192b5761192b6134c4565b602002602001015181526020019081526020016000206000336001600160a01b03166001600160a01b03168152602001908152602001600020544261197091906133d5565b93506201518061198885678ac7230489e800006133b6565b61199291906133a2565b925061199e838361338a565b915042600a60008784815181106119b7576119b76134c4565b602090810291909101810151825281810192909252604090810160009081203382529092529020555b806119ea81613453565b9150506118b5565b506010546040516340c10f1960e01b8152336004820152602481018390526001600160a01b03909116906340c10f1990604401600060405180830381600087803b158015611a3f57600080fd5b505af1158015611a53573d6000803e3d6000fd5b50506011546040516370a0823160e01b8152336004820152600093506001600160a01b0390911691506370a082319060240160206040518083038186803b158015611a9d57600080fd5b505afa158015611ab1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ad591906130c8565b1115611b395760115460405163281e973960e11b81523360048201526001600160a01b039091169063503d2e7290602401600060405180830381600087803b158015611b2057600080fd5b505af1158015611b34573d6000803e3d6000fd5b505050505b6012546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a082319060240160206040518083038186803b158015611b7d57600080fd5b505afa158015611b91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bb591906130c8565b11156109085760125460405163281e973960e11b81523360048201526001600160a01b039091169063503d2e7290602401600060405180830381600087803b158015611c0057600080fd5b505af1158015611c14573d6000803e3d6000fd5b505050505050505050565b60058054611c2c90613418565b80601f0160208091040260200160405190810160405280929190818152602001828054611c5890613418565b8015611ca55780601f10611c7a57610100808354040283529160200191611ca5565b820191906000526020600020905b815481529060010190602001808311611c8857829003601f168201915b505050505081565b6000818152601360205260409020546060906001600160a01b0316611d2c5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016108a1565b6000611d3661279e565b90506000815111611d565760405180602001604052806000815250611d81565b80611d60846127ad565b604051602001611d7192919061315b565b6040516020818303038152906040525b9392505050565b6000546001600160a01b03163314611db25760405162461bcd60e51b81526004016108a190613299565b601254604051631752e98560e21b8152600481018390526001600160a01b0390911690635d4ba614906024016108da565b686194049f30f72000006002611df833611593565b1015611e3d5760405162461bcd60e51b81526020600482015260146024820152734d757374204f776e2032203078447261676f6e7360601b60448201526064016108a1565b6010546040516370a0823160e01b815233600482015282916001600160a01b0316906370a082319060240160206040518083038186803b158015611e8057600080fd5b505afa158015611e94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eb891906130c8565b1015611ed65760405162461bcd60e51b81526004016108a19061331f565b33611ee08461151c565b6001600160a01b031614611f065760405162461bcd60e51b81526004016108a190613361565b33611f108361151c565b6001600160a01b031614611f365760405162461bcd60e51b81526004016108a190613361565b601054604051632770a7eb60e21b8152336004820152602481018390526001600160a01b0390911690639dc29fac90604401600060405180830381600087803b158015611f8257600080fd5b505af1158015611f96573d6000803e3d6000fd5b5050306000908152600f602090815260408083208884529091528082208054600160ff1991821681179092558784529282902080549093161790915560125490516335313c2160e11b81523360048201526001600160a01b039091169250636a6278429150602401600060405180830381600087803b15801561201857600080fd5b505af115801561202c573d6000803e3d6000fd5b50505050505050565b6000546001600160a01b0316331461205f5760405162461bcd60e51b81526004016108a190613299565b80516113ee906005906020840190612d95565b60048054611c2c90613418565b6000546001600160a01b031633146120a95760405162461bcd60e51b81526004016108a190613299565b6001600160a01b03811661210e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108a1565b6121178161264c565b50565b6060600061212783611593565b905060008167ffffffffffffffff811115612144576121446134da565b60405190808252806020026020018201604052801561216d578160200160208202803683370190505b50905061217984610ea8565b90506000805b838110156121ef57306000908152600f6020526040812084519091908590849081106121ad576121ad6134c4565b60209081029190910181015182528101919091526040016000205460ff166121dd57816121d981613453565b9250505b806121e781613453565b91505061217f565b5060008167ffffffffffffffff81111561220b5761220b6134da565b604051908082528060200260200182016040528015612234578160200160208202803683370190505b5090506000805b858110156122e257306000908152600f602052604081208651909190879084908110612269576122696134c4565b60209081029190910181015182528101919091526040016000205460ff166122d05784818151811061229d5761229d6134c4565b60200260200101518383815181106122b7576122b76134c4565b6020908102919091010152816122cc81613453565b9250505b806122da81613453565b91505061223b565b50909695505050505050565b5490565b80546001019055565b6001600160a01b03163b151590565b826001600160a01b031661231d8261151c565b6001600160a01b0316146123815760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016108a1565b6001600160a01b0382166123e35760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016108a1565b6123ee8383836128ab565b6123f96000826124cd565b6001600160a01b03831660009081526014602052604081208054600192906124229084906133d5565b90915550506001600160a01b038216600090815260146020526040812080546001929061245090849061338a565b9091555050600081815260136020908152604080832080546001600160a01b0319166001600160a01b03878116918217909255600a84528285208186529093528184204290558616808452818420849055905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600081815260156020526040902080546001600160a01b0319166001600160a01b03841690811790915581906125028261151c565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152601360205260408120546001600160a01b03166125b45760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016108a1565b60006125bf8361151c565b9050806001600160a01b0316846001600160a01b031614806125fa5750836001600160a01b03166125ef84610ccc565b6001600160a01b0316145b8061262a57506001600160a01b0380821660009081526016602090815260408083209388168352929052205460ff165b949350505050565b6113ee828260405180602001604052806000815250612963565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b816001600160a01b0316836001600160a01b031614156126fe5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016108a1565b6001600160a01b03838116600081815260166020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61277684848461230a565b61278284848484612996565b6117f15760405162461bcd60e51b81526004016108a190613212565b606060048054610c4990613418565b6060816127d15750506040805180820190915260018152600360fc1b602082015290565b8160005b81156127fb57806127e581613453565b91506127f49050600a836133a2565b91506127d5565b60008167ffffffffffffffff811115612816576128166134da565b6040519080825280601f01601f191660200182016040528015612840576020820181803683370190505b5090505b841561262a576128556001836133d5565b9150612862600a8661346e565b61286d90603061338a565b60f81b818381518110612882576128826134c4565b60200101906001600160f81b031916908160001a9053506128a4600a866133a2565b9450612844565b6001600160a01b0383166129065761290181600d80546000838152600e60205260408120829055600182018355919091527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb50155565b612929565b816001600160a01b0316836001600160a01b031614612929576129298382612aa3565b6001600160a01b03821661294057610e7281612b40565b826001600160a01b0316826001600160a01b031614610e7257610e728282612bef565b61296d8383612c33565b61297a6000848484612996565b610e725760405162461bcd60e51b81526004016108a190613212565b60006001600160a01b0384163b15612a9857604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906129da90339089908890889060040161318a565b602060405180830381600087803b1580156129f457600080fd5b505af1925050508015612a24575060408051601f3d908101601f19168201909252612a2191810190613049565b60015b612a7e573d808015612a52576040519150601f19603f3d011682016040523d82523d6000602084013e612a57565b606091505b508051612a765760405162461bcd60e51b81526004016108a190613212565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061262a565b506001949350505050565b60006001612ab084611593565b612aba91906133d5565b6000838152600c6020526040902054909150808214612b0d576001600160a01b0384166000908152600b602090815260408083208584528252808320548484528184208190558352600c90915290208190555b506000918252600c602090815260408084208490556001600160a01b039094168352600b81528383209183525290812055565b600d54600090612b52906001906133d5565b6000838152600e6020526040812054600d8054939450909284908110612b7a57612b7a6134c4565b9060005260206000200154905080600d8381548110612b9b57612b9b6134c4565b6000918252602080832090910192909255828152600e9091526040808220849055858252812055600d805480612bd357612bd36134ae565b6001900381819060005260206000200160009055905550505050565b6000612bfa83611593565b6001600160a01b039093166000908152600b602090815260408083208684528252808320859055938252600c9052919091209190915550565b6001600160a01b038216612c895760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016108a1565b6000818152601360205260409020546001600160a01b031615612cee5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016108a1565b612cfa600083836128ab565b6001600160a01b0382166000908152601460205260408120805460019290612d2390849061338a565b9091555050600081815260136020908152604080832080546001600160a01b0319166001600160a01b038716908117909155600a8352818420818552909252808320429055518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054612da190613418565b90600052602060002090601f016020900481019282612dc35760008555612e09565b82601f10612ddc57805160ff1916838001178555612e09565b82800160010185558215612e09579182015b82811115612e09578251825591602001919060010190612dee565b50612e15929150612e19565b5090565b5b80821115612e155760008155600101612e1a565b600067ffffffffffffffff80841115612e4957612e496134da565b604051601f8501601f19908116603f01168101908282118183101715612e7157612e716134da565b81604052809350858152868686011115612e8a57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114612ebb57600080fd5b919050565b600060208284031215612ed257600080fd5b611d8182612ea4565b60008060408385031215612eee57600080fd5b612ef783612ea4565b9150612f0560208401612ea4565b90509250929050565b600080600060608486031215612f2357600080fd5b612f2c84612ea4565b9250612f3a60208501612ea4565b9150604084013590509250925092565b60008060008060808587031215612f6057600080fd5b612f6985612ea4565b9350612f7760208601612ea4565b925060408501359150606085013567ffffffffffffffff811115612f9a57600080fd5b8501601f81018713612fab57600080fd5b612fba87823560208401612e2e565b91505092959194509250565b60008060408385031215612fd957600080fd5b612fe283612ea4565b915060208301358015158114612ff757600080fd5b809150509250929050565b6000806040838503121561301557600080fd5b61301e83612ea4565b946020939093013593505050565b60006020828403121561303e57600080fd5b8135611d81816134f0565b60006020828403121561305b57600080fd5b8151611d81816134f0565b60006020828403121561307857600080fd5b813567ffffffffffffffff81111561308f57600080fd5b8201601f810184136130a057600080fd5b61262a84823560208401612e2e565b6000602082840312156130c157600080fd5b5035919050565b6000602082840312156130da57600080fd5b5051919050565b600080604083850312156130f457600080fd5b50508035926020909101359150565b60008060006060848603121561311857600080fd5b505081359360208301359350604090920135919050565b600081518084526131478160208601602086016133ec565b601f01601f19169290920160200192915050565b6000835161316d8184602088016133ec565b8351908301906131818183602088016133ec565b01949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906131bd9083018461312f565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156122e2578351835292840192918401916001016131e3565b602081526000611d81602083018461312f565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4272656420447261676f6e732043414e27542042652053616372696669636564604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526022908201527f596f7520446f6e7420486176652054686520245343414c4520466f7220546861604082015261742160f01b606082015260800190565b6020808252600f908201526e2727aa102ca7aaa910222920a3a7a760891b604082015260600190565b6000821982111561339d5761339d613482565b500190565b6000826133b1576133b1613498565b500490565b60008160001904831182151516156133d0576133d0613482565b500290565b6000828210156133e7576133e7613482565b500390565b60005b838110156134075781810151838201526020016133ef565b838111156117f15750506000910152565b600181811c9082168061342c57607f821691505b6020821081141561344d57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561346757613467613482565b5060010190565b60008261347d5761347d613498565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461211757600080fdfea26469706673582212200b4e1704e1f98ed9d4d969b538b44b7c1e2c9dfbc0f63b7b49a5d7bac308fd5a64736f6c6343000807003360806040523480156200001157600080fd5b506040516200112c3803806200112c8339810160408190526200003491620002bb565b8351620000499060039060208701906200015e565b5082516200005f9060049060208601906200015e565b506200006c818362000076565b50505050620003ca565b6001600160a01b038216620000d15760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b8060026000828254620000e5919062000350565b90915550506001600160a01b038216600090815260208190526040812080548392906200011490849062000350565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b8280546200016c9062000377565b90600052602060002090601f016020900481019282620001905760008555620001db565b82601f10620001ab57805160ff1916838001178555620001db565b82800160010185558215620001db579182015b82811115620001db578251825591602001919060010190620001be565b50620001e9929150620001ed565b5090565b5b80821115620001e95760008155600101620001ee565b600082601f8301126200021657600080fd5b81516001600160401b0380821115620002335762000233620003b4565b604051601f8301601f19908116603f011681019082821181831017156200025e576200025e620003b4565b816040528381526020925086838588010111156200027b57600080fd5b600091505b838210156200029f578582018301518183018401529082019062000280565b83821115620002b15760008385830101525b9695505050505050565b60008060008060808587031215620002d257600080fd5b84516001600160401b0380821115620002ea57600080fd5b620002f88883890162000204565b955060208701519150808211156200030f57600080fd5b506200031e8782880162000204565b60408701516060880151919550935090506001600160a01b03811681146200034557600080fd5b939692955090935050565b600082198211156200037257634e487b7160e01b600052601160045260246000fd5b500190565b600181811c908216806200038c57607f821691505b60208210811415620003ae57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b610d5280620003da6000396000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c80635d8917c01161008c5780639dc29fac116100665780639dc29fac146101d0578063a457c2d7146101e3578063a9059cbb146101f6578063dd62ed3e1461020957600080fd5b80635d8917c01461018c57806370a082311461019f57806395d89b41146101c857600080fd5b806323b872dd116100c857806323b872dd14610142578063313ce56714610155578063395093511461016457806340c10f191461017757600080fd5b806306fdde03146100ef578063095ea7b31461010d57806318160ddd14610130575b600080fd5b6100f7610242565b6040516101049190610c47565b60405180910390f35b61012061011b366004610c1d565b6102d4565b6040519015158152602001610104565b6002545b604051908152602001610104565b610120610150366004610be1565b6102ea565b60405160128152602001610104565b610120610172366004610c1d565b610399565b61018a610185366004610c1d565b6103d5565b005b61018a61019a366004610b9e565b610447565b6101346101ad366004610b49565b6001600160a01b031660009081526020819052604090205490565b6100f76104f1565b61018a6101de366004610c1d565b610500565b6101206101f1366004610c1d565b61056e565b610120610204366004610c1d565b610607565b610134610217366004610b6b565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60606003805461025190610ccb565b80601f016020809104026020016040519081016040528092919081815260200182805461027d90610ccb565b80156102ca5780601f1061029f576101008083540402835291602001916102ca565b820191906000526020600020905b8154815290600101906020018083116102ad57829003601f168201915b5050505050905090565b60006102e1338484610614565b50600192915050565b60006102f7848484610739565b6001600160a01b0384166000908152600160209081526040808320338452909152902054828110156103815760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b61038e8533858403610614565b506001949350505050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916102e19185906103d0908690610c9c565b610614565b3360009081526006602052604090205460ff1615156001146104395760405162461bcd60e51b815260206004820152601d60248201527f796f7520617265206e6f7420617070726f7665642020746f206d696e740000006044820152606401610378565b6104438282610908565b5050565b60016005541061048a5760405162461bcd60e51b815260206004820152600e60248201526d185b1c9958591e4818d85b1b195960921b6044820152606401610378565b6001600160a01b038381166000908152600660205260408082208054600160ff19918216811790925586851684528284208054821683179055938516835290822080549093168117909255600580549091906104e7908490610c9c565b9091555050505050565b60606004805461025190610ccb565b3360009081526006602052604090205460ff1615156001146105645760405162461bcd60e51b815260206004820152601d60248201527f796f7520617265206e6f7420617070726f7665642020746f206d696e740000006044820152606401610378565b61044382826109e7565b3360009081526001602090815260408083206001600160a01b0386168452909152812054828110156105f05760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610378565b6105fd3385858403610614565b5060019392505050565b60006102e1338484610739565b6001600160a01b0383166106765760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610378565b6001600160a01b0382166106d75760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610378565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b03831661079d5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610378565b6001600160a01b0382166107ff5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610378565b6001600160a01b038316600090815260208190526040902054818110156108775760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610378565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906108ae908490610c9c565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516108fa91815260200190565b60405180910390a350505050565b6001600160a01b03821661095e5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610378565b80600260008282546109709190610c9c565b90915550506001600160a01b0382166000908152602081905260408120805483929061099d908490610c9c565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b038216610a475760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610378565b6001600160a01b03821660009081526020819052604090205481811015610abb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610378565b6001600160a01b0383166000908152602081905260408120838303905560028054849290610aea908490610cb4565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200161072c565b80356001600160a01b0381168114610b4457600080fd5b919050565b600060208284031215610b5b57600080fd5b610b6482610b2d565b9392505050565b60008060408385031215610b7e57600080fd5b610b8783610b2d565b9150610b9560208401610b2d565b90509250929050565b600080600060608486031215610bb357600080fd5b610bbc84610b2d565b9250610bca60208501610b2d565b9150610bd860408501610b2d565b90509250925092565b600080600060608486031215610bf657600080fd5b610bff84610b2d565b9250610c0d60208501610b2d565b9150604084013590509250925092565b60008060408385031215610c3057600080fd5b610c3983610b2d565b946020939093013593505050565b600060208083528351808285015260005b81811015610c7457858101830151858201604001528201610c58565b81811115610c86576000604083870101525b50601f01601f1916929092016040019392505050565b60008219821115610caf57610caf610d06565b500190565b600082821015610cc657610cc6610d06565b500390565b600181811c90821680610cdf57607f821691505b60208210811415610d0057634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fdfea2646970667358221220c27001877f4f088c71b86ea87bb6953706e02aafce9f87192c8d0ebf5916a89864736f6c6343000807003360e06040526036608081815290620026ab60a0398051620000299160059160209091019062000118565b5060408051808201909152600580825264173539b7b760d91b6020909201918252620000589160069162000118565b503480156200006657600080fd5b50604051620026e1380380620026e1833981016040819052620000899162000275565b6200009433620000c8565b8151620000a990600790602085019062000118565b508051620000bf90600890602084019062000118565b50505062000332565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8280546200012690620002df565b90600052602060002090601f0160209004810192826200014a576000855562000195565b82601f106200016557805160ff191683800117855562000195565b8280016001018555821562000195579182015b828111156200019557825182559160200191906001019062000178565b50620001a3929150620001a7565b5090565b5b80821115620001a35760008155600101620001a8565b600082601f830112620001d057600080fd5b81516001600160401b0380821115620001ed57620001ed6200031c565b604051601f8301601f19908116603f011681019082821181831017156200021857620002186200031c565b816040528381526020925086838588010111156200023557600080fd5b600091505b838210156200025957858201830151818301840152908201906200023a565b838211156200026b5760008385830101525b9695505050505050565b600080604083850312156200028957600080fd5b82516001600160401b0380821115620002a157600080fd5b620002af86838701620001be565b93506020850151915080821115620002c657600080fd5b50620002d585828601620001be565b9150509250929050565b600181811c90821680620002f457607f821691505b602082108114156200031657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b61236980620003426000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c80636352211e116100f9578063b6b285d911610097578063c87b56dd11610071578063c87b56dd146103ab578063e985e9c5146103be578063f259a29e146103fa578063f2fde38b1461040257600080fd5b8063b6b285d91461037d578063b88d4fde14610390578063c6682862146103a357600080fd5b8063715018a6116100d3578063715018a6146103495780638da5cb5b1461035157806395d89b4114610362578063a22cb4651461036a57600080fd5b80636352211e146103105780636a6278421461032357806370a082311461033657600080fd5b80632d38f11e11610166578063434358e011610140578063434358e0146102c45780634f6ccce7146102d7578063503d2e72146102ea57806355f804b3146102fd57600080fd5b80632d38f11e1461027e5780632f745c591461029e57806342842e0e146102b157600080fd5b8063095ea7b3116101a2578063095ea7b31461023157806318160ddd1461024657806323b872dd146102585780632b875c941461026b57600080fd5b806301ffc9a7146101c957806306fdde03146101f1578063081812fc14610206575b600080fd5b6101dc6101d7366004611f54565b610415565b60405190151581526020015b60405180910390f35b6101f9610467565b6040516101e891906120cc565b610219610214366004611fd7565b6104f9565b6040516001600160a01b0390911681526020016101e8565b61024461023f366004611f2a565b610593565b005b600f545b6040519081526020016101e8565b610244610266366004611e36565b6106a9565b61024a610279366004611de8565b6106da565b61029161028c366004611de8565b61084b565b6040516101e89190612088565b61024a6102ac366004611f2a565b6108ed565b6102446102bf366004611e36565b610983565b6102446102d2366004611de8565b61099e565b61024a6102e5366004611fd7565b610a23565b6102446102f8366004611de8565b610ab6565b61024461030b366004611f8e565b610d38565b61021961031e366004611fd7565b610d79565b610244610331366004611de8565b610df0565b61024a610344366004611de8565b610e8e565b610244610f15565b6000546001600160a01b0316610219565b6101f9610f4b565b610244610378366004611eee565b610f5a565b61024461038b366004611de8565b610f65565b61024461039e366004611e72565b610fe9565b6101f9611021565b6101f96103b9366004611fd7565b6110af565b6101dc6103cc366004611e03565b6001600160a01b039182166000908152600c6020908152604080832093909416825291909152205460ff1690565b6101f961118a565b610244610410366004611de8565b611197565b60006001600160e01b031982166380ac58cd60e01b148061044657506001600160e01b03198216635b5e139f60e01b145b8061046157506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606007805461047690612245565b80601f01602080910402602001604051908101604052809291908181526020018280546104a290612245565b80156104ef5780601f106104c4576101008083540402835291602001916104ef565b820191906000526020600020905b8154815290600101906020018083116104d257829003601f168201915b5050505050905090565b6000818152600960205260408120546001600160a01b03166105775760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600b60205260409020546001600160a01b031690565b600061059e82610d79565b9050806001600160a01b0316836001600160a01b0316141561060c5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161056e565b336001600160a01b0382161480610628575061062881336103cc565b61069a5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161056e565b6106a48383611232565b505050565b6106b333826112a0565b6106cf5760405162461bcd60e51b815260040161056e90612166565b6106a4838383611397565b6000806106e683610e8e565b905060008167ffffffffffffffff81111561070357610703612307565b60405190808252806020026020018201604052801561072c578160200160208202803683370190505b5090506107388461084b565b90506000806000805b8581101561084057600060116000878481518110610761576107616122f1565b6020026020010151815260200190815260200160002060008a6001600160a01b03166001600160a01b0316815260200190815260200160002054111561082e57601160008683815181106107b7576107b76122f1565b602002602001015181526020019081526020016000206000896001600160a01b03166001600160a01b0316815260200190815260200160002054426107fc9190612202565b935062015180610815856802b5e3af16b18800006121e3565b61081f91906121cf565b925061082b83836121b7565b91505b8061083881612280565b915050610741565b509695505050505050565b6060600061085883610e8e565b905060008167ffffffffffffffff81111561087557610875612307565b60405190808252806020026020018201604052801561089e578160200160208202803683370190505b50905060005b828110156108e5576108b685826108ed565b8282815181106108c8576108c86122f1565b6020908102919091010152806108dd81612280565b9150506108a4565b509392505050565b60006108f883610e8e565b821061095a5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161056e565b506001600160a01b03919091166000908152600d60209081526040808320938352929052205490565b6106a483838360405180602001604052806000815250610fe9565b6001600354106109f05760405162461bcd60e51b815260206004820152601c60248201527f616c72656164792063616c6c656420746869732066756e6374696f6e00000000604482015260640161056e565b600480546001600160a01b0319166001600160a01b03831617905560038054906000610a1b83612280565b919050555050565b6000610a2e600f5490565b8210610a915760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161056e565b600f8281548110610aa457610aa46122f1565b90600052602060002001549050919050565b6000610ac182610e8e565b11610b0e5760405162461bcd60e51b815260206004820152601860248201527f6e6f74207175616c696669656420666f72207265776172640000000000000000604482015260640161056e565b6000610b1982610e8e565b905060008167ffffffffffffffff811115610b3657610b36612307565b604051908082528060200260200182016040528015610b5f578160200160208202803683370190505b509050610b6b8361084b565b90506000806000805b85811015610cc757600060116000878481518110610b9457610b946122f1565b602002602001015181526020019081526020016000206000896001600160a01b03166001600160a01b03168152602001908152602001600020541115610cb55760116000868381518110610bea57610bea6122f1565b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b031681526020019081526020016000205442610c2f9190612202565b935062015180610c48856802b5e3af16b18800006121e3565b610c5291906121cf565b9250610c5e83836121b7565b91504260116000878481518110610c7757610c776122f1565b602002602001015181526020019081526020016000206000896001600160a01b03166001600160a01b03168152602001908152602001600020819055505b80610cbf81612280565b915050610b74565b50600480546040516340c10f1960e01b81526001600160a01b0389811693820193909352602481018490529116906340c10f1990604401600060405180830381600087803b158015610d1857600080fd5b505af1158015610d2c573d6000803e3d6000fd5b50505050505050505050565b6000546001600160a01b03163314610d625760405162461bcd60e51b815260040161056e90612131565b8051610d75906005906020840190611cbd565b5050565b6000818152600960205260408120546001600160a01b0316806104615760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161056e565b3360009081526012602052604090205460ff161515600114610e545760405162461bcd60e51b815260206004820152601d60248201527f796f7520617265206e6f7420617070726f7665642020746f206d696e74000000604482015260640161056e565b600154610e6957610e69600180546001019055565b6000610e7460015490565b9050610e80828261155a565b610d75600180546001019055565b60006001600160a01b038216610ef95760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161056e565b506001600160a01b03166000908152600a602052604090205490565b6000546001600160a01b03163314610f3f5760405162461bcd60e51b815260040161056e90612131565b610f496000611574565b565b60606008805461047690612245565b610d753383836115c4565b600160025410610fa85760405162461bcd60e51b815260206004820152600e60248201526d185b1c9958591e4818d85b1b195960921b604482015260640161056e565b6001600160a01b0381166000908152601260205260408120805460ff191660019081179091556002805491929091610fe19084906121b7565b909155505050565b610ff333836112a0565b61100f5760405162461bcd60e51b815260040161056e90612166565b61101b84848484611693565b50505050565b6006805461102e90612245565b80601f016020809104026020016040519081016040528092919081815260200182805461105a90612245565b80156110a75780601f1061107c576101008083540402835291602001916110a7565b820191906000526020600020905b81548152906001019060200180831161108a57829003601f168201915b505050505081565b6000818152600960205260409020546060906001600160a01b031661112e5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161056e565b60006111386116c6565b905060008151116111585760405180602001604052806000815250611183565b80611162846116d5565b60405160200161117392919061201c565b6040516020818303038152906040525b9392505050565b6005805461102e90612245565b6000546001600160a01b031633146111c15760405162461bcd60e51b815260040161056e90612131565b6001600160a01b0381166112265760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161056e565b61122f81611574565b50565b6000818152600b6020526040902080546001600160a01b0319166001600160a01b038416908117909155819061126782610d79565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600960205260408120546001600160a01b03166113195760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161056e565b600061132483610d79565b9050806001600160a01b0316846001600160a01b0316148061135f5750836001600160a01b0316611354846104f9565b6001600160a01b0316145b8061138f57506001600160a01b038082166000908152600c602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166113aa82610d79565b6001600160a01b03161461140e5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b606482015260840161056e565b6001600160a01b0382166114705760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161056e565b61147b8383836117d3565b611486600082611232565b6001600160a01b0383166000908152600a602052604081208054600192906114af908490612202565b90915550506001600160a01b0382166000908152600a602052604081208054600192906114dd9084906121b7565b9091555050600081815260096020908152604080832080546001600160a01b0319166001600160a01b03878116918217909255601184528285208186529093528184204290558616808452818420849055905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610d7582826040518060200160405280600081525061188b565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b816001600160a01b0316836001600160a01b031614156116265760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161056e565b6001600160a01b038381166000818152600c6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61169e848484611397565b6116aa848484846118be565b61101b5760405162461bcd60e51b815260040161056e906120df565b60606005805461047690612245565b6060816116f95750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611723578061170d81612280565b915061171c9050600a836121cf565b91506116fd565b60008167ffffffffffffffff81111561173e5761173e612307565b6040519080825280601f01601f191660200182016040528015611768576020820181803683370190505b5090505b841561138f5761177d600183612202565b915061178a600a8661229b565b6117959060306121b7565b60f81b8183815181106117aa576117aa6122f1565b60200101906001600160f81b031916908160001a9053506117cc600a866121cf565b945061176c565b6001600160a01b03831661182e5761182981600f80546000838152601060205260408120829055600182018355919091527f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac8020155565b611851565b816001600160a01b0316836001600160a01b0316146118515761185183826119cb565b6001600160a01b038216611868576106a481611a68565b826001600160a01b0316826001600160a01b0316146106a4576106a48282611b17565b6118958383611b5b565b6118a260008484846118be565b6106a45760405162461bcd60e51b815260040161056e906120df565b60006001600160a01b0384163b156119c057604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061190290339089908890889060040161204b565b602060405180830381600087803b15801561191c57600080fd5b505af192505050801561194c575060408051601f3d908101601f1916820190925261194991810190611f71565b60015b6119a6573d80801561197a576040519150601f19603f3d011682016040523d82523d6000602084013e61197f565b606091505b50805161199e5760405162461bcd60e51b815260040161056e906120df565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061138f565b506001949350505050565b600060016119d884610e8e565b6119e29190612202565b6000838152600e6020526040902054909150808214611a35576001600160a01b0384166000908152600d602090815260408083208584528252808320548484528184208190558352600e90915290208190555b506000918252600e602090815260408084208490556001600160a01b039094168352600d81528383209183525290812055565b600f54600090611a7a90600190612202565b600083815260106020526040812054600f8054939450909284908110611aa257611aa26122f1565b9060005260206000200154905080600f8381548110611ac357611ac36122f1565b600091825260208083209091019290925582815260109091526040808220849055858252812055600f805480611afb57611afb6122db565b6001900381819060005260206000200160009055905550505050565b6000611b2283610e8e565b6001600160a01b039093166000908152600d602090815260408083208684528252808320859055938252600e9052919091209190915550565b6001600160a01b038216611bb15760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161056e565b6000818152600960205260409020546001600160a01b031615611c165760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161056e565b611c22600083836117d3565b6001600160a01b0382166000908152600a60205260408120805460019290611c4b9084906121b7565b9091555050600081815260096020908152604080832080546001600160a01b0319166001600160a01b03871690811790915560118352818420818552909252808320429055518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054611cc990612245565b90600052602060002090601f016020900481019282611ceb5760008555611d31565b82601f10611d0457805160ff1916838001178555611d31565b82800160010185558215611d31579182015b82811115611d31578251825591602001919060010190611d16565b50611d3d929150611d41565b5090565b5b80821115611d3d5760008155600101611d42565b600067ffffffffffffffff80841115611d7157611d71612307565b604051601f8501601f19908116603f01168101908282118183101715611d9957611d99612307565b81604052809350858152868686011115611db257600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114611de357600080fd5b919050565b600060208284031215611dfa57600080fd5b61118382611dcc565b60008060408385031215611e1657600080fd5b611e1f83611dcc565b9150611e2d60208401611dcc565b90509250929050565b600080600060608486031215611e4b57600080fd5b611e5484611dcc565b9250611e6260208501611dcc565b9150604084013590509250925092565b60008060008060808587031215611e8857600080fd5b611e9185611dcc565b9350611e9f60208601611dcc565b925060408501359150606085013567ffffffffffffffff811115611ec257600080fd5b8501601f81018713611ed357600080fd5b611ee287823560208401611d56565b91505092959194509250565b60008060408385031215611f0157600080fd5b611f0a83611dcc565b915060208301358015158114611f1f57600080fd5b809150509250929050565b60008060408385031215611f3d57600080fd5b611f4683611dcc565b946020939093013593505050565b600060208284031215611f6657600080fd5b81356111838161231d565b600060208284031215611f8357600080fd5b81516111838161231d565b600060208284031215611fa057600080fd5b813567ffffffffffffffff811115611fb757600080fd5b8201601f81018413611fc857600080fd5b61138f84823560208401611d56565b600060208284031215611fe957600080fd5b5035919050565b60008151808452612008816020860160208601612219565b601f01601f19169290920160200192915050565b6000835161202e818460208801612219565b835190830190612042818360208801612219565b01949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061207e90830184611ff0565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156120c0578351835292840192918401916001016120a4565b50909695505050505050565b6020815260006111836020830184611ff0565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b600082198211156121ca576121ca6122af565b500190565b6000826121de576121de6122c5565b500490565b60008160001904831182151516156121fd576121fd6122af565b500290565b600082821015612214576122146122af565b500390565b60005b8381101561223457818101518382015260200161221c565b8381111561101b5750506000910152565b600181811c9082168061225957607f821691505b6020821081141561227a57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612294576122946122af565b5060010190565b6000826122aa576122aa6122c5565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461122f57600080fdfea2646970667358221220b46c2ab11490785f54e498ec573b7f02d7ef3ae7d2dd8a89182b6690cb09693864736f6c63430008070033697066733a2f2f516d5944776961387236384d70334557686d4e7466564a41364678596e3532554d444e766b5361535577747566552f6115b360045560e060405260366080818152906200271f60a03980516200002f916006916020909101906200011e565b5060408051808201909152600580825264173539b7b760d91b60209092019182526200005e916007916200011e565b503480156200006c57600080fd5b5060405162002755380380620027558339810160408190526200008f916200027b565b6200009a33620000ce565b8151620000af9060089060208501906200011e565b508051620000c59060099060208401906200011e565b50505062000338565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8280546200012c90620002e5565b90600052602060002090601f0160209004810192826200015057600085556200019b565b82601f106200016b57805160ff19168380011785556200019b565b828001600101855582156200019b579182015b828111156200019b5782518255916020019190600101906200017e565b50620001a9929150620001ad565b5090565b5b80821115620001a95760008155600101620001ae565b600082601f830112620001d657600080fd5b81516001600160401b0380821115620001f357620001f362000322565b604051601f8301601f19908116603f011681019082821181831017156200021e576200021e62000322565b816040528381526020925086838588010111156200023b57600080fd5b600091505b838210156200025f578582018301518183018401529082019062000240565b83821115620002715760008385830101525b9695505050505050565b600080604083850312156200028f57600080fd5b82516001600160401b0380821115620002a757600080fd5b620002b586838701620001c4565b93506020850151915080821115620002cc57600080fd5b50620002db85828601620001c4565b9150509250929050565b600181811c90821680620002fa57607f821691505b602082108114156200031c57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b6123d780620003486000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c80636352211e11610104578063b6b285d9116100a2578063d5abeb0111610071578063d5abeb01146103e7578063e985e9c5146103f0578063f259a29e1461042c578063f2fde38b1461043457600080fd5b8063b6b285d9146103a6578063b88d4fde146103b9578063c6682862146103cc578063c87b56dd146103d457600080fd5b8063715018a6116100de578063715018a6146103725780638da5cb5b1461037a57806395d89b411461038b578063a22cb4651461039357600080fd5b80636352211e146103395780636a6278421461034c57806370a082311461035f57600080fd5b80632d38f11e1161017c5780634f6ccce71161014b5780634f6ccce7146102ed578063503d2e721461030057806355f804b3146103135780635d4ba6141461032657600080fd5b80632d38f11e146102945780632f745c59146102b457806342842e0e146102c7578063434358e0146102da57600080fd5b8063095ea7b3116101b8578063095ea7b31461024757806318160ddd1461025c57806323b872dd1461026e5780632b875c941461028157600080fd5b806301ffc9a7146101df57806306fdde0314610207578063081812fc1461021c575b600080fd5b6101f26101ed366004611fc2565b610447565b60405190151581526020015b60405180910390f35b61020f610499565b6040516101fe919061213a565b61022f61022a366004612045565b61052b565b6040516001600160a01b0390911681526020016101fe565b61025a610255366004611f98565b6105c5565b005b6010545b6040519081526020016101fe565b61025a61027c366004611ea4565b6106db565b61026061028f366004611e56565b61070c565b6102a76102a2366004611e56565b61087c565b6040516101fe91906120f6565b6102606102c2366004611f98565b61091e565b61025a6102d5366004611ea4565b6109b4565b61025a6102e8366004611e56565b6109cf565b6102606102fb366004612045565b610a54565b61025a61030e366004611e56565b610ae7565b61025a610321366004611ffc565b610d66565b61025a610334366004612045565b610da7565b61022f610347366004612045565b610dd6565b61025a61035a366004611e56565b610e4d565b61026061036d366004611e56565b610efc565b61025a610f83565b6000546001600160a01b031661022f565b61020f610fb9565b61025a6103a1366004611f5c565b610fc8565b61025a6103b4366004611e56565b610fd3565b61025a6103c7366004611ee0565b611057565b61020f61108f565b61020f6103e2366004612045565b61111d565b61026060045481565b6101f26103fe366004611e71565b6001600160a01b039182166000908152600d6020908152604080832093909416825291909152205460ff1690565b61020f6111f8565b61025a610442366004611e56565b611205565b60006001600160e01b031982166380ac58cd60e01b148061047857506001600160e01b03198216635b5e139f60e01b145b8061049357506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600880546104a8906122b3565b80601f01602080910402602001604051908101604052809291908181526020018280546104d4906122b3565b80156105215780601f106104f657610100808354040283529160200191610521565b820191906000526020600020905b81548152906001019060200180831161050457829003601f168201915b5050505050905090565b6000818152600a60205260408120546001600160a01b03166105a95760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600c60205260409020546001600160a01b031690565b60006105d082610dd6565b9050806001600160a01b0316836001600160a01b0316141561063e5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016105a0565b336001600160a01b038216148061065a575061065a81336103fe565b6106cc5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016105a0565b6106d683836112a0565b505050565b6106e5338261130e565b6107015760405162461bcd60e51b81526004016105a0906121d4565b6106d6838383611405565b60008061071883610efc565b905060008167ffffffffffffffff81111561073557610735612375565b60405190808252806020026020018201604052801561075e578160200160208202803683370190505b50905061076a8461087c565b90506000806000805b85811015610871576000601260008784815181106107935761079361235f565b6020026020010151815260200190815260200160002060008a6001600160a01b03166001600160a01b0316815260200190815260200160002054111561085f57601260008683815181106107e9576107e961235f565b602002602001015181526020019081526020016000206000896001600160a01b03166001600160a01b03168152602001908152602001600020544261082e9190612270565b93506201518061084685674563918244f40000612251565b610850919061223d565b925061085c8383612225565b91505b80610869816122ee565b915050610773565b509695505050505050565b6060600061088983610efc565b905060008167ffffffffffffffff8111156108a6576108a6612375565b6040519080825280602002602001820160405280156108cf578160200160208202803683370190505b50905060005b82811015610916576108e7858261091e565b8282815181106108f9576108f961235f565b60209081029190910101528061090e816122ee565b9150506108d5565b509392505050565b600061092983610efc565b821061098b5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016105a0565b506001600160a01b03919091166000908152600e60209081526040808320938352929052205490565b6106d683838360405180602001604052806000815250611057565b600160035410610a215760405162461bcd60e51b815260206004820152601c60248201527f616c72656164792063616c6c656420746869732066756e6374696f6e0000000060448201526064016105a0565b600580546001600160a01b0319166001600160a01b03831617905560038054906000610a4c836122ee565b919050555050565b6000610a5f60105490565b8210610ac25760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016105a0565b60108281548110610ad557610ad561235f565b90600052602060002001549050919050565b6000610af282610efc565b11610b3f5760405162461bcd60e51b815260206004820152601860248201527f6e6f74207175616c696669656420666f7220726577617264000000000000000060448201526064016105a0565b6000610b4a82610efc565b905060008167ffffffffffffffff811115610b6757610b67612375565b604051908082528060200260200182016040528015610b90578160200160208202803683370190505b509050610b9c8361087c565b90506000806000805b85811015610cf757600060126000878481518110610bc557610bc561235f565b602002602001015181526020019081526020016000206000896001600160a01b03166001600160a01b03168152602001908152602001600020541115610ce55760126000868381518110610c1b57610c1b61235f565b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b031681526020019081526020016000205442610c609190612270565b935062015180610c7885674563918244f40000612251565b610c82919061223d565b9250610c8e8383612225565b91504260126000878481518110610ca757610ca761235f565b602002602001015181526020019081526020016000206000896001600160a01b03166001600160a01b03168152602001908152602001600020819055505b80610cef816122ee565b915050610ba5565b506005546040516340c10f1960e01b81526001600160a01b03888116600483015260248201849052909116906340c10f1990604401600060405180830381600087803b158015610d4657600080fd5b505af1158015610d5a573d6000803e3d6000fd5b50505050505050505050565b6000546001600160a01b03163314610d905760405162461bcd60e51b81526004016105a09061219f565b8051610da3906006906020840190611d2b565b5050565b6000546001600160a01b03163314610dd15760405162461bcd60e51b81526004016105a09061219f565b600455565b6000818152600a60205260408120546001600160a01b0316806104935760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016105a0565b3360009081526013602052604090205460ff161515600114610eb15760405162461bcd60e51b815260206004820152601d60248201527f796f7520617265206e6f7420617070726f7665642020746f206d696e7400000060448201526064016105a0565b6004546010541115610ec257600080fd5b600154610ed757610ed7600180546001019055565b6000610ee260015490565b9050610eee82826115c8565b610da3600180546001019055565b60006001600160a01b038216610f675760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016105a0565b506001600160a01b03166000908152600b602052604090205490565b6000546001600160a01b03163314610fad5760405162461bcd60e51b81526004016105a09061219f565b610fb760006115e2565b565b6060600980546104a8906122b3565b610da3338383611632565b6001600254106110165760405162461bcd60e51b815260206004820152600e60248201526d185b1c9958591e4818d85b1b195960921b60448201526064016105a0565b6001600160a01b0381166000908152601360205260408120805460ff19166001908117909155600280549192909161104f908490612225565b909155505050565b611061338361130e565b61107d5760405162461bcd60e51b81526004016105a0906121d4565b61108984848484611701565b50505050565b6007805461109c906122b3565b80601f01602080910402602001604051908101604052809291908181526020018280546110c8906122b3565b80156111155780601f106110ea57610100808354040283529160200191611115565b820191906000526020600020905b8154815290600101906020018083116110f857829003601f168201915b505050505081565b6000818152600a60205260409020546060906001600160a01b031661119c5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016105a0565b60006111a6611734565b905060008151116111c657604051806020016040528060008152506111f1565b806111d084611743565b6040516020016111e192919061208a565b6040516020818303038152906040525b9392505050565b6006805461109c906122b3565b6000546001600160a01b0316331461122f5760405162461bcd60e51b81526004016105a09061219f565b6001600160a01b0381166112945760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105a0565b61129d816115e2565b50565b6000818152600c6020526040902080546001600160a01b0319166001600160a01b03841690811790915581906112d582610dd6565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600a60205260408120546001600160a01b03166113875760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016105a0565b600061139283610dd6565b9050806001600160a01b0316846001600160a01b031614806113cd5750836001600160a01b03166113c28461052b565b6001600160a01b0316145b806113fd57506001600160a01b038082166000908152600d602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661141882610dd6565b6001600160a01b03161461147c5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016105a0565b6001600160a01b0382166114de5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016105a0565b6114e9838383611841565b6114f46000826112a0565b6001600160a01b0383166000908152600b6020526040812080546001929061151d908490612270565b90915550506001600160a01b0382166000908152600b6020526040812080546001929061154b908490612225565b90915550506000818152600a6020908152604080832080546001600160a01b0319166001600160a01b03878116918217909255601284528285208186529093528184204290558616808452818420849055905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610da38282604051806020016040528060008152506118f9565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b816001600160a01b0316836001600160a01b031614156116945760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016105a0565b6001600160a01b038381166000818152600d6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61170c848484611405565b6117188484848461192c565b6110895760405162461bcd60e51b81526004016105a09061214d565b6060600680546104a8906122b3565b6060816117675750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611791578061177b816122ee565b915061178a9050600a8361223d565b915061176b565b60008167ffffffffffffffff8111156117ac576117ac612375565b6040519080825280601f01601f1916602001820160405280156117d6576020820181803683370190505b5090505b84156113fd576117eb600183612270565b91506117f8600a86612309565b611803906030612225565b60f81b8183815181106118185761181861235f565b60200101906001600160f81b031916908160001a90535061183a600a8661223d565b94506117da565b6001600160a01b03831661189c5761189781601080546000838152601160205260408120829055600182018355919091527f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae6720155565b6118bf565b816001600160a01b0316836001600160a01b0316146118bf576118bf8382611a39565b6001600160a01b0382166118d6576106d681611ad6565b826001600160a01b0316826001600160a01b0316146106d6576106d68282611b85565b6119038383611bc9565b611910600084848461192c565b6106d65760405162461bcd60e51b81526004016105a09061214d565b60006001600160a01b0384163b15611a2e57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906119709033908990889088906004016120b9565b602060405180830381600087803b15801561198a57600080fd5b505af19250505080156119ba575060408051601f3d908101601f191682019092526119b791810190611fdf565b60015b611a14573d8080156119e8576040519150601f19603f3d011682016040523d82523d6000602084013e6119ed565b606091505b508051611a0c5760405162461bcd60e51b81526004016105a09061214d565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506113fd565b506001949350505050565b60006001611a4684610efc565b611a509190612270565b6000838152600f6020526040902054909150808214611aa3576001600160a01b0384166000908152600e602090815260408083208584528252808320548484528184208190558352600f90915290208190555b506000918252600f602090815260408084208490556001600160a01b039094168352600e81528383209183525290812055565b601054600090611ae890600190612270565b60008381526011602052604081205460108054939450909284908110611b1057611b1061235f565b906000526020600020015490508060108381548110611b3157611b3161235f565b6000918252602080832090910192909255828152601190915260408082208490558582528120556010805480611b6957611b69612349565b6001900381819060005260206000200160009055905550505050565b6000611b9083610efc565b6001600160a01b039093166000908152600e602090815260408083208684528252808320859055938252600f9052919091209190915550565b6001600160a01b038216611c1f5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016105a0565b6000818152600a60205260409020546001600160a01b031615611c845760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016105a0565b611c9060008383611841565b6001600160a01b0382166000908152600b60205260408120805460019290611cb9908490612225565b90915550506000818152600a6020908152604080832080546001600160a01b0319166001600160a01b03871690811790915560128352818420818552909252808320429055518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054611d37906122b3565b90600052602060002090601f016020900481019282611d595760008555611d9f565b82601f10611d7257805160ff1916838001178555611d9f565b82800160010185558215611d9f579182015b82811115611d9f578251825591602001919060010190611d84565b50611dab929150611daf565b5090565b5b80821115611dab5760008155600101611db0565b600067ffffffffffffffff80841115611ddf57611ddf612375565b604051601f8501601f19908116603f01168101908282118183101715611e0757611e07612375565b81604052809350858152868686011115611e2057600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114611e5157600080fd5b919050565b600060208284031215611e6857600080fd5b6111f182611e3a565b60008060408385031215611e8457600080fd5b611e8d83611e3a565b9150611e9b60208401611e3a565b90509250929050565b600080600060608486031215611eb957600080fd5b611ec284611e3a565b9250611ed060208501611e3a565b9150604084013590509250925092565b60008060008060808587031215611ef657600080fd5b611eff85611e3a565b9350611f0d60208601611e3a565b925060408501359150606085013567ffffffffffffffff811115611f3057600080fd5b8501601f81018713611f4157600080fd5b611f5087823560208401611dc4565b91505092959194509250565b60008060408385031215611f6f57600080fd5b611f7883611e3a565b915060208301358015158114611f8d57600080fd5b809150509250929050565b60008060408385031215611fab57600080fd5b611fb483611e3a565b946020939093013593505050565b600060208284031215611fd457600080fd5b81356111f18161238b565b600060208284031215611ff157600080fd5b81516111f18161238b565b60006020828403121561200e57600080fd5b813567ffffffffffffffff81111561202557600080fd5b8201601f8101841361203657600080fd5b6113fd84823560208401611dc4565b60006020828403121561205757600080fd5b5035919050565b60008151808452612076816020860160208601612287565b601f01601f19169290920160200192915050565b6000835161209c818460208801612287565b8351908301906120b0818360208801612287565b01949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906120ec9083018461205e565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561212e57835183529284019291840191600101612112565b50909695505050505050565b6020815260006111f1602083018461205e565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b600082198211156122385761223861231d565b500190565b60008261224c5761224c612333565b500490565b600081600019048311821515161561226b5761226b61231d565b500290565b6000828210156122825761228261231d565b500390565b60005b838110156122a257818101518382015260200161228a565b838111156110895750506000910152565b600181811c908216806122c757607f821691505b602082108114156122e857634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156123025761230261231d565b5060010190565b60008261231857612318612333565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461129d57600080fdfea2646970667358221220df80cf4db4a33fb5cecb2d98e56cf868c9ba3c2deddd5bbe6fb4d1dcb7c36a4164736f6c63430008070033697066733a2f2f516d514b71564c767a6f71483243615647715366315543676847535356345836465433624d4654574e32433663462f4552433732313a207472616e7366657220746f206e6f6e204552433732315265697066733a2f2f516d6557647271484133327a51526a55396f4b6d7369364e444764763164706e797852693370636d3237446b71622f0000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000021e19e0c9bab2400000000000000000000000000000b6d2ac64bdc24f76417b95b410acf47ce31add070000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000093078447261676f6e73000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034f5844000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000055343414c4500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000055343414c450000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008416e6369656e74730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005414e434e5400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000095779726d6c696e6773000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045759524d00000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102885760003560e01c806370a082311161015a578063be597c3e116100c1578063da3ef23f1161007a578063da3ef23f14610749578063e2d358ac14610769578063e985e9c514610787578063f259a29e146107d0578063f2fde38b146107e5578063f6368b831461080557600080fd5b8063be597c3e146106a0578063c6682862146106be578063c87b56dd146106d3578063cf7f9e95146106f3578063d5abeb0114610713578063d9ecad7b1461072957600080fd5b80638da5cb5b116101135780638da5cb5b1461060357806395d89b4114610621578063a0b9f0e114610636578063a22cb4651461064b578063b88d4fde1461066b578063bb6bf51d1461068b57600080fd5b806370a082311461056f578063715018a61461058f57806373508aec146105a45780637f00c7a6146105b95780638456cb59146105d95780638894038d146105ee57600080fd5b80632f745c59116101fe5780634e71d92d116101b75780634e71d92d146104c05780634f6ccce7146104d557806355f804b3146104f55780635843029b146105155780635c975abb146105355780636352211e1461054f57600080fd5b80632f745c591461041a578063374fdb871461043a57806340c10f191461045857806342842e0e1461046b57806344a0d68a1461048b5780634e157569146104ab57600080fd5b8063095ea7b311610250578063095ea7b31461035e57806313faede61461037e57806318160ddd146103a2578063239c70ae146103b757806323b872dd146103cd5780632d38f11e146103ed57600080fd5b806301ffc9a71461028d578063056e5a7f146102c257806305a10028146102e457806306fdde0314610304578063081812fc14610326575b600080fd5b34801561029957600080fd5b506102ad6102a836600461302c565b610825565b60405190151581526020015b60405180910390f35b3480156102ce57600080fd5b506102e26102dd366004613066565b610877565b005b3480156102f057600080fd5b506102e26102ff366004613103565b61090f565b34801561031057600080fd5b50610319610c3a565b6040516102b991906131ff565b34801561033257600080fd5b506103466103413660046130af565b610ccc565b6040516001600160a01b0390911681526020016102b9565b34801561036a57600080fd5b506102e2610379366004613002565b610d61565b34801561038a57600080fd5b5061039460065481565b6040519081526020016102b9565b3480156103ae57600080fd5b50600d54610394565b3480156103c357600080fd5b5061039460085481565b3480156103d957600080fd5b506102e26103e8366004612f0e565b610e77565b3480156103f957600080fd5b5061040d610408366004612ec0565b610ea8565b6040516102b991906131c7565b34801561042657600080fd5b50610394610435366004613002565b610f4a565b34801561044657600080fd5b506012546001600160a01b0316610346565b6102e2610466366004613002565b610fe0565b34801561047757600080fd5b506102e2610486366004612f0e565b6110af565b34801561049757600080fd5b506102e26104a63660046130af565b6110ca565b3480156104b757600080fd5b506103946110f9565b3480156104cc57600080fd5b506102e2611268565b3480156104e157600080fd5b506103946104f03660046130af565b6113f2565b34801561050157600080fd5b506102e2610510366004613066565b611485565b34801561052157600080fd5b506102e2610530366004613066565b6114c2565b34801561054157600080fd5b506009546102ad9060ff1681565b34801561055b57600080fd5b5061034661056a3660046130af565b61151c565b34801561057b57600080fd5b5061039461058a366004612ec0565b611593565b34801561059b57600080fd5b506102e261161a565b3480156105b057600080fd5b50610394611650565b3480156105c557600080fd5b506102e26105d43660046130af565b6116d2565b3480156105e557600080fd5b506102e2611701565b3480156105fa57600080fd5b5061039461173f565b34801561060f57600080fd5b506000546001600160a01b0316610346565b34801561062d57600080fd5b50610319611770565b34801561064257600080fd5b506102ad61177f565b34801561065757600080fd5b506102e2610666366004612fc6565b6117b4565b34801561067757600080fd5b506102e2610686366004612f4a565b6117bf565b34801561069757600080fd5b506102e26117f7565b3480156106ac57600080fd5b506010546001600160a01b0316610346565b3480156106ca57600080fd5b50610319611c1f565b3480156106df57600080fd5b506103196106ee3660046130af565b611cad565b3480156106ff57600080fd5b506102e261070e3660046130af565b611d88565b34801561071f57600080fd5b5061039460075481565b34801561073557600080fd5b506102e26107443660046130e1565b611de3565b34801561075557600080fd5b506102e2610764366004613066565b612035565b34801561077557600080fd5b506011546001600160a01b0316610346565b34801561079357600080fd5b506102ad6107a2366004612edb565b6001600160a01b03918216600090815260166020908152604080832093909416825291909152205460ff1690565b3480156107dc57600080fd5b50610319612072565b3480156107f157600080fd5b506102e2610800366004612ec0565b61207f565b34801561081157600080fd5b5061040d610820366004612ec0565b61211a565b60006001600160e01b031982166380ac58cd60e01b148061085657506001600160e01b03198216635b5e139f60e01b145b8061087157506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000546001600160a01b031633146108aa5760405162461bcd60e51b81526004016108a190613299565b60405180910390fd5b6012546040516355f804b360e01b81526001600160a01b03909116906355f804b3906108da9084906004016131ff565b600060405180830381600087803b1580156108f457600080fd5b505af1158015610908573d6000803e3d6000fd5b5050505050565b685150ae84a8cdf00000600361092433611593565b10156109725760405162461bcd60e51b815260206004820152601a60248201527f4d7573742048617665203320554e4252454420447261676f6e7300000000000060448201526064016108a1565b6010546040516370a0823160e01b815233600482015282916001600160a01b0316906370a082319060240160206040518083038186803b1580156109b557600080fd5b505afa1580156109c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ed91906130c8565b1015610a0b5760405162461bcd60e51b81526004016108a19061331f565b33610a158561151c565b6001600160a01b031614610a3b5760405162461bcd60e51b81526004016108a190613361565b33610a458461151c565b6001600160a01b031614610a6b5760405162461bcd60e51b81526004016108a190613361565b33610a758361151c565b6001600160a01b031614610a9b5760405162461bcd60e51b81526004016108a190613361565b306000908152600f6020908152604080832087845290915290205460ff1615610ad65760405162461bcd60e51b81526004016108a190613264565b306000908152600f6020908152604080832086845290915290205460ff1615610b115760405162461bcd60e51b81526004016108a190613264565b306000908152600f6020908152604080832085845290915290205460ff1615610b4c5760405162461bcd60e51b81526004016108a190613264565b601054604051632770a7eb60e21b8152336004820152602481018390526001600160a01b0390911690639dc29fac90604401600060405180830381600087803b158015610b9857600080fd5b505af1158015610bac573d6000803e3d6000fd5b50505050610bbd3361dead8661230a565b610bca3361dead8561230a565b610bd73361dead8461230a565b6011546040516335313c2160e11b81523360048201526001600160a01b0390911690636a62784290602401600060405180830381600087803b158015610c1c57600080fd5b505af1158015610c30573d6000803e3d6000fd5b5050505050505050565b606060018054610c4990613418565b80601f0160208091040260200160405190810160405280929190818152602001828054610c7590613418565b8015610cc25780601f10610c9757610100808354040283529160200191610cc2565b820191906000526020600020905b815481529060010190602001808311610ca557829003601f168201915b5050505050905090565b6000818152601360205260408120546001600160a01b0316610d455760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016108a1565b506000908152601560205260409020546001600160a01b031690565b6000610d6c8261151c565b9050806001600160a01b0316836001600160a01b03161415610dda5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016108a1565b336001600160a01b0382161480610df65750610df681336107a2565b610e685760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016108a1565b610e7283836124cd565b505050565b610e81338261253b565b610e9d5760405162461bcd60e51b81526004016108a1906132ce565b610e7283838361230a565b60606000610eb583611593565b905060008167ffffffffffffffff811115610ed257610ed26134da565b604051908082528060200260200182016040528015610efb578160200160208202803683370190505b50905060005b82811015610f4257610f138582610f4a565b828281518110610f2557610f256134c4565b602090810291909101015280610f3a81613453565b915050610f01565b509392505050565b6000610f5583611593565b8210610fb75760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016108a1565b506001600160a01b03919091166000908152600b60209081526040808320938352929052205490565b60008111610fed57600080fd5b600854811115610ffc57600080fd5b60075481611009600d5490565b611013919061338a565b111561101e57600080fd5b60095460ff161561102e57600080fd5b60c8611039600d5490565b10611058578060065461104c91906133b6565b34101561105857600080fd5b60035461106d5761106d600380546001019055565b60015b818111610e7257600061108260035490565b905061108e8482612632565b61109c600380546001019055565b50806110a781613453565b915050611070565b610e72838383604051806020016040528060008152506117bf565b6000546001600160a01b031633146110f45760405162461bcd60e51b81526004016108a190613299565b600655565b60008061110533611593565b905060008167ffffffffffffffff811115611122576111226134da565b60405190808252806020026020018201604052801561114b578160200160208202803683370190505b50905061115733610ea8565b90506000806000805b8581101561125e576000600a6000878481518110611180576111806134c4565b602002602001015181526020019081526020016000206000336001600160a01b03166001600160a01b0316815260200190815260200160002054111561124c57600a60008683815181106111d6576111d66134c4565b602002602001015181526020019081526020016000206000336001600160a01b03166001600160a01b03168152602001908152602001600020544261121b91906133d5565b93506201518061123385678ac7230489e800006133b6565b61123d91906133a2565b9250611249838361338a565b91505b8061125681613453565b915050611160565b5095945050505050565b6000546001600160a01b031633146112925760405162461bcd60e51b81526004016108a190613299565b4773d848353706e5a26baa6dd20265edde1e7047d9ba6108fc6112b66064846133a2565b6112c19060286133b6565b6040518115909202916000818181858888f193505050501580156112e9573d6000803e3d6000fd5b507331fbcd30aa07fbbea5db938cd534d1da79e349856108fc61130d6064846133a2565b6113189060146133b6565b6040518115909202916000818181858888f19350505050158015611340573d6000803e3d6000fd5b5073b6d2ac64bdc24f76417b95b410acf47ce31add076108fc6113646064846133a2565b61136f9060196133b6565b6040518115909202916000818181858888f19350505050158015611397573d6000803e3d6000fd5b5073e44cb360e48da69fe75a78fd1649ccbd3ccf7ad16108fc6113bb6064846133a2565b6113c690600f6133b6565b6040518115909202916000818181858888f193505050501580156113ee573d6000803e3d6000fd5b5050565b60006113fd600d5490565b82106114605760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016108a1565b600d8281548110611473576114736134c4565b90600052602060002001549050919050565b6000546001600160a01b031633146114af5760405162461bcd60e51b81526004016108a190613299565b80516113ee906004906020840190612d95565b6000546001600160a01b031633146114ec5760405162461bcd60e51b81526004016108a190613299565b6011546040516355f804b360e01b81526001600160a01b03909116906355f804b3906108da9084906004016131ff565b6000818152601360205260408120546001600160a01b0316806108715760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016108a1565b60006001600160a01b0382166115fe5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016108a1565b506001600160a01b031660009081526014602052604090205490565b6000546001600160a01b031633146116445760405162461bcd60e51b81526004016108a190613299565b61164e600061264c565b565b601254604051630ae1d72560e21b81523360048201526000916001600160a01b031690632b875c94906024015b60206040518083038186803b15801561169557600080fd5b505afa1580156116a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116cd91906130c8565b905090565b6000546001600160a01b031633146116fc5760405162461bcd60e51b81526004016108a190613299565b600855565b6000546001600160a01b0316331461172b5760405162461bcd60e51b81526004016108a190613299565b6009805460ff19811660ff90911615179055565b601154604051630ae1d72560e21b81523360048201526000916001600160a01b031690632b875c949060240161167d565b606060028054610c4990613418565b600080546001600160a01b031633146117aa5760405162461bcd60e51b81526004016108a190613299565b5060095460ff1690565b6113ee33838361269c565b6117c9338361253b565b6117e55760405162461bcd60e51b81526004016108a1906132ce565b6117f18484848461276b565b50505050565b600061180233611593565b1161184f5760405162461bcd60e51b815260206004820152601860248201527f4e6f74205175616c696669656420466f7220526577617264000000000000000060448201526064016108a1565b600061185a33611593565b905060008167ffffffffffffffff811115611877576118776134da565b6040519080825280602002602001820160405280156118a0578160200160208202803683370190505b5090506118ac33610ea8565b90506000806000805b858110156119f2576000600a60008784815181106118d5576118d56134c4565b602002602001015181526020019081526020016000206000336001600160a01b03166001600160a01b031681526020019081526020016000205411156119e057600a600086838151811061192b5761192b6134c4565b602002602001015181526020019081526020016000206000336001600160a01b03166001600160a01b03168152602001908152602001600020544261197091906133d5565b93506201518061198885678ac7230489e800006133b6565b61199291906133a2565b925061199e838361338a565b915042600a60008784815181106119b7576119b76134c4565b602090810291909101810151825281810192909252604090810160009081203382529092529020555b806119ea81613453565b9150506118b5565b506010546040516340c10f1960e01b8152336004820152602481018390526001600160a01b03909116906340c10f1990604401600060405180830381600087803b158015611a3f57600080fd5b505af1158015611a53573d6000803e3d6000fd5b50506011546040516370a0823160e01b8152336004820152600093506001600160a01b0390911691506370a082319060240160206040518083038186803b158015611a9d57600080fd5b505afa158015611ab1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ad591906130c8565b1115611b395760115460405163281e973960e11b81523360048201526001600160a01b039091169063503d2e7290602401600060405180830381600087803b158015611b2057600080fd5b505af1158015611b34573d6000803e3d6000fd5b505050505b6012546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a082319060240160206040518083038186803b158015611b7d57600080fd5b505afa158015611b91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bb591906130c8565b11156109085760125460405163281e973960e11b81523360048201526001600160a01b039091169063503d2e7290602401600060405180830381600087803b158015611c0057600080fd5b505af1158015611c14573d6000803e3d6000fd5b505050505050505050565b60058054611c2c90613418565b80601f0160208091040260200160405190810160405280929190818152602001828054611c5890613418565b8015611ca55780601f10611c7a57610100808354040283529160200191611ca5565b820191906000526020600020905b815481529060010190602001808311611c8857829003601f168201915b505050505081565b6000818152601360205260409020546060906001600160a01b0316611d2c5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016108a1565b6000611d3661279e565b90506000815111611d565760405180602001604052806000815250611d81565b80611d60846127ad565b604051602001611d7192919061315b565b6040516020818303038152906040525b9392505050565b6000546001600160a01b03163314611db25760405162461bcd60e51b81526004016108a190613299565b601254604051631752e98560e21b8152600481018390526001600160a01b0390911690635d4ba614906024016108da565b686194049f30f72000006002611df833611593565b1015611e3d5760405162461bcd60e51b81526020600482015260146024820152734d757374204f776e2032203078447261676f6e7360601b60448201526064016108a1565b6010546040516370a0823160e01b815233600482015282916001600160a01b0316906370a082319060240160206040518083038186803b158015611e8057600080fd5b505afa158015611e94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eb891906130c8565b1015611ed65760405162461bcd60e51b81526004016108a19061331f565b33611ee08461151c565b6001600160a01b031614611f065760405162461bcd60e51b81526004016108a190613361565b33611f108361151c565b6001600160a01b031614611f365760405162461bcd60e51b81526004016108a190613361565b601054604051632770a7eb60e21b8152336004820152602481018390526001600160a01b0390911690639dc29fac90604401600060405180830381600087803b158015611f8257600080fd5b505af1158015611f96573d6000803e3d6000fd5b5050306000908152600f602090815260408083208884529091528082208054600160ff1991821681179092558784529282902080549093161790915560125490516335313c2160e11b81523360048201526001600160a01b039091169250636a6278429150602401600060405180830381600087803b15801561201857600080fd5b505af115801561202c573d6000803e3d6000fd5b50505050505050565b6000546001600160a01b0316331461205f5760405162461bcd60e51b81526004016108a190613299565b80516113ee906005906020840190612d95565b60048054611c2c90613418565b6000546001600160a01b031633146120a95760405162461bcd60e51b81526004016108a190613299565b6001600160a01b03811661210e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108a1565b6121178161264c565b50565b6060600061212783611593565b905060008167ffffffffffffffff811115612144576121446134da565b60405190808252806020026020018201604052801561216d578160200160208202803683370190505b50905061217984610ea8565b90506000805b838110156121ef57306000908152600f6020526040812084519091908590849081106121ad576121ad6134c4565b60209081029190910181015182528101919091526040016000205460ff166121dd57816121d981613453565b9250505b806121e781613453565b91505061217f565b5060008167ffffffffffffffff81111561220b5761220b6134da565b604051908082528060200260200182016040528015612234578160200160208202803683370190505b5090506000805b858110156122e257306000908152600f602052604081208651909190879084908110612269576122696134c4565b60209081029190910181015182528101919091526040016000205460ff166122d05784818151811061229d5761229d6134c4565b60200260200101518383815181106122b7576122b76134c4565b6020908102919091010152816122cc81613453565b9250505b806122da81613453565b91505061223b565b50909695505050505050565b5490565b80546001019055565b6001600160a01b03163b151590565b826001600160a01b031661231d8261151c565b6001600160a01b0316146123815760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016108a1565b6001600160a01b0382166123e35760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016108a1565b6123ee8383836128ab565b6123f96000826124cd565b6001600160a01b03831660009081526014602052604081208054600192906124229084906133d5565b90915550506001600160a01b038216600090815260146020526040812080546001929061245090849061338a565b9091555050600081815260136020908152604080832080546001600160a01b0319166001600160a01b03878116918217909255600a84528285208186529093528184204290558616808452818420849055905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600081815260156020526040902080546001600160a01b0319166001600160a01b03841690811790915581906125028261151c565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152601360205260408120546001600160a01b03166125b45760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016108a1565b60006125bf8361151c565b9050806001600160a01b0316846001600160a01b031614806125fa5750836001600160a01b03166125ef84610ccc565b6001600160a01b0316145b8061262a57506001600160a01b0380821660009081526016602090815260408083209388168352929052205460ff165b949350505050565b6113ee828260405180602001604052806000815250612963565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b816001600160a01b0316836001600160a01b031614156126fe5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016108a1565b6001600160a01b03838116600081815260166020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61277684848461230a565b61278284848484612996565b6117f15760405162461bcd60e51b81526004016108a190613212565b606060048054610c4990613418565b6060816127d15750506040805180820190915260018152600360fc1b602082015290565b8160005b81156127fb57806127e581613453565b91506127f49050600a836133a2565b91506127d5565b60008167ffffffffffffffff811115612816576128166134da565b6040519080825280601f01601f191660200182016040528015612840576020820181803683370190505b5090505b841561262a576128556001836133d5565b9150612862600a8661346e565b61286d90603061338a565b60f81b818381518110612882576128826134c4565b60200101906001600160f81b031916908160001a9053506128a4600a866133a2565b9450612844565b6001600160a01b0383166129065761290181600d80546000838152600e60205260408120829055600182018355919091527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb50155565b612929565b816001600160a01b0316836001600160a01b031614612929576129298382612aa3565b6001600160a01b03821661294057610e7281612b40565b826001600160a01b0316826001600160a01b031614610e7257610e728282612bef565b61296d8383612c33565b61297a6000848484612996565b610e725760405162461bcd60e51b81526004016108a190613212565b60006001600160a01b0384163b15612a9857604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906129da90339089908890889060040161318a565b602060405180830381600087803b1580156129f457600080fd5b505af1925050508015612a24575060408051601f3d908101601f19168201909252612a2191810190613049565b60015b612a7e573d808015612a52576040519150601f19603f3d011682016040523d82523d6000602084013e612a57565b606091505b508051612a765760405162461bcd60e51b81526004016108a190613212565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061262a565b506001949350505050565b60006001612ab084611593565b612aba91906133d5565b6000838152600c6020526040902054909150808214612b0d576001600160a01b0384166000908152600b602090815260408083208584528252808320548484528184208190558352600c90915290208190555b506000918252600c602090815260408084208490556001600160a01b039094168352600b81528383209183525290812055565b600d54600090612b52906001906133d5565b6000838152600e6020526040812054600d8054939450909284908110612b7a57612b7a6134c4565b9060005260206000200154905080600d8381548110612b9b57612b9b6134c4565b6000918252602080832090910192909255828152600e9091526040808220849055858252812055600d805480612bd357612bd36134ae565b6001900381819060005260206000200160009055905550505050565b6000612bfa83611593565b6001600160a01b039093166000908152600b602090815260408083208684528252808320859055938252600c9052919091209190915550565b6001600160a01b038216612c895760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016108a1565b6000818152601360205260409020546001600160a01b031615612cee5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016108a1565b612cfa600083836128ab565b6001600160a01b0382166000908152601460205260408120805460019290612d2390849061338a565b9091555050600081815260136020908152604080832080546001600160a01b0319166001600160a01b038716908117909155600a8352818420818552909252808320429055518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054612da190613418565b90600052602060002090601f016020900481019282612dc35760008555612e09565b82601f10612ddc57805160ff1916838001178555612e09565b82800160010185558215612e09579182015b82811115612e09578251825591602001919060010190612dee565b50612e15929150612e19565b5090565b5b80821115612e155760008155600101612e1a565b600067ffffffffffffffff80841115612e4957612e496134da565b604051601f8501601f19908116603f01168101908282118183101715612e7157612e716134da565b81604052809350858152868686011115612e8a57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114612ebb57600080fd5b919050565b600060208284031215612ed257600080fd5b611d8182612ea4565b60008060408385031215612eee57600080fd5b612ef783612ea4565b9150612f0560208401612ea4565b90509250929050565b600080600060608486031215612f2357600080fd5b612f2c84612ea4565b9250612f3a60208501612ea4565b9150604084013590509250925092565b60008060008060808587031215612f6057600080fd5b612f6985612ea4565b9350612f7760208601612ea4565b925060408501359150606085013567ffffffffffffffff811115612f9a57600080fd5b8501601f81018713612fab57600080fd5b612fba87823560208401612e2e565b91505092959194509250565b60008060408385031215612fd957600080fd5b612fe283612ea4565b915060208301358015158114612ff757600080fd5b809150509250929050565b6000806040838503121561301557600080fd5b61301e83612ea4565b946020939093013593505050565b60006020828403121561303e57600080fd5b8135611d81816134f0565b60006020828403121561305b57600080fd5b8151611d81816134f0565b60006020828403121561307857600080fd5b813567ffffffffffffffff81111561308f57600080fd5b8201601f810184136130a057600080fd5b61262a84823560208401612e2e565b6000602082840312156130c157600080fd5b5035919050565b6000602082840312156130da57600080fd5b5051919050565b600080604083850312156130f457600080fd5b50508035926020909101359150565b60008060006060848603121561311857600080fd5b505081359360208301359350604090920135919050565b600081518084526131478160208601602086016133ec565b601f01601f19169290920160200192915050565b6000835161316d8184602088016133ec565b8351908301906131818183602088016133ec565b01949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906131bd9083018461312f565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156122e2578351835292840192918401916001016131e3565b602081526000611d81602083018461312f565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4272656420447261676f6e732043414e27542042652053616372696669636564604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526022908201527f596f7520446f6e7420486176652054686520245343414c4520466f7220546861604082015261742160f01b606082015260800190565b6020808252600f908201526e2727aa102ca7aaa910222920a3a7a760891b604082015260600190565b6000821982111561339d5761339d613482565b500190565b6000826133b1576133b1613498565b500490565b60008160001904831182151516156133d0576133d0613482565b500290565b6000828210156133e7576133e7613482565b500390565b60005b838110156134075781810151838201526020016133ef565b838111156117f15750506000910152565b600181811c9082168061342c57607f821691505b6020821081141561344d57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561346757613467613482565b5060010190565b60008261347d5761347d613498565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461211757600080fdfea26469706673582212200b4e1704e1f98ed9d4d969b538b44b7c1e2c9dfbc0f63b7b49a5d7bac308fd5a64736f6c63430008070033

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

0000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000021e19e0c9bab2400000000000000000000000000000b6d2ac64bdc24f76417b95b410acf47ce31add070000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000093078447261676f6e73000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034f5844000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000055343414c4500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000055343414c450000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008416e6369656e74730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005414e434e5400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000095779726d6c696e6773000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045759524d00000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name_ (string): 0xDragons
Arg [1] : symbol_ (string): OXD
Arg [2] : ERC20name_ (string): SCALE
Arg [3] : ERC20symbol_ (string): SCALE
Arg [4] : ERC20amount (uint256): 10000000000000000000000
Arg [5] : ERC20owneraddress (address): 0xB6D2ac64BDc24f76417b95b410ACf47cE31AdD07
Arg [6] : ancientnftname_ (string): Ancients
Arg [7] : ancientnftsymbol_ (string): ANCNT
Arg [8] : babynftname_ (string): Wyrmlings
Arg [9] : babynftsymbol_ (string): WYRM

-----Encoded View---------------
26 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [2] : 00000000000000000000000000000000000000000000000000000000000001c0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000200
Arg [4] : 00000000000000000000000000000000000000000000021e19e0c9bab2400000
Arg [5] : 000000000000000000000000b6d2ac64bdc24f76417b95b410acf47ce31add07
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000240
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000280
Arg [8] : 00000000000000000000000000000000000000000000000000000000000002c0
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000300
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [11] : 3078447261676f6e730000000000000000000000000000000000000000000000
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [13] : 4f58440000000000000000000000000000000000000000000000000000000000
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [15] : 5343414c45000000000000000000000000000000000000000000000000000000
Arg [16] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [17] : 5343414c45000000000000000000000000000000000000000000000000000000
Arg [18] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [19] : 416e6369656e7473000000000000000000000000000000000000000000000000
Arg [20] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [21] : 414e434e54000000000000000000000000000000000000000000000000000000
Arg [22] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [23] : 5779726d6c696e67730000000000000000000000000000000000000000000000
Arg [24] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [25] : 5759524d00000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

87133:22999:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;94343:305;;;;;;;;;;-1:-1:-1;94343:305:0;;;;;:::i;:::-;;:::i;:::-;;;7325:14:1;;7318:22;7300:41;;7288:2;7273:18;94343:305:0;;;;;;;;103678:122;;;;;;;;;;-1:-1:-1;103678:122:0;;;;;:::i;:::-;;:::i;:::-;;102445:1104;;;;;;;;;;-1:-1:-1;102445:1104:0;;;;;:::i;:::-;;:::i;95130:100::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;96301:221::-;;;;;;;;;;-1:-1:-1;96301:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;5707:32:1;;;5689:51;;5677:2;5662:18;96301:221:0;5543:203:1;95877:411:0;;;;;;;;;;-1:-1:-1;95877:411:0;;;;;:::i;:::-;;:::i;87673:32::-;;;;;;;;;;;;;;;;;;;17090:25:1;;;17078:2;17063:18;87673:32:0;16944:177:1;90701:113:0;;;;;;;;;;-1:-1:-1;90789:10:0;:17;90701:113;;87750:33;;;;;;;;;;;;;;;;96875:339;;;;;;;;;;-1:-1:-1;96875:339:0;;;;;:::i;:::-;;:::i;105038:388::-;;;;;;;;;;-1:-1:-1;105038:388:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;90376:249::-;;;;;;;;;;-1:-1:-1;90376:249:0;;;;;:::i;:::-;;:::i;107762:154::-;;;;;;;;;;-1:-1:-1;107848:8:0;;-1:-1:-1;;;;;107848:8:0;107762:154;;100051:875;;;;;;:::i;:::-;;:::i;97227:185::-;;;;;;;;;;-1:-1:-1;97227:185:0;;;;;:::i;:::-;;:::i;103950:86::-;;;;;;;;;;-1:-1:-1;103950:86:0;;;;;:::i;:::-;;:::i;105434:685::-;;;;;;;;;;;;;:::i;104531:497::-;;;;;;;;;;;;;:::i;90891:216::-;;;;;;;;;;-1:-1:-1;90891:216:0;;;;;:::i;:::-;;:::i;104236:105::-;;;;;;;;;;-1:-1:-1;104236:105:0;;;;;:::i;:::-;;:::i;103812:128::-;;;;;;;;;;-1:-1:-1;103812:128:0;;;;;:::i;:::-;;:::i;87790:26::-;;;;;;;;;;-1:-1:-1;87790:26:0;;;;;;;;94878:239;;;;;;;;;;-1:-1:-1;94878:239:0;;;;;:::i;:::-;;:::i;94660:208::-;;;;;;;;;;-1:-1:-1;94660:208:0;;;;;:::i;:::-;;:::i;23017:103::-;;;;;;;;;;;;;:::i;106257:116::-;;;;;;;;;;;;;:::i;104099:122::-;;;;;;;;;;-1:-1:-1;104099:122:0;;;;;:::i;:::-;;:::i;91115:73::-;;;;;;;;;;;;;:::i;106127:122::-;;;;;;;;;;;;;:::i;22366:87::-;;;;;;;;;;-1:-1:-1;22412:7:0;22439:6;-1:-1:-1;;;;;22439:6:0;22366:87;;95243:104;;;;;;;;;;;;;:::i;91196:91::-;;;;;;;;;;;;;:::i;96534:155::-;;;;;;;;;;-1:-1:-1;96534:155:0;;;;;:::i;:::-;;:::i;97420:328::-;;;;;;;;;;-1:-1:-1;97420:328:0;;;;;:::i;:::-;;:::i;106381:1023::-;;;;;;;;;;;;;:::i;107415:151::-;;;;;;;;;;-1:-1:-1;107499:6:0;;-1:-1:-1;;;;;107499:6:0;107415:151;;87629:37;;;;;;;;;;;;;:::i;95418:334::-;;;;;;;;;;-1:-1:-1;95418:334:0;;;;;:::i;:::-;;:::i;103562:109::-;;;;;;;;;;-1:-1:-1;103562:109:0;;;;;:::i;:::-;;:::i;87712:31::-;;;;;;;;;;;;;;;;101858:573;;;;;;;;;;-1:-1:-1;101858:573:0;;;;;:::i;:::-;;:::i;104385:128::-;;;;;;;;;;-1:-1:-1;104385:128:0;;;;;:::i;:::-;;:::i;107581:166::-;;;;;;;;;;-1:-1:-1;107670:11:0;;-1:-1:-1;;;;;107670:11:0;107581:166;;96699:164;;;;;;;;;;-1:-1:-1;96699:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;96820:25:0;;;96796:4;96820:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;96699:164;87541:81;;;;;;;;;;;;;:::i;23275:201::-;;;;;;;;;;-1:-1:-1;23275:201:0;;;;;:::i;:::-;;:::i;100934:899::-;;;;;;;;;;-1:-1:-1;100934:899:0;;;;;:::i;:::-;;:::i;94343:305::-;94445:4;-1:-1:-1;;;;;;94482:40:0;;-1:-1:-1;;;94482:40:0;;:105;;-1:-1:-1;;;;;;;94539:48:0;;-1:-1:-1;;;94539:48:0;94482:105;:158;;;-1:-1:-1;;;;;;;;;;35456:40:0;;;94604:36;94462:178;94343:305;-1:-1:-1;;94343:305:0:o;103678:122::-;22412:7;22439:6;-1:-1:-1;;;;;22439:6:0;8244:10;22586:23;22578:68;;;;-1:-1:-1;;;22578:68:0;;;;;;;:::i;:::-;;;;;;;;;103761:8:::1;::::0;:32:::1;::::0;-1:-1:-1;;;103761:32:0;;-1:-1:-1;;;;;103761:8:0;;::::1;::::0;:19:::1;::::0;:32:::1;::::0;103781:11;;103761:32:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;103678:122:::0;:::o;102445:1104::-;102517:11;102566:1;102543:21;102553:10;102543:9;:21::i;:::-;:24;;102535:63;;;;-1:-1:-1;;;102535:63:0;;15631:2:1;102535:63:0;;;15613:21:1;15670:2;15650:18;;;15643:30;15709:28;15689:18;;;15682:56;15755:18;;102535:63:0;15429:350:1;102535:63:0;102614:6;;:28;;-1:-1:-1;;;102614:28:0;;102631:10;102614:28;;;5689:51:1;102646:6:0;;-1:-1:-1;;;;;102614:6:0;;:16;;5662:18:1;;102614:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:38;;102605:85;;;;-1:-1:-1;;;102605:85:0;;;;;;;:::i;:::-;102720:10;102706:12;102714:3;102706:7;:12::i;:::-;-1:-1:-1;;;;;102706:24:0;;102697:52;;;;-1:-1:-1;;;102697:52:0;;;;;;;:::i;:::-;102779:10;102765:12;102773:3;102765:7;:12::i;:::-;-1:-1:-1;;;;;102765:24:0;;102756:52;;;;-1:-1:-1;;;102756:52:0;;;;;;;:::i;:::-;102838:10;102824:12;102832:3;102824:7;:12::i;:::-;-1:-1:-1;;;;;102824:24:0;;102815:52;;;;-1:-1:-1;;;102815:52:0;;;;;;;:::i;:::-;102901:4;102884:23;;;;:8;:23;;;;;;;;:28;;;;;;;;;;;:35;102875:81;;;;-1:-1:-1;;;102875:81:0;;;;;;;:::i;:::-;102989:4;102972:23;;;;:8;:23;;;;;;;;:28;;;;;;;;;;;:35;102963:81;;;;-1:-1:-1;;;102963:81:0;;;;;;;:::i;:::-;103078:4;103061:23;;;;:8;:23;;;;;;;;:28;;;;;;;;;;;:35;103052:81;;;;-1:-1:-1;;;103052:81:0;;;;;;;:::i;:::-;103140:6;;:31;;-1:-1:-1;;;103140:31:0;;103152:10;103140:31;;;6418:51:1;6485:18;;;6478:34;;;-1:-1:-1;;;;;103140:6:0;;;;:11;;6391:18:1;;103140:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;103178:94;103196:10;103215:42;103266:3;103178:9;:94::i;:::-;103275;103293:10;103312:42;103363:3;103275:9;:94::i;:::-;103372;103390:10;103409:42;103460:3;103372:9;:94::i;:::-;103489:11;;:28;;-1:-1:-1;;;103489:28:0;;103506:10;103489:28;;;5689:51:1;-1:-1:-1;;;;;103489:11:0;;;;:16;;5662:18:1;;103489:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;102498:1051;102445:1104;;;:::o;95130:100::-;95184:13;95217:5;95210:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;95130:100;:::o;96301:221::-;96377:7;98173:16;;;:7;:16;;;;;;-1:-1:-1;;;;;98173:16:0;96397:73;;;;-1:-1:-1;;;96397:73:0;;13621:2:1;96397:73:0;;;13603:21:1;13660:2;13640:18;;;13633:30;13699:34;13679:18;;;13672:62;-1:-1:-1;;;13750:18:1;;;13743:42;13802:19;;96397:73:0;13419:408:1;96397:73:0;-1:-1:-1;96490:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;96490:24:0;;96301:221::o;95877:411::-;95958:13;95974:23;95989:7;95974:14;:23::i;:::-;95958:39;;96022:5;-1:-1:-1;;;;;96016:11:0;:2;-1:-1:-1;;;;;96016:11:0;;;96008:57;;;;-1:-1:-1;;;96008:57:0;;14811:2:1;96008:57:0;;;14793:21:1;14850:2;14830:18;;;14823:30;14889:34;14869:18;;;14862:62;-1:-1:-1;;;14940:18:1;;;14933:31;14981:19;;96008:57:0;14609:397:1;96008:57:0;8244:10;-1:-1:-1;;;;;96100:21:0;;;;:62;;-1:-1:-1;96125:37:0;96142:5;8244:10;96699:164;:::i;96125:37::-;96078:168;;;;-1:-1:-1;;;96078:168:0;;11653:2:1;96078:168:0;;;11635:21:1;11692:2;11672:18;;;11665:30;11731:34;11711:18;;;11704:62;11802:26;11782:18;;;11775:54;11846:19;;96078:168:0;11451:420:1;96078:168:0;96259:21;96268:2;96272:7;96259:8;:21::i;:::-;95947:341;95877:411;;:::o;96875:339::-;97070:41;8244:10;97103:7;97070:18;:41::i;:::-;97062:103;;;;-1:-1:-1;;;97062:103:0;;;;;;;:::i;:::-;97178:28;97188:4;97194:2;97198:7;97178:9;:28::i;105038:388::-;105123:16;105157:23;105183:17;105193:6;105183:9;:17::i;:::-;105157:43;;105211:25;105253:15;105239:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;105239:30:0;;105211:58;;105285:9;105280:113;105300:15;105296:1;:19;105280:113;;;105351:30;105371:6;105379:1;105351:19;:30::i;:::-;105337:8;105346:1;105337:11;;;;;;;;:::i;:::-;;;;;;;;;;:44;105317:3;;;;:::i;:::-;;;;105280:113;;;-1:-1:-1;105410:8:0;105038:388;-1:-1:-1;;;105038:388:0:o;90376:249::-;90473:7;90509:16;90519:5;90509:9;:16::i;:::-;90501:5;:24;90493:80;;;;-1:-1:-1;;;90493:80:0;;7778:2:1;90493:80:0;;;7760:21:1;7817:2;7797:18;;;7790:30;7856:34;7836:18;;;7829:62;-1:-1:-1;;;7907:18:1;;;7900:41;7958:19;;90493:80:0;7576:407:1;90493:80:0;-1:-1:-1;;;;;;90591:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;90376:249::o;100051:875::-;100229:1;100215:11;:15;100207:24;;;;;;100265:13;;100250:11;:28;;100242:37;;;;;;100330:9;;100315:11;100299:13;90789:10;:17;;90701:113;100299:13;:27;;;;:::i;:::-;:40;;100290:50;;;;;;100359:6;;;;:15;100351:24;;;;;;100504:3;100487:13;90789:10;:17;;90701:113;100487:13;:20;100482:102;;100556:11;100549:4;;:18;;;;:::i;:::-;100536:9;:31;;100528:40;;;;;;100642:9;4754:14;100638:74;;100680:21;:9;4873:19;;4891:1;4873:19;;;4784:127;100680:21;100749:1;100732:187;100757:11;100752:1;:16;100732:187;;100790:18;100811:19;:9;4754:14;;4662:114;100811:19;100790:40;;100845:26;100855:3;100860:10;100845:9;:26::i;:::-;100886:21;:9;4873:19;;4891:1;4873:19;;;4784:127;100886:21;-1:-1:-1;100770:3:0;;;;:::i;:::-;;;;100732:187;;97227:185;97365:39;97382:4;97388:2;97392:7;97365:39;;;;;;;;;;;;:16;:39::i;103950:86::-;22412:7;22439:6;-1:-1:-1;;;;;22439:6:0;8244:10;22586:23;22578:68;;;;-1:-1:-1;;;22578:68:0;;;;;;;:::i;:::-;104013:4:::1;:15:::0;103950:86::o;105434:685::-;105479:4;105497:23;105523:21;105533:10;105523:9;:21::i;:::-;105497:47;;105558:25;105600:15;105586:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;105586:30:0;;105558:58;;105638:23;105650:10;105638:11;:23::i;:::-;105628:33;;105685:12;105710:11;105734:14;105765:6;105760:323;105775:15;105773:1;:17;105760:323;;;105874:1;105831:17;:30;105849:8;105858:1;105849:11;;;;;;;;:::i;:::-;;;;;;;105831:30;;;;;;;;;;;:42;105862:10;-1:-1:-1;;;;;105831:42:0;-1:-1:-1;;;;;105831:42:0;;;;;;;;;;;;;:44;105827:245;;;105919:17;:30;105937:8;105946:1;105937:11;;;;;;;;:::i;:::-;;;;;;;105919:30;;;;;;;;;;;:42;105950:10;-1:-1:-1;;;;;105919:42:0;-1:-1:-1;;;;;105919:42:0;;;;;;;;;;;;;105901:15;:60;;;;:::i;:::-;105891:70;-1:-1:-1;106008:5:0;105987:19;105891:70;105988:9;105987:19;:::i;:::-;105986:27;;;;:::i;:::-;105977:36;-1:-1:-1;106028:17:0;105977:36;106028:17;;:::i;:::-;;;105827:245;105792:3;;;;:::i;:::-;;;;105760:323;;;-1:-1:-1;106102:9:0;105434:685;-1:-1:-1;;;;;105434:685:0:o;104531:497::-;22412:7;22439:6;-1:-1:-1;;;;;22439:6:0;8244:10;22586:23;22578:68;;;;-1:-1:-1;;;22578:68:0;;;;;;;:::i;:::-;104633:21:::1;88011:42;104738:51;104769:13;104779:3;104633:21:::0;104769:13:::1;:::i;:::-;104768:20;::::0;104786:2:::1;104768:20;:::i;:::-;104738:51;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;87914:42:0::1;104816:52;104848:13;104858:3;104848:7:::0;:13:::1;:::i;:::-;104847:20;::::0;104865:2:::1;104847:20;:::i;:::-;104816:52;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;88096:42:0::1;104895:48;104923:13;104933:3;104923:7:::0;:13:::1;:::i;:::-;104922:20;::::0;104940:2:::1;104922:20;:::i;:::-;104895:48;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;88192:42:0::1;104970:50;105000:13;105010:3;105000:7:::0;:13:::1;:::i;:::-;104999:20;::::0;105017:2:::1;104999:20;:::i;:::-;104970:50;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;104565:463;104531:497::o:0;90891:216::-;90966:7;91002:13;90789:10;:17;;90701:113;91002:13;90994:5;:21;90986:78;;;;-1:-1:-1;;;90986:78:0;;15986:2:1;90986:78:0;;;15968:21:1;16025:2;16005:18;;;15998:30;16064:34;16044:18;;;16037:62;-1:-1:-1;;;16115:18:1;;;16108:42;16167:19;;90986:78:0;15784:408:1;90986:78:0;91082:10;91093:5;91082:17;;;;;;;;:::i;:::-;;;;;;;;;91075:24;;90891:216;;;:::o;104236:105::-;22412:7;22439:6;-1:-1:-1;;;;;22439:6:0;8244:10;22586:23;22578:68;;;;-1:-1:-1;;;22578:68:0;;;;;;;:::i;:::-;104311:22;;::::1;::::0;:8:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;103812:128::-:0;22412:7;22439:6;-1:-1:-1;;;;;22439:6:0;8244:10;22586:23;22578:68;;;;-1:-1:-1;;;22578:68:0;;;;;;;:::i;:::-;103898:11:::1;::::0;:35:::1;::::0;-1:-1:-1;;;103898:35:0;;-1:-1:-1;;;;;103898:11:0;;::::1;::::0;:22:::1;::::0;:35:::1;::::0;103921:11;;103898:35:::1;;;:::i;94878:239::-:0;94950:7;94986:16;;;:7;:16;;;;;;-1:-1:-1;;;;;94986:16:0;95021:19;95013:73;;;;-1:-1:-1;;;95013:73:0;;12850:2:1;95013:73:0;;;12832:21:1;12889:2;12869:18;;;12862:30;12928:34;12908:18;;;12901:62;-1:-1:-1;;;12979:18:1;;;12972:39;13028:19;;95013:73:0;12648:405:1;94660:208:0;94732:7;-1:-1:-1;;;;;94760:19:0;;94752:74;;;;-1:-1:-1;;;94752:74:0;;12439:2:1;94752:74:0;;;12421:21:1;12478:2;12458:18;;;12451:30;12517:34;12497:18;;;12490:62;-1:-1:-1;;;12568:18:1;;;12561:40;12618:19;;94752:74:0;12237:406:1;94752:74:0;-1:-1:-1;;;;;;94844:16:0;;;;;:9;:16;;;;;;;94660:208::o;23017:103::-;22412:7;22439:6;-1:-1:-1;;;;;22439:6:0;8244:10;22586:23;22578:68;;;;-1:-1:-1;;;22578:68:0;;;;;;;:::i;:::-;23082:30:::1;23109:1;23082:18;:30::i;:::-;23017:103::o:0;106257:116::-;106330:8;;:35;;-1:-1:-1;;;106330:35:0;;106354:10;106330:35;;;5689:51:1;106309:4:0;;-1:-1:-1;;;;;106330:8:0;;:23;;5662:18:1;;106330:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;106323:42;;106257:116;:::o;104099:122::-;22412:7;22439:6;-1:-1:-1;;;;;22439:6:0;8244:10;22586:23;22578:68;;;;-1:-1:-1;;;22578:68:0;;;;;;;:::i;:::-;104180:13:::1;:33:::0;104099:122::o;91115:73::-;22412:7;22439:6;-1:-1:-1;;;;;22439:6:0;8244:10;22586:23;22578:68;;;;-1:-1:-1;;;22578:68:0;;;;;;;:::i;:::-;91171:6:::1;::::0;;-1:-1:-1;;91161:16:0;::::1;91171:6;::::0;;::::1;91170:7;91161:16;::::0;;91115:73::o;106127:122::-;106203:11;;:38;;-1:-1:-1;;;106203:38:0;;106230:10;106203:38;;;5689:51:1;106182:4:0;;-1:-1:-1;;;;;106203:11:0;;:26;;5662:18:1;;106203:38:0;5543:203:1;95243:104:0;95299:13;95332:7;95325:14;;;;;:::i;91196:91::-;91248:4;22439:6;;-1:-1:-1;;;;;22439:6:0;8244:10;22586:23;22578:68;;;;-1:-1:-1;;;22578:68:0;;;;;;;:::i;:::-;-1:-1:-1;91272:6:0::1;::::0;::::1;;91196:91:::0;:::o;96534:155::-;96629:52;8244:10;96662:8;96672;96629:18;:52::i;97420:328::-;97595:41;8244:10;97628:7;97595:18;:41::i;:::-;97587:103;;;;-1:-1:-1;;;97587:103:0;;;;;;;:::i;:::-;97701:39;97715:4;97721:2;97725:7;97734:5;97701:13;:39::i;:::-;97420:328;;;;:::o;106381:1023::-;106454:1;106432:21;106442:10;106432:9;:21::i;:::-;:23;106424:60;;;;-1:-1:-1;;;106424:60:0;;10887:2:1;106424:60:0;;;10869:21:1;10926:2;10906:18;;;10899:30;10965:26;10945:18;;;10938:54;11009:18;;106424:60:0;10685:348:1;106424:60:0;106496:23;106522:21;106532:10;106522:9;:21::i;:::-;106496:47;;106557:25;106599:15;106585:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;106585:30:0;;106557:58;;106637:23;106649:10;106637:11;:23::i;:::-;106627:33;;106684:12;106709:11;106733:14;106764:6;106759:382;106774:15;106772:1;:17;106759:382;;;106873:1;106830:17;:30;106848:8;106857:1;106848:11;;;;;;;;:::i;:::-;;;;;;;106830:30;;;;;;;;;;;:42;106861:10;-1:-1:-1;;;;;106830:42:0;-1:-1:-1;;;;;106830:42:0;;;;;;;;;;;;;:44;106826:304;;;106918:17;:30;106936:8;106945:1;106936:11;;;;;;;;:::i;:::-;;;;;;;106918:30;;;;;;;;;;;:42;106949:10;-1:-1:-1;;;;;106918:42:0;-1:-1:-1;;;;;106918:42:0;;;;;;;;;;;;;106900:15;:60;;;;:::i;:::-;106890:70;-1:-1:-1;107007:5:0;106986:19;106890:70;106987:9;106986:19;:::i;:::-;106985:27;;;;:::i;:::-;106976:36;-1:-1:-1;107027:17:0;106976:36;107027:17;;:::i;:::-;;;107100:15;107057:17;:30;107075:8;107084:1;107075:11;;;;;;;;:::i;:::-;;;;;;;;;;;;107057:30;;;;;;;;;;;;;-1:-1:-1;107057:30:0;;;107088:10;107057:42;;;;;;;:58;106826:304;106791:3;;;;:::i;:::-;;;;106759:382;;;-1:-1:-1;107154:6:0;;:33;;-1:-1:-1;;;107154:33:0;;107166:10;107154:33;;;6418:51:1;6485:18;;;6478:34;;;-1:-1:-1;;;;;107154:6:0;;;;:11;;6391:18:1;;107154:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;107199:11:0;;:33;;-1:-1:-1;;;107199:33:0;;107221:10;107199:33;;;5689:51:1;107233:1:0;;-1:-1:-1;;;;;;107199:11:0;;;;-1:-1:-1;107199:21:0;;5662:18:1;;107199:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:35;107195:100;;;107246:11;;:35;;-1:-1:-1;;;107246:35:0;;107270:10;107246:35;;;5689:51:1;-1:-1:-1;;;;;107246:11:0;;;;:23;;5662:18:1;;107246:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;107195:100;107305:8;;:30;;-1:-1:-1;;;107305:30:0;;107324:10;107305:30;;;5689:51:1;107336:1:0;;-1:-1:-1;;;;;107305:8:0;;:18;;5662::1;;107305:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:32;107301:92;;;107349:8;;:32;;-1:-1:-1;;;107349:32:0;;107370:10;107349:32;;;5689:51:1;-1:-1:-1;;;;;107349:8:0;;;;:20;;5662:18:1;;107349:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;106411:993;;;;;106381:1023::o;87629:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;95418:334::-;98149:4;98173:16;;;:7;:16;;;;;;95491:13;;-1:-1:-1;;;;;98173:16:0;95517:76;;;;-1:-1:-1;;;95517:76:0;;14395:2:1;95517:76:0;;;14377:21:1;14434:2;14414:18;;;14407:30;14473:34;14453:18;;;14446:62;-1:-1:-1;;;14524:18:1;;;14517:45;14579:19;;95517:76:0;14193:411:1;95517:76:0;95606:21;95630:10;:8;:10::i;:::-;95606:34;;95682:1;95664:7;95658:21;:25;:86;;;;;;;;;;;;;;;;;95710:7;95719:18;:7;:16;:18::i;:::-;95693:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;95658:86;95651:93;95418:334;-1:-1:-1;;;95418:334:0:o;103562:109::-;22412:7;22439:6;-1:-1:-1;;;;;22439:6:0;8244:10;22586:23;22578:68;;;;-1:-1:-1;;;22578:68:0;;;;;;;:::i;:::-;103633:8:::1;::::0;:29:::1;::::0;-1:-1:-1;;;103633:29:0;;::::1;::::0;::::1;17090:25:1::0;;;-1:-1:-1;;;;;103633:8:0;;::::1;::::0;:21:::1;::::0;17063:18:1;;103633:29:0::1;16944:177:1::0;101858:573:0;101923:11;101976:1;101953:21;101963:10;101953:9;:21::i;:::-;:24;;101945:57;;;;-1:-1:-1;;;101945:57:0;;9779:2:1;101945:57:0;;;9761:21:1;9818:2;9798:18;;;9791:30;-1:-1:-1;;;9837:18:1;;;9830:50;9897:18;;101945:57:0;9577:344:1;101945:57:0;102022:6;;:28;;-1:-1:-1;;;102022:28:0;;102039:10;102022:28;;;5689:51:1;102054:6:0;;-1:-1:-1;;;;;102022:6:0;;:16;;5662:18:1;;102022:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:38;;102013:85;;;;-1:-1:-1;;;102013:85:0;;;;;;;:::i;:::-;102132:10;102118:12;102126:3;102118:7;:12::i;:::-;-1:-1:-1;;;;;102118:24:0;;102109:52;;;;-1:-1:-1;;;102109:52:0;;;;;;;:::i;:::-;102195:10;102181:12;102189:3;102181:7;:12::i;:::-;-1:-1:-1;;;;;102181:24:0;;102172:52;;;;-1:-1:-1;;;102172:52:0;;;;;;;:::i;:::-;102235:6;;:31;;-1:-1:-1;;;102235:31:0;;102247:10;102235:31;;;6418:51:1;6485:18;;;6478:34;;;-1:-1:-1;;;;;102235:6:0;;;;:11;;6391:18:1;;102235:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;102306:4:0;102289:23;;;;:8;:23;;;;;;;;:28;;;;;;;;;:33;;102318:4;-1:-1:-1;;102289:33:0;;;;;;;;102336:28;;;;;;;:33;;;;;;;;;102396:8;;:25;;-1:-1:-1;;;102396:25:0;;102410:10;102396:25;;;5689:51:1;-1:-1:-1;;;;;102396:8:0;;;;-1:-1:-1;102396:13:0;;-1:-1:-1;5662:18:1;;102396:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;101900:531;101858:573;;:::o;104385:128::-;22412:7;22439:6;-1:-1:-1;;;;;22439:6:0;8244:10;22586:23;22578:68;;;;-1:-1:-1;;;22578:68:0;;;;;;;:::i;:::-;104474:33;;::::1;::::0;:13:::1;::::0;:33:::1;::::0;::::1;::::0;::::1;:::i;87541:81::-:0;;;;;;;:::i;23275:201::-;22412:7;22439:6;-1:-1:-1;;;;;22439:6:0;8244:10;22586:23;22578:68;;;;-1:-1:-1;;;22578:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;23364:22:0;::::1;23356:73;;;::::0;-1:-1:-1;;;23356:73:0;;8609:2:1;23356:73:0::1;::::0;::::1;8591:21:1::0;8648:2;8628:18;;;8621:30;8687:34;8667:18;;;8660:62;-1:-1:-1;;;8738:18:1;;;8731:36;8784:19;;23356:73:0::1;8407:402:1::0;23356:73:0::1;23440:28;23459:8;23440:18;:28::i;:::-;23275:201:::0;:::o;100934:899::-;100997:13;101024:23;101050:14;101060:3;101050:9;:14::i;:::-;101024:40;;101078:25;101120:15;101106:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;101106:30:0;;101078:58;;101158:16;101170:3;101158:11;:16::i;:::-;101148:26;;101211:10;101238:6;101233:186;101248:15;101246:1;:17;101233:186;;;101306:4;101289:23;;;;:8;:23;;;;;101313:11;;101289:23;;;101313:8;;101322:1;;101313:11;;;;;;:::i;:::-;;;;;;;;;;;;101289:36;;;;;;;;;;-1:-1:-1;101289:36:0;;;;101285:94;;101352:7;;;;:::i;:::-;;;;101285:94;101265:3;;;;:::i;:::-;;;;101233:186;;;;101431:37;101485:5;101471:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;101471:20:0;;101431:60;;101504:11;101535:6;101530:249;101545:15;101543:1;:17;101530:249;;;101603:4;101586:23;;;;:8;:23;;;;;101610:11;;101586:23;;;101610:8;;101619:1;;101610:11;;;;;;:::i;:::-;;;;;;;;;;;;101586:36;;;;;;;;;;-1:-1:-1;101586:36:0;;;;101582:157;;101681:8;101690:1;101681:11;;;;;;;;:::i;:::-;;;;;;;101652:20;101673:6;101652:28;;;;;;;;:::i;:::-;;;;;;;;;;:40;101714:8;;;;:::i;:::-;;;;101582:157;101562:3;;;;:::i;:::-;;;;101530:249;;;-1:-1:-1;101801:20:0;;100934:899;-1:-1:-1;;;;;;100934:899:0:o;4662:114::-;4754:14;;4662:114::o;4784:127::-;4873:19;;4891:1;4873:19;;;4784:127::o;25105:326::-;-1:-1:-1;;;;;25400:19:0;;:23;;;25105:326::o;107932:737::-;108091:4;-1:-1:-1;;;;;108064:31:0;:23;108079:7;108064:14;:23::i;:::-;-1:-1:-1;;;;;108064:31:0;;108056:81;;;;-1:-1:-1;;;108056:81:0;;9016:2:1;108056:81:0;;;8998:21:1;9055:2;9035:18;;;9028:30;9094:34;9074:18;;;9067:62;-1:-1:-1;;;9145:18:1;;;9138:35;9190:19;;108056:81:0;8814:401:1;108056:81:0;-1:-1:-1;;;;;108156:16:0;;108148:65;;;;-1:-1:-1;;;108148:65:0;;10128:2:1;108148:65:0;;;10110:21:1;10167:2;10147:18;;;10140:30;10206:34;10186:18;;;10179:62;-1:-1:-1;;;10257:18:1;;;10250:34;10301:19;;108148:65:0;9926:400:1;108148:65:0;108226:39;108247:4;108253:2;108257:7;108226:20;:39::i;:::-;108330:29;108347:1;108351:7;108330:8;:29::i;:::-;-1:-1:-1;;;;;108372:15:0;;;;;;:9;:15;;;;;:20;;108391:1;;108372:15;:20;;108391:1;;108372:20;:::i;:::-;;;;-1:-1:-1;;;;;;;108403:13:0;;;;;;:9;:13;;;;;:18;;108420:1;;108403:13;:18;;108420:1;;108403:18;:::i;:::-;;;;-1:-1:-1;;108432:16:0;;;;:7;:16;;;;;;;;:21;;-1:-1:-1;;;;;;108432:21:0;-1:-1:-1;;;;;108432:21:0;;;;;;;;;108464:17;:26;;;;;:30;;;;;;;;;108495:15;108464:46;;108521:32;;;;;;;;:34;;;108583:27;;108432:16;;108583:27;;;95947:341;95877:411;;:::o;108682:174::-;108757:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;108757:29:0;-1:-1:-1;;;;;108757:29:0;;;;;;;;:24;;108811:23;108757:24;108811:14;:23::i;:::-;-1:-1:-1;;;;;108802:46:0;;;;;;;;;;;108682:174;;:::o;98221:348::-;98314:4;98173:16;;;:7;:16;;;;;;-1:-1:-1;;;;;98173:16:0;98331:73;;;;-1:-1:-1;;;98331:73:0;;11240:2:1;98331:73:0;;;11222:21:1;11279:2;11259:18;;;11252:30;11318:34;11298:18;;;11291:62;-1:-1:-1;;;11369:18:1;;;11362:42;11421:19;;98331:73:0;11038:408:1;98331:73:0;98415:13;98431:23;98446:7;98431:14;:23::i;:::-;98415:39;;98484:5;-1:-1:-1;;;;;98473:16:0;:7;-1:-1:-1;;;;;98473:16:0;;:51;;;;98517:7;-1:-1:-1;;;;;98493:31:0;:20;98505:7;98493:11;:20::i;:::-;-1:-1:-1;;;;;98493:31:0;;98473:51;:87;;;-1:-1:-1;;;;;;96820:25:0;;;96796:4;96820:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;98528:32;98465:96;98221:348;-1:-1:-1;;;;98221:348:0:o;98582:110::-;98658:26;98668:2;98672:7;98658:26;;;;;;;;;;;;:9;:26::i;23636:191::-;23710:16;23729:6;;-1:-1:-1;;;;;23746:17:0;;;-1:-1:-1;;;;;;23746:17:0;;;;;;23779:40;;23729:6;;;;;;;23779:40;;23710:16;23779:40;23699:128;23636:191;:::o;108868:315::-;109023:8;-1:-1:-1;;;;;109014:17:0;:5;-1:-1:-1;;;;;109014:17:0;;;109006:55;;;;-1:-1:-1;;;109006:55:0;;10533:2:1;109006:55:0;;;10515:21:1;10572:2;10552:18;;;10545:30;10611:27;10591:18;;;10584:55;10656:18;;109006:55:0;10331:349:1;109006:55:0;-1:-1:-1;;;;;109072:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;109072:46:0;;;;;;;;;;109134:41;;7300::1;;;109134::0;;7273:18:1;109134:41:0;;;;;;;108868:315;;;:::o;97761:::-;97918:28;97928:4;97934:2;97938:7;97918:9;:28::i;:::-;97965:48;97988:4;97994:2;97998:7;98007:5;97965:22;:48::i;:::-;97957:111;;;;-1:-1:-1;;;97957:111:0;;;;;;;:::i;95764:100::-;95815:13;95848:8;95841:15;;;;;:::i;5673:723::-;5729:13;5950:10;5946:53;;-1:-1:-1;;5977:10:0;;;;;;;;;;;;-1:-1:-1;;;5977:10:0;;;;;5673:723::o;5946:53::-;6024:5;6009:12;6065:78;6072:9;;6065:78;;6098:8;;;;:::i;:::-;;-1:-1:-1;6121:10:0;;-1:-1:-1;6129:2:0;6121:10;;:::i;:::-;;;6065:78;;;6153:19;6185:6;6175:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6175:17:0;;6153:39;;6203:154;6210:10;;6203:154;;6237:11;6247:1;6237:11;;:::i;:::-;;-1:-1:-1;6306:10:0;6314:2;6306:5;:10;:::i;:::-;6293:24;;:2;:24;:::i;:::-;6280:39;;6263:6;6270;6263:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;6263:56:0;;;;;;;;-1:-1:-1;6334:11:0;6343:2;6334:11;;:::i;:::-;;;6203:154;;91296:532;-1:-1:-1;;;;;91445:18:0;;91441:187;;91480:40;91512:7;92179:10;:17;;92152:24;;;;:15;:24;;;;;:44;;;92207:24;;;;;;;;;;;;92075:164;91480:40;91441:187;;;91550:2;-1:-1:-1;;;;;91542:10:0;:4;-1:-1:-1;;;;;91542:10:0;;91538:90;;91569:47;91602:4;91608:7;91569:32;:47::i;:::-;-1:-1:-1;;;;;91642:16:0;;91638:183;;91675:45;91712:7;91675:36;:45::i;91638:183::-;91748:4;-1:-1:-1;;;;;91742:10:0;:2;-1:-1:-1;;;;;91742:10:0;;91738:83;;91769:40;91797:2;91801:7;91769:27;:40::i;98706:321::-;98836:18;98842:2;98846:7;98836:5;:18::i;:::-;98887:54;98918:1;98922:2;98926:7;98935:5;98887:22;:54::i;:::-;98865:154;;;;-1:-1:-1;;;98865:154:0;;;;;;;:::i;109191:799::-;109346:4;-1:-1:-1;;;;;109367:13:0;;25400:19;:23;109363:620;;109403:72;;-1:-1:-1;;;109403:72:0;;-1:-1:-1;;;;;109403:36:0;;;;;:72;;8244:10;;109454:4;;109460:7;;109469:5;;109403:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;109403:72:0;;;;;;;;-1:-1:-1;;109403:72:0;;;;;;;;;;;;:::i;:::-;;;109399:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;109645:13:0;;109641:272;;109688:60;;-1:-1:-1;;;109688:60:0;;;;;;;:::i;109641:272::-;109863:6;109857:13;109848:6;109844:2;109840:15;109833:38;109399:529;-1:-1:-1;;;;;;109526:51:0;-1:-1:-1;;;109526:51:0;;-1:-1:-1;109519:58:0;;109363:620;-1:-1:-1;109967:4:0;109191:799;;;;;;:::o;92251:988::-;92517:22;92567:1;92542:22;92559:4;92542:16;:22::i;:::-;:26;;;;:::i;:::-;92579:18;92600:26;;;:17;:26;;;;;;92517:51;;-1:-1:-1;92733:28:0;;;92729:328;;-1:-1:-1;;;;;92800:18:0;;92778:19;92800:18;;;:12;:18;;;;;;;;:34;;;;;;;;;92851:30;;;;;;:44;;;92968:30;;:17;:30;;;;;:43;;;92729:328;-1:-1:-1;93153:26:0;;;;:17;:26;;;;;;;;93146:33;;;-1:-1:-1;;;;;93197:18:0;;;;;:12;:18;;;;;:34;;;;;;;93190:41;92251:988::o;93252:1079::-;93530:10;:17;93505:22;;93530:21;;93550:1;;93530:21;:::i;:::-;93562:18;93583:24;;;:15;:24;;;;;;93956:10;:26;;93505:46;;-1:-1:-1;93583:24:0;;93505:46;;93956:26;;;;;;:::i;:::-;;;;;;;;;93934:48;;94020:11;93995:10;94006;93995:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;94100:28;;;:15;:28;;;;;;;:41;;;94272:24;;;;;94265:31;94307:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;93323:1008;;;93252:1079;:::o;91841:221::-;91926:14;91943:20;91960:2;91943:16;:20::i;:::-;-1:-1:-1;;;;;91974:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;92019:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;91841:221:0:o;99037:526::-;-1:-1:-1;;;;;99117:16:0;;99109:61;;;;-1:-1:-1;;;99109:61:0;;13260:2:1;99109:61:0;;;13242:21:1;;;13279:18;;;13272:30;13338:34;13318:18;;;13311:62;13390:18;;99109:61:0;13058:356:1;99109:61:0;98149:4;98173:16;;;:7;:16;;;;;;-1:-1:-1;;;;;98173:16:0;:30;99181:58;;;;-1:-1:-1;;;99181:58:0;;9422:2:1;99181:58:0;;;9404:21:1;9461:2;9441:18;;;9434:30;9500;9480:18;;;9473:58;9548:18;;99181:58:0;9220:352:1;99181:58:0;99252:45;99281:1;99285:2;99289:7;99252:20;:45::i;:::-;-1:-1:-1;;;;;99310:13:0;;;;;;:9;:13;;;;;:18;;99327:1;;99310:13;:18;;99327:1;;99310:18;:::i;:::-;;;;-1:-1:-1;;99339:16:0;;;;:7;:16;;;;;;;;:21;;-1:-1:-1;;;;;;99339:21:0;-1:-1:-1;;;;;99339:21:0;;;;;;;;99371:17;:26;;;;;:30;;;;;;;;;99402:15;99371:46;;99465:33;99339:16;;;99465:33;;99339:16;;99465:33;104970:50:::1;104565:463;104531:497::o:0;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:70;;813:1;810;803:12;747:70;650:173;;;:::o;828:186::-;887:6;940:2;928:9;919:7;915:23;911:32;908:52;;;956:1;953;946:12;908:52;979:29;998:9;979:29;:::i;1019:260::-;1087:6;1095;1148:2;1136:9;1127:7;1123:23;1119:32;1116:52;;;1164:1;1161;1154:12;1116:52;1187:29;1206:9;1187:29;:::i;:::-;1177:39;;1235:38;1269:2;1258:9;1254:18;1235:38;:::i;:::-;1225:48;;1019:260;;;;;:::o;1284:328::-;1361:6;1369;1377;1430:2;1418:9;1409:7;1405:23;1401:32;1398:52;;;1446:1;1443;1436:12;1398:52;1469:29;1488:9;1469:29;:::i;:::-;1459:39;;1517:38;1551:2;1540:9;1536:18;1517:38;:::i;:::-;1507:48;;1602:2;1591:9;1587:18;1574:32;1564:42;;1284:328;;;;;:::o;1617:666::-;1712:6;1720;1728;1736;1789:3;1777:9;1768:7;1764:23;1760:33;1757:53;;;1806:1;1803;1796:12;1757:53;1829:29;1848:9;1829:29;:::i;:::-;1819:39;;1877:38;1911:2;1900:9;1896:18;1877:38;:::i;:::-;1867:48;;1962:2;1951:9;1947:18;1934:32;1924:42;;2017:2;2006:9;2002:18;1989:32;2044:18;2036:6;2033:30;2030:50;;;2076:1;2073;2066:12;2030:50;2099:22;;2152:4;2144:13;;2140:27;-1:-1:-1;2130:55:1;;2181:1;2178;2171:12;2130:55;2204:73;2269:7;2264:2;2251:16;2246:2;2242;2238:11;2204:73;:::i;:::-;2194:83;;;1617:666;;;;;;;:::o;2288:347::-;2353:6;2361;2414:2;2402:9;2393:7;2389:23;2385:32;2382:52;;;2430:1;2427;2420:12;2382:52;2453:29;2472:9;2453:29;:::i;:::-;2443:39;;2532:2;2521:9;2517:18;2504:32;2579:5;2572:13;2565:21;2558:5;2555:32;2545:60;;2601:1;2598;2591:12;2545:60;2624:5;2614:15;;;2288:347;;;;;:::o;2640:254::-;2708:6;2716;2769:2;2757:9;2748:7;2744:23;2740:32;2737:52;;;2785:1;2782;2775:12;2737:52;2808:29;2827:9;2808:29;:::i;:::-;2798:39;2884:2;2869:18;;;;2856:32;;-1:-1:-1;;;2640:254:1:o;2899:245::-;2957:6;3010:2;2998:9;2989:7;2985:23;2981:32;2978:52;;;3026:1;3023;3016:12;2978:52;3065:9;3052:23;3084:30;3108:5;3084:30;:::i;3149:249::-;3218:6;3271:2;3259:9;3250:7;3246:23;3242:32;3239:52;;;3287:1;3284;3277:12;3239:52;3319:9;3313:16;3338:30;3362:5;3338:30;:::i;3403:450::-;3472:6;3525:2;3513:9;3504:7;3500:23;3496:32;3493:52;;;3541:1;3538;3531:12;3493:52;3581:9;3568:23;3614:18;3606:6;3603:30;3600:50;;;3646:1;3643;3636:12;3600:50;3669:22;;3722:4;3714:13;;3710:27;-1:-1:-1;3700:55:1;;3751:1;3748;3741:12;3700:55;3774:73;3839:7;3834:2;3821:16;3816:2;3812;3808:11;3774:73;:::i;3858:180::-;3917:6;3970:2;3958:9;3949:7;3945:23;3941:32;3938:52;;;3986:1;3983;3976:12;3938:52;-1:-1:-1;4009:23:1;;3858:180;-1:-1:-1;3858:180:1:o;4043:184::-;4113:6;4166:2;4154:9;4145:7;4141:23;4137:32;4134:52;;;4182:1;4179;4172:12;4134:52;-1:-1:-1;4205:16:1;;4043:184;-1:-1:-1;4043:184:1:o;4232:248::-;4300:6;4308;4361:2;4349:9;4340:7;4336:23;4332:32;4329:52;;;4377:1;4374;4367:12;4329:52;-1:-1:-1;;4400:23:1;;;4470:2;4455:18;;;4442:32;;-1:-1:-1;4232:248:1:o;4485:316::-;4562:6;4570;4578;4631:2;4619:9;4610:7;4606:23;4602:32;4599:52;;;4647:1;4644;4637:12;4599:52;-1:-1:-1;;4670:23:1;;;4740:2;4725:18;;4712:32;;-1:-1:-1;4791:2:1;4776:18;;;4763:32;;4485:316;-1:-1:-1;4485:316:1:o;4806:257::-;4847:3;4885:5;4879:12;4912:6;4907:3;4900:19;4928:63;4984:6;4977:4;4972:3;4968:14;4961:4;4954:5;4950:16;4928:63;:::i;:::-;5045:2;5024:15;-1:-1:-1;;5020:29:1;5011:39;;;;5052:4;5007:50;;4806:257;-1:-1:-1;;4806:257:1:o;5068:470::-;5247:3;5285:6;5279:13;5301:53;5347:6;5342:3;5335:4;5327:6;5323:17;5301:53;:::i;:::-;5417:13;;5376:16;;;;5439:57;5417:13;5376:16;5473:4;5461:17;;5439:57;:::i;:::-;5512:20;;5068:470;-1:-1:-1;;;;5068:470:1:o;5751:488::-;-1:-1:-1;;;;;6020:15:1;;;6002:34;;6072:15;;6067:2;6052:18;;6045:43;6119:2;6104:18;;6097:34;;;6167:3;6162:2;6147:18;;6140:31;;;5945:4;;6188:45;;6213:19;;6205:6;6188:45;:::i;:::-;6180:53;5751:488;-1:-1:-1;;;;;;5751:488:1:o;6523:632::-;6694:2;6746:21;;;6816:13;;6719:18;;;6838:22;;;6665:4;;6694:2;6917:15;;;;6891:2;6876:18;;;6665:4;6960:169;6974:6;6971:1;6968:13;6960:169;;;7035:13;;7023:26;;7104:15;;;;7069:12;;;;6996:1;6989:9;6960:169;;7352:219;7501:2;7490:9;7483:21;7464:4;7521:44;7561:2;7550:9;7546:18;7538:6;7521:44;:::i;7988:414::-;8190:2;8172:21;;;8229:2;8209:18;;;8202:30;8268:34;8263:2;8248:18;;8241:62;-1:-1:-1;;;8334:2:1;8319:18;;8312:48;8392:3;8377:19;;7988:414::o;11876:356::-;12078:2;12060:21;;;12097:18;;;12090:30;12156:34;12151:2;12136:18;;12129:62;12223:2;12208:18;;11876:356::o;13832:::-;14034:2;14016:21;;;14053:18;;;14046:30;14112:34;14107:2;14092:18;;14085:62;14179:2;14164:18;;13832:356::o;15011:413::-;15213:2;15195:21;;;15252:2;15232:18;;;15225:30;15291:34;15286:2;15271:18;;15264:62;-1:-1:-1;;;15357:2:1;15342:18;;15335:47;15414:3;15399:19;;15011:413::o;16197:398::-;16399:2;16381:21;;;16438:2;16418:18;;;16411:30;16477:34;16472:2;16457:18;;16450:62;-1:-1:-1;;;16543:2:1;16528:18;;16521:32;16585:3;16570:19;;16197:398::o;16600:339::-;16802:2;16784:21;;;16841:2;16821:18;;;16814:30;-1:-1:-1;;;16875:2:1;16860:18;;16853:45;16930:2;16915:18;;16600:339::o;17126:128::-;17166:3;17197:1;17193:6;17190:1;17187:13;17184:39;;;17203:18;;:::i;:::-;-1:-1:-1;17239:9:1;;17126:128::o;17259:120::-;17299:1;17325;17315:35;;17330:18;;:::i;:::-;-1:-1:-1;17364:9:1;;17259:120::o;17384:168::-;17424:7;17490:1;17486;17482:6;17478:14;17475:1;17472:21;17467:1;17460:9;17453:17;17449:45;17446:71;;;17497:18;;:::i;:::-;-1:-1:-1;17537:9:1;;17384:168::o;17557:125::-;17597:4;17625:1;17622;17619:8;17616:34;;;17630:18;;:::i;:::-;-1:-1:-1;17667:9:1;;17557:125::o;17687:258::-;17759:1;17769:113;17783:6;17780:1;17777:13;17769:113;;;17859:11;;;17853:18;17840:11;;;17833:39;17805:2;17798:10;17769:113;;;17900:6;17897:1;17894:13;17891:48;;;-1:-1:-1;;17935:1:1;17917:16;;17910:27;17687:258::o;17950:380::-;18029:1;18025:12;;;;18072;;;18093:61;;18147:4;18139:6;18135:17;18125:27;;18093:61;18200:2;18192:6;18189:14;18169:18;18166:38;18163:161;;;18246:10;18241:3;18237:20;18234:1;18227:31;18281:4;18278:1;18271:15;18309:4;18306:1;18299:15;18163:161;;17950:380;;;:::o;18335:135::-;18374:3;-1:-1:-1;;18395:17:1;;18392:43;;;18415:18;;:::i;:::-;-1:-1:-1;18462:1:1;18451:13;;18335:135::o;18475:112::-;18507:1;18533;18523:35;;18538:18;;:::i;:::-;-1:-1:-1;18572:9:1;;18475:112::o;18592:127::-;18653:10;18648:3;18644:20;18641:1;18634:31;18684:4;18681:1;18674:15;18708:4;18705:1;18698:15;18724:127;18785:10;18780:3;18776:20;18773:1;18766:31;18816:4;18813:1;18806:15;18840:4;18837:1;18830:15;18856:127;18917:10;18912:3;18908:20;18905:1;18898:31;18948:4;18945:1;18938:15;18972:4;18969:1;18962:15;18988:127;19049:10;19044:3;19040:20;19037:1;19030:31;19080:4;19077:1;19070:15;19104:4;19101:1;19094:15;19120:127;19181:10;19176:3;19172:20;19169:1;19162:31;19212:4;19209:1;19202:15;19236:4;19233:1;19226:15;19252:131;-1:-1:-1;;;;;;19326:32:1;;19316:43;;19306:71;;19373:1;19370;19363:12

Swarm Source

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