ETH Price: $3,456.06 (+1.69%)

Token

HOTM (HOTM)
 

Overview

Max Total Supply

8,691,855.383139427955340911 HOTM

Holders

1,025

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
iwannabee.eth
Balance
999.007126969937653919 HOTM

Value
$0.00
0xdf1fa21aad71c50e642fca3aa4332da17bbea409
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:
HumansOfTheMetaverseToken

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-12-14
*/

//SPDX-License-Identifier: Unlicense

/*
                                                        ,----,
                            ,--,     ,----..          ,/   .`|           ____
                          ,--.'|    /   /   \       ,`   .'  :         ,'  , `.
                       ,--,  | :   /   .     :    ;    ;     /      ,-+-,.' _ |
                    ,---.'|  : '  .   /   ;.  \ .'___,/    ,'    ,-+-. ;   , ||
                    |   | : _' | .   ;   /  ` ; |    :     |    ,--.'|'   |  ;|
                    :   : |.'  | ;   |  ; \ ; | ;    |.';  ;   |   |  ,', |  ':t
                    |   ' '  ; : |   :  | ; | ' `----'  |  |   |   | /  | |  ||
                    '   |  .'. | .   |  ' ' ' :     '   :  ;   '   | :  | :  |,
                    |   | :  | ' '   ;  \; /  |     |   |  '   ;   . |  ; |--'
                    '   : |  : ;  \   \  ',  /      '   :  |   |   : |  | ,
                    |   | '  ,/    ;   :    /       ;   |.'    |   : '  |/
                    ;   : ;--'      \   \ .'        '---'      ;   | |`-'
                    |   ,/           `---`                     |   ;/
                    '---'                                      '---'
*/

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;
    }
}

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

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() {
        _setOwner(_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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

pragma solidity ^0.8.0;

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}


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);
}

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);
}

pragma solidity ^0.8.0;

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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `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;
    }

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

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

pragma solidity ^0.8.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;
        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping(bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {
            // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            if (lastIndex != toDeleteIndex) {
                bytes32 lastvalue = set._values[lastIndex];

                // Move the last value to the index where the value to delete is
                set._values[toDeleteIndex] = lastvalue;
                // Update the index for the moved value
                set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex
            }

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        return set._values[index];
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function _values(Set storage set) private view returns (bytes32[] memory) {
        return set._values;
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
        return _values(set._inner);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(AddressSet storage set) internal view returns (address[] memory) {
        bytes32[] memory store = _values(set._inner);
        address[] memory result;

        assembly {
            result := store
        }

        return result;
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(UintSet storage set) internal view returns (uint256[] memory) {
        bytes32[] memory store = _values(set._inner);
        uint256[] memory result;

        assembly {
            result := store
        }

        return result;
    }
}

pragma solidity ^0.8.10;

interface IYielder {
    function ownerOf(uint256 _tokenId) external view returns(address);
}

interface IBooster {
    function computeAmount(uint256 amount) external view returns(uint256);
    function computeAmounts(uint256[] calldata amounts, uint256[] calldata yieldingCores, uint256[] calldata tokens) external view returns(uint256);
}

contract HumansOfTheMetaverseToken is ERC20("HOTM", "HOTM"), Ownable, Pausable, ReentrancyGuard {
    using EnumerableSet for EnumerableSet.UintSet;

    struct YielderSettings {
        uint256 _defaultYieldRate; // fallback for yieldingCoresAmount absence
        uint256 _startTime;
        uint256 _endTime;
        uint256 _timeRate;
        mapping(uint256 => uint256) _tokenYieldingCoresMapping; // tokenId => yieldingCoreId (i.e. job)
        mapping(uint256 => uint256) _yieldingCoresAmountMapping; // yieldingCoreId => amount
        mapping(uint256 => uint256) _lastClaim; // tokenId => date
    }

    struct BoosterSettings {
        address _appliesFor; // yielder
        bool _status;
        EnumerableSet.UintSet _yieldingCores;
        mapping(uint256 => uint256) _boosterStartDates; // tokenId => boosterStartDate
    }

    mapping(address => YielderSettings) yielders;

    mapping(address => BoosterSettings) boosters;

    address[] public boostersAddresses; // boosters should be iterable

    mapping(address => mapping(address => EnumerableSet.UintSet)) tokensOwnerShip; // map econtract addrss => map owner address => yieldingToken

    uint256 public allowedPublicTokensMinted = 31207865 ether; // max total supply * 0.6
    uint256 public foundersAndOthersAllowedMinting = 20805244 ether;
    uint256 public foundersLinearDistributionPeriod = 365 days;

    uint256 public foundersAndOthersLastClaim;

    constructor() {
        _pause();
        foundersAndOthersLastClaim = block.timestamp;
    }

    // YIELDERS

    function setYielderSettings(
        uint256 _defaultYieldRate,
        uint256 _startTime,
        uint256 _endTime,
        uint256 _timeRate,
        address _yielderAddress
    ) external onlyOwner {
        YielderSettings storage yielderSettings =  yielders[_yielderAddress];

        yielderSettings._defaultYieldRate = _defaultYieldRate;
        yielderSettings._startTime = _startTime;
        yielderSettings._endTime = _endTime;
        yielderSettings._timeRate = _timeRate;
    }

    function getYielderSettings(address _address) internal view returns (YielderSettings storage) {
        YielderSettings storage yielderSettings = yielders[_address];
        require(yielderSettings._startTime != uint256(0), "There is no yielder with provided address");

        return yielderSettings;
    }

    function setTokenYielderMapping(
        address _yielderAddress,
        uint256[] calldata _tokenIds,
        uint256[] calldata _yieldingCores
    ) external onlyOwner {
        require(_tokenIds.length == _yieldingCores.length, "Provided arrays should have the same length");

        YielderSettings storage yielderSettings = getYielderSettings(_yielderAddress);

        for(uint256 i = 0; i < _tokenIds.length; ++i) {
            yielderSettings._tokenYieldingCoresMapping[_tokenIds[i]] = _yieldingCores[i];
        }
    }

    function setYieldingAmountMapping(
        address _yielderAddress,
        uint256[] calldata _yieldingCores,
        uint256[] calldata _amounts
    ) external onlyOwner {
        require(_amounts.length == _yieldingCores.length, "Provided arrays should have the same length");

        YielderSettings storage yielderSettings = getYielderSettings(_yielderAddress);

        for(uint256 i = 0; i < _yieldingCores.length; ++i) {
            yielderSettings._yieldingCoresAmountMapping[_yieldingCores[i]] = _amounts[i] * (10 ** 18); // cast to ether
        }
    }

    function setEndDateForYielder(uint256 _endTime, address _contract) external onlyOwner {
        YielderSettings storage yielderSettings = getYielderSettings(_contract);
        yielderSettings._endTime = _endTime;
    }

    function setStartDateForYielder(uint256 _startTime, address _contract) external onlyOwner {
        YielderSettings storage yielderSettings = getYielderSettings(_contract);
        yielderSettings._startTime = _startTime;
    }

    function setDefaultYieldRateForYielder(uint256 _defaultYieldRate, address _contract) external onlyOwner {
        YielderSettings storage yielderSettings = getYielderSettings(_contract);
        yielderSettings._defaultYieldRate = _defaultYieldRate * (10 ** 18);
    }

    function setTimeRateForYielder(uint256 _timeRate, address _contract) external onlyOwner {
        YielderSettings storage yielderSettings = getYielderSettings(_contract);
        yielderSettings._timeRate = _timeRate;
    }

    // BOOSTERS

    function setBoosterConfiguration(
        address _appliesFor,
        bool _status,
        address _boosterAddress
    ) external onlyOwner {
        boostersAddresses.push(_boosterAddress);
        BoosterSettings storage boosterSettings = boosters[_boosterAddress];
        boosterSettings._appliesFor=  _appliesFor;
        boosterSettings._status = _status;
    }

    function getBoosterSettings(address _address) internal view returns (BoosterSettings storage) {
        BoosterSettings storage boosterSettings = boosters[_address];
        require(boosterSettings._appliesFor != address(0), "There is no yielder with provided address");

        return boosterSettings;
    }

    function setBoosterCores(address _boosterAddress, uint256[] calldata _yieldingCoresIds) external onlyOwner {
        BoosterSettings storage boosterSettings = getBoosterSettings(_boosterAddress);
        for (uint256 i = 0; i < _yieldingCoresIds.length; ++i) {
            boosterSettings._yieldingCores.add(_yieldingCoresIds[i]);
        }
    }

    function setBoosterStatus(address _boosterAddress, bool _status) external onlyOwner {
        BoosterSettings storage boosterSettings = getBoosterSettings(_boosterAddress);
        boosterSettings._status = _status;
    }

    function setBoosterAppliesFor(address _boosterAddress, address _appliesFor) external onlyOwner{
        BoosterSettings storage boosterSettings = getBoosterSettings(_boosterAddress);
        boosterSettings._appliesFor = _appliesFor;
    }

    function replaceBoosterCores(address _boosterAddress, uint256[] calldata _yieldingCoresIds) external onlyOwner {
        BoosterSettings storage boosterSettings = getBoosterSettings(_boosterAddress);

        for (uint256 i = 0; i < boosterSettings._yieldingCores.length(); ++i) {
            boosterSettings._yieldingCores.remove(boosterSettings._yieldingCores.at(i));
        }

        for (uint256 i = 0; i < _yieldingCoresIds.length; ++i) {
            boosterSettings._yieldingCores.add(_yieldingCoresIds[i]);
        }
    }


    // TOKEN

    function claimRewards(
        address _contractAddress,
        uint256[] calldata _tokenIds
    ) external whenNotPaused nonReentrant() returns (uint256) {
        YielderSettings storage yielderSettings = getYielderSettings(_contractAddress);

        for(uint256 i = 0; i < _tokenIds.length; i++) {
            uint256 _tokenId = _tokenIds[i];
            processTokenOwnerShip(_contractAddress, _tokenId);
        }
        uint256 currentTime = block.timestamp;

        uint256 totalUnclaimedRewards = computeUnclaimedRewardsAndUpdate(yielderSettings, _contractAddress, _tokenIds, currentTime);

        claimTokens(totalUnclaimedRewards);

        for(uint256 i = 0; i < _tokenIds.length; i++) {
            uint256 _tokenId = _tokenIds[i];
            if (currentTime > yielderSettings._endTime) {
                yielderSettings._lastClaim[_tokenId] = yielderSettings._endTime;
            } else {
                yielderSettings._lastClaim[_tokenId] = currentTime;
            }
        }

        return totalUnclaimedRewards;
    }

    function checkClaimableAmount(address _contractAddress, uint256[] calldata _tokenIds) view external whenNotPaused returns(uint256) {
        YielderSettings storage yielderSettings = getYielderSettings(_contractAddress);

        uint256 totalUnclaimedRewards = computeUnclaimedRewardsSafe(yielderSettings, _contractAddress, _tokenIds, block.timestamp);

        return totalUnclaimedRewards;
    }

    function computeUnclaimedRewardsAndUpdate(
        YielderSettings storage _yielderSettings,
        address _yielderAddress,
        uint256[] calldata _tokenIds,
        uint256 _currentTime
    ) internal returns (uint256) {
        uint256 totalReward = 0;

        totalReward += computeBaseAccumulatedRewards(_yielderSettings, _tokenIds, _currentTime);
        totalReward += computeBoostersAccumulatedRewardsAndUpdate(_yielderAddress, _yielderSettings, _tokenIds, _currentTime);

        return totalReward;
    }

    function computeUnclaimedRewardsSafe(
        YielderSettings storage _yielderSettings,
        address _yielderAddress,
        uint256[] calldata _tokenIds,
        uint256 _currentTime
    ) internal view returns (uint256) {
        uint256 totalReward = 0;

        totalReward += computeBaseAccumulatedRewards(_yielderSettings, _tokenIds, _currentTime);
        totalReward += computeBoostersAccumulatedRewardsSafe(_yielderAddress, _yielderSettings, _tokenIds, _currentTime);

        return totalReward;
    }

    function computeBaseAccumulatedRewards(
        YielderSettings storage _yielderSettings,
        uint256[] calldata _tokenIds,
        uint256 _currentTime
    ) internal view returns (uint256) {
        uint256 baseAccumulatedRewards = 0;

        for (uint256 i = 0; i < _tokenIds.length; ++i) {
            uint256 lastClaimDate = getLastClaimForYielder(_yielderSettings, _tokenIds[i]);

            if (lastClaimDate != _yielderSettings._endTime) {
                uint256 secondsElapsed = _currentTime - lastClaimDate;
                if (_yielderSettings._defaultYieldRate != uint256(0)) {
                    baseAccumulatedRewards += secondsElapsed * _yielderSettings._defaultYieldRate / _yielderSettings._timeRate;
                } else {
                    baseAccumulatedRewards +=
                    secondsElapsed * _yielderSettings._yieldingCoresAmountMapping[_yielderSettings._tokenYieldingCoresMapping[_tokenIds[i]]] / _yielderSettings._timeRate;
                }
            }
        }

        return baseAccumulatedRewards;
    }

    function computeBoostersAccumulatedRewardsAndUpdate(
        address _yielderAddress,
        YielderSettings storage _yielderSettings,
        uint256[] calldata _tokenIds,
        uint256 _currentTime
    ) internal returns (uint256) {

        uint256 boosterAccumulatedRewards = 0;

        for (uint256 boosterIndex = 0; boosterIndex < boostersAddresses.length; ++boosterIndex) {
            BoosterSettings storage boosterSettings = getBoosterSettings(boostersAddresses[boosterIndex]);
            uint256 toBeSentArraysIndex = 0;
            uint256[] memory accumulatedRewardsForBooster = new uint256[](_tokenIds.length);
            uint256[] memory validTokensCandidates = new uint256[](_tokenIds.length);

            if (boosterSettings._appliesFor == _yielderAddress && boosterSettings._status) {
                for (uint256 i = 0; i < _tokenIds.length; ++i) {
                    uint256 boosterStartDate = getLastClaimForBooster(boosterSettings, _tokenIds[i]);
                    if (
                        (
                        boosterSettings._yieldingCores.length() == 0
                        || boosterSettings._yieldingCores.contains(_yielderSettings._tokenYieldingCoresMapping[_tokenIds[i]])
                        ) && getLastClaimForYielder(_yielderSettings, _tokenIds[i]) != _yielderSettings._endTime
                        && boosterStartDate != uint256(0)
                    ) {
                        uint256 secondsElapsed = _currentTime - boosterStartDate;

                        if (_yielderSettings._defaultYieldRate != uint256(0)) {
                            accumulatedRewardsForBooster[toBeSentArraysIndex] =
                            secondsElapsed * _yielderSettings._defaultYieldRate / _yielderSettings._timeRate;
                        } else {
                            uint256 tokenYieldingCoresMapping = _yielderSettings._tokenYieldingCoresMapping[_tokenIds[i]];
                            uint256 yieldingCoresAmountMapping = _yielderSettings._yieldingCoresAmountMapping[tokenYieldingCoresMapping];
                            accumulatedRewardsForBooster[toBeSentArraysIndex] =
                            secondsElapsed * yieldingCoresAmountMapping / _yielderSettings._timeRate;
                        }
                        validTokensCandidates[toBeSentArraysIndex] = _tokenIds[i];
                        toBeSentArraysIndex++;
                    }
                }
                if (boosterSettings._yieldingCores.length() != 0) {
                    uint256[] memory yieldingCores = new uint256[](validTokensCandidates.length);

                    for (uint256 i = 0; i < validTokensCandidates.length; ++i) {
                        yieldingCores[i] = _yielderSettings._tokenYieldingCoresMapping[validTokensCandidates[i]];
                    }

                    boosterAccumulatedRewards +=
                    IBooster(boostersAddresses[boosterIndex]).computeAmounts(accumulatedRewardsForBooster, yieldingCores, validTokensCandidates);
                } else {
                    uint256 summedBoosterAccumulatedRewards = 0;
                    for (uint256 i = 0; i < validTokensCandidates.length; ++i) {
                        summedBoosterAccumulatedRewards += accumulatedRewardsForBooster[i];
                    }
                    boosterAccumulatedRewards += IBooster(boostersAddresses[boosterIndex]).computeAmount(summedBoosterAccumulatedRewards);
                }
                for (uint256 i = 0; i < validTokensCandidates.length; ++i) {
                    if (boosterSettings._boosterStartDates[validTokensCandidates[i]] != uint256(0)) {
                        boosterSettings._boosterStartDates[validTokensCandidates[i]] = _currentTime;
                    }
                }
            }
        }

        return boosterAccumulatedRewards;
    }

    function computeBoostersAccumulatedRewardsSafe(
        address _yielderAddress,
        YielderSettings storage _yielderSettings,
        uint256[] calldata _tokenIds,
        uint256 _currentTime
    ) internal view returns (uint256) {

        uint256 boosterAccumulatedRewards = 0;

        for (uint256 boosterIndex = 0; boosterIndex < boostersAddresses.length; ++boosterIndex) {
            BoosterSettings storage boosterSettings = getBoosterSettings(boostersAddresses[boosterIndex]);
            uint256 toBeSentArraysIndex = 0;
            uint256[] memory accumulatedRewardsForBooster = new uint256[](_tokenIds.length);
            uint256[] memory validTokensCandidates = new uint256[](_tokenIds.length);

            if (boosterSettings._appliesFor == _yielderAddress && boosterSettings._status) {
                for (uint256 i = 0; i < _tokenIds.length; ++i) {
                    uint256 boosterStartDate = getLastClaimForBooster(boosterSettings, _tokenIds[i]);
                    if (
                        (
                        boosterSettings._yieldingCores.length() == 0
                        || boosterSettings._yieldingCores.contains(_yielderSettings._tokenYieldingCoresMapping[_tokenIds[i]])
                        ) && getLastClaimForYielder(_yielderSettings, _tokenIds[i]) != _yielderSettings._endTime
                        && boosterStartDate != uint256(0)
                    ) {

                        uint256 secondsElapsed = _currentTime - boosterStartDate;

                        if (_yielderSettings._defaultYieldRate != uint256(0)) {
                            accumulatedRewardsForBooster[toBeSentArraysIndex] =
                            secondsElapsed * _yielderSettings._defaultYieldRate / _yielderSettings._timeRate;
                        } else {
                            uint256 tokenYieldingCoresMapping = _yielderSettings._tokenYieldingCoresMapping[_tokenIds[i]];
                            uint256 yieldingCoresAmountMapping = _yielderSettings._yieldingCoresAmountMapping[tokenYieldingCoresMapping];
                            accumulatedRewardsForBooster[toBeSentArraysIndex] =
                            secondsElapsed * yieldingCoresAmountMapping / _yielderSettings._timeRate;
                        }
                        validTokensCandidates[toBeSentArraysIndex] = _tokenIds[i];
                        toBeSentArraysIndex++;
                    }
                }
                if (boosterSettings._yieldingCores.length() != 0) {
                    uint256[] memory yieldingCores = new uint256[](validTokensCandidates.length);

                    for (uint256 i = 0; i < validTokensCandidates.length; ++i) {
                        yieldingCores[i] = _yielderSettings._tokenYieldingCoresMapping[validTokensCandidates[i]];
                    }

                    boosterAccumulatedRewards +=
                    IBooster(boostersAddresses[boosterIndex]).computeAmounts(accumulatedRewardsForBooster, yieldingCores, validTokensCandidates);

                } else {
                    uint256 summedBoosterAccumulatedRewards = 0;
                    for (uint256 i = 0; i < validTokensCandidates.length; ++i) {
                        summedBoosterAccumulatedRewards += accumulatedRewardsForBooster[i];
                    }
                    boosterAccumulatedRewards += IBooster(boostersAddresses[boosterIndex]).computeAmount(summedBoosterAccumulatedRewards);
                }
            }
        }

        return boosterAccumulatedRewards;
    }

    function getLastClaimForYielder(YielderSettings storage _yielderSettings, uint256 _tokenId) internal view returns (uint256) {
        uint256 lastClaimDate =  _yielderSettings._lastClaim[_tokenId];
        if (lastClaimDate == uint256(0)) {
            lastClaimDate = _yielderSettings._startTime;
        }

        return lastClaimDate;
    }

    function getLastClaim(address _yielderAddress, uint256 _tokenId) external whenNotPaused view returns (uint256) {
        YielderSettings storage yielderSettings = getYielderSettings(_yielderAddress);

        return getLastClaimForYielder(yielderSettings, _tokenId);
    }

    function getLastClaimForBooster(BoosterSettings storage _boosterSettings, uint256 _tokenId) view internal returns (uint256) {
        uint256 lastClaimDate = _boosterSettings._boosterStartDates[_tokenId];

        return lastClaimDate;
    }


    // UTILS

    function watchTransfer(address _from, address _to, uint256 _tokenId) external {
        getYielderSettings(msg.sender);

        if (_from == address(0)) {
            tokensOwnerShip[msg.sender][_to].add(_tokenId);
        } else {
            tokensOwnerShip[msg.sender][_to].add(_tokenId);
            if (tokensOwnerShip[msg.sender][_from].contains(_tokenId)) {
                tokensOwnerShip[msg.sender][_from].remove(_tokenId);
                if (tokensOwnerShip[msg.sender][_from].length() == 0) {
                    delete tokensOwnerShip[msg.sender][_from];
                }
            }
        }
    }

    function watchBooster(address _collection, uint256[] calldata _tokenIds, uint256[] calldata _startDates) external {
        // boster shall send uint256(0) as start if removed
        BoosterSettings storage boosterSettings = getBoosterSettings(msg.sender);

        if (boosterSettings._appliesFor == _collection) {
            for (uint32 i = 0; i < _tokenIds.length; ++i) {
                boosterSettings._boosterStartDates[_tokenIds[i]] = _startDates[i];
            }
        }
    }

    function claimTokens(uint256 _amount) internal {
        if (allowedPublicTokensMinted - _amount >= 0) {
            _mint(msg.sender, _amount);
            allowedPublicTokensMinted -= _amount;
        } else {
            IERC20(address(this)).transfer(msg.sender, _amount);
        }
    }

    function processTokenOwnerShip(address _contractAddress, uint256 _tokenId) internal {
        if (!tokensOwnerShip[_contractAddress][msg.sender].contains(_tokenId)) {
            address owner = IYielder(_contractAddress).ownerOf(_tokenId);
            if (owner == msg.sender) {
                tokensOwnerShip[_contractAddress][msg.sender].add(_tokenId);
            }
        }
        require(tokensOwnerShip[_contractAddress][msg.sender].contains(_tokenId), "Not the owner of the token");

    }

    function reserveTeamTokens() external onlyOwner {
        uint256 currentDate = block.timestamp;
        _mint(msg.sender, foundersAndOthersAllowedMinting * (currentDate - foundersAndOthersLastClaim) / foundersLinearDistributionPeriod);

        foundersAndOthersLastClaim = block.timestamp;
    }

    function withdrawContractAdditionalTokens() external onlyOwner {
        IERC20(address(this)).transfer(msg.sender, IERC20(address(this)).balanceOf(address(this)));
    }

    function pause() external onlyOwner {
        _pause();
    }

    function unpause() external onlyOwner {
        _unpause();
    }

    function setPublicAllowedTokensToBeMinted(uint256 _amount) external onlyOwner {
        allowedPublicTokensMinted = _amount;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowedPublicTokensMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"boostersAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"checkClaimableAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"claimRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"foundersAndOthersAllowedMinting","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"foundersAndOthersLastClaim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"foundersLinearDistributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_yielderAddress","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getLastClaim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"_boosterAddress","type":"address"},{"internalType":"uint256[]","name":"_yieldingCoresIds","type":"uint256[]"}],"name":"replaceBoosterCores","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveTeamTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_boosterAddress","type":"address"},{"internalType":"address","name":"_appliesFor","type":"address"}],"name":"setBoosterAppliesFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_appliesFor","type":"address"},{"internalType":"bool","name":"_status","type":"bool"},{"internalType":"address","name":"_boosterAddress","type":"address"}],"name":"setBoosterConfiguration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_boosterAddress","type":"address"},{"internalType":"uint256[]","name":"_yieldingCoresIds","type":"uint256[]"}],"name":"setBoosterCores","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_boosterAddress","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"setBoosterStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_defaultYieldRate","type":"uint256"},{"internalType":"address","name":"_contract","type":"address"}],"name":"setDefaultYieldRateForYielder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_endTime","type":"uint256"},{"internalType":"address","name":"_contract","type":"address"}],"name":"setEndDateForYielder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setPublicAllowedTokensToBeMinted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startTime","type":"uint256"},{"internalType":"address","name":"_contract","type":"address"}],"name":"setStartDateForYielder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_timeRate","type":"uint256"},{"internalType":"address","name":"_contract","type":"address"}],"name":"setTimeRateForYielder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_yielderAddress","type":"address"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"_yieldingCores","type":"uint256[]"}],"name":"setTokenYielderMapping","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_defaultYieldRate","type":"uint256"},{"internalType":"uint256","name":"_startTime","type":"uint256"},{"internalType":"uint256","name":"_endTime","type":"uint256"},{"internalType":"uint256","name":"_timeRate","type":"uint256"},{"internalType":"address","name":"_yielderAddress","type":"address"}],"name":"setYielderSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_yielderAddress","type":"address"},{"internalType":"uint256[]","name":"_yieldingCores","type":"uint256[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"setYieldingAmountMapping","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_collection","type":"address"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"_startDates","type":"uint256[]"}],"name":"watchBooster","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":"watchTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawContractAdditionalTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526a19d085c067a8ce1b440000600b556a1135ae898595012c700000600c556301e13380600d553480156200003757600080fd5b50604080518082018252600480825263484f544d60e01b6020808401828152855180870190965292855284015281519192916200007791600391620001d8565b5080516200008d906004906020840190620001d8565b505050620000aa620000a4620000d060201b60201c565b620000d4565b6005805460ff60a01b191690556001600655620000c662000126565b42600e55620002bb565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6200013a600554600160a01b900460ff1690565b156200017f5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640160405180910390fd5b6005805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258620001bb3390565b6040516001600160a01b03909116815260200160405180910390a1565b828054620001e6906200027e565b90600052602060002090601f0160209004810192826200020a576000855562000255565b82601f106200022557805160ff191683800117855562000255565b8280016001018555821562000255579182015b828111156200025557825182559160200191906001019062000238565b506200026392915062000267565b5090565b5b8082111562000263576000815560010162000268565b600181811c908216806200029357607f821691505b60208210811415620002b557634e487b7160e01b600052602260045260246000fd5b50919050565b6130bc80620002cb6000396000f3fe608060405234801561001057600080fd5b506004361061025e5760003560e01c80636fb73d0811610146578063a9059cbb116100c3578063dd62ed3e11610087578063dd62ed3e146104fe578063dd7b464914610537578063df272e671461054a578063f01a44de14610552578063f2fde38b1461055a578063f7d3aece1461056d57600080fd5b8063a9059cbb146104a9578063b146ba71146104bc578063b75ebb19146104cf578063ce71f6d1146104e2578063d3cc8dd3146104eb57600080fd5b80638da5cb5b1161010a5780638da5cb5b1461045757806395d89b4114610468578063a457c2d714610470578063a51abfb014610483578063a8ed01241461049657600080fd5b80636fb73d08146103f85780636fc259551461040b57806370a082311461041e578063715018a6146104475780638456cb591461044f57600080fd5b8063327e1152116101df5780634c87e619116101a35780634c87e619146103915780634f3969e7146103a457806356760ecc146103b75780635c25bbe8146103ca5780635c975abb146103dd5780635cf14f0a146103ef57600080fd5b8063327e115214610351578063356b756314610364578063395093511461036d5780633f4ba83a1461038057806340b1bff21461038857600080fd5b806318160ddd1161022657806318160ddd146103015780632237db251461030957806323b872dd1461031c5780632c42d0bd1461032f578063313ce5671461034257600080fd5b8063028594641461026357806305231dea1461027857806306fdde031461029e578063095ea7b3146102b35780630ca00cc8146102d6575b600080fd5b610276610271366004612a3c565b610580565b005b61028b610286366004612ac9565b6106c3565b6040519081526020015b60405180910390f35b6102a6610845565b6040516102959190612b1e565b6102c66102c1366004612b73565b6108d7565b6040519015158152602001610295565b6102e96102e4366004612b9f565b6108ee565b6040516001600160a01b039091168152602001610295565b60025461028b565b610276610317366004612bb8565b610918565b6102c661032a366004612a3c565b610958565b61027661033d366004612b9f565b610a02565b60405160128152602001610295565b61027661035f366004612bb8565b610a31565b61028b600d5481565b6102c661037b366004612b73565b610a80565b610276610abc565b61028b600b5481565b61027661039f366004612be8565b610af0565b6102766103b2366004612c6b565b610bbf565b6102766103c5366004612ac9565b610c17565b61028b6103d8366004612ac9565b610c9f565b600554600160a01b900460ff166102c6565b61028b600e5481565b610276610406366004612be8565b610cf2565b610276610419366004612bb8565b610d95565b61028b61042c366004612c99565b6001600160a01b031660009081526020819052604090205490565b610276610dd5565b610276610e09565b6005546001600160a01b03166102e9565b6102a6610e3b565b6102c661047e366004612b73565b610e4a565b610276610491366004612cc4565b610ee3565b6102766104a4366004612ac9565b610f37565b6102c66104b7366004612b73565b610fe1565b6102766104ca366004612cf2565b610fee565b6102766104dd366004612d3d565b611095565b61028b600c5481565b6102766104f9366004612be8565b6110ee565b61028b61050c366004612c6b565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61028b610545366004612b73565b6111aa565b6102766111f6565b61027661125d565b610276610568366004612c99565b611363565b61027661057b366004612bb8565b6113fb565b6105893361143b565b506001600160a01b0383166105cb57336000908152600a602090815260408083206001600160a01b038616845290915290206105c59082611474565b50505050565b336000908152600a602090815260408083206001600160a01b038616845290915290206105f89082611474565b50336000908152600a602090815260408083206001600160a01b038716845290915290206106269082611487565b156106be57336000908152600a602090815260408083206001600160a01b03871684529091529020610658908261149f565b50336000908152600a602090815260408083206001600160a01b03871684529091529020610685906114ab565b6106be57336000908152600a602090815260408083206001600160a01b038716845290915281209081816106b982826129f5565b505050505b505050565b600554600090600160a01b900460ff16156106f95760405162461bcd60e51b81526004016106f090612d8a565b60405180910390fd5b6002600654141561074c5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106f0565b6002600655600061075c8561143b565b905060005b838110156107a357600085858381811061077d5761077d612db4565b90506020020135905061079087826114b5565b508061079b81612de0565b915050610761565b504260006107b48388888886611613565b90506107bf81611650565b60005b858110156108355760008787838181106107de576107de612db4565b905060200201359050846002015484111561080e5760028501546000828152600687016020526040902055610822565b600081815260068601602052604090208490555b508061082d81612de0565b9150506107c2565b5060016006559695505050505050565b60606003805461085490612dfb565b80601f016020809104026020016040519081016040528092919081815260200182805461088090612dfb565b80156108cd5780601f106108a2576101008083540402835291602001916108cd565b820191906000526020600020905b8154815290600101906020018083116108b057829003601f168201915b5050505050905090565b60006108e43384846116f4565b5060015b92915050565b600981815481106108fe57600080fd5b6000918252602090912001546001600160a01b0316905081565b6005546001600160a01b031633146109425760405162461bcd60e51b81526004016106f090612e36565b600061094d8261143b565b600301929092555050565b6000610965848484611818565b6001600160a01b0384166000908152600160209081526040808320338452909152902054828110156109ea5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084016106f0565b6109f785338584036116f4565b506001949350505050565b6005546001600160a01b03163314610a2c5760405162461bcd60e51b81526004016106f090612e36565b600b55565b6005546001600160a01b03163314610a5b5760405162461bcd60e51b81526004016106f090612e36565b6000610a668261143b565b9050610a7a83670de0b6b3a7640000612e6b565b90555050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916108e4918590610ab7908690612e8a565b6116f4565b6005546001600160a01b03163314610ae65760405162461bcd60e51b81526004016106f090612e36565b610aee6119e7565b565b6005546001600160a01b03163314610b1a5760405162461bcd60e51b81526004016106f090612e36565b808314610b395760405162461bcd60e51b81526004016106f090612ea2565b6000610b448661143b565b905060005b848110156106b957838382818110610b6357610b63612db4565b90506020020135670de0b6b3a7640000610b7d9190612e6b565b826005016000888885818110610b9557610b95612db4565b9050602002013581526020019081526020016000208190555080610bb890612de0565b9050610b49565b6005546001600160a01b03163314610be95760405162461bcd60e51b81526004016106f090612e36565b6000610bf483611a84565b80546001600160a01b0319166001600160a01b0393909316929092179091555050565b6005546001600160a01b03163314610c415760405162461bcd60e51b81526004016106f090612e36565b6000610c4c84611a84565b905060005b82811015610c9857610c87848483818110610c6e57610c6e612db4565b905060200201358360010161147490919063ffffffff16565b50610c9181612de0565b9050610c51565b5050505050565b600554600090600160a01b900460ff1615610ccc5760405162461bcd60e51b81526004016106f090612d8a565b6000610cd78561143b565b90506000610ce88287878742611ac0565b9695505050505050565b6000610cfd33611a84565b80549091506001600160a01b0387811691161415610d8d5760005b63ffffffff81168511156106b95783838263ffffffff16818110610d3e57610d3e612db4565b9050602002013582600301600088888563ffffffff16818110610d6357610d63612db4565b9050602002013581526020019081526020016000208190555080610d8690612eed565b9050610d18565b505050505050565b6005546001600160a01b03163314610dbf5760405162461bcd60e51b81526004016106f090612e36565b6000610dca8261143b565b600101929092555050565b6005546001600160a01b03163314610dff5760405162461bcd60e51b81526004016106f090612e36565b610aee6000611ae8565b6005546001600160a01b03163314610e335760405162461bcd60e51b81526004016106f090612e36565b610aee611b3a565b60606004805461085490612dfb565b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015610ecc5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016106f0565b610ed933858584036116f4565b5060019392505050565b6005546001600160a01b03163314610f0d5760405162461bcd60e51b81526004016106f090612e36565b6000610f1883611a84565b8054921515600160a01b0260ff60a01b19909316929092179091555050565b6005546001600160a01b03163314610f615760405162461bcd60e51b81526004016106f090612e36565b6000610f6c84611a84565b905060005b610f7d826001016114ab565b811015610faf57610f9e610f946001840183611b9f565b600184019061149f565b50610fa881612de0565b9050610f71565b5060005b82811015610c9857610fd0848483818110610c6e57610c6e612db4565b50610fda81612de0565b9050610fb3565b60006108e4338484611818565b6005546001600160a01b031633146110185760405162461bcd60e51b81526004016106f090612e36565b60098054600181019091557f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0180546001600160a01b039283166001600160a01b0319909116811790915560009081526008602052604090208054921515600160a01b026001600160a81b03199093169390911692909217179055565b6005546001600160a01b031633146110bf5760405162461bcd60e51b81526004016106f090612e36565b6001600160a01b0316600090815260076020526040902093845560018401929092556002830155600390910155565b6005546001600160a01b031633146111185760405162461bcd60e51b81526004016106f090612e36565b8281146111375760405162461bcd60e51b81526004016106f090612ea2565b60006111428661143b565b905060005b848110156106b95783838281811061116157611161612db4565b9050602002013582600401600088888581811061118057611180612db4565b90506020020135815260200190815260200160002081905550806111a390612de0565b9050611147565b600554600090600160a01b900460ff16156111d75760405162461bcd60e51b81526004016106f090612d8a565b60006111e28461143b565b90506111ee8184611bab565b949350505050565b6005546001600160a01b031633146112205760405162461bcd60e51b81526004016106f090612e36565b600042905061125633600d54600e548461123a9190612f11565b600c546112479190612e6b565b6112519190612f28565b611bcb565b5042600e55565b6005546001600160a01b031633146112875760405162461bcd60e51b81526004016106f090612e36565b6040516370a0823160e01b815230600482018190529063a9059cbb90339083906370a0823190602401602060405180830381865afa1580156112cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112f19190612f4a565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af115801561133c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113609190612f63565b50565b6005546001600160a01b0316331461138d5760405162461bcd60e51b81526004016106f090612e36565b6001600160a01b0381166113f25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106f0565b61136081611ae8565b6005546001600160a01b031633146114255760405162461bcd60e51b81526004016106f090612e36565b60006114308261143b565b600201929092555050565b6001600160a01b038116600090815260076020526040812060018101546108e85760405162461bcd60e51b81526004016106f090612f80565b60006114808383611caa565b9392505050565b60008181526001830160205260408120541515611480565b60006114808383611cf9565b60006108e8825490565b6001600160a01b0382166000908152600a6020908152604080832033845290915290206114e29082611487565b611596576040516331a9108f60e11b8152600481018290526000906001600160a01b03841690636352211e90602401602060405180830381865afa15801561152e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115529190612fc9565b90506001600160a01b038116331415611594576001600160a01b0383166000908152600a6020908152604080832033845290915290206115929083611474565b505b505b6001600160a01b0382166000908152600a6020908152604080832033845290915290206115c39082611487565b61160f5760405162461bcd60e51b815260206004820152601a60248201527f4e6f7420746865206f776e6572206f662074686520746f6b656e00000000000060448201526064016106f0565b5050565b60008061162287868686611dec565b61162c9082612e8a565b905061163b8688878787611ef3565b6116459082612e8a565b979650505050505050565b600081600b546116609190612f11565b1061168c5761166f3382611bcb565b80600b60008282546116819190612f11565b909155506113609050565b60405163a9059cbb60e01b815233600482015260248101829052309063a9059cbb906044016020604051808303816000875af11580156116d0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061160f9190612f63565b6001600160a01b0383166117565760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016106f0565b6001600160a01b0382166117b75760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016106f0565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831661187c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016106f0565b6001600160a01b0382166118de5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016106f0565b6001600160a01b038316600090815260208190526040902054818110156119565760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016106f0565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061198d908490612e8a565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516119d991815260200190565b60405180910390a350505050565b600554600160a01b900460ff16611a375760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016106f0565b6005805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b038082166000908152600860205260408120805491929091166108e85760405162461bcd60e51b81526004016106f090612f80565b600080611acf87868686611dec565b611ad99082612e8a565b905061163b86888787876124d8565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600554600160a01b900460ff1615611b645760405162461bcd60e51b81526004016106f090612d8a565b6005805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611a673390565b600061148083836129cb565b600081815260068301602052604081205480611480575050506001015490565b6001600160a01b038216611c215760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016106f0565b8060026000828254611c339190612e8a565b90915550506001600160a01b03821660009081526020819052604081208054839290611c60908490612e8a565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6000818152600183016020526040812054611cf1575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556108e8565b5060006108e8565b60008181526001830160205260408120548015611de2576000611d1d600183612f11565b8554909150600090611d3190600190612f11565b9050818114611d96576000866000018281548110611d5157611d51612db4565b9060005260206000200154905080876000018481548110611d7457611d74612db4565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611da757611da7612fe6565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506108e8565b60009150506108e8565b600080805b84811015611ee9576000611e1d88888885818110611e1157611e11612db4565b90506020020135611bab565b905087600201548114611ed8576000611e368287612f11565b895490915015611e6c5760038901548954611e519083612e6b565b611e5b9190612f28565b611e659085612e8a565b9350611ed6565b88600301548960050160008b60040160008c8c89818110611e8f57611e8f612db4565b9050602002013581526020019081526020016000205481526020019081526020016000205482611ebf9190612e6b565b611ec99190612f28565b611ed39085612e8a565b93505b505b50611ee281612de0565b9050611df1565b5095945050505050565b600080805b6009548110156124cd576000611f3460098381548110611f1a57611f1a612db4565b6000918252602090912001546001600160a01b0316611a84565b90506000808767ffffffffffffffff811115611f5257611f52612ffc565b604051908082528060200260200182016040528015611f7b578160200160208202803683370190505b50905060008867ffffffffffffffff811115611f9957611f99612ffc565b604051908082528060200260200182016040528015611fc2578160200160208202803683370190505b5084549091506001600160a01b038d81169116148015611fea57508354600160a01b900460ff165b156124b85760005b898110156121ee57600061202f868d8d8581811061201257612012612db4565b905060200201356000908152600391909101602052604090205490565b905061203d866001016114ab565b158061208757506120878d60040160008e8e8681811061205f5761205f612db4565b905060200201358152602001908152602001600020548760010161148790919063ffffffff16565b80156120ac57508c600201546120a98e8e8e86818110611e1157611e11612db4565b14155b80156120b757508015155b156121dd5760006120c8828c612f11565b8e54909150156121105760038e01548e546120e39083612e6b565b6120ed9190612f28565b8587815181106120ff576120ff612db4565b602002602001018181525050612198565b60008e60040160008f8f8781811061212a5761212a612db4565b90506020020135815260200190815260200160002054905060008f60050160008381526020019081526020016000205490508f60030154818461216d9190612e6b565b6121779190612f28565b87898151811061218957612189612db4565b60200260200101818152505050505b8c8c848181106121aa576121aa612db4565b905060200201358487815181106121c3576121c3612db4565b6020908102919091010152856121d881612de0565b965050505b506121e781612de0565b9050611ff2565b506121fb846001016114ab565b15612354576000815167ffffffffffffffff81111561221c5761221c612ffc565b604051908082528060200260200182016040528015612245578160200160208202803683370190505b50905060005b82518110156122b0578c600401600084838151811061226c5761226c612db4565b602002602001015181526020019081526020016000205482828151811061229557612295612db4565b60209081029190910101526122a981612de0565b905061224b565b50600986815481106122c4576122c4612db4565b600091825260209091200154604051638380313360e01b81526001600160a01b03909116906383803133906123019086908590879060040161304d565b602060405180830381865afa15801561231e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123429190612f4a565b61234c9088612e8a565b965050612430565b6000805b82518110156123985783818151811061237357612373612db4565b6020026020010151826123869190612e8a565b915061239181612de0565b9050612358565b50600986815481106123ac576123ac612db4565b600091825260209091200154604051630e1159a360e41b8152600481018390526001600160a01b039091169063e1159a3090602401602060405180830381865afa1580156123fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124229190612f4a565b61242c9088612e8a565b9650505b60005b81518110156124b657600085600301600084848151811061245657612456612db4565b6020026020010151815260200190815260200160002054146124a6578885600301600084848151811061248b5761248b612db4565b60200260200101518152602001908152602001600020819055505b6124af81612de0565b9050612433565b505b50505050806124c690612de0565b9050611ef8565b509695505050505050565b600080805b6009548110156124cd5760006124ff60098381548110611f1a57611f1a612db4565b90506000808767ffffffffffffffff81111561251d5761251d612ffc565b604051908082528060200260200182016040528015612546578160200160208202803683370190505b50905060008867ffffffffffffffff81111561256457612564612ffc565b60405190808252806020026020018201604052801561258d578160200160208202803683370190505b5084549091506001600160a01b038d811691161480156125b557508354600160a01b900460ff165b156129b65760005b898110156127745760006125dd868d8d8581811061201257612012612db4565b90506125eb866001016114ab565b158061260d575061260d8d60040160008e8e8681811061205f5761205f612db4565b801561263257508c6002015461262f8e8e8e86818110611e1157611e11612db4565b14155b801561263d57508015155b1561276357600061264e828c612f11565b8e54909150156126965760038e01548e546126699083612e6b565b6126739190612f28565b85878151811061268557612685612db4565b60200260200101818152505061271e565b60008e60040160008f8f878181106126b0576126b0612db4565b90506020020135815260200190815260200160002054905060008f60050160008381526020019081526020016000205490508f6003015481846126f39190612e6b565b6126fd9190612f28565b87898151811061270f5761270f612db4565b60200260200101818152505050505b8c8c8481811061273057612730612db4565b9050602002013584878151811061274957612749612db4565b60209081029190910101528561275e81612de0565b965050505b5061276d81612de0565b90506125bd565b50612781846001016114ab565b156128da576000815167ffffffffffffffff8111156127a2576127a2612ffc565b6040519080825280602002602001820160405280156127cb578160200160208202803683370190505b50905060005b8251811015612836578c60040160008483815181106127f2576127f2612db4565b602002602001015181526020019081526020016000205482828151811061281b5761281b612db4565b602090810291909101015261282f81612de0565b90506127d1565b506009868154811061284a5761284a612db4565b600091825260209091200154604051638380313360e01b81526001600160a01b03909116906383803133906128879086908590879060040161304d565b602060405180830381865afa1580156128a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128c89190612f4a565b6128d29088612e8a565b9650506129b6565b6000805b825181101561291e578381815181106128f9576128f9612db4565b60200260200101518261290c9190612e8a565b915061291781612de0565b90506128de565b506009868154811061293257612932612db4565b600091825260209091200154604051630e1159a360e41b8152600481018390526001600160a01b039091169063e1159a3090602401602060405180830381865afa158015612984573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129a89190612f4a565b6129b29088612e8a565b9650505b50505050806129c490612de0565b90506124dd565b60008260000182815481106129e2576129e2612db4565b9060005260206000200154905092915050565b508054600082559060005260206000209081019061136091905b80821115612a235760008155600101612a0f565b5090565b6001600160a01b038116811461136057600080fd5b600080600060608486031215612a5157600080fd5b8335612a5c81612a27565b92506020840135612a6c81612a27565b929592945050506040919091013590565b60008083601f840112612a8f57600080fd5b50813567ffffffffffffffff811115612aa757600080fd5b6020830191508360208260051b8501011115612ac257600080fd5b9250929050565b600080600060408486031215612ade57600080fd5b8335612ae981612a27565b9250602084013567ffffffffffffffff811115612b0557600080fd5b612b1186828701612a7d565b9497909650939450505050565b600060208083528351808285015260005b81811015612b4b57858101830151858201604001528201612b2f565b81811115612b5d576000604083870101525b50601f01601f1916929092016040019392505050565b60008060408385031215612b8657600080fd5b8235612b9181612a27565b946020939093013593505050565b600060208284031215612bb157600080fd5b5035919050565b60008060408385031215612bcb57600080fd5b823591506020830135612bdd81612a27565b809150509250929050565b600080600080600060608688031215612c0057600080fd5b8535612c0b81612a27565b9450602086013567ffffffffffffffff80821115612c2857600080fd5b612c3489838a01612a7d565b90965094506040880135915080821115612c4d57600080fd5b50612c5a88828901612a7d565b969995985093965092949392505050565b60008060408385031215612c7e57600080fd5b8235612c8981612a27565b91506020830135612bdd81612a27565b600060208284031215612cab57600080fd5b813561148081612a27565b801515811461136057600080fd5b60008060408385031215612cd757600080fd5b8235612ce281612a27565b91506020830135612bdd81612cb6565b600080600060608486031215612d0757600080fd5b8335612d1281612a27565b92506020840135612d2281612cb6565b91506040840135612d3281612a27565b809150509250925092565b600080600080600060a08688031215612d5557600080fd5b853594506020860135935060408601359250606086013591506080860135612d7c81612a27565b809150509295509295909350565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415612df457612df4612dca565b5060010190565b600181811c90821680612e0f57607f821691505b60208210811415612e3057634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000816000190483118215151615612e8557612e85612dca565b500290565b60008219821115612e9d57612e9d612dca565b500190565b6020808252602b908201527f50726f7669646564206172726179732073686f756c642068617665207468652060408201526a0e6c2daca40d8cadccee8d60ab1b606082015260800190565b600063ffffffff80831681811415612f0757612f07612dca565b6001019392505050565b600082821015612f2357612f23612dca565b500390565b600082612f4557634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215612f5c57600080fd5b5051919050565b600060208284031215612f7557600080fd5b815161148081612cb6565b60208082526029908201527f5468657265206973206e6f207969656c64657220776974682070726f7669646560408201526864206164647265737360b81b606082015260800190565b600060208284031215612fdb57600080fd5b815161148081612a27565b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600081518084526020808501945080840160005b8381101561304257815187529582019590820190600101613026565b509495945050505050565b6060815260006130606060830186613012565b82810360208401526130728186613012565b90508281036040840152610ce8818561301256fea264697066735822122041b7ccfca971685acbc29a15aaf0b79b6c92a1202db4b6eedf8a4833b737764564736f6c634300080a0033

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061025e5760003560e01c80636fb73d0811610146578063a9059cbb116100c3578063dd62ed3e11610087578063dd62ed3e146104fe578063dd7b464914610537578063df272e671461054a578063f01a44de14610552578063f2fde38b1461055a578063f7d3aece1461056d57600080fd5b8063a9059cbb146104a9578063b146ba71146104bc578063b75ebb19146104cf578063ce71f6d1146104e2578063d3cc8dd3146104eb57600080fd5b80638da5cb5b1161010a5780638da5cb5b1461045757806395d89b4114610468578063a457c2d714610470578063a51abfb014610483578063a8ed01241461049657600080fd5b80636fb73d08146103f85780636fc259551461040b57806370a082311461041e578063715018a6146104475780638456cb591461044f57600080fd5b8063327e1152116101df5780634c87e619116101a35780634c87e619146103915780634f3969e7146103a457806356760ecc146103b75780635c25bbe8146103ca5780635c975abb146103dd5780635cf14f0a146103ef57600080fd5b8063327e115214610351578063356b756314610364578063395093511461036d5780633f4ba83a1461038057806340b1bff21461038857600080fd5b806318160ddd1161022657806318160ddd146103015780632237db251461030957806323b872dd1461031c5780632c42d0bd1461032f578063313ce5671461034257600080fd5b8063028594641461026357806305231dea1461027857806306fdde031461029e578063095ea7b3146102b35780630ca00cc8146102d6575b600080fd5b610276610271366004612a3c565b610580565b005b61028b610286366004612ac9565b6106c3565b6040519081526020015b60405180910390f35b6102a6610845565b6040516102959190612b1e565b6102c66102c1366004612b73565b6108d7565b6040519015158152602001610295565b6102e96102e4366004612b9f565b6108ee565b6040516001600160a01b039091168152602001610295565b60025461028b565b610276610317366004612bb8565b610918565b6102c661032a366004612a3c565b610958565b61027661033d366004612b9f565b610a02565b60405160128152602001610295565b61027661035f366004612bb8565b610a31565b61028b600d5481565b6102c661037b366004612b73565b610a80565b610276610abc565b61028b600b5481565b61027661039f366004612be8565b610af0565b6102766103b2366004612c6b565b610bbf565b6102766103c5366004612ac9565b610c17565b61028b6103d8366004612ac9565b610c9f565b600554600160a01b900460ff166102c6565b61028b600e5481565b610276610406366004612be8565b610cf2565b610276610419366004612bb8565b610d95565b61028b61042c366004612c99565b6001600160a01b031660009081526020819052604090205490565b610276610dd5565b610276610e09565b6005546001600160a01b03166102e9565b6102a6610e3b565b6102c661047e366004612b73565b610e4a565b610276610491366004612cc4565b610ee3565b6102766104a4366004612ac9565b610f37565b6102c66104b7366004612b73565b610fe1565b6102766104ca366004612cf2565b610fee565b6102766104dd366004612d3d565b611095565b61028b600c5481565b6102766104f9366004612be8565b6110ee565b61028b61050c366004612c6b565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61028b610545366004612b73565b6111aa565b6102766111f6565b61027661125d565b610276610568366004612c99565b611363565b61027661057b366004612bb8565b6113fb565b6105893361143b565b506001600160a01b0383166105cb57336000908152600a602090815260408083206001600160a01b038616845290915290206105c59082611474565b50505050565b336000908152600a602090815260408083206001600160a01b038616845290915290206105f89082611474565b50336000908152600a602090815260408083206001600160a01b038716845290915290206106269082611487565b156106be57336000908152600a602090815260408083206001600160a01b03871684529091529020610658908261149f565b50336000908152600a602090815260408083206001600160a01b03871684529091529020610685906114ab565b6106be57336000908152600a602090815260408083206001600160a01b038716845290915281209081816106b982826129f5565b505050505b505050565b600554600090600160a01b900460ff16156106f95760405162461bcd60e51b81526004016106f090612d8a565b60405180910390fd5b6002600654141561074c5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106f0565b6002600655600061075c8561143b565b905060005b838110156107a357600085858381811061077d5761077d612db4565b90506020020135905061079087826114b5565b508061079b81612de0565b915050610761565b504260006107b48388888886611613565b90506107bf81611650565b60005b858110156108355760008787838181106107de576107de612db4565b905060200201359050846002015484111561080e5760028501546000828152600687016020526040902055610822565b600081815260068601602052604090208490555b508061082d81612de0565b9150506107c2565b5060016006559695505050505050565b60606003805461085490612dfb565b80601f016020809104026020016040519081016040528092919081815260200182805461088090612dfb565b80156108cd5780601f106108a2576101008083540402835291602001916108cd565b820191906000526020600020905b8154815290600101906020018083116108b057829003601f168201915b5050505050905090565b60006108e43384846116f4565b5060015b92915050565b600981815481106108fe57600080fd5b6000918252602090912001546001600160a01b0316905081565b6005546001600160a01b031633146109425760405162461bcd60e51b81526004016106f090612e36565b600061094d8261143b565b600301929092555050565b6000610965848484611818565b6001600160a01b0384166000908152600160209081526040808320338452909152902054828110156109ea5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084016106f0565b6109f785338584036116f4565b506001949350505050565b6005546001600160a01b03163314610a2c5760405162461bcd60e51b81526004016106f090612e36565b600b55565b6005546001600160a01b03163314610a5b5760405162461bcd60e51b81526004016106f090612e36565b6000610a668261143b565b9050610a7a83670de0b6b3a7640000612e6b565b90555050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916108e4918590610ab7908690612e8a565b6116f4565b6005546001600160a01b03163314610ae65760405162461bcd60e51b81526004016106f090612e36565b610aee6119e7565b565b6005546001600160a01b03163314610b1a5760405162461bcd60e51b81526004016106f090612e36565b808314610b395760405162461bcd60e51b81526004016106f090612ea2565b6000610b448661143b565b905060005b848110156106b957838382818110610b6357610b63612db4565b90506020020135670de0b6b3a7640000610b7d9190612e6b565b826005016000888885818110610b9557610b95612db4565b9050602002013581526020019081526020016000208190555080610bb890612de0565b9050610b49565b6005546001600160a01b03163314610be95760405162461bcd60e51b81526004016106f090612e36565b6000610bf483611a84565b80546001600160a01b0319166001600160a01b0393909316929092179091555050565b6005546001600160a01b03163314610c415760405162461bcd60e51b81526004016106f090612e36565b6000610c4c84611a84565b905060005b82811015610c9857610c87848483818110610c6e57610c6e612db4565b905060200201358360010161147490919063ffffffff16565b50610c9181612de0565b9050610c51565b5050505050565b600554600090600160a01b900460ff1615610ccc5760405162461bcd60e51b81526004016106f090612d8a565b6000610cd78561143b565b90506000610ce88287878742611ac0565b9695505050505050565b6000610cfd33611a84565b80549091506001600160a01b0387811691161415610d8d5760005b63ffffffff81168511156106b95783838263ffffffff16818110610d3e57610d3e612db4565b9050602002013582600301600088888563ffffffff16818110610d6357610d63612db4565b9050602002013581526020019081526020016000208190555080610d8690612eed565b9050610d18565b505050505050565b6005546001600160a01b03163314610dbf5760405162461bcd60e51b81526004016106f090612e36565b6000610dca8261143b565b600101929092555050565b6005546001600160a01b03163314610dff5760405162461bcd60e51b81526004016106f090612e36565b610aee6000611ae8565b6005546001600160a01b03163314610e335760405162461bcd60e51b81526004016106f090612e36565b610aee611b3a565b60606004805461085490612dfb565b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015610ecc5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016106f0565b610ed933858584036116f4565b5060019392505050565b6005546001600160a01b03163314610f0d5760405162461bcd60e51b81526004016106f090612e36565b6000610f1883611a84565b8054921515600160a01b0260ff60a01b19909316929092179091555050565b6005546001600160a01b03163314610f615760405162461bcd60e51b81526004016106f090612e36565b6000610f6c84611a84565b905060005b610f7d826001016114ab565b811015610faf57610f9e610f946001840183611b9f565b600184019061149f565b50610fa881612de0565b9050610f71565b5060005b82811015610c9857610fd0848483818110610c6e57610c6e612db4565b50610fda81612de0565b9050610fb3565b60006108e4338484611818565b6005546001600160a01b031633146110185760405162461bcd60e51b81526004016106f090612e36565b60098054600181019091557f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0180546001600160a01b039283166001600160a01b0319909116811790915560009081526008602052604090208054921515600160a01b026001600160a81b03199093169390911692909217179055565b6005546001600160a01b031633146110bf5760405162461bcd60e51b81526004016106f090612e36565b6001600160a01b0316600090815260076020526040902093845560018401929092556002830155600390910155565b6005546001600160a01b031633146111185760405162461bcd60e51b81526004016106f090612e36565b8281146111375760405162461bcd60e51b81526004016106f090612ea2565b60006111428661143b565b905060005b848110156106b95783838281811061116157611161612db4565b9050602002013582600401600088888581811061118057611180612db4565b90506020020135815260200190815260200160002081905550806111a390612de0565b9050611147565b600554600090600160a01b900460ff16156111d75760405162461bcd60e51b81526004016106f090612d8a565b60006111e28461143b565b90506111ee8184611bab565b949350505050565b6005546001600160a01b031633146112205760405162461bcd60e51b81526004016106f090612e36565b600042905061125633600d54600e548461123a9190612f11565b600c546112479190612e6b565b6112519190612f28565b611bcb565b5042600e55565b6005546001600160a01b031633146112875760405162461bcd60e51b81526004016106f090612e36565b6040516370a0823160e01b815230600482018190529063a9059cbb90339083906370a0823190602401602060405180830381865afa1580156112cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112f19190612f4a565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af115801561133c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113609190612f63565b50565b6005546001600160a01b0316331461138d5760405162461bcd60e51b81526004016106f090612e36565b6001600160a01b0381166113f25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106f0565b61136081611ae8565b6005546001600160a01b031633146114255760405162461bcd60e51b81526004016106f090612e36565b60006114308261143b565b600201929092555050565b6001600160a01b038116600090815260076020526040812060018101546108e85760405162461bcd60e51b81526004016106f090612f80565b60006114808383611caa565b9392505050565b60008181526001830160205260408120541515611480565b60006114808383611cf9565b60006108e8825490565b6001600160a01b0382166000908152600a6020908152604080832033845290915290206114e29082611487565b611596576040516331a9108f60e11b8152600481018290526000906001600160a01b03841690636352211e90602401602060405180830381865afa15801561152e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115529190612fc9565b90506001600160a01b038116331415611594576001600160a01b0383166000908152600a6020908152604080832033845290915290206115929083611474565b505b505b6001600160a01b0382166000908152600a6020908152604080832033845290915290206115c39082611487565b61160f5760405162461bcd60e51b815260206004820152601a60248201527f4e6f7420746865206f776e6572206f662074686520746f6b656e00000000000060448201526064016106f0565b5050565b60008061162287868686611dec565b61162c9082612e8a565b905061163b8688878787611ef3565b6116459082612e8a565b979650505050505050565b600081600b546116609190612f11565b1061168c5761166f3382611bcb565b80600b60008282546116819190612f11565b909155506113609050565b60405163a9059cbb60e01b815233600482015260248101829052309063a9059cbb906044016020604051808303816000875af11580156116d0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061160f9190612f63565b6001600160a01b0383166117565760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016106f0565b6001600160a01b0382166117b75760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016106f0565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831661187c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016106f0565b6001600160a01b0382166118de5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016106f0565b6001600160a01b038316600090815260208190526040902054818110156119565760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016106f0565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061198d908490612e8a565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516119d991815260200190565b60405180910390a350505050565b600554600160a01b900460ff16611a375760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016106f0565b6005805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b038082166000908152600860205260408120805491929091166108e85760405162461bcd60e51b81526004016106f090612f80565b600080611acf87868686611dec565b611ad99082612e8a565b905061163b86888787876124d8565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600554600160a01b900460ff1615611b645760405162461bcd60e51b81526004016106f090612d8a565b6005805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611a673390565b600061148083836129cb565b600081815260068301602052604081205480611480575050506001015490565b6001600160a01b038216611c215760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016106f0565b8060026000828254611c339190612e8a565b90915550506001600160a01b03821660009081526020819052604081208054839290611c60908490612e8a565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6000818152600183016020526040812054611cf1575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556108e8565b5060006108e8565b60008181526001830160205260408120548015611de2576000611d1d600183612f11565b8554909150600090611d3190600190612f11565b9050818114611d96576000866000018281548110611d5157611d51612db4565b9060005260206000200154905080876000018481548110611d7457611d74612db4565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611da757611da7612fe6565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506108e8565b60009150506108e8565b600080805b84811015611ee9576000611e1d88888885818110611e1157611e11612db4565b90506020020135611bab565b905087600201548114611ed8576000611e368287612f11565b895490915015611e6c5760038901548954611e519083612e6b565b611e5b9190612f28565b611e659085612e8a565b9350611ed6565b88600301548960050160008b60040160008c8c89818110611e8f57611e8f612db4565b9050602002013581526020019081526020016000205481526020019081526020016000205482611ebf9190612e6b565b611ec99190612f28565b611ed39085612e8a565b93505b505b50611ee281612de0565b9050611df1565b5095945050505050565b600080805b6009548110156124cd576000611f3460098381548110611f1a57611f1a612db4565b6000918252602090912001546001600160a01b0316611a84565b90506000808767ffffffffffffffff811115611f5257611f52612ffc565b604051908082528060200260200182016040528015611f7b578160200160208202803683370190505b50905060008867ffffffffffffffff811115611f9957611f99612ffc565b604051908082528060200260200182016040528015611fc2578160200160208202803683370190505b5084549091506001600160a01b038d81169116148015611fea57508354600160a01b900460ff165b156124b85760005b898110156121ee57600061202f868d8d8581811061201257612012612db4565b905060200201356000908152600391909101602052604090205490565b905061203d866001016114ab565b158061208757506120878d60040160008e8e8681811061205f5761205f612db4565b905060200201358152602001908152602001600020548760010161148790919063ffffffff16565b80156120ac57508c600201546120a98e8e8e86818110611e1157611e11612db4565b14155b80156120b757508015155b156121dd5760006120c8828c612f11565b8e54909150156121105760038e01548e546120e39083612e6b565b6120ed9190612f28565b8587815181106120ff576120ff612db4565b602002602001018181525050612198565b60008e60040160008f8f8781811061212a5761212a612db4565b90506020020135815260200190815260200160002054905060008f60050160008381526020019081526020016000205490508f60030154818461216d9190612e6b565b6121779190612f28565b87898151811061218957612189612db4565b60200260200101818152505050505b8c8c848181106121aa576121aa612db4565b905060200201358487815181106121c3576121c3612db4565b6020908102919091010152856121d881612de0565b965050505b506121e781612de0565b9050611ff2565b506121fb846001016114ab565b15612354576000815167ffffffffffffffff81111561221c5761221c612ffc565b604051908082528060200260200182016040528015612245578160200160208202803683370190505b50905060005b82518110156122b0578c600401600084838151811061226c5761226c612db4565b602002602001015181526020019081526020016000205482828151811061229557612295612db4565b60209081029190910101526122a981612de0565b905061224b565b50600986815481106122c4576122c4612db4565b600091825260209091200154604051638380313360e01b81526001600160a01b03909116906383803133906123019086908590879060040161304d565b602060405180830381865afa15801561231e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123429190612f4a565b61234c9088612e8a565b965050612430565b6000805b82518110156123985783818151811061237357612373612db4565b6020026020010151826123869190612e8a565b915061239181612de0565b9050612358565b50600986815481106123ac576123ac612db4565b600091825260209091200154604051630e1159a360e41b8152600481018390526001600160a01b039091169063e1159a3090602401602060405180830381865afa1580156123fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124229190612f4a565b61242c9088612e8a565b9650505b60005b81518110156124b657600085600301600084848151811061245657612456612db4565b6020026020010151815260200190815260200160002054146124a6578885600301600084848151811061248b5761248b612db4565b60200260200101518152602001908152602001600020819055505b6124af81612de0565b9050612433565b505b50505050806124c690612de0565b9050611ef8565b509695505050505050565b600080805b6009548110156124cd5760006124ff60098381548110611f1a57611f1a612db4565b90506000808767ffffffffffffffff81111561251d5761251d612ffc565b604051908082528060200260200182016040528015612546578160200160208202803683370190505b50905060008867ffffffffffffffff81111561256457612564612ffc565b60405190808252806020026020018201604052801561258d578160200160208202803683370190505b5084549091506001600160a01b038d811691161480156125b557508354600160a01b900460ff165b156129b65760005b898110156127745760006125dd868d8d8581811061201257612012612db4565b90506125eb866001016114ab565b158061260d575061260d8d60040160008e8e8681811061205f5761205f612db4565b801561263257508c6002015461262f8e8e8e86818110611e1157611e11612db4565b14155b801561263d57508015155b1561276357600061264e828c612f11565b8e54909150156126965760038e01548e546126699083612e6b565b6126739190612f28565b85878151811061268557612685612db4565b60200260200101818152505061271e565b60008e60040160008f8f878181106126b0576126b0612db4565b90506020020135815260200190815260200160002054905060008f60050160008381526020019081526020016000205490508f6003015481846126f39190612e6b565b6126fd9190612f28565b87898151811061270f5761270f612db4565b60200260200101818152505050505b8c8c8481811061273057612730612db4565b9050602002013584878151811061274957612749612db4565b60209081029190910101528561275e81612de0565b965050505b5061276d81612de0565b90506125bd565b50612781846001016114ab565b156128da576000815167ffffffffffffffff8111156127a2576127a2612ffc565b6040519080825280602002602001820160405280156127cb578160200160208202803683370190505b50905060005b8251811015612836578c60040160008483815181106127f2576127f2612db4565b602002602001015181526020019081526020016000205482828151811061281b5761281b612db4565b602090810291909101015261282f81612de0565b90506127d1565b506009868154811061284a5761284a612db4565b600091825260209091200154604051638380313360e01b81526001600160a01b03909116906383803133906128879086908590879060040161304d565b602060405180830381865afa1580156128a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128c89190612f4a565b6128d29088612e8a565b9650506129b6565b6000805b825181101561291e578381815181106128f9576128f9612db4565b60200260200101518261290c9190612e8a565b915061291781612de0565b90506128de565b506009868154811061293257612932612db4565b600091825260209091200154604051630e1159a360e41b8152600481018390526001600160a01b039091169063e1159a3090602401602060405180830381865afa158015612984573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129a89190612f4a565b6129b29088612e8a565b9650505b50505050806129c490612de0565b90506124dd565b60008260000182815481106129e2576129e2612db4565b9060005260206000200154905092915050565b508054600082559060005260206000209081019061136091905b80821115612a235760008155600101612a0f565b5090565b6001600160a01b038116811461136057600080fd5b600080600060608486031215612a5157600080fd5b8335612a5c81612a27565b92506020840135612a6c81612a27565b929592945050506040919091013590565b60008083601f840112612a8f57600080fd5b50813567ffffffffffffffff811115612aa757600080fd5b6020830191508360208260051b8501011115612ac257600080fd5b9250929050565b600080600060408486031215612ade57600080fd5b8335612ae981612a27565b9250602084013567ffffffffffffffff811115612b0557600080fd5b612b1186828701612a7d565b9497909650939450505050565b600060208083528351808285015260005b81811015612b4b57858101830151858201604001528201612b2f565b81811115612b5d576000604083870101525b50601f01601f1916929092016040019392505050565b60008060408385031215612b8657600080fd5b8235612b9181612a27565b946020939093013593505050565b600060208284031215612bb157600080fd5b5035919050565b60008060408385031215612bcb57600080fd5b823591506020830135612bdd81612a27565b809150509250929050565b600080600080600060608688031215612c0057600080fd5b8535612c0b81612a27565b9450602086013567ffffffffffffffff80821115612c2857600080fd5b612c3489838a01612a7d565b90965094506040880135915080821115612c4d57600080fd5b50612c5a88828901612a7d565b969995985093965092949392505050565b60008060408385031215612c7e57600080fd5b8235612c8981612a27565b91506020830135612bdd81612a27565b600060208284031215612cab57600080fd5b813561148081612a27565b801515811461136057600080fd5b60008060408385031215612cd757600080fd5b8235612ce281612a27565b91506020830135612bdd81612cb6565b600080600060608486031215612d0757600080fd5b8335612d1281612a27565b92506020840135612d2281612cb6565b91506040840135612d3281612a27565b809150509250925092565b600080600080600060a08688031215612d5557600080fd5b853594506020860135935060408601359250606086013591506080860135612d7c81612a27565b809150509295509295909350565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415612df457612df4612dca565b5060010190565b600181811c90821680612e0f57607f821691505b60208210811415612e3057634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000816000190483118215151615612e8557612e85612dca565b500290565b60008219821115612e9d57612e9d612dca565b500190565b6020808252602b908201527f50726f7669646564206172726179732073686f756c642068617665207468652060408201526a0e6c2daca40d8cadccee8d60ab1b606082015260800190565b600063ffffffff80831681811415612f0757612f07612dca565b6001019392505050565b600082821015612f2357612f23612dca565b500390565b600082612f4557634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215612f5c57600080fd5b5051919050565b600060208284031215612f7557600080fd5b815161148081612cb6565b60208082526029908201527f5468657265206973206e6f207969656c64657220776974682070726f7669646560408201526864206164647265737360b81b606082015260800190565b600060208284031215612fdb57600080fd5b815161148081612a27565b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600081518084526020808501945080840160005b8381101561304257815187529582019590820190600101613026565b509495945050505050565b6060815260006130606060830186613012565b82810360208401526130728186613012565b90508281036040840152610ce8818561301256fea264697066735822122041b7ccfca971685acbc29a15aaf0b79b6c92a1202db4b6eedf8a4833b737764564736f6c634300080a0033

Deployed Bytecode Sourcemap

37111:21521:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55892:631;;;;;;:::i;:::-;;:::i;:::-;;43789:1071;;;;;;:::i;:::-;;:::i;:::-;;;1706:25:1;;;1694:2;1679:18;43789:1071:0;;;;;;;;14381:100;;;:::i;:::-;;;;;;;:::i;16548:169::-;;;;;;:::i;:::-;;:::i;:::-;;;2829:14:1;;2822:22;2804:41;;2792:2;2777:18;16548:169:0;2664:187:1;38082:34:0;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;3205:32:1;;;3187:51;;3175:2;3160:18;38082:34:0;3041:203:1;15501:108:0;15589:12;;15501:108;;41420:226;;;;;;:::i;:::-;;:::i;17199:480::-;;;;;;:::i;:::-;;:::i;58497:132::-;;;;;;:::i;:::-;;:::i;15343:93::-;;;15426:2;3711:36:1;;3699:2;3684:18;15343:93:0;3569:184:1;41141:271:0;;;;;;:::i;:::-;;:::i;38464:58::-;;;;;;18088:215;;;;;;:::i;:::-;;:::i;58422:67::-;;;:::i;38304:57::-;;;;;;40088:577;;;;;;:::i;:::-;;:::i;42972:242::-;;;;;;:::i;:::-;;:::i;42381:351::-;;;;;;:::i;:::-;;:::i;44868:404::-;;;;;;:::i;:::-;;:::i;7841:86::-;7912:7;;-1:-1:-1;;;7912:7:0;;;;7841:86;;38531:41;;;;;;56531:498;;;;;;:::i;:::-;;:::i;40903:230::-;;;;;;:::i;:::-;;:::i;15672:127::-;;;;;;:::i;:::-;-1:-1:-1;;;;;15773:18:0;15746:7;15773:18;;;;;;;;;;;;15672:127;6202:94;;;:::i;58351:63::-;;;:::i;5551:87::-;5624:6;;-1:-1:-1;;;;;5624:6:0;5551:87;;14600:104;;;:::i;18806:401::-;;;;;;:::i;:::-;;:::i;42740:224::-;;;;;;:::i;:::-;;:::i;43222:541::-;;;;;;:::i;:::-;;:::i;16012:175::-;;;;;;:::i;:::-;;:::i;41673:378::-;;;;;;:::i;:::-;;:::i;38704:505::-;;;;;;:::i;:::-;;:::i;38394:63::-;;;;;;39538:542;;;;;;:::i;:::-;;:::i;16250:151::-;;;;;;:::i;:::-;-1:-1:-1;;;;;16366:18:0;;;16339:7;16366:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;16250:151;55337:276;;;;;;:::i;:::-;;:::i;57861:302::-;;;:::i;58171:172::-;;;:::i;6451:192::-;;;;;;:::i;:::-;;:::i;40673:222::-;;;;;;:::i;:::-;;:::i;55892:631::-;55981:30;56000:10;55981:18;:30::i;:::-;-1:-1:-1;;;;;;56028:19:0;;56024:492;;56080:10;56064:27;;;;:15;:27;;;;;;;;-1:-1:-1;;;;;56064:32:0;;;;;;;;;:46;;56101:8;56064:36;:46::i;:::-;;55892:631;;;:::o;56024:492::-;56159:10;56143:27;;;;:15;:27;;;;;;;;-1:-1:-1;;;;;56143:32:0;;;;;;;;;:46;;56180:8;56143:36;:46::i;:::-;-1:-1:-1;56224:10:0;56208:27;;;;:15;:27;;;;;;;;-1:-1:-1;;;;;56208:34:0;;;;;;;;;:53;;56252:8;56208:43;:53::i;:::-;56204:301;;;56298:10;56282:27;;;;:15;:27;;;;;;;;-1:-1:-1;;;;;56282:34:0;;;;;;;;;:51;;56324:8;56282:41;:51::i;:::-;-1:-1:-1;56372:10:0;56356:27;;;;:15;:27;;;;;;;;-1:-1:-1;;;;;56356:34:0;;;;;;;;;:43;;:41;:43::i;:::-;56352:138;;56452:10;56436:27;;;;:15;:27;;;;;;;;-1:-1:-1;;;;;56436:34:0;;;;;;;;;;;:27;56429:41;56436:34;:27;56429:41;:::i;:::-;;;;;56352:138;55892:631;;;:::o;43789:1071::-;7912:7;;43939;;-1:-1:-1;;;7912:7:0;;;;8166:9;8158:38;;;;-1:-1:-1;;;8158:38:0;;;;;;;:::i;:::-;;;;;;;;;3669:1:::1;4265:7;;:19;;4257:63;;;::::0;-1:-1:-1;;;4257:63:0;;7427:2:1;4257:63:0::1;::::0;::::1;7409:21:1::0;7466:2;7446:18;;;7439:30;7505:33;7485:18;;;7478:61;7556:18;;4257:63:0::1;7225:355:1::0;4257:63:0::1;3669:1;4398:7;:18:::0;43959:39:::2;44001:36;44020:16:::0;44001:18:::2;:36::i;:::-;43959:78;;44054:9;44050:168;44069:20:::0;;::::2;44050:168;;;44111:16;44130:9;;44140:1;44130:12;;;;;;;:::i;:::-;;;;;;;44111:31;;44157:49;44179:16;44197:8;44157:21;:49::i;:::-;-1:-1:-1::0;44091:3:0;::::2;::::0;::::2;:::i;:::-;;;;44050:168;;;-1:-1:-1::0;44250:15:0::2;44228:19;44310:91;44343:15:::0;44360:16;44378:9;;44250:15;44310:32:::2;:91::i;:::-;44278:123;;44414:34;44426:21;44414:11;:34::i;:::-;44465:9;44461:351;44480:20:::0;;::::2;44461:351;;;44522:16;44541:9;;44551:1;44541:12;;;;;;;:::i;:::-;;;;;;;44522:31;;44586:15;:24;;;44572:11;:38;44568:233;;;44670:24;::::0;::::2;::::0;44631:36:::2;::::0;;;:26:::2;::::0;::::2;:36;::::0;;;;:63;44568:233:::2;;;44735:36;::::0;;;:26:::2;::::0;::::2;:36;::::0;;;;:50;;;44568:233:::2;-1:-1:-1::0;44502:3:0;::::2;::::0;::::2;:::i;:::-;;;;44461:351;;;-1:-1:-1::0;3625:1:0::1;4577:7;:22:::0;44831:21;43789:1071;-1:-1:-1;;;;;;43789:1071:0:o;14381:100::-;14435:13;14468:5;14461:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14381:100;:::o;16548:169::-;16631:4;16648:39;1857:10;16671:7;16680:6;16648:8;:39::i;:::-;-1:-1:-1;16705:4:0;16548:169;;;;;:::o;38082:34::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38082:34:0;;-1:-1:-1;38082:34:0;:::o;41420:226::-;5624:6;;-1:-1:-1;;;;;5624:6:0;1857:10;5771:23;5763:68;;;;-1:-1:-1;;;5763:68:0;;;;;;;:::i;:::-;41519:39:::1;41561:29;41580:9;41561:18;:29::i;:::-;41601:25;;:37:::0;;;;-1:-1:-1;;41420:226:0:o;17199:480::-;17339:4;17356:36;17366:6;17374:9;17385:6;17356:9;:36::i;:::-;-1:-1:-1;;;;;17432:19:0;;17405:24;17432:19;;;:11;:19;;;;;;;;1857:10;17432:33;;;;;;;;17484:26;;;;17476:79;;;;-1:-1:-1;;;17476:79:0;;8937:2:1;17476:79:0;;;8919:21:1;8976:2;8956:18;;;8949:30;9015:34;8995:18;;;8988:62;-1:-1:-1;;;9066:18:1;;;9059:38;9114:19;;17476:79:0;8735:404:1;17476:79:0;17583:57;17592:6;1857:10;17633:6;17614:16;:25;17583:8;:57::i;:::-;-1:-1:-1;17667:4:0;;17199:480;-1:-1:-1;;;;17199:480:0:o;58497:132::-;5624:6;;-1:-1:-1;;;;;5624:6:0;1857:10;5771:23;5763:68;;;;-1:-1:-1;;;5763:68:0;;;;;;;:::i;:::-;58586:25:::1;:35:::0;58497:132::o;41141:271::-;5624:6;;-1:-1:-1;;;;;5624:6:0;1857:10;5771:23;5763:68;;;;-1:-1:-1;;;5763:68:0;;;;;;;:::i;:::-;41256:39:::1;41298:29;41317:9;41298:18;:29::i;:::-;41256:71:::0;-1:-1:-1;41374:30:0::1;:17:::0;41395:8:::1;41374:30;:::i;:::-;41338:66:::0;;-1:-1:-1;;41141:271:0:o;18088:215::-;1857:10;18176:4;18225:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;18225:34:0;;;;;;;;;;18176:4;;18193:80;;18216:7;;18225:47;;18262:10;;18225:47;:::i;:::-;18193:8;:80::i;58422:67::-;5624:6;;-1:-1:-1;;;;;5624:6:0;1857:10;5771:23;5763:68;;;;-1:-1:-1;;;5763:68:0;;;;;;;:::i;:::-;58471:10:::1;:8;:10::i;:::-;58422:67::o:0;40088:577::-;5624:6;;-1:-1:-1;;;;;5624:6:0;1857:10;5771:23;5763:68;;;;-1:-1:-1;;;5763:68:0;;;;;;;:::i;:::-;40283:40;;::::1;40275:96;;;;-1:-1:-1::0;;;40275:96:0::1;;;;;;;:::i;:::-;40384:39;40426:35;40445:15;40426:18;:35::i;:::-;40384:77;;40478:9;40474:184;40493:25:::0;;::::1;40474:184;;;40605:8;;40614:1;40605:11;;;;;;;:::i;:::-;;;;;;;40620:8;40605:24;;;;:::i;:::-;40540:15;:43;;:62;40584:14;;40599:1;40584:17;;;;;;;:::i;:::-;;;;;;;40540:62;;;;;;;;;;;:89;;;;40520:3;;;;:::i;:::-;;;40474:184;;42972:242:::0;5624:6;;-1:-1:-1;;;;;5624:6:0;1857:10;5771:23;5763:68;;;;-1:-1:-1;;;5763:68:0;;;;;;;:::i;:::-;43077:39:::1;43119:35;43138:15;43119:18;:35::i;:::-;43165:41:::0;;-1:-1:-1;;;;;;43165:41:0::1;-1:-1:-1::0;;;;;43165:41:0;;;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;;42972:242:0:o;42381:351::-;5624:6;;-1:-1:-1;;;;;5624:6:0;1857:10;5771:23;5763:68;;;;-1:-1:-1;;;5763:68:0;;;;;;;:::i;:::-;42499:39:::1;42541:35;42560:15;42541:18;:35::i;:::-;42499:77;;42592:9;42587:138;42607:28:::0;;::::1;42587:138;;;42657:56;42692:17;;42710:1;42692:20;;;;;;;:::i;:::-;;;;;;;42657:15;:30;;:34;;:56;;;;:::i;:::-;-1:-1:-1::0;42637:3:0::1;::::0;::::1;:::i;:::-;;;42587:138;;;;42488:244;42381:351:::0;;;:::o;44868:404::-;7912:7;;44990;;-1:-1:-1;;;7912:7:0;;;;8166:9;8158:38;;;;-1:-1:-1;;;8158:38:0;;;;;;;:::i;:::-;45010:39:::1;45052:36;45071:16;45052:18;:36::i;:::-;45010:78;;45101:29;45133:90;45161:15;45178:16;45196:9;;45207:15;45133:27;:90::i;:::-;45101:122:::0;44868:404;-1:-1:-1;;;;;;44868:404:0:o;56531:498::-;56717:39;56759:30;56778:10;56759:18;:30::i;:::-;56806:27;;;;-1:-1:-1;;;;;;56806:42:0;;;:27;;:42;56802:220;;;56870:8;56865:146;56884:20;;;;-1:-1:-1;56865:146:0;;;56981:11;;56993:1;56981:14;;;;;;;;;:::i;:::-;;;;;;;56930:15;:34;;:48;56965:9;;56975:1;56965:12;;;;;;;;;:::i;:::-;;;;;;;56930:48;;;;;;;;;;;:65;;;;56906:3;;;;:::i;:::-;;;56865:146;;56802:220;56645:384;56531:498;;;;;:::o;40903:230::-;5624:6;;-1:-1:-1;;;;;5624:6:0;1857:10;5771:23;5763:68;;;;-1:-1:-1;;;5763:68:0;;;;;;;:::i;:::-;41004:39:::1;41046:29;41065:9;41046:18;:29::i;:::-;41086:26;;:39:::0;;;;-1:-1:-1;;40903:230:0:o;6202:94::-;5624:6;;-1:-1:-1;;;;;5624:6:0;1857:10;5771:23;5763:68;;;;-1:-1:-1;;;5763:68:0;;;;;;;:::i;:::-;6267:21:::1;6285:1;6267:9;:21::i;58351:63::-:0;5624:6;;-1:-1:-1;;;;;5624:6:0;1857:10;5771:23;5763:68;;;;-1:-1:-1;;;5763:68:0;;;;;;;:::i;:::-;58398:8:::1;:6;:8::i;14600:104::-:0;14656:13;14689:7;14682:14;;;;;:::i;18806:401::-;1857:10;18899:4;18943:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;18943:34:0;;;;;;;;;;18996:35;;;;18988:85;;;;-1:-1:-1;;;18988:85:0;;10270:2:1;18988:85:0;;;10252:21:1;10309:2;10289:18;;;10282:30;10348:34;10328:18;;;10321:62;-1:-1:-1;;;10399:18:1;;;10392:35;10444:19;;18988:85:0;10068:401:1;18988:85:0;19101:67;1857:10;19124:7;19152:15;19133:16;:34;19101:8;:67::i;:::-;-1:-1:-1;19195:4:0;;18806:401;-1:-1:-1;;;18806:401:0:o;42740:224::-;5624:6;;-1:-1:-1;;;;;5624:6:0;1857:10;5771:23;5763:68;;;;-1:-1:-1;;;5763:68:0;;;;;;;:::i;:::-;42835:39:::1;42877:35;42896:15;42877:18;:35::i;:::-;42923:33:::0;;;::::1;;-1:-1:-1::0;;;42923:33:0::1;-1:-1:-1::0;;;;42923:33:0;;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;;42740:224:0:o;43222:541::-;5624:6;;-1:-1:-1;;;;;5624:6:0;1857:10;5771:23;5763:68;;;;-1:-1:-1;;;5763:68:0;;;;;;;:::i;:::-;43344:39:::1;43386:35;43405:15;43386:18;:35::i;:::-;43344:77;;43439:9;43434:172;43458:39;:15;:30;;:37;:39::i;:::-;43454:1;:43;43434:172;;;43519:75;43557:36;:30;::::0;::::1;43591:1:::0;43557:33:::1;:36::i;:::-;43519:30;::::0;::::1;::::0;:37:::1;:75::i;:::-;-1:-1:-1::0;43499:3:0::1;::::0;::::1;:::i;:::-;;;43434:172;;;;43623:9;43618:138;43638:28:::0;;::::1;43618:138;;;43688:56;43723:17;;43741:1;43723:20;;;;;;;:::i;43688:56::-;-1:-1:-1::0;43668:3:0::1;::::0;::::1;:::i;:::-;;;43618:138;;16012:175:::0;16098:4;16115:42;1857:10;16139:9;16150:6;16115:9;:42::i;41673:378::-;5624:6;;-1:-1:-1;;;;;5624:6:0;1857:10;5771:23;5763:68;;;;-1:-1:-1;;;5763:68:0;;;;;;;:::i;:::-;41830:17:::1;:39:::0;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;-1:-1:-1;;;;;41830:39:0;;::::1;-1:-1:-1::0;;;;;;41830:39:0;;::::1;::::0;::::1;::::0;;;-1:-1:-1;41922:25:0;;;:8:::1;41830:39;41922:25:::0;;;;41958:41;;42010:33;::::1;;-1:-1:-1::0;;;42010:33:0::1;-1:-1:-1::0;;;;;;42010:33:0;;;41958:41;;;::::1;42010:33:::0;;;;::::1;::::0;;41673:378::o;38704:505::-;5624:6;;-1:-1:-1;;;;;5624:6:0;1857:10;5771:23;5763:68;;;;-1:-1:-1;;;5763:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38966:25:0::1;38923:39;38966:25:::0;;;:8:::1;:25;::::0;;;;39004:53;;;39068:26:::1;::::0;::::1;:39:::0;;;;39118:24:::1;::::0;::::1;:35:::0;39164:25:::1;::::0;;::::1;:37:::0;38704:505::o;39538:542::-;5624:6;;-1:-1:-1;;;;;5624:6:0;1857:10;5771:23;5763:68;;;;-1:-1:-1;;;5763:68:0;;;;;;;:::i;:::-;39732:41;;::::1;39724:97;;;;-1:-1:-1::0;;;39724:97:0::1;;;;;;;:::i;:::-;39834:39;39876:35;39895:15;39876:18;:35::i;:::-;39834:77;;39928:9;39924:149;39943:20:::0;;::::1;39924:149;;;40044:14;;40059:1;40044:17;;;;;;;:::i;:::-;;;;;;;39985:15;:42;;:56;40028:9;;40038:1;40028:12;;;;;;;:::i;:::-;;;;;;;39985:56;;;;;;;;;;;:76;;;;39965:3;;;;:::i;:::-;;;39924:149;;55337:276:::0;7912:7;;55439;;-1:-1:-1;;;7912:7:0;;;;8166:9;8158:38;;;;-1:-1:-1;;;8158:38:0;;;;;;;:::i;:::-;55459:39:::1;55501:35;55520:15;55501:18;:35::i;:::-;55459:77;;55556:49;55579:15;55596:8;55556:22;:49::i;:::-;55549:56:::0;55337:276;-1:-1:-1;;;;55337:276:0:o;57861:302::-;5624:6;;-1:-1:-1;;;;;5624:6:0;1857:10;5771:23;5763:68;;;;-1:-1:-1;;;5763:68:0;;;;;;;:::i;:::-;57920:19:::1;57942:15;57920:37;;57968:130;57974:10;58065:32;;58035:26;;58021:11;:40;;;;:::i;:::-;57986:31;;:76;;;;:::i;:::-;:111;;;;:::i;:::-;57968:5;:130::i;:::-;-1:-1:-1::0;58140:15:0::1;58111:26;:44:::0;57861:302::o;58171:172::-;5624:6;;-1:-1:-1;;;;;5624:6:0;1857:10;5771:23;5763:68;;;;-1:-1:-1;;;5763:68:0;;;;;;;:::i;:::-;58288:46:::1;::::0;-1:-1:-1;;;58288:46:0;;58260:4:::1;58288:46;::::0;::::1;3187:51:1::0;;;58260:4:0;58245:30:::1;::::0;58276:10:::1;::::0;58260:4;;58288:31:::1;::::0;3160:18:1;;58288:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58245:90;::::0;-1:-1:-1;;;;;;58245:90:0::1;::::0;;;;;;-1:-1:-1;;;;;11207:32:1;;;58245:90:0::1;::::0;::::1;11189:51:1::0;11256:18;;;11249:34;11162:18;;58245:90:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;58171:172::o:0;6451:192::-;5624:6;;-1:-1:-1;;;;;5624:6:0;1857:10;5771:23;5763:68;;;;-1:-1:-1;;;5763:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;6540:22:0;::::1;6532:73;;;::::0;-1:-1:-1;;;6532:73:0;;11746:2:1;6532:73:0::1;::::0;::::1;11728:21:1::0;11785:2;11765:18;;;11758:30;11824:34;11804:18;;;11797:62;-1:-1:-1;;;11875:18:1;;;11868:36;11921:19;;6532:73:0::1;11544:402:1::0;6532:73:0::1;6616:19;6626:8;6616:9;:19::i;40673:222::-:0;5624:6;;-1:-1:-1;;;;;5624:6:0;1857:10;5771:23;5763:68;;;;-1:-1:-1;;;5763:68:0;;;;;;;:::i;:::-;40770:39:::1;40812:29;40831:9;40812:18;:29::i;:::-;40852:24;;:35:::0;;;;-1:-1:-1;;40673:222:0:o;39217:313::-;-1:-1:-1;;;;;39364:18:0;;39286:23;39364:18;;;:8;:18;;;;;39401:26;;;;39393:94;;;;-1:-1:-1;;;39393:94:0;;;;;;;:::i;34544:131::-;34611:4;34635:32;34640:3;34660:5;34635:4;:32::i;:::-;34628:39;34544:131;-1:-1:-1;;;34544:131:0:o;35074:146::-;35151:4;28134:19;;;:12;;;:19;;;;;;:24;;35175:37;28037:129;34851:137;34921:4;34945:35;34953:3;34973:5;34945:7;:35::i;35306:114::-;35366:7;35393:19;35401:3;28335:18;;28252:109;57344:509;-1:-1:-1;;;;;57444:33:0;;;;;;:15;:33;;;;;;;;57478:10;57444:45;;;;;;;:64;;57499:8;57444:54;:64::i;:::-;57439:291;;57541:44;;-1:-1:-1;;;57541:44:0;;;;;1706:25:1;;;57525:13:0;;-1:-1:-1;;;;;57541:34:0;;;;;1679:18:1;;57541:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57525:60;-1:-1:-1;;;;;;57604:19:0;;57613:10;57604:19;57600:119;;;-1:-1:-1;;;;;57644:33:0;;;;;;:15;:33;;;;;;;;57678:10;57644:45;;;;;;;:59;;57694:8;57644:49;:59::i;:::-;;57600:119;57510:220;57439:291;-1:-1:-1;;;;;57748:33:0;;;;;;:15;:33;;;;;;;;57782:10;57748:45;;;;;;;:64;;57803:8;57748:54;:64::i;:::-;57740:103;;;;-1:-1:-1;;;57740:103:0;;12819:2:1;57740:103:0;;;12801:21:1;12858:2;12838:18;;;12831:30;12897:28;12877:18;;;12870:56;12943:18;;57740:103:0;12617:350:1;57740:103:0;57344:509;;:::o;45280:532::-;45502:7;;45573:72;45603:16;45621:9;;45632:12;45573:29;:72::i;:::-;45558:87;;;;:::i;:::-;;;45671:102;45714:15;45731:16;45749:9;;45760:12;45671:42;:102::i;:::-;45656:117;;;;:::i;:::-;;45280:532;-1:-1:-1;;;;;;;45280:532:0:o;57037:299::-;57138:1;57127:7;57099:25;;:35;;;;:::i;:::-;:40;57095:234;;57156:26;57162:10;57174:7;57156:5;:26::i;:::-;57226:7;57197:25;;:36;;;;;;;:::i;:::-;;;;-1:-1:-1;57095:234:0;;-1:-1:-1;57095:234:0;;57266:51;;-1:-1:-1;;;57266:51:0;;57297:10;57266:51;;;11189::1;11256:18;;;11249:34;;;57281:4:0;;57266:30;;11162:18:1;;57266:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;22454:380::-;-1:-1:-1;;;;;22590:19:0;;22582:68;;;;-1:-1:-1;;;22582:68:0;;13174:2:1;22582:68:0;;;13156:21:1;13213:2;13193:18;;;13186:30;13252:34;13232:18;;;13225:62;-1:-1:-1;;;13303:18:1;;;13296:34;13347:19;;22582:68:0;12972:400:1;22582:68:0;-1:-1:-1;;;;;22669:21:0;;22661:68;;;;-1:-1:-1;;;22661:68:0;;13579:2:1;22661:68:0;;;13561:21:1;13618:2;13598:18;;;13591:30;13657:34;13637:18;;;13630:62;-1:-1:-1;;;13708:18:1;;;13701:32;13750:19;;22661:68:0;13377:398:1;22661:68:0;-1:-1:-1;;;;;22742:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;22794:32;;1706:25:1;;;22794:32:0;;1679:18:1;22794:32:0;;;;;;;22454:380;;;:::o;19697:721::-;-1:-1:-1;;;;;19837:20:0;;19829:70;;;;-1:-1:-1;;;19829:70:0;;13982:2:1;19829:70:0;;;13964:21:1;14021:2;14001:18;;;13994:30;14060:34;14040:18;;;14033:62;-1:-1:-1;;;14111:18:1;;;14104:35;14156:19;;19829:70:0;13780:401:1;19829:70:0;-1:-1:-1;;;;;19918:23:0;;19910:71;;;;-1:-1:-1;;;19910:71:0;;14388:2:1;19910:71:0;;;14370:21:1;14427:2;14407:18;;;14400:30;14466:34;14446:18;;;14439:62;-1:-1:-1;;;14517:18:1;;;14510:33;14560:19;;19910:71:0;14186:399:1;19910:71:0;-1:-1:-1;;;;;20078:17:0;;20054:21;20078:17;;;;;;;;;;;20114:23;;;;20106:74;;;;-1:-1:-1;;;20106:74:0;;14792:2:1;20106:74:0;;;14774:21:1;14831:2;14811:18;;;14804:30;14870:34;14850:18;;;14843:62;-1:-1:-1;;;14921:18:1;;;14914:36;14967:19;;20106:74:0;14590:402:1;20106:74:0;-1:-1:-1;;;;;20208:17:0;;;:9;:17;;;;;;;;;;;20228:22;;;20208:42;;20268:20;;;;;;;;:30;;20244:6;;20208:9;20268:30;;20244:6;;20268:30;:::i;:::-;;;;;;;;20333:9;-1:-1:-1;;;;;20316:35:0;20325:6;-1:-1:-1;;;;;20316:35:0;;20344:6;20316:35;;;;1706:25:1;;1694:2;1679:18;;1560:177;20316:35:0;;;;;;;;19818:600;19697:721;;;:::o;8900:120::-;7912:7;;-1:-1:-1;;;7912:7:0;;;;8436:41;;;;-1:-1:-1;;;8436:41:0;;15199:2:1;8436:41:0;;;15181:21:1;15238:2;15218:18;;;15211:30;-1:-1:-1;;;15257:18:1;;;15250:50;15317:18;;8436:41:0;14997:344:1;8436:41:0;8959:7:::1;:15:::0;;-1:-1:-1;;;;8959:15:0::1;::::0;;8990:22:::1;1857:10:::0;8999:12:::1;8990:22;::::0;-1:-1:-1;;;;;3205:32:1;;;3187:51;;3175:2;3160:18;8990:22:0::1;;;;;;;8900:120::o:0;42059:314::-;-1:-1:-1;;;;;42206:18:0;;;42128:23;42206:18;;;:8;:18;;;;;42243:27;;42128:23;;42206:18;;42243:27;42235:95;;;;-1:-1:-1;;;42235:95:0;;;;;;;:::i;45820:527::-;46042:7;;46113:72;46143:16;46161:9;;46172:12;46113:29;:72::i;:::-;46098:87;;;;:::i;:::-;;;46211:97;46249:15;46266:16;46284:9;;46295:12;46211:37;:97::i;6651:173::-;6726:6;;;-1:-1:-1;;;;;6743:17:0;;;-1:-1:-1;;;;;;6743:17:0;;;;;;;6776:40;;6726:6;;;6743:17;6726:6;;6776:40;;6707:16;;6776:40;6696:128;6651:173;:::o;8641:118::-;7912:7;;-1:-1:-1;;;7912:7:0;;;;8166:9;8158:38;;;;-1:-1:-1;;;8158:38:0;;;;;;;:::i;:::-;8701:7:::1;:14:::0;;-1:-1:-1;;;;8701:14:0::1;-1:-1:-1::0;;;8701:14:0::1;::::0;;8731:20:::1;8738:12;1857:10:::0;;1777:98;35774:137;35845:7;35880:22;35884:3;35896:5;35880:3;:22::i;54978:351::-;55093:7;55138:37;;;:27;;;:37;;;;;;55190:27;55186:103;;-1:-1:-1;;;55250:27:0;;;;54978:351::o;20705:399::-;-1:-1:-1;;;;;20789:21:0;;20781:65;;;;-1:-1:-1;;;20781:65:0;;15548:2:1;20781:65:0;;;15530:21:1;15587:2;15567:18;;;15560:30;15626:33;15606:18;;;15599:61;15677:18;;20781:65:0;15346:355:1;20781:65:0;20937:6;20921:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;20954:18:0;;:9;:18;;;;;;;;;;:28;;20976:6;;20954:9;:28;;20976:6;;20954:28;:::i;:::-;;;;-1:-1:-1;;20998:37:0;;1706:25:1;;;-1:-1:-1;;;;;20998:37:0;;;21015:1;;20998:37;;1694:2:1;1679:18;20998:37:0;;;;;;;57344:509;;:::o;25941:414::-;26004:4;28134:19;;;:12;;;:19;;;;;;26021:327;;-1:-1:-1;26064:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;26247:18;;26225:19;;;:12;;;:19;;;;;;:40;;;;26280:11;;26021:327;-1:-1:-1;26331:5:0;26324:12;;26531:1420;26597:4;26736:19;;;:12;;;:19;;;;;;26772:15;;26768:1176;;27147:21;27171:14;27184:1;27171:10;:14;:::i;:::-;27220:18;;27147:38;;-1:-1:-1;27200:17:0;;27220:22;;27241:1;;27220:22;:::i;:::-;27200:42;;27276:13;27263:9;:26;27259:405;;27310:17;27330:3;:11;;27342:9;27330:22;;;;;;;;:::i;:::-;;;;;;;;;27310:42;;27484:9;27455:3;:11;;27467:13;27455:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;27569:23;;;:12;;;:23;;;;;:36;;;27259:405;27745:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;27840:3;:12;;:19;27853:5;27840:19;;;;;;;;;;;27833:26;;;27883:4;27876:11;;;;;;;26768:1176;27927:5;27920:12;;;;;46355:1076;46545:7;;;46612:770;46632:20;;;46612:770;;;46674:21;46698:54;46721:16;46739:9;;46749:1;46739:12;;;;;;;:::i;:::-;;;;;;;46698:22;:54::i;:::-;46674:78;;46790:16;:25;;;46773:13;:42;46769:602;;46836:22;46861:28;46876:13;46861:12;:28;:::i;:::-;46912:34;;46836:53;;-1:-1:-1;46912:48:0;46908:448;;47065:26;;;;47028:34;;47011:51;;:14;:51;:::i;:::-;:80;;;;:::i;:::-;46985:106;;;;:::i;:::-;;;46908:448;;;47310:16;:26;;;47204:16;:44;;:103;47249:16;:43;;:57;47293:9;;47303:1;47293:12;;;;;;;:::i;:::-;;;;;;;47249:57;;;;;;;;;;;;47204:103;;;;;;;;;;;;47187:14;:120;;;;:::i;:::-;:149;;;;:::i;:::-;47140:196;;;;:::i;:::-;;;46908:448;46817:554;46769:602;-1:-1:-1;46654:3:0;;;:::i;:::-;;;46612:770;;;-1:-1:-1;47401:22:0;46355:1076;-1:-1:-1;;;;;46355:1076:0:o;47439:3922::-;47671:7;;;47743:3566;47789:17;:24;47774:39;;47743:3566;;;47846:39;47888:51;47907:17;47925:12;47907:31;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;47907:31:0;47888:18;:51::i;:::-;47846:93;-1:-1:-1;47954:27:0;;48062:9;48048:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48048:31:0;-1:-1:-1;48000:79:0;-1:-1:-1;48094:38:0;48149:9;48135:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48135:31:0;-1:-1:-1;48187:27:0;;48094:72;;-1:-1:-1;;;;;;48187:46:0;;;:27;;:46;:73;;;;-1:-1:-1;48237:23:0;;-1:-1:-1;;;48237:23:0;;;;48187:73;48183:3115;;;48286:9;48281:1639;48301:20;;;48281:1639;;;48351:24;48378:53;48401:15;48418:9;;48428:1;48418:12;;;;;;;:::i;:::-;;;;;;;55736:7;55780:45;;;:35;;;;;:45;;;;;;;55621:245;48378:53;48351:80;;48511:39;:15;:30;;:37;:39::i;:::-;:44;;:171;;;48584:98;48624:16;:43;;:57;48668:9;;48678:1;48668:12;;;;;;;:::i;:::-;;;;;;;48624:57;;;;;;;;;;;;48584:15;:30;;:39;;:98;;;;:::i;:::-;48484:312;;;;;48771:16;:25;;;48713:54;48736:16;48754:9;;48764:1;48754:12;;;;;;;:::i;48713:54::-;:83;;48484:312;:371;;;;-1:-1:-1;48825:30:0;;;48484:371;48454:1447;;;48906:22;48931:31;48946:16;48931:12;:31;:::i;:::-;48995:34;;48906:56;;-1:-1:-1;48995:48:0;48991:755;;49211:26;;;;49174:34;;49157:51;;:14;:51;:::i;:::-;:80;;;;:::i;:::-;49076:28;49105:19;49076:49;;;;;;;;:::i;:::-;;;;;;:161;;;;;48991:755;;;49302:33;49338:16;:43;;:57;49382:9;;49392:1;49382:12;;;;;;;:::i;:::-;;;;;;;49338:57;;;;;;;;;;;;49302:93;;49426:34;49463:16;:44;;:71;49508:25;49463:71;;;;;;;;;;;;49426:108;;49692:16;:26;;;49663;49646:14;:43;;;;:::i;:::-;:72;;;;:::i;:::-;49565:28;49594:19;49565:49;;;;;;;;:::i;:::-;;;;;;:153;;;;;49271:475;;48991:755;49817:9;;49827:1;49817:12;;;;;;;:::i;:::-;;;;;;;49772:21;49794:19;49772:42;;;;;;;;:::i;:::-;;;;;;;;;;:57;49856:21;;;;:::i;:::-;;;;48879:1022;48454:1447;-1:-1:-1;48323:3:0;;;:::i;:::-;;;48281:1639;;;;49942:39;:15;:30;;:37;:39::i;:::-;:44;49938:1020;;50011:30;50058:21;:28;50044:43;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50044:43:0;;50011:76;;50117:9;50112:198;50136:21;:28;50132:1;:32;50112:198;;;50217:16;:43;;:69;50261:21;50283:1;50261:24;;;;;;;;:::i;:::-;;;;;;;50217:69;;;;;;;;;;;;50198:13;50212:1;50198:16;;;;;;;;:::i;:::-;;;;;;;;;;:88;50166:3;;;:::i;:::-;;;50112:198;;;;50393:17;50411:12;50393:31;;;;;;;;:::i;:::-;;;;;;;;;;;50384:124;;-1:-1:-1;;;50384:124:0;;-1:-1:-1;;;;;50393:31:0;;;;50384:56;;:124;;50441:28;;50471:13;;50486:21;;50384:124;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50334:174;;;;:::i;:::-;;;49988:540;49938:1020;;;50557:39;50628:9;50623:176;50647:21;:28;50643:1;:32;50623:176;;;50744:28;50773:1;50744:31;;;;;;;;:::i;:::-;;;;;;;50709:66;;;;;:::i;:::-;;-1:-1:-1;50677:3:0;;;:::i;:::-;;;50623:176;;;;50859:17;50877:12;50859:31;;;;;;;;:::i;:::-;;;;;;;;;;;50850:88;;-1:-1:-1;;;50850:88:0;;;;;1706:25:1;;;-1:-1:-1;;;;;50859:31:0;;;;50850:55;;1679:18:1;;50850:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50821:117;;;;:::i;:::-;;;50534:424;49938:1020;50981:9;50976:307;51000:21;:28;50996:1;:32;50976:307;;;51134:1;51062:15;:34;;:60;51097:21;51119:1;51097:24;;;;;;;;:::i;:::-;;;;;;;51062:60;;;;;;;;;;;;:74;51058:206;;51228:12;51165:15;:34;;:60;51200:21;51222:1;51200:24;;;;;;;;:::i;:::-;;;;;;;51165:60;;;;;;;;;;;:75;;;;51058:206;51030:3;;;:::i;:::-;;;50976:307;;;;48183:3115;47831:3478;;;;47815:14;;;;:::i;:::-;;;47743:3566;;;-1:-1:-1;51328:25:0;47439:3922;-1:-1:-1;;;;;;47439:3922:0:o;51369:3601::-;51601:7;;;51673:3245;51719:17;:24;51704:39;;51673:3245;;;51776:39;51818:51;51837:17;51855:12;51837:31;;;;;;;;:::i;51818:51::-;51776:93;-1:-1:-1;51884:27:0;;51992:9;51978:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51978:31:0;-1:-1:-1;51930:79:0;-1:-1:-1;52024:38:0;52079:9;52065:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52065:31:0;-1:-1:-1;52117:27:0;;52024:72;;-1:-1:-1;;;;;;52117:46:0;;;:27;;:46;:73;;;;-1:-1:-1;52167:23:0;;-1:-1:-1;;;52167:23:0;;;;52117:73;52113:2794;;;52216:9;52211:1641;52231:20;;;52211:1641;;;52281:24;52308:53;52331:15;52348:9;;52358:1;52348:12;;;;;;;:::i;52308:53::-;52281:80;;52441:39;:15;:30;;:37;:39::i;:::-;:44;;:171;;;52514:98;52554:16;:43;;:57;52598:9;;52608:1;52598:12;;;;;;;:::i;52514:98::-;52414:312;;;;;52701:16;:25;;;52643:54;52666:16;52684:9;;52694:1;52684:12;;;;;;;:::i;52643:54::-;:83;;52414:312;:371;;;;-1:-1:-1;52755:30:0;;;52414:371;52384:1449;;;52838:22;52863:31;52878:16;52863:12;:31;:::i;:::-;52927:34;;52838:56;;-1:-1:-1;52927:48:0;52923:755;;53143:26;;;;53106:34;;53089:51;;:14;:51;:::i;:::-;:80;;;;:::i;:::-;53008:28;53037:19;53008:49;;;;;;;;:::i;:::-;;;;;;:161;;;;;52923:755;;;53234:33;53270:16;:43;;:57;53314:9;;53324:1;53314:12;;;;;;;:::i;:::-;;;;;;;53270:57;;;;;;;;;;;;53234:93;;53358:34;53395:16;:44;;:71;53440:25;53395:71;;;;;;;;;;;;53358:108;;53624:16;:26;;;53595;53578:14;:43;;;;:::i;:::-;:72;;;;:::i;:::-;53497:28;53526:19;53497:49;;;;;;;;:::i;:::-;;;;;;:153;;;;;53203:475;;52923:755;53749:9;;53759:1;53749:12;;;;;;;:::i;:::-;;;;;;;53704:21;53726:19;53704:42;;;;;;;;:::i;:::-;;;;;;;;;;:57;53788:21;;;;:::i;:::-;;;;52809:1024;52384:1449;-1:-1:-1;52253:3:0;;;:::i;:::-;;;52211:1641;;;;53874:39;:15;:30;;:37;:39::i;:::-;:44;53870:1022;;53943:30;53990:21;:28;53976:43;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53976:43:0;;53943:76;;54049:9;54044:198;54068:21;:28;54064:1;:32;54044:198;;;54149:16;:43;;:69;54193:21;54215:1;54193:24;;;;;;;;:::i;:::-;;;;;;;54149:69;;;;;;;;;;;;54130:13;54144:1;54130:16;;;;;;;;:::i;:::-;;;;;;;;;;:88;54098:3;;;:::i;:::-;;;54044:198;;;;54325:17;54343:12;54325:31;;;;;;;;:::i;:::-;;;;;;;;;;;54316:124;;-1:-1:-1;;;54316:124:0;;-1:-1:-1;;;;;54325:31:0;;;;54316:56;;:124;;54373:28;;54403:13;;54418:21;;54316:124;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54266:174;;;;:::i;:::-;;;53920:542;53870:1022;;;54491:39;54562:9;54557:176;54581:21;:28;54577:1;:32;54557:176;;;54678:28;54707:1;54678:31;;;;;;;;:::i;:::-;;;;;;;54643:66;;;;;:::i;:::-;;-1:-1:-1;54611:3:0;;;:::i;:::-;;;54557:176;;;;54793:17;54811:12;54793:31;;;;;;;;:::i;:::-;;;;;;;;;;;54784:88;;-1:-1:-1;;;54784:88:0;;;;;1706:25:1;;;-1:-1:-1;;;;;54793:31:0;;;;54784:55;;1679:18:1;;54784:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54755:117;;;;:::i;:::-;;;54468:424;53870:1022;51761:3157;;;;51745:14;;;;:::i;:::-;;;51673:3245;;28715:120;28782:7;28809:3;:11;;28821:5;28809:18;;;;;;;;:::i;:::-;;;;;;;;;28802:25;;28715:120;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:131:1:-;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;150:456;227:6;235;243;296:2;284:9;275:7;271:23;267:32;264:52;;;312:1;309;302:12;264:52;351:9;338:23;370:31;395:5;370:31;:::i;:::-;420:5;-1:-1:-1;477:2:1;462:18;;449:32;490:33;449:32;490:33;:::i;:::-;150:456;;542:7;;-1:-1:-1;;;596:2:1;581:18;;;;568:32;;150:456::o;611:367::-;674:8;684:6;738:3;731:4;723:6;719:17;715:27;705:55;;756:1;753;746:12;705:55;-1:-1:-1;779:20:1;;822:18;811:30;;808:50;;;854:1;851;844:12;808:50;891:4;883:6;879:17;867:29;;951:3;944:4;934:6;931:1;927:14;919:6;915:27;911:38;908:47;905:67;;;968:1;965;958:12;905:67;611:367;;;;;:::o;983:572::-;1078:6;1086;1094;1147:2;1135:9;1126:7;1122:23;1118:32;1115:52;;;1163:1;1160;1153:12;1115:52;1202:9;1189:23;1221:31;1246:5;1221:31;:::i;:::-;1271:5;-1:-1:-1;1327:2:1;1312:18;;1299:32;1354:18;1343:30;;1340:50;;;1386:1;1383;1376:12;1340:50;1425:70;1487:7;1478:6;1467:9;1463:22;1425:70;:::i;:::-;983:572;;1514:8;;-1:-1:-1;1399:96:1;;-1:-1:-1;;;;983:572:1:o;1742:597::-;1854:4;1883:2;1912;1901:9;1894:21;1944:6;1938:13;1987:6;1982:2;1971:9;1967:18;1960:34;2012:1;2022:140;2036:6;2033:1;2030:13;2022:140;;;2131:14;;;2127:23;;2121:30;2097:17;;;2116:2;2093:26;2086:66;2051:10;;2022:140;;;2180:6;2177:1;2174:13;2171:91;;;2250:1;2245:2;2236:6;2225:9;2221:22;2217:31;2210:42;2171:91;-1:-1:-1;2323:2:1;2302:15;-1:-1:-1;;2298:29:1;2283:45;;;;2330:2;2279:54;;1742:597;-1:-1:-1;;;1742:597:1:o;2344:315::-;2412:6;2420;2473:2;2461:9;2452:7;2448:23;2444:32;2441:52;;;2489:1;2486;2479:12;2441:52;2528:9;2515:23;2547:31;2572:5;2547:31;:::i;:::-;2597:5;2649:2;2634:18;;;;2621:32;;-1:-1:-1;;;2344:315:1:o;2856:180::-;2915:6;2968:2;2956:9;2947:7;2943:23;2939:32;2936:52;;;2984:1;2981;2974:12;2936:52;-1:-1:-1;3007:23:1;;2856:180;-1:-1:-1;2856:180:1:o;3249:315::-;3317:6;3325;3378:2;3366:9;3357:7;3353:23;3349:32;3346:52;;;3394:1;3391;3384:12;3346:52;3430:9;3417:23;3407:33;;3490:2;3479:9;3475:18;3462:32;3503:31;3528:5;3503:31;:::i;:::-;3553:5;3543:15;;;3249:315;;;;;:::o;3758:908::-;3889:6;3897;3905;3913;3921;3974:2;3962:9;3953:7;3949:23;3945:32;3942:52;;;3990:1;3987;3980:12;3942:52;4029:9;4016:23;4048:31;4073:5;4048:31;:::i;:::-;4098:5;-1:-1:-1;4154:2:1;4139:18;;4126:32;4177:18;4207:14;;;4204:34;;;4234:1;4231;4224:12;4204:34;4273:70;4335:7;4326:6;4315:9;4311:22;4273:70;:::i;:::-;4362:8;;-1:-1:-1;4247:96:1;-1:-1:-1;4450:2:1;4435:18;;4422:32;;-1:-1:-1;4466:16:1;;;4463:36;;;4495:1;4492;4485:12;4463:36;;4534:72;4598:7;4587:8;4576:9;4572:24;4534:72;:::i;:::-;3758:908;;;;-1:-1:-1;3758:908:1;;-1:-1:-1;4625:8:1;;4508:98;3758:908;-1:-1:-1;;;3758:908:1:o;4671:388::-;4739:6;4747;4800:2;4788:9;4779:7;4775:23;4771:32;4768:52;;;4816:1;4813;4806:12;4768:52;4855:9;4842:23;4874:31;4899:5;4874:31;:::i;:::-;4924:5;-1:-1:-1;4981:2:1;4966:18;;4953:32;4994:33;4953:32;4994:33;:::i;5064:247::-;5123:6;5176:2;5164:9;5155:7;5151:23;5147:32;5144:52;;;5192:1;5189;5182:12;5144:52;5231:9;5218:23;5250:31;5275:5;5250:31;:::i;5316:118::-;5402:5;5395:13;5388:21;5381:5;5378:32;5368:60;;5424:1;5421;5414:12;5439:382;5504:6;5512;5565:2;5553:9;5544:7;5540:23;5536:32;5533:52;;;5581:1;5578;5571:12;5533:52;5620:9;5607:23;5639:31;5664:5;5639:31;:::i;:::-;5689:5;-1:-1:-1;5746:2:1;5731:18;;5718:32;5759:30;5718:32;5759:30;:::i;5826:523::-;5900:6;5908;5916;5969:2;5957:9;5948:7;5944:23;5940:32;5937:52;;;5985:1;5982;5975:12;5937:52;6024:9;6011:23;6043:31;6068:5;6043:31;:::i;:::-;6093:5;-1:-1:-1;6150:2:1;6135:18;;6122:32;6163:30;6122:32;6163:30;:::i;:::-;6212:7;-1:-1:-1;6271:2:1;6256:18;;6243:32;6284:33;6243:32;6284:33;:::i;:::-;6336:7;6326:17;;;5826:523;;;;;:::o;6354:521::-;6449:6;6457;6465;6473;6481;6534:3;6522:9;6513:7;6509:23;6505:33;6502:53;;;6551:1;6548;6541:12;6502:53;6587:9;6574:23;6564:33;;6644:2;6633:9;6629:18;6616:32;6606:42;;6695:2;6684:9;6680:18;6667:32;6657:42;;6746:2;6735:9;6731:18;6718:32;6708:42;;6800:3;6789:9;6785:19;6772:33;6814:31;6839:5;6814:31;:::i;:::-;6864:5;6854:15;;;6354:521;;;;;;;;:::o;6880:340::-;7082:2;7064:21;;;7121:2;7101:18;;;7094:30;-1:-1:-1;;;7155:2:1;7140:18;;7133:46;7211:2;7196:18;;6880:340::o;7585:127::-;7646:10;7641:3;7637:20;7634:1;7627:31;7677:4;7674:1;7667:15;7701:4;7698:1;7691:15;7717:127;7778:10;7773:3;7769:20;7766:1;7759:31;7809:4;7806:1;7799:15;7833:4;7830:1;7823:15;7849:135;7888:3;-1:-1:-1;;7909:17:1;;7906:43;;;7929:18;;:::i;:::-;-1:-1:-1;7976:1:1;7965:13;;7849:135::o;7989:380::-;8068:1;8064:12;;;;8111;;;8132:61;;8186:4;8178:6;8174:17;8164:27;;8132:61;8239:2;8231:6;8228:14;8208:18;8205:38;8202:161;;;8285:10;8280:3;8276:20;8273:1;8266:31;8320:4;8317:1;8310:15;8348:4;8345:1;8338:15;8202:161;;7989:380;;;:::o;8374:356::-;8576:2;8558:21;;;8595:18;;;8588:30;8654:34;8649:2;8634:18;;8627:62;8721:2;8706:18;;8374:356::o;9144:168::-;9184:7;9250:1;9246;9242:6;9238:14;9235:1;9232:21;9227:1;9220:9;9213:17;9209:45;9206:71;;;9257:18;;:::i;:::-;-1:-1:-1;9297:9:1;;9144:168::o;9317:128::-;9357:3;9388:1;9384:6;9381:1;9378:13;9375:39;;;9394:18;;:::i;:::-;-1:-1:-1;9430:9:1;;9317:128::o;9450:407::-;9652:2;9634:21;;;9691:2;9671:18;;;9664:30;9730:34;9725:2;9710:18;;9703:62;-1:-1:-1;;;9796:2:1;9781:18;;9774:41;9847:3;9832:19;;9450:407::o;9862:201::-;9900:3;9928:10;9973:2;9966:5;9962:14;10000:2;9991:7;9988:15;9985:41;;;10006:18;;:::i;:::-;10055:1;10042:15;;9862:201;-1:-1:-1;;;9862:201:1:o;10474:125::-;10514:4;10542:1;10539;10536:8;10533:34;;;10547:18;;:::i;:::-;-1:-1:-1;10584:9:1;;10474:125::o;10604:217::-;10644:1;10670;10660:132;;10714:10;10709:3;10705:20;10702:1;10695:31;10749:4;10746:1;10739:15;10777:4;10774:1;10767:15;10660:132;-1:-1:-1;10806:9:1;;10604:217::o;10826:184::-;10896:6;10949:2;10937:9;10928:7;10924:23;10920:32;10917:52;;;10965:1;10962;10955:12;10917:52;-1:-1:-1;10988:16:1;;10826:184;-1:-1:-1;10826:184:1:o;11294:245::-;11361:6;11414:2;11402:9;11393:7;11389:23;11385:32;11382:52;;;11430:1;11427;11420:12;11382:52;11462:9;11456:16;11481:28;11503:5;11481:28;:::i;11951:405::-;12153:2;12135:21;;;12192:2;12172:18;;;12165:30;12231:34;12226:2;12211:18;;12204:62;-1:-1:-1;;;12297:2:1;12282:18;;12275:39;12346:3;12331:19;;11951:405::o;12361:251::-;12431:6;12484:2;12472:9;12463:7;12459:23;12455:32;12452:52;;;12500:1;12497;12490:12;12452:52;12532:9;12526:16;12551:31;12576:5;12551:31;:::i;15706:127::-;15767:10;15762:3;15758:20;15755:1;15748:31;15798:4;15795:1;15788:15;15822:4;15819:1;15812:15;15838:127;15899:10;15894:3;15890:20;15887:1;15880:31;15930:4;15927:1;15920:15;15954:4;15951:1;15944:15;15970:435;16023:3;16061:5;16055:12;16088:6;16083:3;16076:19;16114:4;16143:2;16138:3;16134:12;16127:19;;16180:2;16173:5;16169:14;16201:1;16211:169;16225:6;16222:1;16219:13;16211:169;;;16286:13;;16274:26;;16320:12;;;;16355:15;;;;16247:1;16240:9;16211:169;;;-1:-1:-1;16396:3:1;;15970:435;-1:-1:-1;;;;;15970:435:1:o;16410:669::-;16745:2;16734:9;16727:21;16708:4;16771:56;16823:2;16812:9;16808:18;16800:6;16771:56;:::i;:::-;16875:9;16867:6;16863:22;16858:2;16847:9;16843:18;16836:50;16909:44;16946:6;16938;16909:44;:::i;:::-;16895:58;;17001:9;16993:6;16989:22;16984:2;16973:9;16969:18;16962:50;17029:44;17066:6;17058;17029:44;:::i

Swarm Source

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