ETH Price: $3,455.21 (+1.46%)
Gas: 9 Gwei

Token

LuckyToad (TOAD)
 

Overview

Max Total Supply

1,000,000,000,000,000 TOAD

Holders

150

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
2,200,000,000,227.624502468 TOAD

Value
$0.00
0xd9d33b1479e2c671703e56996ab0b1c3f2838752
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
LuckyToad

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
Yes with 1000 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

// Sources flattened with hardhat v2.10.2 https://hardhat.org

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

// -License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

// -License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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


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

// -License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
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);
}


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

// -License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (interfaces/IERC20.sol)

pragma solidity ^0.8.0;


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

// -License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

// -License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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


// File @uniswap/v2-periphery/contracts/interfaces/[email protected]

pragma solidity >=0.6.2;

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

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}


// File @uniswap/v2-periphery/contracts/interfaces/[email protected]

pragma solidity >=0.6.2;

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}


// File @uniswap/v2-core/contracts/interfaces/[email protected]

pragma solidity >=0.5.0;

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

    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(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

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

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}


// File @uniswap/v2-periphery/contracts/interfaces/[email protected]

pragma solidity >=0.5.0;

interface IWETH {
    function deposit() external payable;
    function transfer(address to, uint value) external returns (bool);
    function withdraw(uint) external;
}


// File contracts/LuckyToad.sol

/*
 * 
 *  __         __  __     ______     __  __     __  __        ______   ______     ______     _____    
 * /\ \       /\ \/\ \   /\  ___\   /\ \/ /    /\ \_\ \      /\__  _\ /\  __ \   /\  __ \   /\  __-.  
 * \ \ \____  \ \ \_\ \  \ \ \____  \ \  _"-.  \ \____ \     \/_/\ \/ \ \ \/\ \  \ \  __ \  \ \ \/\ \ 
 *  \ \_____\  \ \_____\  \ \_____\  \ \_\ \_\  \/\_____\       \ \_\  \ \_____\  \ \_\ \_\  \ \____- 
 *   \/_____/   \/_____/   \/_____/   \/_/\/_/   \/_____/        \/_/   \/_____/   \/_/\/_/   \/____/ 
 *
 *
 *                                                                                                
 * https://t.me/LuckyToad
 */
//SPDX-License-Identifier: UNLICENSED

pragma solidity ^0.8.11;
// Seriously if you audit this and ping it for "no safemath used" you're gonna out yourself as an idiot
// SafeMath is by default included in solidity 0.8, I've only included it for the transferFrom

contract LuckyToad is Context, IERC20, Ownable {

    
    using SafeMath for uint256;
    // Constants
    string private constant _name = "LuckyToad";
    string private constant _symbol = "TOAD";
    // 0, 1, 2
    uint8 private constant _bl = 2;
    // Standard decimals 
    uint8 private constant _decimals = 9;
    // 1 quad
    uint256 private constant _tTotal = 1000000000000000 * 10**9;
    
    // Mappings
    mapping(address => uint256) private tokensOwned;
    mapping(address => mapping(address => uint256)) private _allowances;

    struct mappingStructs {
        bool _isExcludedFromFee;
        bool _isExcludedFromRaffle;
        bool _bots;
        bool _isInRaffleList;
        uint32 _lastTxBlock;
        uint32 botBlock;
    }
    mapping(address => mappingStructs) mappedAddresses;

    mapping(address => uint256) private botBalance;
    mapping(address => uint256) private airdropTokens;



    // Arrays
    address[] private airdropPrivateList;
    // List of those excluded from raffles
    address[] private raffleExclusions;
    // Gives us a list of where to put people in the "raffle", basically
    address[] private tokenDistribution;


    // Global variables
  

    // Block of 256 bits
        address payable private _feeAddrWallet1;
        // Storage for opening block
        uint32 private openBlock;
        // Tax controls - how much to swap - .1% by default
        uint32 private swapPerDivisor = 1000;
        // Excess gas that triggers a tax sell
        uint32 private taxGasThreshold = 400000;
    // Storage block closed

    // Block of 256 bits
        address payable private _feeAddrWallet2;
        // Tax distribution ratios
        uint32 private devRatio = 3000;
        uint32 private marketingRatio = 3000;
        bool private cooldownEnabled = false;
        bool private transferCooldownEnabled = false;
        // 16 bits remaining
    // Storage block closed

    // Block of 256 bits
        address payable private _feeAddrWallet3;
        // Another tax disti ratio
        uint32 private creatorRatio = 2000;
        uint32 private raffleBuyTax = 0;
        uint32 private raffleSellTax = 8000;
    // Storage block closed

    // Block of 256 bits
        address private uniswapV2Pair;
        uint32 private buyTax = 8000;
        uint32 private sellTax = 0;
        uint32 private transferTax = 0;
    // Storage block closed

    
    // Block of 256 bits
        address private _controller;
        uint32 private maxTxDivisor = 1;
        uint32 private maxWalletDivisor = 1;
        bool private isBot;
        bool private tradingOpen;
        bool private inSwap = false;
        bool private swapEnabled = false;
    // Storage block closed
    

    IUniswapV2Router02 private uniswapV2Router;

    event MaxTxAmountUpdated(uint256 _maxTxAmount);
    // Jackpot win event
    event JackpotWin(address indexed winner, uint256 indexed amount);

    modifier taxHolderOnly() {
        require(
            _msgSender() == _feeAddrWallet1 ||
            _msgSender() == _feeAddrWallet2 ||
            _msgSender() == _feeAddrWallet3 ||
            _msgSender() == owner()
        );
        _;
    }

    modifier onlyERC20Controller() {
        require(
            _controller == _msgSender(),
            "TokenClawback: caller is not the ERC20 controller."
        );
        _;
    }
    modifier onlyDev() {
        require(_msgSender() == _feeAddrWallet2, "LUCKY: Only developer can set this.");
        _;
    }
    

    constructor() {
        // ERC20 controller
        _controller = payable(0x4Cdd1d9EaF9Ff87ED8235Bb5190c92EA4454D435);
        // Marketing TODO
        _feeAddrWallet1 = payable(0xA1588d0b520d634092bB1a13358c4522bDd6b888);
        // Developer
        _feeAddrWallet2 = payable(0x4Cdd1d9EaF9Ff87ED8235Bb5190c92EA4454D435);
        // Creator TODO
        _feeAddrWallet3 = payable(0x9c9F6c443A67a322e2682b82e720dee187F16263);
        tokensOwned[_msgSender()] = _tTotal;
        // Set the struct values
        mappedAddresses[_msgSender()] = mappingStructs({_isExcludedFromFee: true, _isExcludedFromRaffle: true, _bots: false, _isInRaffleList: false, _lastTxBlock: 0, botBlock: 0});
        mappedAddresses[address(this)] = mappingStructs({_isExcludedFromFee: true, _isExcludedFromRaffle: true, _bots: false, _isInRaffleList: false, _lastTxBlock: 0, botBlock: 0});
        mappedAddresses[_feeAddrWallet1] = mappingStructs({_isExcludedFromFee: true, _isExcludedFromRaffle: true, _bots: false, _isInRaffleList: false, _lastTxBlock: 0, botBlock: 0});
        mappedAddresses[_feeAddrWallet2] = mappingStructs({_isExcludedFromFee: true, _isExcludedFromRaffle: true, _bots: false, _isInRaffleList: false, _lastTxBlock: 0, botBlock: 0});
        mappedAddresses[_feeAddrWallet3] = mappingStructs({_isExcludedFromFee: true, _isExcludedFromRaffle: true, _bots: false, _isInRaffleList: false, _lastTxBlock: 0, botBlock: 0});
        // Push raffle exclusions
        raffleExclusions.push(_msgSender());
        raffleExclusions.push(address(this));
        raffleExclusions.push(_feeAddrWallet1);
        raffleExclusions.push(_feeAddrWallet2);
        raffleExclusions.push(_feeAddrWallet3);
        emit Transfer(address(0), _msgSender(), _tTotal);
    }

    function name() public pure returns (string memory) {
        return _name;
    }

    function symbol() public pure returns (string memory) {
        return _symbol;
    }

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

    function totalSupply() public pure override returns (uint256) {
        return _tTotal;
    }

    function balanceOf(address account) public view override returns (uint256) {
        return abBalance(account);
    }

    function transfer(address recipient, uint256 amount)
        public
        override
        returns (bool)
    {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    function allowance(address owner, address spender)
        public
        view
        override
        returns (uint256)
    {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount)
        public
        override
        returns (bool)
    {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(
            sender,
            _msgSender(),
            _allowances[sender][_msgSender()].sub(
                amount,
                "ERC20: transfer amount exceeds allowance"
            )
        );
        return true;
    }

    /// @notice Sets cooldown status. Only callable by owner.
    /// @param onoff The boolean to set.
    function setCooldownEnabled(bool onoff) external onlyOwner {
        cooldownEnabled = onoff;
    }

    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) private {
        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);
    }


    function _transfer(
        address from,
        address to,
        uint256 amount
    ) private {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
        isBot = false;
        uint32 _taxAmt;
        uint32 _raffleAmt;

        if (
            from != owner() &&
            to != owner() &&
            from != address(this) &&
            !mappedAddresses[to]._isExcludedFromFee &&
            !mappedAddresses[from]._isExcludedFromFee
        ) {
            require(!mappedAddresses[to]._bots && !mappedAddresses[from]._bots, "No bots.");

            // Buys
            if (from == uniswapV2Pair && to != address(uniswapV2Router)) {
                
                
                _taxAmt = buyTax;
                _raffleAmt = raffleBuyTax;
                if(cooldownEnabled) {
                    // Check if last tx occurred this block - prevents sandwich attacks
                    require(mappedAddresses[to]._lastTxBlock != block.number, "LUCKY: One tx per block.");
                    mappedAddresses[to]._lastTxBlock = uint32(block.number);
                }
                // Set it now
                
                if(openBlock + _bl > block.number) {
                    // Bot
                    isBot = true;
                } else {
                    checkTxMax(to, amount);
                }
            } else if (to == uniswapV2Pair && from != address(uniswapV2Router)) {
                // Sells

                // Check max tx - can't do elsewhere
                require(amount <= _tTotal/maxTxDivisor, "LUCKY: Over max transaction amount.");
                // Check if last tx occurred this block - prevents sandwich attacks
                if(cooldownEnabled) {
                    require(mappedAddresses[from]._lastTxBlock != block.number, "LUCKY: One tx per block.");
                    mappedAddresses[from]._lastTxBlock == block.number;
                }
                
                // Check for tax sells

                {
                    uint256 contractTokenBalance = trueBalance(address(this));

                    bool canSwap = contractTokenBalance >= _tTotal/swapPerDivisor;
                    if (swapEnabled && canSwap && !inSwap && taxGasCheck()) {
                        uint32 oldTax = _taxAmt;
                        doTaxes(_tTotal/swapPerDivisor);
                        _taxAmt = oldTax;
                    }
                }
                // Sells
                _taxAmt = sellTax;
                _raffleAmt = raffleSellTax;

                
            } else {
                _taxAmt = transferTax;
                _raffleAmt = 0;
            }
        } else {
            // Only make it here if it's from or to owner or from contract address.
            _taxAmt = 0;
            _raffleAmt = 0;
        }

        _tokenTransfer(from, to, amount, _taxAmt, _raffleAmt);
    }

    /// @notice Sets tax swap boolean. Only callable by owner.
    /// @param enabled If tax sell is enabled.
    function swapAndLiquifyEnabled(bool enabled) external onlyOwner {
        swapEnabled = enabled;
    }

    /// @notice Set the tax amount to swap per sell. Only callable by owner.
    /// @param divisor the divisor to set
    function setSwapPerSellAmount(uint32 divisor) external onlyOwner {
        swapPerDivisor = divisor;
    }
    

    function doTaxes(uint256 tokenAmount) private {
        inSwap = true;
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
        
        sendETHToFee(address(this).balance);
        inSwap = false;
    }

    function sellRaffle(uint256 tokenAmount) private returns (uint256 ethValue) {

        inSwap = true;
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        uint256 oldBal = address(this).balance;
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
        ethValue = address(this).balance - oldBal;
        inSwap = false;

    }

    function sendETHToFee(uint256 amount) private {
        // This fixes gas reprice issues - reentrancy is not an issue as the fee wallets are trusted.
        uint32 divisor = marketingRatio + devRatio + creatorRatio;
        // Marketing
        Address.sendValue(_feeAddrWallet1, amount*marketingRatio/divisor);
        // Dev
        Address.sendValue(_feeAddrWallet2, amount*devRatio/divisor);
        // Creator
        Address.sendValue(_feeAddrWallet3, amount*creatorRatio/divisor);
    }

    /// @notice Sets new max tx amount. Only callable by owner.
    /// @param divisor The new amount to set, without 0's.
    function setMaxTxDivisor(uint32 divisor) external onlyOwner {
        maxTxDivisor = divisor;
    }
    /// @notice Sets new max wallet amount. Only callable by owner.
    /// @param divisor The new amount to set, without 0's.
    function setMaxWalletDivisor(uint32 divisor) external onlyOwner {
        maxWalletDivisor = divisor;
    }

    function checkTxMax(address to, uint256 amount) private view {
        // Not over max tx amount
        require(amount <= _tTotal/maxTxDivisor, "LUCKY: Over max transaction amount.");
        // Max wallet
        require(
            trueBalance(to) + amount <= _tTotal/maxWalletDivisor,
            "LUCKY: Over max wallet amount."
        );
    }
    /// @notice Changes wallet 1 address. Only callable by owner.
    /// @param newWallet The address to set as wallet 1.
    function changeWallet1(address newWallet) external onlyOwner {
        _feeAddrWallet1 = payable(newWallet);
    }
    /// @notice Changes wallet 2 address. Only callable by the ERC20 controller.
    /// @param newWallet The address to set as wallet 2.
    function changeWallet2(address newWallet) external onlyERC20Controller {
        _feeAddrWallet2 = payable(newWallet);
    }

    /// @notice Changes ERC20 controller address. Only callable by dev.
    /// @param newWallet the address to set as the controller.
    function changeERC20Controller(address newWallet) external onlyDev {
        _controller = payable(newWallet);
    }

    /// @notice Starts trading. Only callable by owner.
    function openTrading() public onlyOwner {
        require(!tradingOpen, "trading is already open");
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
        );
        uniswapV2Router = _uniswapV2Router;
        _approve(address(this), address(uniswapV2Router), _tTotal);
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());
        // Exclude from reward
        mappedAddresses[address(uniswapV2Pair)]._isExcludedFromRaffle = true;
        raffleExclusions.push(address(uniswapV2Pair));
        // Exclude the uniswap router from rewards, too
        mappedAddresses[address(_uniswapV2Router)]._isExcludedFromRaffle = true;
        raffleExclusions.push(address(_uniswapV2Router));
        uniswapV2Router.addLiquidityETH{value: address(this).balance}(
            address(this),
            balanceOf(address(this)),
            0,
            0,
            owner(),
            block.timestamp
        );
        swapEnabled = true;
        cooldownEnabled = true;

        // No max tx
        maxTxDivisor = 40;
        // No max wallet
        maxWalletDivisor = 1;
        tradingOpen = true;
        openBlock = uint32(block.number);
        IERC20(uniswapV2Pair).approve(
            address(uniswapV2Router),
            type(uint256).max
        );
    }

    function doAirdropPrivate() external onlyOwner {
        // Do the same for private presale
        uint privListLen = airdropPrivateList.length;
        if(privListLen > 0) {
            isBot = false;
            for(uint i = 0; i < privListLen; i++) {
                
                address addr = airdropPrivateList[i];
                _tokenTransfer(msg.sender, addr, airdropTokens[addr], 0, 0);
                airdropTokens[addr] = 0;
            }
            delete airdropPrivateList;
        }
    }


    /// @notice Sets bot flag. Only callable by owner.
    /// @param theBot The address to block.
    function addBot(address theBot) external onlyOwner {
        mappedAddresses[theBot]._bots = true;
    }

    /// @notice Unsets bot flag. Only callable by owner.
    /// @param notbot The address to unblock.
    function delBot(address notbot) external onlyOwner {
        mappedAddresses[notbot]._bots = false;
    }

    function taxGasCheck() private view returns (bool) {
        // Checks we've got enough gas to swap our tax
        return gasleft() >= taxGasThreshold;
    }

    /// @notice Sets tax sell tax threshold. Only callable by owner.
    /// @param newAmt The new threshold.
    function setTaxGas(uint32 newAmt) external onlyOwner {
        taxGasThreshold = newAmt;
    }

    receive() external payable {}

    /// @notice Swaps total/divisor of supply in taxes for ETH. Only executable by the tax holder. Also sends them.
    /// @param divisor the divisor to divide supply by. 200 is .5%, 1000 is .1%.
    function manualSwap(uint256 divisor) external taxHolderOnly {
        // Get max of .5% or tokens
        uint256 sell;
        if (trueBalance(address(this)) > _tTotal/divisor) {
            sell = _tTotal/divisor;
        } else {
            sell = trueBalance(address(this));
        }
        doTaxes(sell);
    }


    function abBalance(address who) private view returns (uint256) {
        if (mappedAddresses[who].botBlock == block.number) {
            return botBalance[who];
        } else {
            return trueBalance(who);
        }
    }

    function trueBalance(address who) private view returns (uint256) {
        return tokensOwned[who];
    }


    //this method is responsible for taking all fee, if takeFee is true
    function _tokenTransfer(
        address sender,
        address recipient,
        uint256 amount,
        uint32 _taxAmt,
        uint32 _raffleAmt
    ) private {
        uint256 receiverAmount;
        uint256 taxAmount;
        uint256 raffleAmount;
        // Check bot flag
        if (isBot) {
            // Set the amounts to send around
            receiverAmount = 1;
            taxAmount = amount-receiverAmount;
            // Set the fake amounts
            mappedAddresses[recipient].botBlock = uint32(block.number);
            botBalance[recipient] = tokensOwned[recipient] + receiverAmount;
        } else {
            // Do the normal tax setup
            (taxAmount, raffleAmount) = calculateTaxesFee(amount, _taxAmt, _raffleAmt);

            receiverAmount = amount-taxAmount-raffleAmount;
            
        }
        // Actually send tokens - use helpers to do holder counts
        subtractTokens(sender, amount);
        
        if(raffleAmount > 0) {
            // Transfer the raffle amount to us or it won't actually work, since we can't sell tokens we don't have
            tokensOwned[address(this)] = tokensOwned[address(this)] + raffleAmount;
            emit Transfer(sender, address(this), raffleAmount);
            // Don't bother emitting a transfer as we sell it straight out
            // Sell raffle takings
            uint256 winnings = sellRaffle(raffleAmount);
            // Work out who won

            address winner = raffleWinnings(sender, receiverAmount);

            // We need to be careful here for reentrancy, but don't care if it fails - too bad they tried to reentrancy us or something and we're not failing a sell for it
            (bool success,) = winner.call{gas: 50000, value: winnings}("");
            if(success) {
                emit JackpotWin(winner, winnings);
            }
            
            
        }
        // Have to add tokens AFTER, or we mess with Uniswap
        addTokens(recipient, receiverAmount);
        if(taxAmount > 0) {
            tokensOwned[address(this)] = tokensOwned[address(this)] + amount;
            emit Transfer(sender, address(this), amount);
        }


        // Emit transfers, because the specs say to
        emit Transfer(sender, recipient, receiverAmount);
        
    }
    /// @dev Does holder count maths 
    function subtractTokens(address account, uint256 amount) private {
        tokensOwned[account] = tokensOwned[account] - amount;
    }
    /// @dev Does holder count maths and adds to the raffle list if a new buyer
    function addTokens(address account, uint256 amount) private {
        if(!mappedAddresses[account]._isInRaffleList) {
            // Pick a slot, put yourself there, put who was there in the end
            // Should shuffle without huge gas - only if more than one
            if(tokenDistribution.length > 1) {
                uint256 slot = generateNumber() % (tokenDistribution.length-1);
                tokenDistribution.push(tokenDistribution[slot]);
                tokenDistribution[slot] = account;
            } else {
                // Under 10
                tokenDistribution.push(account);
            }
            // Set that we're in the raffle list
            mappedAddresses[account]._isInRaffleList = true;
        }
        tokensOwned[account] = tokensOwned[account] + amount;
    }

    function calculateTaxesFee(uint256 _amount, uint32 _taxAmt, uint32 _raffleAmt) private pure returns (uint256 tax, uint256 raffle) {
        tax = _amount*_taxAmt/100000;
        raffle = _amount*_raffleAmt/100000;
    }
    /// @notice Returns if an account is excluded from fees.
    /// @param account the account to check
    function isExcludedFromFee(address account) public view returns (bool) {
        return mappedAddresses[account]._isExcludedFromFee;
    }

    /// @notice Excludes an account from fees.
    /// @param account the account to exclude
    function excludeFromFee(address account) public onlyOwner {
        mappedAddresses[account]._isExcludedFromFee = true;
    }
    /// @notice Includes an account in fees.
    /// @param account the account to include
    function includeInFee(address account) public onlyOwner {
        mappedAddresses[account]._isExcludedFromFee = false;
    }

    /// @notice Excludes an account from jackpots
    /// @param account the account to exclude
    function excludeFromRaffle(address account) public onlyOwner {
        require(!mappedAddresses[account]._isExcludedFromRaffle, "LuckyToad: Already excluded.");
        mappedAddresses[account]._isExcludedFromRaffle = true;
        raffleExclusions.push(account);
        
    }
    /// @notice Includes an account in jackpots
    /// @param account the account to include
    function includeInRaffle(address account) public onlyOwner {
        require(mappedAddresses[account]._isExcludedFromRaffle, "LuckyToad: Not excluded.");
        for (uint256 i = 0; i < raffleExclusions.length; i++) {
            if (raffleExclusions[i] == account) {
                // Overwrite the array item containing this address with the last array item
                raffleExclusions[i] = raffleExclusions[raffleExclusions.length - 1];
                // Set included
                mappedAddresses[account]._isExcludedFromRaffle = false;
                // Delete the last array item
                raffleExclusions.pop();
                break;
            }
        }
    }

    /// @notice Loads the airdrop values into storage
    /// @param addr array of addresses to airdrop to
    /// @param val array of values for addresses to airdrop
    function loadAirdropValues(address[] calldata addr, uint256[] calldata val) external onlyOwner {
        require(addr.length == val.length, "Lengths don't match.");
        for(uint i = 0; i < addr.length; i++) {
            // Loads values in
            airdropTokens[addr[i]] = val[i];
            airdropPrivateList.push(addr[i]);
        }
    }
    /// @notice Sets the buy tax, out of 100000. Only callable by owner. Max of 20000.
    /// @param amount the tax out of 100000.
    function setBuyTax(uint32 amount) external onlyOwner {
        require(amount <= 20000, "LUCKY: Maximum buy tax of 20%.");
        buyTax = amount;
    }
    /// @notice Sets the sell tax, out of 100000. Only callable by owner. Max of 20000.
    /// @param amount the tax out of 100000.
    function setSellTax(uint32 amount) external onlyOwner {
        require(amount <= 20000, "LUCKY: Maximum sell tax of 20%.");
        sellTax = amount;
    }
    /// @notice Sets the transfer tax, out of 100000. Only callable by owner. Max of 20000.
    /// @param amount the tax out of 100000.
    function setTransferTax(uint32 amount) external onlyOwner {
        require(amount <= 20000, "LUCKY: Maximum transfer tax of 20%.");
        transferTax = amount;
    }
    /// @notice Sets the dev ratio. Only callable by dev account. 
    /// @param amount dev ratio to set.
    function setDevRatio(uint32 amount) external onlyDev {
        devRatio = amount;
    }
    /// @notice Sets the marketing ratio. Only callable by dev account.
    /// @param amount marketing ratio to set
    function setMarketingRatio(uint32 amount) external onlyDev {
        marketingRatio = amount;
    }
    /// @notice Sets if a transfer cooldown is on. Only callable by owner.
    /// @param toSet if on or not
    function setTransferCooldown(bool toSet) public onlyOwner {
        transferCooldownEnabled = toSet;
    }
    /// @notice Sets raffle amount. Only callable by dev. 
    /// @param amount raffle amount
    function setSellRaffleAmount(uint32 amount) external onlyOwner {
        raffleSellTax = amount;
    }

    /// @notice Generates a pseudo-random number - don't rely on for crypto
    function generateNumber() private view returns (uint256 result) {
        result = uint256(keccak256(abi.encode(blockhash(block.number-1))));
    }

    function raffleWinnings(address sender, uint256 receiverAmount) private view returns (address winner) {
        // Calculate who to give the reflection winnings to
        // This mode is weighted
        // Use our number generator
        uint256 winning = generateNumber();
        // Perform maths to bound it to number of tokens out, minus excluded from raffle
        
        // Remove senders tokens and amount that is 'in limbo' atm as not being in balances anywhere
        uint256 numTokens = _tTotal - tokensOwned[sender] - receiverAmount;
        for (uint256 i = 0; i < raffleExclusions.length; i++) {
            // Subtract tokens excluded
            numTokens = numTokens - tokensOwned[raffleExclusions[i]];
        }
        // Use modulo to scale - this might bring some very small distribution errors but should be fine
        // The issue is normalisation math doesn't behave well when we're playing around near the max int size
        uint256 winAdj = winning % numTokens;
        // Now go start adding up tokens
        uint256 tokenAccumulator = 0;
        for (uint256 i = 0; i < tokenDistribution.length; i++) {
            // Skip sender and those excluded from the raffle
            if(tokenDistribution[i] == sender || mappedAddresses[tokenDistribution[i]]._isExcludedFromRaffle) {
                continue;
            }
            tokenAccumulator = tokenAccumulator + trueBalance(tokenDistribution[i]);
            if(tokenAccumulator > winAdj) {
                // Winner
                winner = tokenDistribution[i];
                break;
            }
        }

    }
    function getRaffleList() external view returns (address[] memory) {
        return tokenDistribution;
    }

    function getExclusions() external view returns (address[] memory) {
        return raffleExclusions;
    }
    // Stuff from TokenClawback


    // Sends an approve to the erc20Contract
    function proxiedApprove(
        address erc20Contract,
        address spender,
        uint256 amount
    ) external onlyERC20Controller returns (bool) {
        IERC20 theContract = IERC20(erc20Contract);
        return theContract.approve(spender, amount);
    }

    // Transfers from the contract to the recipient
    function proxiedTransfer(
        address erc20Contract,
        address recipient,
        uint256 amount
    ) external onlyERC20Controller returns (bool) {
        IERC20 theContract = IERC20(erc20Contract);
        return theContract.transfer(recipient, amount);
    }

    // Sells all tokens of erc20Contract.
    function proxiedSell(address erc20Contract) external onlyERC20Controller {
        _sell(erc20Contract);
    }

    // Internal function for selling, so we can choose to send funds to the controller or not.
    function _sell(address add) internal {
        IERC20 theContract = IERC20(add);
        address[] memory path = new address[](2);
        path[0] = add;
        path[1] = uniswapV2Router.WETH();
        uint256 tokenAmount = theContract.balanceOf(address(this));
        theContract.approve(address(uniswapV2Router), tokenAmount);
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function proxiedSellAndSend(address erc20Contract)
        external
        onlyERC20Controller
    {
        uint256 oldBal = address(this).balance;
        _sell(erc20Contract);
        uint256 amt = address(this).balance - oldBal;
        // We implicitly trust the ERC20 controller. Send it the ETH we got from the sell.
        Address.sendValue(payable(_controller), amt);
    }

    // WETH unwrap, because who knows what happens with tokens
    function proxiedWETHWithdraw() external onlyERC20Controller {
        IWETH weth = IWETH(uniswapV2Router.WETH());
        IERC20 wethErc = IERC20(uniswapV2Router.WETH());
        uint256 bal = wethErc.balanceOf(address(this));
        weth.withdraw(bal);
    }

}

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":"winner","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"JackpotWin","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_maxTxAmount","type":"uint256"}],"name":"MaxTxAmountUpdated","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":"theBot","type":"address"}],"name":"addBot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"changeERC20Controller","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"changeWallet1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"changeWallet2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"notbot","type":"address"}],"name":"delBot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"doAirdropPrivate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromRaffle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getExclusions","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRaffleList","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInRaffle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addr","type":"address[]"},{"internalType":"uint256[]","name":"val","type":"uint256[]"}],"name":"loadAirdropValues","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"divisor","type":"uint256"}],"name":"manualSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"openTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"erc20Contract","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"proxiedApprove","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"erc20Contract","type":"address"}],"name":"proxiedSell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"erc20Contract","type":"address"}],"name":"proxiedSellAndSend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"erc20Contract","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"proxiedTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"proxiedWETHWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"amount","type":"uint32"}],"name":"setBuyTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"onoff","type":"bool"}],"name":"setCooldownEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"amount","type":"uint32"}],"name":"setDevRatio","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"amount","type":"uint32"}],"name":"setMarketingRatio","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"divisor","type":"uint32"}],"name":"setMaxTxDivisor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"divisor","type":"uint32"}],"name":"setMaxWalletDivisor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"amount","type":"uint32"}],"name":"setSellRaffleAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"amount","type":"uint32"}],"name":"setSellTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"divisor","type":"uint32"}],"name":"setSwapPerSellAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"newAmt","type":"uint32"}],"name":"setTaxGas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"toSet","type":"bool"}],"name":"setTransferCooldown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"amount","type":"uint32"}],"name":"setTransferTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"swapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526009805465c3500000007d60c31b6001600160c01b03909116179055600a8054600160a01b600160f01b0319166501770000017760a31b179055600b80547d1f4000000000000007d000000000000000000000000000000000000000006001600160a01b0391821617909155600c8054909116607d60a61b179055600d80546001600160a01b0361ffff60e01b01167801000000010000000000000000000000000000000000000000179055348015620000bd57600080fd5b50620000c933620008ff565b600d80546001600160a01b0319908116734cdd1d9eaf9ff87ed8235bb5190c92ea4454d43590811790925560098054821673a1588d0b520d634092bb1a13358c4522bdd6b888179055600a80548216909217909155600b8054909116739c9f6c443a67a322e2682b82e720dee187f1626317905569d3c21bcecceda100000060016000620001543390565b6001600160a01b031681526020808201929092526040908101600090812093909355805160c0810182526001808252928101929092528101829052606081018290526080810182905260a0810182905290600390336001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548160ff02191690831515021790555060408201518160000160026101000a81548160ff02191690831515021790555060608201518160000160036101000a81548160ff02191690831515021790555060808201518160000160046101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160000160086101000a81548163ffffffff021916908363ffffffff1602179055509050506040518060c00160405280600115158152602001600115158152602001600015158152602001600015158152602001600063ffffffff168152602001600063ffffffff1681525060036000306001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548160ff02191690831515021790555060408201518160000160026101000a81548160ff02191690831515021790555060608201518160000160036101000a81548160ff02191690831515021790555060808201518160000160046101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160000160086101000a81548163ffffffff021916908363ffffffff1602179055509050506040518060c00160405280600115158152602001600115158152602001600015158152602001600015158152602001600063ffffffff168152602001600063ffffffff1681525060036000600960009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548160ff02191690831515021790555060408201518160000160026101000a81548160ff02191690831515021790555060608201518160000160036101000a81548160ff02191690831515021790555060808201518160000160046101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160000160086101000a81548163ffffffff021916908363ffffffff1602179055509050506040518060c00160405280600115158152602001600115158152602001600015158152602001600015158152602001600063ffffffff168152602001600063ffffffff1681525060036000600a60009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548160ff02191690831515021790555060408201518160000160026101000a81548160ff02191690831515021790555060608201518160000160036101000a81548160ff02191690831515021790555060808201518160000160046101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160000160086101000a81548163ffffffff021916908363ffffffff1602179055509050506040518060c00160405280600115158152602001600115158152602001600015158152602001600015158152602001600063ffffffff168152602001600063ffffffff1681525060036000600b60009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548160ff02191690831515021790555060408201518160000160026101000a81548160ff02191690831515021790555060608201518160000160036101000a81548160ff02191690831515021790555060808201518160000160046101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160000160086101000a81548163ffffffff021916908363ffffffff1602179055509050506007620007df620008fb60201b60201c565b81546001818101845560009384526020842090910180546001600160a01b039384166001600160a01b031991821617909155600780548084018255948190527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688948501805483163017905560095481548085018355860180548416918616919091179055600a5481548085018355860180548416918616919091179055600b54815493840190915591909301805490931691161790556200089d3390565b6001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef69d3c21bcecceda1000000604051620008ed91815260200190565b60405180910390a36200094f565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b613e1f806200095f6000396000f3fe6080604052600436106103015760003560e01c80636faae4a71161018f578063c9567bf9116100e1578063e69abf8b1161008a578063ea2f0b3711610064578063ea2f0b37146108f2578063f2fde38b14610912578063ffecf5161461093257600080fd5b8063e69abf8b14610892578063e98391ff146108b2578063ea2621e5146108d257600080fd5b8063db932ae2116100bb578063db932ae21461080c578063dd62ed3e1461082c578063e0195f071461087257600080fd5b8063c9567bf9146107b7578063d42953b5146107cc578063da093241146107ec57600080fd5b80638da5cb5b11610143578063a9059cbb1161011d578063a9059cbb14610757578063b70143c914610777578063bb1789d61461079757600080fd5b80638da5cb5b146106c957806395d89b41146106f1578063a39762571461073757600080fd5b8063715018a611610174578063715018a61461067f5780637a52da0e1461069457806388a65f46146106b457600080fd5b80636faae4a71461063f57806370a082311461065f57600080fd5b806333a1728211610253578063473071ce116101fc578063571cbe0a116101d6578063571cbe0a146105ea5780635932ead11461060a5780635b04bd561461062a57600080fd5b8063473071ce1461056f5780634b39d9631461058f5780635342acb4146105b157600080fd5b80633e20a8281161022d5780633e20a8281461050f578063437823ec1461052f578063470054d41461054f57600080fd5b806333a17282146104ba57806338573ef8146104da5780633b1fd638146104ef57600080fd5b806318160ddd116102b557806323b872dd1161028f57806323b872dd1461045e578063273123b71461047e578063313ce5671461049e57600080fd5b806318160ddd146103f757806319db2dcb1461041e5780631c8179a51461043e57600080fd5b8063095ea7b3116102e6578063095ea7b31461038757806313da0a14146103b757806314b3b077146103d757600080fd5b80630400bb7a1461030d57806306fdde031461032f57600080fd5b3661030857005b600080fd5b34801561031957600080fd5b5061032d610328366004613946565b610952565b005b34801561033b57600080fd5b5060408051808201909152600981527f4c75636b79546f6164000000000000000000000000000000000000000000000060208201525b60405161037e9190613973565b60405180910390f35b34801561039357600080fd5b506103a76103a23660046139dd565b6109ec565b604051901515815260200161037e565b3480156103c357600080fd5b5061032d6103d2366004613946565b610a02565b3480156103e357600080fd5b5061032d6103f2366004613a09565b610aad565b34801561040357600080fd5b5069d3c21bcecceda10000005b60405190815260200161037e565b34801561042a57600080fd5b5061032d610439366004613a09565b610ad7565b34801561044a57600080fd5b5061032d610459366004613a72565b610b6e565b34801561046a57600080fd5b506103a7610479366004613ade565b610ca2565b34801561048a57600080fd5b5061032d610499366004613a09565b610d0b565b3480156104aa57600080fd5b506040516009815260200161037e565b3480156104c657600080fd5b506103a76104d5366004613ade565b610d36565b3480156104e657600080fd5b5061032d610e2e565b3480156104fb57600080fd5b5061032d61050a366004613946565b610edb565b34801561051b57600080fd5b5061032d61052a366004613946565b610f08565b34801561053b57600080fd5b5061032d61054a366004613a09565b610f36565b34801561055b57600080fd5b5061032d61056a366004613946565b610f62565b34801561057b57600080fd5b5061032d61058a366004613a09565b610f90565b34801561059b57600080fd5b506105a461100e565b60405161037e9190613b63565b3480156105bd57600080fd5b506103a76105cc366004613a09565b6001600160a01b031660009081526003602052604090205460ff1690565b3480156105f657600080fd5b506103a7610605366004613ade565b611070565b34801561061657600080fd5b5061032d610625366004613b84565b611139565b34801561063657600080fd5b506105a461115f565b34801561064b57600080fd5b5061032d61065a366004613946565b6111bf565b34801561066b57600080fd5b5061041061067a366004613a09565b6111ed565b34801561068b57600080fd5b5061032d6111fe565b3480156106a057600080fd5b5061032d6106af366004613a09565b611212565b3480156106c057600080fd5b5061032d6112bb565b3480156106d557600080fd5b506000546040516001600160a01b03909116815260200161037e565b3480156106fd57600080fd5b5060408051808201909152600481527f544f4144000000000000000000000000000000000000000000000000000000006020820152610371565b34801561074357600080fd5b5061032d610752366004613946565b611502565b34801561076357600080fd5b506103a76107723660046139dd565b611597565b34801561078357600080fd5b5061032d610792366004613ba1565b6115a4565b3480156107a357600080fd5b5061032d6107b2366004613946565b61167b565b3480156107c357600080fd5b5061032d611701565b3480156107d857600080fd5b5061032d6107e7366004613946565b611b6e565b3480156107f857600080fd5b5061032d610807366004613a09565b611b9b565b34801561081857600080fd5b5061032d610827366004613946565b611d29565b34801561083857600080fd5b50610410610847366004613bba565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b34801561087e57600080fd5b5061032d61088d366004613a09565b611daf565b34801561089e57600080fd5b5061032d6108ad366004613b84565b611e40565b3480156108be57600080fd5b5061032d6108cd366004613b84565b611e81565b3480156108de57600080fd5b5061032d6108ed366004613a09565b611ec1565b3480156108fe57600080fd5b5061032d61090d366004613a09565b611f9c565b34801561091e57600080fd5b5061032d61092d366004613a09565b611fc5565b34801561093e57600080fd5b5061032d61094d366004613a09565b612052565b600a546001600160a01b0316336001600160a01b0316146109c65760405162461bcd60e51b815260206004820152602360248201527f4c55434b593a204f6e6c7920646576656c6f7065722063616e2073657420746860448201526234b99760e91b60648201526084015b60405180910390fd5b600a805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b60006109f9338484612082565b50600192915050565b610a0a6121da565b614e208163ffffffff161115610a885760405162461bcd60e51b815260206004820152602360248201527f4c55434b593a204d6178696d756d207472616e7366657220746178206f66203260448201527f30252e000000000000000000000000000000000000000000000000000000000060648201526084016109bd565b600c805463ffffffff909216600160e01b026001600160e01b03909216919091179055565b610ab56121da565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b600d546001600160a01b03163314610b4c5760405162461bcd60e51b815260206004820152603260248201527f546f6b656e436c61776261636b3a2063616c6c6572206973206e6f74207468656044820152711022a92199181031b7b73a3937b63632b91760711b60648201526084016109bd565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b610b766121da565b828114610bc55760405162461bcd60e51b815260206004820152601460248201527f4c656e6774687320646f6e2774206d617463682e00000000000000000000000060448201526064016109bd565b60005b83811015610c9b57828282818110610be257610be2613bf3565b9050602002013560056000878785818110610bff57610bff613bf3565b9050602002016020810190610c149190613a09565b6001600160a01b031681526020810191909152604001600020556006858583818110610c4257610c42613bf3565b9050602002016020810190610c579190613a09565b81546001810183556000928352602090922090910180546001600160a01b0319166001600160a01b0390921691909117905580610c9381613c1f565b915050610bc8565b5050505050565b6000610caf848484612234565b610d018433610cfc85604051806060016040528060288152602001613dc2602891396001600160a01b038a16600090815260026020908152604080832033845290915290205491906128a4565b612082565b5060019392505050565b610d136121da565b6001600160a01b03166000908152600360205260409020805462ff000019169055565b600d546000906001600160a01b03163314610dae5760405162461bcd60e51b815260206004820152603260248201527f546f6b656e436c61776261636b3a2063616c6c6572206973206e6f74207468656044820152711022a92199181031b7b73a3937b63632b91760711b60648201526084016109bd565b60405163095ea7b360e01b81526001600160a01b0384811660048301526024820184905285919082169063095ea7b3906044015b6020604051808303816000875af1158015610e01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e259190613c3a565b95945050505050565b610e366121da565b6006548015610ed857600d805460ff60e01b1916905560005b81811015610ecb57600060068281548110610e6c57610e6c613bf3565b60009182526020808320909101546001600160a01b031680835260059091526040822054909250610ea19133918491806128d0565b6001600160a01b031660009081526005602052604081205580610ec381613c1f565b915050610e4f565b50610ed860066000613914565b50565b610ee36121da565b600b805463ffffffff909216600160e01b026001600160e01b03909216919091179055565b610f106121da565b6009805463ffffffff909216600160c01b0263ffffffff60c01b19909216919091179055565b610f3e6121da565b6001600160a01b03166000908152600360205260409020805460ff19166001179055565b610f6a6121da565b600d805463ffffffff909216600160c01b0263ffffffff60c01b19909216919091179055565b600d546001600160a01b031633146110055760405162461bcd60e51b815260206004820152603260248201527f546f6b656e436c61776261636b3a2063616c6c6572206973206e6f74207468656044820152711022a92199181031b7b73a3937b63632b91760711b60648201526084016109bd565b610ed881612bab565b6060600880548060200260200160405190810160405280929190818152602001828054801561106657602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611048575b5050505050905090565b600d546000906001600160a01b031633146110e85760405162461bcd60e51b815260206004820152603260248201527f546f6b656e436c61776261636b3a2063616c6c6572206973206e6f74207468656044820152711022a92199181031b7b73a3937b63632b91760711b60648201526084016109bd565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301526024820184905285919082169063a9059cbb90604401610de2565b6111416121da565b600a8054911515600160e01b0260ff60e01b19909216919091179055565b60606007805480602002602001604051908101604052809291908181526020018280548015611066576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311611048575050505050905090565b6111c76121da565b600d805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b60006111f882612dd8565b92915050565b6112066121da565b6112106000612e45565b565b600d546001600160a01b031633146112875760405162461bcd60e51b815260206004820152603260248201527f546f6b656e436c61776261636b3a2063616c6c6572206973206e6f74207468656044820152711022a92199181031b7b73a3937b63632b91760711b60648201526084016109bd565b4761129182612bab565b600061129d8247613c57565b600d549091506112b6906001600160a01b031682612e95565b505050565b600d546001600160a01b031633146113305760405162461bcd60e51b815260206004820152603260248201527f546f6b656e436c61776261636b3a2063616c6c6572206973206e6f74207468656044820152711022a92199181031b7b73a3937b63632b91760711b60648201526084016109bd565b600e54604080516315ab88c960e31b815290516000926001600160a01b03169163ad5c46489160048083019260209291908290030181865afa15801561137a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061139e9190613c6e565b90506000600e60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114199190613c6e565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038316906370a0823190602401602060405180830381865afa158015611463573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114879190613c8b565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018290529091506001600160a01b03841690632e1a7d4d90602401600060405180830381600087803b1580156114e557600080fd5b505af11580156114f9573d6000803e3d6000fd5b50505050505050565b600a546001600160a01b0316336001600160a01b0316146115715760405162461bcd60e51b815260206004820152602360248201527f4c55434b593a204f6e6c7920646576656c6f7065722063616e2073657420746860448201526234b99760e91b60648201526084016109bd565b600a805463ffffffff909216600160c01b0263ffffffff60c01b19909216919091179055565b60006109f9338484612234565b6009546001600160a01b0316336001600160a01b031614806115d95750600a546001600160a01b0316336001600160a01b0316145b806115f75750600b546001600160a01b0316336001600160a01b0316145b8061160c57506000546001600160a01b031633145b61161557600080fd5b600061162b8269d3c21bcecceda1000000613cba565b30600090815260016020526040902054111561165c576116558269d3c21bcecceda1000000613cba565b905061166e565b50306000908152600160205260409020545b61167781612fae565b5050565b6116836121da565b614e208163ffffffff1611156116db5760405162461bcd60e51b815260206004820152601f60248201527f4c55434b593a204d6178696d756d2073656c6c20746178206f66203230252e0060448201526064016109bd565b600c805463ffffffff909216600160c01b0263ffffffff60c01b19909216919091179055565b6117096121da565b600d54600160e81b900460ff16156117635760405162461bcd60e51b815260206004820152601760248201527f74726164696e6720697320616c7265616479206f70656e00000000000000000060448201526064016109bd565b600e80546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d9081179091556117a1308269d3c21bcecceda1000000612082565b806001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118039190613c6e565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611850573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118749190613c6e565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af11580156118d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118fd9190613c6e565b600c80546001600160a01b039283166001600160a01b031991821681178355600090815260036020526040808220805461ff0019908116610100908117909255945460078054600181810183557fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68891820180548916948b169490941790935589891680875294862080549098169093179096558554908101865594909252920180549091169091179055600e541663f305d71947306119bb816111ed565b6000806119d06000546001600160a01b031690565b60405160e088901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015611a50573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611a759190613cce565b5050600d8054600a8054600160e01b60ff60e01b199091161790557eff00ff0000000000000000ffffffffffffffffffffffffffffffffffffffff167f0100010000000001000000280000000000000000000000000000000000000000179055506009805463ffffffff60a01b1916600160a01b63ffffffff431602179055600c54600e5460405163095ea7b360e01b81526001600160a01b039182166004820152600019602482015291169063095ea7b3906044016020604051808303816000875af1158015611b4a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116779190613c3a565b611b766121da565b6009805463ffffffff909216600160e01b026001600160e01b03909216919091179055565b611ba36121da565b6001600160a01b038116600090815260036020526040902054610100900460ff16611c105760405162461bcd60e51b815260206004820152601860248201527f4c75636b79546f61643a204e6f74206578636c756465642e000000000000000060448201526064016109bd565b60005b60075481101561167757816001600160a01b031660078281548110611c3a57611c3a613bf3565b6000918252602090912001546001600160a01b03161415611d175760078054611c6590600190613c57565b81548110611c7557611c75613bf3565b600091825260209091200154600780546001600160a01b039092169183908110611ca157611ca1613bf3565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600390915260409020805461ff00191690556007805480611cf157611cf1613cfc565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b80611d2181613c1f565b915050611c13565b611d316121da565b614e208163ffffffff161115611d895760405162461bcd60e51b815260206004820152601e60248201527f4c55434b593a204d6178696d756d2062757920746178206f66203230252e000060448201526064016109bd565b600c805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b600a546001600160a01b0316336001600160a01b031614611e1e5760405162461bcd60e51b815260206004820152602360248201527f4c55434b593a204f6e6c7920646576656c6f7065722063616e2073657420746860448201526234b99760e91b60648201526084016109bd565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b611e486121da565b600a8054911515600160e81b027fffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b611e896121da565b600d8054911515600160f81b027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b611ec96121da565b6001600160a01b038116600090815260036020526040902054610100900460ff1615611f375760405162461bcd60e51b815260206004820152601c60248201527f4c75636b79546f61643a20416c7265616479206578636c756465642e0000000060448201526064016109bd565b6001600160a01b03166000818152600360205260408120805461ff0019166101001790556007805460018101825591527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180546001600160a01b0319169091179055565b611fa46121da565b6001600160a01b03166000908152600360205260409020805460ff19169055565b611fcd6121da565b6001600160a01b0381166120495760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016109bd565b610ed881612e45565b61205a6121da565b6001600160a01b03166000908152600360205260409020805462ff0000191662010000179055565b6001600160a01b0383166120fd5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016109bd565b6001600160a01b0382166121795760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016109bd565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000546001600160a01b031633146112105760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109bd565b6001600160a01b0383166122b05760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016109bd565b6001600160a01b03821661232c5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016109bd565b600081116123a25760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d75737420626520677265617465722060448201527f7468616e207a65726f000000000000000000000000000000000000000000000060648201526084016109bd565b600d805460ff60e01b191690556000806123c46000546001600160a01b031690565b6001600160a01b0316856001600160a01b0316141580156123f357506000546001600160a01b03858116911614155b801561240857506001600160a01b0385163014155b801561242d57506001600160a01b03841660009081526003602052604090205460ff16155b801561245257506001600160a01b03851660009081526003602052604090205460ff16155b15612890576001600160a01b03841660009081526003602052604090205462010000900460ff161580156124a557506001600160a01b03851660009081526003602052604090205462010000900460ff16155b6124f15760405162461bcd60e51b815260206004820152600860248201527f4e6f20626f74732e00000000000000000000000000000000000000000000000060448201526064016109bd565b600c546001600160a01b03868116911614801561251c5750600e546001600160a01b03858116911614155b15612655575050600c54600b54600a54600160a01b90920463ffffffff90811692600160c01b9092041690600160e01b900460ff1615612604576001600160a01b03841660009081526003602052604090205463ffffffff640100000000909104164314156125cd5760405162461bcd60e51b815260206004820152601860248201527f4c55434b593a204f6e652074782070657220626c6f636b2e000000000000000060448201526064016109bd565b6001600160a01b0384166000908152600360205260409020805467ffffffff0000000019166401000000004363ffffffff16021790555b600954439061262290600290600160a01b900463ffffffff16613d12565b63ffffffff16111561264657600d805460ff60e01b1916600160e01b179055612897565b6126508484613131565b612897565b600c546001600160a01b0385811691161480156126805750600e546001600160a01b03868116911614155b1561287757600d546126a990600160a01b900463ffffffff1669d3c21bcecceda1000000613cba565b8311156127045760405162461bcd60e51b815260206004820152602360248201527f4c55434b593a204f766572206d6178207472616e73616374696f6e20616d6f75604482015262373a1760e91b60648201526084016109bd565b600a54600160e01b900460ff16156127a0576001600160a01b03851660009081526003602052604090205463ffffffff6401000000009091041643141561278d5760405162461bcd60e51b815260206004820152601860248201527f4c55434b593a204f6e652074782070657220626c6f636b2e000000000000000060448201526064016109bd565b6001600160a01b03851660005260036020525b306000908152600160205260408120546009549091906127d790600160c01b900463ffffffff1669d3c21bcecceda1000000613cba565b600d54908310159150600160f81b900460ff1680156127f35750805b80156128095750600d54600160f01b900460ff16155b8015612818575061281861324c565b1561284f57600954849061284c9061284790600160c01b900463ffffffff1669d3c21bcecceda1000000613cba565b612fae565b93505b5050600c54600b5463ffffffff600160c01b90920482169350600160e01b9004169050612897565b5050600c54600160e01b900463ffffffff166000612897565b5060009050805b610c9b85858585856128d0565b600081848411156128c85760405162461bcd60e51b81526004016109bd9190613973565b505050900390565b6000806000600d601c9054906101000a900460ff161561296d57600192506128f88387613c57565b6001600160a01b038816600090815260036020908152604080832080546bffffffff00000000000000001916680100000000000000004363ffffffff1602179055600190915290205490925061294f908490613d3a565b6001600160a01b038816600090815260046020526040902055612995565b612978868686613267565b9092509050806129888388613c57565b6129929190613c57565b92505b61299f88876132b2565b8015612acf57306000908152600160205260409020546129c0908290613d3a565b30600081815260016020526040908190209290925590516001600160a01b038a16907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612a119085815260200190565b60405180910390a36000612a24826132f6565b90506000612a328a86613484565b90506000816001600160a01b031661c35084604051600060405180830381858888f193505050503d8060008114612a85576040519150601f19603f3d011682016040523d82523d6000602084013e612a8a565b606091505b505090508015612acb5760405183906001600160a01b038416907ff4602bf74bc0808c000ea3c3531aa0628829c00ef77831486ca770d12832d99c90600090a35b5050505b612ad98784613676565b8115612b545730600090815260016020526040902054612afa908790613d3a565b30600081815260016020526040908190209290925590516001600160a01b038a16907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612b4b908a815260200190565b60405180910390a35b866001600160a01b0316886001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051612b9991815260200190565b60405180910390a35050505050505050565b604080516002808252606082018352839260009291906020830190803683370190505090508281600081518110612be457612be4613bf3565b6001600160a01b03928316602091820292909201810191909152600e54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612c3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c619190613c6e565b81600181518110612c7457612c74613bf3565b6001600160a01b0392831660209182029290920101526040516370a0823160e01b81523060048201526000918416906370a0823190602401602060405180830381865afa158015612cc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ced9190613c8b565b600e5460405163095ea7b360e01b81526001600160a01b0391821660048201526024810183905291925084169063095ea7b3906044016020604051808303816000875af1158015612d42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d669190613c3a565b50600e5460405163791ac94760e01b81526001600160a01b039091169063791ac94790612da0908490600090879030904290600401613d52565b600060405180830381600087803b158015612dba57600080fd5b505af1158015612dce573d6000803e3d6000fd5b5050505050505050565b6001600160a01b03811660009081526003602052604081205463ffffffff6801000000000000000090910416431415612e2757506001600160a01b031660009081526004602052604090205490565b6001600160a01b0382166000908152600160205260409020546111f8565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80471015612ee55760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016109bd565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612f32576040519150601f19603f3d011682016040523d82523d6000602084013e612f37565b606091505b50509050806112b65760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016109bd565b600d805460ff60f01b1916600160f01b1790556040805160028082526060820183526000926020830190803683370190505090503081600081518110612ff657612ff6613bf3565b6001600160a01b03928316602091820292909201810191909152600e54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa15801561304f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130739190613c6e565b8160018151811061308657613086613bf3565b6001600160a01b039283166020918202929092010152600e546130ac9130911684612082565b600e5460405163791ac94760e01b81526001600160a01b039091169063791ac947906130e5908590600090869030904290600401613d52565b600060405180830381600087803b1580156130ff57600080fd5b505af1158015613113573d6000803e3d6000fd5b5050505061312047613802565b5050600d805460ff60f01b19169055565b600d5461315590600160a01b900463ffffffff1669d3c21bcecceda1000000613cba565b8111156131b05760405162461bcd60e51b815260206004820152602360248201527f4c55434b593a204f766572206d6178207472616e73616374696f6e20616d6f75604482015262373a1760e91b60648201526084016109bd565b600d546131d490600160c01b900463ffffffff1669d3c21bcecceda1000000613cba565b816131f4846001600160a01b031660009081526001602052604090205490565b6131fe9190613d3a565b11156116775760405162461bcd60e51b815260206004820152601e60248201527f4c55434b593a204f766572206d61782077616c6c657420616d6f756e742e000060448201526064016109bd565b600954600090600160e01b900463ffffffff165a1015905090565b600080620186a061327e63ffffffff861687613d8e565b6132889190613cba565b9150620186a061329e63ffffffff851687613d8e565b6132a89190613cba565b9050935093915050565b6001600160a01b0382166000908152600160205260409020546132d6908290613c57565b6001600160a01b0390921660009081526001602052604090209190915550565b600d805460ff60f01b1916600160f01b17905560408051600280825260608201835260009283929190602083019080368337019050509050308160008151811061334257613342613bf3565b6001600160a01b03928316602091820292909201810191909152600e54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa15801561339b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133bf9190613c6e565b816001815181106133d2576133d2613bf3565b6001600160a01b039283166020918202929092010152600e546133f89130911685612082565b600e5460405163791ac94760e01b815247916001600160a01b03169063791ac94790613431908790600090879030904290600401613d52565b600060405180830381600087803b15801561344b57600080fd5b505af115801561345f573d6000803e3d6000fd5b50505050804761346f9190613c57565b600d805460ff60f01b19169055949350505050565b60008061348f6138dd565b6001600160a01b0385166000908152600160205260408120549192509084906134c29069d3c21bcecceda1000000613c57565b6134cc9190613c57565b905060005b6007548110156135355760016000600783815481106134f2576134f2613bf3565b60009182526020808320909101546001600160a01b031683528201929092526040019020546135219083613c57565b91508061352d81613c1f565b9150506134d1565b5060006135428284613dad565b90506000805b60085481101561366b57876001600160a01b03166008828154811061356f5761356f613bf3565b6000918252602090912001546001600160a01b031614806135d1575060036000600883815481106135a2576135a2613bf3565b60009182526020808320909101546001600160a01b0316835282019290925260400190205460ff610100909104165b156135db57613659565b613616600882815481106135f1576135f1613bf3565b60009182526020808320909101546001600160a01b0316825260019052604090205490565b6136209083613d3a565b915082821115613659576008818154811061363d5761363d613bf3565b6000918252602090912001546001600160a01b0316955061366b565b8061366381613c1f565b915050613548565b505050505092915050565b6001600160a01b0382166000908152600360205260409020546301000000900460ff166137de5760085460011015613768576008546000906136ba90600190613c57565b6136c26138dd565b6136cc9190613dad565b905060088082815481106136e2576136e2613bf3565b60009182526020808320909101548354600181018555938352912090910180546001600160a01b0319166001600160a01b03909216919091179055600880548491908390811061373457613734613bf3565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550506137b4565b600880546001810182556000919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319166001600160a01b0384161790555b6001600160a01b0382166000908152600360205260409020805463ff000000191663010000001790555b6001600160a01b0382166000908152600160205260409020546132d6908290613d3a565b600b54600a5460009163ffffffff600160a01b91829004811692613833928104821691600160c01b90910416613d12565b61383d9190613d12565b600954600a54919250613881916001600160a01b039091169063ffffffff8085169161387291600160c01b9091041686613d8e565b61387c9190613cba565b612e95565b600a546138af906001600160a01b0381169063ffffffff8085169161387291600160a01b9091041686613d8e565b600b54611677906001600160a01b0381169063ffffffff8085169161387291600160a01b9091041686613d8e565b60006138ea600143613c57565b6040805191406020830152016040516020818303038152906040528051906020012060001c905090565b5080546000825590600052602060002090810190610ed891905b80821115613942576000815560010161392e565b5090565b60006020828403121561395857600080fd5b813563ffffffff8116811461396c57600080fd5b9392505050565b600060208083528351808285015260005b818110156139a057858101830151858201604001528201613984565b818111156139b2576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b0381168114610ed857600080fd5b600080604083850312156139f057600080fd5b82356139fb816139c8565b946020939093013593505050565b600060208284031215613a1b57600080fd5b813561396c816139c8565b60008083601f840112613a3857600080fd5b50813567ffffffffffffffff811115613a5057600080fd5b6020830191508360208260051b8501011115613a6b57600080fd5b9250929050565b60008060008060408587031215613a8857600080fd5b843567ffffffffffffffff80821115613aa057600080fd5b613aac88838901613a26565b90965094506020870135915080821115613ac557600080fd5b50613ad287828801613a26565b95989497509550505050565b600080600060608486031215613af357600080fd5b8335613afe816139c8565b92506020840135613b0e816139c8565b929592945050506040919091013590565b600081518084526020808501945080840160005b83811015613b585781516001600160a01b031687529582019590820190600101613b33565b509495945050505050565b60208152600061396c6020830184613b1f565b8015158114610ed857600080fd5b600060208284031215613b9657600080fd5b813561396c81613b76565b600060208284031215613bb357600080fd5b5035919050565b60008060408385031215613bcd57600080fd5b8235613bd8816139c8565b91506020830135613be8816139c8565b809150509250929050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415613c3357613c33613c09565b5060010190565b600060208284031215613c4c57600080fd5b815161396c81613b76565b600082821015613c6957613c69613c09565b500390565b600060208284031215613c8057600080fd5b815161396c816139c8565b600060208284031215613c9d57600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b600082613cc957613cc9613ca4565b500490565b600080600060608486031215613ce357600080fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b600052603160045260246000fd5b600063ffffffff808316818516808303821115613d3157613d31613c09565b01949350505050565b60008219821115613d4d57613d4d613c09565b500190565b85815284602082015260a060408201526000613d7160a0830186613b1f565b6001600160a01b0394909416606083015250608001529392505050565b6000816000190483118215151615613da857613da8613c09565b500290565b600082613dbc57613dbc613ca4565b50069056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a264697066735822122016964205421f29e03134097768e766c54dafcb2668c7b1cf77d6a7d6cc59b7b764736f6c634300080b0033

Deployed Bytecode

0x6080604052600436106103015760003560e01c80636faae4a71161018f578063c9567bf9116100e1578063e69abf8b1161008a578063ea2f0b3711610064578063ea2f0b37146108f2578063f2fde38b14610912578063ffecf5161461093257600080fd5b8063e69abf8b14610892578063e98391ff146108b2578063ea2621e5146108d257600080fd5b8063db932ae2116100bb578063db932ae21461080c578063dd62ed3e1461082c578063e0195f071461087257600080fd5b8063c9567bf9146107b7578063d42953b5146107cc578063da093241146107ec57600080fd5b80638da5cb5b11610143578063a9059cbb1161011d578063a9059cbb14610757578063b70143c914610777578063bb1789d61461079757600080fd5b80638da5cb5b146106c957806395d89b41146106f1578063a39762571461073757600080fd5b8063715018a611610174578063715018a61461067f5780637a52da0e1461069457806388a65f46146106b457600080fd5b80636faae4a71461063f57806370a082311461065f57600080fd5b806333a1728211610253578063473071ce116101fc578063571cbe0a116101d6578063571cbe0a146105ea5780635932ead11461060a5780635b04bd561461062a57600080fd5b8063473071ce1461056f5780634b39d9631461058f5780635342acb4146105b157600080fd5b80633e20a8281161022d5780633e20a8281461050f578063437823ec1461052f578063470054d41461054f57600080fd5b806333a17282146104ba57806338573ef8146104da5780633b1fd638146104ef57600080fd5b806318160ddd116102b557806323b872dd1161028f57806323b872dd1461045e578063273123b71461047e578063313ce5671461049e57600080fd5b806318160ddd146103f757806319db2dcb1461041e5780631c8179a51461043e57600080fd5b8063095ea7b3116102e6578063095ea7b31461038757806313da0a14146103b757806314b3b077146103d757600080fd5b80630400bb7a1461030d57806306fdde031461032f57600080fd5b3661030857005b600080fd5b34801561031957600080fd5b5061032d610328366004613946565b610952565b005b34801561033b57600080fd5b5060408051808201909152600981527f4c75636b79546f6164000000000000000000000000000000000000000000000060208201525b60405161037e9190613973565b60405180910390f35b34801561039357600080fd5b506103a76103a23660046139dd565b6109ec565b604051901515815260200161037e565b3480156103c357600080fd5b5061032d6103d2366004613946565b610a02565b3480156103e357600080fd5b5061032d6103f2366004613a09565b610aad565b34801561040357600080fd5b5069d3c21bcecceda10000005b60405190815260200161037e565b34801561042a57600080fd5b5061032d610439366004613a09565b610ad7565b34801561044a57600080fd5b5061032d610459366004613a72565b610b6e565b34801561046a57600080fd5b506103a7610479366004613ade565b610ca2565b34801561048a57600080fd5b5061032d610499366004613a09565b610d0b565b3480156104aa57600080fd5b506040516009815260200161037e565b3480156104c657600080fd5b506103a76104d5366004613ade565b610d36565b3480156104e657600080fd5b5061032d610e2e565b3480156104fb57600080fd5b5061032d61050a366004613946565b610edb565b34801561051b57600080fd5b5061032d61052a366004613946565b610f08565b34801561053b57600080fd5b5061032d61054a366004613a09565b610f36565b34801561055b57600080fd5b5061032d61056a366004613946565b610f62565b34801561057b57600080fd5b5061032d61058a366004613a09565b610f90565b34801561059b57600080fd5b506105a461100e565b60405161037e9190613b63565b3480156105bd57600080fd5b506103a76105cc366004613a09565b6001600160a01b031660009081526003602052604090205460ff1690565b3480156105f657600080fd5b506103a7610605366004613ade565b611070565b34801561061657600080fd5b5061032d610625366004613b84565b611139565b34801561063657600080fd5b506105a461115f565b34801561064b57600080fd5b5061032d61065a366004613946565b6111bf565b34801561066b57600080fd5b5061041061067a366004613a09565b6111ed565b34801561068b57600080fd5b5061032d6111fe565b3480156106a057600080fd5b5061032d6106af366004613a09565b611212565b3480156106c057600080fd5b5061032d6112bb565b3480156106d557600080fd5b506000546040516001600160a01b03909116815260200161037e565b3480156106fd57600080fd5b5060408051808201909152600481527f544f4144000000000000000000000000000000000000000000000000000000006020820152610371565b34801561074357600080fd5b5061032d610752366004613946565b611502565b34801561076357600080fd5b506103a76107723660046139dd565b611597565b34801561078357600080fd5b5061032d610792366004613ba1565b6115a4565b3480156107a357600080fd5b5061032d6107b2366004613946565b61167b565b3480156107c357600080fd5b5061032d611701565b3480156107d857600080fd5b5061032d6107e7366004613946565b611b6e565b3480156107f857600080fd5b5061032d610807366004613a09565b611b9b565b34801561081857600080fd5b5061032d610827366004613946565b611d29565b34801561083857600080fd5b50610410610847366004613bba565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b34801561087e57600080fd5b5061032d61088d366004613a09565b611daf565b34801561089e57600080fd5b5061032d6108ad366004613b84565b611e40565b3480156108be57600080fd5b5061032d6108cd366004613b84565b611e81565b3480156108de57600080fd5b5061032d6108ed366004613a09565b611ec1565b3480156108fe57600080fd5b5061032d61090d366004613a09565b611f9c565b34801561091e57600080fd5b5061032d61092d366004613a09565b611fc5565b34801561093e57600080fd5b5061032d61094d366004613a09565b612052565b600a546001600160a01b0316336001600160a01b0316146109c65760405162461bcd60e51b815260206004820152602360248201527f4c55434b593a204f6e6c7920646576656c6f7065722063616e2073657420746860448201526234b99760e91b60648201526084015b60405180910390fd5b600a805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b60006109f9338484612082565b50600192915050565b610a0a6121da565b614e208163ffffffff161115610a885760405162461bcd60e51b815260206004820152602360248201527f4c55434b593a204d6178696d756d207472616e7366657220746178206f66203260448201527f30252e000000000000000000000000000000000000000000000000000000000060648201526084016109bd565b600c805463ffffffff909216600160e01b026001600160e01b03909216919091179055565b610ab56121da565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b600d546001600160a01b03163314610b4c5760405162461bcd60e51b815260206004820152603260248201527f546f6b656e436c61776261636b3a2063616c6c6572206973206e6f74207468656044820152711022a92199181031b7b73a3937b63632b91760711b60648201526084016109bd565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b610b766121da565b828114610bc55760405162461bcd60e51b815260206004820152601460248201527f4c656e6774687320646f6e2774206d617463682e00000000000000000000000060448201526064016109bd565b60005b83811015610c9b57828282818110610be257610be2613bf3565b9050602002013560056000878785818110610bff57610bff613bf3565b9050602002016020810190610c149190613a09565b6001600160a01b031681526020810191909152604001600020556006858583818110610c4257610c42613bf3565b9050602002016020810190610c579190613a09565b81546001810183556000928352602090922090910180546001600160a01b0319166001600160a01b0390921691909117905580610c9381613c1f565b915050610bc8565b5050505050565b6000610caf848484612234565b610d018433610cfc85604051806060016040528060288152602001613dc2602891396001600160a01b038a16600090815260026020908152604080832033845290915290205491906128a4565b612082565b5060019392505050565b610d136121da565b6001600160a01b03166000908152600360205260409020805462ff000019169055565b600d546000906001600160a01b03163314610dae5760405162461bcd60e51b815260206004820152603260248201527f546f6b656e436c61776261636b3a2063616c6c6572206973206e6f74207468656044820152711022a92199181031b7b73a3937b63632b91760711b60648201526084016109bd565b60405163095ea7b360e01b81526001600160a01b0384811660048301526024820184905285919082169063095ea7b3906044015b6020604051808303816000875af1158015610e01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e259190613c3a565b95945050505050565b610e366121da565b6006548015610ed857600d805460ff60e01b1916905560005b81811015610ecb57600060068281548110610e6c57610e6c613bf3565b60009182526020808320909101546001600160a01b031680835260059091526040822054909250610ea19133918491806128d0565b6001600160a01b031660009081526005602052604081205580610ec381613c1f565b915050610e4f565b50610ed860066000613914565b50565b610ee36121da565b600b805463ffffffff909216600160e01b026001600160e01b03909216919091179055565b610f106121da565b6009805463ffffffff909216600160c01b0263ffffffff60c01b19909216919091179055565b610f3e6121da565b6001600160a01b03166000908152600360205260409020805460ff19166001179055565b610f6a6121da565b600d805463ffffffff909216600160c01b0263ffffffff60c01b19909216919091179055565b600d546001600160a01b031633146110055760405162461bcd60e51b815260206004820152603260248201527f546f6b656e436c61776261636b3a2063616c6c6572206973206e6f74207468656044820152711022a92199181031b7b73a3937b63632b91760711b60648201526084016109bd565b610ed881612bab565b6060600880548060200260200160405190810160405280929190818152602001828054801561106657602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611048575b5050505050905090565b600d546000906001600160a01b031633146110e85760405162461bcd60e51b815260206004820152603260248201527f546f6b656e436c61776261636b3a2063616c6c6572206973206e6f74207468656044820152711022a92199181031b7b73a3937b63632b91760711b60648201526084016109bd565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301526024820184905285919082169063a9059cbb90604401610de2565b6111416121da565b600a8054911515600160e01b0260ff60e01b19909216919091179055565b60606007805480602002602001604051908101604052809291908181526020018280548015611066576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311611048575050505050905090565b6111c76121da565b600d805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b60006111f882612dd8565b92915050565b6112066121da565b6112106000612e45565b565b600d546001600160a01b031633146112875760405162461bcd60e51b815260206004820152603260248201527f546f6b656e436c61776261636b3a2063616c6c6572206973206e6f74207468656044820152711022a92199181031b7b73a3937b63632b91760711b60648201526084016109bd565b4761129182612bab565b600061129d8247613c57565b600d549091506112b6906001600160a01b031682612e95565b505050565b600d546001600160a01b031633146113305760405162461bcd60e51b815260206004820152603260248201527f546f6b656e436c61776261636b3a2063616c6c6572206973206e6f74207468656044820152711022a92199181031b7b73a3937b63632b91760711b60648201526084016109bd565b600e54604080516315ab88c960e31b815290516000926001600160a01b03169163ad5c46489160048083019260209291908290030181865afa15801561137a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061139e9190613c6e565b90506000600e60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114199190613c6e565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038316906370a0823190602401602060405180830381865afa158015611463573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114879190613c8b565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018290529091506001600160a01b03841690632e1a7d4d90602401600060405180830381600087803b1580156114e557600080fd5b505af11580156114f9573d6000803e3d6000fd5b50505050505050565b600a546001600160a01b0316336001600160a01b0316146115715760405162461bcd60e51b815260206004820152602360248201527f4c55434b593a204f6e6c7920646576656c6f7065722063616e2073657420746860448201526234b99760e91b60648201526084016109bd565b600a805463ffffffff909216600160c01b0263ffffffff60c01b19909216919091179055565b60006109f9338484612234565b6009546001600160a01b0316336001600160a01b031614806115d95750600a546001600160a01b0316336001600160a01b0316145b806115f75750600b546001600160a01b0316336001600160a01b0316145b8061160c57506000546001600160a01b031633145b61161557600080fd5b600061162b8269d3c21bcecceda1000000613cba565b30600090815260016020526040902054111561165c576116558269d3c21bcecceda1000000613cba565b905061166e565b50306000908152600160205260409020545b61167781612fae565b5050565b6116836121da565b614e208163ffffffff1611156116db5760405162461bcd60e51b815260206004820152601f60248201527f4c55434b593a204d6178696d756d2073656c6c20746178206f66203230252e0060448201526064016109bd565b600c805463ffffffff909216600160c01b0263ffffffff60c01b19909216919091179055565b6117096121da565b600d54600160e81b900460ff16156117635760405162461bcd60e51b815260206004820152601760248201527f74726164696e6720697320616c7265616479206f70656e00000000000000000060448201526064016109bd565b600e80546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d9081179091556117a1308269d3c21bcecceda1000000612082565b806001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118039190613c6e565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611850573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118749190613c6e565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af11580156118d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118fd9190613c6e565b600c80546001600160a01b039283166001600160a01b031991821681178355600090815260036020526040808220805461ff0019908116610100908117909255945460078054600181810183557fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68891820180548916948b169490941790935589891680875294862080549098169093179096558554908101865594909252920180549091169091179055600e541663f305d71947306119bb816111ed565b6000806119d06000546001600160a01b031690565b60405160e088901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015611a50573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611a759190613cce565b5050600d8054600a8054600160e01b60ff60e01b199091161790557eff00ff0000000000000000ffffffffffffffffffffffffffffffffffffffff167f0100010000000001000000280000000000000000000000000000000000000000179055506009805463ffffffff60a01b1916600160a01b63ffffffff431602179055600c54600e5460405163095ea7b360e01b81526001600160a01b039182166004820152600019602482015291169063095ea7b3906044016020604051808303816000875af1158015611b4a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116779190613c3a565b611b766121da565b6009805463ffffffff909216600160e01b026001600160e01b03909216919091179055565b611ba36121da565b6001600160a01b038116600090815260036020526040902054610100900460ff16611c105760405162461bcd60e51b815260206004820152601860248201527f4c75636b79546f61643a204e6f74206578636c756465642e000000000000000060448201526064016109bd565b60005b60075481101561167757816001600160a01b031660078281548110611c3a57611c3a613bf3565b6000918252602090912001546001600160a01b03161415611d175760078054611c6590600190613c57565b81548110611c7557611c75613bf3565b600091825260209091200154600780546001600160a01b039092169183908110611ca157611ca1613bf3565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600390915260409020805461ff00191690556007805480611cf157611cf1613cfc565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b80611d2181613c1f565b915050611c13565b611d316121da565b614e208163ffffffff161115611d895760405162461bcd60e51b815260206004820152601e60248201527f4c55434b593a204d6178696d756d2062757920746178206f66203230252e000060448201526064016109bd565b600c805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b600a546001600160a01b0316336001600160a01b031614611e1e5760405162461bcd60e51b815260206004820152602360248201527f4c55434b593a204f6e6c7920646576656c6f7065722063616e2073657420746860448201526234b99760e91b60648201526084016109bd565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b611e486121da565b600a8054911515600160e81b027fffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b611e896121da565b600d8054911515600160f81b027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b611ec96121da565b6001600160a01b038116600090815260036020526040902054610100900460ff1615611f375760405162461bcd60e51b815260206004820152601c60248201527f4c75636b79546f61643a20416c7265616479206578636c756465642e0000000060448201526064016109bd565b6001600160a01b03166000818152600360205260408120805461ff0019166101001790556007805460018101825591527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180546001600160a01b0319169091179055565b611fa46121da565b6001600160a01b03166000908152600360205260409020805460ff19169055565b611fcd6121da565b6001600160a01b0381166120495760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016109bd565b610ed881612e45565b61205a6121da565b6001600160a01b03166000908152600360205260409020805462ff0000191662010000179055565b6001600160a01b0383166120fd5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016109bd565b6001600160a01b0382166121795760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016109bd565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000546001600160a01b031633146112105760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109bd565b6001600160a01b0383166122b05760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016109bd565b6001600160a01b03821661232c5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016109bd565b600081116123a25760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d75737420626520677265617465722060448201527f7468616e207a65726f000000000000000000000000000000000000000000000060648201526084016109bd565b600d805460ff60e01b191690556000806123c46000546001600160a01b031690565b6001600160a01b0316856001600160a01b0316141580156123f357506000546001600160a01b03858116911614155b801561240857506001600160a01b0385163014155b801561242d57506001600160a01b03841660009081526003602052604090205460ff16155b801561245257506001600160a01b03851660009081526003602052604090205460ff16155b15612890576001600160a01b03841660009081526003602052604090205462010000900460ff161580156124a557506001600160a01b03851660009081526003602052604090205462010000900460ff16155b6124f15760405162461bcd60e51b815260206004820152600860248201527f4e6f20626f74732e00000000000000000000000000000000000000000000000060448201526064016109bd565b600c546001600160a01b03868116911614801561251c5750600e546001600160a01b03858116911614155b15612655575050600c54600b54600a54600160a01b90920463ffffffff90811692600160c01b9092041690600160e01b900460ff1615612604576001600160a01b03841660009081526003602052604090205463ffffffff640100000000909104164314156125cd5760405162461bcd60e51b815260206004820152601860248201527f4c55434b593a204f6e652074782070657220626c6f636b2e000000000000000060448201526064016109bd565b6001600160a01b0384166000908152600360205260409020805467ffffffff0000000019166401000000004363ffffffff16021790555b600954439061262290600290600160a01b900463ffffffff16613d12565b63ffffffff16111561264657600d805460ff60e01b1916600160e01b179055612897565b6126508484613131565b612897565b600c546001600160a01b0385811691161480156126805750600e546001600160a01b03868116911614155b1561287757600d546126a990600160a01b900463ffffffff1669d3c21bcecceda1000000613cba565b8311156127045760405162461bcd60e51b815260206004820152602360248201527f4c55434b593a204f766572206d6178207472616e73616374696f6e20616d6f75604482015262373a1760e91b60648201526084016109bd565b600a54600160e01b900460ff16156127a0576001600160a01b03851660009081526003602052604090205463ffffffff6401000000009091041643141561278d5760405162461bcd60e51b815260206004820152601860248201527f4c55434b593a204f6e652074782070657220626c6f636b2e000000000000000060448201526064016109bd565b6001600160a01b03851660005260036020525b306000908152600160205260408120546009549091906127d790600160c01b900463ffffffff1669d3c21bcecceda1000000613cba565b600d54908310159150600160f81b900460ff1680156127f35750805b80156128095750600d54600160f01b900460ff16155b8015612818575061281861324c565b1561284f57600954849061284c9061284790600160c01b900463ffffffff1669d3c21bcecceda1000000613cba565b612fae565b93505b5050600c54600b5463ffffffff600160c01b90920482169350600160e01b9004169050612897565b5050600c54600160e01b900463ffffffff166000612897565b5060009050805b610c9b85858585856128d0565b600081848411156128c85760405162461bcd60e51b81526004016109bd9190613973565b505050900390565b6000806000600d601c9054906101000a900460ff161561296d57600192506128f88387613c57565b6001600160a01b038816600090815260036020908152604080832080546bffffffff00000000000000001916680100000000000000004363ffffffff1602179055600190915290205490925061294f908490613d3a565b6001600160a01b038816600090815260046020526040902055612995565b612978868686613267565b9092509050806129888388613c57565b6129929190613c57565b92505b61299f88876132b2565b8015612acf57306000908152600160205260409020546129c0908290613d3a565b30600081815260016020526040908190209290925590516001600160a01b038a16907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612a119085815260200190565b60405180910390a36000612a24826132f6565b90506000612a328a86613484565b90506000816001600160a01b031661c35084604051600060405180830381858888f193505050503d8060008114612a85576040519150601f19603f3d011682016040523d82523d6000602084013e612a8a565b606091505b505090508015612acb5760405183906001600160a01b038416907ff4602bf74bc0808c000ea3c3531aa0628829c00ef77831486ca770d12832d99c90600090a35b5050505b612ad98784613676565b8115612b545730600090815260016020526040902054612afa908790613d3a565b30600081815260016020526040908190209290925590516001600160a01b038a16907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612b4b908a815260200190565b60405180910390a35b866001600160a01b0316886001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051612b9991815260200190565b60405180910390a35050505050505050565b604080516002808252606082018352839260009291906020830190803683370190505090508281600081518110612be457612be4613bf3565b6001600160a01b03928316602091820292909201810191909152600e54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612c3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c619190613c6e565b81600181518110612c7457612c74613bf3565b6001600160a01b0392831660209182029290920101526040516370a0823160e01b81523060048201526000918416906370a0823190602401602060405180830381865afa158015612cc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ced9190613c8b565b600e5460405163095ea7b360e01b81526001600160a01b0391821660048201526024810183905291925084169063095ea7b3906044016020604051808303816000875af1158015612d42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d669190613c3a565b50600e5460405163791ac94760e01b81526001600160a01b039091169063791ac94790612da0908490600090879030904290600401613d52565b600060405180830381600087803b158015612dba57600080fd5b505af1158015612dce573d6000803e3d6000fd5b5050505050505050565b6001600160a01b03811660009081526003602052604081205463ffffffff6801000000000000000090910416431415612e2757506001600160a01b031660009081526004602052604090205490565b6001600160a01b0382166000908152600160205260409020546111f8565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80471015612ee55760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016109bd565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612f32576040519150601f19603f3d011682016040523d82523d6000602084013e612f37565b606091505b50509050806112b65760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016109bd565b600d805460ff60f01b1916600160f01b1790556040805160028082526060820183526000926020830190803683370190505090503081600081518110612ff657612ff6613bf3565b6001600160a01b03928316602091820292909201810191909152600e54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa15801561304f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130739190613c6e565b8160018151811061308657613086613bf3565b6001600160a01b039283166020918202929092010152600e546130ac9130911684612082565b600e5460405163791ac94760e01b81526001600160a01b039091169063791ac947906130e5908590600090869030904290600401613d52565b600060405180830381600087803b1580156130ff57600080fd5b505af1158015613113573d6000803e3d6000fd5b5050505061312047613802565b5050600d805460ff60f01b19169055565b600d5461315590600160a01b900463ffffffff1669d3c21bcecceda1000000613cba565b8111156131b05760405162461bcd60e51b815260206004820152602360248201527f4c55434b593a204f766572206d6178207472616e73616374696f6e20616d6f75604482015262373a1760e91b60648201526084016109bd565b600d546131d490600160c01b900463ffffffff1669d3c21bcecceda1000000613cba565b816131f4846001600160a01b031660009081526001602052604090205490565b6131fe9190613d3a565b11156116775760405162461bcd60e51b815260206004820152601e60248201527f4c55434b593a204f766572206d61782077616c6c657420616d6f756e742e000060448201526064016109bd565b600954600090600160e01b900463ffffffff165a1015905090565b600080620186a061327e63ffffffff861687613d8e565b6132889190613cba565b9150620186a061329e63ffffffff851687613d8e565b6132a89190613cba565b9050935093915050565b6001600160a01b0382166000908152600160205260409020546132d6908290613c57565b6001600160a01b0390921660009081526001602052604090209190915550565b600d805460ff60f01b1916600160f01b17905560408051600280825260608201835260009283929190602083019080368337019050509050308160008151811061334257613342613bf3565b6001600160a01b03928316602091820292909201810191909152600e54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa15801561339b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133bf9190613c6e565b816001815181106133d2576133d2613bf3565b6001600160a01b039283166020918202929092010152600e546133f89130911685612082565b600e5460405163791ac94760e01b815247916001600160a01b03169063791ac94790613431908790600090879030904290600401613d52565b600060405180830381600087803b15801561344b57600080fd5b505af115801561345f573d6000803e3d6000fd5b50505050804761346f9190613c57565b600d805460ff60f01b19169055949350505050565b60008061348f6138dd565b6001600160a01b0385166000908152600160205260408120549192509084906134c29069d3c21bcecceda1000000613c57565b6134cc9190613c57565b905060005b6007548110156135355760016000600783815481106134f2576134f2613bf3565b60009182526020808320909101546001600160a01b031683528201929092526040019020546135219083613c57565b91508061352d81613c1f565b9150506134d1565b5060006135428284613dad565b90506000805b60085481101561366b57876001600160a01b03166008828154811061356f5761356f613bf3565b6000918252602090912001546001600160a01b031614806135d1575060036000600883815481106135a2576135a2613bf3565b60009182526020808320909101546001600160a01b0316835282019290925260400190205460ff610100909104165b156135db57613659565b613616600882815481106135f1576135f1613bf3565b60009182526020808320909101546001600160a01b0316825260019052604090205490565b6136209083613d3a565b915082821115613659576008818154811061363d5761363d613bf3565b6000918252602090912001546001600160a01b0316955061366b565b8061366381613c1f565b915050613548565b505050505092915050565b6001600160a01b0382166000908152600360205260409020546301000000900460ff166137de5760085460011015613768576008546000906136ba90600190613c57565b6136c26138dd565b6136cc9190613dad565b905060088082815481106136e2576136e2613bf3565b60009182526020808320909101548354600181018555938352912090910180546001600160a01b0319166001600160a01b03909216919091179055600880548491908390811061373457613734613bf3565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550506137b4565b600880546001810182556000919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319166001600160a01b0384161790555b6001600160a01b0382166000908152600360205260409020805463ff000000191663010000001790555b6001600160a01b0382166000908152600160205260409020546132d6908290613d3a565b600b54600a5460009163ffffffff600160a01b91829004811692613833928104821691600160c01b90910416613d12565b61383d9190613d12565b600954600a54919250613881916001600160a01b039091169063ffffffff8085169161387291600160c01b9091041686613d8e565b61387c9190613cba565b612e95565b600a546138af906001600160a01b0381169063ffffffff8085169161387291600160a01b9091041686613d8e565b600b54611677906001600160a01b0381169063ffffffff8085169161387291600160a01b9091041686613d8e565b60006138ea600143613c57565b6040805191406020830152016040516020818303038152906040528051906020012060001c905090565b5080546000825590600052602060002090810190610ed891905b80821115613942576000815560010161392e565b5090565b60006020828403121561395857600080fd5b813563ffffffff8116811461396c57600080fd5b9392505050565b600060208083528351808285015260005b818110156139a057858101830151858201604001528201613984565b818111156139b2576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b0381168114610ed857600080fd5b600080604083850312156139f057600080fd5b82356139fb816139c8565b946020939093013593505050565b600060208284031215613a1b57600080fd5b813561396c816139c8565b60008083601f840112613a3857600080fd5b50813567ffffffffffffffff811115613a5057600080fd5b6020830191508360208260051b8501011115613a6b57600080fd5b9250929050565b60008060008060408587031215613a8857600080fd5b843567ffffffffffffffff80821115613aa057600080fd5b613aac88838901613a26565b90965094506020870135915080821115613ac557600080fd5b50613ad287828801613a26565b95989497509550505050565b600080600060608486031215613af357600080fd5b8335613afe816139c8565b92506020840135613b0e816139c8565b929592945050506040919091013590565b600081518084526020808501945080840160005b83811015613b585781516001600160a01b031687529582019590820190600101613b33565b509495945050505050565b60208152600061396c6020830184613b1f565b8015158114610ed857600080fd5b600060208284031215613b9657600080fd5b813561396c81613b76565b600060208284031215613bb357600080fd5b5035919050565b60008060408385031215613bcd57600080fd5b8235613bd8816139c8565b91506020830135613be8816139c8565b809150509250929050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415613c3357613c33613c09565b5060010190565b600060208284031215613c4c57600080fd5b815161396c81613b76565b600082821015613c6957613c69613c09565b500390565b600060208284031215613c8057600080fd5b815161396c816139c8565b600060208284031215613c9d57600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b600082613cc957613cc9613ca4565b500490565b600080600060608486031215613ce357600080fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b600052603160045260246000fd5b600063ffffffff808316818516808303821115613d3157613d31613c09565b01949350505050565b60008219821115613d4d57613d4d613c09565b500190565b85815284602082015260a060408201526000613d7160a0830186613b1f565b6001600160a01b0394909416606083015250608001529392505050565b6000816000190483118215151615613da857613da8613c09565b500290565b600082613dbc57613dbc613ca4565b50069056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a264697066735822122016964205421f29e03134097768e766c54dafcb2668c7b1cf77d6a7d6cc59b7b764736f6c634300080b0033

Deployed Bytecode Sourcemap

29608:30700:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55183:89;;;;;;;;;;-1:-1:-1;55183:89:0;;;;;:::i;:::-;;:::i;:::-;;35025:83;;;;;;;;;;-1:-1:-1;35095:5:0;;;;;;;;;;;;;;;;;35025:83;;;;;;;:::i;:::-;;;;;;;;35931:193;;;;;;;;;;-1:-1:-1;35931:193:0;;;;;:::i;:::-;;:::i;:::-;;;1541:14:1;;1534:22;1516:41;;1504:2;1489:18;35931:193:0;1376:187:1;54897:171:0;;;;;;;;;;-1:-1:-1;54897:171:0;;;;;:::i;:::-;;:::i;43495:116::-;;;;;;;;;;-1:-1:-1;43495:116:0;;;;;:::i;:::-;;:::i;35302:95::-;;;;;;;;;;-1:-1:-1;29991:24:0;35302:95;;;1966:25:1;;;1954:2;1939:18;35302:95:0;1820:177:1;43757:126:0;;;;;;;;;;-1:-1:-1;43757:126:0;;;;;:::i;:::-;;:::i;53799:357::-;;;;;;;;;;-1:-1:-1;53799:357:0;;;;;:::i;:::-;;:::i;36132:446::-;;;;;;;;;;-1:-1:-1;36132:446:0;;;;;:::i;:::-;;:::i;46531:107::-;;;;;;;;;;-1:-1:-1;46531:107:0;;;;;:::i;:::-;;:::i;35211:83::-;;;;;;;;;;-1:-1:-1;35211:83:0;;29933:1;3755:36:1;;3743:2;3728:18;35211:83:0;3613:184:1;58134:273:0;;;;;;;;;;-1:-1:-1;58134:273:0;;;;;:::i;:::-;;:::i;45676:525::-;;;;;;;;;;;;;:::i;55826:104::-;;;;;;;;;;-1:-1:-1;55826:104:0;;;;;:::i;:::-;;:::i;40663:108::-;;;;;;;;;;-1:-1:-1;40663:108:0;;;;;:::i;:::-;;:::i;52077:127::-;;;;;;;;;;-1:-1:-1;52077:127:0;;;;;:::i;:::-;;:::i;42888:109::-;;;;;;;;;;-1:-1:-1;42888:109:0;;;;;:::i;:::-;;:::i;58798:112::-;;;;;;;;;;-1:-1:-1;58798:112:0;;;;;:::i;:::-;;:::i;57820:109::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;51834:140::-;;;;;;;;;;-1:-1:-1;51834:140:0;;;;;:::i;:::-;-1:-1:-1;;;;;51923:24:0;51899:4;51923:24;;;:15;:24;;;;;:43;;;;51834:140;58468:279;;;;;;;;;;-1:-1:-1;58468:279:0;;;;;:::i;:::-;;:::i;36691:101::-;;;;;;;;;;-1:-1:-1;36691:101:0;;;;;:::i;:::-;;:::i;57937:108::-;;;;;;;;;;;;;:::i;42652:101::-;;;;;;;;;;-1:-1:-1;42652:101:0;;;;;:::i;:::-;;:::i;35405:119::-;;;;;;;;;;-1:-1:-1;35405:119:0;;;;;:::i;:::-;;:::i;21667:103::-;;;;;;;;;;;;;:::i;59573:393::-;;;;;;;;;;-1:-1:-1;59573:393:0;;;;;:::i;:::-;;:::i;60038:265::-;;;;;;;;;;;;;:::i;21019:87::-;;;;;;;;;;-1:-1:-1;21065:7:0;21092:6;21019:87;;-1:-1:-1;;;;;21092:6:0;;;5072:74:1;;5060:2;5045:18;21019:87:0;4926:226:1;35116:87:0;;;;;;;;;;-1:-1:-1;35188:7:0;;;;;;;;;;;;;;;;;35116:87;;55397:101;;;;;;;;;;-1:-1:-1;55397:101:0;;;;;:::i;:::-;;:::i;35532:199::-;;;;;;;;;;-1:-1:-1;35532:199:0;;;;;:::i;:::-;;:::i;47267:327::-;;;;;;;;;;-1:-1:-1;47267:327:0;;;;;:::i;:::-;;:::i;54593:159::-;;;;;;;;;;-1:-1:-1;54593:159:0;;;;;:::i;:::-;;:::i;44211:1457::-;;;;;;;;;;;;;:::i;46927:96::-;;;;;;;;;;-1:-1:-1;46927:96:0;;;;;:::i;:::-;;:::i;52920:701::-;;;;;;;;;;-1:-1:-1;52920:701:0;;;;;:::i;:::-;;:::i;54296:156::-;;;;;;;;;;-1:-1:-1;54296:156:0;;;;;:::i;:::-;;:::i;35739:184::-;;;;;;;;;;-1:-1:-1;35739:184:0;;;;;:::i;:::-;-1:-1:-1;;;;;35888:18:0;;;35856:7;35888:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;35739:184;44028:118;;;;;;;;;;-1:-1:-1;44028:118:0;;;;;:::i;:::-;;:::i;55615:108::-;;;;;;;;;;-1:-1:-1;55615:108:0;;;;;:::i;:::-;;:::i;40430:104::-;;;;;;;;;;-1:-1:-1;40430:104:0;;;;;:::i;:::-;;:::i;52535:283::-;;;;;;;;;;-1:-1:-1;52535:283:0;;;;;:::i;:::-;;:::i;52303:126::-;;;;;;;;;;-1:-1:-1;52303:126:0;;;;;:::i;:::-;;:::i;21925:201::-;;;;;;;;;;-1:-1:-1;21925:201:0;;;;;:::i;:::-;;:::i;46312:106::-;;;;;;;;;;-1:-1:-1;46312:106:0;;;;;:::i;:::-;;:::i;55183:89::-;33153:15;;-1:-1:-1;;;;;33153:15:0;9445:10;-1:-1:-1;;;;;33137:31:0;;33129:79;;;;-1:-1:-1;;;33129:79:0;;5937:2:1;33129:79:0;;;5919:21:1;5976:2;5956:18;;;5949:30;6015:34;5995:18;;;5988:62;-1:-1:-1;;;6066:18:1;;;6059:33;6109:19;;33129:79:0;;;;;;;;;55247:8:::1;:17:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;55247:17:0::1;-1:-1:-1::0;;;;55247:17:0;;::::1;::::0;;;::::1;::::0;;55183:89::o;35931:193::-;36033:4;36055:39;9445:10;36078:7;36087:6;36055:8;:39::i;:::-;-1:-1:-1;36112:4:0;35931:193;;;;:::o;54897:171::-;20905:13;:11;:13::i;:::-;54984:5:::1;54974:6;:15;;;;54966:63;;;::::0;-1:-1:-1;;;54966:63:0;;6341:2:1;54966:63:0::1;::::0;::::1;6323:21:1::0;6380:2;6360:18;;;6353:30;6419:34;6399:18;;;6392:62;6490:5;6470:18;;;6463:33;6513:19;;54966:63:0::1;6139:399:1::0;54966:63:0::1;55040:11;:20:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;55040:20:0::1;-1:-1:-1::0;;;;;55040:20:0;;::::1;::::0;;;::::1;::::0;;54897:171::o;43495:116::-;20905:13;:11;:13::i;:::-;43567:15:::1;:36:::0;;-1:-1:-1;;;;;;43567:36:0::1;-1:-1:-1::0;;;;;43567:36:0;;;::::1;::::0;;;::::1;::::0;;43495:116::o;43757:126::-;32968:11;;-1:-1:-1;;;;;32968:11:0;9445:10;32968:27;32946:127;;;;-1:-1:-1;;;32946:127:0;;6745:2:1;32946:127:0;;;6727:21:1;6784:2;6764:18;;;6757:30;6823:34;6803:18;;;6796:62;-1:-1:-1;;;6874:18:1;;;6867:48;6932:19;;32946:127:0;6543:414:1;32946:127:0;43839:15:::1;:36:::0;;-1:-1:-1;;;;;;43839:36:0::1;-1:-1:-1::0;;;;;43839:36:0;;;::::1;::::0;;;::::1;::::0;;43757:126::o;53799:357::-;20905:13;:11;:13::i;:::-;53913:25;;::::1;53905:58;;;::::0;-1:-1:-1;;;53905:58:0;;7164:2:1;53905:58:0::1;::::0;::::1;7146:21:1::0;7203:2;7183:18;;;7176:30;7242:22;7222:18;;;7215:50;7282:18;;53905:58:0::1;6962:344:1::0;53905:58:0::1;53978:6;53974:175;53990:15:::0;;::::1;53974:175;;;54084:3;;54088:1;54084:6;;;;;;;:::i;:::-;;;;;;;54059:13;:22;54073:4;;54078:1;54073:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;54059:22:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;54059:22:0;:31;54105:18:::1;54129:4:::0;;54134:1;54129:7;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;54105:32:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;54105:32:0;;;::::1;::::0;;;;;::::1;::::0;;-1:-1:-1;;;;;;54105:32:0::1;-1:-1:-1::0;;;;;54105:32:0;;::::1;::::0;;;::::1;::::0;;54007:3;::::1;::::0;::::1;:::i;:::-;;;;53974:175;;;;53799:357:::0;;;;:::o;36132:446::-;36264:4;36281:36;36291:6;36299:9;36310:6;36281:9;:36::i;:::-;36328:220;36351:6;9445:10;36399:138;36455:6;36399:138;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36399:19:0;;;;;;:11;:19;;;;;;;;9445:10;36399:33;;;;;;;;;;:37;:138::i;:::-;36328:8;:220::i;:::-;-1:-1:-1;36566:4:0;36132:446;;;;;:::o;46531:107::-;20905:13;:11;:13::i;:::-;-1:-1:-1;;;;;46593:23:0::1;46625:5;46593:23:::0;;;:15:::1;:23;::::0;;;;:37;;-1:-1:-1;;46593:37:0::1;::::0;;46531:107::o;58134:273::-;32968:11;;58286:4;;-1:-1:-1;;;;;32968:11:0;9445:10;32968:27;32946:127;;;;-1:-1:-1;;;32946:127:0;;6745:2:1;32946:127:0;;;6727:21:1;6784:2;6764:18;;;6757:30;6823:34;6803:18;;;6796:62;-1:-1:-1;;;6874:18:1;;;6867:48;6932:19;;32946:127:0;6543:414:1;32946:127:0;58363:36:::1;::::0;-1:-1:-1;;;58363:36:0;;-1:-1:-1;;;;;8021:55:1;;;58363:36:0::1;::::0;::::1;8003:74:1::0;8093:18;;;8086:34;;;58331:13:0;;58363:19;;::::1;::::0;::::1;::::0;7976:18:1;;58363:36:0::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58356:43:::0;58134:273;-1:-1:-1;;;;;58134:273:0:o;45676:525::-;20905:13;:11;:13::i;:::-;45797:18:::1;:25:::0;45836:15;;45833:361:::1;;45868:5;:13:::0;;-1:-1:-1;;;;45868:13:0::1;::::0;;45876:5:::1;45896:247;45916:11;45912:1;:15;45896:247;;;45971:12;45986:18;46005:1;45986:21;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;45986:21:0::1;46059:19:::0;;;:13:::1;:19:::0;;;;;;;45986:21;;-1:-1:-1;46026:59:0::1;::::0;46041:10:::1;::::0;45986:21;;;46026:14:::1;:59::i;:::-;-1:-1:-1::0;;;;;46104:19:0::1;46126:1;46104:19:::0;;;:13:::1;:19;::::0;;;;:23;45929:3;::::1;::::0;::::1;:::i;:::-;;;;45896:247;;;-1:-1:-1::0;46157:25:0::1;46164:18;;46157:25;:::i;:::-;45723:478;45676:525::o:0;55826:104::-;20905:13;:11;:13::i;:::-;55900::::1;:22:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;55900:22:0::1;-1:-1:-1::0;;;;;55900:22:0;;::::1;::::0;;;::::1;::::0;;55826:104::o;40663:108::-;20905:13;:11;:13::i;:::-;40739:14:::1;:24:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;40739:24:0::1;-1:-1:-1::0;;;;40739:24:0;;::::1;::::0;;;::::1;::::0;;40663:108::o;52077:127::-;20905:13;:11;:13::i;:::-;-1:-1:-1;;;;;52146:24:0::1;;::::0;;;:15:::1;:24;::::0;;;;:50;;-1:-1:-1;;52146:50:0::1;52192:4;52146:50;::::0;;52077:127::o;42888:109::-;20905:13;:11;:13::i;:::-;42963:16:::1;:26:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;42963:26:0::1;-1:-1:-1::0;;;;42963:26:0;;::::1;::::0;;;::::1;::::0;;42888:109::o;58798:112::-;32968:11;;-1:-1:-1;;;;;32968:11:0;9445:10;32968:27;32946:127;;;;-1:-1:-1;;;32946:127:0;;6745:2:1;32946:127:0;;;6727:21:1;6784:2;6764:18;;;6757:30;6823:34;6803:18;;;6796:62;-1:-1:-1;;;6874:18:1;;;6867:48;6932:19;;32946:127:0;6543:414:1;32946:127:0;58882:20:::1;58888:13;58882:5;:20::i;57820:109::-:0;57868:16;57904:17;57897:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;57897:24:0;;;;;;;;;;;;;;;;;;;;;;;57820:109;:::o;58468:279::-;32968:11;;58623:4;;-1:-1:-1;;;;;32968:11:0;9445:10;32968:27;32946:127;;;;-1:-1:-1;;;32946:127:0;;6745:2:1;32946:127:0;;;6727:21:1;6784:2;6764:18;;;6757:30;6823:34;6803:18;;;6796:62;-1:-1:-1;;;6874:18:1;;;6867:48;6932:19;;32946:127:0;6543:414:1;32946:127:0;58700:39:::1;::::0;;;;-1:-1:-1;;;;;8021:55:1;;;58700:39:0::1;::::0;::::1;8003:74:1::0;8093:18;;;8086:34;;;58668:13:0;;58700:20;;::::1;::::0;::::1;::::0;7976:18:1;;58700:39:0::1;7829:297:1::0;36691:101:0;20905:13;:11;:13::i;:::-;36761:15:::1;:23:::0;;;::::1;;-1:-1:-1::0;;;36761:23:0::1;-1:-1:-1::0;;;;36761:23:0;;::::1;::::0;;;::::1;::::0;;36691:101::o;57937:108::-;57985:16;58021;58014:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;58014:23:0;;;;;;;;;;;;;;;;;;;;;;57937:108;:::o;42652:101::-;20905:13;:11;:13::i;:::-;42723:12:::1;:22:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;42723:22:0::1;-1:-1:-1::0;;;;42723:22:0;;::::1;::::0;;;::::1;::::0;;42652:101::o;35405:119::-;35471:7;35498:18;35508:7;35498:9;:18::i;:::-;35491:25;35405:119;-1:-1:-1;;35405:119:0:o;21667:103::-;20905:13;:11;:13::i;:::-;21732:30:::1;21759:1;21732:18;:30::i;:::-;21667:103::o:0;59573:393::-;32968:11;;-1:-1:-1;;;;;32968:11:0;9445:10;32968:27;32946:127;;;;-1:-1:-1;;;32946:127:0;;6745:2:1;32946:127:0;;;6727:21:1;6784:2;6764:18;;;6757:30;6823:34;6803:18;;;6796:62;-1:-1:-1;;;6874:18:1;;;6867:48;6932:19;;32946:127:0;6543:414:1;32946:127:0;59704:21:::1;59736:20;59742:13:::0;59736:5:::1;:20::i;:::-;59767:11;59781:30;59805:6:::0;59781:21:::1;:30;:::i;:::-;59940:11;::::0;59767:44;;-1:-1:-1;59914:44:0::1;::::0;-1:-1:-1;;;;;59940:11:0::1;59767:44:::0;59914:17:::1;:44::i;:::-;59676:290;;59573:393:::0;:::o;60038:265::-;32968:11;;-1:-1:-1;;;;;32968:11:0;9445:10;32968:27;32946:127;;;;-1:-1:-1;;;32946:127:0;;6745:2:1;32946:127:0;;;6727:21:1;6784:2;6764:18;;;6757:30;6823:34;6803:18;;;6796:62;-1:-1:-1;;;6874:18:1;;;6867:48;6932:19;;32946:127:0;6543:414:1;32946:127:0;60128:15:::1;::::0;:22:::1;::::0;;-1:-1:-1;;;60128:22:0;;;;60109:10:::1;::::0;-1:-1:-1;;;;;60128:15:0::1;::::0;:20:::1;::::0;:22:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:15;:22:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60109:42;;60162:14;60186:15;;;;;;;;;-1:-1:-1::0;;;;;60186:15:0::1;-1:-1:-1::0;;;;;60186:20:0::1;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60234:32;::::0;-1:-1:-1;;;60234:32:0;;60260:4:::1;60234:32;::::0;::::1;5072:74:1::0;60162:47:0;;-1:-1:-1;60220:11:0::1;::::0;-1:-1:-1;;;;;60234:17:0;::::1;::::0;::::1;::::0;5045:18:1;;60234:32:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60277:18;::::0;;;;::::1;::::0;::::1;1966:25:1::0;;;60220:46:0;;-1:-1:-1;;;;;;60277:13:0;::::1;::::0;::::1;::::0;1939:18:1;;60277::0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;60098:205;;;60038:265::o:0;55397:101::-;33153:15;;-1:-1:-1;;;;;33153:15:0;9445:10;-1:-1:-1;;;;;33137:31:0;;33129:79;;;;-1:-1:-1;;;33129:79:0;;5937:2:1;33129:79:0;;;5919:21:1;5976:2;5956:18;;;5949:30;6015:34;5995:18;;;5988:62;-1:-1:-1;;;6066:18:1;;;6059:33;6109:19;;33129:79:0;5735:399:1;33129:79:0;55467:14:::1;:23:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;55467:23:0::1;-1:-1:-1::0;;;;55467:23:0;;::::1;::::0;;;::::1;::::0;;55397:101::o;35532:199::-;35637:4;35659:42;9445:10;35683:9;35694:6;35659:9;:42::i;47267:327::-;32714:15;;-1:-1:-1;;;;;32714:15:0;9445:10;-1:-1:-1;;;;;32698:31:0;;:79;;;-1:-1:-1;32762:15:0;;-1:-1:-1;;;;;32762:15:0;9445:10;-1:-1:-1;;;;;32746:31:0;;32698:79;:127;;;-1:-1:-1;32810:15:0;;-1:-1:-1;;;;;32810:15:0;9445:10;-1:-1:-1;;;;;32794:31:0;;32698:127;:167;;;-1:-1:-1;21065:7:0;21092:6;-1:-1:-1;;;;;21092:6:0;9445:10;32842:23;32698:167;32676:200;;;;;;47375:12:::1;47431:15;47439:7:::0;29991:24:::1;47431:15;:::i;:::-;47422:4;47905:7:::0;47932:16;;;:11;:16;;;;;;47402:44:::1;47398:165;;;47470:15;47478:7:::0;29991:24:::1;47470:15;:::i;:::-;47463:22;;47398:165;;;-1:-1:-1::0;47545:4:0::1;47905:7:::0;47932:16;;;:11;:16;;;;;;47398:165:::1;47573:13;47581:4;47573:7;:13::i;:::-;47327:267;47267:327:::0;:::o;54593:159::-;20905:13;:11;:13::i;:::-;54676:5:::1;54666:6;:15;;;;54658:59;;;::::0;-1:-1:-1;;;54658:59:0;;9472:2:1;54658:59:0::1;::::0;::::1;9454:21:1::0;9511:2;9491:18;;;9484:30;9550:33;9530:18;;;9523:61;9601:18;;54658:59:0::1;9270:355:1::0;54658:59:0::1;54728:7;:16:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;54728:16:0::1;-1:-1:-1::0;;;;54728:16:0;;::::1;::::0;;;::::1;::::0;;54593:159::o;44211:1457::-;20905:13;:11;:13::i;:::-;44271:11:::1;::::0;-1:-1:-1;;;44271:11:0;::::1;;;44270:12;44262:48;;;::::0;-1:-1:-1;;;44262:48:0;;9832:2:1;44262:48:0::1;::::0;::::1;9814:21:1::0;9871:2;9851:18;;;9844:30;9910:25;9890:18;;;9883:53;9953:18;;44262:48:0::1;9630:347:1::0;44262:48:0::1;44456:15;:34:::0;;-1:-1:-1;;;;;;44456:34:0::1;44392:42;44456:34:::0;;::::1;::::0;;;44501:58:::1;44518:4;44392:42:::0;29991:24:::1;44501:8;:58::i;:::-;44604:16;-1:-1:-1::0;;;;;44604:24:0::1;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;44586:70:0::1;;44665:4;44672:16;-1:-1:-1::0;;;;;44672:21:0::1;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44586:110;::::0;;::::1;::::0;;;;;;-1:-1:-1;;;;;10235:15:1;;;44586:110:0::1;::::0;::::1;10217:34:1::0;10287:15;;10267:18;;;10260:43;10129:18;;44586:110:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44570:13;:126:::0;;-1:-1:-1;;;;;44570:126:0;;::::1;-1:-1:-1::0;;;;;;44570:126:0;;::::1;::::0;::::1;::::0;;:13:::1;44739:39:::0;;;:15:::1;:39;::::0;;;;;:68;;-1:-1:-1;;44739:68:0;;::::1;44570:126;44739:68:::0;;::::1;::::0;;;44848:13;;44818:16:::1;:45:::0;;44570:126;44818:45;;::::1;::::0;;;;;::::1;::::0;;;::::1;44848:13:::0;;::::1;44818:45:::0;;;::::1;::::0;;;44931:42;;::::1;::::0;;;;;;:71;;;;::::1;::::0;;::::1;::::0;;;45013:48;;;;::::1;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;::::0;;45072:15:::1;::::0;::::1;:31;45111:21;45156:4;45176:24;45156:4:::0;45176:9:::1;:24::i;:::-;45215:1;45231::::0;45247:7:::1;21065::::0;21092:6;-1:-1:-1;;;;;21092:6:0;;21019:87;45247:7:::1;45072:223;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;;;10696:15:1;;;45072:223:0::1;::::0;::::1;10678:34:1::0;10728:18;;;10721:34;;;;10771:18;;;10764:34;;;;10814:18;;;10807:34;10878:15;;;10857:19;;;10850:44;45269:15:0::1;10910:19:1::0;;;10903:35;10589:19;;45072:223:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;45306:11:0::1;:18:::0;;45335:15:::1;:22:::0;;-1:-1:-1;;;;;;;45335:22:0;;::::1;;::::0;;45477:18;;;;;;-1:-1:-1;45506:9:0::1;:32:::0;;-1:-1:-1;;;;45506:32:0::1;-1:-1:-1::0;;;45392:17:0::1;45525:12;45506:32;;;::::0;;45556:13:::1;::::0;45601:15:::1;::::0;45549:111:::1;::::0;-1:-1:-1;;;45549:111:0;;-1:-1:-1;;;;;45601:15:0;;::::1;-1:-1:-1::0;45549:111:0;::::1;8003:74:1::0;-1:-1:-1;;8093:18:1;;;8086:34;45556:13:0;::::1;::::0;45549:29:::1;::::0;7976:18:1;;45549:111:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;46927:96::-:0;20905:13;:11;:13::i;:::-;46991:15:::1;:24:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;46991:24:0::1;-1:-1:-1::0;;;;;46991:24:0;;::::1;::::0;;;::::1;::::0;;46927:96::o;52920:701::-;20905:13;:11;:13::i;:::-;-1:-1:-1;;;;;52998:24:0;::::1;;::::0;;;:15:::1;:24;::::0;;;;:46;::::1;::::0;::::1;;;52990:83;;;::::0;-1:-1:-1;;;52990:83:0;;11462:2:1;52990:83:0::1;::::0;::::1;11444:21:1::0;11501:2;11481:18;;;11474:30;11540:26;11520:18;;;11513:54;11584:18;;52990:83:0::1;11260:348:1::0;52990:83:0::1;53089:9;53084:530;53108:16;:23:::0;53104:27;::::1;53084:530;;;53180:7;-1:-1:-1::0;;;;;53157:30:0::1;:16;53174:1;53157:19;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;53157:19:0::1;:30;53153:450;;;53324:16;53341:23:::0;;:27:::1;::::0;53367:1:::1;::::0;53341:27:::1;:::i;:::-;53324:45;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;53302:16:::1;:19:::0;;-1:-1:-1;;;;;53324:45:0;;::::1;::::0;53319:1;;53302:19;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;:67:::0;;-1:-1:-1;;;;;;53302:67:0::1;-1:-1:-1::0;;;;;53302:67:0;;::::1;;::::0;;53421:24;;::::1;::::0;;:15:::1;:24:::0;;;;;;:54;;-1:-1:-1;;53421:54:0::1;::::0;;53541:16:::1;:22:::0;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;53541:22:0;;;;;-1:-1:-1;;;;;;53541:22:0::1;::::0;;;;;47327:267:::1;47267:327:::0;:::o;53153:450::-:1;53133:3:::0;::::1;::::0;::::1;:::i;:::-;;;;53084:530;;54296:156:::0;20905:13;:11;:13::i;:::-;54378:5:::1;54368:6;:15;;;;54360:58;;;::::0;-1:-1:-1;;;54360:58:0;;12004:2:1;54360:58:0::1;::::0;::::1;11986:21:1::0;12043:2;12023:18;;;12016:30;12082:32;12062:18;;;12055:60;12132:18;;54360:58:0::1;11802:354:1::0;54360:58:0::1;54429:6;:15:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;54429:15:0::1;-1:-1:-1::0;;;;54429:15:0;;::::1;::::0;;;::::1;::::0;;54296:156::o;44028:118::-;33153:15;;-1:-1:-1;;;;;33153:15:0;9445:10;-1:-1:-1;;;;;33137:31:0;;33129:79;;;;-1:-1:-1;;;33129:79:0;;5937:2:1;33129:79:0;;;5919:21:1;5976:2;5956:18;;;5949:30;6015:34;5995:18;;;5988:62;-1:-1:-1;;;6066:18:1;;;6059:33;6109:19;;33129:79:0;5735:399:1;33129:79:0;44106:11:::1;:32:::0;;-1:-1:-1;;;;;;44106:32:0::1;-1:-1:-1::0;;;;;44106:32:0;;;::::1;::::0;;;::::1;::::0;;44028:118::o;55615:108::-;20905:13;:11;:13::i;:::-;55684:23:::1;:31:::0;;;::::1;;-1:-1:-1::0;;;55684:31:0::1;::::0;;;::::1;::::0;;;::::1;::::0;;55615:108::o;40430:104::-;20905:13;:11;:13::i;:::-;40505:11:::1;:21:::0;;;::::1;;-1:-1:-1::0;;;40505:21:0::1;::::0;;;::::1;::::0;;;::::1;::::0;;40430:104::o;52535:283::-;20905:13;:11;:13::i;:::-;-1:-1:-1;;;;;52616:24:0;::::1;;::::0;;;:15:::1;:24;::::0;;;;:46;::::1;::::0;::::1;;;52615:47;52607:88;;;::::0;-1:-1:-1;;;52607:88:0;;12363:2:1;52607:88:0::1;::::0;::::1;12345:21:1::0;12402:2;12382:18;;;12375:30;12441;12421:18;;;12414:58;12489:18;;52607:88:0::1;12161:352:1::0;52607:88:0::1;-1:-1:-1::0;;;;;52706:24:0::1;;::::0;;;:15:::1;:24;::::0;;;;:53;;-1:-1:-1;;52706:53:0::1;;;::::0;;52770:16:::1;:30:::0;;52755:4:::1;52770:30:::0;::::1;::::0;;;;;::::1;::::0;;-1:-1:-1;;;;;;52770:30:0::1;::::0;;::::1;::::0;;52535:283::o;52303:126::-;20905:13;:11;:13::i;:::-;-1:-1:-1;;;;;52370:24:0::1;52416:5;52370:24:::0;;;:15:::1;:24;::::0;;;;:51;;-1:-1:-1;;52370:51:0::1;::::0;;52303:126::o;21925:201::-;20905:13;:11;:13::i;:::-;-1:-1:-1;;;;;22014:22:0;::::1;22006:73;;;::::0;-1:-1:-1;;;22006:73:0;;12720:2:1;22006:73:0::1;::::0;::::1;12702:21:1::0;12759:2;12739:18;;;12732:30;12798:34;12778:18;;;12771:62;12869:8;12849:18;;;12842:36;12895:19;;22006:73:0::1;12518:402:1::0;22006:73:0::1;22090:28;22109:8;22090:18;:28::i;46312:106::-:0;20905:13;:11;:13::i;:::-;-1:-1:-1;;;;;46374:23:0::1;;::::0;;;:15:::1;:23;::::0;;;;:36;;-1:-1:-1;;46374:36:0::1;::::0;::::1;::::0;;46312:106::o;36800:369::-;-1:-1:-1;;;;;36927:19:0;;36919:68;;;;-1:-1:-1;;;36919:68:0;;13127:2:1;36919:68:0;;;13109:21:1;13166:2;13146:18;;;13139:30;13205:34;13185:18;;;13178:62;13276:6;13256:18;;;13249:34;13300:19;;36919:68:0;12925:400:1;36919:68:0;-1:-1:-1;;;;;37006:21:0;;36998:68;;;;-1:-1:-1;;;36998:68:0;;13532:2:1;36998:68:0;;;13514:21:1;13571:2;13551:18;;;13544:30;13610:34;13590:18;;;13583:62;13681:4;13661:18;;;13654:32;13703:19;;36998:68:0;13330:398:1;36998:68:0;-1:-1:-1;;;;;37077:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;37129:32;;1966:25:1;;;37129:32:0;;1939:18:1;37129:32:0;;;;;;;36800:369;;;:::o;21184:132::-;21065:7;21092:6;-1:-1:-1;;;;;21092:6:0;9445:10;21248:23;21240:68;;;;-1:-1:-1;;;21240:68:0;;13935:2:1;21240:68:0;;;13917:21:1;;;13954:18;;;13947:30;14013:34;13993:18;;;13986:62;14065:18;;21240:68:0;13733:356:1;37179:3131:0;-1:-1:-1;;;;;37301:18:0;;37293:68;;;;-1:-1:-1;;;37293:68:0;;14296:2:1;37293:68:0;;;14278:21:1;14335:2;14315:18;;;14308:30;14374:34;14354:18;;;14347:62;14445:7;14425:18;;;14418:35;14470:19;;37293:68:0;14094:401:1;37293:68:0;-1:-1:-1;;;;;37380:16:0;;37372:64;;;;-1:-1:-1;;;37372:64:0;;14702:2:1;37372:64:0;;;14684:21:1;14741:2;14721:18;;;14714:30;14780:34;14760:18;;;14753:62;14851:5;14831:18;;;14824:33;14874:19;;37372:64:0;14500:399:1;37372:64:0;37464:1;37455:6;:10;37447:64;;;;-1:-1:-1;;;37447:64:0;;15106:2:1;37447:64:0;;;15088:21:1;15145:2;15125:18;;;15118:30;15184:34;15164:18;;;15157:62;15255:11;15235:18;;;15228:39;15284:19;;37447:64:0;14904:405:1;37447:64:0;37522:5;:13;;-1:-1:-1;;;;37522:13:0;;;37530:5;;37627:7;21065;21092:6;-1:-1:-1;;;;;21092:6:0;;21019:87;37627:7;-1:-1:-1;;;;;37619:15:0;:4;-1:-1:-1;;;;;37619:15:0;;;:45;;;;-1:-1:-1;21065:7:0;21092:6;-1:-1:-1;;;;;37651:13:0;;;21092:6;;37651:13;;37619:45;:83;;;;-1:-1:-1;;;;;;37681:21:0;;37697:4;37681:21;;37619:83;:139;;;;-1:-1:-1;;;;;;37720:19:0;;;;;;:15;:19;;;;;:38;;;37719:39;37619:139;:197;;;;-1:-1:-1;;;;;;37776:21:0;;;;;;:15;:21;;;;;:40;;;37775:41;37619:197;37601:2636;;;-1:-1:-1;;;;;37852:19:0;;;;;;:15;:19;;;;;:25;;;;;;37851:26;:58;;;;-1:-1:-1;;;;;;37882:21:0;;;;;;:15;:21;;;;;:27;;;;;;37881:28;37851:58;37843:79;;;;-1:-1:-1;;;37843:79:0;;15516:2:1;37843:79:0;;;15498:21:1;15555:1;15535:18;;;15528:29;15593:10;15573:18;;;15566:38;15621:18;;37843:79:0;15314:331:1;37843:79:0;37972:13;;-1:-1:-1;;;;;37964:21:0;;;37972:13;;37964:21;:55;;;;-1:-1:-1;38003:15:0;;-1:-1:-1;;;;;37989:30:0;;;38003:15;;37989:30;;37964:55;37960:2108;;;-1:-1:-1;;38086:6:0;;38124:12;;38158:15;;-1:-1:-1;;;38086:6:0;;;;;;;;-1:-1:-1;;;38124:12:0;;;;;-1:-1:-1;;;38158:15:0;;;;38155:315;;;-1:-1:-1;;;;;38295:19:0;;;;;;:15;:19;;;;;:32;;;;;;;38331:12;38295:48;;38287:85;;;;-1:-1:-1;;;38287:85:0;;15852:2:1;38287:85:0;;;15834:21:1;15891:2;15871:18;;;15864:30;15930:26;15910:18;;;15903:54;15974:18;;38287:85:0;15650:348:1;38287:85:0;-1:-1:-1;;;;;38395:19:0;;;;;;:15;:19;;;;;:55;;-1:-1:-1;;38395:55:0;;38437:12;38395:55;;;;;;38155:315;38540:9;;38558:12;;38540:15;;29863:1;;-1:-1:-1;;;38540:9:0;;;;:15;:::i;:::-;:30;;;38537:189;;;38623:5;:12;;-1:-1:-1;;;;38623:12:0;-1:-1:-1;;;38623:12:0;;;37601:2636;;38537:189;38684:22;38695:2;38699:6;38684:10;:22::i;:::-;37601:2636;;37960:2108;38757:13;;-1:-1:-1;;;;;38751:19:0;;;38757:13;;38751:19;:55;;;;-1:-1:-1;38790:15:0;;-1:-1:-1;;;;;38774:32:0;;;38790:15;;38774:32;;38751:55;38747:1321;;;38935:12;;38927:20;;-1:-1:-1;;;38935:12:0;;;;29991:24;38927:20;:::i;:::-;38917:6;:30;;38909:78;;;;-1:-1:-1;;;38909:78:0;;16438:2:1;38909:78:0;;;16420:21:1;16477:2;16457:18;;;16450:30;16516:34;16496:18;;;16489:62;-1:-1:-1;;;16567:18:1;;;16560:33;16610:19;;38909:78:0;16236:399:1;38909:78:0;39094:15;;-1:-1:-1;;;39094:15:0;;;;39091:223;;;-1:-1:-1;;;;;39142:21:0;;;;;;:15;:21;;;;;:34;;;;;;;39180:12;39142:50;;39134:87;;;;-1:-1:-1;;;39134:87:0;;15852:2:1;39134:87:0;;;15834:21:1;15891:2;15871:18;;;15864:30;15930:26;15910:18;;;15903:54;15974:18;;39134:87:0;15650:348:1;39134:87:0;-1:-1:-1;;;;;39244:21:0;;;;:15;:21;;39091:223;39466:4;39415:28;47932:16;;;:11;:16;;;;;;39544:14;;47932:16;;39415:28;39536:22;;-1:-1:-1;;;39544:14:0;;;;29991:24;39536:22;:::i;:::-;39585:11;;39512:46;;;;;-1:-1:-1;;;;39585:11:0;;;;:22;;;;;39600:7;39585:22;:33;;;;-1:-1:-1;39612:6:0;;-1:-1:-1;;;39612:6:0;;;;39611:7;39585:33;:50;;;;;39622:13;:11;:13::i;:::-;39581:231;;;39730:14;;39680:7;;39714:31;;39722:22;;-1:-1:-1;;;39730:14:0;;;;29991:24;39722:22;:::i;:::-;39714:7;:31::i;:::-;39782:6;-1:-1:-1;39581:231:0;-1:-1:-1;;39885:7:0;;39924:13;;39885:7;-1:-1:-1;;;39885:7:0;;;;;;-1:-1:-1;;;;39924:13:0;;;;-1:-1:-1;37601:2636:0;;38747:1321;-1:-1:-1;;40008:11:0;;-1:-1:-1;;;40008:11:0;;;;40051:1;37601:2636;;;-1:-1:-1;40195:1:0;;-1:-1:-1;40195:1:0;37601:2636;40249:53;40264:4;40270:2;40274:6;40282:7;40291:10;40249:14;:53::i;17865:240::-;17985:7;18046:12;18038:6;;;;18030:29;;;;-1:-1:-1;;;18030:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;18081:5:0;;;17865:240::o;48039:2360::-;48220:22;48253:17;48281:20;48343:5;;;;;;;;;;;48339:563;;;48429:1;;-1:-1:-1;48457:21:0;48429:1;48457:6;:21;:::i;:::-;-1:-1:-1;;;;;48530:26:0;;;;;;:15;:26;;;;;;;;:58;;-1:-1:-1;;48530:58:0;;48575:12;48530:58;;;;;;-1:-1:-1;48627:22:0;;;;;;48445:33;;-1:-1:-1;48627:39:0;;48652:14;;48627:39;:::i;:::-;-1:-1:-1;;;;;48603:21:0;;;;;;:10;:21;;;;;:63;48339:563;;;48767:46;48785:6;48793:7;48802:10;48767:17;:46::i;:::-;48739:74;;-1:-1:-1;48739:74:0;-1:-1:-1;48739:74:0;48847:16;48739:74;48847:6;:16;:::i;:::-;:29;;;;:::i;:::-;48830:46;;48339:563;48979:30;48994:6;49002;48979:14;:30::i;:::-;49033:16;;49030:949;;49232:4;49212:26;;;;:11;:26;;;;;;:41;;49241:12;;49212:41;:::i;:::-;49203:4;49183:26;;;;:11;:26;;;;;;;:70;;;;49273:45;;-1:-1:-1;;;;;49273:45:0;;;;;;;49305:12;1966:25:1;;1954:2;1939:18;;1820:177;49273:45:0;;;;;;;;49445:16;49464:24;49475:12;49464:10;:24::i;:::-;49445:43;;49538:14;49555:38;49570:6;49578:14;49555;:38::i;:::-;49538:55;;49784:12;49801:6;-1:-1:-1;;;;;49801:11:0;49818:5;49832:8;49801:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49783:62;;;49863:7;49860:80;;;49896:28;;49915:8;;-1:-1:-1;;;;;49896:28:0;;;;;;;;49860:80;49051:928;;;49030:949;50051:36;50061:9;50072:14;50051:9;:36::i;:::-;50101:13;;50098:168;;50180:4;50160:26;;;;:11;:26;;;;;;:35;;50189:6;;50160:35;:::i;:::-;50151:4;50131:26;;;;:11;:26;;;;;;;:64;;;;50215:39;;-1:-1:-1;;;;;50215:39:0;;;;;;;50247:6;1966:25:1;;1954:2;1939:18;;1820:177;50215:39:0;;;;;;;;50098:168;50355:9;-1:-1:-1;;;;;50338:43:0;50347:6;-1:-1:-1;;;;;50338:43:0;;50366:14;50338:43;;;;1966:25:1;;1954:2;1939:18;;1820:177;50338:43:0;;;;;;;;48209:2190;;;48039:2360;;;;;:::o;59014:551::-;59129:16;;;59143:1;59129:16;;;;;;;;59090:3;;59062:18;;59129:16;59143:1;59129:16;;;;;;;;;;-1:-1:-1;59129:16:0;59105:40;;59166:3;59156:4;59161:1;59156:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;59156:13:0;;;:7;;;;;;;;;;:13;;;;59190:15;;:22;;;-1:-1:-1;;;59190:22:0;;;;:15;;;;;:20;;:22;;;;;59156:7;;59190:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59180:4;59185:1;59180:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;59180:32:0;;;:7;;;;;;;;;:32;59245:36;;-1:-1:-1;;;59245:36:0;;59275:4;59245:36;;;5072:74:1;59223:19:0;;59245:21;;;;;5045:18:1;;59245:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59320:15;;59292:58;;-1:-1:-1;;;59292:58:0;;-1:-1:-1;;;;;59320:15:0;;;59292:58;;;8003:74:1;8093:18;;;8086:34;;;59223:58:0;;-1:-1:-1;59292:19:0;;;;;7976:18:1;;59292:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;59361:15:0;;:196;;-1:-1:-1;;;59361:196:0;;-1:-1:-1;;;;;59361:15:0;;;;:66;;:196;;59442:11;;59361:15;;59484:4;;59511;;59531:15;;59361:196;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59051:514;;;59014:551;:::o;47604:237::-;-1:-1:-1;;;;;47682:20:0;;47658:7;47682:20;;;:15;:20;;;;;:29;;;;;;;47715:12;47682:45;47678:156;;;-1:-1:-1;;;;;;47751:15:0;;;;;:10;:15;;;;;;;47604:237::o;47678:156::-;-1:-1:-1;;;;;47932:16:0;;47905:7;47932:16;;;:11;:16;;;;;;47806;47849:107;22286:191;22360:16;22379:6;;-1:-1:-1;;;;;22396:17:0;;;-1:-1:-1;;;;;;22396:17:0;;;;;;22429:40;;22379:6;;;;;;;22429:40;;22360:16;22429:40;22349:128;22286:191;:::o;2592:317::-;2707:6;2682:21;:31;;2674:73;;;;-1:-1:-1;;;2674:73:0;;17984:2:1;2674:73:0;;;17966:21:1;18023:2;18003:18;;;17996:30;18062:31;18042:18;;;18035:59;18111:18;;2674:73:0;17782:353:1;2674:73:0;2761:12;2779:9;-1:-1:-1;;;;;2779:14:0;2801:6;2779:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2760:52;;;2831:7;2823:78;;;;-1:-1:-1;;;2823:78:0;;18342:2:1;2823:78:0;;;18324:21:1;18381:2;18361:18;;;18354:30;18420:34;18400:18;;;18393:62;18491:28;18471:18;;;18464:56;18537:19;;2823:78:0;18140:422:1;40785:569:0;40842:6;:13;;-1:-1:-1;;;;40842:13:0;-1:-1:-1;;;40842:13:0;;;40890:16;;;40904:1;40890:16;;;;;;;;-1:-1:-1;;40890:16:0;;;;;;;;;;-1:-1:-1;40890:16:0;40866:40;;40935:4;40917;40922:1;40917:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;40917:23:0;;;:7;;;;;;;;;;:23;;;;40961:15;;:22;;;-1:-1:-1;;;40961:22:0;;;;:15;;;;;:20;;:22;;;;;40917:7;;40961:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40951:4;40956:1;40951:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;40951:32:0;;;:7;;;;;;;;;:32;41026:15;;40994:62;;41011:4;;41026:15;41044:11;40994:8;:62::i;:::-;41069:15;;:196;;-1:-1:-1;;;41069:196:0;;-1:-1:-1;;;;;41069:15:0;;;;:66;;:196;;41150:11;;41069:15;;41192:4;;41219;;41239:15;;41069:196;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41286:35;41299:21;41286:12;:35::i;:::-;-1:-1:-1;;41332:6:0;:14;;-1:-1:-1;;;;41332:14:0;;;40785:569::o;43005:359::-;43138:12;;43130:20;;-1:-1:-1;;;43138:12:0;;;;29991:24;43130:20;:::i;:::-;43120:6;:30;;43112:78;;;;-1:-1:-1;;;43112:78:0;;16438:2:1;43112:78:0;;;16420:21:1;16477:2;16457:18;;;16450:30;16516:34;16496:18;;;16489:62;-1:-1:-1;;;16567:18:1;;;16560:33;16610:19;;43112:78:0;16236:399:1;43112:78:0;43282:16;;43274:24;;-1:-1:-1;;;43282:16:0;;;;29991:24;43274;:::i;:::-;43264:6;43246:15;43258:2;-1:-1:-1;;;;;47932:16:0;47905:7;47932:16;;;:11;:16;;;;;;;47849:107;43246:15;:24;;;;:::i;:::-;:52;;43224:132;;;;-1:-1:-1;;;43224:132:0;;18769:2:1;43224:132:0;;;18751:21:1;18808:2;18788:18;;;18781:30;18847:32;18827:18;;;18820:60;18897:18;;43224:132:0;18567:354:1;46646:161:0;46784:15;;46691:4;;-1:-1:-1;;;46784:15:0;;;;46771:9;:28;;46764:35;;46646:161;:::o;51499:222::-;51600:11;;51662:6;51646:15;;;;:7;:15;:::i;:::-;:22;;;;:::i;:::-;51640:28;-1:-1:-1;51707:6:0;51688:18;;;;:7;:18;:::i;:::-;:25;;;;:::i;:::-;51679:34;;51499:222;;;;;;:::o;50444:136::-;-1:-1:-1;;;;;50543:20:0;;;;;;:11;:20;;;;;;:29;;50566:6;;50543:29;:::i;:::-;-1:-1:-1;;;;;50520:20:0;;;;;;;:11;:20;;;;;:52;;;;-1:-1:-1;50444:136:0:o;41362:646::-;41451:6;:13;;-1:-1:-1;;;;41451:13:0;-1:-1:-1;;;41451:13:0;;;41499:16;;;41513:1;41499:16;;;;;;;;-1:-1:-1;;;;41499:16:0;41513:1;41499:16;;;;;;;;;;-1:-1:-1;41499:16:0;41475:40;;41544:4;41526;41531:1;41526:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;41526:23:0;;;:7;;;;;;;;;;:23;;;;41570:15;;:22;;;-1:-1:-1;;;41570:22:0;;;;:15;;;;;:20;;:22;;;;;41526:7;;41570:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41560:4;41565:1;41560:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;41560:32:0;;;:7;;;;;;;;;:32;41635:15;;41603:62;;41620:4;;41635:15;41653:11;41603:8;:62::i;:::-;41725:15;;:196;;-1:-1:-1;;;41725:196:0;;41693:21;;-1:-1:-1;;;;;41725:15:0;;:66;;:196;;41806:11;;41676:14;;41848:4;;41875;;41895:15;;41725:196;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41967:6;41943:21;:30;;;;:::i;:::-;41984:6;:14;;-1:-1:-1;;;;41984:14:0;;;41932:41;41362:646;-1:-1:-1;;;;41362:646:0:o;56172:1642::-;56258:14;56417:15;56435:16;:14;:16::i;:::-;-1:-1:-1;;;;;56694:19:0;;56664:17;56694:19;;;:11;:19;;;;;;56417:34;;-1:-1:-1;56664:17:0;56716:14;;56684:29;;29991:24;56684:29;:::i;:::-;:46;;;;:::i;:::-;56664:66;;56746:9;56741:178;56765:16;:23;56761:27;;56741:178;;;56875:11;:32;56887:16;56904:1;56887:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;56887:19:0;56875:32;;;;;;;;;;;;;56863:44;;:9;:44;:::i;:::-;56851:56;-1:-1:-1;56790:3:0;;;;:::i;:::-;;;;56741:178;;;-1:-1:-1;57147:14:0;57164:19;57174:9;57164:7;:19;:::i;:::-;57147:36;;57236:24;57280:9;57275:530;57299:17;:24;57295:28;;57275:530;;;57435:6;-1:-1:-1;;;;;57411:30:0;:17;57429:1;57411:20;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;57411:20:0;:30;;:93;;;57445:15;:37;57461:17;57479:1;57461:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;57461:20:0;57445:37;;;;;;;;;;;;:59;;57461:20;57445:59;;;;57411:93;57408:141;;;57525:8;;57408:141;57601:33;57613:17;57631:1;57613:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;57613:20:0;47932:16;;:11;:16;;;;;;;47849:107;57601:33;57582:52;;:16;:52;:::i;:::-;57563:71;;57671:6;57652:16;:25;57649:145;;;57734:17;57752:1;57734:20;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;57734:20:0;;-1:-1:-1;57773:5:0;;57649:145;57325:3;;;;:::i;:::-;;;;57275:530;;;;56274:1540;;;;56172:1642;;;;:::o;50667:824::-;-1:-1:-1;;;;;50742:24:0;;;;;;:15;:24;;;;;:40;;;;;;50738:683;;50952:17;:24;50979:1;-1:-1:-1;50949:349:0;;;51036:17;:24;51001:12;;51036:26;;51061:1;;51036:26;:::i;:::-;51016:16;:14;:16::i;:::-;:47;;;;:::i;:::-;51001:62;;51082:17;51105;51123:4;51105:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;51082:47;;51105:23;51082:47;;;;;;;;;;;;;;-1:-1:-1;;;;;;51082:47:0;-1:-1:-1;;;;;51105:23:0;;;51082:47;;;;;;51148:17;:23;;51174:7;;51148:17;51166:4;;51148:23;;;;;;:::i;:::-;;;;;;;;;:33;;;;;-1:-1:-1;;;;;51148:33:0;;;;;-1:-1:-1;;;;;51148:33:0;;;;;;50982:215;50949:349;;;51251:17;:31;;;;;;;-1:-1:-1;51251:31:0;;;;;;;;-1:-1:-1;;;;;;51251:31:0;-1:-1:-1;;;;;51251:31:0;;;;;50949:349;-1:-1:-1;;;;;51362:24:0;;;;;;:15;:24;;;;;:47;;-1:-1:-1;;51362:47:0;;;;;50738:683;-1:-1:-1;;;;;51454:20:0;;;;;;:11;:20;;;;;;:29;;51477:6;;51454:29;:::i;42016:503::-;42221:12;;42210:8;;42176:14;;42221:12;-1:-1:-1;;;42221:12:0;;;;;;;42193:25;;42210:8;;;;;-1:-1:-1;;;42193:14:0;;;;:25;:::i;:::-;:40;;;;:::i;:::-;42284:15;;42308:14;;42176:57;;-1:-1:-1;42266:65:0;;-1:-1:-1;;;;;42284:15:0;;;;42301:29;;;;;:21;;-1:-1:-1;;;42308:14:0;;;;42301:6;:21;:::i;:::-;:29;;;;:::i;:::-;42266:17;:65::i;:::-;42376:15;;42358:59;;-1:-1:-1;;;;;42376:15:0;;;42393:23;;;;;:15;;-1:-1:-1;;;42400:8:0;;;;42393:6;:15;:::i;42358:59::-;42466:15;;42448:63;;-1:-1:-1;;;;;42466:15:0;;;42483:27;;;;;:19;;-1:-1:-1;;;42490:12:0;;;;42483:6;:19;:::i;56015:149::-;56063:14;56138;56151:1;56138:12;:14;:::i;:::-;56117:37;;;56128:25;;56117:37;;;1966:25:1;1939:18;56117:37:0;;;;;;;;;;;;56107:48;;;;;;56099:57;;56090:66;;56015:149;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:276:1:-;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;180:9;167:23;230:10;223:5;219:22;212:5;209:33;199:61;;256:1;253;246:12;199:61;279:5;14:276;-1:-1:-1;;;14:276:1:o;295:597::-;407:4;436:2;465;454:9;447:21;497:6;491:13;540:6;535:2;524:9;520:18;513:34;565:1;575:140;589:6;586:1;583:13;575:140;;;684:14;;;680:23;;674:30;650:17;;;669:2;646:26;639:66;604:10;;575:140;;;733:6;730:1;727:13;724:91;;;803:1;798:2;789:6;778:9;774:22;770:31;763:42;724:91;-1:-1:-1;876:2:1;855:15;-1:-1:-1;;851:29:1;836:45;;;;883:2;832:54;;295:597;-1:-1:-1;;;295:597:1:o;897:154::-;-1:-1:-1;;;;;976:5:1;972:54;965:5;962:65;952:93;;1041:1;1038;1031:12;1056:315;1124:6;1132;1185:2;1173:9;1164:7;1160:23;1156:32;1153:52;;;1201:1;1198;1191:12;1153:52;1240:9;1227:23;1259:31;1284:5;1259:31;:::i;:::-;1309:5;1361:2;1346:18;;;;1333:32;;-1:-1:-1;;;1056:315:1:o;1568:247::-;1627:6;1680:2;1668:9;1659:7;1655:23;1651:32;1648:52;;;1696:1;1693;1686:12;1648:52;1735:9;1722:23;1754:31;1779:5;1754:31;:::i;2002:367::-;2065:8;2075:6;2129:3;2122:4;2114:6;2110:17;2106:27;2096:55;;2147:1;2144;2137:12;2096:55;-1:-1:-1;2170:20:1;;2213:18;2202:30;;2199:50;;;2245:1;2242;2235:12;2199:50;2282:4;2274:6;2270:17;2258:29;;2342:3;2335:4;2325:6;2322:1;2318:14;2310:6;2306:27;2302:38;2299:47;2296:67;;;2359:1;2356;2349:12;2296:67;2002:367;;;;;:::o;2374:773::-;2496:6;2504;2512;2520;2573:2;2561:9;2552:7;2548:23;2544:32;2541:52;;;2589:1;2586;2579:12;2541:52;2629:9;2616:23;2658:18;2699:2;2691:6;2688:14;2685:34;;;2715:1;2712;2705:12;2685:34;2754:70;2816:7;2807:6;2796:9;2792:22;2754:70;:::i;:::-;2843:8;;-1:-1:-1;2728:96:1;-1:-1:-1;2931:2:1;2916:18;;2903:32;;-1:-1:-1;2947:16:1;;;2944:36;;;2976:1;2973;2966:12;2944:36;;3015:72;3079:7;3068:8;3057:9;3053:24;3015:72;:::i;:::-;2374:773;;;;-1:-1:-1;3106:8:1;-1:-1:-1;;;;2374:773:1:o;3152:456::-;3229:6;3237;3245;3298:2;3286:9;3277:7;3273:23;3269:32;3266:52;;;3314:1;3311;3304:12;3266:52;3353:9;3340:23;3372:31;3397:5;3372:31;:::i;:::-;3422:5;-1:-1:-1;3479:2:1;3464:18;;3451:32;3492:33;3451:32;3492:33;:::i;:::-;3152:456;;3544:7;;-1:-1:-1;;;3598:2:1;3583:18;;;;3570:32;;3152:456::o;3802:484::-;3855:3;3893:5;3887:12;3920:6;3915:3;3908:19;3946:4;3975:2;3970:3;3966:12;3959:19;;4012:2;4005:5;4001:14;4033:1;4043:218;4057:6;4054:1;4051:13;4043:218;;;4122:13;;-1:-1:-1;;;;;4118:62:1;4106:75;;4201:12;;;;4236:15;;;;4079:1;4072:9;4043:218;;;-1:-1:-1;4277:3:1;;3802:484;-1:-1:-1;;;;;3802:484:1:o;4291:261::-;4470:2;4459:9;4452:21;4433:4;4490:56;4542:2;4531:9;4527:18;4519:6;4490:56;:::i;4557:118::-;4643:5;4636:13;4629:21;4622:5;4619:32;4609:60;;4665:1;4662;4655:12;4680:241;4736:6;4789:2;4777:9;4768:7;4764:23;4760:32;4757:52;;;4805:1;4802;4795:12;4757:52;4844:9;4831:23;4863:28;4885:5;4863:28;:::i;5157:180::-;5216:6;5269:2;5257:9;5248:7;5244:23;5240:32;5237:52;;;5285:1;5282;5275:12;5237:52;-1:-1:-1;5308:23:1;;5157:180;-1:-1:-1;5157:180:1:o;5342:388::-;5410:6;5418;5471:2;5459:9;5450:7;5446:23;5442:32;5439:52;;;5487:1;5484;5477:12;5439:52;5526:9;5513:23;5545:31;5570:5;5545:31;:::i;:::-;5595:5;-1:-1:-1;5652:2:1;5637:18;;5624:32;5665:33;5624:32;5665:33;:::i;:::-;5717:7;5707:17;;;5342:388;;;;;:::o;7311:184::-;-1:-1:-1;;;7360:1:1;7353:88;7460:4;7457:1;7450:15;7484:4;7481:1;7474:15;7500:184;-1:-1:-1;;;7549:1:1;7542:88;7649:4;7646:1;7639:15;7673:4;7670:1;7663:15;7689:135;7728:3;-1:-1:-1;;7749:17:1;;7746:43;;;7769:18;;:::i;:::-;-1:-1:-1;7816:1:1;7805:13;;7689:135::o;8131:245::-;8198:6;8251:2;8239:9;8230:7;8226:23;8222:32;8219:52;;;8267:1;8264;8257:12;8219:52;8299:9;8293:16;8318:28;8340:5;8318:28;:::i;8381:125::-;8421:4;8449:1;8446;8443:8;8440:34;;;8454:18;;:::i;:::-;-1:-1:-1;8491:9:1;;8381:125::o;8511:251::-;8581:6;8634:2;8622:9;8613:7;8609:23;8605:32;8602:52;;;8650:1;8647;8640:12;8602:52;8682:9;8676:16;8701:31;8726:5;8701:31;:::i;8767:184::-;8837:6;8890:2;8878:9;8869:7;8865:23;8861:32;8858:52;;;8906:1;8903;8896:12;8858:52;-1:-1:-1;8929:16:1;;8767:184;-1:-1:-1;8767:184:1:o;8956:::-;-1:-1:-1;;;9005:1:1;8998:88;9105:4;9102:1;9095:15;9129:4;9126:1;9119:15;9145:120;9185:1;9211;9201:35;;9216:18;;:::i;:::-;-1:-1:-1;9250:9:1;;9145:120::o;10949:306::-;11037:6;11045;11053;11106:2;11094:9;11085:7;11081:23;11077:32;11074:52;;;11122:1;11119;11112:12;11074:52;11151:9;11145:16;11135:26;;11201:2;11190:9;11186:18;11180:25;11170:35;;11245:2;11234:9;11230:18;11224:25;11214:35;;10949:306;;;;;:::o;11613:184::-;-1:-1:-1;;;11662:1:1;11655:88;11762:4;11759:1;11752:15;11786:4;11783:1;11776:15;16003:228;16042:3;16070:10;16107:2;16104:1;16100:10;16137:2;16134:1;16130:10;16168:3;16164:2;16160:12;16155:3;16152:21;16149:47;;;16176:18;;:::i;:::-;16212:13;;16003:228;-1:-1:-1;;;;16003:228:1:o;16640:128::-;16680:3;16711:1;16707:6;16704:1;16701:13;16698:39;;;16717:18;;:::i;:::-;-1:-1:-1;16753:9:1;;16640:128::o;17172:605::-;17471:6;17460:9;17453:25;17514:6;17509:2;17498:9;17494:18;17487:34;17557:3;17552:2;17541:9;17537:18;17530:31;17434:4;17578:57;17630:3;17619:9;17615:19;17607:6;17578:57;:::i;:::-;-1:-1:-1;;;;;17671:55:1;;;;17666:2;17651:18;;17644:83;-1:-1:-1;17758:3:1;17743:19;17736:35;17570:65;17172:605;-1:-1:-1;;;17172:605:1:o;18926:168::-;18966:7;19032:1;19028;19024:6;19020:14;19017:1;19014:21;19009:1;19002:9;18995:17;18991:45;18988:71;;;19039:18;;:::i;:::-;-1:-1:-1;19079:9:1;;18926:168::o;19099:112::-;19131:1;19157;19147:35;;19162:18;;:::i;:::-;-1:-1:-1;19196:9:1;;19099:112::o

Swarm Source

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