ETH Price: $3,401.58 (+2.65%)

Token

Port AI (PORTAI)
 

Overview

Max Total Supply

1,000,000 PORTAI

Holders

128

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

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:
PORTAI

Compiler Version
v0.8.25+commit.b61c2a91

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-04-03
*/

/**
PORT AI: Manage your portfolio like never before with our Intelligent Insights.

PORT AI is an AI-Powered Telegram Bot that helps your portfolio managements with 
user friendly interface easy to access anywhere!

██████╗  ██████╗ ██████╗ ████████╗ █████╗ ██╗
██╔══██╗██╔═══██╗██╔══██╗╚══██╔══╝██╔══██╗██║
██████╔╝██║   ██║██████╔╝   ██║   ███████║██║
██╔═══╝ ██║   ██║██╔══██╗   ██║   ██╔══██║██║
██║     ╚██████╔╝██║  ██║   ██║   ██║  ██║██║
╚═╝      ╚═════╝ ╚═╝  ╚═╝   ╚═╝   ╚═╝  ╚═╝╚═╝

    Website: https://www.portaierc20.com/
    Telegram: https://t.me/PortAiErc20
    Twitter:  https://twitter.com/PortAIOfficial
    Bot : https://t.me/Port_AI_bot
    Gitbook : https://docs.portaierc20.com/

**/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
pragma experimental ABIEncoderV2;

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

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

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

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

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

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

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

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

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

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

////// lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol
// OpenZeppelin Contracts v4.4.0 (token/ERC20/IERC20.sol)

/* pragma solidity ^0.8.0; */

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

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

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

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

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

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

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

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

////// lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol
// OpenZeppelin Contracts v4.4.0 (token/ERC20/extensions/IERC20Metadata.sol)

/* pragma solidity ^0.8.0; */

/* import "../IERC20.sol"; */

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

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

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

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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

        return true;
    }

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

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

        return true;
    }

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

        _beforeTokenTransfer(sender, recipient, amount);

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

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since 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. 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;
        }
    }
}

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 setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

////// src/IUniswapV2Pair.sol
/* pragma solidity 0.8.10; */
/* pragma experimental ABIEncoderV2; */

interface IUniswapV2Pair {
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
    event Transfer(address indexed from, address indexed to, uint256 value);

    function name() external pure returns (string memory);

    function symbol() external pure returns (string memory);

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint256);

    function balanceOf(address owner) external view returns (uint256);

    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    function approve(address spender, uint256 value) external returns (bool);

    function transfer(address to, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

    function nonces(address owner) external view returns (uint256);

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    event Mint(address indexed sender, uint256 amount0, uint256 amount1);
    event Burn(
        address indexed sender,
        uint256 amount0,
        uint256 amount1,
        address indexed to
    );
    event Swap(
        address indexed sender,
        uint256 amount0In,
        uint256 amount1In,
        uint256 amount0Out,
        uint256 amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

    function getReserves()
        external
        view
        returns (
            uint112 reserve0,
            uint112 reserve1,
            uint32 blockTimestampLast
        );

    function price0CumulativeLast() external view returns (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

    function mint(address to) external returns (uint256 liquidity);

    function burn(address to)
        external
        returns (uint256 amount0, uint256 amount1);

    function swap(
        uint256 amount0Out,
        uint256 amount1Out,
        address to,
        bytes calldata data
    ) external;

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

interface IUniswapV2Router02 {
    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 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;
}

contract PORTAI is ERC20, Ownable {
    using SafeMath for uint256;

    IUniswapV2Router02 public immutable uniswapV2Router;
    address public immutable uniswapV2Pair;
    address public constant deadAddress = address(0xdead);

    bool private swapping;

    address public LPStakingRewardsWallet;
    address public LPStakingRewards1Wallet;
    address public endpointWallet;
    address public FreeendpointWallet;
    address public mWT;
    address public DtWT;

    uint256 public maxTransactionAmount;
    uint256 public swapTokensAtAmount;
    uint256 public maxWallet;

    bool public limitsInEffect = true;
    bool public tradingActive = false;
    bool public swapEnabled = false;

    bool public blacklistRenounced = false;

    // Anti-bot and anti-whale mappings and variables
    mapping(address => bool) blacklisted;

    uint256 public buyTotalFees;
    uint256 public buyLPStakingRewardsFee;
    uint256 public buyLPStakingRewards1Fee;
    uint256 public buyendpointFee;
    uint256 public buyFreeendpointFee;
    uint256 public buymWTFee;
    uint256 public buyLiquidityFee;
    uint256 public buyDtWTFee;

    uint256 public sellTotalFees;
    uint256 public sellLPStakingRewardsFee;
    uint256 public sellLPStakingRewards1Fee;
    uint256 public sellendpointFee;
    uint256 public sellFreeendpointFee;
    uint256 public sellmWTFee;
    uint256 public sellLiquidityFee;
    uint256 public sellDtWTFee;

    uint256 public tokensForLPStakingRewards;
    uint256 public tokensForLPStakingRewards1;
    uint256 public tokensForendpoint;
    uint256 public tokensForFreeendpoint;
    uint256 public tokensFormWT;
    uint256 public tokensForLiquidity;
    uint256 public tokensForDtWT;

    mapping(address => bool) public whitelist;

    /******************/

    // exclude from fees and max transaction amount
    mapping(address => bool) private _isExcludedFromFees;
    mapping(address => bool) public _isExcludedMaxTransactionAmount;

    // store addresses that a automatic market maker pairs. Any transfer *to* these addresses
    // could be subject to a maximum transfer amount
    mapping(address => bool) public automatedMarketMakerPairs;

    bool public preMigrationPhase = true;
    mapping(address => bool) public preMigrationTransferrable;

    event UpdateUniswapV2Router(
        address indexed newAddress,
        address indexed oldAddress
    );

    event ExcludeFromFees(address indexed account, bool isExcluded);

    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);

    event LPStakingRewardsWalletUpdated(
        address indexed newWallet,
        address indexed oldWallet
    );

    event LPStakingRewards1WalletUpdated(
        address indexed newWallet,
        address indexed oldWallet
    );

    event endpointWalletUpdated(
        address indexed newWallet,
        address indexed oldWallet
    );

    event FreeendpointWalletUpdated(
        address indexed newWallet,
        address indexed oldWallet
    );

    event mWTUpdated(
        address indexed newWallet,
        address indexed oldWallet
    );

    event DtWTUpdated(
        address indexed newWallet,
        address indexed oldWallet
    );

    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiquidity
    );

    constructor() ERC20("Port AI", "PORTAI") {
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
        );

        excludeFromMaxTransaction(address(_uniswapV2Router), true);
        uniswapV2Router = _uniswapV2Router;

        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());
        excludeFromMaxTransaction(address(uniswapV2Pair), true);
        _setAutomatedMarketMakerPair(address(uniswapV2Pair), true);

        uint256 _buyLPStakingRewardsFee = 0;
        uint256 _buyLPStakingRewards1Fee = 0;
        uint256 _buyendpointFee = 0;
        uint256 _buyFreeendpointFee = 0;
        uint256 _buymWTFee = 0;
        uint256 _buyLiquidityFee = 0;
        uint256 _buyDtWTFee = 35;

        uint256 _sellLPStakingRewardsFee = 0;
        uint256 _sellLPStakingRewards1Fee = 0;
        uint256 _sellendpointFee = 0;
        uint256 _sellFreeendpointFee = 0;
        uint256 _sellmWTFee = 0;
        uint256 _sellLiquidityFee = 0;
        uint256 _sellDtWTFee = 40;

        uint256 totalSupply = 1_000_000 * 1e18;

        maxTransactionAmount = 10_000 * 1e18; // 1%
        maxWallet = 10_000 * 1e18; // 1% 
        swapTokensAtAmount = (totalSupply * 5) / 10000; // 0.05% 

        buyLPStakingRewardsFee = _buyLPStakingRewardsFee;
        buyLPStakingRewards1Fee = _buyLPStakingRewards1Fee;
        buyendpointFee = _buyendpointFee;
        buyFreeendpointFee = _buyFreeendpointFee;
        buymWTFee = _buymWTFee;
        buyLiquidityFee = _buyLiquidityFee;
        buyDtWTFee = _buyDtWTFee;
        buyTotalFees = buyLPStakingRewardsFee + buyLPStakingRewards1Fee + buyendpointFee + buyFreeendpointFee + buymWTFee + buyLiquidityFee + buyDtWTFee;

        sellLPStakingRewardsFee = _sellLPStakingRewardsFee;
        sellLPStakingRewards1Fee = _sellLPStakingRewards1Fee;
        sellendpointFee = _sellendpointFee;
        sellFreeendpointFee = _sellFreeendpointFee;
        sellmWTFee = _sellmWTFee;
        sellLiquidityFee = _sellLiquidityFee;
        sellDtWTFee = _sellDtWTFee;
        sellTotalFees = sellLPStakingRewardsFee + sellLPStakingRewards1Fee + sellendpointFee + sellFreeendpointFee + sellmWTFee + sellLiquidityFee + sellDtWTFee;

        LPStakingRewardsWallet = address(0xc30C49dd89AD1075B6B7EdA83C4523aaCcF93e3C);
        LPStakingRewards1Wallet = address(0xc30C49dd89AD1075B6B7EdA83C4523aaCcF93e3C);
        endpointWallet = address(0x8c2Bf0E354224BD2406352DCbbb7E3a5c9d3F0b7);
        FreeendpointWallet = address(msg.sender);
        mWT = address(0x355bC1784AA2B25ce089392C75191dC132F58181); // set as LPStakingRewards wallet
        DtWT = address(0xb58B7dBc2cEF9FD7e0e1fEBD93a8A37b4E3eF821); // set as DtWT wallet

        // exclude from paying fees or having max transaction amount
        excludeFromFees(owner(), true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);

        excludeFromMaxTransaction(owner(), true);
        excludeFromMaxTransaction(address(this), true);
        excludeFromMaxTransaction(address(0xdead), true);

        preMigrationTransferrable[owner()] = true;

        /*
            _mint is an internal function in ERC20.sol that is only called here,
            and CANNOT be called ever again
        */
        _mint(msg.sender, totalSupply);
    }

    receive() external payable {}

    // once enabled, can never be turned off
    function enableTrading() external onlyOwner {
        tradingActive = true;
        swapEnabled = true;
        preMigrationPhase = false;
    }

    // remove limits after token is stable
    function removeLimits() external onlyOwner returns (bool) {
        limitsInEffect = false;
        return true;
    }

    // change the minimum amount of tokens to sell from fees
    function updateSwapTokensAtAmount(uint256 newAmount)
        external
        onlyOwner
        returns (bool)
    {
        require(
            newAmount >= (totalSupply() * 1) / 100000,
            "Swap amount cannot be lower than 0.001% total supply."
        );
        require(
            newAmount <= (totalSupply() * 5) / 1000,
            "Swap amount cannot be higher than 0.5% total supply."
        );
        swapTokensAtAmount = newAmount;
        return true;
    }

    function updateMaxTxnAmount(uint256 newNum) external onlyOwner {
        require(
            newNum >= ((totalSupply() * 999) / 1000) / 1e18,
            "Cannot set maxTransactionAmount lower than 0.5%"
        );
        maxTransactionAmount = newNum * (10**18);
    }

    function updateMaxWalletAmount(uint256 newNum) external onlyOwner {
        require(
            newNum >= ((totalSupply() * 999) / 1000) / 1e18,
            "Cannot set maxWallet lower than 1.0%"
        );
        maxWallet = newNum * (10**18);
    }

    function excludeFromMaxTransaction(address updAds, bool isEx)
        public
        onlyOwner
    {
        _isExcludedMaxTransactionAmount[updAds] = isEx;
    }

    // only use to disable contract sales if absolutely necessary (emergency use only)
    function updateSwapEnabled(bool enabled) external onlyOwner {
        swapEnabled = enabled;
    }

    function updateBuyFees(
        uint256 _LPStakingRewardsFee,
        uint256 _LPStakingRewards1Fee,
        uint256 _endpointFee,
        uint256 _FreeendpointFee,
        uint256 _mWTFee,
        uint256 _liquidityFee,
        uint256 _DtWTFee
    ) external onlyOwner {
        buyLPStakingRewardsFee = _LPStakingRewardsFee;
        buyLPStakingRewards1Fee = _LPStakingRewards1Fee;
        buyendpointFee = _endpointFee;
        buyFreeendpointFee = _FreeendpointFee;
        buymWTFee = _mWTFee;
        buyLiquidityFee = _liquidityFee;
        buyDtWTFee = _DtWTFee;
        buyTotalFees = buyLPStakingRewardsFee + buyLPStakingRewardsFee + buyendpointFee + buyFreeendpointFee + buymWTFee + buyLiquidityFee + buyDtWTFee;
        require(buyTotalFees <= 50, "Buy fees must be <= 5.");
    }

    function updateSellFees(
        uint256 _LPStakingRewardsFee,
        uint256 _LPStakingRewards1Fee,
        uint256 _endpointFee,
        uint256 _FreeendpointFee,
        uint256 _mWTFee,
        uint256 _liquidityFee,
        uint256 _DtWTFee
    ) external onlyOwner {
        sellLPStakingRewardsFee = _LPStakingRewardsFee;
        sellLPStakingRewards1Fee = _LPStakingRewards1Fee;
        sellendpointFee = _endpointFee;
        sellFreeendpointFee = _FreeendpointFee;
        sellmWTFee = _mWTFee;
        sellLiquidityFee = _liquidityFee;
        sellDtWTFee = _DtWTFee;
        sellTotalFees = sellLPStakingRewardsFee + sellLPStakingRewards1Fee + sellendpointFee + sellFreeendpointFee + sellmWTFee + sellLiquidityFee + sellDtWTFee;
        require(sellTotalFees <= 99, "Sell fees must be <= 5.");
    }

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        _isExcludedFromFees[account] = excluded;
        emit ExcludeFromFees(account, excluded);
    }

    function setAutomatedMarketMakerPair(address pair, bool value)
        public
        onlyOwner
    {
        require(
            pair != uniswapV2Pair,
            "The pair cannot be removed from automatedMarketMakerPairs"
        );

        _setAutomatedMarketMakerPair(pair, value);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        automatedMarketMakerPairs[pair] = value;

        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function updateLPStakingRewardsWallet(address newLPStakingRewardsWallet) external onlyOwner {
        emit LPStakingRewardsWalletUpdated(newLPStakingRewardsWallet, LPStakingRewardsWallet);
        LPStakingRewardsWallet = newLPStakingRewardsWallet;
    }

    function updateLPStakingRewards1Wallet(address newLPStakingRewards1Wallet) external onlyOwner {
        emit LPStakingRewards1WalletUpdated(newLPStakingRewards1Wallet, LPStakingRewards1Wallet);
        LPStakingRewards1Wallet = newLPStakingRewards1Wallet;
    }

    function updateendpointWallet(address newendpointWallet) external onlyOwner {
        emit endpointWalletUpdated(newendpointWallet, endpointWallet);
        endpointWallet = newendpointWallet;
    }

    function updateFreeendpointWallet(address newFreeendpointWallet) external onlyOwner {
        emit FreeendpointWalletUpdated(newFreeendpointWallet, FreeendpointWallet);
        FreeendpointWallet = newFreeendpointWallet;
    }

    function updatemWT(address newmWT) external onlyOwner {
        emit mWTUpdated(newmWT, mWT);
        mWT = newmWT;
    }

    function updateDtWT(address newWallet) external onlyOwner {
        emit DtWTUpdated(newWallet, DtWT);
        DtWT = newWallet;
    }

    function isExcludedFromFees(address account) public view returns (bool) {
        return _isExcludedFromFees[account];
    }

    function isBlacklisted(address account) public view returns (bool) {
        return blacklisted[account];
    }

    function addToWhitelist(address[] memory addresses) external onlyOwner {
        for (uint256 i = 0; i < addresses.length; i++) {
            whitelist[addresses[i]] = true;
        }
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(!blacklisted[from],"Sender blacklisted");
        require(!blacklisted[to],"Receiver blacklisted");

        if (preMigrationPhase) {
            require(preMigrationTransferrable[from], "Not authorized to transfer pre-migration.");
        }

        if (amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

        if (limitsInEffect) {
            if (
                from != owner() &&
                to != owner() &&
                to != address(0) &&
                to != address(0xdead) &&
                !swapping
            ) {
                if (!tradingActive) {
                    require(
                        _isExcludedFromFees[from] || _isExcludedFromFees[to],
                        "Trading is not active."
                    );
                }

                //when buy
                if (
                    automatedMarketMakerPairs[from] &&
                    !_isExcludedMaxTransactionAmount[to]
                ) {
                    require(
                        amount <= maxTransactionAmount,
                        "Buy transfer amount exceeds the maxTransactionAmount."
                    );
                    require(
                        amount + balanceOf(to) <= maxWallet,
                        "Max wallet exceeded"
                    );
                }
                //when sell
                else if (
                    automatedMarketMakerPairs[to] &&
                    !_isExcludedMaxTransactionAmount[from]
                ) {
                    require(
                        amount <= maxTransactionAmount,
                        "Sell transfer amount exceeds the maxTransactionAmount."
                    );
                } else if (!_isExcludedMaxTransactionAmount[to]) {
                    require(
                        amount + balanceOf(to) <= maxWallet,
                        "Max wallet exceeded"
                    );
                }
            }
        }

        uint256 contractTokenBalance = balanceOf(address(this));

        bool canSwap = contractTokenBalance >= swapTokensAtAmount;

        if (
            canSwap &&
            swapEnabled &&
            !swapping &&
            !automatedMarketMakerPairs[from] &&
            !_isExcludedFromFees[from] &&
            !_isExcludedFromFees[to]
        ) {
            swapping = true;

            swapBack();

            swapping = false;
        }

        bool takeFee = !swapping;

        // if any account belongs to _isExcludedFromFee account then remove the fee
        if (_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }

        uint256 fees = 0;
        // only take fees on buys/sells, do not take on wallet transfers
        if (takeFee) {
            // on sell
            if (automatedMarketMakerPairs[to] && sellTotalFees > 0) {
                fees = amount.mul(sellTotalFees).div(100);
                tokensForLiquidity += (fees * sellLiquidityFee) / sellTotalFees;
                tokensForDtWT += (fees * sellDtWTFee) / sellTotalFees;
                tokensForLPStakingRewards += (fees * sellLPStakingRewardsFee) / sellTotalFees;
                tokensForendpoint += (fees * sellendpointFee) / sellTotalFees;
                tokensForFreeendpoint += (fees * sellFreeendpointFee) / sellTotalFees;
                tokensFormWT += (fees * sellmWTFee) / sellTotalFees;
            }
            // on buy
            else if (automatedMarketMakerPairs[from] && buyTotalFees > 0) {
                fees = amount.mul(buyTotalFees).div(100);
                tokensForLiquidity += (fees * buyLiquidityFee) / buyTotalFees;
                tokensForDtWT += (fees * buyDtWTFee) / buyTotalFees;
                tokensForLPStakingRewards += (fees * buyLPStakingRewardsFee) / buyTotalFees;
                tokensForendpoint += (fees * buyendpointFee) / buyTotalFees;
                tokensForFreeendpoint += (fees * buyFreeendpointFee) / buyTotalFees;
                tokensFormWT += (fees * buymWTFee) / buyTotalFees;
            }

            if (fees > 0) {
                super._transfer(from, address(this), fees);
            }

            amount -= fees;
        }

        super._transfer(from, to, amount);
    }

    function swapTokensForEth(uint256 tokenAmount) private {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

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

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

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // add the liquidity
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            owner(),
            block.timestamp
        );
    }

    function swapBack() private {
        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = tokensForLiquidity +
            tokensForLPStakingRewards +
            tokensForendpoint +
            tokensForFreeendpoint +
            tokensFormWT +
            tokensForDtWT;
        bool success;

        if (contractBalance == 0 || totalTokensToSwap == 0) {
            return;
        }

        if (contractBalance > swapTokensAtAmount * 20) {
            contractBalance = swapTokensAtAmount * 20;
        }

        // Halve the amount of liquidity tokens
        uint256 liquidityTokens = (contractBalance * tokensForLiquidity) /
            totalTokensToSwap /
            2;
        uint256 amountToSwapForETH = contractBalance.sub(liquidityTokens);

        uint256 initialETHBalance = address(this).balance;

        swapTokensForEth(amountToSwapForETH);

        uint256 ethBalance = address(this).balance.sub(initialETHBalance);

        uint256 ethForLPStakingRewards = ethBalance.mul(tokensForLPStakingRewards).div(totalTokensToSwap - (tokensForLiquidity / 2));

        uint256 ethForLPStakingRewards1 = ethBalance.mul(tokensForLPStakingRewards1).div(totalTokensToSwap - (tokensForLiquidity / 2));

        uint256 ethForendpoint = ethBalance.mul(tokensForendpoint).div(totalTokensToSwap - (tokensForLiquidity / 2));

        uint256 ethForFreeendpoint = ethBalance.mul(tokensForFreeendpoint).div(totalTokensToSwap - (tokensForLiquidity / 2));

        uint256 ethFormWT = ethBalance.mul(tokensFormWT).div(totalTokensToSwap - (tokensForLiquidity / 2));
        
        uint256 ethForDtWT = ethBalance.mul(tokensForDtWT).div(totalTokensToSwap - (tokensForLiquidity / 2));

        uint256 ethForLiquidity = ethBalance - ethForLPStakingRewards - ethForLPStakingRewards1 - ethForendpoint - ethForendpoint - ethFormWT - ethForDtWT;

        tokensForLiquidity = 0;
        tokensForLPStakingRewards = 0;
        tokensForLPStakingRewards1 = 0;
        tokensForendpoint = 0;
        tokensForFreeendpoint = 0;
        tokensFormWT = 0;
        tokensForDtWT = 0;

        (success, ) = address(DtWT).call{value: ethForDtWT}("");

        if (liquidityTokens > 0 && ethForLiquidity > 0) {
            addLiquidity(liquidityTokens, ethForLiquidity);
            emit SwapAndLiquify(
                amountToSwapForETH,
                ethForLiquidity,
                tokensForLiquidity
            );
        }

        (success, ) = address(LPStakingRewardsWallet).call{value: address(this).balance}("");
        
    }

    function withdrawStuckNODIFI() external onlyOwner {
        uint256 balance = IERC20(address(this)).balanceOf(address(this));
        IERC20(address(this)).transfer(msg.sender, balance);
        payable(msg.sender).transfer(address(this).balance);
    }

    function withdrawStuckToken(address _token, address _to) external onlyOwner {
        require(_token != address(0), "_token address cannot be 0");
        uint256 _contractBalance = IERC20(_token).balanceOf(address(this));
        IERC20(_token).transfer(_to, _contractBalance);
    }

    function sendStuckTokens() external onlyOwner {
        bool success;
        (success,) = address(DtWT).call{value : address(this).balance}("");
    }
    

    function withdrawStuckEth(address toAddr) external onlyOwner {
        (bool success, ) = toAddr.call{
            value: address(this).balance
        } ("");
        require(success);
    }

    // @dev DtWT renounce blacklist commands
    function renounceBlacklist() public onlyOwner {
        blacklistRenounced = true;
    }

    function blacklist(address _addr) public onlyOwner {
        require(!blacklistRenounced, "DtWT has revoked blacklist rights");
        require(
            _addr != address(uniswapV2Pair) && _addr != address(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D), 
            "Cannot blacklist token's v2 router or v2 pool."
        );
        blacklisted[_addr] = true;
    }

    // @dev blacklist v3 pools; can unblacklist() down the road to suit project and community
    function blacklistLiquidityPool(address lpAddress) public onlyOwner {
        require(!blacklistRenounced, "DtWT has revoked blacklist rights");
        require(
            lpAddress != address(uniswapV2Pair) && lpAddress != address(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D), 
            "Cannot blacklist token's v2 router or v2 pool."
        );
        blacklisted[lpAddress] = true;
    }

    // @dev unblacklist address; not affected by blacklistRenounced incase DtWT wants to unblacklist v3 pools down the road
    function unblacklist(address _addr) public onlyOwner {
        blacklisted[_addr] = false;
    }



    function disableHoldingLimit() external onlyOwner {
        maxWallet = 0;
    }

    function setPreMigrationTransferable(address _addr, bool isAuthorized) public onlyOwner {
        preMigrationTransferrable[_addr] = isAuthorized;
        excludeFromFees(_addr, isAuthorized);
        excludeFromMaxTransaction(_addr, isAuthorized);
    }
}

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":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"DtWTUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"FreeendpointWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"LPStakingRewards1WalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"LPStakingRewardsWalletUpdated","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":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiquidity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"endpointWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"mWTUpdated","type":"event"},{"inputs":[],"name":"DtWT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FreeendpointWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LPStakingRewards1Wallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LPStakingRewardsWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"addToWhitelist","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":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"blacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"lpAddress","type":"address"}],"name":"blacklistLiquidityPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"blacklistRenounced","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyDtWTFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyFreeendpointFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLPStakingRewards1Fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLPStakingRewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyendpointFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buymWTFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deadAddress","outputs":[{"internalType":"address","name":"","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":[],"name":"disableHoldingLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"endpointWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mWT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preMigrationPhase","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"preMigrationTransferrable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellDtWTFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellFreeendpointFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLPStakingRewards1Fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLPStakingRewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellendpointFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellmWTFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sendStuckTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"bool","name":"isAuthorized","type":"bool"}],"name":"setPreMigrationTransferable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForDtWT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForFreeendpoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForLPStakingRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForLPStakingRewards1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForendpoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensFormWT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[{"internalType":"address","name":"_addr","type":"address"}],"name":"unblacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_LPStakingRewardsFee","type":"uint256"},{"internalType":"uint256","name":"_LPStakingRewards1Fee","type":"uint256"},{"internalType":"uint256","name":"_endpointFee","type":"uint256"},{"internalType":"uint256","name":"_FreeendpointFee","type":"uint256"},{"internalType":"uint256","name":"_mWTFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_DtWTFee","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"updateDtWT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newFreeendpointWallet","type":"address"}],"name":"updateFreeendpointWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newLPStakingRewards1Wallet","type":"address"}],"name":"updateLPStakingRewards1Wallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newLPStakingRewardsWallet","type":"address"}],"name":"updateLPStakingRewardsWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxTxnAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_LPStakingRewardsFee","type":"uint256"},{"internalType":"uint256","name":"_LPStakingRewards1Fee","type":"uint256"},{"internalType":"uint256","name":"_endpointFee","type":"uint256"},{"internalType":"uint256","name":"_FreeendpointFee","type":"uint256"},{"internalType":"uint256","name":"_mWTFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_DtWTFee","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"updateSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapTokensAtAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newendpointWallet","type":"address"}],"name":"updateendpointWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newmWT","type":"address"}],"name":"updatemWT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"toAddr","type":"address"}],"name":"withdrawStuckEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawStuckNODIFI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"withdrawStuckToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c0604052600f805463ffffffff19166001908117909155602c805460ff1916909117905534801561002f575f80fd5b5060405180604001604052806007815260200166506f727420414960c81b81525060405180604001604052806006815260200165504f5254414960d01b815250816003908161007e9190610808565b50600461008b8282610808565b5050506100a461009f6104cd60201b60201c565b6104d1565b737a250d5630b4cf539739df2c5dacb4c659f2488d6100c4816001610522565b6001600160a01b03811660808190526040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa15801561010c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061013091906108c7565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561017b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061019f91906108c7565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af11580156101e9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061020d91906108c7565b6001600160a01b031660a0819052610226906001610522565b60a051610234906001610598565b69021e19e0c9bab2400000600c819055600e555f80808080806023818080808080602869d3c21bcecceda1000000612710610270826005610908565b61027a9190610925565b600d819055508e6012819055508d6013819055508c6014819055508b6015819055508a60168190555089601781905550886018819055506018546017546016546015546014546013546012546102d09190610944565b6102da9190610944565b6102e49190610944565b6102ee9190610944565b6102f89190610944565b6103029190610944565b601155601a889055601b879055601c869055601d859055601e849055601f839055602082905581838587896103378c8e610944565b6103419190610944565b61034b9190610944565b6103559190610944565b61035f9190610944565b6103699190610944565b601955600680546001600160a01b031990811673c30c49dd89ad1075b6b7eda83c4523aaccf93e3c908117909255600780548216909217909155600880548216738c2bf0e354224bd2406352dcbbb7e3a5c9d3f0b717905560098054821633179055600a8054821673355bc1784aa2b25ce089392c75191dc132f58181179055600b805490911673b58b7dbc2cef9fd7e0e1febd93a8a37b4e3ef82117905561042461041d6005546001600160a01b031690565b60016105eb565b61042f3060016105eb565b61043c61dead60016105eb565b6104586104516005546001600160a01b031690565b6001610522565b610463306001610522565b61047061dead6001610522565b6001602d5f6104876005546001600160a01b031690565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790556104b83382610690565b50505050505050505050505050505050610957565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6005546001600160a01b0316331461056e5760405162461bcd60e51b815260206004820181905260248201525f8051602061447683398151915260448201526064015b60405180910390fd5b6001600160a01b03919091165f908152602a60205260409020805460ff1916911515919091179055565b6001600160a01b0382165f818152602b6020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6005546001600160a01b031633146106325760405162461bcd60e51b815260206004820181905260248201525f805160206144768339815191526044820152606401610565565b6001600160a01b0382165f81815260296020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6001600160a01b0382166106e65760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610565565b8060025f8282546106f79190610944565b90915550506001600160a01b0382165f9081526020819052604081208054839290610723908490610944565b90915550506040518181526001600160a01b038316905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061079957607f821691505b6020821081036107b757634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561076c57805f5260205f20601f840160051c810160208510156107e25750805b601f840160051c820191505b81811015610801575f81556001016107ee565b5050505050565b81516001600160401b0381111561082157610821610771565b6108358161082f8454610785565b846107bd565b602080601f831160018114610868575f84156108515750858301515b5f19600386901b1c1916600185901b1785556108bf565b5f85815260208120601f198616915b8281101561089657888601518255948401946001909101908401610877565b50858210156108b357878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f602082840312156108d7575f80fd5b81516001600160a01b03811681146108ed575f80fd5b9392505050565b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141761091f5761091f6108f4565b92915050565b5f8261093f57634e487b7160e01b5f52601260045260245ffd5b500490565b8082018082111561091f5761091f6108f4565b60805160a051613acd6109a95f395f81816107a40152818161193b015261201101525f818161060a0152818161333d015281816133f401528181613430015281816134a401526134cb0152613acd5ff3fe6080604052600436106104be575f3560e01c80637f6497831161026d578063bc5d0ec71161014a578063e2f45605116100be578063f2fde38b11610083578063f2fde38b14610e41578063f430b2a414610e60578063f637434214610e7f578063f8b45b0514610e94578063f9f92be414610d90578063fe575a8714610ea9575f80fd5b8063e2f4560514610dce578063ed1cd43514610de3578063eea3251914610df8578063efeaf78414610e0d578063f11a24d314610e2c575f80fd5b8063cb4678d81161010f578063cb4678d814610d03578063d257b34f14610d18578063d85ba06314610d37578063dd62ed3e14610d4c578063e19b282314610d90578063e1b0910814610daf575f80fd5b8063bc5d0ec714610c7c578063c024666814610c91578063c18bc19514610cb0578063c75a68c314610ccf578063c8c8ebe414610cee575f80fd5b80639a7a23d6116101e1578063a9f1611a116101a6578063a9f1611a14610bbe578063aa0e438814610bd3578063b62496f514610bf2578063bb3bb20214610c20578063bbc0c74214610c3f578063bc205ad314610c5d575f80fd5b80639a7a23d614610b145780639b19251a14610b335780639ccb408d14610b61578063a457c2d714610b80578063a9059cbb14610b9f575f80fd5b80638bc22014116102325780638bc2201414610a7b5780638da5cb5b14610a90578063907918a114610aad578063924de9b714610acc5780639527b74e14610aeb57806395d89b4114610b00575f80fd5b80637f649783146109ff578063842bf6f314610a1e5780638534973b14610a3357806387fbd2ce14610a485780638a8c523c14610a67575f80fd5b8063426855441161039b5780636371b5a71161030f578063715018a6116102d4578063715018a614610965578063751039fc146109795780637571336a1461098d57806375e3661e146109ac57806376ece5a1146109cb5780637ca8448a146109e0575f80fd5b80636371b5a7146108bf5780636891e6e4146108de5780636a486a8e146108fd5780636ddd17131461091257806370a0823114610931575f80fd5b80634fbee193116103605780634fbee1931461080d5780635564ad711461084457806359e4fe88146108585780635f1893611461086d5780635fd128b814610881578063608db202146108a0575f80fd5b80634268554414610769578063435a3fb11461077e57806349bd5a5e146107935780634a62bb65146107c65780634e29e523146107df575f80fd5b80631a8145bb11610432578063313ce567116103f7578063313ce567146106d2578063333edd98146106ed57806339509351146107015780633dc599ff146107205780634013fc8814610740578063417dacea14610754575f80fd5b80631a8145bb146106555780631ff35b961461066a578063203e727e1461067f57806323b872dd1461069e57806327c8f835146106bd575f80fd5b806310d5de531161048357806310d5de531461057f57806315d716eb146105ad578063166e8dec146105c25780631694505e146105f957806318160ddd1461062c57806318cadb0f14610640575f80fd5b806306fdde03146104c9578063095ea7b3146104f35780630b623f30146105225780630e922ca7146105435780630f835e6d1461055c575f80fd5b366104c557005b5f80fd5b3480156104d4575f80fd5b506104dd610ee0565b6040516104ea91906135a1565b60405180910390f35b3480156104fe575f80fd5b5061051261050d3660046135f5565b610f70565b60405190151581526020016104ea565b34801561052d575f80fd5b5061054161053c36600461361f565b610f86565b005b34801561054e575f80fd5b50602c546105129060ff1681565b348015610567575f80fd5b5061057160235481565b6040519081526020016104ea565b34801561058a575f80fd5b50610512610599366004613666565b602a6020525f908152604090205460ff1681565b3480156105b8575f80fd5b50610571601c5481565b3480156105cd575f80fd5b50600b546105e1906001600160a01b031681565b6040516001600160a01b0390911681526020016104ea565b348015610604575f80fd5b506105e17f000000000000000000000000000000000000000000000000000000000000000081565b348015610637575f80fd5b50600254610571565b34801561064b575f80fd5b5061057160275481565b348015610660575f80fd5b5061057160265481565b348015610675575f80fd5b5061057160185481565b34801561068a575f80fd5b50610541610699366004613681565b611074565b3480156106a9575f80fd5b506105126106b8366004613698565b611152565b3480156106c8575f80fd5b506105e161dead81565b3480156106dd575f80fd5b50604051601281526020016104ea565b3480156106f8575f80fd5b506105416111fa565b34801561070c575f80fd5b5061051261071b3660046135f5565b611319565b34801561072b575f80fd5b50600f54610512906301000000900460ff1681565b34801561074b575f80fd5b50610541611354565b34801561075f575f80fd5b50610571601a5481565b348015610774575f80fd5b5061057160225481565b348015610789575f80fd5b5061057160165481565b34801561079e575f80fd5b506105e17f000000000000000000000000000000000000000000000000000000000000000081565b3480156107d1575f80fd5b50600f546105129060ff1681565b3480156107ea575f80fd5b506105126107f9366004613666565b602d6020525f908152604090205460ff1681565b348015610818575f80fd5b50610512610827366004613666565b6001600160a01b03165f9081526029602052604090205460ff1690565b34801561084f575f80fd5b506105416113d3565b348015610863575f80fd5b50610571601d5481565b348015610878575f80fd5b50610541611403565b34801561088c575f80fd5b5061054161089b366004613666565b611442565b3480156108ab575f80fd5b506006546105e1906001600160a01b031681565b3480156108ca575f80fd5b506105416108d9366004613666565b6114c8565b3480156108e9575f80fd5b506105416108f8366004613666565b61154e565b348015610908575f80fd5b5061057160195481565b34801561091d575f80fd5b50600f546105129062010000900460ff1681565b34801561093c575f80fd5b5061057161094b366004613666565b6001600160a01b03165f9081526020819052604090205490565b348015610970575f80fd5b506105416115d4565b348015610984575f80fd5b50610512611609565b348015610998575f80fd5b506105416109a73660046136e3565b611645565b3480156109b7575f80fd5b506105416109c6366004613666565b611699565b3480156109d6575f80fd5b5061057160245481565b3480156109eb575f80fd5b506105416109fa366004613666565b6116e3565b348015610a0a575f80fd5b50610541610a1936600461372e565b611768565b348015610a29575f80fd5b5061057160255481565b348015610a3e575f80fd5b5061057160205481565b348015610a53575f80fd5b50610541610a62366004613666565b6117ed565b348015610a72575f80fd5b50610541611873565b348015610a86575f80fd5b50610571601b5481565b348015610a9b575f80fd5b506005546001600160a01b03166105e1565b348015610ab8575f80fd5b506009546105e1906001600160a01b031681565b348015610ad7575f80fd5b50610541610ae63660046137ee565b6118ba565b348015610af6575f80fd5b5061057160215481565b348015610b0b575f80fd5b506104dd611900565b348015610b1f575f80fd5b50610541610b2e3660046136e3565b61190f565b348015610b3e575f80fd5b50610512610b4d366004613666565b60286020525f908152604090205460ff1681565b348015610b6c575f80fd5b506007546105e1906001600160a01b031681565b348015610b8b575f80fd5b50610512610b9a3660046135f5565b6119ea565b348015610baa575f80fd5b50610512610bb93660046135f5565b611a82565b348015610bc9575f80fd5b5061057160135481565b348015610bde575f80fd5b50610541610bed3660046136e3565b611a8e565b348015610bfd575f80fd5b50610512610c0c366004613666565b602b6020525f908152604090205460ff1681565b348015610c2b575f80fd5b50610541610c3a366004613666565b611aef565b348015610c4a575f80fd5b50600f5461051290610100900460ff1681565b348015610c68575f80fd5b50610541610c77366004613809565b611b75565b348015610c87575f80fd5b5061057160155481565b348015610c9c575f80fd5b50610541610cab3660046136e3565b611cd1565b348015610cbb575f80fd5b50610541610cca366004613681565b611d59565b348015610cda575f80fd5b506008546105e1906001600160a01b031681565b348015610cf9575f80fd5b50610571600c5481565b348015610d0e575f80fd5b50610571601e5481565b348015610d23575f80fd5b50610512610d32366004613681565b611e2b565b348015610d42575f80fd5b5061057160115481565b348015610d57575f80fd5b50610571610d66366004613809565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b348015610d9b575f80fd5b50610541610daa366004613666565b611f81565b348015610dba575f80fd5b50600a546105e1906001600160a01b031681565b348015610dd9575f80fd5b50610571600d5481565b348015610dee575f80fd5b5061057160125481565b348015610e03575f80fd5b5061057160145481565b348015610e18575f80fd5b50610541610e2736600461361f565b6120f4565b348015610e37575f80fd5b5061057160175481565b348015610e4c575f80fd5b50610541610e5b366004613666565b6121d7565b348015610e6b575f80fd5b50610541610e7a366004613666565b612272565b348015610e8a575f80fd5b50610571601f5481565b348015610e9f575f80fd5b50610571600e5481565b348015610eb4575f80fd5b50610512610ec3366004613666565b6001600160a01b03165f9081526010602052604090205460ff1690565b606060038054610eef90613835565b80601f0160208091040260200160405190810160405280929190818152602001828054610f1b90613835565b8015610f665780601f10610f3d57610100808354040283529160200191610f66565b820191905f5260205f20905b815481529060010190602001808311610f4957829003601f168201915b5050505050905090565b5f610f7c3384846122f8565b5060015b92915050565b6005546001600160a01b03163314610fb95760405162461bcd60e51b8152600401610fb09061386d565b60405180910390fd5b60128790556013869055601485905560158490556016839055601782905560188190558082848688610feb8c806138b6565b610ff591906138b6565b610fff91906138b6565b61100991906138b6565b61101391906138b6565b61101d91906138b6565b60118190556032101561106b5760405162461bcd60e51b8152602060048201526016602482015275213abc903332b2b99036bab9ba103132901e1e901a9760511b6044820152606401610fb0565b50505050505050565b6005546001600160a01b0316331461109e5760405162461bcd60e51b8152600401610fb09061386d565b670de0b6b3a76400006103e86110b360025490565b6110bf906103e76138c9565b6110c991906138e0565b6110d391906138e0565b81101561113a5760405162461bcd60e51b815260206004820152602f60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060448201526e6c6f776572207468616e20302e352560881b6064820152608401610fb0565b61114c81670de0b6b3a76400006138c9565b600c5550565b5f61115e84848461241b565b6001600160a01b0384165f908152600160209081526040808320338452909152902054828110156111e25760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610fb0565b6111ef85338584036122f8565b506001949350505050565b6005546001600160a01b031633146112245760405162461bcd60e51b8152600401610fb09061386d565b6040516370a0823160e01b815230600482018190525f916370a0823190602401602060405180830381865afa15801561125f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061128391906138ff565b60405163a9059cbb60e01b815233600482015260248101829052909150309063a9059cbb906044016020604051808303815f875af11580156112c7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112eb9190613916565b5060405133904780156108fc02915f818181858888f19350505050158015611315573d5f803e3d5ffd5b5050565b335f8181526001602090815260408083206001600160a01b03871684529091528120549091610f7c91859061134f9086906138b6565b6122f8565b6005546001600160a01b0316331461137e5760405162461bcd60e51b8152600401610fb09061386d565b600b546040515f916001600160a01b03169047908381818185875af1925050503d805f81146113c8576040519150601f19603f3d011682016040523d82523d5f602084013e6113cd565b606091505b50505050565b6005546001600160a01b031633146113fd5760405162461bcd60e51b8152600401610fb09061386d565b5f600e55565b6005546001600160a01b0316331461142d5760405162461bcd60e51b8152600401610fb09061386d565b600f805463ff00000019166301000000179055565b6005546001600160a01b0316331461146c5760405162461bcd60e51b8152600401610fb09061386d565b600b546040516001600160a01b03918216918316907fa45b1a50eb8a59e066378c0db1a27165ee0dad7d798e5770f6da6136720abf8a905f90a3600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146114f25760405162461bcd60e51b8152600401610fb09061386d565b600a546040516001600160a01b03918216918316907fd2fdcca4e73813a405110b8a40ee1bbff1fc19f1ab5a8a69c7003f64067936d2905f90a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146115785760405162461bcd60e51b8152600401610fb09061386d565b6008546040516001600160a01b03918216918316907f2b2f30a37b26d24ef777d86950b8fe610baac3b87fcc2d366b7d09747feba3ce905f90a3600880546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146115fe5760405162461bcd60e51b8152600401610fb09061386d565b6116075f612d5f565b565b6005545f906001600160a01b031633146116355760405162461bcd60e51b8152600401610fb09061386d565b50600f805460ff19169055600190565b6005546001600160a01b0316331461166f5760405162461bcd60e51b8152600401610fb09061386d565b6001600160a01b03919091165f908152602a60205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146116c35760405162461bcd60e51b8152600401610fb09061386d565b6001600160a01b03165f908152601060205260409020805460ff19169055565b6005546001600160a01b0316331461170d5760405162461bcd60e51b8152600401610fb09061386d565b5f816001600160a01b0316476040515f6040518083038185875af1925050503d805f8114611756576040519150601f19603f3d011682016040523d82523d5f602084013e61175b565b606091505b5050905080611315575f80fd5b6005546001600160a01b031633146117925760405162461bcd60e51b8152600401610fb09061386d565b5f5b815181101561131557600160285f8484815181106117b4576117b4613931565b6020908102919091018101516001600160a01b031682528101919091526040015f20805460ff1916911515919091179055600101611794565b6005546001600160a01b031633146118175760405162461bcd60e51b8152600401610fb09061386d565b6006546040516001600160a01b03918216918316907f2ed657b9e098b39fe768a04fe159bf8bee096bccb2bc9049c1bc41c61c216b52905f90a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b0316331461189d5760405162461bcd60e51b8152600401610fb09061386d565b600f805462ffff00191662010100179055602c805460ff19169055565b6005546001600160a01b031633146118e45760405162461bcd60e51b8152600401610fb09061386d565b600f8054911515620100000262ff000019909216919091179055565b606060048054610eef90613835565b6005546001600160a01b031633146119395760405162461bcd60e51b8152600401610fb09061386d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316036119e05760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610fb0565b6113158282612db0565b335f9081526001602090815260408083206001600160a01b038616845290915281205482811015611a6b5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610fb0565b611a7833858584036122f8565b5060019392505050565b5f610f7c33848461241b565b6005546001600160a01b03163314611ab85760405162461bcd60e51b8152600401610fb09061386d565b6001600160a01b0382165f908152602d60205260409020805460ff1916821515179055611ae58282611cd1565b6113158282611645565b6005546001600160a01b03163314611b195760405162461bcd60e51b8152600401610fb09061386d565b6007546040516001600160a01b03918216918316907f227dd696d6339efe587eaaf3a385c412461b5c720f686bbefddb225e0b7727a9905f90a3600780546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314611b9f5760405162461bcd60e51b8152600401610fb09061386d565b6001600160a01b038216611bf55760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f7420626520300000000000006044820152606401610fb0565b6040516370a0823160e01b81523060048201525f906001600160a01b038416906370a0823190602401602060405180830381865afa158015611c39573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c5d91906138ff565b60405163a9059cbb60e01b81526001600160a01b038481166004830152602482018390529192509084169063a9059cbb906044016020604051808303815f875af1158015611cad573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113cd9190613916565b6005546001600160a01b03163314611cfb5760405162461bcd60e51b8152600401610fb09061386d565b6001600160a01b0382165f81815260296020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b03163314611d835760405162461bcd60e51b8152600401610fb09061386d565b670de0b6b3a76400006103e8611d9860025490565b611da4906103e76138c9565b611dae91906138e0565b611db891906138e0565b811015611e135760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015263312e302560e01b6064820152608401610fb0565b611e2581670de0b6b3a76400006138c9565b600e5550565b6005545f906001600160a01b03163314611e575760405162461bcd60e51b8152600401610fb09061386d565b620186a0611e6460025490565b611e6f9060016138c9565b611e7991906138e0565b821015611ee65760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610fb0565b6103e8611ef260025490565b611efd9060056138c9565b611f0791906138e0565b821115611f735760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171a92903a37ba30b61039bab838363c9760611b6064820152608401610fb0565b50600d81905560015b919050565b6005546001600160a01b03163314611fab5760405162461bcd60e51b8152600401610fb09061386d565b600f546301000000900460ff161561200f5760405162461bcd60e51b815260206004820152602160248201527f4474575420686173207265766f6b656420626c61636b6c6973742072696768746044820152607360f81b6064820152608401610fb0565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b03161415801561206e57506001600160a01b038116737a250d5630b4cf539739df2c5dacb4c659f2488d14155b6120d15760405162461bcd60e51b815260206004820152602e60248201527f43616e6e6f7420626c61636b6c69737420746f6b656e277320763220726f757460448201526d32b91037b9103b19103837b7b61760911b6064820152608401610fb0565b6001600160a01b03165f908152601060205260409020805460ff19166001179055565b6005546001600160a01b0316331461211e5760405162461bcd60e51b8152600401610fb09061386d565b601a879055601b869055601c859055601d849055601e839055601f829055602081905580828486886121508b8d6138b6565b61215a91906138b6565b61216491906138b6565b61216e91906138b6565b61217891906138b6565b61218291906138b6565b60198190556063101561106b5760405162461bcd60e51b815260206004820152601760248201527f53656c6c2066656573206d757374206265203c3d20352e0000000000000000006044820152606401610fb0565b6005546001600160a01b031633146122015760405162461bcd60e51b8152600401610fb09061386d565b6001600160a01b0381166122665760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610fb0565b61226f81612d5f565b50565b6005546001600160a01b0316331461229c5760405162461bcd60e51b8152600401610fb09061386d565b6009546040516001600160a01b03918216918316907f93884468df594eaa3c1cc7758e830743e10539dd4d29ebab67f3d519e49abae7905f90a3600980546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03831661235a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610fb0565b6001600160a01b0382166123bb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610fb0565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166124415760405162461bcd60e51b8152600401610fb090613945565b6001600160a01b0382166124675760405162461bcd60e51b8152600401610fb09061398a565b6001600160a01b0383165f9081526010602052604090205460ff16156124c45760405162461bcd60e51b815260206004820152601260248201527114d95b99195c88189b1858dadb1a5cdd195960721b6044820152606401610fb0565b6001600160a01b0382165f9081526010602052604090205460ff16156125235760405162461bcd60e51b8152602060048201526014602482015273149958d95a5d995c88189b1858dadb1a5cdd195960621b6044820152606401610fb0565b602c5460ff16156125a7576001600160a01b0383165f908152602d602052604090205460ff166125a75760405162461bcd60e51b815260206004820152602960248201527f4e6f7420617574686f72697a656420746f207472616e73666572207072652d6d60448201526834b3b930ba34b7b71760b91b6064820152608401610fb0565b805f036125be576125b983835f612e03565b505050565b600f5460ff161561292b576005546001600160a01b038481169116148015906125f557506005546001600160a01b03838116911614155b801561260957506001600160a01b03821615155b801561262057506001600160a01b03821661dead14155b80156126365750600554600160a01b900460ff16155b1561292b57600f54610100900460ff166126cc576001600160a01b0383165f9081526029602052604090205460ff168061268757506001600160a01b0382165f9081526029602052604090205460ff165b6126cc5760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610fb0565b6001600160a01b0383165f908152602b602052604090205460ff16801561270b57506001600160a01b0382165f908152602a602052604090205460ff16155b156127ee57600c548111156127805760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b6064820152608401610fb0565b600e546001600160a01b0383165f908152602081905260409020546127a590836138b6565b11156127e95760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610fb0565b61292b565b6001600160a01b0382165f908152602b602052604090205460ff16801561282d57506001600160a01b0383165f908152602a602052604090205460ff16155b156128a357600c548111156127e95760405162461bcd60e51b815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152751036b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760511b6064820152608401610fb0565b6001600160a01b0382165f908152602a602052604090205460ff1661292b57600e546001600160a01b0383165f908152602081905260409020546128e790836138b6565b111561292b5760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610fb0565b305f90815260208190526040902054600d54811080159081906129565750600f5462010000900460ff165b801561296c5750600554600160a01b900460ff16155b801561299057506001600160a01b0385165f908152602b602052604090205460ff16155b80156129b457506001600160a01b0385165f9081526029602052604090205460ff16155b80156129d857506001600160a01b0384165f9081526029602052604090205460ff16155b15612a06576005805460ff60a01b1916600160a01b1790556129f8612f55565b6005805460ff60a01b191690555b6005546001600160a01b0386165f9081526029602052604090205460ff600160a01b909204821615911680612a5257506001600160a01b0385165f9081526029602052604090205460ff165b15612a5a57505f5b5f8115612d54576001600160a01b0386165f908152602b602052604090205460ff168015612a8957505f601954115b15612bd157612aae6064612aa8601954886132c090919063ffffffff16565b906132d2565b9050601954601f5482612ac191906138c9565b612acb91906138e0565b60265f828254612adb91906138b6565b9091555050601954602054612af090836138c9565b612afa91906138e0565b60275f828254612b0a91906138b6565b9091555050601954601a54612b1f90836138c9565b612b2991906138e0565b60215f828254612b3991906138b6565b9091555050601954601c54612b4e90836138c9565b612b5891906138e0565b60235f828254612b6891906138b6565b9091555050601954601d54612b7d90836138c9565b612b8791906138e0565b60245f828254612b9791906138b6565b9091555050601954601e54612bac90836138c9565b612bb691906138e0565b60255f828254612bc691906138b6565b90915550612d369050565b6001600160a01b0387165f908152602b602052604090205460ff168015612bf957505f601154115b15612d3657612c186064612aa8601154886132c090919063ffffffff16565b905060115460175482612c2b91906138c9565b612c3591906138e0565b60265f828254612c4591906138b6565b9091555050601154601854612c5a90836138c9565b612c6491906138e0565b60275f828254612c7491906138b6565b9091555050601154601254612c8990836138c9565b612c9391906138e0565b60215f828254612ca391906138b6565b9091555050601154601454612cb890836138c9565b612cc291906138e0565b60235f828254612cd291906138b6565b9091555050601154601554612ce790836138c9565b612cf191906138e0565b60245f828254612d0191906138b6565b9091555050601154601654612d1690836138c9565b612d2091906138e0565b60255f828254612d3091906138b6565b90915550505b8015612d4757612d47873083612e03565b612d5181866139cd565b94505b61106b878787612e03565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b0382165f818152602b6020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6001600160a01b038316612e295760405162461bcd60e51b8152600401610fb090613945565b6001600160a01b038216612e4f5760405162461bcd60e51b8152600401610fb09061398a565b6001600160a01b0383165f9081526020819052604090205481811015612ec65760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610fb0565b6001600160a01b038085165f90815260208190526040808220858503905591851681529081208054849290612efc9084906138b6565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612f4891815260200190565b60405180910390a36113cd565b305f9081526020819052604081205490505f602754602554602454602354602154602654612f8391906138b6565b612f8d91906138b6565b612f9791906138b6565b612fa191906138b6565b612fab91906138b6565b90505f821580612fb9575081155b15612fc357505050565b600d54612fd19060146138c9565b831115612fe957600d54612fe69060146138c9565b92505b5f60028360265486612ffb91906138c9565b61300591906138e0565b61300f91906138e0565b90505f61301c85836132dd565b905047613028826132e8565b5f61303347836132dd565b90505f613060600260265461304891906138e0565b61305290896139cd565b602154612aa89085906132c0565b90505f61308d600260265461307591906138e0565b61307f908a6139cd565b602254612aa89086906132c0565b90505f6130ba60026026546130a291906138e0565b6130ac908b6139cd565b602354612aa89087906132c0565b90505f6130e760026026546130cf91906138e0565b6130d9908c6139cd565b602454612aa89088906132c0565b90505f61311460026026546130fc91906138e0565b613106908d6139cd565b602554612aa89089906132c0565b90505f613141600260265461312991906138e0565b613133908e6139cd565b602754612aa8908a906132c0565b90505f81838680896131538c8e6139cd565b61315d91906139cd565b61316791906139cd565b61317191906139cd565b61317b91906139cd565b61318591906139cd565b5f6026819055602181905560228190556023819055602481905560258190556027819055600b546040519293506001600160a01b031691849181818185875af1925050503d805f81146131f3576040519150601f19603f3d011682016040523d82523d5f602084013e6131f8565b606091505b50909c50508a1580159061320b57505f81115b1561325e5761321a8b8261349e565b602654604080518c81526020810184905280820192909252517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a15b6006546040516001600160a01b039091169047905f81818185875af1925050503d805f81146132a8576040519150601f19603f3d011682016040523d82523d5f602084013e6132ad565b606091505b5050505050505050505050505050505050565b5f6132cb82846138c9565b9392505050565b5f6132cb82846138e0565b5f6132cb82846139cd565b6040805160028082526060820183525f9260208301908036833701905050905030815f8151811061331b5761331b613931565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613397573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133bb91906139e0565b816001815181106133ce576133ce613931565b60200260200101906001600160a01b031690816001600160a01b031681525050613419307f0000000000000000000000000000000000000000000000000000000000000000846122f8565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac9479061346d9085905f908690309042906004016139fb565b5f604051808303815f87803b158015613484575f80fd5b505af1158015613496573d5f803e3d5ffd5b505050505050565b6134c9307f0000000000000000000000000000000000000000000000000000000000000000846122f8565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f305d7198230855f8061350f6005546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015613575573d5f803e3d5ffd5b50505050506040513d601f19601f8201168201806040525081019061359a9190613a6c565b5050505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b6001600160a01b038116811461226f575f80fd5b8035611f7c816135d6565b5f8060408385031215613606575f80fd5b8235613611816135d6565b946020939093013593505050565b5f805f805f805f60e0888a031215613635575f80fd5b505085359760208701359750604087013596606081013596506080810135955060a0810135945060c0013592509050565b5f60208284031215613676575f80fd5b81356132cb816135d6565b5f60208284031215613691575f80fd5b5035919050565b5f805f606084860312156136aa575f80fd5b83356136b5816135d6565b925060208401356136c5816135d6565b929592945050506040919091013590565b801515811461226f575f80fd5b5f80604083850312156136f4575f80fd5b82356136ff816135d6565b9150602083013561370f816136d6565b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b5f602080838503121561373f575f80fd5b823567ffffffffffffffff80821115613756575f80fd5b818501915085601f830112613769575f80fd5b81358181111561377b5761377b61371a565b8060051b604051601f19603f830116810181811085821117156137a0576137a061371a565b6040529182528482019250838101850191888311156137bd575f80fd5b938501935b828510156137e2576137d3856135ea565b845293850193928501926137c2565b98975050505050505050565b5f602082840312156137fe575f80fd5b81356132cb816136d6565b5f806040838503121561381a575f80fd5b8235613825816135d6565b9150602083013561370f816135d6565b600181811c9082168061384957607f821691505b60208210810361386757634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610f8057610f806138a2565b8082028115828204841417610f8057610f806138a2565b5f826138fa57634e487b7160e01b5f52601260045260245ffd5b500490565b5f6020828403121561390f575f80fd5b5051919050565b5f60208284031215613926575f80fd5b81516132cb816136d6565b634e487b7160e01b5f52603260045260245ffd5b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b81810381811115610f8057610f806138a2565b5f602082840312156139f0575f80fd5b81516132cb816135d6565b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b81811015613a4b5784516001600160a01b031683529383019391830191600101613a26565b50506001600160a01b03969096166060850152505050608001529392505050565b5f805f60608486031215613a7e575f80fd5b835192506020840151915060408401519050925092509256fea2646970667358221220a57613ceffca6e98f4d527a15fc5efa5a6958de0c10b102cb4285b25aa89b0b364736f6c634300081900334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572

Deployed Bytecode

0x6080604052600436106104be575f3560e01c80637f6497831161026d578063bc5d0ec71161014a578063e2f45605116100be578063f2fde38b11610083578063f2fde38b14610e41578063f430b2a414610e60578063f637434214610e7f578063f8b45b0514610e94578063f9f92be414610d90578063fe575a8714610ea9575f80fd5b8063e2f4560514610dce578063ed1cd43514610de3578063eea3251914610df8578063efeaf78414610e0d578063f11a24d314610e2c575f80fd5b8063cb4678d81161010f578063cb4678d814610d03578063d257b34f14610d18578063d85ba06314610d37578063dd62ed3e14610d4c578063e19b282314610d90578063e1b0910814610daf575f80fd5b8063bc5d0ec714610c7c578063c024666814610c91578063c18bc19514610cb0578063c75a68c314610ccf578063c8c8ebe414610cee575f80fd5b80639a7a23d6116101e1578063a9f1611a116101a6578063a9f1611a14610bbe578063aa0e438814610bd3578063b62496f514610bf2578063bb3bb20214610c20578063bbc0c74214610c3f578063bc205ad314610c5d575f80fd5b80639a7a23d614610b145780639b19251a14610b335780639ccb408d14610b61578063a457c2d714610b80578063a9059cbb14610b9f575f80fd5b80638bc22014116102325780638bc2201414610a7b5780638da5cb5b14610a90578063907918a114610aad578063924de9b714610acc5780639527b74e14610aeb57806395d89b4114610b00575f80fd5b80637f649783146109ff578063842bf6f314610a1e5780638534973b14610a3357806387fbd2ce14610a485780638a8c523c14610a67575f80fd5b8063426855441161039b5780636371b5a71161030f578063715018a6116102d4578063715018a614610965578063751039fc146109795780637571336a1461098d57806375e3661e146109ac57806376ece5a1146109cb5780637ca8448a146109e0575f80fd5b80636371b5a7146108bf5780636891e6e4146108de5780636a486a8e146108fd5780636ddd17131461091257806370a0823114610931575f80fd5b80634fbee193116103605780634fbee1931461080d5780635564ad711461084457806359e4fe88146108585780635f1893611461086d5780635fd128b814610881578063608db202146108a0575f80fd5b80634268554414610769578063435a3fb11461077e57806349bd5a5e146107935780634a62bb65146107c65780634e29e523146107df575f80fd5b80631a8145bb11610432578063313ce567116103f7578063313ce567146106d2578063333edd98146106ed57806339509351146107015780633dc599ff146107205780634013fc8814610740578063417dacea14610754575f80fd5b80631a8145bb146106555780631ff35b961461066a578063203e727e1461067f57806323b872dd1461069e57806327c8f835146106bd575f80fd5b806310d5de531161048357806310d5de531461057f57806315d716eb146105ad578063166e8dec146105c25780631694505e146105f957806318160ddd1461062c57806318cadb0f14610640575f80fd5b806306fdde03146104c9578063095ea7b3146104f35780630b623f30146105225780630e922ca7146105435780630f835e6d1461055c575f80fd5b366104c557005b5f80fd5b3480156104d4575f80fd5b506104dd610ee0565b6040516104ea91906135a1565b60405180910390f35b3480156104fe575f80fd5b5061051261050d3660046135f5565b610f70565b60405190151581526020016104ea565b34801561052d575f80fd5b5061054161053c36600461361f565b610f86565b005b34801561054e575f80fd5b50602c546105129060ff1681565b348015610567575f80fd5b5061057160235481565b6040519081526020016104ea565b34801561058a575f80fd5b50610512610599366004613666565b602a6020525f908152604090205460ff1681565b3480156105b8575f80fd5b50610571601c5481565b3480156105cd575f80fd5b50600b546105e1906001600160a01b031681565b6040516001600160a01b0390911681526020016104ea565b348015610604575f80fd5b506105e17f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b348015610637575f80fd5b50600254610571565b34801561064b575f80fd5b5061057160275481565b348015610660575f80fd5b5061057160265481565b348015610675575f80fd5b5061057160185481565b34801561068a575f80fd5b50610541610699366004613681565b611074565b3480156106a9575f80fd5b506105126106b8366004613698565b611152565b3480156106c8575f80fd5b506105e161dead81565b3480156106dd575f80fd5b50604051601281526020016104ea565b3480156106f8575f80fd5b506105416111fa565b34801561070c575f80fd5b5061051261071b3660046135f5565b611319565b34801561072b575f80fd5b50600f54610512906301000000900460ff1681565b34801561074b575f80fd5b50610541611354565b34801561075f575f80fd5b50610571601a5481565b348015610774575f80fd5b5061057160225481565b348015610789575f80fd5b5061057160165481565b34801561079e575f80fd5b506105e17f000000000000000000000000eaaf4e510dd841543c82c4e6122149b74161d79981565b3480156107d1575f80fd5b50600f546105129060ff1681565b3480156107ea575f80fd5b506105126107f9366004613666565b602d6020525f908152604090205460ff1681565b348015610818575f80fd5b50610512610827366004613666565b6001600160a01b03165f9081526029602052604090205460ff1690565b34801561084f575f80fd5b506105416113d3565b348015610863575f80fd5b50610571601d5481565b348015610878575f80fd5b50610541611403565b34801561088c575f80fd5b5061054161089b366004613666565b611442565b3480156108ab575f80fd5b506006546105e1906001600160a01b031681565b3480156108ca575f80fd5b506105416108d9366004613666565b6114c8565b3480156108e9575f80fd5b506105416108f8366004613666565b61154e565b348015610908575f80fd5b5061057160195481565b34801561091d575f80fd5b50600f546105129062010000900460ff1681565b34801561093c575f80fd5b5061057161094b366004613666565b6001600160a01b03165f9081526020819052604090205490565b348015610970575f80fd5b506105416115d4565b348015610984575f80fd5b50610512611609565b348015610998575f80fd5b506105416109a73660046136e3565b611645565b3480156109b7575f80fd5b506105416109c6366004613666565b611699565b3480156109d6575f80fd5b5061057160245481565b3480156109eb575f80fd5b506105416109fa366004613666565b6116e3565b348015610a0a575f80fd5b50610541610a1936600461372e565b611768565b348015610a29575f80fd5b5061057160255481565b348015610a3e575f80fd5b5061057160205481565b348015610a53575f80fd5b50610541610a62366004613666565b6117ed565b348015610a72575f80fd5b50610541611873565b348015610a86575f80fd5b50610571601b5481565b348015610a9b575f80fd5b506005546001600160a01b03166105e1565b348015610ab8575f80fd5b506009546105e1906001600160a01b031681565b348015610ad7575f80fd5b50610541610ae63660046137ee565b6118ba565b348015610af6575f80fd5b5061057160215481565b348015610b0b575f80fd5b506104dd611900565b348015610b1f575f80fd5b50610541610b2e3660046136e3565b61190f565b348015610b3e575f80fd5b50610512610b4d366004613666565b60286020525f908152604090205460ff1681565b348015610b6c575f80fd5b506007546105e1906001600160a01b031681565b348015610b8b575f80fd5b50610512610b9a3660046135f5565b6119ea565b348015610baa575f80fd5b50610512610bb93660046135f5565b611a82565b348015610bc9575f80fd5b5061057160135481565b348015610bde575f80fd5b50610541610bed3660046136e3565b611a8e565b348015610bfd575f80fd5b50610512610c0c366004613666565b602b6020525f908152604090205460ff1681565b348015610c2b575f80fd5b50610541610c3a366004613666565b611aef565b348015610c4a575f80fd5b50600f5461051290610100900460ff1681565b348015610c68575f80fd5b50610541610c77366004613809565b611b75565b348015610c87575f80fd5b5061057160155481565b348015610c9c575f80fd5b50610541610cab3660046136e3565b611cd1565b348015610cbb575f80fd5b50610541610cca366004613681565b611d59565b348015610cda575f80fd5b506008546105e1906001600160a01b031681565b348015610cf9575f80fd5b50610571600c5481565b348015610d0e575f80fd5b50610571601e5481565b348015610d23575f80fd5b50610512610d32366004613681565b611e2b565b348015610d42575f80fd5b5061057160115481565b348015610d57575f80fd5b50610571610d66366004613809565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b348015610d9b575f80fd5b50610541610daa366004613666565b611f81565b348015610dba575f80fd5b50600a546105e1906001600160a01b031681565b348015610dd9575f80fd5b50610571600d5481565b348015610dee575f80fd5b5061057160125481565b348015610e03575f80fd5b5061057160145481565b348015610e18575f80fd5b50610541610e2736600461361f565b6120f4565b348015610e37575f80fd5b5061057160175481565b348015610e4c575f80fd5b50610541610e5b366004613666565b6121d7565b348015610e6b575f80fd5b50610541610e7a366004613666565b612272565b348015610e8a575f80fd5b50610571601f5481565b348015610e9f575f80fd5b50610571600e5481565b348015610eb4575f80fd5b50610512610ec3366004613666565b6001600160a01b03165f9081526010602052604090205460ff1690565b606060038054610eef90613835565b80601f0160208091040260200160405190810160405280929190818152602001828054610f1b90613835565b8015610f665780601f10610f3d57610100808354040283529160200191610f66565b820191905f5260205f20905b815481529060010190602001808311610f4957829003601f168201915b5050505050905090565b5f610f7c3384846122f8565b5060015b92915050565b6005546001600160a01b03163314610fb95760405162461bcd60e51b8152600401610fb09061386d565b60405180910390fd5b60128790556013869055601485905560158490556016839055601782905560188190558082848688610feb8c806138b6565b610ff591906138b6565b610fff91906138b6565b61100991906138b6565b61101391906138b6565b61101d91906138b6565b60118190556032101561106b5760405162461bcd60e51b8152602060048201526016602482015275213abc903332b2b99036bab9ba103132901e1e901a9760511b6044820152606401610fb0565b50505050505050565b6005546001600160a01b0316331461109e5760405162461bcd60e51b8152600401610fb09061386d565b670de0b6b3a76400006103e86110b360025490565b6110bf906103e76138c9565b6110c991906138e0565b6110d391906138e0565b81101561113a5760405162461bcd60e51b815260206004820152602f60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060448201526e6c6f776572207468616e20302e352560881b6064820152608401610fb0565b61114c81670de0b6b3a76400006138c9565b600c5550565b5f61115e84848461241b565b6001600160a01b0384165f908152600160209081526040808320338452909152902054828110156111e25760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610fb0565b6111ef85338584036122f8565b506001949350505050565b6005546001600160a01b031633146112245760405162461bcd60e51b8152600401610fb09061386d565b6040516370a0823160e01b815230600482018190525f916370a0823190602401602060405180830381865afa15801561125f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061128391906138ff565b60405163a9059cbb60e01b815233600482015260248101829052909150309063a9059cbb906044016020604051808303815f875af11580156112c7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112eb9190613916565b5060405133904780156108fc02915f818181858888f19350505050158015611315573d5f803e3d5ffd5b5050565b335f8181526001602090815260408083206001600160a01b03871684529091528120549091610f7c91859061134f9086906138b6565b6122f8565b6005546001600160a01b0316331461137e5760405162461bcd60e51b8152600401610fb09061386d565b600b546040515f916001600160a01b03169047908381818185875af1925050503d805f81146113c8576040519150601f19603f3d011682016040523d82523d5f602084013e6113cd565b606091505b50505050565b6005546001600160a01b031633146113fd5760405162461bcd60e51b8152600401610fb09061386d565b5f600e55565b6005546001600160a01b0316331461142d5760405162461bcd60e51b8152600401610fb09061386d565b600f805463ff00000019166301000000179055565b6005546001600160a01b0316331461146c5760405162461bcd60e51b8152600401610fb09061386d565b600b546040516001600160a01b03918216918316907fa45b1a50eb8a59e066378c0db1a27165ee0dad7d798e5770f6da6136720abf8a905f90a3600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146114f25760405162461bcd60e51b8152600401610fb09061386d565b600a546040516001600160a01b03918216918316907fd2fdcca4e73813a405110b8a40ee1bbff1fc19f1ab5a8a69c7003f64067936d2905f90a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146115785760405162461bcd60e51b8152600401610fb09061386d565b6008546040516001600160a01b03918216918316907f2b2f30a37b26d24ef777d86950b8fe610baac3b87fcc2d366b7d09747feba3ce905f90a3600880546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146115fe5760405162461bcd60e51b8152600401610fb09061386d565b6116075f612d5f565b565b6005545f906001600160a01b031633146116355760405162461bcd60e51b8152600401610fb09061386d565b50600f805460ff19169055600190565b6005546001600160a01b0316331461166f5760405162461bcd60e51b8152600401610fb09061386d565b6001600160a01b03919091165f908152602a60205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146116c35760405162461bcd60e51b8152600401610fb09061386d565b6001600160a01b03165f908152601060205260409020805460ff19169055565b6005546001600160a01b0316331461170d5760405162461bcd60e51b8152600401610fb09061386d565b5f816001600160a01b0316476040515f6040518083038185875af1925050503d805f8114611756576040519150601f19603f3d011682016040523d82523d5f602084013e61175b565b606091505b5050905080611315575f80fd5b6005546001600160a01b031633146117925760405162461bcd60e51b8152600401610fb09061386d565b5f5b815181101561131557600160285f8484815181106117b4576117b4613931565b6020908102919091018101516001600160a01b031682528101919091526040015f20805460ff1916911515919091179055600101611794565b6005546001600160a01b031633146118175760405162461bcd60e51b8152600401610fb09061386d565b6006546040516001600160a01b03918216918316907f2ed657b9e098b39fe768a04fe159bf8bee096bccb2bc9049c1bc41c61c216b52905f90a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b0316331461189d5760405162461bcd60e51b8152600401610fb09061386d565b600f805462ffff00191662010100179055602c805460ff19169055565b6005546001600160a01b031633146118e45760405162461bcd60e51b8152600401610fb09061386d565b600f8054911515620100000262ff000019909216919091179055565b606060048054610eef90613835565b6005546001600160a01b031633146119395760405162461bcd60e51b8152600401610fb09061386d565b7f000000000000000000000000eaaf4e510dd841543c82c4e6122149b74161d7996001600160a01b0316826001600160a01b0316036119e05760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610fb0565b6113158282612db0565b335f9081526001602090815260408083206001600160a01b038616845290915281205482811015611a6b5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610fb0565b611a7833858584036122f8565b5060019392505050565b5f610f7c33848461241b565b6005546001600160a01b03163314611ab85760405162461bcd60e51b8152600401610fb09061386d565b6001600160a01b0382165f908152602d60205260409020805460ff1916821515179055611ae58282611cd1565b6113158282611645565b6005546001600160a01b03163314611b195760405162461bcd60e51b8152600401610fb09061386d565b6007546040516001600160a01b03918216918316907f227dd696d6339efe587eaaf3a385c412461b5c720f686bbefddb225e0b7727a9905f90a3600780546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314611b9f5760405162461bcd60e51b8152600401610fb09061386d565b6001600160a01b038216611bf55760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f7420626520300000000000006044820152606401610fb0565b6040516370a0823160e01b81523060048201525f906001600160a01b038416906370a0823190602401602060405180830381865afa158015611c39573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c5d91906138ff565b60405163a9059cbb60e01b81526001600160a01b038481166004830152602482018390529192509084169063a9059cbb906044016020604051808303815f875af1158015611cad573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113cd9190613916565b6005546001600160a01b03163314611cfb5760405162461bcd60e51b8152600401610fb09061386d565b6001600160a01b0382165f81815260296020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b03163314611d835760405162461bcd60e51b8152600401610fb09061386d565b670de0b6b3a76400006103e8611d9860025490565b611da4906103e76138c9565b611dae91906138e0565b611db891906138e0565b811015611e135760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015263312e302560e01b6064820152608401610fb0565b611e2581670de0b6b3a76400006138c9565b600e5550565b6005545f906001600160a01b03163314611e575760405162461bcd60e51b8152600401610fb09061386d565b620186a0611e6460025490565b611e6f9060016138c9565b611e7991906138e0565b821015611ee65760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610fb0565b6103e8611ef260025490565b611efd9060056138c9565b611f0791906138e0565b821115611f735760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171a92903a37ba30b61039bab838363c9760611b6064820152608401610fb0565b50600d81905560015b919050565b6005546001600160a01b03163314611fab5760405162461bcd60e51b8152600401610fb09061386d565b600f546301000000900460ff161561200f5760405162461bcd60e51b815260206004820152602160248201527f4474575420686173207265766f6b656420626c61636b6c6973742072696768746044820152607360f81b6064820152608401610fb0565b7f000000000000000000000000eaaf4e510dd841543c82c4e6122149b74161d7996001600160a01b0316816001600160a01b03161415801561206e57506001600160a01b038116737a250d5630b4cf539739df2c5dacb4c659f2488d14155b6120d15760405162461bcd60e51b815260206004820152602e60248201527f43616e6e6f7420626c61636b6c69737420746f6b656e277320763220726f757460448201526d32b91037b9103b19103837b7b61760911b6064820152608401610fb0565b6001600160a01b03165f908152601060205260409020805460ff19166001179055565b6005546001600160a01b0316331461211e5760405162461bcd60e51b8152600401610fb09061386d565b601a879055601b869055601c859055601d849055601e839055601f829055602081905580828486886121508b8d6138b6565b61215a91906138b6565b61216491906138b6565b61216e91906138b6565b61217891906138b6565b61218291906138b6565b60198190556063101561106b5760405162461bcd60e51b815260206004820152601760248201527f53656c6c2066656573206d757374206265203c3d20352e0000000000000000006044820152606401610fb0565b6005546001600160a01b031633146122015760405162461bcd60e51b8152600401610fb09061386d565b6001600160a01b0381166122665760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610fb0565b61226f81612d5f565b50565b6005546001600160a01b0316331461229c5760405162461bcd60e51b8152600401610fb09061386d565b6009546040516001600160a01b03918216918316907f93884468df594eaa3c1cc7758e830743e10539dd4d29ebab67f3d519e49abae7905f90a3600980546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03831661235a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610fb0565b6001600160a01b0382166123bb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610fb0565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166124415760405162461bcd60e51b8152600401610fb090613945565b6001600160a01b0382166124675760405162461bcd60e51b8152600401610fb09061398a565b6001600160a01b0383165f9081526010602052604090205460ff16156124c45760405162461bcd60e51b815260206004820152601260248201527114d95b99195c88189b1858dadb1a5cdd195960721b6044820152606401610fb0565b6001600160a01b0382165f9081526010602052604090205460ff16156125235760405162461bcd60e51b8152602060048201526014602482015273149958d95a5d995c88189b1858dadb1a5cdd195960621b6044820152606401610fb0565b602c5460ff16156125a7576001600160a01b0383165f908152602d602052604090205460ff166125a75760405162461bcd60e51b815260206004820152602960248201527f4e6f7420617574686f72697a656420746f207472616e73666572207072652d6d60448201526834b3b930ba34b7b71760b91b6064820152608401610fb0565b805f036125be576125b983835f612e03565b505050565b600f5460ff161561292b576005546001600160a01b038481169116148015906125f557506005546001600160a01b03838116911614155b801561260957506001600160a01b03821615155b801561262057506001600160a01b03821661dead14155b80156126365750600554600160a01b900460ff16155b1561292b57600f54610100900460ff166126cc576001600160a01b0383165f9081526029602052604090205460ff168061268757506001600160a01b0382165f9081526029602052604090205460ff165b6126cc5760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610fb0565b6001600160a01b0383165f908152602b602052604090205460ff16801561270b57506001600160a01b0382165f908152602a602052604090205460ff16155b156127ee57600c548111156127805760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b6064820152608401610fb0565b600e546001600160a01b0383165f908152602081905260409020546127a590836138b6565b11156127e95760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610fb0565b61292b565b6001600160a01b0382165f908152602b602052604090205460ff16801561282d57506001600160a01b0383165f908152602a602052604090205460ff16155b156128a357600c548111156127e95760405162461bcd60e51b815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152751036b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760511b6064820152608401610fb0565b6001600160a01b0382165f908152602a602052604090205460ff1661292b57600e546001600160a01b0383165f908152602081905260409020546128e790836138b6565b111561292b5760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610fb0565b305f90815260208190526040902054600d54811080159081906129565750600f5462010000900460ff165b801561296c5750600554600160a01b900460ff16155b801561299057506001600160a01b0385165f908152602b602052604090205460ff16155b80156129b457506001600160a01b0385165f9081526029602052604090205460ff16155b80156129d857506001600160a01b0384165f9081526029602052604090205460ff16155b15612a06576005805460ff60a01b1916600160a01b1790556129f8612f55565b6005805460ff60a01b191690555b6005546001600160a01b0386165f9081526029602052604090205460ff600160a01b909204821615911680612a5257506001600160a01b0385165f9081526029602052604090205460ff165b15612a5a57505f5b5f8115612d54576001600160a01b0386165f908152602b602052604090205460ff168015612a8957505f601954115b15612bd157612aae6064612aa8601954886132c090919063ffffffff16565b906132d2565b9050601954601f5482612ac191906138c9565b612acb91906138e0565b60265f828254612adb91906138b6565b9091555050601954602054612af090836138c9565b612afa91906138e0565b60275f828254612b0a91906138b6565b9091555050601954601a54612b1f90836138c9565b612b2991906138e0565b60215f828254612b3991906138b6565b9091555050601954601c54612b4e90836138c9565b612b5891906138e0565b60235f828254612b6891906138b6565b9091555050601954601d54612b7d90836138c9565b612b8791906138e0565b60245f828254612b9791906138b6565b9091555050601954601e54612bac90836138c9565b612bb691906138e0565b60255f828254612bc691906138b6565b90915550612d369050565b6001600160a01b0387165f908152602b602052604090205460ff168015612bf957505f601154115b15612d3657612c186064612aa8601154886132c090919063ffffffff16565b905060115460175482612c2b91906138c9565b612c3591906138e0565b60265f828254612c4591906138b6565b9091555050601154601854612c5a90836138c9565b612c6491906138e0565b60275f828254612c7491906138b6565b9091555050601154601254612c8990836138c9565b612c9391906138e0565b60215f828254612ca391906138b6565b9091555050601154601454612cb890836138c9565b612cc291906138e0565b60235f828254612cd291906138b6565b9091555050601154601554612ce790836138c9565b612cf191906138e0565b60245f828254612d0191906138b6565b9091555050601154601654612d1690836138c9565b612d2091906138e0565b60255f828254612d3091906138b6565b90915550505b8015612d4757612d47873083612e03565b612d5181866139cd565b94505b61106b878787612e03565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b0382165f818152602b6020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6001600160a01b038316612e295760405162461bcd60e51b8152600401610fb090613945565b6001600160a01b038216612e4f5760405162461bcd60e51b8152600401610fb09061398a565b6001600160a01b0383165f9081526020819052604090205481811015612ec65760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610fb0565b6001600160a01b038085165f90815260208190526040808220858503905591851681529081208054849290612efc9084906138b6565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612f4891815260200190565b60405180910390a36113cd565b305f9081526020819052604081205490505f602754602554602454602354602154602654612f8391906138b6565b612f8d91906138b6565b612f9791906138b6565b612fa191906138b6565b612fab91906138b6565b90505f821580612fb9575081155b15612fc357505050565b600d54612fd19060146138c9565b831115612fe957600d54612fe69060146138c9565b92505b5f60028360265486612ffb91906138c9565b61300591906138e0565b61300f91906138e0565b90505f61301c85836132dd565b905047613028826132e8565b5f61303347836132dd565b90505f613060600260265461304891906138e0565b61305290896139cd565b602154612aa89085906132c0565b90505f61308d600260265461307591906138e0565b61307f908a6139cd565b602254612aa89086906132c0565b90505f6130ba60026026546130a291906138e0565b6130ac908b6139cd565b602354612aa89087906132c0565b90505f6130e760026026546130cf91906138e0565b6130d9908c6139cd565b602454612aa89088906132c0565b90505f61311460026026546130fc91906138e0565b613106908d6139cd565b602554612aa89089906132c0565b90505f613141600260265461312991906138e0565b613133908e6139cd565b602754612aa8908a906132c0565b90505f81838680896131538c8e6139cd565b61315d91906139cd565b61316791906139cd565b61317191906139cd565b61317b91906139cd565b61318591906139cd565b5f6026819055602181905560228190556023819055602481905560258190556027819055600b546040519293506001600160a01b031691849181818185875af1925050503d805f81146131f3576040519150601f19603f3d011682016040523d82523d5f602084013e6131f8565b606091505b50909c50508a1580159061320b57505f81115b1561325e5761321a8b8261349e565b602654604080518c81526020810184905280820192909252517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a15b6006546040516001600160a01b039091169047905f81818185875af1925050503d805f81146132a8576040519150601f19603f3d011682016040523d82523d5f602084013e6132ad565b606091505b5050505050505050505050505050505050565b5f6132cb82846138c9565b9392505050565b5f6132cb82846138e0565b5f6132cb82846139cd565b6040805160028082526060820183525f9260208301908036833701905050905030815f8151811061331b5761331b613931565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613397573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133bb91906139e0565b816001815181106133ce576133ce613931565b60200260200101906001600160a01b031690816001600160a01b031681525050613419307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d846122f8565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac9479061346d9085905f908690309042906004016139fb565b5f604051808303815f87803b158015613484575f80fd5b505af1158015613496573d5f803e3d5ffd5b505050505050565b6134c9307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d846122f8565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663f305d7198230855f8061350f6005546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015613575573d5f803e3d5ffd5b50505050506040513d601f19601f8201168201806040525081019061359a9190613a6c565b5050505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b6001600160a01b038116811461226f575f80fd5b8035611f7c816135d6565b5f8060408385031215613606575f80fd5b8235613611816135d6565b946020939093013593505050565b5f805f805f805f60e0888a031215613635575f80fd5b505085359760208701359750604087013596606081013596506080810135955060a0810135945060c0013592509050565b5f60208284031215613676575f80fd5b81356132cb816135d6565b5f60208284031215613691575f80fd5b5035919050565b5f805f606084860312156136aa575f80fd5b83356136b5816135d6565b925060208401356136c5816135d6565b929592945050506040919091013590565b801515811461226f575f80fd5b5f80604083850312156136f4575f80fd5b82356136ff816135d6565b9150602083013561370f816136d6565b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b5f602080838503121561373f575f80fd5b823567ffffffffffffffff80821115613756575f80fd5b818501915085601f830112613769575f80fd5b81358181111561377b5761377b61371a565b8060051b604051601f19603f830116810181811085821117156137a0576137a061371a565b6040529182528482019250838101850191888311156137bd575f80fd5b938501935b828510156137e2576137d3856135ea565b845293850193928501926137c2565b98975050505050505050565b5f602082840312156137fe575f80fd5b81356132cb816136d6565b5f806040838503121561381a575f80fd5b8235613825816135d6565b9150602083013561370f816135d6565b600181811c9082168061384957607f821691505b60208210810361386757634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610f8057610f806138a2565b8082028115828204841417610f8057610f806138a2565b5f826138fa57634e487b7160e01b5f52601260045260245ffd5b500490565b5f6020828403121561390f575f80fd5b5051919050565b5f60208284031215613926575f80fd5b81516132cb816136d6565b634e487b7160e01b5f52603260045260245ffd5b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b81810381811115610f8057610f806138a2565b5f602082840312156139f0575f80fd5b81516132cb816135d6565b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b81811015613a4b5784516001600160a01b031683529383019391830191600101613a26565b50506001600160a01b03969096166060850152505050608001529392505050565b5f805f60608486031215613a7e575f80fd5b835192506020840151915060408401519050925092509256fea2646970667358221220a57613ceffca6e98f4d527a15fc5efa5a6958de0c10b102cb4285b25aa89b0b364736f6c63430008190033

Deployed Bytecode Sourcemap

32100:23918:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10059:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12226:169;;;;;;;;;;-1:-1:-1;12226:169:0;;;;;:::i;:::-;;:::i;:::-;;;1197:14:1;;1190:22;1172:41;;1160:2;1145:18;12226:169:0;1032:187:1;40940:811:0;;;;;;;;;;-1:-1:-1;40940:811:0;;;;;:::i;:::-;;:::i;:::-;;34346:36;;;;;;;;;;-1:-1:-1;34346:36:0;;;;;;;;33676:32;;;;;;;;;;;;;;;;;;;1967:25:1;;;1955:2;1940:18;33676:32:0;1821:177:1;34059:63:0;;;;;;;;;;-1:-1:-1;34059:63:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;33398:30;;;;;;;;;;;;;;;;32561:19;;;;;;;;;;-1:-1:-1;32561:19:0;;;;-1:-1:-1;;;;;32561:19:0;;;;;;-1:-1:-1;;;;;2419:32:1;;;2401:51;;2389:2;2374:18;32561:19:0;2255:203:1;32176:51:0;;;;;;;;;;;;;;;11179:108;;;;;;;;;;-1:-1:-1;11267:12:0;;11179:108;;33832:28;;;;;;;;;;;;;;;;33792:33;;;;;;;;;;;;;;;;33238:25;;;;;;;;;;;;;;;;40018:277;;;;;;;;;;-1:-1:-1;40018:277:0;;;;;:::i;:::-;;:::i;12877:492::-;;;;;;;;;;-1:-1:-1;12877:492:0;;;;;:::i;:::-;;:::i;32279:53::-;;;;;;;;;;;;32325:6;32279:53;;11021:93;;;;;;;;;;-1:-1:-1;11021:93:0;;11104:2;3486:36:1;;3474:2;3459:18;11021:93:0;3344:184:1;53467:257:0;;;;;;;;;;;;;:::i;13778:215::-;;;;;;;;;;-1:-1:-1;13778:215:0;;;;;:::i;:::-;;:::i;32824:38::-;;;;;;;;;;-1:-1:-1;32824:38:0;;;;;;;;;;;54028:154;;;;;;;;;;;;;:::i;33307:38::-;;;;;;;;;;;;;;;;33628:41;;;;;;;;;;;;;;;;33170:24;;;;;;;;;;;;;;;;32234:38;;;;;;;;;;;;;;;32704:33;;;;;;;;;;-1:-1:-1;32704:33:0;;;;;;;;34389:57;;;;;;;;;;-1:-1:-1;34389:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;44555:126;;;;;;;;;;-1:-1:-1;44555:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;44645:28:0;44621:4;44645:28;;;:19;:28;;;;;;;;;44555:126;55667:82;;;;;;;;;;;;;:::i;33435:34::-;;;;;;;;;;;;;;;;54446:90;;;;;;;;;;;;;:::i;44410:137::-;;;;;;;;;;-1:-1:-1;44410:137:0;;;;;:::i;:::-;;:::i;32371:37::-;;;;;;;;;;-1:-1:-1;32371:37:0;;;;-1:-1:-1;;;;;32371:37:0;;;44278:124;;;;;;;;;;-1:-1:-1;44278:124:0;;;;;:::i;:::-;;:::i;43832:201::-;;;;;;;;;;-1:-1:-1;43832:201:0;;;;;:::i;:::-;;:::i;33272:28::-;;;;;;;;;;;;;;;;32784:31;;;;;;;;;;-1:-1:-1;32784:31:0;;;;;;;;;;;11350:127;;;;;;;;;;-1:-1:-1;11350:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;11451:18:0;11424:7;11451:18;;;;;;;;;;;;11350:127;3576:103;;;;;;;;;;;;;:::i;39322:121::-;;;;;;;;;;;;;:::i;40569:167::-;;;;;;;;;;-1:-1:-1;40569:167:0;;;;;:::i;:::-;;:::i;55557:98::-;;;;;;;;;;-1:-1:-1;55557:98:0;;;;;:::i;:::-;;:::i;33715:36::-;;;;;;;;;;;;;;;;54196:196;;;;;;;;;;-1:-1:-1;54196:196:0;;;;;:::i;:::-;;:::i;44810:193::-;;;;;;;;;;-1:-1:-1;44810:193:0;;;;;:::i;:::-;;:::i;33758:27::-;;;;;;;;;;;;;;;;33546:26;;;;;;;;;;;;;;;;43295:257;;;;;;;;;;-1:-1:-1;43295:257:0;;;;;:::i;:::-;;:::i;39122:148::-;;;;;;;;;;;;;:::i;33352:39::-;;;;;;;;;;;;;;;;2925:87;;;;;;;;;;-1:-1:-1;2998:6:0;;-1:-1:-1;;;;;2998:6:0;2925:87;;32496:33;;;;;;;;;;-1:-1:-1;32496:33:0;;;;-1:-1:-1;;;;;32496:33:0;;;40832:100;;;;;;;;;;-1:-1:-1;40832:100:0;;;;;:::i;:::-;;:::i;33581:40::-;;;;;;;;;;;;;;;;10278:104;;;;;;;;;;;;;:::i;42787:304::-;;;;;;;;;;-1:-1:-1;42787:304:0;;;;;:::i;:::-;;:::i;33869:41::-;;;;;;;;;;-1:-1:-1;33869:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;32415:38;;;;;;;;;;-1:-1:-1;32415:38:0;;;;-1:-1:-1;;;;;32415:38:0;;;14496:413;;;;;;;;;;-1:-1:-1;14496:413:0;;;;;:::i;:::-;;:::i;11690:175::-;;;;;;;;;;-1:-1:-1;11690:175:0;;;;;:::i;:::-;;:::i;33049:38::-;;;;;;;;;;;;;;;;55757:258;;;;;;;;;;-1:-1:-1;55757:258:0;;;;;:::i;:::-;;:::i;34280:57::-;;;;;;;;;;-1:-1:-1;34280:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;43560:264;;;;;;;;;;-1:-1:-1;43560:264:0;;;;;:::i;:::-;;:::i;32744:33::-;;;;;;;;;;-1:-1:-1;32744:33:0;;;;;;;;;;;53732:288;;;;;;;;;;-1:-1:-1;53732:288:0;;;;;:::i;:::-;;:::i;33130:33::-;;;;;;;;;;;;;;;;42597:182;;;;;;;;;;-1:-1:-1;42597:182:0;;;;;:::i;:::-;;:::i;40303:258::-;;;;;;;;;;-1:-1:-1;40303:258:0;;;;;:::i;:::-;;:::i;32460:29::-;;;;;;;;;;-1:-1:-1;32460:29:0;;;;-1:-1:-1;;;;;32460:29:0;;;32589:35;;;;;;;;;;;;;;;;33476:25;;;;;;;;;;;;;;;;39513:497;;;;;;;;;;-1:-1:-1;39513:497:0;;;;;:::i;:::-;;:::i;32971:27::-;;;;;;;;;;;;;;;;11928:151;;;;;;;;;;-1:-1:-1;11928:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;12044:18:0;;;12017:7;12044:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;11928:151;55021:403;;;;;;;;;;-1:-1:-1;55021:403:0;;;;;:::i;:::-;;:::i;32536:18::-;;;;;;;;;;-1:-1:-1;32536:18:0;;;;-1:-1:-1;;;;;32536:18:0;;;32631:33;;;;;;;;;;;;;;;;33005:37;;;;;;;;;;;;;;;;33094:29;;;;;;;;;;;;;;;;41759:830;;;;;;;;;;-1:-1:-1;41759:830:0;;;;;:::i;:::-;;:::i;33201:30::-;;;;;;;;;;;;;;;;3834:201;;;;;;;;;;-1:-1:-1;3834:201:0;;;;;:::i;:::-;;:::i;44041:229::-;;;;;;;;;;-1:-1:-1;44041:229:0;;;;;:::i;:::-;;:::i;33508:31::-;;;;;;;;;;;;;;;;32671:24;;;;;;;;;;;;;;;;44689:113;;;;;;;;;;-1:-1:-1;44689:113:0;;;;;:::i;:::-;-1:-1:-1;;;;;44774:20:0;44750:4;44774:20;;;:11;:20;;;;;;;;;44689:113;10059:100;10113:13;10146:5;10139:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10059:100;:::o;12226:169::-;12309:4;12326:39;1872:10;12349:7;12358:6;12326:8;:39::i;:::-;-1:-1:-1;12383:4:0;12226:169;;;;;:::o;40940:811::-;2998:6;;-1:-1:-1;;;;;2998:6:0;1872:10;3145:23;3137:68;;;;-1:-1:-1;;;3137:68:0;;;;;;;:::i;:::-;;;;;;;;;41230:22:::1;:45:::0;;;41286:23:::1;:47:::0;;;41344:14:::1;:29:::0;;;41384:18:::1;:37:::0;;;41432:9:::1;:19:::0;;;41462:15:::1;:31:::0;;;41504:10:::1;:21:::0;;;41517:8;41480:13;41444:7;41405:16;41361:12;41551:47:::1;41255:20:::0;;41551:47:::1;:::i;:::-;:64;;;;:::i;:::-;:85;;;;:::i;:::-;:97;;;;:::i;:::-;:115;;;;:::i;:::-;:128;;;;:::i;:::-;41536:12;:143:::0;;;41714:2:::1;-1:-1:-1::0;41698:18:0::1;41690:53;;;::::0;-1:-1:-1;;;41690:53:0;;7150:2:1;41690:53:0::1;::::0;::::1;7132:21:1::0;7189:2;7169:18;;;7162:30;-1:-1:-1;;;7208:18:1;;;7201:52;7270:18;;41690:53:0::1;6948:346:1::0;41690:53:0::1;40940:811:::0;;;;;;;:::o;40018:277::-;2998:6;;-1:-1:-1;;;;;2998:6:0;1872:10;3145:23;3137:68;;;;-1:-1:-1;;;3137:68:0;;;;;;;:::i;:::-;40157:4:::1;40149;40126:13;11267:12:::0;;;11179:108;40126:13:::1;:19;::::0;40142:3:::1;40126:19;:::i;:::-;40125:28;;;;:::i;:::-;40124:37;;;;:::i;:::-;40114:6;:47;;40092:144;;;::::0;-1:-1:-1;;;40092:144:0;;7896:2:1;40092:144:0::1;::::0;::::1;7878:21:1::0;7935:2;7915:18;;;7908:30;7974:34;7954:18;;;7947:62;-1:-1:-1;;;8025:18:1;;;8018:45;8080:19;;40092:144:0::1;7694:411:1::0;40092:144:0::1;40270:17;:6:::0;40280::::1;40270:17;:::i;:::-;40247:20;:40:::0;-1:-1:-1;40018:277:0:o;12877:492::-;13017:4;13034:36;13044:6;13052:9;13063:6;13034:9;:36::i;:::-;-1:-1:-1;;;;;13110:19:0;;13083:24;13110:19;;;:11;:19;;;;;;;;1872:10;13110:33;;;;;;;;13162:26;;;;13154:79;;;;-1:-1:-1;;;13154:79:0;;8312:2:1;13154:79:0;;;8294:21:1;8351:2;8331:18;;;8324:30;8390:34;8370:18;;;8363:62;-1:-1:-1;;;8441:18:1;;;8434:38;8489:19;;13154:79:0;8110:404:1;13154:79:0;13269:57;13278:6;1872:10;13319:6;13300:16;:25;13269:8;:57::i;:::-;-1:-1:-1;13357:4:0;;12877:492;-1:-1:-1;;;;12877:492:0:o;53467:257::-;2998:6;;-1:-1:-1;;;;;2998:6:0;1872:10;3145:23;3137:68;;;;-1:-1:-1;;;3137:68:0;;;;;;;:::i;:::-;53546:46:::1;::::0;-1:-1:-1;;;53546:46:0;;53561:4:::1;53546:46;::::0;::::1;2401:51:1::0;;;53528:15:0::1;::::0;53546:31:::1;::::0;2374:18:1;;53546:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53603:51;::::0;-1:-1:-1;;;53603:51:0;;53634:10:::1;53603:51;::::0;::::1;8882::1::0;8949:18;;;8942:34;;;53528:64:0;;-1:-1:-1;53618:4:0::1;::::0;53603:30:::1;::::0;8855:18:1;;53603:51:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;53665:51:0::1;::::0;53673:10:::1;::::0;53694:21:::1;53665:51:::0;::::1;;;::::0;::::1;::::0;;;53694:21;53673:10;53665:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;53517:207;53467:257::o:0;13778:215::-;1872:10;13866:4;13915:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;13915:34:0;;;;;;;;;;13866:4;;13883:80;;13906:7;;13915:47;;13952:10;;13915:47;:::i;:::-;13883:8;:80::i;54028:154::-;2998:6;;-1:-1:-1;;;;;2998:6:0;1872:10;3145:23;3137:68;;;;-1:-1:-1;;;3137:68:0;;;;;;;:::i;:::-;54129:4:::1;::::0;54121:53:::1;::::0;54085:12:::1;::::0;-1:-1:-1;;;;;54129:4:0::1;::::0;54148:21:::1;::::0;54085:12;54121:53;54085:12;54121:53;54148:21;54129:4;54121:53:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;54028:154:0:o;55667:82::-;2998:6;;-1:-1:-1;;;;;2998:6:0;1872:10;3145:23;3137:68;;;;-1:-1:-1;;;3137:68:0;;;;;;;:::i;:::-;55740:1:::1;55728:9;:13:::0;55667:82::o;54446:90::-;2998:6;;-1:-1:-1;;;;;2998:6:0;1872:10;3145:23;3137:68;;;;-1:-1:-1;;;3137:68:0;;;;;;;:::i;:::-;54503:18:::1;:25:::0;;-1:-1:-1;;54503:25:0::1;::::0;::::1;::::0;;54446:90::o;44410:137::-;2998:6;;-1:-1:-1;;;;;2998:6:0;1872:10;3145:23;3137:68;;;;-1:-1:-1;;;3137:68:0;;;;;;;:::i;:::-;44507:4:::1;::::0;44484:28:::1;::::0;-1:-1:-1;;;;;44507:4:0;;::::1;::::0;44484:28;::::1;::::0;::::1;::::0;44507:4:::1;::::0;44484:28:::1;44523:4;:16:::0;;-1:-1:-1;;;;;;44523:16:0::1;-1:-1:-1::0;;;;;44523:16:0;;;::::1;::::0;;;::::1;::::0;;44410:137::o;44278:124::-;2998:6;;-1:-1:-1;;;;;2998:6:0;1872:10;3145:23;3137:68;;;;-1:-1:-1;;;3137:68:0;;;;;;;:::i;:::-;44367:3:::1;::::0;44348:23:::1;::::0;-1:-1:-1;;;;;44367:3:0;;::::1;::::0;44348:23;::::1;::::0;::::1;::::0;44367:3:::1;::::0;44348:23:::1;44382:3;:12:::0;;-1:-1:-1;;;;;;44382:12:0::1;-1:-1:-1::0;;;;;44382:12:0;;;::::1;::::0;;;::::1;::::0;;44278:124::o;43832:201::-;2998:6;;-1:-1:-1;;;;;2998:6:0;1872:10;3145:23;3137:68;;;;-1:-1:-1;;;3137:68:0;;;;;;;:::i;:::-;43965:14:::1;::::0;43924:56:::1;::::0;-1:-1:-1;;;;;43965:14:0;;::::1;::::0;43924:56;::::1;::::0;::::1;::::0;43965:14:::1;::::0;43924:56:::1;43991:14;:34:::0;;-1:-1:-1;;;;;;43991:34:0::1;-1:-1:-1::0;;;;;43991:34:0;;;::::1;::::0;;;::::1;::::0;;43832:201::o;3576:103::-;2998:6;;-1:-1:-1;;;;;2998:6:0;1872:10;3145:23;3137:68;;;;-1:-1:-1;;;3137:68:0;;;;;;;:::i;:::-;3641:30:::1;3668:1;3641:18;:30::i;:::-;3576:103::o:0;39322:121::-;2998:6;;39374:4;;-1:-1:-1;;;;;2998:6:0;1872:10;3145:23;3137:68;;;;-1:-1:-1;;;3137:68:0;;;;;;;:::i;:::-;-1:-1:-1;39391:14:0::1;:22:::0;;-1:-1:-1;;39391:22:0::1;::::0;;;39322:121;:::o;40569:167::-;2998:6;;-1:-1:-1;;;;;2998:6:0;1872:10;3145:23;3137:68;;;;-1:-1:-1;;;3137:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;40682:39:0;;;::::1;;::::0;;;:31:::1;:39;::::0;;;;:46;;-1:-1:-1;;40682:46:0::1;::::0;::::1;;::::0;;;::::1;::::0;;40569:167::o;55557:98::-;2998:6;;-1:-1:-1;;;;;2998:6:0;1872:10;3145:23;3137:68;;;;-1:-1:-1;;;3137:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;55621:18:0::1;55642:5;55621:18:::0;;;:11:::1;:18;::::0;;;;:26;;-1:-1:-1;;55621:26:0::1;::::0;;55557:98::o;54196:196::-;2998:6;;-1:-1:-1;;;;;2998:6:0;1872:10;3145:23;3137:68;;;;-1:-1:-1;;;3137:68:0;;;;;;;:::i;:::-;54269:12:::1;54287:6;-1:-1:-1::0;;;;;54287:11:0::1;54320:21;54287:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54268:89;;;54376:7;54368:16;;;::::0;::::1;44810:193:::0;2998:6;;-1:-1:-1;;;;;2998:6:0;1872:10;3145:23;3137:68;;;;-1:-1:-1;;;3137:68:0;;;;;;;:::i;:::-;44897:9:::1;44892:104;44916:9;:16;44912:1;:20;44892:104;;;44980:4;44954:9;:23;44964:9;44974:1;44964:12;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;44954:23:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;44954:23:0;:30;;-1:-1:-1;;44954:30:0::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;44934:3:0::1;44892:104;;43295:257:::0;2998:6;;-1:-1:-1;;;;;2998:6:0;1872:10;3145:23;3137:68;;;;-1:-1:-1;;;3137:68:0;;;;;;;:::i;:::-;43460:22:::1;::::0;43403:80:::1;::::0;-1:-1:-1;;;;;43460:22:0;;::::1;::::0;43403:80;::::1;::::0;::::1;::::0;43460:22:::1;::::0;43403:80:::1;43494:22;:50:::0;;-1:-1:-1;;;;;;43494:50:0::1;-1:-1:-1::0;;;;;43494:50:0;;;::::1;::::0;;;::::1;::::0;;43295:257::o;39122:148::-;2998:6;;-1:-1:-1;;;;;2998:6:0;1872:10;3145:23;3137:68;;;;-1:-1:-1;;;3137:68:0;;;;;;;:::i;:::-;39177:13:::1;:20:::0;;-1:-1:-1;;39208:18:0;;;;;39237:17:::1;:25:::0;;-1:-1:-1;;39237:25:0::1;::::0;;39122:148::o;40832:100::-;2998:6;;-1:-1:-1;;;;;2998:6:0;1872:10;3145:23;3137:68;;;;-1:-1:-1;;;3137:68:0;;;;;;;:::i;:::-;40903:11:::1;:21:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;40903:21:0;;::::1;::::0;;;::::1;::::0;;40832:100::o;10278:104::-;10334:13;10367:7;10360:14;;;;;:::i;42787:304::-;2998:6;;-1:-1:-1;;;;;2998:6:0;1872:10;3145:23;3137:68;;;;-1:-1:-1;;;3137:68:0;;;;;;;:::i;:::-;42931:13:::1;-1:-1:-1::0;;;;;42923:21:0::1;:4;-1:-1:-1::0;;;;;42923:21:0::1;::::0;42901:128:::1;;;::::0;-1:-1:-1;;;42901:128:0;;9781:2:1;42901:128:0::1;::::0;::::1;9763:21:1::0;9820:2;9800:18;;;9793:30;9859:34;9839:18;;;9832:62;9930:27;9910:18;;;9903:55;9975:19;;42901:128:0::1;9579:421:1::0;42901:128:0::1;43042:41;43071:4;43077:5;43042:28;:41::i;14496:413::-:0;1872:10;14589:4;14633:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;14633:34:0;;;;;;;;;;14686:35;;;;14678:85;;;;-1:-1:-1;;;14678:85:0;;10207:2:1;14678:85:0;;;10189:21:1;10246:2;10226:18;;;10219:30;10285:34;10265:18;;;10258:62;-1:-1:-1;;;10336:18:1;;;10329:35;10381:19;;14678:85:0;10005:401:1;14678:85:0;14799:67;1872:10;14822:7;14850:15;14831:16;:34;14799:8;:67::i;:::-;-1:-1:-1;14897:4:0;;14496:413;-1:-1:-1;;;14496:413:0:o;11690:175::-;11776:4;11793:42;1872:10;11817:9;11828:6;11793:9;:42::i;55757:258::-;2998:6;;-1:-1:-1;;;;;2998:6:0;1872:10;3145:23;3137:68;;;;-1:-1:-1;;;3137:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;55856:32:0;::::1;;::::0;;;:25:::1;:32;::::0;;;;:47;;-1:-1:-1;;55856:47:0::1;::::0;::::1;;;::::0;;55914:36:::1;55856:32:::0;:47;55914:15:::1;:36::i;:::-;55961:46;55987:5;55994:12;55961:25;:46::i;43560:264::-:0;2998:6;;-1:-1:-1;;;;;2998:6:0;1872:10;3145:23;3137:68;;;;-1:-1:-1;;;3137:68:0;;;;;;;:::i;:::-;43729:23:::1;::::0;43670:83:::1;::::0;-1:-1:-1;;;;;43729:23:0;;::::1;::::0;43670:83;::::1;::::0;::::1;::::0;43729:23:::1;::::0;43670:83:::1;43764:23;:52:::0;;-1:-1:-1;;;;;;43764:52:0::1;-1:-1:-1::0;;;;;43764:52:0;;;::::1;::::0;;;::::1;::::0;;43560:264::o;53732:288::-;2998:6;;-1:-1:-1;;;;;2998:6:0;1872:10;3145:23;3137:68;;;;-1:-1:-1;;;3137:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;53827:20:0;::::1;53819:59;;;::::0;-1:-1:-1;;;53819:59:0;;10613:2:1;53819:59:0::1;::::0;::::1;10595:21:1::0;10652:2;10632:18;;;10625:30;10691:28;10671:18;;;10664:56;10737:18;;53819:59:0::1;10411:350:1::0;53819:59:0::1;53916:39;::::0;-1:-1:-1;;;53916:39:0;;53949:4:::1;53916:39;::::0;::::1;2401:51:1::0;53889:24:0::1;::::0;-1:-1:-1;;;;;53916:24:0;::::1;::::0;::::1;::::0;2374:18:1;;53916:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53966:46;::::0;-1:-1:-1;;;53966:46:0;;-1:-1:-1;;;;;8900:32:1;;;53966:46:0::1;::::0;::::1;8882:51:1::0;8949:18;;;8942:34;;;53889:66:0;;-1:-1:-1;53966:23:0;;::::1;::::0;::::1;::::0;8855:18:1;;53966:46:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;42597:182::-:0;2998:6;;-1:-1:-1;;;;;2998:6:0;1872:10;3145:23;3137:68;;;;-1:-1:-1;;;3137:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;42682:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;42682:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;42737:34;;1172:41:1;;;42737:34:0::1;::::0;1145:18:1;42737:34:0::1;;;;;;;42597:182:::0;;:::o;40303:258::-;2998:6;;-1:-1:-1;;;;;2998:6:0;1872:10;3145:23;3137:68;;;;-1:-1:-1;;;3137:68:0;;;;;;;:::i;:::-;40445:4:::1;40437;40414:13;11267:12:::0;;;11179:108;40414:13:::1;:19;::::0;40430:3:::1;40414:19;:::i;:::-;40413:28;;;;:::i;:::-;40412:37;;;;:::i;:::-;40402:6;:47;;40380:133;;;::::0;-1:-1:-1;;;40380:133:0;;10968:2:1;40380:133:0::1;::::0;::::1;10950:21:1::0;11007:2;10987:18;;;10980:30;11046:34;11026:18;;;11019:62;-1:-1:-1;;;11097:18:1;;;11090:34;11141:19;;40380:133:0::1;10766:400:1::0;40380:133:0::1;40536:17;:6:::0;40546::::1;40536:17;:::i;:::-;40524:9;:29:::0;-1:-1:-1;40303:258:0:o;39513:497::-;2998:6;;39621:4;;-1:-1:-1;;;;;2998:6:0;1872:10;3145:23;3137:68;;;;-1:-1:-1;;;3137:68:0;;;;;;;:::i;:::-;39700:6:::1;39679:13;11267:12:::0;;;11179:108;39679:13:::1;:17;::::0;39695:1:::1;39679:17;:::i;:::-;39678:28;;;;:::i;:::-;39665:9;:41;;39643:144;;;::::0;-1:-1:-1;;;39643:144:0;;11373:2:1;39643:144:0::1;::::0;::::1;11355:21:1::0;11412:2;11392:18;;;11385:30;11451:34;11431:18;;;11424:62;-1:-1:-1;;;11502:18:1;;;11495:51;11563:19;;39643:144:0::1;11171:417:1::0;39643:144:0::1;39855:4;39834:13;11267:12:::0;;;11179:108;39834:13:::1;:17;::::0;39850:1:::1;39834:17;:::i;:::-;39833:26;;;;:::i;:::-;39820:9;:39;;39798:141;;;::::0;-1:-1:-1;;;39798:141:0;;11795:2:1;39798:141:0::1;::::0;::::1;11777:21:1::0;11834:2;11814:18;;;11807:30;11873:34;11853:18;;;11846:62;-1:-1:-1;;;11924:18:1;;;11917:50;11984:19;;39798:141:0::1;11593:416:1::0;39798:141:0::1;-1:-1:-1::0;39950:18:0::1;:30:::0;;;39998:4:::1;3216:1;39513:497:::0;;;:::o;55021:403::-;2998:6;;-1:-1:-1;;;;;2998:6:0;1872:10;3145:23;3137:68;;;;-1:-1:-1;;;3137:68:0;;;;;;;:::i;:::-;55109:18:::1;::::0;;;::::1;;;55108:19;55100:65;;;::::0;-1:-1:-1;;;55100:65:0;;12216:2:1;55100:65:0::1;::::0;::::1;12198:21:1::0;12255:2;12235:18;;;12228:30;12294:34;12274:18;;;12267:62;-1:-1:-1;;;12345:18:1;;;12338:31;12386:19;;55100:65:0::1;12014:397:1::0;55100:65:0::1;55219:13;-1:-1:-1::0;;;;;55198:35:0::1;:9;-1:-1:-1::0;;;;;55198:35:0::1;;;:103;;;;-1:-1:-1::0;;;;;;55237:64:0;::::1;55258:42;55237:64;;55198:103;55176:200;;;::::0;-1:-1:-1;;;55176:200:0;;12618:2:1;55176:200:0::1;::::0;::::1;12600:21:1::0;12657:2;12637:18;;;12630:30;12696:34;12676:18;;;12669:62;-1:-1:-1;;;12747:18:1;;;12740:44;12801:19;;55176:200:0::1;12416:410:1::0;55176:200:0::1;-1:-1:-1::0;;;;;55387:22:0::1;;::::0;;;:11:::1;:22;::::0;;;;:29;;-1:-1:-1;;55387:29:0::1;55412:4;55387:29;::::0;;55021:403::o;41759:830::-;2998:6;;-1:-1:-1;;;;;2998:6:0;1872:10;3145:23;3137:68;;;;-1:-1:-1;;;3137:68:0;;;;;;;:::i;:::-;42050:23:::1;:46:::0;;;42107:24:::1;:48:::0;;;42166:15:::1;:30:::0;;;42207:19:::1;:38:::0;;;42256:10:::1;:20:::0;;;42287:16:::1;:32:::0;;;42330:11:::1;:22:::0;;;42344:8;42306:13;42269:7;42229:16;42184:12;42379:50:::1;42134:21:::0;42076:20;42379:50:::1;:::i;:::-;:68;;;;:::i;:::-;:90;;;;:::i;:::-;:103;;;;:::i;:::-;:122;;;;:::i;:::-;:136;;;;:::i;:::-;42363:13;:152:::0;;;42551:2:::1;-1:-1:-1::0;42534:19:0::1;42526:55;;;::::0;-1:-1:-1;;;42526:55:0;;13033:2:1;42526:55:0::1;::::0;::::1;13015:21:1::0;13072:2;13052:18;;;13045:30;13111:25;13091:18;;;13084:53;13154:18;;42526:55:0::1;12831:347:1::0;3834:201:0;2998:6;;-1:-1:-1;;;;;2998:6:0;1872:10;3145:23;3137:68;;;;-1:-1:-1;;;3137:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;3923:22:0;::::1;3915:73;;;::::0;-1:-1:-1;;;3915:73:0;;13385:2:1;3915:73:0::1;::::0;::::1;13367:21:1::0;13424:2;13404:18;;;13397:30;13463:34;13443:18;;;13436:62;-1:-1:-1;;;13514:18:1;;;13507:36;13560:19;;3915:73:0::1;13183:402:1::0;3915:73:0::1;3999:28;4018:8;3999:18;:28::i;:::-;3834:201:::0;:::o;44041:229::-;2998:6;;-1:-1:-1;;;;;2998:6:0;1872:10;3145:23;3137:68;;;;-1:-1:-1;;;3137:68:0;;;;;;;:::i;:::-;44190:18:::1;::::0;44141:68:::1;::::0;-1:-1:-1;;;;;44190:18:0;;::::1;::::0;44141:68;::::1;::::0;::::1;::::0;44190:18:::1;::::0;44141:68:::1;44220:18;:42:::0;;-1:-1:-1;;;;;;44220:42:0::1;-1:-1:-1::0;;;;;44220:42:0;;;::::1;::::0;;;::::1;::::0;;44041:229::o;18180:380::-;-1:-1:-1;;;;;18316:19:0;;18308:68;;;;-1:-1:-1;;;18308:68:0;;13792:2:1;18308:68:0;;;13774:21:1;13831:2;13811:18;;;13804:30;13870:34;13850:18;;;13843:62;-1:-1:-1;;;13921:18:1;;;13914:34;13965:19;;18308:68:0;13590:400:1;18308:68:0;-1:-1:-1;;;;;18395:21:0;;18387:68;;;;-1:-1:-1;;;18387:68:0;;14197:2:1;18387:68:0;;;14179:21:1;14236:2;14216:18;;;14209:30;14275:34;14255:18;;;14248:62;-1:-1:-1;;;14326:18:1;;;14319:32;14368:19;;18387:68:0;13995:398:1;18387:68:0;-1:-1:-1;;;;;18468:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;18520:32;;1967:25:1;;;18520:32:0;;1940:18:1;18520:32:0;;;;;;;18180:380;;;:::o;45011:4691::-;-1:-1:-1;;;;;45143:18:0;;45135:68;;;;-1:-1:-1;;;45135:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;45222:16:0;;45214:64;;;;-1:-1:-1;;;45214:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;45298:17:0;;;;;;:11;:17;;;;;;;;45297:18;45289:48;;;;-1:-1:-1;;;45289:48:0;;15410:2:1;45289:48:0;;;15392:21:1;15449:2;15429:18;;;15422:30;-1:-1:-1;;;15468:18:1;;;15461:48;15526:18;;45289:48:0;15208:342:1;45289:48:0;-1:-1:-1;;;;;45357:15:0;;;;;;:11;:15;;;;;;;;45356:16;45348:48;;;;-1:-1:-1;;;45348:48:0;;15757:2:1;45348:48:0;;;15739:21:1;15796:2;15776:18;;;15769:30;-1:-1:-1;;;15815:18:1;;;15808:50;15875:18;;45348:48:0;15555:344:1;45348:48:0;45413:17;;;;45409:135;;;-1:-1:-1;;;;;45455:31:0;;;;;;:25;:31;;;;;;;;45447:85;;;;-1:-1:-1;;;45447:85:0;;16106:2:1;45447:85:0;;;16088:21:1;16145:2;16125:18;;;16118:30;16184:34;16164:18;;;16157:62;-1:-1:-1;;;16235:18:1;;;16228:39;16284:19;;45447:85:0;15904:405:1;45447:85:0;45560:6;45570:1;45560:11;45556:93;;45588:28;45604:4;45610:2;45614:1;45588:15;:28::i;:::-;45011:4691;;;:::o;45556:93::-;45665:14;;;;45661:1694;;;2998:6;;-1:-1:-1;;;;;45718:15:0;;;2998:6;;45718:15;;;;:49;;-1:-1:-1;2998:6:0;;-1:-1:-1;;;;;45754:13:0;;;2998:6;;45754:13;;45718:49;:86;;;;-1:-1:-1;;;;;;45788:16:0;;;;45718:86;:128;;;;-1:-1:-1;;;;;;45825:21:0;;45839:6;45825:21;;45718:128;:158;;;;-1:-1:-1;45868:8:0;;-1:-1:-1;;;45868:8:0;;;;45867:9;45718:158;45696:1648;;;45916:13;;;;;;;45911:223;;-1:-1:-1;;;;;45988:25:0;;;;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;46017:23:0;;;;;;:19;:23;;;;;;;;45988:52;45954:160;;;;-1:-1:-1;;;45954:160:0;;16516:2:1;45954:160:0;;;16498:21:1;16555:2;16535:18;;;16528:30;-1:-1:-1;;;16574:18:1;;;16567:52;16636:18;;45954:160:0;16314:346:1;45954:160:0;-1:-1:-1;;;;;46208:31:0;;;;;;:25;:31;;;;;;;;:92;;;;-1:-1:-1;;;;;;46265:35:0;;;;;;:31;:35;;;;;;;;46264:36;46208:92;46182:1147;;;46387:20;;46377:6;:30;;46343:169;;;;-1:-1:-1;;;46343:169:0;;16867:2:1;46343:169:0;;;16849:21:1;16906:2;16886:18;;;16879:30;16945:34;16925:18;;;16918:62;-1:-1:-1;;;16996:18:1;;;16989:51;17057:19;;46343:169:0;16665:417:1;46343:169:0;46595:9;;-1:-1:-1;;;;;11451:18:0;;11424:7;11451:18;;;;;;;;;;;46569:22;;:6;:22;:::i;:::-;:35;;46535:140;;;;-1:-1:-1;;;46535:140:0;;17289:2:1;46535:140:0;;;17271:21:1;17328:2;17308:18;;;17301:30;-1:-1:-1;;;17347:18:1;;;17340:49;17406:18;;46535:140:0;17087:343:1;46535:140:0;46182:1147;;;-1:-1:-1;;;;;46773:29:0;;;;;;:25;:29;;;;;;;;:92;;;;-1:-1:-1;;;;;;46828:37:0;;;;;;:31;:37;;;;;;;;46827:38;46773:92;46747:582;;;46952:20;;46942:6;:30;;46908:170;;;;-1:-1:-1;;;46908:170:0;;17637:2:1;46908:170:0;;;17619:21:1;17676:2;17656:18;;;17649:30;17715:34;17695:18;;;17688:62;-1:-1:-1;;;17766:18:1;;;17759:52;17828:19;;46908:170:0;17435:418:1;46747:582:0;-1:-1:-1;;;;;47109:35:0;;;;;;:31;:35;;;;;;;;47104:225;;47229:9;;-1:-1:-1;;;;;11451:18:0;;11424:7;11451:18;;;;;;;;;;;47203:22;;:6;:22;:::i;:::-;:35;;47169:140;;;;-1:-1:-1;;;47169:140:0;;17289:2:1;47169:140:0;;;17271:21:1;17328:2;17308:18;;;17301:30;-1:-1:-1;;;17347:18:1;;;17340:49;17406:18;;47169:140:0;17087:343:1;47169:140:0;47416:4;47367:28;11451:18;;;;;;;;;;;47474;;47450:42;;;;;;;47523:35;;-1:-1:-1;47547:11:0;;;;;;;47523:35;:61;;;;-1:-1:-1;47576:8:0;;-1:-1:-1;;;47576:8:0;;;;47575:9;47523:61;:110;;;;-1:-1:-1;;;;;;47602:31:0;;;;;;:25;:31;;;;;;;;47601:32;47523:110;:153;;;;-1:-1:-1;;;;;;47651:25:0;;;;;;:19;:25;;;;;;;;47650:26;47523:153;:194;;;;-1:-1:-1;;;;;;47694:23:0;;;;;;:19;:23;;;;;;;;47693:24;47523:194;47505:326;;;47744:8;:15;;-1:-1:-1;;;;47744:15:0;-1:-1:-1;;;47744:15:0;;;47776:10;:8;:10::i;:::-;47803:8;:16;;-1:-1:-1;;;;47803:16:0;;;47505:326;47859:8;;-1:-1:-1;;;;;47969:25:0;;47843:12;47969:25;;;:19;:25;;;;;;47859:8;-1:-1:-1;;;47859:8:0;;;;;47858:9;;47969:25;;:52;;-1:-1:-1;;;;;;47998:23:0;;;;;;:19;:23;;;;;;;;47969:52;47965:100;;;-1:-1:-1;48048:5:0;47965:100;48077:12;48182:7;48178:1471;;;-1:-1:-1;;;;;48234:29:0;;;;;;:25;:29;;;;;;;;:50;;;;;48283:1;48267:13;;:17;48234:50;48230:1270;;;48312:34;48342:3;48312:25;48323:13;;48312:6;:10;;:25;;;;:::i;:::-;:29;;:34::i;:::-;48305:41;;48415:13;;48395:16;;48388:4;:23;;;;:::i;:::-;48387:41;;;;:::i;:::-;48365:18;;:63;;;;;;;:::i;:::-;;;;-1:-1:-1;;48487:13:0;;48472:11;;48465:18;;:4;:18;:::i;:::-;48464:36;;;;:::i;:::-;48447:13;;:53;;;;;;;:::i;:::-;;;;-1:-1:-1;;48583:13:0;;48556:23;;48549:30;;:4;:30;:::i;:::-;48548:48;;;;:::i;:::-;48519:25;;:77;;;;;;;:::i;:::-;;;;-1:-1:-1;;48663:13:0;;48644:15;;48637:22;;:4;:22;:::i;:::-;48636:40;;;;:::i;:::-;48615:17;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;48751:13:0;;48728:19;;48721:26;;:4;:26;:::i;:::-;48720:44;;;;:::i;:::-;48695:21;;:69;;;;;;;:::i;:::-;;;;-1:-1:-1;;48821:13:0;;48807:10;;48800:17;;:4;:17;:::i;:::-;48799:35;;;;:::i;:::-;48783:12;;:51;;;;;;;:::i;:::-;;;;-1:-1:-1;48230:1270:0;;-1:-1:-1;48230:1270:0;;-1:-1:-1;;;;;48896:31:0;;;;;;:25;:31;;;;;;;;:51;;;;;48946:1;48931:12;;:16;48896:51;48892:608;;;48975:33;49004:3;48975:24;48986:12;;48975:6;:10;;:24;;;;:::i;:33::-;48968:40;;49076:12;;49057:15;;49050:4;:22;;;;:::i;:::-;49049:39;;;;:::i;:::-;49027:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;49146:12:0;;49132:10;;49125:17;;:4;:17;:::i;:::-;49124:34;;;;:::i;:::-;49107:13;;:51;;;;;;;:::i;:::-;;;;-1:-1:-1;;49240:12:0;;49214:22;;49207:29;;:4;:29;:::i;:::-;49206:46;;;;:::i;:::-;49177:25;;:75;;;;;;;:::i;:::-;;;;-1:-1:-1;;49318:12:0;;49300:14;;49293:21;;:4;:21;:::i;:::-;49292:38;;;;:::i;:::-;49271:17;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;;49404:12:0;;49382:18;;49375:25;;:4;:25;:::i;:::-;49374:42;;;;:::i;:::-;49349:21;;:67;;;;;;;:::i;:::-;;;;-1:-1:-1;;49472:12:0;;49459:9;;49452:16;;:4;:16;:::i;:::-;49451:33;;;;:::i;:::-;49435:12;;:49;;;;;;;:::i;:::-;;;;-1:-1:-1;;48892:608:0;49520:8;;49516:91;;49549:42;49565:4;49579;49586;49549:15;:42::i;:::-;49623:14;49633:4;49623:14;;:::i;:::-;;;48178:1471;49661:33;49677:4;49683:2;49687:6;49661:15;:33::i;4195:191::-;4288:6;;;-1:-1:-1;;;;;4305:17:0;;;-1:-1:-1;;;;;;4305:17:0;;;;;;;4338:40;;4288:6;;;4305:17;4288:6;;4338:40;;4269:16;;4338:40;4258:128;4195:191;:::o;43099:188::-;-1:-1:-1;;;;;43182:31:0;;;;;;:25;:31;;;;;;:39;;-1:-1:-1;;43182:39:0;;;;;;;;;;43239:40;;43182:39;;:31;43239:40;;;43099:188;;:::o;15399:733::-;-1:-1:-1;;;;;15539:20:0;;15531:70;;;;-1:-1:-1;;;15531:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;15620:23:0;;15612:71;;;;-1:-1:-1;;;15612:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;15780:17:0;;15756:21;15780:17;;;;;;;;;;;15816:23;;;;15808:74;;;;-1:-1:-1;;;15808:74:0;;18193:2:1;15808:74:0;;;18175:21:1;18232:2;18212:18;;;18205:30;18271:34;18251:18;;;18244:62;-1:-1:-1;;;18322:18:1;;;18315:36;18368:19;;15808:74:0;17991:402:1;15808:74:0;-1:-1:-1;;;;;15918:17:0;;;:9;:17;;;;;;;;;;;15938:22;;;15918:42;;15982:20;;;;;;;;:30;;15954:6;;15918:9;15982:30;;15954:6;;15982:30;:::i;:::-;;;;;;;;16047:9;-1:-1:-1;;;;;16030:35:0;16039:6;-1:-1:-1;;;;;16030:35:0;;16058:6;16030:35;;;;1967:25:1;;1955:2;1940:18;;1821:177;16030:35:0;;;;;;;;16078:46;45011:4691;50828:2631;50911:4;50867:23;11451:18;;;;;;;;;;;50867:50;;50928:25;51129:13;;51101:12;;51064:21;;51031:17;;50990:25;;50956:18;;:59;;;;:::i;:::-;:92;;;;:::i;:::-;:129;;;;:::i;:::-;:157;;;;:::i;:::-;:186;;;;:::i;:::-;50928:214;-1:-1:-1;51153:12:0;51182:20;;;:46;;-1:-1:-1;51206:22:0;;51182:46;51178:85;;;51245:7;;;50828:2631::o;51178:85::-;51297:18;;:23;;51318:2;51297:23;:::i;:::-;51279:15;:41;51275:115;;;51355:18;;:23;;51376:2;51355:23;:::i;:::-;51337:41;;51275:115;51451:23;51564:1;51531:17;51496:18;;51478:15;:36;;;;:::i;:::-;51477:71;;;;:::i;:::-;:88;;;;:::i;:::-;51451:114;-1:-1:-1;51576:26:0;51605:36;:15;51451:114;51605:19;:36::i;:::-;51576:65;-1:-1:-1;51682:21:0;51716:36;51576:65;51716:16;:36::i;:::-;51765:18;51786:44;:21;51812:17;51786:25;:44::i;:::-;51765:65;;51843:30;51876:91;51964:1;51943:18;;:22;;;;:::i;:::-;51922:44;;:17;:44;:::i;:::-;51891:25;;51876:41;;:10;;:14;:41::i;:91::-;51843:124;;51980:31;52014:92;52103:1;52082:18;;:22;;;;:::i;:::-;52061:44;;:17;:44;:::i;:::-;52029:26;;52014:42;;:10;;:14;:42::i;:92::-;51980:126;;52119:22;52144:83;52224:1;52203:18;;:22;;;;:::i;:::-;52182:44;;:17;:44;:::i;:::-;52159:17;;52144:33;;:10;;:14;:33::i;:83::-;52119:108;;52240:26;52269:87;52353:1;52332:18;;:22;;;;:::i;:::-;52311:44;;:17;:44;:::i;:::-;52284:21;;52269:37;;:10;;:14;:37::i;:87::-;52240:116;;52369:17;52389:78;52464:1;52443:18;;:22;;;;:::i;:::-;52422:44;;:17;:44;:::i;:::-;52404:12;;52389:28;;:10;;:14;:28::i;:78::-;52369:98;;52488:18;52509:79;52585:1;52564:18;;:22;;;;:::i;:::-;52543:44;;:17;:44;:::i;:::-;52524:13;;52509:29;;:10;;:14;:29::i;:79::-;52488:100;-1:-1:-1;52601:23:0;52488:100;52725:9;52708:14;;52665:23;52627:35;52640:22;52627:10;:35;:::i;:::-;:61;;;;:::i;:::-;:78;;;;:::i;:::-;:95;;;;:::i;:::-;:107;;;;:::i;:::-;:120;;;;:::i;:::-;52781:1;52760:18;:22;;;52793:25;:29;;;52833:26;:30;;;52874:17;:21;;;52906;:25;;;52942:12;:16;;;52969:13;:17;;;53021:4;;53013:41;;52601:146;;-1:-1:-1;;;;;;53021:4:0;;53039:10;;53013:41;52781:1;53013:41;53039:10;53021:4;53013:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52999:55:0;;-1:-1:-1;;53071:19:0;;;;;:42;;;53112:1;53094:15;:19;53071:42;53067:278;;;53130:46;53143:15;53160;53130:12;:46::i;:::-;53300:18;;53196:137;;;18600:25:1;;;18656:2;18641:18;;18634:34;;;18684:18;;;18677:34;;;;53196:137:0;;;;;;18588:2:1;53196:137:0;;;53067:278;53379:22;;53371:70;;-1:-1:-1;;;;;53379:22:0;;;;53415:21;;53371:70;;;;53415:21;53379:22;53371:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;50828:2631:0:o;23312:98::-;23370:7;23397:5;23401:1;23397;:5;:::i;:::-;23390:12;23312:98;-1:-1:-1;;;23312:98:0:o;23711:::-;23769:7;23796:5;23800:1;23796;:5;:::i;22955:98::-;23013:7;23040:5;23044:1;23040;:5;:::i;49710:589::-;49860:16;;;49874:1;49860:16;;;;;;;;49836:21;;49860:16;;;;;;;;;;-1:-1:-1;49860:16:0;49836:40;;49905:4;49887;49892:1;49887:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;49887:23:0;;;-1:-1:-1;;;;;49887:23:0;;;;;49931:15;-1:-1:-1;;;;;49931:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49921:4;49926:1;49921:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1;;;;;49921:32:0;;;-1:-1:-1;;;;;49921:32:0;;;;;49966:62;49983:4;49998:15;50016:11;49966:8;:62::i;:::-;50067:224;;-1:-1:-1;;;50067:224:0;;-1:-1:-1;;;;;50067:15:0;:66;;;;:224;;50148:11;;50174:1;;50218:4;;50245;;50265:15;;50067:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49765:534;49710:589;:::o;50307:513::-;50455:62;50472:4;50487:15;50505:11;50455:8;:62::i;:::-;50560:15;-1:-1:-1;;;;;50560:31:0;;50599:9;50632:4;50652:11;50678:1;50721;50764:7;2998:6;;-1:-1:-1;;;;;2998:6:0;;2925:87;50764:7;50560:252;;;;;;-1:-1:-1;;;;;;50560:252:0;;;-1:-1:-1;;;;;20322:15:1;;;50560:252:0;;;20304:34:1;20354:18;;;20347:34;;;;20397:18;;;20390:34;;;;20440:18;;;20433:34;20504:15;;;20483:19;;;20476:44;50786:15:0;20536:19:1;;;20529:35;20238:19;;50560:252:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;50307:513;;:::o;14:418:1:-;163:2;152:9;145:21;126:4;195:6;189:13;238:6;233:2;222:9;218:18;211:34;297:6;292:2;284:6;280:15;275:2;264:9;260:18;254:50;353:1;348:2;339:6;328:9;324:22;320:31;313:42;423:2;416;412:7;407:2;399:6;395:15;391:29;380:9;376:45;372:54;364:62;;;14:418;;;;:::o;437:131::-;-1:-1:-1;;;;;512:31:1;;502:42;;492:70;;558:1;555;548:12;573:134;641:20;;670:31;641:20;670:31;:::i;712:315::-;780:6;788;841:2;829:9;820:7;816:23;812:32;809:52;;;857:1;854;847:12;809:52;896:9;883:23;915:31;940:5;915:31;:::i;:::-;965:5;1017:2;1002:18;;;;989:32;;-1:-1:-1;;;712:315:1:o;1224:592::-;1337:6;1345;1353;1361;1369;1377;1385;1438:3;1426:9;1417:7;1413:23;1409:33;1406:53;;;1455:1;1452;1445:12;1406:53;-1:-1:-1;;1478:23:1;;;1548:2;1533:18;;1520:32;;-1:-1:-1;1599:2:1;1584:18;;1571:32;;1650:2;1635:18;;1622:32;;-1:-1:-1;1701:3:1;1686:19;;1673:33;;-1:-1:-1;1753:3:1;1738:19;;1725:33;;-1:-1:-1;1805:3:1;1790:19;1777:33;;-1:-1:-1;1224:592:1;-1:-1:-1;1224:592:1:o;2003:247::-;2062:6;2115:2;2103:9;2094:7;2090:23;2086:32;2083:52;;;2131:1;2128;2121:12;2083:52;2170:9;2157:23;2189:31;2214:5;2189:31;:::i;2698:180::-;2757:6;2810:2;2798:9;2789:7;2785:23;2781:32;2778:52;;;2826:1;2823;2816:12;2778:52;-1:-1:-1;2849:23:1;;2698:180;-1:-1:-1;2698:180:1:o;2883:456::-;2960:6;2968;2976;3029:2;3017:9;3008:7;3004:23;3000:32;2997:52;;;3045:1;3042;3035:12;2997:52;3084:9;3071:23;3103:31;3128:5;3103:31;:::i;:::-;3153:5;-1:-1:-1;3210:2:1;3195:18;;3182:32;3223:33;3182:32;3223:33;:::i;:::-;2883:456;;3275:7;;-1:-1:-1;;;3329:2:1;3314:18;;;;3301:32;;2883:456::o;3533:118::-;3619:5;3612:13;3605:21;3598:5;3595:32;3585:60;;3641:1;3638;3631:12;3656:382;3721:6;3729;3782:2;3770:9;3761:7;3757:23;3753:32;3750:52;;;3798:1;3795;3788:12;3750:52;3837:9;3824:23;3856:31;3881:5;3856:31;:::i;:::-;3906:5;-1:-1:-1;3963:2:1;3948:18;;3935:32;3976:30;3935:32;3976:30;:::i;:::-;4025:7;4015:17;;;3656:382;;;;;:::o;4043:127::-;4104:10;4099:3;4095:20;4092:1;4085:31;4135:4;4132:1;4125:15;4159:4;4156:1;4149:15;4175:1121;4259:6;4290:2;4333;4321:9;4312:7;4308:23;4304:32;4301:52;;;4349:1;4346;4339:12;4301:52;4389:9;4376:23;4418:18;4459:2;4451:6;4448:14;4445:34;;;4475:1;4472;4465:12;4445:34;4513:6;4502:9;4498:22;4488:32;;4558:7;4551:4;4547:2;4543:13;4539:27;4529:55;;4580:1;4577;4570:12;4529:55;4616:2;4603:16;4638:2;4634;4631:10;4628:36;;;4644:18;;:::i;:::-;4690:2;4687:1;4683:10;4722:2;4716:9;4785:2;4781:7;4776:2;4772;4768:11;4764:25;4756:6;4752:38;4840:6;4828:10;4825:22;4820:2;4808:10;4805:18;4802:46;4799:72;;;4851:18;;:::i;:::-;4887:2;4880:22;4937:18;;;4971:15;;;;-1:-1:-1;5013:11:1;;;5009:20;;;5041:19;;;5038:39;;;5073:1;5070;5063:12;5038:39;5097:11;;;;5117:148;5133:6;5128:3;5125:15;5117:148;;;5199:23;5218:3;5199:23;:::i;:::-;5187:36;;5150:12;;;;5243;;;;5117:148;;;5284:6;4175:1121;-1:-1:-1;;;;;;;;4175:1121:1:o;5301:241::-;5357:6;5410:2;5398:9;5389:7;5385:23;5381:32;5378:52;;;5426:1;5423;5416:12;5378:52;5465:9;5452:23;5484:28;5506:5;5484:28;:::i;5547:388::-;5615:6;5623;5676:2;5664:9;5655:7;5651:23;5647:32;5644:52;;;5692:1;5689;5682:12;5644:52;5731:9;5718:23;5750:31;5775:5;5750:31;:::i;:::-;5800:5;-1:-1:-1;5857:2:1;5842:18;;5829:32;5870:33;5829:32;5870:33;:::i;5940:380::-;6019:1;6015:12;;;;6062;;;6083:61;;6137:4;6129:6;6125:17;6115:27;;6083:61;6190:2;6182:6;6179:14;6159:18;6156:38;6153:161;;6236:10;6231:3;6227:20;6224:1;6217:31;6271:4;6268:1;6261:15;6299:4;6296:1;6289:15;6153:161;;5940:380;;;:::o;6325:356::-;6527:2;6509:21;;;6546:18;;;6539:30;6605:34;6600:2;6585:18;;6578:62;6672:2;6657:18;;6325:356::o;6686:127::-;6747:10;6742:3;6738:20;6735:1;6728:31;6778:4;6775:1;6768:15;6802:4;6799:1;6792:15;6818:125;6883:9;;;6904:10;;;6901:36;;;6917:18;;:::i;7299:168::-;7372:9;;;7403;;7420:15;;;7414:22;;7400:37;7390:71;;7441:18;;:::i;7472:217::-;7512:1;7538;7528:132;;7582:10;7577:3;7573:20;7570:1;7563:31;7617:4;7614:1;7607:15;7645:4;7642:1;7635:15;7528:132;-1:-1:-1;7674:9:1;;7472:217::o;8519:184::-;8589:6;8642:2;8630:9;8621:7;8617:23;8613:32;8610:52;;;8658:1;8655;8648:12;8610:52;-1:-1:-1;8681:16:1;;8519:184;-1:-1:-1;8519:184:1:o;8987:245::-;9054:6;9107:2;9095:9;9086:7;9082:23;9078:32;9075:52;;;9123:1;9120;9113:12;9075:52;9155:9;9149:16;9174:28;9196:5;9174:28;:::i;9447:127::-;9508:10;9503:3;9499:20;9496:1;9489:31;9539:4;9536:1;9529:15;9563:4;9560:1;9553:15;14398:401;14600:2;14582:21;;;14639:2;14619:18;;;14612:30;14678:34;14673:2;14658:18;;14651:62;-1:-1:-1;;;14744:2:1;14729:18;;14722:35;14789:3;14774:19;;14398:401::o;14804:399::-;15006:2;14988:21;;;15045:2;15025:18;;;15018:30;15084:34;15079:2;15064:18;;15057:62;-1:-1:-1;;;15150:2:1;15135:18;;15128:33;15193:3;15178:19;;14804:399::o;17858:128::-;17925:9;;;17946:11;;;17943:37;;;17960:18;;:::i;18722:251::-;18792:6;18845:2;18833:9;18824:7;18820:23;18816:32;18813:52;;;18861:1;18858;18851:12;18813:52;18893:9;18887:16;18912:31;18937:5;18912:31;:::i;18978:980::-;19240:4;19288:3;19277:9;19273:19;19319:6;19308:9;19301:25;19345:2;19383:6;19378:2;19367:9;19363:18;19356:34;19426:3;19421:2;19410:9;19406:18;19399:31;19450:6;19485;19479:13;19516:6;19508;19501:22;19554:3;19543:9;19539:19;19532:26;;19593:2;19585:6;19581:15;19567:29;;19614:1;19624:195;19638:6;19635:1;19632:13;19624:195;;;19703:13;;-1:-1:-1;;;;;19699:39:1;19687:52;;19794:15;;;;19759:12;;;;19735:1;19653:9;19624:195;;;-1:-1:-1;;;;;;;19875:32:1;;;;19870:2;19855:18;;19848:60;-1:-1:-1;;;19939:3:1;19924:19;19917:35;19836:3;18978:980;-1:-1:-1;;;18978:980:1:o;20575:306::-;20663:6;20671;20679;20732:2;20720:9;20711:7;20707:23;20703:32;20700:52;;;20748:1;20745;20738:12;20700:52;20777:9;20771:16;20761:26;;20827:2;20816:9;20812:18;20806:25;20796:35;;20871:2;20860:9;20856:18;20850:25;20840:35;;20575:306;;;;;:::o

Swarm Source

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