ETH Price: $2,940.30 (+4.26%)
 

Overview

Max Total Supply

10,000,000,000 MMAI

Holders

1,074 (0.00%)

Market

Price

$0.00 @ 0.000000 ETH (+18.00%)

Onchain Market Cap

$288,240.72

Circulating Supply Market Cap

$175,808.88

Other Info

Token Contract (WITH 7 Decimals)

Balance
1,183,222.9807009 MMAI

Value
$34.11 ( ~0.0116008448886204 Eth) [0.0118%]
0x463e1db1052334847197cf91eefc38e17b87e4af
Loading...
Loading
Loading...
Loading
Loading...
Loading

Market

Volume (24H):$3,384.36
Market Capitalization:$175,808.88
Circulating Supply:6,099,376,989.00 MMAI
Market Data Source: Coinmarketcap

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
MMAI

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-09-03
*/

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

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

    function WETH() external pure returns (address);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

interface IUniswapRouter02 is IUniswapRouter01 {
    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;
}

interface IFactory {
    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;

    function INIT_CODE_PAIR_HASH() external view returns (bytes32);
}

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

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

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

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

library SafeERC20 {
    using Address for address;

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

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

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

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

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

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

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

interface IERC20 {
    /**
     * @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
    );

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

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

contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

        return true;
    }

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

        _beforeTokenTransfer(from, to, amount);

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

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

interface uniswapV2Pair {
    function getReserves()
        external
        view
        returns (
            uint112 reserve0,
            uint112 reserve1,
            uint32 blockTimestampLast
        );
}

contract MMAI is ERC20, Ownable {
    address payable public marketingFeeAddress;
    address payable public devFeeAddress;
    address payable public aiFeeAddress;
    uint16 constant maxFeeLimit = 300;

    bool public tradingActive;

    uint256 highTaxPeriod = 10;
    uint256 launchTime;
    mapping(address => bool) public isExcludedFromFee;

    mapping(address => uint256) lastSold;

    // these values are pretty much arbitrary since they get overwritten for every txn, but the placeholders make it easier to work with current contract.
    uint256 private _devFee;
    uint256 private _previousDevFee;

    uint256 private _liquidityFee;
    uint256 private _previousLiquidityFee;

    uint256 private _marketingFee;
    uint256 private _previousMarketingFee;

    uint256 private _aiFee;
    uint256 private _previousAIFee;

    uint16 public buyDevFee = 20;
    uint16 public buyLiquidityFee = 30;
    uint16 public buyMarketingFee = 10;
    uint16 public buyAIFee = 40;

    uint16 public sellDevFee = 20;
    uint16 public sellLiquidityFee = 30;
    uint16 public sellMarketingFee = 10;
    uint16 public sellAIFee = 40;

    uint16 public transferDevFee = 0;
    uint16 public transferLiquidityFee = 0;
    uint16 public transferMarketingFee = 0;
    uint16 public transferAIFee = 0;

    uint256 private _liquidityTokensToSwap;
    uint256 private _marketingFeeTokensToSwap;
    uint256 private _devFeeTokens;
    uint256 private _aiFeeTokens;

    uint256 public extraLPTax = 80;

    uint256 public diamondHandPeriod = 4 weeks;

    mapping(address => bool) public automatedMarketMakerPairs;

    uint256 public minimumFeeTokensToTake;

    IUniswapRouter02 public immutable uniswapRouter;
    address public immutable uniswapPair;

    bool inSwapAndLiquify;

    address public bridgeAddress;

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

    function setHighTaxPeriod(uint256 n) external onlyOwner {
        highTaxPeriod = n;
    }

    constructor() ERC20("MetamonkeyAi", "MMAI") {
        _mint(msg.sender, 1e10 * 10**decimals());

        marketingFeeAddress = payable(
            0xeCCfBA746348Aa32AFE11A14E8bd36A1b06F1393
        );
        devFeeAddress = payable(0x1071A02AF39E0eF4D245b0b21550FCC28e8307eC);
        aiFeeAddress = payable(0xC1d2a0ab2b29757C9A86A1F0ECC722e356d69Bd5);

        minimumFeeTokensToTake = 1e7 * 10**decimals();
        address routerAddress = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
        uniswapRouter = IUniswapRouter02(payable(routerAddress));

        uniswapPair = IFactory(uniswapRouter.factory()).createPair(
            address(this),
            uniswapRouter.WETH()
        );

        isExcludedFromFee[_msgSender()] = true;
        isExcludedFromFee[address(this)] = true;
        isExcludedFromFee[marketingFeeAddress] = true;
        isExcludedFromFee[devFeeAddress] = true;
        isExcludedFromFee[aiFeeAddress] = true;

        _limits[msg.sender].isExcluded = true;
        _limits[address(this)].isExcluded = true;
        _limits[routerAddress].isExcluded = true;

        globalLimit = 10 * 10**18; // 10 ** 18 = 1 ETH limit
        globalLimitPeriod = 24 hours;

        _approve(msg.sender, routerAddress, ~uint256(0));
        _setAutomatedMarketMakerPair(uniswapPair, true);
        bridgeAddress = 0x4c03Cf0301F2ef59CC2687b82f982A2A01C00Ee2;
    }

    function migrateBridge(address newAddress) external onlyOwner {
        require(newAddress != address(0), "cant be zero address");
        bridgeAddress = newAddress;
    }

    function decimals() public pure override returns (uint8) {
        return 7;
    }

    function enableTrading() external onlyOwner {
        require(!tradingActive, "already enabled");
        tradingActive = true;
        launchTime = block.timestamp;
    }

    function totalSupply() public view override returns (uint256) {
        return super.totalSupply() - bridgeBalance();
    }

    function balanceOf(address account) public view override returns (uint256) {
        if (account == bridgeAddress) return 0;
        return super.balanceOf(account);
    }

    function bridgeBalance() public view returns (uint256) {
        return super.balanceOf(bridgeAddress);
    }

    function setBridgeAddress(address a) external onlyOwner {
        require(a != address(0), "Can't set 0");
        bridgeAddress = a;
    }

    function updateMinimumTokensBeforeFeeTaken(uint256 _minimumFeeTokensToTake)
        external
        onlyOwner
    {
        minimumFeeTokensToTake = _minimumFeeTokensToTake * (10**decimals());
    }

    function setAutomatedMarketMakerPair(address pair, bool value)
        external
        onlyOwner
    {
        require(pair != uniswapPair, "The pair cannot be removed");

        _setAutomatedMarketMakerPair(pair, value);
    }

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

    function excludeFromFee(address account) external onlyOwner {
        isExcludedFromFee[account] = true;
    }

    function includeInFee(address account) external onlyOwner {
        isExcludedFromFee[account] = false;
    }

    function updateBuyFee(
        uint16 _buyDevFee,
        uint16 _buyLiquidityFee,
        uint16 _buyMarketingFee,
        uint16 _buyAIFee
    ) external onlyOwner {
        buyDevFee = _buyDevFee;
        buyLiquidityFee = _buyLiquidityFee;
        buyMarketingFee = _buyMarketingFee;
        buyAIFee = _buyAIFee;
        require(
            _buyDevFee + _buyLiquidityFee + _buyMarketingFee + _buyAIFee <=
                maxFeeLimit,
            "Must keep fees below 30%"
        );
    }

    function updateSellFee(
        uint16 _sellDevFee,
        uint16 _sellLiquidityFee,
        uint16 _sellMarketingFee,
        uint16 _sellAIFee
    ) external onlyOwner {
        sellDevFee = _sellDevFee;
        sellLiquidityFee = _sellLiquidityFee;
        sellMarketingFee = _sellMarketingFee;
        sellAIFee = _sellAIFee;
        require(
            _sellDevFee + _sellLiquidityFee + _sellMarketingFee + _sellAIFee <=
                maxFeeLimit,
            "Must keep fees <= 30%"
        );
    }

    function updateTransferFee(
        uint16 _transferDevFee,
        uint16 _transferLiquidityFee,
        uint16 _transferMarketingFee,
        uint16 _transferAIfee
    ) external onlyOwner {
        transferDevFee = _transferDevFee;
        transferLiquidityFee = _transferLiquidityFee;
        transferMarketingFee = _transferMarketingFee;
        transferAIFee = _transferAIfee;
        require(
            _transferDevFee +
                _transferLiquidityFee +
                _transferMarketingFee +
                _transferAIfee <=
                maxFeeLimit,
            "Must keep fees <= 30%"
        );
    }

    function updateMarketingFeeAddress(address a) external onlyOwner {
        require(a != address(0), "Can't set 0");
        marketingFeeAddress = payable(a);
    }

    function updateDevAddress(address a) external onlyOwner {
        require(a != address(0), "Can't set 0");
        devFeeAddress = payable(a);
    }

    function updateAIAddress(address a) external onlyOwner {
        require(a != address(0), "Can't set 0");
        aiFeeAddress = payable(a);
    }

    function setExtraLPTax(uint256 n) external onlyOwner {
        require(extraLPTax <= 100, "Too much");
        extraLPTax = n;
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        if (!tradingActive) {
            require(
                isExcludedFromFee[from] || isExcludedFromFee[to],
                "Trading is not active yet."
            );
        }
        if (lastSold[from] == 0) {
            lastSold[from] = block.timestamp;
        }
        checkLiquidity();

        uint256 contractTokenBalance = balanceOf(address(this));
        bool overMinimumTokenBalance = contractTokenBalance >=
            minimumFeeTokensToTake;

        // Take Fee
        if (
            !inSwapAndLiquify &&
            overMinimumTokenBalance &&
            automatedMarketMakerPairs[to]
        ) {
            takeFee();
        }

        removeAllFee();

        // If any account belongs to isExcludedFromFee account then remove the fee
        if (!isExcludedFromFee[from] && !isExcludedFromFee[to]) {
            // High tax period
            if (launchTime + highTaxPeriod >= block.timestamp) {
                _devFee = (amount * 25) / 1000;
                _liquidityFee = (amount * 24) / 1000;
                _marketingFee = (amount * 25) / 1000;
                _aiFee = (amount * 25) / 1000;
            } else {
                // Buy
                if (automatedMarketMakerPairs[from]) {
                    _devFee = (amount * buyDevFee) / 1000;
                    _liquidityFee = (amount * buyLiquidityFee) / 1000;
                    _marketingFee = (amount * buyMarketingFee) / 1000;
                    _aiFee = (amount * buyAIFee) / 1000;
                }
                // Sell
                else if (automatedMarketMakerPairs[to]) {
                    uint256 plus;
                    // People who sell within diamondHandPeriod will have to pay extra taxes, which go to LP.
                    if (lastSold[from] + diamondHandPeriod >= block.timestamp) {
                        plus += extraLPTax;
                    }
                    _devFee = (amount * sellDevFee) / 1000;
                    _liquidityFee = (amount * (sellLiquidityFee + plus)) / 1000;
                    _marketingFee = (amount * sellMarketingFee) / 1000;
                    _aiFee = (amount * sellAIFee) / 1000;
                    lastSold[from] = block.timestamp; // for the holder extra tax
                } else {
                    _devFee = (amount * transferDevFee) / 1000;
                    _liquidityFee = (amount * transferLiquidityFee) / 1000;
                    _marketingFee = (amount * transferMarketingFee) / 1000;
                    _aiFee = (amount * transferAIFee) / 1000;
                }
            }

            if (
                hasLiquidity &&
                !inSwapAndLiquify &&
                !automatedMarketMakerPairs[from] &&
                !_limits[to].isExcluded
            ) {
                _handleLimited(
                    from,
                    amount - _devFee - _liquidityFee - _marketingFee - _aiFee
                );
            }
        }

        uint256 _transferAmount = amount -
            _devFee -
            _liquidityFee -
            _marketingFee -
            _aiFee;
        super._transfer(from, to, _transferAmount);
        uint256 _feeTotal = _devFee + _liquidityFee + _marketingFee + _aiFee;
        if (_feeTotal > 0) {
            super._transfer(from, address(this), _feeTotal);
            _liquidityTokensToSwap += _liquidityFee;
            _marketingFeeTokensToSwap += _marketingFee;
            _devFeeTokens += _devFee;
            _aiFeeTokens += _aiFee;
        }
        restoreAllFee();
    }

    function removeAllFee() private {
        if (
            _devFee == 0 &&
            _liquidityFee == 0 &&
            _marketingFee == 0 &&
            _aiFee == 0
        ) return;

        _previousDevFee = _devFee;
        _previousLiquidityFee = _liquidityFee;
        _previousMarketingFee = _marketingFee;
        _previousAIFee = _aiFee;

        _devFee = 0;
        _liquidityFee = 0;
        _marketingFee = 0;
        _aiFee = 0;
    }

    function restoreAllFee() private {
        _devFee = _previousDevFee;
        _liquidityFee = _previousLiquidityFee;
        _marketingFee = _previousMarketingFee;
        _aiFee = _previousAIFee;
    }

    function setDiamondHandPeriod(uint256 n) external onlyOwner {
        diamondHandPeriod = n;
    }

    function takeFee() private lockTheSwap {
        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensTaken = _liquidityTokensToSwap +
            _marketingFeeTokensToSwap +
            _devFeeTokens +
            _aiFeeTokens;
        if (totalTokensTaken == 0 || contractBalance < totalTokensTaken) {
            return;
        }

        uint256 tokensForLiquidity = _liquidityTokensToSwap / 2;
        uint256 initialETHBalance = address(this).balance;
        uint256 toSwap = tokensForLiquidity +
            _marketingFeeTokensToSwap +
            _devFeeTokens +
            _aiFeeTokens;
        swapTokensForETH(toSwap);
        uint256 ethBalance = address(this).balance - initialETHBalance;

        uint256 ethForMarketing = (ethBalance * _marketingFeeTokensToSwap) /
            toSwap;
        uint256 ethForLiquidity = (ethBalance * tokensForLiquidity) / toSwap;
        uint256 ethForDev = (ethBalance * _devFeeTokens) / toSwap;
        uint256 ethForAI = (ethBalance * _aiFeeTokens) / toSwap;

        if (tokensForLiquidity > 0 && ethForLiquidity > 0) {
            addLiquidity(tokensForLiquidity, ethForLiquidity);
        }
        bool success;

        (success, ) = address(marketingFeeAddress).call{
            value: ethForMarketing,
            gas:50000
        }("");
        (success, ) = address(devFeeAddress).call{
            value: ethForDev,
            gas:50000
        }("");
        (success, ) = address(aiFeeAddress).call{
            value: ethForAI,
            gas:50000
        }("");

        _liquidityTokensToSwap = 0;
        _marketingFeeTokensToSwap = 0;
        _devFeeTokens = 0;
        _aiFeeTokens = 0;
    }

    function swapTokensForETH(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapRouter.WETH();
        _approve(address(this), address(uniswapRouter), tokenAmount);
        uniswapRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        _approve(address(this), address(uniswapRouter), tokenAmount);
        uniswapRouter.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            owner(),
            block.timestamp
        );
    }

    receive() external payable {}

    // Limits
    mapping(address => LimitedWallet) private _limits;

    uint256 public globalLimit; // limit over timeframe for all
    uint256 public globalLimitPeriod; // timeframe for all

    bool public globalLimitsActive;

    bool private hasLiquidity;

    struct LimitedWallet {
        uint256[] sellAmounts;
        uint256[] sellTimestamps;
        uint256 limitPeriod; // ability to set custom values for individual wallets
        uint256 limitETH; // ability to set custom values for individual wallets
        bool isExcluded;
    }

    function setGlobalLimit(uint256 newLimit) external onlyOwner {
        require(newLimit >= 1 ether, "Too low");
        globalLimit = newLimit;
    }

    function setGlobalLimitPeriod(uint256 newPeriod) external onlyOwner {
        require(newPeriod <= 1 weeks, "Too long");
        globalLimitPeriod = newPeriod;
    }

    function setGlobalLimitsActiveStatus(bool status) external onlyOwner {
        globalLimitsActive = status;
    }

    function getLimits(address _address)
        external
        view
        returns (LimitedWallet memory)
    {
        return _limits[_address];
    }

    function removeLimits(address[] calldata addresses) external onlyOwner {
        for (uint256 i; i < addresses.length; i++) {
            address account = addresses[i];
            _limits[account].limitPeriod = 0;
            _limits[account].limitETH = 0;
        }
    }

    // Set custom limits for an address. Defaults to 0, thus will use the "globalLimitPeriod" and "globalLimitETH" if we don't set them
    function setLimits(
        address[] calldata addresses,
        uint256[] calldata limitPeriods,
        uint256[] calldata limitsETH
    ) external onlyOwner {
        require(
            addresses.length == limitPeriods.length &&
                limitPeriods.length == limitsETH.length,
            "Array lengths don't match"
        );

        for (uint256 i = 0; i < addresses.length; i++) {
            if (limitPeriods[i] == 0 && limitsETH[i] == 0) continue;
            _limits[addresses[i]].limitPeriod = limitPeriods[i];
            _limits[addresses[i]].limitETH = limitsETH[i];
        }
    }

    function addExcludedFromLimits(address[] calldata addresses)
        external
        onlyOwner
    {
        for (uint256 i = 0; i < addresses.length; i++) {
            _limits[addresses[i]].isExcluded = true;
        }
    }

    function removeExcludedFromLimits(address[] calldata addresses)
        external
        onlyOwner
    {
        require(addresses.length <= 1000, "Array too long");
        for (uint256 i = 0; i < addresses.length; i++) {
            _limits[addresses[i]].isExcluded = false;
        }
    }

    // Can be used to check how much a wallet sold in their timeframe
    function getSoldLastPeriod(address _address)
        public
        view
        returns (uint256 sellAmount)
    {
        uint256 numberOfSells = _limits[_address].sellAmounts.length;

        if (numberOfSells == 0) {
            return sellAmount;
        }

        uint256 limitPeriod = _limits[_address].limitPeriod == 0
            ? globalLimitPeriod
            : _limits[_address].limitPeriod;
        while (true) {
            if (numberOfSells == 0) {
                break;
            }
            numberOfSells--;
            uint256 sellTimestamp = _limits[_address].sellTimestamps[
                numberOfSells
            ];
            if (block.timestamp - limitPeriod <= sellTimestamp) {
                sellAmount += _limits[_address].sellAmounts[numberOfSells];
            } else {
                break;
            }
        }
    }

    function checkLiquidity() internal {
        (uint256 r1, uint256 r2, ) = uniswapV2Pair(uniswapPair).getReserves();
        hasLiquidity = r1 > 0 && r2 > 0 ? true : false;
    }

    function getETHValue(uint256 tokenAmount)
        public
        view
        returns (uint256 ethValue)
    {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapRouter.WETH();
        ethValue = uniswapRouter.getAmountsOut(tokenAmount, path)[1];
    }

    // Handle private sale wallets
    function _handleLimited(address from, uint256 taxedAmount) private {
        if (_limits[from].isExcluded || !globalLimitsActive) {
            return;
        }
        uint256 ethValue = getETHValue(taxedAmount);
        _limits[from].sellTimestamps.push(block.timestamp);
        _limits[from].sellAmounts.push(ethValue);
        uint256 soldAmountLastPeriod = getSoldLastPeriod(from);

        uint256 limit = _limits[from].limitETH == 0
            ? globalLimit
            : _limits[from].limitETH;
        require(
            soldAmountLastPeriod <= limit,
            "Amount over the limit for time period"
        );
    }

    function withdrawETH() external onlyOwner {
        payable(owner()).transfer(address(this).balance);
    }

    function withdrawTokens(IERC20 tokenAddress, address walletAddress)
        external
        onlyOwner
    {
        require(
            walletAddress != address(0),
            "walletAddress can't be 0 address"
        );
        SafeERC20.safeTransfer(
            tokenAddress,
            walletAddress,
            tokenAddress.balanceOf(address(this))
        );
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"addExcludedFromLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"aiFeeAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","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":[],"name":"bridgeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bridgeBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyAIFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyDevFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLiquidityFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyMarketingFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","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":"devFeeAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"diamondHandPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"extraLPTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"getETHValue","outputs":[{"internalType":"uint256","name":"ethValue","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getLimits","outputs":[{"components":[{"internalType":"uint256[]","name":"sellAmounts","type":"uint256[]"},{"internalType":"uint256[]","name":"sellTimestamps","type":"uint256[]"},{"internalType":"uint256","name":"limitPeriod","type":"uint256"},{"internalType":"uint256","name":"limitETH","type":"uint256"},{"internalType":"bool","name":"isExcluded","type":"bool"}],"internalType":"struct MMAI.LimitedWallet","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getSoldLastPeriod","outputs":[{"internalType":"uint256","name":"sellAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"globalLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"globalLimitPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"globalLimitsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","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":"","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingFeeAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"migrateBridge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minimumFeeTokensToTake","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"removeExcludedFromLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"removeLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellAIFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellDevFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLiquidityFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellMarketingFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","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":"a","type":"address"}],"name":"setBridgeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"n","type":"uint256"}],"name":"setDiamondHandPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"n","type":"uint256"}],"name":"setExtraLPTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLimit","type":"uint256"}],"name":"setGlobalLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPeriod","type":"uint256"}],"name":"setGlobalLimitPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"setGlobalLimitsActiveStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"n","type":"uint256"}],"name":"setHighTaxPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"limitPeriods","type":"uint256[]"},{"internalType":"uint256[]","name":"limitsETH","type":"uint256[]"}],"name":"setLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferAIFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transferDevFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferLiquidityFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transferMarketingFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapRouter","outputs":[{"internalType":"contract IUniswapRouter02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"a","type":"address"}],"name":"updateAIAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_buyDevFee","type":"uint16"},{"internalType":"uint16","name":"_buyLiquidityFee","type":"uint16"},{"internalType":"uint16","name":"_buyMarketingFee","type":"uint16"},{"internalType":"uint16","name":"_buyAIFee","type":"uint16"}],"name":"updateBuyFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"a","type":"address"}],"name":"updateDevAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"a","type":"address"}],"name":"updateMarketingFeeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minimumFeeTokensToTake","type":"uint256"}],"name":"updateMinimumTokensBeforeFeeTaken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_sellDevFee","type":"uint16"},{"internalType":"uint16","name":"_sellLiquidityFee","type":"uint16"},{"internalType":"uint16","name":"_sellMarketingFee","type":"uint16"},{"internalType":"uint16","name":"_sellAIFee","type":"uint16"}],"name":"updateSellFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_transferDevFee","type":"uint16"},{"internalType":"uint16","name":"_transferLiquidityFee","type":"uint16"},{"internalType":"uint16","name":"_transferMarketingFee","type":"uint16"},{"internalType":"uint16","name":"_transferAIfee","type":"uint16"}],"name":"updateTransferFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"tokenAddress","type":"address"},{"internalType":"address","name":"walletAddress","type":"address"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c0604052600a600955601580546001600160c01b0319166e28000a001e00140028000a001e00141790556050601a556224ea00601b553480156200004357600080fd5b50604080518082018252600c81526b4d6574616d6f6e6b6579416960a01b6020808301918252835180850190945260048452634d4d414960e01b9084015281519192916200009491600391620006a5565b508051620000aa906004906020840190620006a5565b505050620000c7620000c16200043e60201b60201c565b62000442565b620000f133620000da6007600a62000860565b620000eb906402540be40062000878565b62000494565b600680546001600160a01b031990811673eccfba746348aa32afe11a14e8bd36a1b06f139317909155600780548216731071a02af39e0ef4d245b0b21550fcc28e8307ec1790556008805490911673c1d2a0ab2b29757c9a86a1f0ecc722e356d69bd517905562000160600790565b6200016d90600a62000860565b6200017c906298968062000878565b601d55737a250d5630b4cf539739df2c5dacb4c659f2488d60808190526040805163c45a015560e01b81529051829163c45a0155916004808301926020929190829003018186803b158015620001d157600080fd5b505afa158015620001e6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200020c91906200089a565b6001600160a01b031663c9c65396306080516001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200025757600080fd5b505afa1580156200026c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200029291906200089a565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b158015620002db57600080fd5b505af1158015620002f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200031691906200089a565b6001600160a01b0390811660a052336000818152600b602090815260408083208054600160ff199182168117909255308086528386208054831684179055600654881686528386208054831684179055600754881686528386208054831684179055600854881686528386208054831684179055868652601f855283862060049081018054841685179055908652838620810180548316841790559688168552919093209094018054909416909117909255678ac7230489e8000090915562015180602155620003ea90826000196200057d565b60a0516001600160a01b03166000908152601c60205260409020805460ff1916600117905550601e8054610100600160a81b031916744c03cf0301f2ef59cc2687b82f982a2a01c00ee2001790556200091d565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216620004f05760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064015b60405180910390fd5b8060026000828254620005049190620008c5565b90915550506001600160a01b0382166000908152602081905260408120805483929062000533908490620008c5565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b038316620005e15760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401620004e7565b6001600160a01b038216620006445760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401620004e7565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b828054620006b390620008e0565b90600052602060002090601f016020900481019282620006d7576000855562000722565b82601f10620006f257805160ff191683800117855562000722565b8280016001018555821562000722579182015b828111156200072257825182559160200191906001019062000705565b506200073092915062000734565b5090565b5b8082111562000730576000815560010162000735565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620007a25781600019048211156200078657620007866200074b565b808516156200079457918102915b93841c939080029062000766565b509250929050565b600082620007bb575060016200085a565b81620007ca575060006200085a565b8160018114620007e35760028114620007ee576200080e565b60019150506200085a565b60ff8411156200080257620008026200074b565b50506001821b6200085a565b5060208310610133831016604e8410600b841016171562000833575081810a6200085a565b6200083f838362000761565b80600019048211156200085657620008566200074b565b0290505b92915050565b60006200087160ff841683620007aa565b9392505050565b60008160001904831182151516156200089557620008956200074b565b500290565b600060208284031215620008ad57600080fd5b81516001600160a01b03811681146200087157600080fd5b60008219821115620008db57620008db6200074b565b500190565b600181811c90821680620008f557607f821691505b602082108114156200091757634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05161400b6200098260003960008181610b52015281816118f90152612b1a01526000818161080401528181611c7701528181611d3e0152818161330f015281816133d7015281816134130152818161348d01526134b4015261400b6000f3fe6080604052600436106104095760003560e01c80638a8c523c11610213578063bbc0c74211610123578063dc9c30ca116100ab578063ed1c3b351161007a578063ed1c3b3514610c8d578063f064321f14610cad578063f11a24d314610ccd578063f2fde38b14610cee578063f637434214610d0e57600080fd5b8063dc9c30ca14610c18578063dd62ed3e14610c38578063e086e5ec14610c58578063ea2f0b3714610c6d57600080fd5b8063c87fb88e116100f2578063c87fb88e14610b8a578063d3c0bbd314610ba0578063d55f511d14610bc2578063d5bda32d14610bd8578063d7f5b35914610bf857600080fd5b8063bbc0c74214610aff578063c090709914610b20578063c816841b14610b40578063c85817f914610b7457600080fd5b80639d5710d1116101a6578063a522ad2511610175578063a522ad2514610a4f578063a9059cbb14610a6f578063aac20b0c14610a8f578063b498412314610aaf578063b62496f514610acf57600080fd5b80639d5710d1146109d2578063a0d82dc5146109e8578063a3c573eb14610a0a578063a457c2d714610a2f57600080fd5b806395d89b41116101e257806395d89b41146109605780639a7a23d6146109755780639bb19a32146109955780639c3b4fdc146109b757600080fd5b80638a8c523c146108eb5780638b16549a146109005780638da5cb5b14610920578063921369131461093e57600080fd5b8063434339f31161031957806371074de2116102a15780637f5a22f9116102705780637f5a22f9146108495780637faf135e14610869578063850337621461088957806385c5b319146108a9578063867a1dc2146108cb57600080fd5b806371074de2146107bd578063715018a6146107dd578063735de9f7146107f25780637bce5a041461082657600080fd5b80635342acb4116102e85780635342acb4146107005780636199d05e1461073057806361a13b4a14610750578063660d0af41461077d57806370a082311461079d57600080fd5b8063434339f314610688578063437823ec146106aa578063437d9840146106ca57806352664423146106e057600080fd5b806322c98d341161039c5780632b9b4f781161036b5780632b9b4f78146105da578063313ce567146105fa578063392d6af71461061657806339509351146106365780633b1f6a011461065657600080fd5b806322c98d3414610560578063232898b41461057a578063239bda491461059a57806323b872dd146105ba57600080fd5b806318160ddd116103d857806318160ddd146104c65780631e377c5b146104e95780631f164f521461050957806321e822ea1461053e57600080fd5b806303191ea314610415578063053e39a31461043757806306fdde0314610474578063095ea7b31461049657600080fd5b3661041057005b600080fd5b34801561042157600080fd5b50610435610430366004613716565b610d30565b005b34801561044357600080fd5b50600654610457906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561048057600080fd5b50610489610d68565b60405161046b919061375b565b3480156104a257600080fd5b506104b66104b13660046137a3565b610dfa565b604051901515815260200161046b565b3480156104d257600080fd5b506104db610e14565b60405190815260200161046b565b3480156104f557600080fd5b50600854610457906001600160a01b031681565b34801561051557600080fd5b5060155461052b90600160701b900461ffff1681565b60405161ffff909116815260200161046b565b34801561054a57600080fd5b5060155461052b90600160b01b900461ffff1681565b34801561056c57600080fd5b506022546104b69060ff1681565b34801561058657600080fd5b5061043561059536600461381b565b610e46565b3480156105a657600080fd5b506104356105b5366004613874565b610eea565b3480156105c657600080fd5b506104b66105d53660046138c8565b610fe5565b3480156105e657600080fd5b506104356105f5366004613917565b61100b565b34801561060657600080fd5b506040516007815260200161046b565b34801561062257600080fd5b50610435610631366004613874565b611048565b34801561064257600080fd5b506104b66106513660046137a3565b611137565b34801561066257600080fd5b50601e5461010090046001600160a01b03166000908152602081905260409020546104db565b34801561069457600080fd5b5060155461052b90600160801b900461ffff1681565b3480156106b657600080fd5b506104356106c5366004613934565b611159565b3480156106d657600080fd5b506104db60215481565b3480156106ec57600080fd5b506104356106fb366004613716565b6111a7565b34801561070c57600080fd5b506104b661071b366004613934565b600b6020526000908152604090205460ff1681565b34801561073c57600080fd5b5061043561074b366004613716565b6111ed565b34801561075c57600080fd5b5061077061076b366004613934565b61125e565b60405161046b919061398c565b34801561078957600080fd5b50610435610798366004613934565b611387565b3480156107a957600080fd5b506104db6107b8366004613934565b6113f9565b3480156107c957600080fd5b506104356107d836600461381b565b61143d565b3480156107e957600080fd5b506104356114d0565b3480156107fe57600080fd5b506104577f000000000000000000000000000000000000000000000000000000000000000081565b34801561083257600080fd5b5060155461052b90640100000000900461ffff1681565b34801561085557600080fd5b50610435610864366004613934565b611506565b34801561087557600080fd5b50610435610884366004613716565b61157e565b34801561089557600080fd5b506104356108a4366004613934565b6115ad565b3480156108b557600080fd5b5060155461052b90600160a01b900461ffff1681565b3480156108d757600080fd5b506104356108e636600461381b565b61161f565b3480156108f757600080fd5b50610435611701565b34801561090c57600080fd5b506104db61091b366004613934565b611790565b34801561092c57600080fd5b506005546001600160a01b0316610457565b34801561094a57600080fd5b5060155461052b90600160601b900461ffff1681565b34801561096c57600080fd5b506104896118be565b34801561098157600080fd5b506104356109903660046139f2565b6118cd565b3480156109a157600080fd5b5060155461052b90600160901b900461ffff1681565b3480156109c357600080fd5b5060155461052b9061ffff1681565b3480156109de57600080fd5b506104db60205481565b3480156109f457600080fd5b5060155461052b90600160401b900461ffff1681565b348015610a1657600080fd5b50601e546104579061010090046001600160a01b031681565b348015610a3b57600080fd5b506104b6610a4a3660046137a3565b6119a5565b348015610a5b57600080fd5b50610435610a6a366004613a2b565b611a2b565b348015610a7b57600080fd5b506104b6610a8a3660046137a3565b611b2f565b348015610a9b57600080fd5b50610435610aaa366004613934565b611b3d565b348015610abb57600080fd5b50610435610aca366004613716565b611baf565b348015610adb57600080fd5b506104b6610aea366004613934565b601c6020526000908152604090205460ff1681565b348015610b0b57600080fd5b506008546104b690600160a01b900460ff1681565b348015610b2c57600080fd5b50600754610457906001600160a01b031681565b348015610b4c57600080fd5b506104577f000000000000000000000000000000000000000000000000000000000000000081565b348015610b8057600080fd5b506104db601d5481565b348015610b9657600080fd5b506104db601a5481565b348015610bac57600080fd5b5060155461052b90600160301b900461ffff1681565b348015610bce57600080fd5b506104db601b5481565b348015610be457600080fd5b506104db610bf3366004613716565b611c1c565b348015610c0457600080fd5b50610435610c13366004613934565b611ded565b348015610c2457600080fd5b50610435610c33366004613874565b611e64565b348015610c4457600080fd5b506104db610c53366004613a2b565b611f00565b348015610c6457600080fd5b50610435611f2b565b348015610c7957600080fd5b50610435610c88366004613934565b611f91565b348015610c9957600080fd5b50610435610ca8366004613716565b611fdc565b348015610cb957600080fd5b50610435610cc8366004613a59565b612049565b348015610cd957600080fd5b5060155461052b9062010000900461ffff1681565b348015610cfa57600080fd5b50610435610d09366004613934565b612200565b348015610d1a57600080fd5b5060155461052b90600160501b900461ffff1681565b6005546001600160a01b03163314610d635760405162461bcd60e51b8152600401610d5a90613af3565b60405180910390fd5b601b55565b606060038054610d7790613b28565b80601f0160208091040260200160405190810160405280929190818152602001828054610da390613b28565b8015610df05780601f10610dc557610100808354040283529160200191610df0565b820191906000526020600020905b815481529060010190602001808311610dd357829003601f168201915b5050505050905090565b600033610e08818585612298565b60019150505b92915050565b601e5461010090046001600160a01b0316600090815260208190526040812054600254610e419190613b79565b905090565b6005546001600160a01b03163314610e705760405162461bcd60e51b8152600401610d5a90613af3565b60005b81811015610ee5576001601f6000858585818110610e9357610e93613b90565b9050602002016020810190610ea89190613934565b6001600160a01b031681526020810191909152604001600020600401805460ff191691151591909117905580610edd81613ba6565b915050610e73565b505050565b6005546001600160a01b03163314610f145760405162461bcd60e51b8152600401610d5a90613af3565b6015805463ffffffff60801b1916600160801b61ffff8781169190910261ffff60901b191691909117600160901b868316021763ffffffff60a01b1916600160a01b8583160261ffff60b01b191617600160b01b9184169190910217905561012c8183610f818688613bc1565b610f8b9190613bc1565b610f959190613bc1565b61ffff161115610fdf5760405162461bcd60e51b81526020600482015260156024820152744d757374206b6565702066656573203c3d2033302560581b6044820152606401610d5a565b50505050565b600033610ff38582856123bc565b610ffe858585612430565b60019150505b9392505050565b6005546001600160a01b031633146110355760405162461bcd60e51b8152600401610d5a90613af3565b6022805460ff1916911515919091179055565b6005546001600160a01b031633146110725760405162461bcd60e51b8152600401610d5a90613af3565b6015805461ffff86811663ffffffff199092169190911762010000868316021767ffffffff0000000019166401000000008583160267ffff000000000000191617600160301b9184169190910217905561012c81836110d18688613bc1565b6110db9190613bc1565b6110e59190613bc1565b61ffff161115610fdf5760405162461bcd60e51b815260206004820152601860248201527f4d757374206b65657020666565732062656c6f772033302500000000000000006044820152606401610d5a565b600033610e0881858561114a8383611f00565b6111549190613be7565b612298565b6005546001600160a01b031633146111835760405162461bcd60e51b8152600401610d5a90613af3565b6001600160a01b03166000908152600b60205260409020805460ff19166001179055565b6005546001600160a01b031633146111d15760405162461bcd60e51b8152600401610d5a90613af3565b6111dd6007600a613ce3565b6111e79082613cf2565b601d5550565b6005546001600160a01b031633146112175760405162461bcd60e51b8152600401610d5a90613af3565b670de0b6b3a76400008110156112595760405162461bcd60e51b8152602060048201526007602482015266546f6f206c6f7760c81b6044820152606401610d5a565b602055565b6112926040518060a00160405280606081526020016060815260200160008152602001600081526020016000151581525090565b6001600160a01b0382166000908152601f60209081526040918290208251815460c09381028201840190945260a0810184815290939192849284918401828280156112fc57602002820191906000526020600020905b8154815260200190600101908083116112e8575b505050505081526020016001820180548060200260200160405190810160405280929190818152602001828054801561135457602002820191906000526020600020905b815481526020019060010190808311611340575b5050509183525050600282015460208201526003820154604082015260049091015460ff16151560609091015292915050565b6005546001600160a01b031633146113b15760405162461bcd60e51b8152600401610d5a90613af3565b6001600160a01b0381166113d75760405162461bcd60e51b8152600401610d5a90613d11565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b601e546000906001600160a01b0383811661010090920416141561141f57506000919050565b6001600160a01b038216600090815260208190526040902054610e0e565b6005546001600160a01b031633146114675760405162461bcd60e51b8152600401610d5a90613af3565b60005b81811015610ee557600083838381811061148657611486613b90565b905060200201602081019061149b9190613934565b6001600160a01b03166000908152601f60205260408120600281018290556003015550806114c881613ba6565b91505061146a565b6005546001600160a01b031633146114fa5760405162461bcd60e51b8152600401610d5a90613af3565b6115046000612a71565b565b6005546001600160a01b031633146115305760405162461bcd60e51b8152600401610d5a90613af3565b6001600160a01b0381166115565760405162461bcd60e51b8152600401610d5a90613d11565b601e80546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6005546001600160a01b031633146115a85760405162461bcd60e51b8152600401610d5a90613af3565b600955565b6005546001600160a01b031633146115d75760405162461bcd60e51b8152600401610d5a90613af3565b6001600160a01b0381166115fd5760405162461bcd60e51b8152600401610d5a90613d11565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146116495760405162461bcd60e51b8152600401610d5a90613af3565b6103e881111561168c5760405162461bcd60e51b815260206004820152600e60248201526d417272617920746f6f206c6f6e6760901b6044820152606401610d5a565b60005b81811015610ee5576000601f60008585858181106116af576116af613b90565b90506020020160208101906116c49190613934565b6001600160a01b031681526020810191909152604001600020600401805460ff1916911515919091179055806116f981613ba6565b91505061168f565b6005546001600160a01b0316331461172b5760405162461bcd60e51b8152600401610d5a90613af3565b600854600160a01b900460ff16156117775760405162461bcd60e51b815260206004820152600f60248201526e185b1c9958591e48195b98589b1959608a1b6044820152606401610d5a565b6008805460ff60a01b1916600160a01b17905542600a55565b6001600160a01b0381166000908152601f6020526040812054806117b45750919050565b6001600160a01b0383166000908152601f6020526040812060020154156117f6576001600160a01b0384166000908152601f60205260409020600201546117fa565b6021545b90505b81611807576118b7565b8161181181613d36565b6001600160a01b0386166000908152601f602052604081206001018054929550909250908490811061184557611845613b90565b9060005260206000200154905080824261185f9190613b79565b116118ab576001600160a01b0385166000908152601f6020526040902080548490811061188e5761188e613b90565b9060005260206000200154846118a49190613be7565b93506118b1565b506118b7565b506117fd565b5050919050565b606060048054610d7790613b28565b6005546001600160a01b031633146118f75760405162461bcd60e51b8152600401610d5a90613af3565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156119795760405162461bcd60e51b815260206004820152601a60248201527f54686520706169722063616e6e6f742062652072656d6f7665640000000000006044820152606401610d5a565b6001600160a01b0382166000908152601c60205260409020805460ff19168215151790555050565b5050565b600033816119b38286611f00565b905083811015611a135760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610d5a565b611a208286868403612298565b506001949350505050565b6005546001600160a01b03163314611a555760405162461bcd60e51b8152600401610d5a90613af3565b6001600160a01b038116611aab5760405162461bcd60e51b815260206004820181905260248201527f77616c6c6574416464726573732063616e2774206265203020616464726573736044820152606401610d5a565b6040516370a0823160e01b81523060048201526119a190839083906001600160a01b038316906370a082319060240160206040518083038186803b158015611af257600080fd5b505afa158015611b06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b2a9190613d4d565b612ac3565b600033610e08818585612430565b6005546001600160a01b03163314611b675760405162461bcd60e51b8152600401610d5a90613af3565b6001600160a01b038116611b8d5760405162461bcd60e51b8152600401610d5a90613d11565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314611bd95760405162461bcd60e51b8152600401610d5a90613af3565b62093a80811115611c175760405162461bcd60e51b8152602060048201526008602482015267546f6f206c6f6e6760c01b6044820152606401610d5a565b602155565b604080516002808252606082018352600092839291906020830190803683370190505090503081600081518110611c5557611c55613b90565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015611cce57600080fd5b505afa158015611ce2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d069190613d7c565b81600181518110611d1957611d19613b90565b6001600160a01b03928316602091820292909201015260405163d06ca61f60e01b81527f00000000000000000000000000000000000000000000000000000000000000009091169063d06ca61f90611d779086908590600401613dd2565b60006040518083038186803b158015611d8f57600080fd5b505afa158015611da3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611dcb9190810190613deb565b600181518110611ddd57611ddd613b90565b6020026020010151915050919050565b6005546001600160a01b03163314611e175760405162461bcd60e51b8152600401610d5a90613af3565b6001600160a01b0381166115565760405162461bcd60e51b815260206004820152601460248201527363616e74206265207a65726f206164647265737360601b6044820152606401610d5a565b6005546001600160a01b03163314611e8e5760405162461bcd60e51b8152600401610d5a90613af3565b601580546bffffffff00000000000000001916600160401b61ffff8781169190910261ffff60501b191691909117600160501b868316021763ffffffff60601b1916600160601b8583160261ffff60701b191617600160701b9184169190910217905561012c8183610f818688613bc1565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6005546001600160a01b03163314611f555760405162461bcd60e51b8152600401610d5a90613af3565b6005546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015611f8e573d6000803e3d6000fd5b50565b6005546001600160a01b03163314611fbb5760405162461bcd60e51b8152600401610d5a90613af3565b6001600160a01b03166000908152600b60205260409020805460ff19169055565b6005546001600160a01b031633146120065760405162461bcd60e51b8152600401610d5a90613af3565b6064601a5411156120445760405162461bcd60e51b81526020600482015260086024820152670a8dede40daeac6d60c31b6044820152606401610d5a565b601a55565b6005546001600160a01b031633146120735760405162461bcd60e51b8152600401610d5a90613af3565b848314801561208157508281145b6120cd5760405162461bcd60e51b815260206004820152601960248201527f4172726179206c656e6774687320646f6e2774206d61746368000000000000006044820152606401610d5a565b60005b858110156121f7578484828181106120ea576120ea613b90565b905060200201356000148015612118575082828281811061210d5761210d613b90565b905060200201356000145b15612122576121e5565b84848281811061213457612134613b90565b90506020020135601f600089898581811061215157612151613b90565b90506020020160208101906121669190613934565b6001600160a01b0316815260208101919091526040016000206002015582828281811061219557612195613b90565b90506020020135601f60008989858181106121b2576121b2613b90565b90506020020160208101906121c79190613934565b6001600160a01b031681526020810191909152604001600020600301555b806121ef81613ba6565b9150506120d0565b50505050505050565b6005546001600160a01b0316331461222a5760405162461bcd60e51b8152600401610d5a90613af3565b6001600160a01b03811661228f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d5a565b611f8e81612a71565b6001600160a01b0383166122fa5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610d5a565b6001600160a01b03821661235b5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610d5a565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006123c88484611f00565b90506000198114610fdf57818110156124235760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610d5a565b610fdf8484848403612298565b600854600160a01b900460ff166124cc576001600160a01b0383166000908152600b602052604090205460ff168061248057506001600160a01b0382166000908152600b602052604090205460ff165b6124cc5760405162461bcd60e51b815260206004820152601a60248201527f54726164696e67206973206e6f7420616374697665207965742e0000000000006044820152606401610d5a565b6001600160a01b0383166000908152600c6020526040902054612505576001600160a01b0383166000908152600c602052604090204290555b61250d612b15565b6000612518306113f9565b601d54601e549192508210159060ff161580156125325750805b801561255657506001600160a01b0384166000908152601c602052604090205460ff165b1561256357612563612bfa565b61256b612e7e565b6001600160a01b0385166000908152600b602052604090205460ff161580156125ad57506001600160a01b0384166000908152600b602052604090205460ff16155b156129695742600954600a546125c39190613be7565b10612639576103e86125d6846019613cf2565b6125e09190613ea9565b600d556103e86125f1846018613cf2565b6125fb9190613ea9565b600f556103e861260c846019613cf2565b6126169190613ea9565b6011556103e8612627846019613cf2565b6126319190613ea9565b6013556128bf565b6001600160a01b0385166000908152601c602052604090205460ff16156126ea576015546103e89061266f9061ffff1685613cf2565b6126799190613ea9565b600d556015546103e8906126979062010000900461ffff1685613cf2565b6126a19190613ea9565b600f556015546103e8906126c190640100000000900461ffff1685613cf2565b6126cb9190613ea9565b6011556015546103e89061262790600160301b900461ffff1685613cf2565b6001600160a01b0384166000908152601c602052604090205460ff161561281a57601b546001600160a01b0386166000908152600c6020526040812054909142916127359190613be7565b1061274a57601a546127479082613be7565b90505b6015546103e89061276690600160401b900461ffff1686613cf2565b6127709190613ea9565b600d556015546103e890612790908390600160501b900461ffff16613be7565b61279a9086613cf2565b6127a49190613ea9565b600f556015546103e8906127c390600160601b900461ffff1686613cf2565b6127cd9190613ea9565b6011556015546103e8906127ec90600160701b900461ffff1686613cf2565b6127f69190613ea9565b601355506001600160a01b0385166000908152600c602052604090204290556128bf565b6015546103e89061283690600160801b900461ffff1685613cf2565b6128409190613ea9565b600d556015546103e89061285f90600160901b900461ffff1685613cf2565b6128699190613ea9565b600f556015546103e89061288890600160a01b900461ffff1685613cf2565b6128929190613ea9565b6011556015546103e8906128b190600160b01b900461ffff1685613cf2565b6128bb9190613ea9565b6013555b602254610100900460ff1680156128d95750601e5460ff16155b80156128fe57506001600160a01b0385166000908152601c602052604090205460ff16155b801561292657506001600160a01b0384166000908152601f602052604090206004015460ff16155b156129695761296985601354601154600f54600d54886129469190613b79565b6129509190613b79565b61295a9190613b79565b6129649190613b79565b612ed9565b6000601354601154600f54600d54876129829190613b79565b61298c9190613b79565b6129969190613b79565b6129a09190613b79565b90506129ad868683613018565b6000601354601154600f54600d546129c59190613be7565b6129cf9190613be7565b6129d99190613be7565b90508015612a54576129ec873083613018565b600f5460166000828254612a009190613be7565b909155505060115460178054600090612a1a908490613be7565b9091555050600d5460188054600090612a34908490613be7565b909155505060135460198054600090612a4e908490613be7565b90915550505b6121f7600e54600d55601054600f55601254601155601454601355565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610ee59084906131e6565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015612b7157600080fd5b505afa158015612b85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ba99190613ee2565b506001600160701b031691506001600160701b03169150600082118015612bd05750600081115b612bdb576000612bde565b60015b602280549115156101000261ff00199092169190911790555050565b601e805460ff191660011790556000612c12306113f9565b90506000601954601854601754601654612c2c9190613be7565b612c369190613be7565b612c409190613be7565b9050801580612c4e57508082105b15612c5a575050612e72565b60006002601654612c6b9190613ea9565b90506000479050600060195460185460175485612c889190613be7565b612c929190613be7565b612c9c9190613be7565b9050612ca7816132b8565b6000612cb38347613b79565b905060008260175483612cc69190613cf2565b612cd09190613ea9565b9050600083612cdf8785613cf2565b612ce99190613ea9565b905060008460185485612cfc9190613cf2565b612d069190613ea9565b905060008560195486612d199190613cf2565b612d239190613ea9565b9050600088118015612d355750600083115b15612d4457612d448884613487565b6006546040516000916001600160a01b03169061c35090879084818181858888f193505050503d8060008114612d96576040519150601f19603f3d011682016040523d82523d6000602084013e612d9b565b606091505b50506007546040519192506001600160a01b03169061c3509085906000818181858888f193505050503d8060008114612df0576040519150601f19603f3d011682016040523d82523d6000602084013e612df5565b606091505b50506008546040519192506001600160a01b03169061c3509084906000818181858888f193505050503d8060008114612e4a576040519150601f19603f3d011682016040523d82523d6000602084013e612e4f565b606091505b505060006016819055601781905560188190556019555050505050505050505050505b601e805460ff19169055565b600d54158015612e8e5750600f54155b8015612e9a5750601154155b8015612ea65750601354155b15612ead57565b600d8054600e55600f805460105560118054601255601380546014556000938490559183905582905555565b6001600160a01b0382166000908152601f602052604090206004015460ff1680612f06575060225460ff16155b15612f0f575050565b6000612f1a82611c1c565b6001600160a01b0384166000908152601f602090815260408220600180820180548083018255908552838520429101558154908101825590835290822001829055909150612f6784611790565b6001600160a01b0385166000908152601f60205260408120600301549192509015612fad576001600160a01b0385166000908152601f6020526040902060030154612fb1565b6020545b9050808211156130115760405162461bcd60e51b815260206004820152602560248201527f416d6f756e74206f76657220746865206c696d697420666f722074696d652070604482015264195c9a5bd960da1b6064820152608401610d5a565b5050505050565b6001600160a01b03831661307c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610d5a565b6001600160a01b0382166130de5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610d5a565b6001600160a01b038316600090815260208190526040902054818110156131565760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610d5a565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061318d908490613be7565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516131d991815260200190565b60405180910390a3610fdf565b600061323b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166135959092919063ffffffff16565b805190915015610ee557808060200190518101906132599190613f32565b610ee55760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610d5a565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106132ed576132ed613b90565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561336657600080fd5b505afa15801561337a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061339e9190613d7c565b816001815181106133b1576133b1613b90565b60200260200101906001600160a01b031690816001600160a01b0316815250506133fc307f000000000000000000000000000000000000000000000000000000000000000084612298565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac94790613451908590600090869030904290600401613f4f565b600060405180830381600087803b15801561346b57600080fd5b505af115801561347f573d6000803e3d6000fd5b505050505050565b6134b2307f000000000000000000000000000000000000000000000000000000000000000084612298565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f305d7198230856000806134f96005546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c4016060604051808303818588803b15801561355c57600080fd5b505af1158015613570573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906130119190613f8b565b60606135a484846000856135ac565b949350505050565b60608247101561360d5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610d5a565b6001600160a01b0385163b6136645760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610d5a565b600080866001600160a01b031685876040516136809190613fb9565b60006040518083038185875af1925050503d80600081146136bd576040519150601f19603f3d011682016040523d82523d6000602084013e6136c2565b606091505b50915091506136d28282866136dd565b979650505050505050565b606083156136ec575081611004565b8251156136fc5782518084602001fd5b8160405162461bcd60e51b8152600401610d5a919061375b565b60006020828403121561372857600080fd5b5035919050565b60005b8381101561374a578181015183820152602001613732565b83811115610fdf5750506000910152565b602081526000825180602084015261377a81604085016020870161372f565b601f01601f19169190910160400192915050565b6001600160a01b0381168114611f8e57600080fd5b600080604083850312156137b657600080fd5b82356137c18161378e565b946020939093013593505050565b60008083601f8401126137e157600080fd5b50813567ffffffffffffffff8111156137f957600080fd5b6020830191508360208260051b850101111561381457600080fd5b9250929050565b6000806020838503121561382e57600080fd5b823567ffffffffffffffff81111561384557600080fd5b613851858286016137cf565b90969095509350505050565b803561ffff8116811461386f57600080fd5b919050565b6000806000806080858703121561388a57600080fd5b6138938561385d565b93506138a16020860161385d565b92506138af6040860161385d565b91506138bd6060860161385d565b905092959194509250565b6000806000606084860312156138dd57600080fd5b83356138e88161378e565b925060208401356138f88161378e565b929592945050506040919091013590565b8015158114611f8e57600080fd5b60006020828403121561392957600080fd5b813561100481613909565b60006020828403121561394657600080fd5b81356110048161378e565b600081518084526020808501945080840160005b8381101561398157815187529582019590820190600101613965565b509495945050505050565b602081526000825160a060208401526139a860c0840182613951565b90506020840151601f198483030160408501526139c58282613951565b91505060408401516060840152606084015160808401526080840151151560a08401528091505092915050565b60008060408385031215613a0557600080fd5b8235613a108161378e565b91506020830135613a2081613909565b809150509250929050565b60008060408385031215613a3e57600080fd5b8235613a498161378e565b91506020830135613a208161378e565b60008060008060008060608789031215613a7257600080fd5b863567ffffffffffffffff80821115613a8a57600080fd5b613a968a838b016137cf565b90985096506020890135915080821115613aaf57600080fd5b613abb8a838b016137cf565b90965094506040890135915080821115613ad457600080fd5b50613ae189828a016137cf565b979a9699509497509295939492505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c90821680613b3c57607f821691505b60208210811415613b5d57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600082821015613b8b57613b8b613b63565b500390565b634e487b7160e01b600052603260045260246000fd5b6000600019821415613bba57613bba613b63565b5060010190565b600061ffff808316818516808303821115613bde57613bde613b63565b01949350505050565b60008219821115613bfa57613bfa613b63565b500190565b600181815b80851115613c3a578160001904821115613c2057613c20613b63565b80851615613c2d57918102915b93841c9390800290613c04565b509250929050565b600082613c5157506001610e0e565b81613c5e57506000610e0e565b8160018114613c745760028114613c7e57613c9a565b6001915050610e0e565b60ff841115613c8f57613c8f613b63565b50506001821b610e0e565b5060208310610133831016604e8410600b8410161715613cbd575081810a610e0e565b613cc78383613bff565b8060001904821115613cdb57613cdb613b63565b029392505050565b600061100460ff841683613c42565b6000816000190483118215151615613d0c57613d0c613b63565b500290565b6020808252600b908201526a043616e27742073657420360ac1b604082015260600190565b600081613d4557613d45613b63565b506000190190565b600060208284031215613d5f57600080fd5b5051919050565b634e487b7160e01b600052604160045260246000fd5b600060208284031215613d8e57600080fd5b81516110048161378e565b600081518084526020808501945080840160005b838110156139815781516001600160a01b031687529582019590820190600101613dad565b8281526040602082015260006135a46040830184613d99565b60006020808385031215613dfe57600080fd5b825167ffffffffffffffff80821115613e1657600080fd5b818501915085601f830112613e2a57600080fd5b815181811115613e3c57613e3c613d66565b8060051b604051601f19603f83011681018181108582111715613e6157613e61613d66565b604052918252848201925083810185019188831115613e7f57600080fd5b938501935b82851015613e9d57845184529385019392850192613e84565b98975050505050505050565b600082613ec657634e487b7160e01b600052601260045260246000fd5b500490565b80516001600160701b038116811461386f57600080fd5b600080600060608486031215613ef757600080fd5b613f0084613ecb565b9250613f0e60208501613ecb565b9150604084015163ffffffff81168114613f2757600080fd5b809150509250925092565b600060208284031215613f4457600080fd5b815161100481613909565b85815284602082015260a060408201526000613f6e60a0830186613d99565b6001600160a01b0394909416606083015250608001529392505050565b600080600060608486031215613fa057600080fd5b8351925060208401519150604084015190509250925092565b60008251613fcb81846020870161372f565b919091019291505056fea2646970667358221220aa3b807970f8cb7412d7cba87ddc1868d0bd1656907e814fa51a9a121eb92be064736f6c63430008090033

Deployed Bytecode

0x6080604052600436106104095760003560e01c80638a8c523c11610213578063bbc0c74211610123578063dc9c30ca116100ab578063ed1c3b351161007a578063ed1c3b3514610c8d578063f064321f14610cad578063f11a24d314610ccd578063f2fde38b14610cee578063f637434214610d0e57600080fd5b8063dc9c30ca14610c18578063dd62ed3e14610c38578063e086e5ec14610c58578063ea2f0b3714610c6d57600080fd5b8063c87fb88e116100f2578063c87fb88e14610b8a578063d3c0bbd314610ba0578063d55f511d14610bc2578063d5bda32d14610bd8578063d7f5b35914610bf857600080fd5b8063bbc0c74214610aff578063c090709914610b20578063c816841b14610b40578063c85817f914610b7457600080fd5b80639d5710d1116101a6578063a522ad2511610175578063a522ad2514610a4f578063a9059cbb14610a6f578063aac20b0c14610a8f578063b498412314610aaf578063b62496f514610acf57600080fd5b80639d5710d1146109d2578063a0d82dc5146109e8578063a3c573eb14610a0a578063a457c2d714610a2f57600080fd5b806395d89b41116101e257806395d89b41146109605780639a7a23d6146109755780639bb19a32146109955780639c3b4fdc146109b757600080fd5b80638a8c523c146108eb5780638b16549a146109005780638da5cb5b14610920578063921369131461093e57600080fd5b8063434339f31161031957806371074de2116102a15780637f5a22f9116102705780637f5a22f9146108495780637faf135e14610869578063850337621461088957806385c5b319146108a9578063867a1dc2146108cb57600080fd5b806371074de2146107bd578063715018a6146107dd578063735de9f7146107f25780637bce5a041461082657600080fd5b80635342acb4116102e85780635342acb4146107005780636199d05e1461073057806361a13b4a14610750578063660d0af41461077d57806370a082311461079d57600080fd5b8063434339f314610688578063437823ec146106aa578063437d9840146106ca57806352664423146106e057600080fd5b806322c98d341161039c5780632b9b4f781161036b5780632b9b4f78146105da578063313ce567146105fa578063392d6af71461061657806339509351146106365780633b1f6a011461065657600080fd5b806322c98d3414610560578063232898b41461057a578063239bda491461059a57806323b872dd146105ba57600080fd5b806318160ddd116103d857806318160ddd146104c65780631e377c5b146104e95780631f164f521461050957806321e822ea1461053e57600080fd5b806303191ea314610415578063053e39a31461043757806306fdde0314610474578063095ea7b31461049657600080fd5b3661041057005b600080fd5b34801561042157600080fd5b50610435610430366004613716565b610d30565b005b34801561044357600080fd5b50600654610457906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561048057600080fd5b50610489610d68565b60405161046b919061375b565b3480156104a257600080fd5b506104b66104b13660046137a3565b610dfa565b604051901515815260200161046b565b3480156104d257600080fd5b506104db610e14565b60405190815260200161046b565b3480156104f557600080fd5b50600854610457906001600160a01b031681565b34801561051557600080fd5b5060155461052b90600160701b900461ffff1681565b60405161ffff909116815260200161046b565b34801561054a57600080fd5b5060155461052b90600160b01b900461ffff1681565b34801561056c57600080fd5b506022546104b69060ff1681565b34801561058657600080fd5b5061043561059536600461381b565b610e46565b3480156105a657600080fd5b506104356105b5366004613874565b610eea565b3480156105c657600080fd5b506104b66105d53660046138c8565b610fe5565b3480156105e657600080fd5b506104356105f5366004613917565b61100b565b34801561060657600080fd5b506040516007815260200161046b565b34801561062257600080fd5b50610435610631366004613874565b611048565b34801561064257600080fd5b506104b66106513660046137a3565b611137565b34801561066257600080fd5b50601e5461010090046001600160a01b03166000908152602081905260409020546104db565b34801561069457600080fd5b5060155461052b90600160801b900461ffff1681565b3480156106b657600080fd5b506104356106c5366004613934565b611159565b3480156106d657600080fd5b506104db60215481565b3480156106ec57600080fd5b506104356106fb366004613716565b6111a7565b34801561070c57600080fd5b506104b661071b366004613934565b600b6020526000908152604090205460ff1681565b34801561073c57600080fd5b5061043561074b366004613716565b6111ed565b34801561075c57600080fd5b5061077061076b366004613934565b61125e565b60405161046b919061398c565b34801561078957600080fd5b50610435610798366004613934565b611387565b3480156107a957600080fd5b506104db6107b8366004613934565b6113f9565b3480156107c957600080fd5b506104356107d836600461381b565b61143d565b3480156107e957600080fd5b506104356114d0565b3480156107fe57600080fd5b506104577f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b34801561083257600080fd5b5060155461052b90640100000000900461ffff1681565b34801561085557600080fd5b50610435610864366004613934565b611506565b34801561087557600080fd5b50610435610884366004613716565b61157e565b34801561089557600080fd5b506104356108a4366004613934565b6115ad565b3480156108b557600080fd5b5060155461052b90600160a01b900461ffff1681565b3480156108d757600080fd5b506104356108e636600461381b565b61161f565b3480156108f757600080fd5b50610435611701565b34801561090c57600080fd5b506104db61091b366004613934565b611790565b34801561092c57600080fd5b506005546001600160a01b0316610457565b34801561094a57600080fd5b5060155461052b90600160601b900461ffff1681565b34801561096c57600080fd5b506104896118be565b34801561098157600080fd5b506104356109903660046139f2565b6118cd565b3480156109a157600080fd5b5060155461052b90600160901b900461ffff1681565b3480156109c357600080fd5b5060155461052b9061ffff1681565b3480156109de57600080fd5b506104db60205481565b3480156109f457600080fd5b5060155461052b90600160401b900461ffff1681565b348015610a1657600080fd5b50601e546104579061010090046001600160a01b031681565b348015610a3b57600080fd5b506104b6610a4a3660046137a3565b6119a5565b348015610a5b57600080fd5b50610435610a6a366004613a2b565b611a2b565b348015610a7b57600080fd5b506104b6610a8a3660046137a3565b611b2f565b348015610a9b57600080fd5b50610435610aaa366004613934565b611b3d565b348015610abb57600080fd5b50610435610aca366004613716565b611baf565b348015610adb57600080fd5b506104b6610aea366004613934565b601c6020526000908152604090205460ff1681565b348015610b0b57600080fd5b506008546104b690600160a01b900460ff1681565b348015610b2c57600080fd5b50600754610457906001600160a01b031681565b348015610b4c57600080fd5b506104577f00000000000000000000000027eb76bb1c63d7abd24a5b14da7426737c8477cd81565b348015610b8057600080fd5b506104db601d5481565b348015610b9657600080fd5b506104db601a5481565b348015610bac57600080fd5b5060155461052b90600160301b900461ffff1681565b348015610bce57600080fd5b506104db601b5481565b348015610be457600080fd5b506104db610bf3366004613716565b611c1c565b348015610c0457600080fd5b50610435610c13366004613934565b611ded565b348015610c2457600080fd5b50610435610c33366004613874565b611e64565b348015610c4457600080fd5b506104db610c53366004613a2b565b611f00565b348015610c6457600080fd5b50610435611f2b565b348015610c7957600080fd5b50610435610c88366004613934565b611f91565b348015610c9957600080fd5b50610435610ca8366004613716565b611fdc565b348015610cb957600080fd5b50610435610cc8366004613a59565b612049565b348015610cd957600080fd5b5060155461052b9062010000900461ffff1681565b348015610cfa57600080fd5b50610435610d09366004613934565b612200565b348015610d1a57600080fd5b5060155461052b90600160501b900461ffff1681565b6005546001600160a01b03163314610d635760405162461bcd60e51b8152600401610d5a90613af3565b60405180910390fd5b601b55565b606060038054610d7790613b28565b80601f0160208091040260200160405190810160405280929190818152602001828054610da390613b28565b8015610df05780601f10610dc557610100808354040283529160200191610df0565b820191906000526020600020905b815481529060010190602001808311610dd357829003601f168201915b5050505050905090565b600033610e08818585612298565b60019150505b92915050565b601e5461010090046001600160a01b0316600090815260208190526040812054600254610e419190613b79565b905090565b6005546001600160a01b03163314610e705760405162461bcd60e51b8152600401610d5a90613af3565b60005b81811015610ee5576001601f6000858585818110610e9357610e93613b90565b9050602002016020810190610ea89190613934565b6001600160a01b031681526020810191909152604001600020600401805460ff191691151591909117905580610edd81613ba6565b915050610e73565b505050565b6005546001600160a01b03163314610f145760405162461bcd60e51b8152600401610d5a90613af3565b6015805463ffffffff60801b1916600160801b61ffff8781169190910261ffff60901b191691909117600160901b868316021763ffffffff60a01b1916600160a01b8583160261ffff60b01b191617600160b01b9184169190910217905561012c8183610f818688613bc1565b610f8b9190613bc1565b610f959190613bc1565b61ffff161115610fdf5760405162461bcd60e51b81526020600482015260156024820152744d757374206b6565702066656573203c3d2033302560581b6044820152606401610d5a565b50505050565b600033610ff38582856123bc565b610ffe858585612430565b60019150505b9392505050565b6005546001600160a01b031633146110355760405162461bcd60e51b8152600401610d5a90613af3565b6022805460ff1916911515919091179055565b6005546001600160a01b031633146110725760405162461bcd60e51b8152600401610d5a90613af3565b6015805461ffff86811663ffffffff199092169190911762010000868316021767ffffffff0000000019166401000000008583160267ffff000000000000191617600160301b9184169190910217905561012c81836110d18688613bc1565b6110db9190613bc1565b6110e59190613bc1565b61ffff161115610fdf5760405162461bcd60e51b815260206004820152601860248201527f4d757374206b65657020666565732062656c6f772033302500000000000000006044820152606401610d5a565b600033610e0881858561114a8383611f00565b6111549190613be7565b612298565b6005546001600160a01b031633146111835760405162461bcd60e51b8152600401610d5a90613af3565b6001600160a01b03166000908152600b60205260409020805460ff19166001179055565b6005546001600160a01b031633146111d15760405162461bcd60e51b8152600401610d5a90613af3565b6111dd6007600a613ce3565b6111e79082613cf2565b601d5550565b6005546001600160a01b031633146112175760405162461bcd60e51b8152600401610d5a90613af3565b670de0b6b3a76400008110156112595760405162461bcd60e51b8152602060048201526007602482015266546f6f206c6f7760c81b6044820152606401610d5a565b602055565b6112926040518060a00160405280606081526020016060815260200160008152602001600081526020016000151581525090565b6001600160a01b0382166000908152601f60209081526040918290208251815460c09381028201840190945260a0810184815290939192849284918401828280156112fc57602002820191906000526020600020905b8154815260200190600101908083116112e8575b505050505081526020016001820180548060200260200160405190810160405280929190818152602001828054801561135457602002820191906000526020600020905b815481526020019060010190808311611340575b5050509183525050600282015460208201526003820154604082015260049091015460ff16151560609091015292915050565b6005546001600160a01b031633146113b15760405162461bcd60e51b8152600401610d5a90613af3565b6001600160a01b0381166113d75760405162461bcd60e51b8152600401610d5a90613d11565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b601e546000906001600160a01b0383811661010090920416141561141f57506000919050565b6001600160a01b038216600090815260208190526040902054610e0e565b6005546001600160a01b031633146114675760405162461bcd60e51b8152600401610d5a90613af3565b60005b81811015610ee557600083838381811061148657611486613b90565b905060200201602081019061149b9190613934565b6001600160a01b03166000908152601f60205260408120600281018290556003015550806114c881613ba6565b91505061146a565b6005546001600160a01b031633146114fa5760405162461bcd60e51b8152600401610d5a90613af3565b6115046000612a71565b565b6005546001600160a01b031633146115305760405162461bcd60e51b8152600401610d5a90613af3565b6001600160a01b0381166115565760405162461bcd60e51b8152600401610d5a90613d11565b601e80546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6005546001600160a01b031633146115a85760405162461bcd60e51b8152600401610d5a90613af3565b600955565b6005546001600160a01b031633146115d75760405162461bcd60e51b8152600401610d5a90613af3565b6001600160a01b0381166115fd5760405162461bcd60e51b8152600401610d5a90613d11565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146116495760405162461bcd60e51b8152600401610d5a90613af3565b6103e881111561168c5760405162461bcd60e51b815260206004820152600e60248201526d417272617920746f6f206c6f6e6760901b6044820152606401610d5a565b60005b81811015610ee5576000601f60008585858181106116af576116af613b90565b90506020020160208101906116c49190613934565b6001600160a01b031681526020810191909152604001600020600401805460ff1916911515919091179055806116f981613ba6565b91505061168f565b6005546001600160a01b0316331461172b5760405162461bcd60e51b8152600401610d5a90613af3565b600854600160a01b900460ff16156117775760405162461bcd60e51b815260206004820152600f60248201526e185b1c9958591e48195b98589b1959608a1b6044820152606401610d5a565b6008805460ff60a01b1916600160a01b17905542600a55565b6001600160a01b0381166000908152601f6020526040812054806117b45750919050565b6001600160a01b0383166000908152601f6020526040812060020154156117f6576001600160a01b0384166000908152601f60205260409020600201546117fa565b6021545b90505b81611807576118b7565b8161181181613d36565b6001600160a01b0386166000908152601f602052604081206001018054929550909250908490811061184557611845613b90565b9060005260206000200154905080824261185f9190613b79565b116118ab576001600160a01b0385166000908152601f6020526040902080548490811061188e5761188e613b90565b9060005260206000200154846118a49190613be7565b93506118b1565b506118b7565b506117fd565b5050919050565b606060048054610d7790613b28565b6005546001600160a01b031633146118f75760405162461bcd60e51b8152600401610d5a90613af3565b7f00000000000000000000000027eb76bb1c63d7abd24a5b14da7426737c8477cd6001600160a01b0316826001600160a01b031614156119795760405162461bcd60e51b815260206004820152601a60248201527f54686520706169722063616e6e6f742062652072656d6f7665640000000000006044820152606401610d5a565b6001600160a01b0382166000908152601c60205260409020805460ff19168215151790555050565b5050565b600033816119b38286611f00565b905083811015611a135760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610d5a565b611a208286868403612298565b506001949350505050565b6005546001600160a01b03163314611a555760405162461bcd60e51b8152600401610d5a90613af3565b6001600160a01b038116611aab5760405162461bcd60e51b815260206004820181905260248201527f77616c6c6574416464726573732063616e2774206265203020616464726573736044820152606401610d5a565b6040516370a0823160e01b81523060048201526119a190839083906001600160a01b038316906370a082319060240160206040518083038186803b158015611af257600080fd5b505afa158015611b06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b2a9190613d4d565b612ac3565b600033610e08818585612430565b6005546001600160a01b03163314611b675760405162461bcd60e51b8152600401610d5a90613af3565b6001600160a01b038116611b8d5760405162461bcd60e51b8152600401610d5a90613d11565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314611bd95760405162461bcd60e51b8152600401610d5a90613af3565b62093a80811115611c175760405162461bcd60e51b8152602060048201526008602482015267546f6f206c6f6e6760c01b6044820152606401610d5a565b602155565b604080516002808252606082018352600092839291906020830190803683370190505090503081600081518110611c5557611c55613b90565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015611cce57600080fd5b505afa158015611ce2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d069190613d7c565b81600181518110611d1957611d19613b90565b6001600160a01b03928316602091820292909201015260405163d06ca61f60e01b81527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d9091169063d06ca61f90611d779086908590600401613dd2565b60006040518083038186803b158015611d8f57600080fd5b505afa158015611da3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611dcb9190810190613deb565b600181518110611ddd57611ddd613b90565b6020026020010151915050919050565b6005546001600160a01b03163314611e175760405162461bcd60e51b8152600401610d5a90613af3565b6001600160a01b0381166115565760405162461bcd60e51b815260206004820152601460248201527363616e74206265207a65726f206164647265737360601b6044820152606401610d5a565b6005546001600160a01b03163314611e8e5760405162461bcd60e51b8152600401610d5a90613af3565b601580546bffffffff00000000000000001916600160401b61ffff8781169190910261ffff60501b191691909117600160501b868316021763ffffffff60601b1916600160601b8583160261ffff60701b191617600160701b9184169190910217905561012c8183610f818688613bc1565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6005546001600160a01b03163314611f555760405162461bcd60e51b8152600401610d5a90613af3565b6005546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015611f8e573d6000803e3d6000fd5b50565b6005546001600160a01b03163314611fbb5760405162461bcd60e51b8152600401610d5a90613af3565b6001600160a01b03166000908152600b60205260409020805460ff19169055565b6005546001600160a01b031633146120065760405162461bcd60e51b8152600401610d5a90613af3565b6064601a5411156120445760405162461bcd60e51b81526020600482015260086024820152670a8dede40daeac6d60c31b6044820152606401610d5a565b601a55565b6005546001600160a01b031633146120735760405162461bcd60e51b8152600401610d5a90613af3565b848314801561208157508281145b6120cd5760405162461bcd60e51b815260206004820152601960248201527f4172726179206c656e6774687320646f6e2774206d61746368000000000000006044820152606401610d5a565b60005b858110156121f7578484828181106120ea576120ea613b90565b905060200201356000148015612118575082828281811061210d5761210d613b90565b905060200201356000145b15612122576121e5565b84848281811061213457612134613b90565b90506020020135601f600089898581811061215157612151613b90565b90506020020160208101906121669190613934565b6001600160a01b0316815260208101919091526040016000206002015582828281811061219557612195613b90565b90506020020135601f60008989858181106121b2576121b2613b90565b90506020020160208101906121c79190613934565b6001600160a01b031681526020810191909152604001600020600301555b806121ef81613ba6565b9150506120d0565b50505050505050565b6005546001600160a01b0316331461222a5760405162461bcd60e51b8152600401610d5a90613af3565b6001600160a01b03811661228f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d5a565b611f8e81612a71565b6001600160a01b0383166122fa5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610d5a565b6001600160a01b03821661235b5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610d5a565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006123c88484611f00565b90506000198114610fdf57818110156124235760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610d5a565b610fdf8484848403612298565b600854600160a01b900460ff166124cc576001600160a01b0383166000908152600b602052604090205460ff168061248057506001600160a01b0382166000908152600b602052604090205460ff165b6124cc5760405162461bcd60e51b815260206004820152601a60248201527f54726164696e67206973206e6f7420616374697665207965742e0000000000006044820152606401610d5a565b6001600160a01b0383166000908152600c6020526040902054612505576001600160a01b0383166000908152600c602052604090204290555b61250d612b15565b6000612518306113f9565b601d54601e549192508210159060ff161580156125325750805b801561255657506001600160a01b0384166000908152601c602052604090205460ff165b1561256357612563612bfa565b61256b612e7e565b6001600160a01b0385166000908152600b602052604090205460ff161580156125ad57506001600160a01b0384166000908152600b602052604090205460ff16155b156129695742600954600a546125c39190613be7565b10612639576103e86125d6846019613cf2565b6125e09190613ea9565b600d556103e86125f1846018613cf2565b6125fb9190613ea9565b600f556103e861260c846019613cf2565b6126169190613ea9565b6011556103e8612627846019613cf2565b6126319190613ea9565b6013556128bf565b6001600160a01b0385166000908152601c602052604090205460ff16156126ea576015546103e89061266f9061ffff1685613cf2565b6126799190613ea9565b600d556015546103e8906126979062010000900461ffff1685613cf2565b6126a19190613ea9565b600f556015546103e8906126c190640100000000900461ffff1685613cf2565b6126cb9190613ea9565b6011556015546103e89061262790600160301b900461ffff1685613cf2565b6001600160a01b0384166000908152601c602052604090205460ff161561281a57601b546001600160a01b0386166000908152600c6020526040812054909142916127359190613be7565b1061274a57601a546127479082613be7565b90505b6015546103e89061276690600160401b900461ffff1686613cf2565b6127709190613ea9565b600d556015546103e890612790908390600160501b900461ffff16613be7565b61279a9086613cf2565b6127a49190613ea9565b600f556015546103e8906127c390600160601b900461ffff1686613cf2565b6127cd9190613ea9565b6011556015546103e8906127ec90600160701b900461ffff1686613cf2565b6127f69190613ea9565b601355506001600160a01b0385166000908152600c602052604090204290556128bf565b6015546103e89061283690600160801b900461ffff1685613cf2565b6128409190613ea9565b600d556015546103e89061285f90600160901b900461ffff1685613cf2565b6128699190613ea9565b600f556015546103e89061288890600160a01b900461ffff1685613cf2565b6128929190613ea9565b6011556015546103e8906128b190600160b01b900461ffff1685613cf2565b6128bb9190613ea9565b6013555b602254610100900460ff1680156128d95750601e5460ff16155b80156128fe57506001600160a01b0385166000908152601c602052604090205460ff16155b801561292657506001600160a01b0384166000908152601f602052604090206004015460ff16155b156129695761296985601354601154600f54600d54886129469190613b79565b6129509190613b79565b61295a9190613b79565b6129649190613b79565b612ed9565b6000601354601154600f54600d54876129829190613b79565b61298c9190613b79565b6129969190613b79565b6129a09190613b79565b90506129ad868683613018565b6000601354601154600f54600d546129c59190613be7565b6129cf9190613be7565b6129d99190613be7565b90508015612a54576129ec873083613018565b600f5460166000828254612a009190613be7565b909155505060115460178054600090612a1a908490613be7565b9091555050600d5460188054600090612a34908490613be7565b909155505060135460198054600090612a4e908490613be7565b90915550505b6121f7600e54600d55601054600f55601254601155601454601355565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610ee59084906131e6565b6000807f00000000000000000000000027eb76bb1c63d7abd24a5b14da7426737c8477cd6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015612b7157600080fd5b505afa158015612b85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ba99190613ee2565b506001600160701b031691506001600160701b03169150600082118015612bd05750600081115b612bdb576000612bde565b60015b602280549115156101000261ff00199092169190911790555050565b601e805460ff191660011790556000612c12306113f9565b90506000601954601854601754601654612c2c9190613be7565b612c369190613be7565b612c409190613be7565b9050801580612c4e57508082105b15612c5a575050612e72565b60006002601654612c6b9190613ea9565b90506000479050600060195460185460175485612c889190613be7565b612c929190613be7565b612c9c9190613be7565b9050612ca7816132b8565b6000612cb38347613b79565b905060008260175483612cc69190613cf2565b612cd09190613ea9565b9050600083612cdf8785613cf2565b612ce99190613ea9565b905060008460185485612cfc9190613cf2565b612d069190613ea9565b905060008560195486612d199190613cf2565b612d239190613ea9565b9050600088118015612d355750600083115b15612d4457612d448884613487565b6006546040516000916001600160a01b03169061c35090879084818181858888f193505050503d8060008114612d96576040519150601f19603f3d011682016040523d82523d6000602084013e612d9b565b606091505b50506007546040519192506001600160a01b03169061c3509085906000818181858888f193505050503d8060008114612df0576040519150601f19603f3d011682016040523d82523d6000602084013e612df5565b606091505b50506008546040519192506001600160a01b03169061c3509084906000818181858888f193505050503d8060008114612e4a576040519150601f19603f3d011682016040523d82523d6000602084013e612e4f565b606091505b505060006016819055601781905560188190556019555050505050505050505050505b601e805460ff19169055565b600d54158015612e8e5750600f54155b8015612e9a5750601154155b8015612ea65750601354155b15612ead57565b600d8054600e55600f805460105560118054601255601380546014556000938490559183905582905555565b6001600160a01b0382166000908152601f602052604090206004015460ff1680612f06575060225460ff16155b15612f0f575050565b6000612f1a82611c1c565b6001600160a01b0384166000908152601f602090815260408220600180820180548083018255908552838520429101558154908101825590835290822001829055909150612f6784611790565b6001600160a01b0385166000908152601f60205260408120600301549192509015612fad576001600160a01b0385166000908152601f6020526040902060030154612fb1565b6020545b9050808211156130115760405162461bcd60e51b815260206004820152602560248201527f416d6f756e74206f76657220746865206c696d697420666f722074696d652070604482015264195c9a5bd960da1b6064820152608401610d5a565b5050505050565b6001600160a01b03831661307c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610d5a565b6001600160a01b0382166130de5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610d5a565b6001600160a01b038316600090815260208190526040902054818110156131565760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610d5a565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061318d908490613be7565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516131d991815260200190565b60405180910390a3610fdf565b600061323b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166135959092919063ffffffff16565b805190915015610ee557808060200190518101906132599190613f32565b610ee55760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610d5a565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106132ed576132ed613b90565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561336657600080fd5b505afa15801561337a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061339e9190613d7c565b816001815181106133b1576133b1613b90565b60200260200101906001600160a01b031690816001600160a01b0316815250506133fc307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84612298565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac94790613451908590600090869030904290600401613f4f565b600060405180830381600087803b15801561346b57600080fd5b505af115801561347f573d6000803e3d6000fd5b505050505050565b6134b2307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84612298565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663f305d7198230856000806134f96005546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c4016060604051808303818588803b15801561355c57600080fd5b505af1158015613570573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906130119190613f8b565b60606135a484846000856135ac565b949350505050565b60608247101561360d5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610d5a565b6001600160a01b0385163b6136645760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610d5a565b600080866001600160a01b031685876040516136809190613fb9565b60006040518083038185875af1925050503d80600081146136bd576040519150601f19603f3d011682016040523d82523d6000602084013e6136c2565b606091505b50915091506136d28282866136dd565b979650505050505050565b606083156136ec575081611004565b8251156136fc5782518084602001fd5b8160405162461bcd60e51b8152600401610d5a919061375b565b60006020828403121561372857600080fd5b5035919050565b60005b8381101561374a578181015183820152602001613732565b83811115610fdf5750506000910152565b602081526000825180602084015261377a81604085016020870161372f565b601f01601f19169190910160400192915050565b6001600160a01b0381168114611f8e57600080fd5b600080604083850312156137b657600080fd5b82356137c18161378e565b946020939093013593505050565b60008083601f8401126137e157600080fd5b50813567ffffffffffffffff8111156137f957600080fd5b6020830191508360208260051b850101111561381457600080fd5b9250929050565b6000806020838503121561382e57600080fd5b823567ffffffffffffffff81111561384557600080fd5b613851858286016137cf565b90969095509350505050565b803561ffff8116811461386f57600080fd5b919050565b6000806000806080858703121561388a57600080fd5b6138938561385d565b93506138a16020860161385d565b92506138af6040860161385d565b91506138bd6060860161385d565b905092959194509250565b6000806000606084860312156138dd57600080fd5b83356138e88161378e565b925060208401356138f88161378e565b929592945050506040919091013590565b8015158114611f8e57600080fd5b60006020828403121561392957600080fd5b813561100481613909565b60006020828403121561394657600080fd5b81356110048161378e565b600081518084526020808501945080840160005b8381101561398157815187529582019590820190600101613965565b509495945050505050565b602081526000825160a060208401526139a860c0840182613951565b90506020840151601f198483030160408501526139c58282613951565b91505060408401516060840152606084015160808401526080840151151560a08401528091505092915050565b60008060408385031215613a0557600080fd5b8235613a108161378e565b91506020830135613a2081613909565b809150509250929050565b60008060408385031215613a3e57600080fd5b8235613a498161378e565b91506020830135613a208161378e565b60008060008060008060608789031215613a7257600080fd5b863567ffffffffffffffff80821115613a8a57600080fd5b613a968a838b016137cf565b90985096506020890135915080821115613aaf57600080fd5b613abb8a838b016137cf565b90965094506040890135915080821115613ad457600080fd5b50613ae189828a016137cf565b979a9699509497509295939492505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c90821680613b3c57607f821691505b60208210811415613b5d57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600082821015613b8b57613b8b613b63565b500390565b634e487b7160e01b600052603260045260246000fd5b6000600019821415613bba57613bba613b63565b5060010190565b600061ffff808316818516808303821115613bde57613bde613b63565b01949350505050565b60008219821115613bfa57613bfa613b63565b500190565b600181815b80851115613c3a578160001904821115613c2057613c20613b63565b80851615613c2d57918102915b93841c9390800290613c04565b509250929050565b600082613c5157506001610e0e565b81613c5e57506000610e0e565b8160018114613c745760028114613c7e57613c9a565b6001915050610e0e565b60ff841115613c8f57613c8f613b63565b50506001821b610e0e565b5060208310610133831016604e8410600b8410161715613cbd575081810a610e0e565b613cc78383613bff565b8060001904821115613cdb57613cdb613b63565b029392505050565b600061100460ff841683613c42565b6000816000190483118215151615613d0c57613d0c613b63565b500290565b6020808252600b908201526a043616e27742073657420360ac1b604082015260600190565b600081613d4557613d45613b63565b506000190190565b600060208284031215613d5f57600080fd5b5051919050565b634e487b7160e01b600052604160045260246000fd5b600060208284031215613d8e57600080fd5b81516110048161378e565b600081518084526020808501945080840160005b838110156139815781516001600160a01b031687529582019590820190600101613dad565b8281526040602082015260006135a46040830184613d99565b60006020808385031215613dfe57600080fd5b825167ffffffffffffffff80821115613e1657600080fd5b818501915085601f830112613e2a57600080fd5b815181811115613e3c57613e3c613d66565b8060051b604051601f19603f83011681018181108582111715613e6157613e61613d66565b604052918252848201925083810185019188831115613e7f57600080fd5b938501935b82851015613e9d57845184529385019392850192613e84565b98975050505050505050565b600082613ec657634e487b7160e01b600052601260045260246000fd5b500490565b80516001600160701b038116811461386f57600080fd5b600080600060608486031215613ef757600080fd5b613f0084613ecb565b9250613f0e60208501613ecb565b9150604084015163ffffffff81168114613f2757600080fd5b809150509250925092565b600060208284031215613f4457600080fd5b815161100481613909565b85815284602082015260a060408201526000613f6e60a0830186613d99565b6001600160a01b0394909416606083015250608001529392505050565b600080600060608486031215613fa057600080fd5b8351925060208401519150604084015190509250925092565b60008251613fcb81846020870161372f565b919091019291505056fea2646970667358221220aa3b807970f8cb7412d7cba87ddc1868d0bd1656907e814fa51a9a121eb92be064736f6c63430008090033

Deployed Bytecode Sourcemap

36173:20440:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48339:100;;;;;;;;;;-1:-1:-1;48339:100:0;;;;;:::i;:::-;;:::i;:::-;;36212:42;;;;;;;;;;-1:-1:-1;36212:42:0;;;;-1:-1:-1;;;;;36212:42:0;;;;;;-1:-1:-1;;;;;379:32:1;;;361:51;;349:2;334:18;36212:42:0;;;;;;;;24785:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;27277:242::-;;;;;;;;;;-1:-1:-1;27277:242:0;;;;;:::i;:::-;;:::i;:::-;;;1695:14:1;;1688:22;1670:41;;1658:2;1643:18;27277:242:0;1530:187:1;40154:125:0;;;;;;;;;;;;;:::i;:::-;;;1868:25:1;;;1856:2;1841:18;40154:125:0;1722:177:1;36304:35:0;;;;;;;;;;-1:-1:-1;36304:35:0;;;;-1:-1:-1;;;;;36304:35:0;;;37314:28;;;;;;;;;;-1:-1:-1;37314:28:0;;;;-1:-1:-1;;;37314:28:0;;;;;;;;;2078:6:1;2066:19;;;2048:38;;2036:2;2021:18;37314:28:0;1904:188:1;37480:31:0;;;;;;;;;;-1:-1:-1;37480:31:0;;;;-1:-1:-1;;;37480:31:0;;;;;;51325:30;;;;;;;;;;-1:-1:-1;51325:30:0;;;;;;;;53377:234;;;;;;;;;;-1:-1:-1;53377:234:0;;;;;:::i;:::-;;:::i;42621:643::-;;;;;;;;;;-1:-1:-1;42621:643:0;;;;;:::i;:::-;;:::i;28099:295::-;;;;;;;;;;-1:-1:-1;28099:295:0;;;;;:::i;:::-;;:::i;52031:115::-;;;;;;;;;;-1:-1:-1;52031:115:0;;;;;:::i;:::-;;:::i;39879:84::-;;;;;;;;;;-1:-1:-1;39879:84:0;;39954:1;4453:36:1;;4441:2;4426:18;39879:84:0;4311:184:1;41571:510:0;;;;;;;;;;-1:-1:-1;41571:510:0;;;;;:::i;:::-;;:::i;28803:270::-;;;;;;;;;;-1:-1:-1;28803:270:0;;;;;:::i;:::-;;:::i;40469:111::-;;;;;;;;;;-1:-1:-1;40558:13:0;;;;;-1:-1:-1;;;;;40558:13:0;40515:7;26227:18;;;;;;;;;;;40469:111;40154:125;37351:32;;;;;;;;;;-1:-1:-1;37351:32:0;;;;-1:-1:-1;;;37351:32:0;;;;;;41332:112;;;;;;;;;;-1:-1:-1;41332:112:0;;;;;:::i;:::-;;:::i;51263:32::-;;;;;;;;;;;;;;;;40738:204;;;;;;;;;;-1:-1:-1;40738:204:0;;;;;:::i;:::-;;:::i;36480:49::-;;;;;;;;;;-1:-1:-1;36480:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;51695:152;;;;;;;;;;-1:-1:-1;51695:152:0;;;;;:::i;:::-;;:::i;52154:157::-;;;;;;;;;;-1:-1:-1;52154:157:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;43272:166::-;;;;;;;;;;-1:-1:-1;43272:166:0;;;;;:::i;:::-;;:::i;40287:174::-;;;;;;;;;;-1:-1:-1;40287:174:0;;;;;:::i;:::-;;:::i;52319:280::-;;;;;;;;;;-1:-1:-1;52319:280:0;;;;;:::i;:::-;;:::i;7445:103::-;;;;;;;;;;;;;:::i;37888:47::-;;;;;;;;;;;;;;;37117:34;;;;;;;;;;-1:-1:-1;37117:34:0;;;;;;;;;;;40588:142;;;;;;;;;;-1:-1:-1;40588:142:0;;;;;:::i;:::-;;:::i;38174:92::-;;;;;;;;;;-1:-1:-1;38174:92:0;;;;;:::i;:::-;;:::i;43446:151::-;;;;;;;;;;-1:-1:-1;43446:151:0;;;;;:::i;:::-;;:::i;37435:38::-;;;;;;;;;;-1:-1:-1;37435:38:0;;;;-1:-1:-1;;;37435:38:0;;;;;;53619:300;;;;;;;;;;-1:-1:-1;53619:300:0;;;;;:::i;:::-;;:::i;39971:175::-;;;;;;;;;;;;;:::i;53998:890::-;;;;;;;;;;-1:-1:-1;53998:890:0;;;;;:::i;:::-;;:::i;6794:87::-;;;;;;;;;;-1:-1:-1;6867:6:0;;-1:-1:-1;;;;;6867:6:0;6794:87;;37272:35;;;;;;;;;;-1:-1:-1;37272:35:0;;;;-1:-1:-1;;;37272:35:0;;;;;;25004:104;;;;;;;;;;;;;:::i;40950:236::-;;;;;;;;;;-1:-1:-1;40950:236:0;;;;;:::i;:::-;;:::i;37390:38::-;;;;;;;;;;-1:-1:-1;37390:38:0;;;;-1:-1:-1;;;37390:38:0;;;;;;37041:28;;;;;;;;;;-1:-1:-1;37041:28:0;;;;;;;;51198:26;;;;;;;;;;;;;;;;37194:29;;;;;;;;;;-1:-1:-1;37194:29:0;;;;-1:-1:-1;;;37194:29:0;;;;;;38017:28;;;;;;;;;;-1:-1:-1;38017:28:0;;;;;;;-1:-1:-1;;;;;38017:28:0;;;29576:505;;;;;;;;;;-1:-1:-1;29576:505:0;;;;;:::i;:::-;;:::i;56221:389::-;;;;;;;;;;-1:-1:-1;56221:389:0;;;;;:::i;:::-;;:::i;26459:234::-;;;;;;;;;;-1:-1:-1;26459:234:0;;;;;:::i;:::-;;:::i;43605:149::-;;;;;;;;;;-1:-1:-1;43605:149:0;;;;;:::i;:::-;;:::i;51855:168::-;;;;;;;;;;-1:-1:-1;51855:168:0;;;;;:::i;:::-;;:::i;37776:57::-;;;;;;;;;;-1:-1:-1;37776:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;36388:25;;;;;;;;;;-1:-1:-1;36388:25:0;;;;-1:-1:-1;;;36388:25:0;;;;;;36261:36;;;;;;;;;;-1:-1:-1;36261:36:0;;;;-1:-1:-1;;;;;36261:36:0;;;37942;;;;;;;;;;;;;;;37842:37;;;;;;;;;;;;;;;;37686:30;;;;;;;;;;;;;;;;37158:27;;;;;;;;;;-1:-1:-1;37158:27:0;;;;-1:-1:-1;;;37158:27:0;;;;;;37725:42;;;;;;;;;;;;;;;;55084:318;;;;;;;;;;-1:-1:-1;55084:318:0;;;;;:::i;:::-;;:::i;39696:175::-;;;;;;;;;;-1:-1:-1;39696:175:0;;;;;:::i;:::-;;:::i;42089:524::-;;;;;;;;;;-1:-1:-1;42089:524:0;;;;;:::i;:::-;;:::i;26756:201::-;;;;;;;;;;-1:-1:-1;26756:201:0;;;;;:::i;:::-;;:::i;56104:109::-;;;;;;;;;;;;;:::i;41452:111::-;;;;;;;;;;-1:-1:-1;41452:111:0;;;;;:::i;:::-;;:::i;43762:135::-;;;;;;;;;;-1:-1:-1;43762:135:0;;;;;:::i;:::-;;:::i;52744:625::-;;;;;;;;;;-1:-1:-1;52744:625:0;;;;;:::i;:::-;;:::i;37076:34::-;;;;;;;;;;-1:-1:-1;37076:34:0;;;;;;;;;;;7703:238;;;;;;;;;;-1:-1:-1;7703:238:0;;;;;:::i;:::-;;:::i;37230:35::-;;;;;;;;;;-1:-1:-1;37230:35:0;;;;-1:-1:-1;;;37230:35:0;;;;;;48339:100;6867:6;;-1:-1:-1;;;;;6867:6:0;6091:10;7014:23;7006:68;;;;-1:-1:-1;;;7006:68:0;;;;;;;:::i;:::-;;;;;;;;;48410:17:::1;:21:::0;48339:100::o;24785:::-;24839:13;24872:5;24865:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24785:100;:::o;27277:242::-;27396:4;6091:10;27457:32;6091:10;27473:7;27482:6;27457:8;:32::i;:::-;27507:4;27500:11;;;27277:242;;;;;:::o;40154:125::-;40558:13;;;;;-1:-1:-1;;;;;40558:13:0;40207:7;26227:18;;;;;;;;;;;25993:12;;40234:37;;;;:::i;:::-;40227:44;;40154:125;:::o;53377:234::-;6867:6;;-1:-1:-1;;;;;6867:6:0;6091:10;7014:23;7006:68;;;;-1:-1:-1;;;7006:68:0;;;;;;;:::i;:::-;53496:9:::1;53491:113;53511:20:::0;;::::1;53491:113;;;53588:4;53553:7;:21;53561:9;;53571:1;53561:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;53553:21:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;53553:21:0;:32:::1;;:39:::0;;-1:-1:-1;;53553:39:0::1;::::0;::::1;;::::0;;;::::1;::::0;;53533:3;::::1;::::0;::::1;:::i;:::-;;;;53491:113;;;;53377:234:::0;;:::o;42621:643::-;6867:6;;-1:-1:-1;;;;;6867:6:0;6091:10;7014:23;7006:68;;;;-1:-1:-1;;;7006:68:0;;;;;;;:::i;:::-;42828:14:::1;:32:::0;;-1:-1:-1;;;;42871:44:0;-1:-1:-1;;;42828:32:0::1;::::0;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;42871:44:0;;;;;-1:-1:-1;;;42871:44:0;;::::1;;;-1:-1:-1::0;;;;42981:30:0;-1:-1:-1;;;42926:44:0;;::::1;;-1:-1:-1::0;;;;42981:30:0;;-1:-1:-1;;;42981:30:0;;::::1;::::0;;;::::1;;::::0;;36376:3:::1;42981:30:::0;42926:44;43044:56:::1;42871:44:::0;42828:32;43044:56:::1;:::i;:::-;:97;;;;:::i;:::-;:131;;;;:::i;:::-;:163;;;;43022:234;;;::::0;-1:-1:-1;;;43022:234:0;;10419:2:1;43022:234:0::1;::::0;::::1;10401:21:1::0;10458:2;10438:18;;;10431:30;-1:-1:-1;;;10477:18:1;;;10470:51;10538:18;;43022:234:0::1;10217:345:1::0;43022:234:0::1;42621:643:::0;;;;:::o;28099:295::-;28230:4;6091:10;28288:38;28304:4;6091:10;28319:6;28288:15;:38::i;:::-;28337:27;28347:4;28353:2;28357:6;28337:9;:27::i;:::-;28382:4;28375:11;;;28099:295;;;;;;:::o;52031:115::-;6867:6;;-1:-1:-1;;;;;6867:6:0;6091:10;7014:23;7006:68;;;;-1:-1:-1;;;7006:68:0;;;;;;;:::i;:::-;52111:18:::1;:27:::0;;-1:-1:-1;;52111:27:0::1;::::0;::::1;;::::0;;;::::1;::::0;;52031:115::o;41571:510::-;6867:6;;-1:-1:-1;;;;;6867:6:0;6091:10;7014:23;7006:68;;;;-1:-1:-1;;;7006:68:0;;;;;;;:::i;:::-;41753:9:::1;:22:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;41786:34:0;;;;;;;;;;::::1;;;-1:-1:-1::0;;41876:20:0;41831:34;;;::::1;;-1:-1:-1::0;;41876:20:0;;-1:-1:-1;;;41876:20:0;;::::1;::::0;;;::::1;;::::0;;36376:3:::1;41876:20:::0;41831:34;41929:29:::1;41786:34:::0;41753:22;41929:29:::1;:::i;:::-;:48;;;;:::i;:::-;:60;;;;:::i;:::-;:92;;;;41907:166;;;::::0;-1:-1:-1;;;41907:166:0;;10769:2:1;41907:166:0::1;::::0;::::1;10751:21:1::0;10808:2;10788:18;;;10781:30;10847:26;10827:18;;;10820:54;10891:18;;41907:166:0::1;10567:348:1::0;28803:270:0;28918:4;6091:10;28979:64;6091:10;28995:7;29032:10;29004:25;6091:10;28995:7;29004:9;:25::i;:::-;:38;;;;:::i;:::-;28979:8;:64::i;41332:112::-;6867:6;;-1:-1:-1;;;;;6867:6:0;6091:10;7014:23;7006:68;;;;-1:-1:-1;;;7006:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;41403:26:0::1;;::::0;;;:17:::1;:26;::::0;;;;:33;;-1:-1:-1;;41403:33:0::1;41432:4;41403:33;::::0;;41332:112::o;40738:204::-;6867:6;;-1:-1:-1;;;;;6867:6:0;6091:10;7014:23;7006:68;;;;-1:-1:-1;;;7006:68:0;;;;;;;:::i;:::-;40919:14:::1;39954:1:::0;40919:2:::1;:14;:::i;:::-;40892:42;::::0;:23;:42:::1;:::i;:::-;40867:22;:67:::0;-1:-1:-1;40738:204:0:o;51695:152::-;6867:6;;-1:-1:-1;;;;;6867:6:0;6091:10;7014:23;7006:68;;;;-1:-1:-1;;;7006:68:0;;;;;;;:::i;:::-;51787:7:::1;51775:8;:19;;51767:39;;;::::0;-1:-1:-1;;;51767:39:0;;12811:2:1;51767:39:0::1;::::0;::::1;12793:21:1::0;12850:1;12830:18;;;12823:29;-1:-1:-1;;;12868:18:1;;;12861:37;12915:18;;51767:39:0::1;12609:330:1::0;51767:39:0::1;51817:11;:22:::0;51695:152::o;52154:157::-;52241:20;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52241:20:0;-1:-1:-1;;;;;52286:17:0;;;;;;:7;:17;;;;;;;;;52279:24;;;;;;;;;;;;;;;;;;;;;;;52286:17;;52279:24;;52286:17;;52279:24;;52286:17;52279:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;52279:24:0;;;-1:-1:-1;;52279:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52154:157;-1:-1:-1;;52154:157:0:o;43272:166::-;6867:6;;-1:-1:-1;;;;;6867:6:0;6091:10;7014:23;7006:68;;;;-1:-1:-1;;;7006:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;43356:15:0;::::1;43348:39;;;;-1:-1:-1::0;;;43348:39:0::1;;;;;;;:::i;:::-;43398:19;:32:::0;;-1:-1:-1;;;;;;43398:32:0::1;-1:-1:-1::0;;;;;43398:32:0;;;::::1;::::0;;;::::1;::::0;;43272:166::o;40287:174::-;40388:13;;40353:7;;-1:-1:-1;;;;;40377:24:0;;;40388:13;;;;;40377:24;40373:38;;;-1:-1:-1;40410:1:0;;40287:174;-1:-1:-1;40287:174:0:o;40373:38::-;-1:-1:-1;;;;;26227:18:0;;26195:7;26227:18;;;;;;;;;;;40429:24;26076:177;52319:280;6867:6;;-1:-1:-1;;;;;6867:6:0;6091:10;7014:23;7006:68;;;;-1:-1:-1;;;7006:68:0;;;;;;;:::i;:::-;52406:9:::1;52401:191;52417:20:::0;;::::1;52401:191;;;52459:15;52477:9;;52487:1;52477:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;52504:16:0::1;52535:1;52504:16:::0;;;:7:::1;:16;::::0;;;;:28:::1;::::0;::::1;:32:::0;;;52551:25:::1;;:29:::0;-1:-1:-1;52439:3:0;::::1;::::0;::::1;:::i;:::-;;;;52401:191;;7445:103:::0;6867:6;;-1:-1:-1;;;;;6867:6:0;6091:10;7014:23;7006:68;;;;-1:-1:-1;;;7006:68:0;;;;;;;:::i;:::-;7510:30:::1;7537:1;7510:18;:30::i;:::-;7445:103::o:0;40588:142::-;6867:6;;-1:-1:-1;;;;;6867:6:0;6091:10;7014:23;7006:68;;;;-1:-1:-1;;;7006:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;40663:15:0;::::1;40655:39;;;;-1:-1:-1::0;;;40655:39:0::1;;;;;;;:::i;:::-;40705:13;:17:::0;;-1:-1:-1;;;;;40705:17:0;;::::1;;;-1:-1:-1::0;;;;;;40705:17:0;;::::1;::::0;;;::::1;::::0;;40588:142::o;38174:92::-;6867:6;;-1:-1:-1;;;;;6867:6:0;6091:10;7014:23;7006:68;;;;-1:-1:-1;;;7006:68:0;;;;;;;:::i;:::-;38241:13:::1;:17:::0;38174:92::o;43446:151::-;6867:6;;-1:-1:-1;;;;;6867:6:0;6091:10;7014:23;7006:68;;;;-1:-1:-1;;;7006:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;43521:15:0;::::1;43513:39;;;;-1:-1:-1::0;;;43513:39:0::1;;;;;;;:::i;:::-;43563:13;:26:::0;;-1:-1:-1;;;;;;43563:26:0::1;-1:-1:-1::0;;;;;43563:26:0;;;::::1;::::0;;;::::1;::::0;;43446:151::o;53619:300::-;6867:6;;-1:-1:-1;;;;;6867:6:0;6091:10;7014:23;7006:68;;;;-1:-1:-1;;;7006:68:0;;;;;;;:::i;:::-;53764:4:::1;53744:24:::0;::::1;;53736:51;;;::::0;-1:-1:-1;;;53736:51:0;;13486:2:1;53736:51:0::1;::::0;::::1;13468:21:1::0;13525:2;13505:18;;;13498:30;-1:-1:-1;;;13544:18:1;;;13537:44;13598:18;;53736:51:0::1;13284:338:1::0;53736:51:0::1;53803:9;53798:114;53818:20:::0;;::::1;53798:114;;;53895:5;53860:7;:21;53868:9;;53878:1;53868:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;53860:21:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;53860:21:0;:32:::1;;:40:::0;;-1:-1:-1;;53860:40:0::1;::::0;::::1;;::::0;;;::::1;::::0;;53840:3;::::1;::::0;::::1;:::i;:::-;;;;53798:114;;39971:175:::0;6867:6;;-1:-1:-1;;;;;6867:6:0;6091:10;7014:23;7006:68;;;;-1:-1:-1;;;7006:68:0;;;;;;;:::i;:::-;40035:13:::1;::::0;-1:-1:-1;;;40035:13:0;::::1;;;40034:14;40026:42;;;::::0;-1:-1:-1;;;40026:42:0;;13829:2:1;40026:42:0::1;::::0;::::1;13811:21:1::0;13868:2;13848:18;;;13841:30;-1:-1:-1;;;13887:18:1;;;13880:45;13942:18;;40026:42:0::1;13627:339:1::0;40026:42:0::1;40079:13;:20:::0;;-1:-1:-1;;;;40079:20:0::1;-1:-1:-1::0;;;40079:20:0::1;::::0;;40123:15:::1;40110:10;:28:::0;39971:175::o;53998:890::-;-1:-1:-1;;;;;54151:17:0;;54091:18;54151:17;;;:7;:17;;;;;:36;54204:18;54200:68;;54239:17;53998:890;;;:::o;54200:68::-;-1:-1:-1;;;;;54302:17:0;;54280:19;54302:17;;;:7;:17;;;;;:29;;;:34;:112;;-1:-1:-1;;;;;54385:17:0;;;;;;:7;:17;;;;;:29;;;54302:112;;;54352:17;;54302:112;54280:134;;54425:456;54457:18;54453:64;;54496:5;;54453:64;54531:15;;;;:::i;:::-;-1:-1:-1;;;;;54585:17:0;;54561:21;54585:17;;;:7;:17;;;;;:32;;:79;;54531:15;;-1:-1:-1;54561:21:0;;-1:-1:-1;54585:32:0;54531:15;;54585:79;;;;;;:::i;:::-;;;;;;;;;54561:103;;54716:13;54701:11;54683:15;:29;;;;:::i;:::-;:46;54679:191;;-1:-1:-1;;;;;54764:17:0;;;;;;:7;:17;;;;;:44;;54794:13;;54764:44;;;;;;:::i;:::-;;;;;;;;;54750:58;;;;;:::i;:::-;;;54679:191;;;54849:5;;;54679:191;54438:443;54425:456;;;54116:772;;53998:890;;;:::o;25004:104::-;25060:13;25093:7;25086:14;;;;;:::i;40950:236::-;6867:6;;-1:-1:-1;;;;;6867:6:0;6091:10;7014:23;7006:68;;;;-1:-1:-1;;;7006:68:0;;;;;;;:::i;:::-;41082:11:::1;-1:-1:-1::0;;;;;41074:19:0::1;:4;-1:-1:-1::0;;;;;41074:19:0::1;;;41066:58;;;::::0;-1:-1:-1;;;41066:58:0;;14314:2:1;41066:58:0::1;::::0;::::1;14296:21:1::0;14353:2;14333:18;;;14326:30;14392:28;14372:18;;;14365:56;14438:18;;41066:58:0::1;14112:350:1::0;41066:58:0::1;-1:-1:-1::0;;;;;41277:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;41277:39:0;;;;;;;40950:236;;:::o;41137:41::-:1;40950:236:::0;;:::o;29576:505::-;29696:4;6091:10;29696:4;29784:25;6091:10;29801:7;29784:9;:25::i;:::-;29757:52;;29862:15;29842:16;:35;;29820:122;;;;-1:-1:-1;;;29820:122:0;;14669:2:1;29820:122:0;;;14651:21:1;14708:2;14688:18;;;14681:30;14747:34;14727:18;;;14720:62;-1:-1:-1;;;14798:18:1;;;14791:35;14843:19;;29820:122:0;14467:401:1;29820:122:0;29978:60;29987:5;29994:7;30022:15;30003:16;:34;29978:8;:60::i;:::-;-1:-1:-1;30069:4:0;;29576:505;-1:-1:-1;;;;29576:505:0:o;56221:389::-;6867:6;;-1:-1:-1;;;;;6867:6:0;6091:10;7014:23;7006:68;;;;-1:-1:-1;;;7006:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;56364:27:0;::::1;56342:109;;;::::0;-1:-1:-1;;;56342:109:0;;15075:2:1;56342:109:0::1;::::0;::::1;15057:21:1::0;;;15094:18;;;15087:30;15153:34;15133:18;;;15126:62;15205:18;;56342:109:0::1;14873:356:1::0;56342:109:0::1;56554:37;::::0;-1:-1:-1;;;56554:37:0;;56585:4:::1;56554:37;::::0;::::1;361:51:1::0;56462:140:0::1;::::0;56499:12;;56526:13;;-1:-1:-1;;;;;56554:22:0;::::1;::::0;::::1;::::0;334:18:1;;56554:37:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56462:22;:140::i;26459:234::-:0;26574:4;6091:10;26635:28;6091:10;26652:2;26656:6;26635:9;:28::i;43605:149::-;6867:6;;-1:-1:-1;;;;;6867:6:0;6091:10;7014:23;7006:68;;;;-1:-1:-1;;;7006:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;43679:15:0;::::1;43671:39;;;;-1:-1:-1::0;;;43671:39:0::1;;;;;;;:::i;:::-;43721:12;:25:::0;;-1:-1:-1;;;;;;43721:25:0::1;-1:-1:-1::0;;;;;43721:25:0;;;::::1;::::0;;;::::1;::::0;;43605:149::o;51855:168::-;6867:6;;-1:-1:-1;;;;;6867:6:0;6091:10;7014:23;7006:68;;;;-1:-1:-1;;;7006:68:0;;;;;;;:::i;:::-;51955:7:::1;51942:9;:20;;51934:41;;;::::0;-1:-1:-1;;;51934:41:0;;15625:2:1;51934:41:0::1;::::0;::::1;15607:21:1::0;15664:1;15644:18;;;15637:29;-1:-1:-1;;;15682:18:1;;;15675:38;15730:18;;51934:41:0::1;15423:331:1::0;51934:41:0::1;51986:17;:29:::0;51855:168::o;55084:318::-;55232:16;;;55246:1;55232:16;;;;;;;;55174;;;;55232;55246:1;55232:16;;;;;;;;;;-1:-1:-1;55232:16:0;55208:40;;55277:4;55259;55264:1;55259:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;55259:23:0;;;-1:-1:-1;;;;;55259:23:0;;;;;55303:13;-1:-1:-1;;;;;55303:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55293:4;55298:1;55293:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;55293:30:0;;;:7;;;;;;;;;:30;55345:46;;-1:-1:-1;;;55345:46:0;;:13;:27;;;;;;:46;;55373:11;;55386:4;;55345:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;55345:46:0;;;;;;;;;;;;:::i;:::-;55392:1;55345:49;;;;;;;;:::i;:::-;;;;;;;55334:60;;55197:205;55084:318;;;:::o;39696:175::-;6867:6;;-1:-1:-1;;;;;6867:6:0;6091:10;7014:23;7006:68;;;;-1:-1:-1;;;7006:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;39777:24:0;::::1;39769:57;;;::::0;-1:-1:-1;;;39769:57:0;;18262:2:1;39769:57:0::1;::::0;::::1;18244:21:1::0;18301:2;18281:18;;;18274:30;-1:-1:-1;;;18320:18:1;;;18313:50;18380:18;;39769:57:0::1;18060:344:1::0;42089:524:0;6867:6;;-1:-1:-1;;;;;6867:6:0;6091:10;7014:23;7006:68;;;;-1:-1:-1;;;7006:68:0;;;;;;;:::i;:::-;42276:10:::1;:24:::0;;-1:-1:-1;;42311:36:0;-1:-1:-1;;;42276:24:0::1;::::0;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;42311:36:0;;;;;-1:-1:-1;;;42311:36:0;;::::1;;;-1:-1:-1::0;;;;42405:22:0;-1:-1:-1;;;42358:36:0;;::::1;;-1:-1:-1::0;;;;42405:22:0;;-1:-1:-1;;;42405:22:0;;::::1;::::0;;;::::1;;::::0;;36376:3:::1;42405:22:::0;42358:36;42460:31:::1;42311:36:::0;42276:24;42460:31:::1;:::i;26756:201::-:0;-1:-1:-1;;;;;26922:18:0;;;26890:7;26922:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;26756:201::o;56104:109::-;6867:6;;-1:-1:-1;;;;;6867:6:0;6091:10;7014:23;7006:68;;;;-1:-1:-1;;;7006:68:0;;;;;;;:::i;:::-;6867:6;;56157:48:::1;::::0;-1:-1:-1;;;;;6867:6:0;;;;56183:21:::1;56157:48:::0;::::1;;;::::0;::::1;::::0;;;56183:21;6867:6;56157:48;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;56104:109::o:0;41452:111::-;6867:6;;-1:-1:-1;;;;;6867:6:0;6091:10;7014:23;7006:68;;;;-1:-1:-1;;;7006:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;41521:26:0::1;41550:5;41521:26:::0;;;:17:::1;:26;::::0;;;;:34;;-1:-1:-1;;41521:34:0::1;::::0;;41452:111::o;43762:135::-;6867:6;;-1:-1:-1;;;;;6867:6:0;6091:10;7014:23;7006:68;;;;-1:-1:-1;;;7006:68:0;;;;;;;:::i;:::-;43848:3:::1;43834:10;;:17;;43826:38;;;::::0;-1:-1:-1;;;43826:38:0;;18611:2:1;43826:38:0::1;::::0;::::1;18593:21:1::0;18650:1;18630:18;;;18623:29;-1:-1:-1;;;18668:18:1;;;18661:38;18716:18;;43826:38:0::1;18409:331:1::0;43826:38:0::1;43875:10;:14:::0;43762:135::o;52744:625::-;6867:6;;-1:-1:-1;;;;;6867:6:0;6091:10;7014:23;7006:68;;;;-1:-1:-1;;;7006:68:0;;;;;;;:::i;:::-;52942:39;;::::1;:99:::0;::::1;;;-1:-1:-1::0;53002:39:0;;::::1;52942:99;52920:174;;;::::0;-1:-1:-1;;;52920:174:0;;18947:2:1;52920:174:0::1;::::0;::::1;18929:21:1::0;18986:2;18966:18;;;18959:30;19025:27;19005:18;;;18998:55;19070:18;;52920:174:0::1;18745:349:1::0;52920:174:0::1;53112:9;53107:255;53127:20:::0;;::::1;53107:255;;;53173:12;;53186:1;53173:15;;;;;;;:::i;:::-;;;;;;;53192:1;53173:20;:41;;;;;53197:9;;53207:1;53197:12;;;;;;;:::i;:::-;;;;;;;53213:1;53197:17;53173:41;53169:55;;;53216:8;;53169:55;53275:12;;53288:1;53275:15;;;;;;;:::i;:::-;;;;;;;53239:7;:21;53247:9;;53257:1;53247:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;53239:21:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;53239:21:0;:33:::1;;:51:::0;53338:9;;53348:1;53338:12;;::::1;;;;;:::i;:::-;;;;;;;53305:7;:21;53313:9;;53323:1;53313:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;53305:21:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;53305:21:0;:30:::1;;:45:::0;53107:255:::1;53149:3:::0;::::1;::::0;::::1;:::i;:::-;;;;53107:255;;;;52744:625:::0;;;;;;:::o;7703:238::-;6867:6;;-1:-1:-1;;;;;6867:6:0;6091:10;7014:23;7006:68;;;;-1:-1:-1;;;7006:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;7806:22:0;::::1;7784:110;;;::::0;-1:-1:-1;;;7784:110:0;;19301:2:1;7784:110:0::1;::::0;::::1;19283:21:1::0;19340:2;19320:18;;;19313:30;19379:34;19359:18;;;19352:62;-1:-1:-1;;;19430:18:1;;;19423:36;19476:19;;7784:110:0::1;19099:402:1::0;7784:110:0::1;7905:28;7924:8;7905:18;:28::i;33316:380::-:0;-1:-1:-1;;;;;33452:19:0;;33444:68;;;;-1:-1:-1;;;33444:68:0;;19708:2:1;33444:68:0;;;19690:21:1;19747:2;19727:18;;;19720:30;19786:34;19766:18;;;19759:62;-1:-1:-1;;;19837:18:1;;;19830:34;19881:19;;33444:68:0;19506:400:1;33444:68:0;-1:-1:-1;;;;;33531:21:0;;33523:68;;;;-1:-1:-1;;;33523:68:0;;20113:2:1;33523:68:0;;;20095:21:1;20152:2;20132:18;;;20125:30;20191:34;20171:18;;;20164:62;-1:-1:-1;;;20242:18:1;;;20235:32;20284:19;;33523:68:0;19911:398:1;33523:68:0;-1:-1:-1;;;;;33604:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;33656:32;;1868:25:1;;;33656:32:0;;1841:18:1;33656:32:0;;;;;;;33316:380;;;:::o;33987:502::-;34122:24;34149:25;34159:5;34166:7;34149:9;:25::i;:::-;34122:52;;-1:-1:-1;;34189:16:0;:37;34185:297;;34289:6;34269:16;:26;;34243:117;;;;-1:-1:-1;;;34243:117:0;;20516:2:1;34243:117:0;;;20498:21:1;20555:2;20535:18;;;20528:30;20594:31;20574:18;;;20567:59;20643:18;;34243:117:0;20314:353:1;34243:117:0;34404:51;34413:5;34420:7;34448:6;34429:16;:25;34404:8;:51::i;43905:3737::-;44034:13;;-1:-1:-1;;;44034:13:0;;;;44029:183;;-1:-1:-1;;;;;44090:23:0;;;;;;:17;:23;;;;;;;;;:48;;-1:-1:-1;;;;;;44117:21:0;;;;;;:17;:21;;;;;;;;44090:48;44064:136;;;;-1:-1:-1;;;44064:136:0;;20874:2:1;44064:136:0;;;20856:21:1;20913:2;20893:18;;;20886:30;20952:28;20932:18;;;20925:56;20998:18;;44064:136:0;20672:350:1;44064:136:0;-1:-1:-1;;;;;44226:14:0;;;;;;:8;:14;;;;;;44222:84;;-1:-1:-1;;;;;44262:14:0;;;;;;:8;:14;;;;;44279:15;44262:32;;44222:84;44316:16;:14;:16::i;:::-;44345:28;44376:24;44394:4;44376:9;:24::i;:::-;44479:22;;44554:16;;44345:55;;-1:-1:-1;44442:59:0;;;;44554:16;;44553:17;:57;;;;;44587:23;44553:57;:103;;;;-1:-1:-1;;;;;;44627:29:0;;;;;;:25;:29;;;;;;;;44553:103;44535:169;;;44683:9;:7;:9::i;:::-;44716:14;:12;:14::i;:::-;-1:-1:-1;;;;;44832:23:0;;;;;;:17;:23;;;;;;;;44831:24;:50;;;;-1:-1:-1;;;;;;44860:21:0;;;;;;:17;:21;;;;;;;;44859:22;44831:50;44827:2212;;;44964:15;44947:13;;44934:10;;:26;;;;:::i;:::-;:45;44930:1722;;45026:4;45011:11;:6;45020:2;45011:11;:::i;:::-;45010:20;;;;:::i;:::-;45000:7;:30;45081:4;45066:11;:6;45075:2;45066:11;:::i;:::-;45065:20;;;;:::i;:::-;45049:13;:36;45136:4;45121:11;:6;45130:2;45121:11;:::i;:::-;45120:20;;;;:::i;:::-;45104:13;:36;45184:4;45169:11;:6;45178:2;45169:11;:::i;:::-;45168:20;;;;:::i;:::-;45159:6;:29;44930:1722;;;-1:-1:-1;;;;;45257:31:0;;;;;;:25;:31;;;;;;;;45253:1384;;;45333:9;;45346:4;;45324:18;;45333:9;;45324:6;:18;:::i;:::-;45323:27;;;;:::i;:::-;45313:7;:37;45399:15;;45418:4;;45390:24;;45399:15;;;;;45390:6;:24;:::i;:::-;45389:33;;;;:::i;:::-;45373:13;:49;45471:15;;45490:4;;45462:24;;45471:15;;;;;45462:6;:24;:::i;:::-;45461:33;;;;:::i;:::-;45445:13;:49;45536:8;;45548:4;;45527:17;;-1:-1:-1;;;45536:8:0;;;;45527:6;:17;:::i;45253:1384::-;-1:-1:-1;;;;;45624:29:0;;;;;;:25;:29;;;;;;;;45620:1017;;;45845:17;;-1:-1:-1;;;;;45828:14:0;;45678:12;45828:14;;;:8;:14;;;;;;45678:12;;45866:15;;45828:34;;45845:17;45828:34;:::i;:::-;:53;45824:128;;45918:10;;45910:18;;;;:::i;:::-;;;45824:128;45994:10;;46008:4;;45985:19;;-1:-1:-1;;;45994:10:0;;;;45985:6;:19;:::i;:::-;45984:28;;;;:::i;:::-;45974:7;:38;46062:16;;46090:4;;46062:23;;46081:4;;-1:-1:-1;;;46062:16:0;;;;:23;:::i;:::-;46052:34;;:6;:34;:::i;:::-;46051:43;;;;:::i;:::-;46035:13;:59;46143:16;;46163:4;;46134:25;;-1:-1:-1;;;46143:16:0;;;;46134:6;:25;:::i;:::-;46133:34;;;;:::i;:::-;46117:13;:50;46209:9;;46222:4;;46200:18;;-1:-1:-1;;;46209:9:0;;;;46200:6;:18;:::i;:::-;46199:27;;;;:::i;:::-;46190:6;:36;-1:-1:-1;;;;;;46249:14:0;;;;;;:8;:14;;;;;46266:15;46249:32;;45620:1017;;;46378:14;;46396:4;;46369:23;;-1:-1:-1;;;46378:14:0;;;;46369:6;:23;:::i;:::-;46368:32;;;;:::i;:::-;46358:7;:42;46449:20;;46473:4;;46440:29;;-1:-1:-1;;;46449:20:0;;;;46440:6;:29;:::i;:::-;46439:38;;;;:::i;:::-;46423:13;:54;46526:20;;46550:4;;46517:29;;-1:-1:-1;;;46526:20:0;;;;46517:6;:29;:::i;:::-;46516:38;;;;:::i;:::-;46500:13;:54;46596:13;;46613:4;;46587:22;;-1:-1:-1;;;46596:13:0;;;;46587:6;:22;:::i;:::-;46586:31;;;;:::i;:::-;46577:6;:40;45620:1017;46690:12;;;;;;;:50;;;;-1:-1:-1;46724:16:0;;;;46723:17;46690:50;:103;;;;-1:-1:-1;;;;;;46762:31:0;;;;;;:25;:31;;;;;;;;46761:32;46690:103;:147;;;;-1:-1:-1;;;;;;46815:11:0;;;;;;:7;:11;;;;;:22;;;;;46814:23;46690:147;46668:360;;;46872:140;46909:4;46987:6;;46971:13;;46955;;46945:7;;46936:6;:16;;;;:::i;:::-;:32;;;;:::i;:::-;:48;;;;:::i;:::-;:57;;;;:::i;:::-;46872:14;:140::i;:::-;47051:23;47180:6;;47151:13;;47122;;47099:7;;47077:6;:29;;;;:::i;:::-;:58;;;;:::i;:::-;:87;;;;:::i;:::-;:109;;;;:::i;:::-;47051:135;;47197:42;47213:4;47219:2;47223:15;47197;:42::i;:::-;47250:17;47312:6;;47296:13;;47280;;47270:7;;:23;;;;:::i;:::-;:39;;;;:::i;:::-;:48;;;;:::i;:::-;47250:68;-1:-1:-1;47333:13:0;;47329:280;;47363:47;47379:4;47393;47400:9;47363:15;:47::i;:::-;47451:13;;47425:22;;:39;;;;;;;:::i;:::-;;;;-1:-1:-1;;47508:13:0;;47479:25;:42;;:25;;:42;;47508:13;;47479:42;:::i;:::-;;;;-1:-1:-1;;47553:7:0;;47536:13;:24;;:13;;:24;;47553:7;;47536:24;:::i;:::-;;;;-1:-1:-1;;47591:6:0;;47575:12;:22;;:12;;:22;;47591:6;;47575:22;:::i;:::-;;;;-1:-1:-1;;47329:280:0;47619:15;48178;;48168:7;:25;48220:21;;48204:13;:37;48268:21;;48252:13;:37;48309:14;;48300:6;:23;48124:207;8101:191;8194:6;;;-1:-1:-1;;;;;8211:17:0;;;-1:-1:-1;;;;;;8211:17:0;;;;;;;8244:40;;8194:6;;;8211:17;8194:6;;8244:40;;8175:16;;8244:40;8164:128;8101:191;:::o;17103:248::-;17274:58;;;-1:-1:-1;;;;;21441:32:1;;17274:58:0;;;21423:51:1;21490:18;;;;21483:34;;;17274:58:0;;;;;;;;;;21396:18:1;;;;17274:58:0;;;;;;;;-1:-1:-1;;;;;17274:58:0;-1:-1:-1;;;17274:58:0;;;17220:123;;17254:5;;17220:19;:123::i;54896:180::-;54943:10;54955;54985:11;-1:-1:-1;;;;;54971:38:0;;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54942:69;-1:-1:-1;;;;;54942:69:0;;;-1:-1:-1;;;;;54942:69:0;;;55042:1;55037:2;:6;:16;;;;;55052:1;55047:2;:6;55037:16;:31;;55063:5;55037:31;;;55056:4;55037:31;55022:12;:46;;;;;;;-1:-1:-1;;55022:46:0;;;;;;;;;-1:-1:-1;;54896:180:0:o;48447:1742::-;38088:16;:23;;-1:-1:-1;;38088:23:0;38107:4;38088:23;;;:16;48523:24:::1;48541:4;48523:9;:24::i;:::-;48497:50;;48558:24;48693:12;;48664:13;;48623:25;;48585:22;;:63;;;;:::i;:::-;:92;;;;:::i;:::-;:120;;;;:::i;:::-;48558:147:::0;-1:-1:-1;48720:21:0;;;:59:::1;;;48763:16;48745:15;:34;48720:59;48716:98;;;48796:7;;;;48716:98;48826:26;48880:1;48855:22;;:26;;;;:::i;:::-;48826:55;;48892:25;48920:21;48892:49;;48952:14;49073:12;;49044:13;;49003:25;;48969:18;:59;;;;:::i;:::-;:88;;;;:::i;:::-;:116;;;;:::i;:::-;48952:133;;49096:24;49113:6;49096:16;:24::i;:::-;49131:18;49152:41;49176:17:::0;49152:21:::1;:41;:::i;:::-;49131:62;;49206:23;49288:6;49246:25;;49233:10;:38;;;;:::i;:::-;49232:62;;;;:::i;:::-;49206:88:::0;-1:-1:-1;49305:23:0::1;49367:6:::0;49332:31:::1;49345:18:::0;49332:10;:31:::1;:::i;:::-;49331:42;;;;:::i;:::-;49305:68;;49384:17;49435:6;49418:13;;49405:10;:26;;;;:::i;:::-;49404:37;;;;:::i;:::-;49384:57;;49452:16;49501:6;49485:12;;49472:10;:25;;;;:::i;:::-;49471:36;;;;:::i;:::-;49452:55;;49545:1;49524:18;:22;:45;;;;;49568:1;49550:15;:19;49524:45;49520:127;;;49586:49;49599:18;49619:15;49586:12;:49::i;:::-;49704:19;::::0;49696:109:::1;::::0;49657:12:::1;::::0;-1:-1:-1;;;;;49704:19:0::1;::::0;49785:5:::1;::::0;49751:15;;49657:12;49696:109;49657:12;49696:109;49751:15;49704:19;49785:5;49696:109:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;49838:13:0::1;::::0;49830:97:::1;::::0;49682:123;;-1:-1:-1;;;;;;49838:13:0::1;::::0;49907:5:::1;::::0;49879:9;;49830:97:::1;::::0;;;49879:9;49838:13;49907:5;49830:97:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;49960:12:0::1;::::0;49952:95:::1;::::0;49816:111;;-1:-1:-1;;;;;;49960:12:0::1;::::0;50027:5:::1;::::0;50000:8;;49952:95:::1;::::0;;;50000:8;49960:12;50027:5;49952:95:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;50085:1:0::1;50060:22;:26:::0;;;50097:25:::1;:29:::0;;;50137:13:::1;:17:::0;;;50165:12:::1;:16:::0;-1:-1:-1;;;;;;;;;;;;38122:1:0::1;38134:16:::0;:24;;-1:-1:-1;;38134:24:0;;;48447:1742::o;47650:466::-;47711:7;;:12;:47;;;;-1:-1:-1;47740:13:0;;:18;47711:47;:82;;;;-1:-1:-1;47775:13:0;;:18;47711:82;:110;;;;-1:-1:-1;47810:6:0;;:11;47711:110;47693:147;;;47650:466::o;47693:147::-;47870:7;;;47852:15;:25;47912:13;;;47888:21;:37;47960:13;;;47936:21;:37;48001:6;;;47984:14;:23;-1:-1:-1;48020:11:0;;;;48042:17;;;;48070;;;48098:10;47650:466::o;55446:650::-;-1:-1:-1;;;;;55528:13:0;;;;;;:7;:13;;;;;:24;;;;;;:47;;-1:-1:-1;55557:18:0;;;;55556:19;55528:47;55524:86;;;55446:650;;:::o;55524:86::-;55620:16;55639:24;55651:11;55639;:24::i;:::-;-1:-1:-1;;;;;55674:13:0;;;;;;:7;:13;;;;;;;:28;;;;:50;;;;;;;;;;;;;55708:15;55674:50;;;55735:40;;;;;;;;;;;;;;;;;55620:43;;-1:-1:-1;55817:23:0;55682:4;55817:17;:23::i;:::-;-1:-1:-1;;;;;55869:13:0;;55853;55869;;;:7;:13;;;;;:22;;;55786:54;;-1:-1:-1;55853:13:0;55869:27;:92;;-1:-1:-1;;;;;55939:13:0;;;;;;:7;:13;;;;;:22;;;55869:92;;;55912:11;;55869:92;55853:108;;56018:5;55994:20;:29;;55972:116;;;;-1:-1:-1;;;55972:116:0;;22588:2:1;55972:116:0;;;22570:21:1;22627:2;22607:18;;;22600:30;22666:34;22646:18;;;22639:62;-1:-1:-1;;;22717:18:1;;;22710:35;22762:19;;55972:116:0;22386:401:1;55972:116:0;55513:583;;;55446:650;;:::o;30560:708::-;-1:-1:-1;;;;;30691:18:0;;30683:68;;;;-1:-1:-1;;;30683:68:0;;22994:2:1;30683:68:0;;;22976:21:1;23033:2;23013:18;;;23006:30;23072:34;23052:18;;;23045:62;-1:-1:-1;;;23123:18:1;;;23116:35;23168:19;;30683:68:0;22792:401:1;30683:68:0;-1:-1:-1;;;;;30770:16:0;;30762:64;;;;-1:-1:-1;;;30762:64:0;;23400:2:1;30762:64:0;;;23382:21:1;23439:2;23419:18;;;23412:30;23478:34;23458:18;;;23451:62;-1:-1:-1;;;23529:18:1;;;23522:33;23572:19;;30762:64:0;23198:399:1;30762:64:0;-1:-1:-1;;;;;30912:15:0;;30890:19;30912:15;;;;;;;;;;;30960:21;;;;30938:109;;;;-1:-1:-1;;;30938:109:0;;23804:2:1;30938:109:0;;;23786:21:1;23843:2;23823:18;;;23816:30;23882:34;23862:18;;;23855:62;-1:-1:-1;;;23933:18:1;;;23926:36;23979:19;;30938:109:0;23602:402:1;30938:109:0;-1:-1:-1;;;;;31083:15:0;;;:9;:15;;;;;;;;;;;31101:20;;;31083:38;;31143:13;;;;;;;;:23;;31115:6;;31083:9;31143:23;;31115:6;;31143:23;:::i;:::-;;;;;;;;31199:2;-1:-1:-1;;;;;31184:26:0;31193:4;-1:-1:-1;;;;;31184:26:0;;31203:6;31184:26;;;;1868:25:1;;1856:2;1841:18;;1722:177;31184:26:0;;;;;;;;31223:37;53377:234;20070:802;20494:23;20520:106;20562:4;20520:106;;;;;;;;;;;;;;;;;20528:5;-1:-1:-1;;;;;20520:27:0;;;:106;;;;;:::i;:::-;20641:17;;20494:132;;-1:-1:-1;20641:21:0;20637:228;;20756:10;20745:30;;;;;;;;;;;;:::i;:::-;20719:134;;;;-1:-1:-1;;;20719:134:0;;24461:2:1;20719:134:0;;;24443:21:1;24500:2;24480:18;;;24473:30;24539:34;24519:18;;;24512:62;-1:-1:-1;;;24590:18:1;;;24583:40;24640:19;;20719:134:0;24259:406:1;50197:465:0;50287:16;;;50301:1;50287:16;;;;;;;;50263:21;;50287:16;;;;;;;;;;-1:-1:-1;50287:16:0;50263:40;;50332:4;50314;50319:1;50314:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;50314:23:0;;;-1:-1:-1;;;;;50314:23:0;;;;;50358:13;-1:-1:-1;;;;;50358:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50348:4;50353:1;50348:7;;;;;;;;:::i;:::-;;;;;;:30;-1:-1:-1;;;;;50348:30:0;;;-1:-1:-1;;;;;50348:30:0;;;;;50389:60;50406:4;50421:13;50437:11;50389:8;:60::i;:::-;50460:194;;-1:-1:-1;;;50460:194:0;;-1:-1:-1;;;;;50460:13:0;:64;;;;:194;;50539:11;;50565:1;;50581:4;;50608;;50628:15;;50460:194;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50252:410;50197:465;:::o;50670:410::-;50751:60;50768:4;50783:13;50799:11;50751:8;:60::i;:::-;50822:13;-1:-1:-1;;;;;50822:29:0;;50859:9;50892:4;50912:11;50938:1;50981;51024:7;6867:6;;-1:-1:-1;;;;;6867:6:0;;6794:87;51024:7;50822:250;;;;;;-1:-1:-1;;;;;;50822:250:0;;;-1:-1:-1;;;;;25616:15:1;;;50822:250:0;;;25598:34:1;25648:18;;;25641:34;;;;25691:18;;;25684:34;;;;25734:18;;;25727:34;25798:15;;;25777:19;;;25770:44;51046:15:0;25830:19:1;;;25823:35;25532:19;;50822:250:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;12149:229::-;12286:12;12318:52;12340:6;12348:4;12354:1;12357:12;12318:21;:52::i;:::-;12311:59;12149:229;-1:-1:-1;;;;12149:229:0:o;13365:571::-;13535:12;13607:5;13582:21;:30;;13560:118;;;;-1:-1:-1;;;13560:118:0;;26382:2:1;13560:118:0;;;26364:21:1;26421:2;26401:18;;;26394:30;26460:34;26440:18;;;26433:62;-1:-1:-1;;;26511:18:1;;;26504:36;26557:19;;13560:118:0;26180:402:1;13560:118:0;-1:-1:-1;;;;;9602:19:0;;;13689:60;;;;-1:-1:-1;;;13689:60:0;;26789:2:1;13689:60:0;;;26771:21:1;26828:2;26808:18;;;26801:30;26867:31;26847:18;;;26840:59;26916:18;;13689:60:0;26587:353:1;13689:60:0;13763:12;13777:23;13804:6;-1:-1:-1;;;;;13804:11:0;13823:5;13844:4;13804:55;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13762:97;;;;13877:51;13894:7;13903:10;13915:12;13877:16;:51::i;:::-;13870:58;13365:571;-1:-1:-1;;;;;;;13365:571:0:o;16325:712::-;16475:12;16504:7;16500:530;;;-1:-1:-1;16535:10:0;16528:17;;16500:530;16649:17;;:21;16645:374;;16847:10;16841:17;16908:15;16895:10;16891:2;16887:19;16880:44;16645:374;16990:12;16983:20;;-1:-1:-1;;;16983:20:0;;;;;;;;:::i;14:180:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:1;;14:180;-1:-1:-1;14:180:1:o;423:258::-;495:1;505:113;519:6;516:1;513:13;505:113;;;595:11;;;589:18;576:11;;;569:39;541:2;534:10;505:113;;;636:6;633:1;630:13;627:48;;;-1:-1:-1;;671:1:1;653:16;;646:27;423:258::o;686:383::-;835:2;824:9;817:21;798:4;867:6;861:13;910:6;905:2;894:9;890:18;883:34;926:66;985:6;980:2;969:9;965:18;960:2;952:6;948:15;926:66;:::i;:::-;1053:2;1032:15;-1:-1:-1;;1028:29:1;1013:45;;;;1060:2;1009:54;;686:383;-1:-1:-1;;686:383:1:o;1074:131::-;-1:-1:-1;;;;;1149:31:1;;1139:42;;1129:70;;1195:1;1192;1185:12;1210:315;1278:6;1286;1339:2;1327:9;1318:7;1314:23;1310:32;1307:52;;;1355:1;1352;1345:12;1307:52;1394:9;1381:23;1413:31;1438:5;1413:31;:::i;:::-;1463:5;1515:2;1500:18;;;;1487:32;;-1:-1:-1;;;1210:315:1:o;2097:367::-;2160:8;2170:6;2224:3;2217:4;2209:6;2205:17;2201:27;2191:55;;2242:1;2239;2232:12;2191:55;-1:-1:-1;2265:20:1;;2308:18;2297:30;;2294:50;;;2340:1;2337;2330:12;2294:50;2377:4;2369:6;2365:17;2353:29;;2437:3;2430:4;2420:6;2417:1;2413:14;2405:6;2401:27;2397:38;2394:47;2391:67;;;2454:1;2451;2444:12;2391:67;2097:367;;;;;:::o;2469:437::-;2555:6;2563;2616:2;2604:9;2595:7;2591:23;2587:32;2584:52;;;2632:1;2629;2622:12;2584:52;2672:9;2659:23;2705:18;2697:6;2694:30;2691:50;;;2737:1;2734;2727:12;2691:50;2776:70;2838:7;2829:6;2818:9;2814:22;2776:70;:::i;:::-;2865:8;;2750:96;;-1:-1:-1;2469:437:1;-1:-1:-1;;;;2469:437:1:o;2911:159::-;2978:20;;3038:6;3027:18;;3017:29;;3007:57;;3060:1;3057;3050:12;3007:57;2911:159;;;:::o;3075:401::-;3157:6;3165;3173;3181;3234:3;3222:9;3213:7;3209:23;3205:33;3202:53;;;3251:1;3248;3241:12;3202:53;3274:28;3292:9;3274:28;:::i;:::-;3264:38;;3321:37;3354:2;3343:9;3339:18;3321:37;:::i;:::-;3311:47;;3377:37;3410:2;3399:9;3395:18;3377:37;:::i;:::-;3367:47;;3433:37;3466:2;3455:9;3451:18;3433:37;:::i;:::-;3423:47;;3075:401;;;;;;;:::o;3481:456::-;3558:6;3566;3574;3627:2;3615:9;3606:7;3602:23;3598:32;3595:52;;;3643:1;3640;3633:12;3595:52;3682:9;3669:23;3701:31;3726:5;3701:31;:::i;:::-;3751:5;-1:-1:-1;3808:2:1;3793:18;;3780:32;3821:33;3780:32;3821:33;:::i;:::-;3481:456;;3873:7;;-1:-1:-1;;;3927:2:1;3912:18;;;;3899:32;;3481:456::o;3942:118::-;4028:5;4021:13;4014:21;4007:5;4004:32;3994:60;;4050:1;4047;4040:12;4065:241;4121:6;4174:2;4162:9;4153:7;4149:23;4145:32;4142:52;;;4190:1;4187;4180:12;4142:52;4229:9;4216:23;4248:28;4270:5;4248:28;:::i;4500:247::-;4559:6;4612:2;4600:9;4591:7;4587:23;4583:32;4580:52;;;4628:1;4625;4618:12;4580:52;4667:9;4654:23;4686:31;4711:5;4686:31;:::i;4752:435::-;4805:3;4843:5;4837:12;4870:6;4865:3;4858:19;4896:4;4925:2;4920:3;4916:12;4909:19;;4962:2;4955:5;4951:14;4983:1;4993:169;5007:6;5004:1;5001:13;4993:169;;;5068:13;;5056:26;;5102:12;;;;5137:15;;;;5029:1;5022:9;4993:169;;;-1:-1:-1;5178:3:1;;4752:435;-1:-1:-1;;;;;4752:435:1:o;5192:790::-;5383:2;5372:9;5365:21;5346:4;5421:6;5415:13;5464:4;5459:2;5448:9;5444:18;5437:32;5492:63;5550:3;5539:9;5535:19;5521:12;5492:63;:::i;:::-;5478:77;;5604:2;5596:6;5592:15;5586:22;5676:2;5672:7;5660:9;5652:6;5648:22;5644:36;5639:2;5628:9;5624:18;5617:64;5704:52;5749:6;5733:14;5704:52;:::i;:::-;5690:66;;;5810:2;5802:6;5798:15;5792:22;5787:2;5776:9;5772:18;5765:50;5870:2;5862:6;5858:15;5852:22;5846:3;5835:9;5831:19;5824:51;5945:3;5937:6;5933:16;5927:23;5920:31;5913:39;5906:4;5895:9;5891:20;5884:69;5970:6;5962:14;;;5192:790;;;;:::o;6427:382::-;6492:6;6500;6553:2;6541:9;6532:7;6528:23;6524:32;6521:52;;;6569:1;6566;6559:12;6521:52;6608:9;6595:23;6627:31;6652:5;6627:31;:::i;:::-;6677:5;-1:-1:-1;6734:2:1;6719:18;;6706:32;6747:30;6706:32;6747:30;:::i;:::-;6796:7;6786:17;;;6427:382;;;;;:::o;6814:403::-;6897:6;6905;6958:2;6946:9;6937:7;6933:23;6929:32;6926:52;;;6974:1;6971;6964:12;6926:52;7013:9;7000:23;7032:31;7057:5;7032:31;:::i;:::-;7082:5;-1:-1:-1;7139:2:1;7124:18;;7111:32;7152:33;7111:32;7152:33;:::i;7615:1088::-;7773:6;7781;7789;7797;7805;7813;7866:2;7854:9;7845:7;7841:23;7837:32;7834:52;;;7882:1;7879;7872:12;7834:52;7922:9;7909:23;7951:18;7992:2;7984:6;7981:14;7978:34;;;8008:1;8005;7998:12;7978:34;8047:70;8109:7;8100:6;8089:9;8085:22;8047:70;:::i;:::-;8136:8;;-1:-1:-1;8021:96:1;-1:-1:-1;8224:2:1;8209:18;;8196:32;;-1:-1:-1;8240:16:1;;;8237:36;;;8269:1;8266;8259:12;8237:36;8308:72;8372:7;8361:8;8350:9;8346:24;8308:72;:::i;:::-;8399:8;;-1:-1:-1;8282:98:1;-1:-1:-1;8487:2:1;8472:18;;8459:32;;-1:-1:-1;8503:16:1;;;8500:36;;;8532:1;8529;8522:12;8500:36;;8571:72;8635:7;8624:8;8613:9;8609:24;8571:72;:::i;:::-;7615:1088;;;;-1:-1:-1;7615:1088:1;;-1:-1:-1;7615:1088:1;;8662:8;;7615:1088;-1:-1:-1;;;7615:1088:1:o;8708:356::-;8910:2;8892:21;;;8929:18;;;8922:30;8988:34;8983:2;8968:18;;8961:62;9055:2;9040:18;;8708:356::o;9069:380::-;9148:1;9144:12;;;;9191;;;9212:61;;9266:4;9258:6;9254:17;9244:27;;9212:61;9319:2;9311:6;9308:14;9288:18;9285:38;9282:161;;;9365:10;9360:3;9356:20;9353:1;9346:31;9400:4;9397:1;9390:15;9428:4;9425:1;9418:15;9282:161;;9069:380;;;:::o;9454:127::-;9515:10;9510:3;9506:20;9503:1;9496:31;9546:4;9543:1;9536:15;9570:4;9567:1;9560:15;9586:125;9626:4;9654:1;9651;9648:8;9645:34;;;9659:18;;:::i;:::-;-1:-1:-1;9696:9:1;;9586:125::o;9716:127::-;9777:10;9772:3;9768:20;9765:1;9758:31;9808:4;9805:1;9798:15;9832:4;9829:1;9822:15;9848:135;9887:3;-1:-1:-1;;9908:17:1;;9905:43;;;9928:18;;:::i;:::-;-1:-1:-1;9975:1:1;9964:13;;9848:135::o;9988:224::-;10027:3;10055:6;10088:2;10085:1;10081:10;10118:2;10115:1;10111:10;10149:3;10145:2;10141:12;10136:3;10133:21;10130:47;;;10157:18;;:::i;:::-;10193:13;;9988:224;-1:-1:-1;;;;9988:224:1:o;10920:128::-;10960:3;10991:1;10987:6;10984:1;10981:13;10978:39;;;10997:18;;:::i;:::-;-1:-1:-1;11033:9:1;;10920:128::o;11053:422::-;11142:1;11185:5;11142:1;11199:270;11220:7;11210:8;11207:21;11199:270;;;11279:4;11275:1;11271:6;11267:17;11261:4;11258:27;11255:53;;;11288:18;;:::i;:::-;11338:7;11328:8;11324:22;11321:55;;;11358:16;;;;11321:55;11437:22;;;;11397:15;;;;11199:270;;;11203:3;11053:422;;;;;:::o;11480:806::-;11529:5;11559:8;11549:80;;-1:-1:-1;11600:1:1;11614:5;;11549:80;11648:4;11638:76;;-1:-1:-1;11685:1:1;11699:5;;11638:76;11730:4;11748:1;11743:59;;;;11816:1;11811:130;;;;11723:218;;11743:59;11773:1;11764:10;;11787:5;;;11811:130;11848:3;11838:8;11835:17;11832:43;;;11855:18;;:::i;:::-;-1:-1:-1;;11911:1:1;11897:16;;11926:5;;11723:218;;12025:2;12015:8;12012:16;12006:3;12000:4;11997:13;11993:36;11987:2;11977:8;11974:16;11969:2;11963:4;11960:12;11956:35;11953:77;11950:159;;;-1:-1:-1;12062:19:1;;;12094:5;;11950:159;12141:34;12166:8;12160:4;12141:34;:::i;:::-;12211:6;12207:1;12203:6;12199:19;12190:7;12187:32;12184:58;;;12222:18;;:::i;:::-;12260:20;;11480:806;-1:-1:-1;;;11480:806:1:o;12291:140::-;12349:5;12378:47;12419:4;12409:8;12405:19;12399:4;12378:47;:::i;12436:168::-;12476:7;12542:1;12538;12534:6;12530:14;12527:1;12524:21;12519:1;12512:9;12505:17;12501:45;12498:71;;;12549:18;;:::i;:::-;-1:-1:-1;12589:9:1;;12436:168::o;12944:335::-;13146:2;13128:21;;;13185:2;13165:18;;;13158:30;-1:-1:-1;;;13219:2:1;13204:18;;13197:41;13270:2;13255:18;;12944:335::o;13971:136::-;14010:3;14038:5;14028:39;;14047:18;;:::i;:::-;-1:-1:-1;;;14083:18:1;;13971:136::o;15234:184::-;15304:6;15357:2;15345:9;15336:7;15332:23;15328:32;15325:52;;;15373:1;15370;15363:12;15325:52;-1:-1:-1;15396:16:1;;15234:184;-1:-1:-1;15234:184:1:o;15759:127::-;15820:10;15815:3;15811:20;15808:1;15801:31;15851:4;15848:1;15841:15;15875:4;15872:1;15865:15;15891:251;15961:6;16014:2;16002:9;15993:7;15989:23;15985:32;15982:52;;;16030:1;16027;16020:12;15982:52;16062:9;16056:16;16081:31;16106:5;16081:31;:::i;16147:461::-;16200:3;16238:5;16232:12;16265:6;16260:3;16253:19;16291:4;16320:2;16315:3;16311:12;16304:19;;16357:2;16350:5;16346:14;16378:1;16388:195;16402:6;16399:1;16396:13;16388:195;;;16467:13;;-1:-1:-1;;;;;16463:39:1;16451:52;;16523:12;;;;16558:15;;;;16499:1;16417:9;16388:195;;16613:332;16820:6;16809:9;16802:25;16863:2;16858;16847:9;16843:18;16836:30;16783:4;16883:56;16935:2;16924:9;16920:18;16912:6;16883:56;:::i;16950:1105::-;17045:6;17076:2;17119;17107:9;17098:7;17094:23;17090:32;17087:52;;;17135:1;17132;17125:12;17087:52;17168:9;17162:16;17197:18;17238:2;17230:6;17227:14;17224:34;;;17254:1;17251;17244:12;17224:34;17292:6;17281:9;17277:22;17267:32;;17337:7;17330:4;17326:2;17322:13;17318:27;17308:55;;17359:1;17356;17349:12;17308:55;17388:2;17382:9;17410:2;17406;17403:10;17400:36;;;17416:18;;:::i;:::-;17462:2;17459:1;17455:10;17494:2;17488:9;17557:2;17553:7;17548:2;17544;17540:11;17536:25;17528:6;17524:38;17612:6;17600:10;17597:22;17592:2;17580:10;17577:18;17574:46;17571:72;;;17623:18;;:::i;:::-;17659:2;17652:22;17709:18;;;17743:15;;;;-1:-1:-1;17785:11:1;;;17781:20;;;17813:19;;;17810:39;;;17845:1;17842;17835:12;17810:39;17869:11;;;;17889:135;17905:6;17900:3;17897:15;17889:135;;;17971:10;;17959:23;;17922:12;;;;18002;;;;17889:135;;;18043:6;16950:1105;-1:-1:-1;;;;;;;;16950:1105:1:o;21027:217::-;21067:1;21093;21083:132;;21137:10;21132:3;21128:20;21125:1;21118:31;21172:4;21169:1;21162:15;21200:4;21197:1;21190:15;21083:132;-1:-1:-1;21229:9:1;;21027:217::o;21528:188::-;21607:13;;-1:-1:-1;;;;;21649:42:1;;21639:53;;21629:81;;21706:1;21703;21696:12;21721:450;21808:6;21816;21824;21877:2;21865:9;21856:7;21852:23;21848:32;21845:52;;;21893:1;21890;21883:12;21845:52;21916:40;21946:9;21916:40;:::i;:::-;21906:50;;21975:49;22020:2;22009:9;22005:18;21975:49;:::i;:::-;21965:59;;22067:2;22056:9;22052:18;22046:25;22111:10;22104:5;22100:22;22093:5;22090:33;22080:61;;22137:1;22134;22127:12;22080:61;22160:5;22150:15;;;21721:450;;;;;:::o;24009:245::-;24076:6;24129:2;24117:9;24108:7;24104:23;24100:32;24097:52;;;24145:1;24142;24135:12;24097:52;24177:9;24171:16;24196:28;24218:5;24196:28;:::i;24670:582::-;24969:6;24958:9;24951:25;25012:6;25007:2;24996:9;24992:18;24985:34;25055:3;25050:2;25039:9;25035:18;25028:31;24932:4;25076:57;25128:3;25117:9;25113:19;25105:6;25076:57;:::i;:::-;-1:-1:-1;;;;;25169:32:1;;;;25164:2;25149:18;;25142:60;-1:-1:-1;25233:3:1;25218:19;25211:35;25068:65;24670:582;-1:-1:-1;;;24670:582:1:o;25869:306::-;25957:6;25965;25973;26026:2;26014:9;26005:7;26001:23;25997:32;25994:52;;;26042:1;26039;26032:12;25994:52;26071:9;26065:16;26055:26;;26121:2;26110:9;26106:18;26100:25;26090:35;;26165:2;26154:9;26150:18;26144:25;26134:35;;25869:306;;;;;:::o;26945:274::-;27074:3;27112:6;27106:13;27128:53;27174:6;27169:3;27162:4;27154:6;27150:17;27128:53;:::i;:::-;27197:16;;;;;26945:274;-1:-1:-1;;26945:274:1:o

Swarm Source

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