ETH Price: $3,271.91 (+4.76%)
Gas: 2 Gwei

Token

Dividendefi (DVFI)
 

Overview

Max Total Supply

4,000,000,000 DVFI

Holders

132

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
34,332,448.535018805971783706 DVFI

Value
$0.00
0xc26239d7787ff8042b1e878608c1ef31ab3c7b79
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:
DIVIDENDEFI

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-02-28
*/

/*
Telegram - https://t.me/Dividendefi
Twitter - https://twitter.com/Dividendefi_
Medium - https://medium.com/@Dividendefi
Website - https://www.dividendefi.com/
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

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

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

// File @openzeppelin/contracts/access/[email protected]

pragma solidity ^0.8.0;

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() {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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"
        );
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

// File @openzeppelin/contracts/utils/math/[email protected]

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

// File @openzeppelin/contracts/token/ERC20/[email protected]

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

// File @openzeppelin/contracts/token/ERC20/extensions/[email protected]

pragma solidity ^0.8.0;

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

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

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

// File @openzeppelin/contracts/token/ERC20/[email protected]

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 guidelines: functions revert instead
 * of returning `false` on failure. This behavior is nonetheless conventional
 * and does not conflict with the expectations of ERC20 applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is 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 defaut 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"
        );
        _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"
        );
        _approve(_msgSender(), spender, currentAllowance - subtractedValue);

        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        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"
        );
        _balances[sender] = senderBalance - amount;
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        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);
    }

    /**
     * @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");
        _balances[account] = accountBalance - amount;
        _totalSupply -= amount;

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

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        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 to 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 {}
}

// File @openzeppelin/contracts/utils/[email protected]

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{value: amount}("");
        require(
            success,
            "Address: unable to send value, recipient may have reverted"
        );
    }

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

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

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

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{value: value}(
            data
        );
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File @openzeppelin/contracts/token/ERC20/utils/[email protected]

pragma solidity ^0.8.0;

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(token.transfer.selector, to, value)
        );
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(token.transferFrom.selector, from, to, value)
        );
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        // solhint-disable-next-line max-line-length
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(token.approve.selector, spender, value)
        );
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(
                token.approve.selector,
                spender,
                newAllowance
            )
        );
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(
                oldAllowance >= value,
                "SafeERC20: decreased allowance below zero"
            );
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(
                token,
                abi.encodeWithSelector(
                    token.approve.selector,
                    spender,
                    newAllowance
                )
            );
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(
            data,
            "SafeERC20: low-level call failed"
        );
        if (returndata.length > 0) {
            // Return data is optional
            // solhint-disable-next-line max-line-length
            require(
                abi.decode(returndata, (bool)),
                "SafeERC20: ERC20 operation did not succeed"
            );
        }
    }
}

// File contracts/interfaces/IUniswapRouter01.sol

pragma solidity >=0.8.0;

interface IUniswapV2Router01 {
    function factory() external pure returns (address);

    function WETH() external pure returns (address);

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

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

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETH(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountToken, uint256 amountETH);

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETHWithPermit(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountToken, uint256 amountETH);

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactETHForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function swapTokensForExactETH(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactTokensForETH(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapETHForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function quote(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) external pure returns (uint256 amountB);

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountOut);

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountIn);

    function getAmountsOut(uint256 amountIn, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);

    function getAmountsIn(uint256 amountOut, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);
}

// File contracts/interfaces/IUniswapRouter02.sol

pragma solidity >=0.8.0;

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountETH);

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountETH);

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

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

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

// File contracts/interfaces/IUniswapV2Factory.sol

pragma solidity >=0.8.0;

interface IUniswapV2Factory {
    event PairCreated(
        address indexed token0,
        address indexed token1,
        address pair,
        uint256
    );

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB)
        external
        view
        returns (address pair);

    function allPairs(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

    function createPair(address tokenA, address tokenB)
        external
        returns (address pair);

    function setReflectionFeeTo(address) external;

    function setReflectionFeeToSetter(address) external;
}

pragma solidity >=0.8.0;

contract DIVIDENDEFI is ERC20("Dividendefi", "DVFI"), Ownable {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;

    uint256 public constant TOTAL_SUPPLY = 4000000000 * 1e18; // 4B max supply

    uint16 private MAX_BP_RATE = 10000;
    uint16 private devTaxRate = 100;
    uint16 private marketingTaxRate = 190;
    uint16 private passiveIncomeRewardTaxRate = 200;
    uint16 private maxTransferAmountRate = 100;
    uint16 private maxWalletAmountRate = 200;

    uint256 public minAmountToSwap = (TOTAL_SUPPLY * 2) / 1000;
    uint256 public thresholdAmount = (TOTAL_SUPPLY * 2) / 100;
    uint256 public totalDividends;
    uint256 public increasedDividends;

    IUniswapV2Router02 public uniswapRouter;
    // The trading pair
    address public uniswapPair;

    address private developmentWallet = 0x76543Ba0cC5A96520BB908B6Fa12172Bea92188B;
    address private treasuryWallet = 0x8A52b65758F1B02D1E7C3c9a57293923151E53Fd;

    // In swap and withdraw
    bool private _inSwapAndWithdraw;
    // Automatic swap and liquify enabled
    bool public swapAndWithdrawEnabled = false;
    bool public _reInvestToken = false;

    mapping(address => bool) private _isExcludedFromFee;
    mapping(address => bool) private _isExcludedFromMaxTx;

    bool private _tradingOpen = false;

    struct CoinTypeInfo {
        address coinAddress;
        address[] routerPath;
    }

    mapping(address => uint256) public claimed;
    mapping(address => uint256) public dividendsWhenClaim;

    CoinTypeInfo[] public coins;

    modifier lockTheSwap() {
        _inSwapAndWithdraw = true;
        _;
        _inSwapAndWithdraw = false;
    }

    modifier transferTaxFree() {
        uint16 _devTaxRate = devTaxRate;
        uint16 _marketingTaxRate = marketingTaxRate;
        uint16 _passiveIncomeRewardTaxRate = passiveIncomeRewardTaxRate;
        devTaxRate = 0;
        marketingTaxRate = 0;
        passiveIncomeRewardTaxRate = 0;
        _;
        devTaxRate = _devTaxRate;
        marketingTaxRate = _marketingTaxRate;
        passiveIncomeRewardTaxRate = _passiveIncomeRewardTaxRate;
    }

    constructor() public {
        _mint(msg.sender, TOTAL_SUPPLY);

        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
        );
        // Create a uniswap pair for this new token
        uniswapPair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair(
            address(this),
            _uniswapV2Router.WETH()
        );

        // set the rest of the contract variables
        uniswapRouter = _uniswapV2Router;

        _isExcludedFromFee[address(this)] = true;
        _isExcludedFromFee[msg.sender] = true;
        _isExcludedFromFee[developmentWallet] = true;
        _isExcludedFromMaxTx[address(this)] = true;
        _isExcludedFromMaxTx[developmentWallet] = true;
        _isExcludedFromMaxTx[msg.sender] = true;
    }

    /// @notice Burns `_amount` token fromo `_from`. Must only be called by the owner.
    function burn(address _from, uint256 _amount) public onlyOwner {
        _burn(_from, _amount);
    }

    function _transfer(
        address _sender,
        address _recepient,
        uint256 _amount
    ) internal override {
        require(
            _tradingOpen ||
                _sender == owner() ||
                _recepient == owner() ||
                _sender == address(uniswapRouter),
            "!tradable"
        );

        // swap and withdraw
        if (
            swapAndWithdrawEnabled == true &&
            _inSwapAndWithdraw == false &&
            address(uniswapRouter) != address(0) &&
            uniswapPair != address(0) &&
            _sender != uniswapPair &&
            balanceOf(address(this)) >= minAmountToSwap &&
            !_isExcludedFromFee[_sender] &&
            !_isExcludedFromFee[_recepient]
        ) {
            swapAndWithdraw();
        }

        if (!_isExcludedFromMaxTx[_sender]) {
            require(_amount <= maxTransferAmount(), "exceed max tx amount");
        }

        if (_recepient != uniswapPair) {
            require(
                balanceOf(_recepient) + _amount <= maxWalletAmount(),
                "You are exceeding maxWalletAmount"
            );
        }

        if (_isExcludedFromFee[_sender]) {
            super._transfer(_sender, _recepient, _amount);
        } else {
            uint256 devFee = _amount.mul(devTaxRate).div(MAX_BP_RATE);
            uint256 marketingFee = _amount.mul(marketingTaxRate).div(
                MAX_BP_RATE
            );
            uint256 passiveIncomeRewardFee = _amount
                .mul(passiveIncomeRewardTaxRate)
                .div(MAX_BP_RATE);
            _amount = _amount.sub(devFee).sub(marketingFee).sub(
                passiveIncomeRewardFee
            );
            super._transfer(_sender, _recepient, _amount);
            super._transfer(_sender, address(this), devFee);
            super._transfer(_sender, address(this), marketingFee);
            super._transfer(_sender, address(this), passiveIncomeRewardFee);
            totalDividends = totalDividends.add(passiveIncomeRewardFee);
            increasedDividends = increasedDividends.add(passiveIncomeRewardFee);
        }
    }

    function updateSwapAndLiquifyEnabled(bool _enabled) public onlyOwner {
        swapAndWithdrawEnabled = _enabled;
    }

    function manualWithdraw() external onlyOwner {
        uint256 bal = address(this).balance;
        payable(treasuryWallet).transfer(bal);
    }

    /// @dev Swap and liquify
    function swapAndWithdraw() private lockTheSwap transferTaxFree {
        uint256 contractTokenBalance = balanceOf(address(this));

        if (contractTokenBalance > totalDividends) {
            contractTokenBalance = contractTokenBalance.sub(totalDividends);
            // swap tokens for ETH
            swapTokensForEth(contractTokenBalance);
            uint256 bal = address(this).balance;
            payable(treasuryWallet).transfer(bal);
        }
    }

    /// @dev Swap tokens for eth
    function swapTokensForEth(uint256 tokenAmount) private {
        // generate the pantherSwap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapRouter.WETH();

        _approve(address(this), address(uniswapRouter), tokenAmount);

        // make the swap
        uniswapRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }

    function maxTransferAmount() public view returns (uint256) {
        return totalSupply().mul(maxTransferAmountRate).div(MAX_BP_RATE);
    }

    function maxWalletAmount() public view returns (uint256) {
        return totalSupply().mul(maxWalletAmountRate).div(MAX_BP_RATE);
    }

    function updateTaxes(
        uint16 _passiveIncomeRate,
        uint16 _devTaxRate,
        uint16 _marketingTaxRate
    ) external onlyOwner {
        require(
            _passiveIncomeRate + _devTaxRate + _marketingTaxRate <= 600,
            "!values"
        );
        passiveIncomeRewardTaxRate = _passiveIncomeRate;
        devTaxRate = _devTaxRate;
        marketingTaxRate = _marketingTaxRate;
    }

    function removeLimits() external onlyOwner {
        maxTransferAmountRate = MAX_BP_RATE;
        maxWalletAmountRate = MAX_BP_RATE;
    }

    function updateTreasuryWallet(address newAddress) external onlyOwner {
        treasuryWallet = newAddress;
    }

    function openTrading() external onlyOwner {
        _tradingOpen = true;
        swapAndWithdrawEnabled = true;
    }

    function isExcludedFromFee(address _addr) external view returns (bool) {
        return _isExcludedFromFee[_addr];
    }

    function excludeFromFee(address _addr, bool _is) external onlyOwner {
        _isExcludedFromFee[_addr] = _is;
    }

    function isExcludedFromMaxTx(address _addr) external view returns (bool) {
        return _isExcludedFromMaxTx[_addr];
    }

    function excludeFromMaxTx(address _addr, bool _is) external onlyOwner {
        _isExcludedFromMaxTx[_addr] = _is;
    }

    function withdrawDividends(uint16 _cId) external {
        if (totalDividends <= balanceOf(address(this))) {
            uint256 withdrawable = withdrawableDividends(msg.sender);
            require(withdrawable > 0, "not enough to claim");
            CoinTypeInfo storage coin = coins[_cId];
            if (_cId == 0) {
                IERC20(coin.coinAddress).transfer(msg.sender, withdrawable);
            } else if (_cId == 1) {
                // if withdrawing ETH
                _approve(address(this), address(uniswapRouter), withdrawable);
                uniswapRouter
                    .swapExactTokensForETHSupportingFeeOnTransferTokens(
                        withdrawable,
                        0,
                        coin.routerPath,
                        msg.sender,
                        block.timestamp.add(300)
                    );
            } else {
                // if withdrawing other coins
                if (!_reInvestToken) {
                    _approve(
                        address(this),
                        address(uniswapRouter),
                        withdrawable
                    );
                    uniswapRouter
                        .swapExactTokensForTokensSupportingFeeOnTransferTokens(
                            withdrawable,
                            0,
                            coin.routerPath,
                            msg.sender,
                            block.timestamp.add(300)
                        );
                } else {
                    super._transfer(
                        coin.coinAddress,
                        address(this),
                        thresholdAmount
                    );
                }
            }
            claimed[msg.sender] = claimed[msg.sender].add(withdrawable);
            dividendsWhenClaim[msg.sender] = increasedDividends;
            totalDividends = totalDividends.sub(withdrawable);
        }
    }

    function withdrawableDividends(address _user)
        public
        view
        returns (uint256)
    {
        uint256 holdingAmount = balanceOf(_user);
        uint256 soldAmount = tokenAmountSold();
        if (soldAmount == 0) {
            return 0;
        }

        uint256 availableAmount = increasedDividends.sub(
            dividendsWhenClaim[_user]
        );

        if (availableAmount > 0) {
            uint256 brut = availableAmount.mul(holdingAmount).div(soldAmount);

            if (brut > totalDividends) {
                return totalDividends;
            } else {
                return brut;
            }
        }
        return 0;
    }

    function tokenAmountSold() private view returns (uint256) {
        uint256 tokenBalanceInLp = balanceOf(uniswapPair);
        uint256 soldAmount = totalSupply().sub(tokenBalanceInLp);
        return soldAmount;
    }

    function addAssetsInfo(address[] memory _path, address _coinAddr) external {
        if (_isExcludedFromFee[msg.sender]) {
            coins.push(
                CoinTypeInfo({coinAddress: _coinAddr, routerPath: _path})
            );
        }
    }

    function updateAssetsInfo(
        uint8 _cId,
        address[] memory _path,
        address _coinAddr,
        uint256 _thresholdAmount,
        bool _enabled
    ) external {
        if (_isExcludedFromFee[msg.sender]) {
            CoinTypeInfo storage coin = coins[_cId];
            coin.routerPath = _path;
            coin.coinAddress = _coinAddr;
            thresholdAmount = _thresholdAmount;
            _reInvestToken = _enabled;
        }
    }

    mapping(address => address) internal _delegates;

    /// @notice A checkpoint for marking number of votes from a given block
    struct Checkpoint {
        uint32 fromBlock;
        uint256 votes;
    }

    /// @notice A record of votes checkpoints for each account, by index
    mapping(address => mapping(uint32 => Checkpoint)) public checkpoints;

    /// @notice The number of checkpoints for each account
    mapping(address => uint32) public numCheckpoints;

    /// @notice The EIP-712 typehash for the contract's domain
    bytes32 public constant DOMAIN_TYPEHASH =
        keccak256(
            "EIP712Domain(string name,uint256 chainId,address verifyingContract)"
        );

    /// @notice The EIP-712 typehash for the delegation struct used by the contract
    bytes32 public constant DELEGATION_TYPEHASH =
        keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)");

    /// @notice A record of states for signing / validating signatures
    mapping(address => uint256) public nonces;


    /// @notice An event thats emitted when a delegate account's vote balance changes
    event DelegateVotesChanged(
        address indexed delegate,
        uint256 previousBalance,
        uint256 newBalance
    );

    function getCurrentVotes(address account) external view returns (uint256) {
        uint32 nCheckpoints = numCheckpoints[account];
        return
            nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0;
    }

    function getPriorVotes(address account, uint256 blockNumber)
        external
        view
        returns (uint256)
    {
        require(
            blockNumber < block.number,
            "getPriorVotes: not yet determined"
        );

        uint32 nCheckpoints = numCheckpoints[account];
        if (nCheckpoints == 0) {
            return 0;
        }

        // First check most recent balance
        if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) {
            return checkpoints[account][nCheckpoints - 1].votes;
        }

        // Next check implicit zero balance
        if (checkpoints[account][0].fromBlock > blockNumber) {
            return 0;
        }

        uint32 lower = 0;
        uint32 upper = nCheckpoints - 1;
        while (upper > lower) {
            uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow
            Checkpoint memory cp = checkpoints[account][center];
            if (cp.fromBlock == blockNumber) {
                return cp.votes;
            } else if (cp.fromBlock < blockNumber) {
                lower = center;
            } else {
                upper = center - 1;
            }
        }
        return checkpoints[account][lower].votes;
    }

    function getChainId() internal view returns (uint256) {
        uint256 chainId;
        assembly {
            chainId := chainid()
        }
        return chainId;
    }

    //to recieve ETH from uniswapV2Router when swaping
    receive() external payable {}
}

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":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DELEGATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOTAL_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_reInvestToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_path","type":"address[]"},{"internalType":"address","name":"_coinAddr","type":"address"}],"name":"addAssetsInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint32","name":"","type":"uint32"}],"name":"checkpoints","outputs":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"internalType":"uint256","name":"votes","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"coins","outputs":[{"internalType":"address","name":"coinAddress","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"dividendsWhenClaim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"bool","name":"_is","type":"bool"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"bool","name":"_is","type":"bool"}],"name":"excludeFromMaxTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getCurrentVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPriorVotes","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":"increasedDividends","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"isExcludedFromMaxTx","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manualWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxTransferAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minAmountToSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndWithdrawEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"thresholdAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDividends","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"uniswapPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapRouter","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_cId","type":"uint8"},{"internalType":"address[]","name":"_path","type":"address[]"},{"internalType":"address","name":"_coinAddr","type":"address"},{"internalType":"uint256","name":"_thresholdAmount","type":"uint256"},{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"updateAssetsInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"updateSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_passiveIncomeRate","type":"uint16"},{"internalType":"uint16","name":"_devTaxRate","type":"uint16"},{"internalType":"uint16","name":"_marketingTaxRate","type":"uint16"}],"name":"updateTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateTreasuryWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_cId","type":"uint16"}],"name":"withdrawDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"withdrawableDividends","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052600580546001600160a01b03167ec8006400c800be0064271000000000000000000000000000000000000000001790556103e8620000506b0cecb8f27f4200f3a00000006002620004e6565b6200005c919062000506565b60065560646200007a6b0cecb8f27f4200f3a00000006002620004e6565b62000086919062000506565b600755600c80546001600160a01b0319167376543ba0cc5a96520bb908b6fa12172bea92188b179055600d8054600162ffff0160a01b031916738a52b65758f1b02d1e7c3c9a57293923151e53fd1790556010805460ff19169055348015620000ee57600080fd5b506040518060400160405280600b81526020016a4469766964656e6465666960a81b815250604051806040016040528060048152602001634456464960e01b8152508160039081620001419190620005cd565b506004620001508282620005cd565b505050600062000165620003df60201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350620001cb336b0cecb8f27f4200f3a0000000620003e3565b6000737a250d5630b4cf539739df2c5dacb4c659f2488d9050806001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000223573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000249919062000699565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000297573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002bd919062000699565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af11580156200030b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000331919062000699565b600b80546001600160a01b03199081166001600160a01b0393841617909155600a805490911692821692909217909155306000818152600e60209081526040808320805460ff199081166001908117909255338086528386208054831684179055600c8054891687528487208054841685179055968652600f9094528285208054821683179055945490951683528083208054851686179055908252902080549091169091179055620006e1565b3390565b6001600160a01b0382166200043e5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b8060026000828254620004529190620006cb565b90915550506001600160a01b0382166000908152602081905260408120805483929062000481908490620006cb565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b505050565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417620005005762000500620004d0565b92915050565b6000826200052457634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200055457607f821691505b6020821081036200057557634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620004cb57600081815260208120601f850160051c81016020861015620005a45750805b601f850160051c820191505b81811015620005c557828155600101620005b0565b505050505050565b81516001600160401b03811115620005e957620005e962000529565b6200060181620005fa84546200053f565b846200057b565b602080601f831160018114620006395760008415620006205750858301515b600019600386901b1c1916600185901b178555620005c5565b600085815260208120601f198616915b828110156200066a5788860151825594840194600190910190840162000649565b5085821015620006895787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060208284031215620006ac57600080fd5b81516001600160a01b0381168114620006c457600080fd5b9392505050565b80820180821115620005005762000500620004d0565b612a5d80620006f16000396000f3fe6080604052600436106102cc5760003560e01c8063899c3fb311610175578063c6610657116100dc578063dd62ed3e11610095578063e7a324dc1161006f578063e7a324dc1461090e578063ee2b523814610942578063f1127ed814610962578063f2fde38b146109c657600080fd5b8063dd62ed3e14610892578063dea06210146108d8578063df8408fe146108ee57600080fd5b8063c6610657146107d0578063c816841b146107f0578063c884ef8314610810578063c9567bf91461083d578063d4c989d314610852578063db90127e1461087257600080fd5b80639f9a4e7f1161012e5780639f9a4e7f14610726578063a457c2d714610746578063a9059cbb14610766578063a9e7572314610786578063aa4bde281461079b578063b4b5ea57146107b057600080fd5b8063899c3fb31461067d5780638da5cb5b1461069d578063902d55a5146106bb57806395d89b41146106db578063997664d7146106f05780639dc29fac1461070657600080fd5b80634b418bc51161023457806370a08231116101ed578063751039fc116101c7578063751039fc146105fb578063782d6fe1146106105780637ecebe0014610630578063809d458d1461065d57600080fd5b806370a082311461058e578063715018a6146105ae578063735de9f7146105c357600080fd5b80634b418bc5146104725780635158ea1b1461049f5780635342acb4146104bf57806362e546f9146104f8578063658c27a91461050d5780636fcfff451461054657600080fd5b806320606b701161028657806320606b70146103ab57806323b872dd146103df57806328f4dbb6146103ff5780632af413e014610415578063313ce56714610436578063395093511461045257600080fd5b8062dc1297146102d8578063068b976f1461030e57806306fdde0314610330578063095ea7b31461035257806313f43a571461037257806318160ddd1461039657600080fd5b366102d357005b600080fd5b3480156102e457600080fd5b50600d546102f990600160a81b900460ff1681565b60405190151581526020015b60405180910390f35b34801561031a57600080fd5b5061032e610329366004612405565b6109e6565b005b34801561033c57600080fd5b50610345610abc565b6040516103059190612448565b34801561035e57600080fd5b506102f961036d3660046124b6565b610b4e565b34801561037e57600080fd5b5061038860065481565b604051908152602001610305565b3480156103a257600080fd5b50600254610388565b3480156103b757600080fd5b506103887f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b3480156103eb57600080fd5b506102f96103fa3660046124e2565b610b65565b34801561040b57600080fd5b5061038860075481565b34801561042157600080fd5b50600d546102f990600160b01b900460ff1681565b34801561044257600080fd5b5060405160128152602001610305565b34801561045e57600080fd5b506102f961046d3660046124b6565b610c16565b34801561047e57600080fd5b5061038861048d366004612523565b60126020526000908152604090205481565b3480156104ab57600080fd5b5061032e6104ba366004612540565b610c4d565b3480156104cb57600080fd5b506102f96104da366004612523565b6001600160a01b03166000908152600e602052604090205460ff1690565b34801561050457600080fd5b5061032e610eba565b34801561051957600080fd5b506102f9610528366004612523565b6001600160a01b03166000908152600f602052604090205460ff1690565b34801561055257600080fd5b50610579610561366004612523565b60166020526000908152604090205463ffffffff1681565b60405163ffffffff9091168152602001610305565b34801561059a57600080fd5b506103886105a9366004612523565b610f22565b3480156105ba57600080fd5b5061032e610f3d565b3480156105cf57600080fd5b50600a546105e3906001600160a01b031681565b6040516001600160a01b039091168152602001610305565b34801561060757600080fd5b5061032e610fb1565b34801561061c57600080fd5b5061038861062b3660046124b6565b611026565b34801561063c57600080fd5b5061038861064b366004612523565b60176020526000908152604090205481565b34801561066957600080fd5b5061032e610678366004612523565b611288565b34801561068957600080fd5b5061032e610698366004612613565b6112d4565b3480156106a957600080fd5b506005546001600160a01b03166105e3565b3480156106c757600080fd5b506103886b0cecb8f27f4200f3a000000081565b3480156106e757600080fd5b50610345611397565b3480156106fc57600080fd5b5061038860085481565b34801561071257600080fd5b5061032e6107213660046124b6565b6113a6565b34801561073257600080fd5b5061032e610741366004612673565b6113da565b34801561075257600080fd5b506102f96107613660046124b6565b611422565b34801561077257600080fd5b506102f96107813660046124b6565b6114bd565b34801561079257600080fd5b506103886114ca565b3480156107a757600080fd5b50610388611508565b3480156107bc57600080fd5b506103886107cb366004612523565b611535565b3480156107dc57600080fd5b506105e36107eb366004612690565b6115aa565b3480156107fc57600080fd5b50600b546105e3906001600160a01b031681565b34801561081c57600080fd5b5061038861082b366004612523565b60116020526000908152604090205481565b34801561084957600080fd5b5061032e6115d9565b34801561085e57600080fd5b5061032e61086d3660046126a9565b611625565b34801561087e57600080fd5b5061038861088d366004612523565b61167a565b34801561089e57600080fd5b506103886108ad3660046126d7565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3480156108e457600080fd5b5061038860095481565b3480156108fa57600080fd5b5061032e6109093660046126a9565b611710565b34801561091a57600080fd5b506103887fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b34801561094e57600080fd5b5061032e61095d366004612705565b611765565b34801561096e57600080fd5b506109aa61097d36600461278c565b60156020908152600092835260408084209091529082529020805460019091015463ffffffff9091169082565b6040805163ffffffff9093168352602083019190915201610305565b3480156109d257600080fd5b5061032e6109e1366004612523565b6117fe565b6005546001600160a01b03163314610a195760405162461bcd60e51b8152600401610a10906127c3565b60405180910390fd5b61025881610a27848661280e565b610a31919061280e565b61ffff161115610a6d5760405162461bcd60e51b81526020600482015260076024820152662176616c75657360c81b6044820152606401610a10565b6005805465ffff0000ffff60b01b1916600160d01b61ffff9586160261ffff60b01b191617600160b01b938516939093029290921761ffff60c01b1916600160c01b9190931602919091179055565b606060038054610acb90612830565b80601f0160208091040260200160405190810160405280929190818152602001828054610af790612830565b8015610b445780601f10610b1957610100808354040283529160200191610b44565b820191906000526020600020905b815481529060010190602001808311610b2757829003601f168201915b5050505050905090565b6000610b5b3384846118e9565b5060015b92915050565b6000610b72848484611a0e565b6001600160a01b038416600090815260016020908152604080832033845290915290205482811015610bf75760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610a10565b610c0b8533610c06868561286a565b6118e9565b506001949350505050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610b5b918590610c0690869061287d565b610c5630610f22565b60085411610eb7576000610c693361167a565b905060008111610cb15760405162461bcd60e51b81526020600482015260136024820152726e6f7420656e6f75676820746f20636c61696d60681b6044820152606401610a10565b600060138361ffff1681548110610cca57610cca612890565b906000526020600020906002020190508261ffff16600003610d6057805460405163a9059cbb60e01b8152336004820152602481018490526001600160a01b039091169063a9059cbb906044016020604051808303816000875af1158015610d36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d5a91906128a6565b50610e68565b8261ffff16600103610e0057600a54610d849030906001600160a01b0316846118e9565b600a546001600160a01b031663791ac9478360006001850133610da94261012c611d89565b6040518663ffffffff1660e01b8152600401610dc99594939291906128c3565b600060405180830381600087803b158015610de357600080fd5b505af1158015610df7573d6000803e3d6000fd5b50505050610e68565b600d54600160b01b900460ff16610e4e57600a54610e299030906001600160a01b0316846118e9565b600a546001600160a01b0316635c11d7958360006001850133610da94261012c611d89565b8054600754610e68916001600160a01b0316903090611d95565b33600090815260116020526040902054610e829083611d89565b33600090815260116020908152604080832093909355600954601290915291902055600854610eb19083611f6d565b60085550505b50565b6005546001600160a01b03163314610ee45760405162461bcd60e51b8152600401610a10906127c3565b600d5460405147916001600160a01b03169082156108fc029083906000818181858888f19350505050158015610f1e573d6000803e3d6000fd5b5050565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b03163314610f675760405162461bcd60e51b8152600401610a10906127c3565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b03163314610fdb5760405162461bcd60e51b8152600401610a10906127c3565b600580546001600160e01b0381166001600160f01b03600160a01b80840461ffff908116600160e01b029283169390931761ffff60e01b199094169091170416600160f01b02179055565b60004382106110815760405162461bcd60e51b815260206004820152602160248201527f6765745072696f72566f7465733a206e6f74207965742064657465726d696e656044820152601960fa1b6064820152608401610a10565b6001600160a01b03831660009081526016602052604081205463ffffffff16908190036110b2576000915050610b5f565b6001600160a01b038416600090815260156020526040812084916110d7600185612939565b63ffffffff90811682526020820192909252604001600020541611611140576001600160a01b03841660009081526015602052604081209061111a600184612939565b63ffffffff1663ffffffff16815260200190815260200160002060010154915050610b5f565b6001600160a01b038416600090815260156020908152604080832083805290915290205463ffffffff1683101561117b576000915050610b5f565b600080611189600184612939565b90505b8163ffffffff168163ffffffff16111561125157600060026111ae8484612939565b6111b8919061296c565b6111c29083612939565b6001600160a01b038816600090815260156020908152604080832063ffffffff808616855290835292819020815180830190925280549093168082526001909301549181019190915291925087900361122557602001519450610b5f9350505050565b805163ffffffff1687111561123c5781935061124a565b611247600183612939565b92505b505061118c565b506001600160a01b038516600090815260156020908152604080832063ffffffff9094168352929052206001015491505092915050565b6005546001600160a01b031633146112b25760405162461bcd60e51b8152600401610a10906127c3565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b336000908152600e602052604090205460ff1615610f1e57604080518082019091526001600160a01b03828116825260208083018581526013805460018101825560009190915284517f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a090600290920291820180546001600160a01b0319169190951617845590518051611390937f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a091909301929190910190612374565b5050505050565b606060048054610acb90612830565b6005546001600160a01b031633146113d05760405162461bcd60e51b8152600401610a10906127c3565b610f1e8282611f79565b6005546001600160a01b031633146114045760405162461bcd60e51b8152600401610a10906127c3565b600d8054911515600160a81b0260ff60a81b19909216919091179055565b3360009081526001602090815260408083206001600160a01b0386168452909152812054828110156114a45760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610a10565b6114b33385610c06868561286a565b5060019392505050565b6000610b5b338484611a0e565b6005546000906115039061ffff600160a01b82048116916114fd91600160e01b909104166114f760025490565b906120c8565b906120d4565b905090565b6005546000906115039061ffff600160a01b82048116916114fd91600160f01b909104166114f760025490565b6001600160a01b03811660009081526016602052604081205463ffffffff16806115605760006115a3565b6001600160a01b038316600090815260156020526040812090611584600184612939565b63ffffffff1663ffffffff168152602001908152602001600020600101545b9392505050565b601381815481106115ba57600080fd5b60009182526020909120600290910201546001600160a01b0316905081565b6005546001600160a01b031633146116035760405162461bcd60e51b8152600401610a10906127c3565b6010805460ff19166001179055600d805460ff60a81b1916600160a81b179055565b6005546001600160a01b0316331461164f5760405162461bcd60e51b8152600401610a10906127c3565b6001600160a01b03919091166000908152600f60205260409020805460ff1916911515919091179055565b60008061168683610f22565b905060006116926120e0565b9050806000036116a6575060009392505050565b6001600160a01b0384166000908152601260205260408120546009546116cb91611f6d565b905080156117055760006116e3836114fd84876120c8565b90506008548111156116fc575050600854949350505050565b95945050505050565b506000949350505050565b6005546001600160a01b0316331461173a5760405162461bcd60e51b8152600401610a10906127c3565b6001600160a01b03919091166000908152600e60205260409020805460ff1916911515919091179055565b336000908152600e602052604090205460ff161561139057600060138660ff168154811061179557611795612890565b90600052602060002090600202019050848160010190805190602001906117bd929190612374565b5080546001600160a01b0385166001600160a01b03199091161790556007829055600d8054821515600160b01b0260ff60b01b199091161790555050505050565b6005546001600160a01b031633146118285760405162461bcd60e51b8152600401610a10906127c3565b6001600160a01b03811661188d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a10565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03831661194b5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a10565b6001600160a01b0382166119ac5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a10565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60105460ff1680611a2c57506005546001600160a01b038481169116145b80611a4457506005546001600160a01b038381169116145b80611a5c5750600a546001600160a01b038481169116145b611a945760405162461bcd60e51b8152602060048201526009602482015268217472616461626c6560b81b6044820152606401610a10565b600d54600160a81b900460ff1615156001148015611abc5750600d54600160a01b900460ff16155b8015611ad25750600a546001600160a01b031615155b8015611ae85750600b546001600160a01b031615155b8015611b025750600b546001600160a01b03848116911614155b8015611b185750600654611b1530610f22565b10155b8015611b3d57506001600160a01b0383166000908152600e602052604090205460ff16155b8015611b6257506001600160a01b0382166000908152600e602052604090205460ff16155b15611b6f57611b6f61210b565b6001600160a01b0383166000908152600f602052604090205460ff16611bdd57611b976114ca565b811115611bdd5760405162461bcd60e51b8152602060048201526014602482015273195e18d95959081b585e081d1e08185b5bdd5b9d60621b6044820152606401610a10565b600b546001600160a01b03838116911614611c6657611bfa611508565b81611c0484610f22565b611c0e919061287d565b1115611c665760405162461bcd60e51b815260206004820152602160248201527f596f752061726520657863656564696e67206d617857616c6c6574416d6f756e6044820152601d60fa1b6064820152608401610a10565b6001600160a01b0383166000908152600e602052604090205460ff1615611c9757611c92838383611d95565b505050565b600554600090611cc19061ffff600160a01b82048116916114fd918691600160b01b9004166120c8565b600554909150600090611cee9061ffff600160a01b82048116916114fd918791600160c01b9004166120c8565b600554909150600090611d1b9061ffff600160a01b82048116916114fd918891600160d01b9004166120c8565b9050611d3381611d2d84818888611f6d565b90611f6d565b9350611d40868686611d95565b611d4b863085611d95565b611d56863084611d95565b611d61863083611d95565b600854611d6e9082611d89565b600855600954611d7e9082611d89565b600955505050505050565b60006115a3828461287d565b6001600160a01b038316611df95760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610a10565b6001600160a01b038216611e5b5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610a10565b6001600160a01b03831660009081526020819052604090205481811015611ed35760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610a10565b611edd828261286a565b6001600160a01b038086166000908152602081905260408082209390935590851681529081208054849290611f1390849061287d565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611f5f91815260200190565b60405180910390a350505050565b60006115a3828461286a565b6001600160a01b038216611fd95760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610a10565b6001600160a01b0382166000908152602081905260409020548181101561204d5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610a10565b612057828261286a565b6001600160a01b0384166000908152602081905260408120919091556002805484929061208590849061286a565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611a01565b60006115a3828461298f565b60006115a382846129a6565b600b5460009081906120fa906001600160a01b0316610f22565b905060006115a382611d2d60025490565b600d805460ff60a01b1916600160a01b1790556005805465ffffffffffff60b01b19811690915561ffff600160b01b8204811691600160c01b8104821691600160d01b90910416600061215d30610f22565b90506008548111156121bf57600854612177908290611f6d565b90506121828161221a565b600d5460405147916001600160a01b03169082156108fc029083906000818181858888f193505050501580156121bc573d6000803e3d6000fd5b50505b506005805463ffffffff60b01b1916600160b01b61ffff9586160261ffff60c01b191617600160c01b938516939093029290921761ffff60d01b1916600160d01b9190931602919091179055600d805460ff60a01b19169055565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061224f5761224f612890565b6001600160a01b03928316602091820292909201810191909152600a54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156122a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122cc91906129ba565b816001815181106122df576122df612890565b6001600160a01b039283166020918202929092010152600a5461230591309116846118e9565b600a5460405163791ac94760e01b81526001600160a01b039091169063791ac9479061233e9085906000908690309042906004016129d7565b600060405180830381600087803b15801561235857600080fd5b505af115801561236c573d6000803e3d6000fd5b505050505050565b8280548282559060005260206000209081019282156123c9579160200282015b828111156123c957825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190612394565b506123d59291506123d9565b5090565b5b808211156123d557600081556001016123da565b803561ffff8116811461240057600080fd5b919050565b60008060006060848603121561241a57600080fd5b612423846123ee565b9250612431602085016123ee565b915061243f604085016123ee565b90509250925092565b600060208083528351808285015260005b8181101561247557858101830151858201604001528201612459565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610eb757600080fd5b803561240081612496565b600080604083850312156124c957600080fd5b82356124d481612496565b946020939093013593505050565b6000806000606084860312156124f757600080fd5b833561250281612496565b9250602084013561251281612496565b929592945050506040919091013590565b60006020828403121561253557600080fd5b81356115a381612496565b60006020828403121561255257600080fd5b6115a3826123ee565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261258257600080fd5b8135602067ffffffffffffffff8083111561259f5761259f61255b565b8260051b604051601f19603f830116810181811084821117156125c4576125c461255b565b6040529384528581018301938381019250878511156125e257600080fd5b83870191505b84821015612608576125f9826124ab565b835291830191908301906125e8565b979650505050505050565b6000806040838503121561262657600080fd5b823567ffffffffffffffff81111561263d57600080fd5b61264985828601612571565b925050602083013561265a81612496565b809150509250929050565b8015158114610eb757600080fd5b60006020828403121561268557600080fd5b81356115a381612665565b6000602082840312156126a257600080fd5b5035919050565b600080604083850312156126bc57600080fd5b82356126c781612496565b9150602083013561265a81612665565b600080604083850312156126ea57600080fd5b82356126f581612496565b9150602083013561265a81612496565b600080600080600060a0868803121561271d57600080fd5b853560ff8116811461272e57600080fd5b9450602086013567ffffffffffffffff81111561274a57600080fd5b61275688828901612571565b945050604086013561276781612496565b925060608601359150608086013561277e81612665565b809150509295509295909350565b6000806040838503121561279f57600080fd5b82356127aa81612496565b9150602083013563ffffffff8116811461265a57600080fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b61ffff818116838216019080821115612829576128296127f8565b5092915050565b600181811c9082168061284457607f821691505b60208210810361286457634e487b7160e01b600052602260045260246000fd5b50919050565b81810381811115610b5f57610b5f6127f8565b80820180821115610b5f57610b5f6127f8565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156128b857600080fd5b81516115a381612665565b600060a082018783526020878185015260a0604085015281875480845260c0860191508860005282600020935060005b818110156129185784546001600160a01b0316835260019485019492840192016128f3565b50506001600160a01b03969096166060850152505050608001529392505050565b63ffffffff828116828216039080821115612829576128296127f8565b634e487b7160e01b600052601260045260246000fd5b600063ffffffff8084168061298357612983612956565b92169190910492915050565b8082028115828204841417610b5f57610b5f6127f8565b6000826129b5576129b5612956565b500490565b6000602082840312156129cc57600080fd5b81516115a381612496565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156129185784516001600160a01b031683529383019391830191600101612a0256fea2646970667358221220a8224fa5f31a648e7f75e1297af563a4081bea6a4c8287fee367ab75c4eb1f3d64736f6c63430008110033

Deployed Bytecode

0x6080604052600436106102cc5760003560e01c8063899c3fb311610175578063c6610657116100dc578063dd62ed3e11610095578063e7a324dc1161006f578063e7a324dc1461090e578063ee2b523814610942578063f1127ed814610962578063f2fde38b146109c657600080fd5b8063dd62ed3e14610892578063dea06210146108d8578063df8408fe146108ee57600080fd5b8063c6610657146107d0578063c816841b146107f0578063c884ef8314610810578063c9567bf91461083d578063d4c989d314610852578063db90127e1461087257600080fd5b80639f9a4e7f1161012e5780639f9a4e7f14610726578063a457c2d714610746578063a9059cbb14610766578063a9e7572314610786578063aa4bde281461079b578063b4b5ea57146107b057600080fd5b8063899c3fb31461067d5780638da5cb5b1461069d578063902d55a5146106bb57806395d89b41146106db578063997664d7146106f05780639dc29fac1461070657600080fd5b80634b418bc51161023457806370a08231116101ed578063751039fc116101c7578063751039fc146105fb578063782d6fe1146106105780637ecebe0014610630578063809d458d1461065d57600080fd5b806370a082311461058e578063715018a6146105ae578063735de9f7146105c357600080fd5b80634b418bc5146104725780635158ea1b1461049f5780635342acb4146104bf57806362e546f9146104f8578063658c27a91461050d5780636fcfff451461054657600080fd5b806320606b701161028657806320606b70146103ab57806323b872dd146103df57806328f4dbb6146103ff5780632af413e014610415578063313ce56714610436578063395093511461045257600080fd5b8062dc1297146102d8578063068b976f1461030e57806306fdde0314610330578063095ea7b31461035257806313f43a571461037257806318160ddd1461039657600080fd5b366102d357005b600080fd5b3480156102e457600080fd5b50600d546102f990600160a81b900460ff1681565b60405190151581526020015b60405180910390f35b34801561031a57600080fd5b5061032e610329366004612405565b6109e6565b005b34801561033c57600080fd5b50610345610abc565b6040516103059190612448565b34801561035e57600080fd5b506102f961036d3660046124b6565b610b4e565b34801561037e57600080fd5b5061038860065481565b604051908152602001610305565b3480156103a257600080fd5b50600254610388565b3480156103b757600080fd5b506103887f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b3480156103eb57600080fd5b506102f96103fa3660046124e2565b610b65565b34801561040b57600080fd5b5061038860075481565b34801561042157600080fd5b50600d546102f990600160b01b900460ff1681565b34801561044257600080fd5b5060405160128152602001610305565b34801561045e57600080fd5b506102f961046d3660046124b6565b610c16565b34801561047e57600080fd5b5061038861048d366004612523565b60126020526000908152604090205481565b3480156104ab57600080fd5b5061032e6104ba366004612540565b610c4d565b3480156104cb57600080fd5b506102f96104da366004612523565b6001600160a01b03166000908152600e602052604090205460ff1690565b34801561050457600080fd5b5061032e610eba565b34801561051957600080fd5b506102f9610528366004612523565b6001600160a01b03166000908152600f602052604090205460ff1690565b34801561055257600080fd5b50610579610561366004612523565b60166020526000908152604090205463ffffffff1681565b60405163ffffffff9091168152602001610305565b34801561059a57600080fd5b506103886105a9366004612523565b610f22565b3480156105ba57600080fd5b5061032e610f3d565b3480156105cf57600080fd5b50600a546105e3906001600160a01b031681565b6040516001600160a01b039091168152602001610305565b34801561060757600080fd5b5061032e610fb1565b34801561061c57600080fd5b5061038861062b3660046124b6565b611026565b34801561063c57600080fd5b5061038861064b366004612523565b60176020526000908152604090205481565b34801561066957600080fd5b5061032e610678366004612523565b611288565b34801561068957600080fd5b5061032e610698366004612613565b6112d4565b3480156106a957600080fd5b506005546001600160a01b03166105e3565b3480156106c757600080fd5b506103886b0cecb8f27f4200f3a000000081565b3480156106e757600080fd5b50610345611397565b3480156106fc57600080fd5b5061038860085481565b34801561071257600080fd5b5061032e6107213660046124b6565b6113a6565b34801561073257600080fd5b5061032e610741366004612673565b6113da565b34801561075257600080fd5b506102f96107613660046124b6565b611422565b34801561077257600080fd5b506102f96107813660046124b6565b6114bd565b34801561079257600080fd5b506103886114ca565b3480156107a757600080fd5b50610388611508565b3480156107bc57600080fd5b506103886107cb366004612523565b611535565b3480156107dc57600080fd5b506105e36107eb366004612690565b6115aa565b3480156107fc57600080fd5b50600b546105e3906001600160a01b031681565b34801561081c57600080fd5b5061038861082b366004612523565b60116020526000908152604090205481565b34801561084957600080fd5b5061032e6115d9565b34801561085e57600080fd5b5061032e61086d3660046126a9565b611625565b34801561087e57600080fd5b5061038861088d366004612523565b61167a565b34801561089e57600080fd5b506103886108ad3660046126d7565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3480156108e457600080fd5b5061038860095481565b3480156108fa57600080fd5b5061032e6109093660046126a9565b611710565b34801561091a57600080fd5b506103887fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b34801561094e57600080fd5b5061032e61095d366004612705565b611765565b34801561096e57600080fd5b506109aa61097d36600461278c565b60156020908152600092835260408084209091529082529020805460019091015463ffffffff9091169082565b6040805163ffffffff9093168352602083019190915201610305565b3480156109d257600080fd5b5061032e6109e1366004612523565b6117fe565b6005546001600160a01b03163314610a195760405162461bcd60e51b8152600401610a10906127c3565b60405180910390fd5b61025881610a27848661280e565b610a31919061280e565b61ffff161115610a6d5760405162461bcd60e51b81526020600482015260076024820152662176616c75657360c81b6044820152606401610a10565b6005805465ffff0000ffff60b01b1916600160d01b61ffff9586160261ffff60b01b191617600160b01b938516939093029290921761ffff60c01b1916600160c01b9190931602919091179055565b606060038054610acb90612830565b80601f0160208091040260200160405190810160405280929190818152602001828054610af790612830565b8015610b445780601f10610b1957610100808354040283529160200191610b44565b820191906000526020600020905b815481529060010190602001808311610b2757829003601f168201915b5050505050905090565b6000610b5b3384846118e9565b5060015b92915050565b6000610b72848484611a0e565b6001600160a01b038416600090815260016020908152604080832033845290915290205482811015610bf75760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610a10565b610c0b8533610c06868561286a565b6118e9565b506001949350505050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610b5b918590610c0690869061287d565b610c5630610f22565b60085411610eb7576000610c693361167a565b905060008111610cb15760405162461bcd60e51b81526020600482015260136024820152726e6f7420656e6f75676820746f20636c61696d60681b6044820152606401610a10565b600060138361ffff1681548110610cca57610cca612890565b906000526020600020906002020190508261ffff16600003610d6057805460405163a9059cbb60e01b8152336004820152602481018490526001600160a01b039091169063a9059cbb906044016020604051808303816000875af1158015610d36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d5a91906128a6565b50610e68565b8261ffff16600103610e0057600a54610d849030906001600160a01b0316846118e9565b600a546001600160a01b031663791ac9478360006001850133610da94261012c611d89565b6040518663ffffffff1660e01b8152600401610dc99594939291906128c3565b600060405180830381600087803b158015610de357600080fd5b505af1158015610df7573d6000803e3d6000fd5b50505050610e68565b600d54600160b01b900460ff16610e4e57600a54610e299030906001600160a01b0316846118e9565b600a546001600160a01b0316635c11d7958360006001850133610da94261012c611d89565b8054600754610e68916001600160a01b0316903090611d95565b33600090815260116020526040902054610e829083611d89565b33600090815260116020908152604080832093909355600954601290915291902055600854610eb19083611f6d565b60085550505b50565b6005546001600160a01b03163314610ee45760405162461bcd60e51b8152600401610a10906127c3565b600d5460405147916001600160a01b03169082156108fc029083906000818181858888f19350505050158015610f1e573d6000803e3d6000fd5b5050565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b03163314610f675760405162461bcd60e51b8152600401610a10906127c3565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b03163314610fdb5760405162461bcd60e51b8152600401610a10906127c3565b600580546001600160e01b0381166001600160f01b03600160a01b80840461ffff908116600160e01b029283169390931761ffff60e01b199094169091170416600160f01b02179055565b60004382106110815760405162461bcd60e51b815260206004820152602160248201527f6765745072696f72566f7465733a206e6f74207965742064657465726d696e656044820152601960fa1b6064820152608401610a10565b6001600160a01b03831660009081526016602052604081205463ffffffff16908190036110b2576000915050610b5f565b6001600160a01b038416600090815260156020526040812084916110d7600185612939565b63ffffffff90811682526020820192909252604001600020541611611140576001600160a01b03841660009081526015602052604081209061111a600184612939565b63ffffffff1663ffffffff16815260200190815260200160002060010154915050610b5f565b6001600160a01b038416600090815260156020908152604080832083805290915290205463ffffffff1683101561117b576000915050610b5f565b600080611189600184612939565b90505b8163ffffffff168163ffffffff16111561125157600060026111ae8484612939565b6111b8919061296c565b6111c29083612939565b6001600160a01b038816600090815260156020908152604080832063ffffffff808616855290835292819020815180830190925280549093168082526001909301549181019190915291925087900361122557602001519450610b5f9350505050565b805163ffffffff1687111561123c5781935061124a565b611247600183612939565b92505b505061118c565b506001600160a01b038516600090815260156020908152604080832063ffffffff9094168352929052206001015491505092915050565b6005546001600160a01b031633146112b25760405162461bcd60e51b8152600401610a10906127c3565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b336000908152600e602052604090205460ff1615610f1e57604080518082019091526001600160a01b03828116825260208083018581526013805460018101825560009190915284517f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a090600290920291820180546001600160a01b0319169190951617845590518051611390937f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a091909301929190910190612374565b5050505050565b606060048054610acb90612830565b6005546001600160a01b031633146113d05760405162461bcd60e51b8152600401610a10906127c3565b610f1e8282611f79565b6005546001600160a01b031633146114045760405162461bcd60e51b8152600401610a10906127c3565b600d8054911515600160a81b0260ff60a81b19909216919091179055565b3360009081526001602090815260408083206001600160a01b0386168452909152812054828110156114a45760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610a10565b6114b33385610c06868561286a565b5060019392505050565b6000610b5b338484611a0e565b6005546000906115039061ffff600160a01b82048116916114fd91600160e01b909104166114f760025490565b906120c8565b906120d4565b905090565b6005546000906115039061ffff600160a01b82048116916114fd91600160f01b909104166114f760025490565b6001600160a01b03811660009081526016602052604081205463ffffffff16806115605760006115a3565b6001600160a01b038316600090815260156020526040812090611584600184612939565b63ffffffff1663ffffffff168152602001908152602001600020600101545b9392505050565b601381815481106115ba57600080fd5b60009182526020909120600290910201546001600160a01b0316905081565b6005546001600160a01b031633146116035760405162461bcd60e51b8152600401610a10906127c3565b6010805460ff19166001179055600d805460ff60a81b1916600160a81b179055565b6005546001600160a01b0316331461164f5760405162461bcd60e51b8152600401610a10906127c3565b6001600160a01b03919091166000908152600f60205260409020805460ff1916911515919091179055565b60008061168683610f22565b905060006116926120e0565b9050806000036116a6575060009392505050565b6001600160a01b0384166000908152601260205260408120546009546116cb91611f6d565b905080156117055760006116e3836114fd84876120c8565b90506008548111156116fc575050600854949350505050565b95945050505050565b506000949350505050565b6005546001600160a01b0316331461173a5760405162461bcd60e51b8152600401610a10906127c3565b6001600160a01b03919091166000908152600e60205260409020805460ff1916911515919091179055565b336000908152600e602052604090205460ff161561139057600060138660ff168154811061179557611795612890565b90600052602060002090600202019050848160010190805190602001906117bd929190612374565b5080546001600160a01b0385166001600160a01b03199091161790556007829055600d8054821515600160b01b0260ff60b01b199091161790555050505050565b6005546001600160a01b031633146118285760405162461bcd60e51b8152600401610a10906127c3565b6001600160a01b03811661188d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a10565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03831661194b5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a10565b6001600160a01b0382166119ac5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a10565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60105460ff1680611a2c57506005546001600160a01b038481169116145b80611a4457506005546001600160a01b038381169116145b80611a5c5750600a546001600160a01b038481169116145b611a945760405162461bcd60e51b8152602060048201526009602482015268217472616461626c6560b81b6044820152606401610a10565b600d54600160a81b900460ff1615156001148015611abc5750600d54600160a01b900460ff16155b8015611ad25750600a546001600160a01b031615155b8015611ae85750600b546001600160a01b031615155b8015611b025750600b546001600160a01b03848116911614155b8015611b185750600654611b1530610f22565b10155b8015611b3d57506001600160a01b0383166000908152600e602052604090205460ff16155b8015611b6257506001600160a01b0382166000908152600e602052604090205460ff16155b15611b6f57611b6f61210b565b6001600160a01b0383166000908152600f602052604090205460ff16611bdd57611b976114ca565b811115611bdd5760405162461bcd60e51b8152602060048201526014602482015273195e18d95959081b585e081d1e08185b5bdd5b9d60621b6044820152606401610a10565b600b546001600160a01b03838116911614611c6657611bfa611508565b81611c0484610f22565b611c0e919061287d565b1115611c665760405162461bcd60e51b815260206004820152602160248201527f596f752061726520657863656564696e67206d617857616c6c6574416d6f756e6044820152601d60fa1b6064820152608401610a10565b6001600160a01b0383166000908152600e602052604090205460ff1615611c9757611c92838383611d95565b505050565b600554600090611cc19061ffff600160a01b82048116916114fd918691600160b01b9004166120c8565b600554909150600090611cee9061ffff600160a01b82048116916114fd918791600160c01b9004166120c8565b600554909150600090611d1b9061ffff600160a01b82048116916114fd918891600160d01b9004166120c8565b9050611d3381611d2d84818888611f6d565b90611f6d565b9350611d40868686611d95565b611d4b863085611d95565b611d56863084611d95565b611d61863083611d95565b600854611d6e9082611d89565b600855600954611d7e9082611d89565b600955505050505050565b60006115a3828461287d565b6001600160a01b038316611df95760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610a10565b6001600160a01b038216611e5b5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610a10565b6001600160a01b03831660009081526020819052604090205481811015611ed35760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610a10565b611edd828261286a565b6001600160a01b038086166000908152602081905260408082209390935590851681529081208054849290611f1390849061287d565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611f5f91815260200190565b60405180910390a350505050565b60006115a3828461286a565b6001600160a01b038216611fd95760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610a10565b6001600160a01b0382166000908152602081905260409020548181101561204d5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610a10565b612057828261286a565b6001600160a01b0384166000908152602081905260408120919091556002805484929061208590849061286a565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611a01565b60006115a3828461298f565b60006115a382846129a6565b600b5460009081906120fa906001600160a01b0316610f22565b905060006115a382611d2d60025490565b600d805460ff60a01b1916600160a01b1790556005805465ffffffffffff60b01b19811690915561ffff600160b01b8204811691600160c01b8104821691600160d01b90910416600061215d30610f22565b90506008548111156121bf57600854612177908290611f6d565b90506121828161221a565b600d5460405147916001600160a01b03169082156108fc029083906000818181858888f193505050501580156121bc573d6000803e3d6000fd5b50505b506005805463ffffffff60b01b1916600160b01b61ffff9586160261ffff60c01b191617600160c01b938516939093029290921761ffff60d01b1916600160d01b9190931602919091179055600d805460ff60a01b19169055565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061224f5761224f612890565b6001600160a01b03928316602091820292909201810191909152600a54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156122a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122cc91906129ba565b816001815181106122df576122df612890565b6001600160a01b039283166020918202929092010152600a5461230591309116846118e9565b600a5460405163791ac94760e01b81526001600160a01b039091169063791ac9479061233e9085906000908690309042906004016129d7565b600060405180830381600087803b15801561235857600080fd5b505af115801561236c573d6000803e3d6000fd5b505050505050565b8280548282559060005260206000209081019282156123c9579160200282015b828111156123c957825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190612394565b506123d59291506123d9565b5090565b5b808211156123d557600081556001016123da565b803561ffff8116811461240057600080fd5b919050565b60008060006060848603121561241a57600080fd5b612423846123ee565b9250612431602085016123ee565b915061243f604085016123ee565b90509250925092565b600060208083528351808285015260005b8181101561247557858101830151858201604001528201612459565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610eb757600080fd5b803561240081612496565b600080604083850312156124c957600080fd5b82356124d481612496565b946020939093013593505050565b6000806000606084860312156124f757600080fd5b833561250281612496565b9250602084013561251281612496565b929592945050506040919091013590565b60006020828403121561253557600080fd5b81356115a381612496565b60006020828403121561255257600080fd5b6115a3826123ee565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261258257600080fd5b8135602067ffffffffffffffff8083111561259f5761259f61255b565b8260051b604051601f19603f830116810181811084821117156125c4576125c461255b565b6040529384528581018301938381019250878511156125e257600080fd5b83870191505b84821015612608576125f9826124ab565b835291830191908301906125e8565b979650505050505050565b6000806040838503121561262657600080fd5b823567ffffffffffffffff81111561263d57600080fd5b61264985828601612571565b925050602083013561265a81612496565b809150509250929050565b8015158114610eb757600080fd5b60006020828403121561268557600080fd5b81356115a381612665565b6000602082840312156126a257600080fd5b5035919050565b600080604083850312156126bc57600080fd5b82356126c781612496565b9150602083013561265a81612665565b600080604083850312156126ea57600080fd5b82356126f581612496565b9150602083013561265a81612496565b600080600080600060a0868803121561271d57600080fd5b853560ff8116811461272e57600080fd5b9450602086013567ffffffffffffffff81111561274a57600080fd5b61275688828901612571565b945050604086013561276781612496565b925060608601359150608086013561277e81612665565b809150509295509295909350565b6000806040838503121561279f57600080fd5b82356127aa81612496565b9150602083013563ffffffff8116811461265a57600080fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b61ffff818116838216019080821115612829576128296127f8565b5092915050565b600181811c9082168061284457607f821691505b60208210810361286457634e487b7160e01b600052602260045260246000fd5b50919050565b81810381811115610b5f57610b5f6127f8565b80820180821115610b5f57610b5f6127f8565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156128b857600080fd5b81516115a381612665565b600060a082018783526020878185015260a0604085015281875480845260c0860191508860005282600020935060005b818110156129185784546001600160a01b0316835260019485019492840192016128f3565b50506001600160a01b03969096166060850152505050608001529392505050565b63ffffffff828116828216039080821115612829576128296127f8565b634e487b7160e01b600052601260045260246000fd5b600063ffffffff8084168061298357612983612956565b92169190910492915050565b8082028115828204841417610b5f57610b5f6127f8565b6000826129b5576129b5612956565b500490565b6000602082840312156129cc57600080fd5b81516115a381612496565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156129185784516001600160a01b031683529383019391830191600101612a0256fea2646970667358221220a8224fa5f31a648e7f75e1297af563a4081bea6a4c8287fee367ab75c4eb1f3d64736f6c63430008110033

Deployed Bytecode Sourcemap

44718:15274:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45804:42;;;;;;;;;;-1:-1:-1;45804:42:0;;;;-1:-1:-1;;;45804:42:0;;;;;;;;;179:14:1;;172:22;154:41;;142:2;127:18;45804:42:0;;;;;;;;51855:422;;;;;;;;;;-1:-1:-1;51855:422:0;;;;;:::i;:::-;;:::i;:::-;;15447:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;17755:210::-;;;;;;;;;;-1:-1:-1;17755:210:0;;;;;:::i;:::-;;:::i;45212:58::-;;;;;;;;;;;;;;;;;;;1997:25:1;;;1985:2;1970:18;45212:58:0;1851:177:1;16567:108:0;;;;;;;;;;-1:-1:-1;16655:12:0;;16567:108;;57444:155;;;;;;;;;;;;57495:104;57444:155;;18447:493;;;;;;;;;;-1:-1:-1;18447:493:0;;;;;:::i;:::-;;:::i;45277:57::-;;;;;;;;;;;;;;;;45853:34;;;;;;;;;;-1:-1:-1;45853:34:0;;;;-1:-1:-1;;;45853:34:0;;;;;;16409:93;;;;;;;;;;-1:-1:-1;16409:93:0;;16492:2;2818:36:1;;2806:2;2791:18;16409:93:0;2676:184:1;19349:297:0;;;;;;;;;;-1:-1:-1;19349:297:0;;;;;:::i;:::-;;:::i;46204:53::-;;;;;;;;;;-1:-1:-1;46204:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;53205:2005;;;;;;;;;;-1:-1:-1;53205:2005:0;;;;;:::i;:::-;;:::i;52685:122::-;;;;;;;;;;-1:-1:-1;52685:122:0;;;;;:::i;:::-;-1:-1:-1;;;;;52774:25:0;52750:4;52774:25;;;:18;:25;;;;;;;;;52685:122;50263:147;;;;;;;;;;;;;:::i;52941:126::-;;;;;;;;;;-1:-1:-1;52941:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;53032:27:0;53008:4;53032:27;;;:20;:27;;;;;;;;;52941:126;57323:48;;;;;;;;;;-1:-1:-1;57323:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3480:10:1;3468:23;;;3450:42;;3438:2;3423:18;57323:48:0;3306:192:1;16738:177:0;;;;;;;;;;-1:-1:-1;16738:177:0;;;;;:::i;:::-;;:::i;1878:148::-;;;;;;;;;;;;;:::i;45419:39::-;;;;;;;;;;-1:-1:-1;45419:39:0;;;;-1:-1:-1;;;;;45419:39:0;;;;;;-1:-1:-1;;;;;3694:32:1;;;3676:51;;3664:2;3649:18;45419:39:0;3503:230:1;52285:141:0;;;;;;;;;;;;;:::i;58423:1287::-;;;;;;;;;;-1:-1:-1;58423:1287:0;;;;;:::i;:::-;;:::i;57900:41::-;;;;;;;;;;-1:-1:-1;57900:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;52434:115;;;;;;;;;;-1:-1:-1;52434:115:0;;;;;:::i;:::-;;:::i;56148:257::-;;;;;;;;;;-1:-1:-1;56148:257:0;;;;;:::i;:::-;;:::i;1227:87::-;;;;;;;;;;-1:-1:-1;1300:6:0;;-1:-1:-1;;;;;1300:6:0;1227:87;;44855:56;;;;;;;;;;;;44894:17;44855:56;;15666:104;;;;;;;;;;;;;:::i;45341:29::-;;;;;;;;;;;;;;;;47824:103;;;;;;;;;;-1:-1:-1;47824:103:0;;;;;:::i;:::-;;:::i;50134:121::-;;;;;;;;;;-1:-1:-1;50134:121:0;;;;;:::i;:::-;;:::i;20149:446::-;;;;;;;;;;-1:-1:-1;20149:446:0;;;;;:::i;:::-;;:::i;17128:216::-;;;;;;;;;;-1:-1:-1;17128:216:0;;;;;:::i;:::-;;:::i;51559:142::-;;;;;;;;;;;;;:::i;51709:138::-;;;;;;;;;;;;;:::i;58179:236::-;;;;;;;;;;-1:-1:-1;58179:236:0;;;;;:::i;:::-;;:::i;46266:27::-;;;;;;;;;;-1:-1:-1;46266:27:0;;;;;:::i;:::-;;:::i;45490:26::-;;;;;;;;;;-1:-1:-1;45490:26:0;;;;-1:-1:-1;;;;;45490:26:0;;;46155:42;;;;;;;;;;-1:-1:-1;46155:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;52557:120;;;;;;;;;;;;;:::i;53075:122::-;;;;;;;;;;-1:-1:-1;53075:122:0;;;;;:::i;:::-;;:::i;55218:693::-;;;;;;;;;;-1:-1:-1;55218:693:0;;;;;:::i;:::-;;:::i;17407:201::-;;;;;;;;;;-1:-1:-1;17407:201:0;;;;;:::i;:::-;-1:-1:-1;;;;;17573:18:0;;;17541:7;17573:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;17407:201;45377:33;;;;;;;;;;;;;;;;52815:118;;;;;;;;;;-1:-1:-1;52815:118:0;;;;;:::i;:::-;;:::i;57693:126::-;;;;;;;;;;;;57748:71;57693:126;;56413:473;;;;;;;;;;-1:-1:-1;56413:473:0;;;;;:::i;:::-;;:::i;57186:68::-;;;;;;;;;;-1:-1:-1;57186:68:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8295:10:1;8283:23;;;8265:42;;8338:2;8323:18;;8316:34;;;;8238:18;57186:68:0;8093:263:1;2181:281:0;;;;;;;;;;-1:-1:-1;2181:281:0;;;;;:::i;:::-;;:::i;51855:422::-;1300:6;;-1:-1:-1;;;;;1300:6:0;346:10;1447:23;1439:68;;;;-1:-1:-1;;;1439:68:0;;;;;;;:::i;:::-;;;;;;;;;52091:3:::1;52070:17:::0;52035:32:::1;52056:11:::0;52035:18;:32:::1;:::i;:::-;:52;;;;:::i;:::-;:59;;;;52013:116;;;::::0;-1:-1:-1;;;52013:116:0;;9229:2:1;52013:116:0::1;::::0;::::1;9211:21:1::0;9268:1;9248:18;;;9241:29;-1:-1:-1;;;9286:18:1;;;9279:37;9333:18;;52013:116:0::1;9027:330:1::0;52013:116:0::1;52140:26;:47:::0;;-1:-1:-1;;;;52198:24:0;-1:-1:-1;;;52140:47:0::1;::::0;;::::1;;-1:-1:-1::0;;;;52198:24:0;;-1:-1:-1;;;52198:24:0;;::::1;::::0;;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;52233:36:0::1;-1:-1:-1::0;;;52233:36:0;;;::::1;;::::0;;;::::1;::::0;;51855:422::o;15447:100::-;15501:13;15534:5;15527:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15447:100;:::o;17755:210::-;17874:4;17896:39;346:10;17919:7;17928:6;17896:8;:39::i;:::-;-1:-1:-1;17953:4:0;17755:210;;;;;:::o;18447:493::-;18587:4;18604:36;18614:6;18622:9;18633:6;18604:9;:36::i;:::-;-1:-1:-1;;;;;18680:19:0;;18653:24;18680:19;;;:11;:19;;;;;;;;346:10;18680:33;;;;;;;;18746:26;;;;18724:116;;;;-1:-1:-1;;;18724:116:0;;9949:2:1;18724:116:0;;;9931:21:1;9988:2;9968:18;;;9961:30;10027:34;10007:18;;;10000:62;-1:-1:-1;;;10078:18:1;;;10071:38;10126:19;;18724:116:0;9747:404:1;18724:116:0;18851:57;18860:6;346:10;18882:25;18901:6;18882:16;:25;:::i;:::-;18851:8;:57::i;:::-;-1:-1:-1;18928:4:0;;18447:493;-1:-1:-1;;;;18447:493:0:o;19349:297::-;346:10;19464:4;19558:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;19558:34:0;;;;;;;;;;19464:4;;19486:130;;19536:7;;19558:47;;19595:10;;19558:47;:::i;53205:2005::-;53287:24;53305:4;53287:9;:24::i;:::-;53269:14;;:42;53265:1938;;53328:20;53351:33;53373:10;53351:21;:33::i;:::-;53328:56;;53422:1;53407:12;:16;53399:48;;;;-1:-1:-1;;;53399:48:0;;10621:2:1;53399:48:0;;;10603:21:1;10660:2;10640:18;;;10633:30;-1:-1:-1;;;10679:18:1;;;10672:49;10738:18;;53399:48:0;10419:343:1;53399:48:0;53462:25;53490:5;53496:4;53490:11;;;;;;;;;;:::i;:::-;;;;;;;;;;;53462:39;;53520:4;:9;;53528:1;53520:9;53516:1472;;53557:16;;53550:59;;-1:-1:-1;;;53550:59:0;;53584:10;53550:59;;;11073:51:1;11140:18;;;11133:34;;;-1:-1:-1;;;;;53557:16:0;;;;53550:33;;11046:18:1;;53550:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;53516:1472;;;53635:4;:9;;53643:1;53635:9;53631:1357;;53736:13;;53704:61;;53721:4;;-1:-1:-1;;;;;53736:13:0;53752:12;53704:8;:61::i;:::-;53784:13;;-1:-1:-1;;;;;53784:13:0;:86;53897:12;53784:13;;53964:15;;54006:10;54043:24;:15;54063:3;54043:19;:24::i;:::-;53784:306;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53631:1357;;;54183:14;;-1:-1:-1;;;54183:14:0;;;;54178:795;;54305:13;;54222:159;;54265:4;;-1:-1:-1;;;;;54305:13:0;54346:12;54222:8;:159::i;:::-;54404:13;;-1:-1:-1;;;;;54404:13:0;:93;54528:12;54404:13;;54603:15;;54649:10;54690:24;:15;54710:3;54690:19;:24::i;54178:795::-;54832:16;;54915:15;;54790:163;;-1:-1:-1;;;;;54832:16:0;;54883:4;;54790:15;:163::i;:::-;55032:10;55024:19;;;;:7;:19;;;;;;:37;;55048:12;55024:23;:37::i;:::-;55010:10;55002:19;;;;:7;:19;;;;;;;;:59;;;;55109:18;;55076;:30;;;;;;:51;55159:14;;:32;;55178:12;55159:18;:32::i;:::-;55142:14;:49;-1:-1:-1;;53265:1938:0;53205:2005;:::o;50263:147::-;1300:6;;-1:-1:-1;;;;;1300:6:0;346:10;1447:23;1439:68;;;;-1:-1:-1;;;1439:68:0;;;;;;;:::i;:::-;50373:14:::1;::::0;50365:37:::1;::::0;50333:21:::1;::::0;-1:-1:-1;;;;;50373:14:0::1;::::0;50365:37;::::1;;;::::0;50333:21;;50319:11:::1;50365:37:::0;50319:11;50365:37;50333:21;50373:14;50365:37;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;50308:102;50263:147::o:0;16738:177::-;-1:-1:-1;;;;;16889:18:0;16857:7;16889:18;;;;;;;;;;;;16738:177::o;1878:148::-;1300:6;;-1:-1:-1;;;;;1300:6:0;346:10;1447:23;1439:68;;;;-1:-1:-1;;;1439:68:0;;;;;;;:::i;:::-;1969:6:::1;::::0;1948:40:::1;::::0;1985:1:::1;::::0;-1:-1:-1;;;;;1969:6:0::1;::::0;1948:40:::1;::::0;1985:1;;1948:40:::1;1999:6;:19:::0;;-1:-1:-1;;;;;;1999:19:0::1;::::0;;1878:148::o;52285:141::-;1300:6;;-1:-1:-1;;;;;1300:6:0;346:10;1447:23;1439:68;;;;-1:-1:-1;;;1439:68:0;;;;;;;:::i;:::-;52363:11:::1;::::0;;-1:-1:-1;;;;;52385:33:0;;-1:-1:-1;;;;;;;;52363:11:0;;::::1;;::::0;;::::1;-1:-1:-1::0;;;52339:35:0::1;52385:33:::0;;;;;;;-1:-1:-1;;;;52339:35:0;;::::1;::::0;;::::1;52407:11;;-1:-1:-1::0;;;52385:33:0::1;;::::0;;52285:141::o;58423:1287::-;58534:7;58595:12;58581:11;:26;58559:109;;;;-1:-1:-1;;;58559:109:0;;12638:2:1;58559:109:0;;;12620:21:1;12677:2;12657:18;;;12650:30;12716:34;12696:18;;;12689:62;-1:-1:-1;;;12767:18:1;;;12760:31;12808:19;;58559:109:0;12436:397:1;58559:109:0;-1:-1:-1;;;;;58703:23:0;;58681:19;58703:23;;;:14;:23;;;;;;;;;58741:17;;;58737:58;;58782:1;58775:8;;;;;58737:58;-1:-1:-1;;;;;58855:20:0;;;;;;:11;:20;;;;;58907:11;;58876:16;58891:1;58876:12;:16;:::i;:::-;58855:38;;;;;;;;;;;;;;;-1:-1:-1;58855:38:0;:48;;:63;58851:147;;-1:-1:-1;;;;;58942:20:0;;;;;;:11;:20;;;;;;58963:16;58978:1;58963:12;:16;:::i;:::-;58942:38;;;;;;;;;;;;;;;:44;;;58935:51;;;;;58851:147;-1:-1:-1;;;;;59059:20:0;;;;;;:11;:20;;;;;;;;:23;;;;;;;;:33;:23;:33;:47;-1:-1:-1;59055:88:0;;;59130:1;59123:8;;;;;59055:88;59155:12;;59197:16;59212:1;59197:12;:16;:::i;:::-;59182:31;;59224:428;59239:5;59231:13;;:5;:13;;;59224:428;;;59261:13;59303:1;59286:13;59294:5;59286;:13;:::i;:::-;59285:19;;;;:::i;:::-;59277:27;;:5;:27;:::i;:::-;-1:-1:-1;;;;;59369:20:0;;59346;59369;;;:11;:20;;;;;;;;:28;;;;;;;;;;;;;59346:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;59261:43;;-1:-1:-1;59416:27:0;;;59412:229;;59471:8;;;;-1:-1:-1;59464:15:0;;-1:-1:-1;;;;59464:15:0;59412:229;59505:12;;:26;;;-1:-1:-1;59501:140:0;;;59560:6;59552:14;;59501:140;;;59615:10;59624:1;59615:6;:10;:::i;:::-;59607:18;;59501:140;59246:406;;59224:428;;;-1:-1:-1;;;;;;59669:20:0;;;;;;:11;:20;;;;;;;;:27;;;;;;;;;;:33;;;;-1:-1:-1;;58423:1287:0;;;;:::o;52434:115::-;1300:6;;-1:-1:-1;;;;;1300:6:0;346:10;1447:23;1439:68;;;;-1:-1:-1;;;1439:68:0;;;;;;;:::i;:::-;52514:14:::1;:27:::0;;-1:-1:-1;;;;;;52514:27:0::1;-1:-1:-1::0;;;;;52514:27:0;;;::::1;::::0;;;::::1;::::0;;52434:115::o;56148:257::-;56257:10;56238:30;;;;:18;:30;;;;;;;;56234:164;;;56314:57;;;;;;;;;-1:-1:-1;;;;;56314:57:0;;;;;;;;;;;;56285:5;:101;;;;;;;-1:-1:-1;56285:101:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;56285:101:0;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;56148:257;;:::o;15666:104::-;15722:13;15755:7;15748:14;;;;;:::i;47824:103::-;1300:6;;-1:-1:-1;;;;;1300:6:0;346:10;1447:23;1439:68;;;;-1:-1:-1;;;1439:68:0;;;;;;;:::i;:::-;47898:21:::1;47904:5;47911:7;47898:5;:21::i;50134:121::-:0;1300:6;;-1:-1:-1;;;;;1300:6:0;346:10;1447:23;1439:68;;;;-1:-1:-1;;;1439:68:0;;;;;;;:::i;:::-;50214:22:::1;:33:::0;;;::::1;;-1:-1:-1::0;;;50214:33:0::1;-1:-1:-1::0;;;;50214:33:0;;::::1;::::0;;;::::1;::::0;;50134:121::o;20149:446::-;346:10;20269:4;20318:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;20318:34:0;;;;;;;;;;20385:35;;;;20363:122;;;;-1:-1:-1;;;20363:122:0;;13548:2:1;20363:122:0;;;13530:21:1;13587:2;13567:18;;;13560:30;13626:34;13606:18;;;13599:62;-1:-1:-1;;;13677:18:1;;;13670:35;13722:19;;20363:122:0;13346:401:1;20363:122:0;20496:67;346:10;20519:7;20528:34;20547:15;20528:16;:34;:::i;20496:67::-;-1:-1:-1;20583:4:0;;20149:446;-1:-1:-1;;;20149:446:0:o;17128:216::-;17250:4;17272:42;346:10;17296:9;17307:6;17272:9;:42::i;51559:142::-;51681:11;;51609:7;;51636:57;;51681:11;-1:-1:-1;;;51681:11:0;;;;;51636:40;;-1:-1:-1;;;51654:21:0;;;;51636:13;16655:12;;;16567:108;51636:13;:17;;:40::i;:::-;:44;;:57::i;:::-;51629:64;;51559:142;:::o;51709:138::-;51827:11;;51757:7;;51784:55;;51827:11;-1:-1:-1;;;51827:11:0;;;;;51784:38;;-1:-1:-1;;;51802:19:0;;;;51784:13;16655:12;;;16567:108;58179:236;-1:-1:-1;;;;;58286:23:0;;58244:7;58286:23;;;:14;:23;;;;;;;;58340:16;:67;;58406:1;58340:67;;;-1:-1:-1;;;;;58359:20:0;;;;;;:11;:20;;;;;;58380:16;58395:1;58380:12;:16;:::i;:::-;58359:38;;;;;;;;;;;;;;;:44;;;58340:67;58320:87;58179:236;-1:-1:-1;;;58179:236:0:o;46266:27::-;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;46266:27:0;;-1:-1:-1;46266:27:0;:::o;52557:120::-;1300:6;;-1:-1:-1;;;;;1300:6:0;346:10;1447:23;1439:68;;;;-1:-1:-1;;;1439:68:0;;;;;;;:::i;:::-;52610:12:::1;:19:::0;;-1:-1:-1;;52610:19:0::1;52625:4;52610:19;::::0;;52640:22:::1;:29:::0;;-1:-1:-1;;;;52640:29:0::1;-1:-1:-1::0;;;52640:29:0::1;::::0;;52557:120::o;53075:122::-;1300:6;;-1:-1:-1;;;;;1300:6:0;346:10;1447:23;1439:68;;;;-1:-1:-1;;;1439:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;53156:27:0;;;::::1;;::::0;;;:20:::1;:27;::::0;;;;:33;;-1:-1:-1;;53156:33:0::1;::::0;::::1;;::::0;;;::::1;::::0;;53075:122::o;55218:693::-;55312:7;55337:21;55361:16;55371:5;55361:9;:16::i;:::-;55337:40;;55388:18;55409:17;:15;:17::i;:::-;55388:38;;55441:10;55455:1;55441:15;55437:56;;-1:-1:-1;55480:1:0;;55218:693;-1:-1:-1;;;55218:693:0:o;55437:56::-;-1:-1:-1;;;;;55568:25:0;;55505:23;55568:25;;;:18;:25;;;;;;55531:18;;:73;;:22;:73::i;:::-;55505:99;-1:-1:-1;55621:19:0;;55617:268;;55657:12;55672:50;55711:10;55672:34;:15;55692:13;55672:19;:34::i;:50::-;55657:65;;55750:14;;55743:4;:21;55739:135;;;-1:-1:-1;;55792:14:0;;;55218:693;-1:-1:-1;;;;55218:693:0:o;55739:135::-;55854:4;55218:693;-1:-1:-1;;;;;55218:693:0:o;55617:268::-;-1:-1:-1;55902:1:0;;55218:693;-1:-1:-1;;;;55218:693:0:o;52815:118::-;1300:6;;-1:-1:-1;;;;;1300:6:0;346:10;1447:23;1439:68;;;;-1:-1:-1;;;1439:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;52894:25:0;;;::::1;;::::0;;;:18:::1;:25;::::0;;;;:31;;-1:-1:-1;;52894:31:0::1;::::0;::::1;;::::0;;;::::1;::::0;;52815:118::o;56413:473::-;56630:10;56611:30;;;;:18;:30;;;;;;;;56607:272;;;56658:25;56686:5;56692:4;56686:11;;;;;;;;;;:::i;:::-;;;;;;;;;;;56658:39;;56730:5;56712:4;:15;;:23;;;;;;;;;;;;:::i;:::-;-1:-1:-1;56750:28:0;;-1:-1:-1;;;;;56750:28:0;;-1:-1:-1;;;;;;56750:28:0;;;;;;56793:15;:34;;;56842:14;:25;;;;;-1:-1:-1;;;56842:25:0;-1:-1:-1;;;;56842:25:0;;;;;;56413:473;;;;;:::o;2181:281::-;1300:6;;-1:-1:-1;;;;;1300:6:0;346:10;1447:23;1439:68;;;;-1:-1:-1;;;1439:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2284:22:0;::::1;2262:110;;;::::0;-1:-1:-1;;;2262:110:0;;13954:2:1;2262:110:0::1;::::0;::::1;13936:21:1::0;13993:2;13973:18;;;13966:30;14032:34;14012:18;;;14005:62;-1:-1:-1;;;14083:18:1;;;14076:36;14129:19;;2262:110:0::1;13752:402:1::0;2262:110:0::1;2409:6;::::0;2388:38:::1;::::0;-1:-1:-1;;;;;2388:38:0;;::::1;::::0;2409:6:::1;::::0;2388:38:::1;::::0;2409:6:::1;::::0;2388:38:::1;2437:6;:17:::0;;-1:-1:-1;;;;;;2437:17:0::1;-1:-1:-1::0;;;;;2437:17:0;;;::::1;::::0;;;::::1;::::0;;2181:281::o;23645:380::-;-1:-1:-1;;;;;23781:19:0;;23773:68;;;;-1:-1:-1;;;23773:68:0;;14361:2:1;23773:68:0;;;14343:21:1;14400:2;14380:18;;;14373:30;14439:34;14419:18;;;14412:62;-1:-1:-1;;;14490:18:1;;;14483:34;14534:19;;23773:68:0;14159:400:1;23773:68:0;-1:-1:-1;;;;;23860:21:0;;23852:68;;;;-1:-1:-1;;;23852:68:0;;14766:2:1;23852:68:0;;;14748:21:1;14805:2;14785:18;;;14778:30;14844:34;14824:18;;;14817:62;-1:-1:-1;;;14895:18:1;;;14888:32;14937:19;;23852:68:0;14564:398:1;23852:68:0;-1:-1:-1;;;;;23933:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;23985:32;;1997:25:1;;;23985:32:0;;1970:18:1;23985:32:0;;;;;;;;23645:380;;;:::o;47935:2191::-;48093:12;;;;;:51;;-1:-1:-1;1300:6:0;;-1:-1:-1;;;;;48126:18:0;;;1300:6;;48126:18;48093:51;:93;;;-1:-1:-1;1300:6:0;;-1:-1:-1;;;;;48165:21:0;;;1300:6;;48165:21;48093:93;:147;;;-1:-1:-1;48226:13:0;;-1:-1:-1;;;;;48207:33:0;;;48226:13;;48207:33;48093:147;48071:206;;;;-1:-1:-1;;;48071:206:0;;15169:2:1;48071:206:0;;;15151:21:1;15208:1;15188:18;;;15181:29;-1:-1:-1;;;15226:18:1;;;15219:39;15275:18;;48071:206:0;14967:332:1;48071:206:0;48338:22;;-1:-1:-1;;;48338:22:0;;;;:30;;48364:4;48338:30;:74;;;;-1:-1:-1;48385:18:0;;-1:-1:-1;;;48385:18:0;;;;:27;48338:74;:127;;;;-1:-1:-1;48437:13:0;;-1:-1:-1;;;;;48437:13:0;48429:36;;48338:127;:169;;;;-1:-1:-1;48482:11:0;;-1:-1:-1;;;;;48482:11:0;:25;;48338:169;:208;;;;-1:-1:-1;48535:11:0;;-1:-1:-1;;;;;48524:22:0;;;48535:11;;48524:22;;48338:208;:268;;;;;48591:15;;48563:24;48581:4;48563:9;:24::i;:::-;:43;;48338:268;:313;;;;-1:-1:-1;;;;;;48624:27:0;;;;;;:18;:27;;;;;;;;48623:28;48338:313;:361;;;;-1:-1:-1;;;;;;48669:30:0;;;;;;:18;:30;;;;;;;;48668:31;48338:361;48320:435;;;48726:17;:15;:17::i;:::-;-1:-1:-1;;;;;48772:29:0;;;;;;:20;:29;;;;;;;;48767:126;;48837:19;:17;:19::i;:::-;48826:7;:30;;48818:63;;;;-1:-1:-1;;;48818:63:0;;15506:2:1;48818:63:0;;;15488:21:1;15545:2;15525:18;;;15518:30;-1:-1:-1;;;15564:18:1;;;15557:50;15624:18;;48818:63:0;15304:344:1;48818:63:0;48923:11;;-1:-1:-1;;;;;48909:25:0;;;48923:11;;48909:25;48905:205;;49012:17;:15;:17::i;:::-;49001:7;48977:21;48987:10;48977:9;:21::i;:::-;:31;;;;:::i;:::-;:52;;48951:147;;;;-1:-1:-1;;;48951:147:0;;15855:2:1;48951:147:0;;;15837:21:1;15894:2;15874:18;;;15867:30;15933:34;15913:18;;;15906:62;-1:-1:-1;;;15984:18:1;;;15977:31;16025:19;;48951:147:0;15653:397:1;48951:147:0;-1:-1:-1;;;;;49126:27:0;;;;;;:18;:27;;;;;;;;49122:997;;;49170:45;49186:7;49195:10;49207:7;49170:15;:45::i;:::-;47935:2191;;;:::o;49122:997::-;49293:11;;49248:14;;49265:40;;49293:11;-1:-1:-1;;;49293:11:0;;;;;49265:23;;:7;;-1:-1:-1;;;49277:10:0;;;49265:11;:23::i;:40::-;49395:11;;49248:57;;-1:-1:-1;49320:20:0;;49343:78;;49395:11;-1:-1:-1;;;49395:11:0;;;;;49343:29;;:7;;-1:-1:-1;;;49355:16:0;;;49343:11;:29::i;:78::-;49549:11;;49320:101;;-1:-1:-1;49436:30:0;;49469:92;;49549:11;-1:-1:-1;;;49549:11:0;;;;;49469:57;;:7;;-1:-1:-1;;;49499:26:0;;;49469:29;:57::i;:92::-;49436:125;-1:-1:-1;49586:97:0;49436:125;49586:37;49610:12;49586:37;:7;49598:6;49586:11;:19::i;:::-;:23;;:37::i;:97::-;49576:107;;49698:45;49714:7;49723:10;49735:7;49698:15;:45::i;:::-;49758:47;49774:7;49791:4;49798:6;49758:15;:47::i;:::-;49820:53;49836:7;49853:4;49860:12;49820:15;:53::i;:::-;49888:63;49904:7;49921:4;49928:22;49888:15;:63::i;:::-;49983:14;;:42;;50002:22;49983:18;:42::i;:::-;49966:14;:59;50061:18;;:46;;50084:22;50061;:46::i;:::-;50040:18;:67;-1:-1:-1;;;47935:2191:0;;;:::o;5423:98::-;5481:7;5508:5;5512:1;5508;:5;:::i;21085:675::-;-1:-1:-1;;;;;21225:20:0;;21217:70;;;;-1:-1:-1;;;21217:70:0;;16257:2:1;21217:70:0;;;16239:21:1;16296:2;16276:18;;;16269:30;16335:34;16315:18;;;16308:62;-1:-1:-1;;;16386:18:1;;;16379:35;16431:19;;21217:70:0;16055:401:1;21217:70:0;-1:-1:-1;;;;;21306:23:0;;21298:71;;;;-1:-1:-1;;;21298:71:0;;16663:2:1;21298:71:0;;;16645:21:1;16702:2;16682:18;;;16675:30;16741:34;16721:18;;;16714:62;-1:-1:-1;;;16792:18:1;;;16785:33;16835:19;;21298:71:0;16461:399:1;21298:71:0;-1:-1:-1;;;;;21466:17:0;;21442:21;21466:17;;;;;;;;;;;21516:23;;;;21494:111;;;;-1:-1:-1;;;21494:111:0;;17067:2:1;21494:111:0;;;17049:21:1;17106:2;17086:18;;;17079:30;17145:34;17125:18;;;17118:62;-1:-1:-1;;;17196:18:1;;;17189:36;17242:19;;21494:111:0;16865:402:1;21494:111:0;21636:22;21652:6;21636:13;:22;:::i;:::-;-1:-1:-1;;;;;21616:17:0;;;:9;:17;;;;;;;;;;;:42;;;;21669:20;;;;;;;;:30;;21693:6;;21616:9;21669:30;;21693:6;;21669:30;:::i;:::-;;;;;;;;21734:9;-1:-1:-1;;;;;21717:35:0;21726:6;-1:-1:-1;;;;;21717:35:0;;21745:6;21717:35;;;;1997:25:1;;1985:2;1970:18;;1851:177;21717:35:0;;;;;;;;21206:554;21085:675;;;:::o;5804:98::-;5862:7;5889:5;5893:1;5889;:5;:::i;22713:494::-;-1:-1:-1;;;;;22797:21:0;;22789:67;;;;-1:-1:-1;;;22789:67:0;;17474:2:1;22789:67:0;;;17456:21:1;17513:2;17493:18;;;17486:30;17552:34;17532:18;;;17525:62;-1:-1:-1;;;17603:18:1;;;17596:31;17644:19;;22789:67:0;17272:397:1;22789:67:0;-1:-1:-1;;;;;22956:18:0;;22931:22;22956:18;;;;;;;;;;;22993:24;;;;22985:71;;;;-1:-1:-1;;;22985:71:0;;17876:2:1;22985:71:0;;;17858:21:1;17915:2;17895:18;;;17888:30;17954:34;17934:18;;;17927:62;-1:-1:-1;;;18005:18:1;;;17998:32;18047:19;;22985:71:0;17674:398:1;22985:71:0;23088:23;23105:6;23088:14;:23;:::i;:::-;-1:-1:-1;;;;;23067:18:0;;:9;:18;;;;;;;;;;:44;;;;23122:12;:22;;23138:6;;23067:9;23122:22;;23138:6;;23122:22;:::i;:::-;;;;-1:-1:-1;;23162:37:0;;1997:25:1;;;23188:1:0;;-1:-1:-1;;;;;23162:37:0;;;;;1985:2:1;1970:18;23162:37:0;1851:177:1;6161:98:0;6219:7;6246:5;6250:1;6246;:5;:::i;6560:98::-;6618:7;6645:5;6649:1;6645;:5;:::i;55919:221::-;56025:11;;55968:7;;;;56015:22;;-1:-1:-1;;;;;56025:11:0;56015:9;:22::i;:::-;55988:49;;56048:18;56069:35;56087:16;56069:13;16655:12;;;16567:108;50449:473;46336:18;:25;;-1:-1:-1;;;;46336:25:0;-1:-1:-1;;;46336:25:0;;;46485:10:::1;::::0;;-1:-1:-1;;;;46690:30:0;;;;;46485:10:::1;-1:-1:-1::0;;;46485:10:0;::::1;::::0;::::1;::::0;-1:-1:-1;;;46533:16:0;::::1;::::0;::::1;::::0;-1:-1:-1;;;46597:26:0;;::::1;;46336:25:::0;50554:24:::2;50572:4;50554:9;:24::i;:::-;50523:55;;50618:14;;50595:20;:37;50591:324;;;50697:14;::::0;50672:40:::2;::::0;:20;;:24:::2;:40::i;:::-;50649:63;;50763:38;50780:20;50763:16;:38::i;:::-;50874:14;::::0;50866:37:::2;::::0;50830:21:::2;::::0;-1:-1:-1;;;;;50874:14:0::2;::::0;50866:37;::::2;;;::::0;50830:21;;50816:11:::2;50866:37:::0;50816:11;50866:37;50830:21;50874:14;50866:37;::::2;;;;;;;;;;;;;::::0;::::2;;;;;;50634:281;50591:324;-1:-1:-1::0;46743:10:0::1;:24:::0;;-1:-1:-1;;;;46778:36:0;-1:-1:-1;;;46743:24:0::1;::::0;;::::1;;-1:-1:-1::0;;;;46778:36:0;;-1:-1:-1;;;46778:36:0;;::::1;::::0;;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;46825:56:0::1;-1:-1:-1::0;;;46825:56:0;;;::::1;;::::0;;;::::1;::::0;;46384:18;:26;;-1:-1:-1;;;;46384:26:0;;;50449:473::o;50964:587::-;51118:16;;;51132:1;51118:16;;;;;;;;51094:21;;51118:16;;;;;;;;;;-1:-1:-1;51118:16:0;51094:40;;51163:4;51145;51150:1;51145:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;51145:23:0;;;:7;;;;;;;;;;:23;;;;51189:13;;:20;;;-1:-1:-1;;;51189:20:0;;;;:13;;;;;:18;;:20;;;;;51145:7;;51189:20;;;;;:13;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51179:4;51184:1;51179:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;51179:30:0;;;:7;;;;;;;;;:30;51254:13;;51222:60;;51239:4;;51254:13;51270:11;51222:8;:60::i;:::-;51321:13;;:222;;-1:-1:-1;;;51321:222:0;;-1:-1:-1;;;;;51321:13:0;;;;:64;;:222;;51400:11;;51321:13;;51470:4;;51497;;51517:15;;51321:222;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51019:532;50964:587;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;206:159:1;273:20;;333:6;322:18;;312:29;;302:57;;355:1;352;345:12;302:57;206:159;;;:::o;370:328::-;444:6;452;460;513:2;501:9;492:7;488:23;484:32;481:52;;;529:1;526;519:12;481:52;552:28;570:9;552:28;:::i;:::-;542:38;;599:37;632:2;621:9;617:18;599:37;:::i;:::-;589:47;;655:37;688:2;677:9;673:18;655:37;:::i;:::-;645:47;;370:328;;;;;:::o;703:548::-;815:4;844:2;873;862:9;855:21;905:6;899:13;948:6;943:2;932:9;928:18;921:34;973:1;983:140;997:6;994:1;991:13;983:140;;;1092:14;;;1088:23;;1082:30;1058:17;;;1077:2;1054:26;1047:66;1012:10;;983:140;;;987:3;1172:1;1167:2;1158:6;1147:9;1143:22;1139:31;1132:42;1242:2;1235;1231:7;1226:2;1218:6;1214:15;1210:29;1199:9;1195:45;1191:54;1183:62;;;;703:548;;;;:::o;1256:131::-;-1:-1:-1;;;;;1331:31:1;;1321:42;;1311:70;;1377:1;1374;1367:12;1392:134;1460:20;;1489:31;1460:20;1489:31;:::i;1531:315::-;1599:6;1607;1660:2;1648:9;1639:7;1635:23;1631:32;1628:52;;;1676:1;1673;1666:12;1628:52;1715:9;1702:23;1734:31;1759:5;1734:31;:::i;:::-;1784:5;1836:2;1821:18;;;;1808:32;;-1:-1:-1;;;1531:315:1:o;2215:456::-;2292:6;2300;2308;2361:2;2349:9;2340:7;2336:23;2332:32;2329:52;;;2377:1;2374;2367:12;2329:52;2416:9;2403:23;2435:31;2460:5;2435:31;:::i;:::-;2485:5;-1:-1:-1;2542:2:1;2527:18;;2514:32;2555:33;2514:32;2555:33;:::i;:::-;2215:456;;2607:7;;-1:-1:-1;;;2661:2:1;2646:18;;;;2633:32;;2215:456::o;2865:247::-;2924:6;2977:2;2965:9;2956:7;2952:23;2948:32;2945:52;;;2993:1;2990;2983:12;2945:52;3032:9;3019:23;3051:31;3076:5;3051:31;:::i;3117:184::-;3175:6;3228:2;3216:9;3207:7;3203:23;3199:32;3196:52;;;3244:1;3241;3234:12;3196:52;3267:28;3285:9;3267:28;:::i;3738:127::-;3799:10;3794:3;3790:20;3787:1;3780:31;3830:4;3827:1;3820:15;3854:4;3851:1;3844:15;3870:908;3924:5;3977:3;3970:4;3962:6;3958:17;3954:27;3944:55;;3995:1;3992;3985:12;3944:55;4031:6;4018:20;4057:4;4080:18;4117:2;4113;4110:10;4107:36;;;4123:18;;:::i;:::-;4169:2;4166:1;4162:10;4201:2;4195:9;4264:2;4260:7;4255:2;4251;4247:11;4243:25;4235:6;4231:38;4319:6;4307:10;4304:22;4299:2;4287:10;4284:18;4281:46;4278:72;;;4330:18;;:::i;:::-;4366:2;4359:22;4416:18;;;4492:15;;;4488:24;;;4450:15;;;;-1:-1:-1;4524:15:1;;;4521:35;;;4552:1;4549;4542:12;4521:35;4588:2;4580:6;4576:15;4565:26;;4600:148;4616:6;4611:3;4608:15;4600:148;;;4682:23;4701:3;4682:23;:::i;:::-;4670:36;;4726:12;;;;4633;;;;4600:148;;;4766:6;3870:908;-1:-1:-1;;;;;;;3870:908:1:o;4783:483::-;4876:6;4884;4937:2;4925:9;4916:7;4912:23;4908:32;4905:52;;;4953:1;4950;4943:12;4905:52;4993:9;4980:23;5026:18;5018:6;5015:30;5012:50;;;5058:1;5055;5048:12;5012:50;5081:61;5134:7;5125:6;5114:9;5110:22;5081:61;:::i;:::-;5071:71;;;5192:2;5181:9;5177:18;5164:32;5205:31;5230:5;5205:31;:::i;:::-;5255:5;5245:15;;;4783:483;;;;;:::o;5479:118::-;5565:5;5558:13;5551:21;5544:5;5541:32;5531:60;;5587:1;5584;5577:12;5602:241;5658:6;5711:2;5699:9;5690:7;5686:23;5682:32;5679:52;;;5727:1;5724;5717:12;5679:52;5766:9;5753:23;5785:28;5807:5;5785:28;:::i;5848:180::-;5907:6;5960:2;5948:9;5939:7;5935:23;5931:32;5928:52;;;5976:1;5973;5966:12;5928:52;-1:-1:-1;5999:23:1;;5848:180;-1:-1:-1;5848:180:1:o;6033:382::-;6098:6;6106;6159:2;6147:9;6138:7;6134:23;6130:32;6127:52;;;6175:1;6172;6165:12;6127:52;6214:9;6201:23;6233:31;6258:5;6233:31;:::i;:::-;6283:5;-1:-1:-1;6340:2:1;6325:18;;6312:32;6353:30;6312:32;6353:30;:::i;6420:388::-;6488:6;6496;6549:2;6537:9;6528:7;6524:23;6520:32;6517:52;;;6565:1;6562;6555:12;6517:52;6604:9;6591:23;6623:31;6648:5;6623:31;:::i;:::-;6673:5;-1:-1:-1;6730:2:1;6715:18;;6702:32;6743:33;6702:32;6743:33;:::i;6813:851::-;6928:6;6936;6944;6952;6960;7013:3;7001:9;6992:7;6988:23;6984:33;6981:53;;;7030:1;7027;7020:12;6981:53;7069:9;7056:23;7119:4;7112:5;7108:16;7101:5;7098:27;7088:55;;7139:1;7136;7129:12;7088:55;7162:5;-1:-1:-1;7218:2:1;7203:18;;7190:32;7245:18;7234:30;;7231:50;;;7277:1;7274;7267:12;7231:50;7300:61;7353:7;7344:6;7333:9;7329:22;7300:61;:::i;:::-;7290:71;;;7413:2;7402:9;7398:18;7385:32;7426:33;7451:7;7426:33;:::i;:::-;7478:7;-1:-1:-1;7532:2:1;7517:18;;7504:32;;-1:-1:-1;7588:3:1;7573:19;;7560:33;7602:30;7560:33;7602:30;:::i;:::-;7651:7;7641:17;;;6813:851;;;;;;;;:::o;7669:419::-;7736:6;7744;7797:2;7785:9;7776:7;7772:23;7768:32;7765:52;;;7813:1;7810;7803:12;7765:52;7852:9;7839:23;7871:31;7896:5;7871:31;:::i;:::-;7921:5;-1:-1:-1;7978:2:1;7963:18;;7950:32;8026:10;8013:24;;8001:37;;7991:65;;8052:1;8049;8042:12;8361:356;8563:2;8545:21;;;8582:18;;;8575:30;8641:34;8636:2;8621:18;;8614:62;8708:2;8693:18;;8361:356::o;8722:127::-;8783:10;8778:3;8774:20;8771:1;8764:31;8814:4;8811:1;8804:15;8838:4;8835:1;8828:15;8854:168;8921:6;8947:10;;;8959;;;8943:27;;8982:11;;;8979:37;;;8996:18;;:::i;:::-;8979:37;8854:168;;;;:::o;9362:380::-;9441:1;9437:12;;;;9484;;;9505:61;;9559:4;9551:6;9547:17;9537:27;;9505:61;9612:2;9604:6;9601:14;9581:18;9578:38;9575:161;;9658:10;9653:3;9649:20;9646:1;9639:31;9693:4;9690:1;9683:15;9721:4;9718:1;9711:15;9575:161;;9362:380;;;:::o;10156:128::-;10223:9;;;10244:11;;;10241:37;;;10258:18;;:::i;10289:125::-;10354:9;;;10375:10;;;10372:36;;;10388:18;;:::i;10767:127::-;10828:10;10823:3;10819:20;10816:1;10809:31;10859:4;10856:1;10849:15;10883:4;10880:1;10873:15;11178:245;11245:6;11298:2;11286:9;11277:7;11273:23;11269:32;11266:52;;;11314:1;11311;11304:12;11266:52;11346:9;11340:16;11365:28;11387:5;11365:28;:::i;11428:1003::-;11687:4;11735:3;11724:9;11720:19;11766:6;11755:9;11748:25;11792:2;11830:6;11825:2;11814:9;11810:18;11803:34;11873:3;11868:2;11857:9;11853:18;11846:31;11897:6;11932;11926:13;11963:6;11955;11948:22;12001:3;11990:9;11986:19;11979:26;;12024:6;12021:1;12014:17;12067:2;12064:1;12054:16;12040:30;;12088:1;12098:194;12112:6;12109:1;12106:13;12098:194;;;12177:13;;-1:-1:-1;;;;;12173:39:1;12161:52;;12209:1;12268:14;;;;12233:12;;;;12127:9;12098:194;;;-1:-1:-1;;;;;;;12348:32:1;;;;12343:2;12328:18;;12321:60;-1:-1:-1;;;12412:3:1;12397:19;12390:35;12309:3;11428:1003;-1:-1:-1;;;11428:1003:1:o;12838:175::-;12906:10;12949;;;12937;;;12933:27;;12972:12;;;12969:38;;;12987:18;;:::i;13018:127::-;13079:10;13074:3;13070:20;13067:1;13060:31;13110:4;13107:1;13100:15;13134:4;13131:1;13124:15;13150:191;13189:1;13215:10;13252:2;13249:1;13245:10;13274:3;13264:37;;13281:18;;:::i;:::-;13319:10;;13315:20;;;;;13150:191;-1:-1:-1;;13150:191:1:o;18077:168::-;18150:9;;;18181;;18198:15;;;18192:22;;18178:37;18168:71;;18219:18;;:::i;18250:120::-;18290:1;18316;18306:35;;18321:18;;:::i;:::-;-1:-1:-1;18355:9:1;;18250:120::o;18375:251::-;18445:6;18498:2;18486:9;18477:7;18473:23;18469:32;18466:52;;;18514:1;18511;18504:12;18466:52;18546:9;18540:16;18565:31;18590:5;18565:31;:::i;18631:980::-;18893:4;18941:3;18930:9;18926:19;18972:6;18961:9;18954:25;18998:2;19036:6;19031:2;19020:9;19016:18;19009:34;19079:3;19074:2;19063:9;19059:18;19052:31;19103:6;19138;19132:13;19169:6;19161;19154:22;19207:3;19196:9;19192:19;19185:26;;19246:2;19238:6;19234:15;19220:29;;19267:1;19277:195;19291:6;19288:1;19285:13;19277:195;;;19356:13;;-1:-1:-1;;;;;19352:39:1;19340:52;;19447:15;;;;19412:12;;;;19388:1;19306:9;19277:195;

Swarm Source

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