ETH Price: $3,230.94 (+1.14%)

Token

gxs-protocol.net (GXS)
 

Overview

Max Total Supply

12,195.690438745345155359 GXS

Holders

131

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
Uniswap V2: GXS
Balance
0.000000000000034025 GXS

Value
$0.00
0xaaa002b4fba93390f2c011555d33d224fea67773
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:
GXS

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 500 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

pragma solidity >=0.6.2 <0.8.0;

contract State {

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

    // Supported pools and data for measuring mint & burn factors
    struct PoolCounter {
        address pairToken;
        uint256 tokenBalance;
        uint256 pairTokenBalance;
        uint256 lpBalance;
        uint256 startTokenBalance;
        uint256 startPairTokenBalance;
    }
    address[] _supportedPools;
    mapping (address => PoolCounter) _poolCounters;
    mapping (address => bool) _isSupportedPool;
    address _mainPool;

    uint256 _currentEpoch;
    
    //Creating locked balances
    struct LockBox {
        address beneficiary;
        uint256 lockedBalance;
        uint256 unlockTime;
        bool locked;
    }
    LockBox[] _lockBoxes;
    mapping(address => uint256) _lockedBalance;
    mapping(address => bool) _hasLockedBalance;
    uint256 _totalLockedBalance;
 
    uint256 _largeTotal;
    uint256 _totalSupply;

    address _liquidityReserve;
    address _stabilizer;

    bool _presaleDone;
    address _presaleCon;
    
    bool _paused;
    
    bool _taxLess;
    mapping(address=>bool) _isTaxlessSetter;
}


abstract contract Initializable {

    /**
     * @dev Indicates that the contract has been initialized.
     */
    bool private _initialized;

    /**
     * @dev Indicates that the contract is in the process of being initialized.
     */
    bool private _initializing;

    /**
     * @dev Modifier to protect an initializer function from being invoked twice.
     */
    modifier initializer() {
        require(_initializing || _isConstructor() || !_initialized, "Initializable: contract is already initialized");

        bool isTopLevelCall = !_initializing;
        if (isTopLevelCall) {
            _initializing = true;
            _initialized = true;
        }

        _;

        if (isTopLevelCall) {
            _initializing = false;
        }
    }

    /// @dev Returns true if and only if the function is running in the constructor
    function _isConstructor() private view returns (bool) {
        // extcodesize checks the size of the code stored in an address, and
        // address returns the current address. Since the code is still not
        // deployed when running a constructor, any checks on its code size will
        // yield zero, making it an effective way to detect if a contract is
        // under construction or not.
        address self = address(this);
        uint256 cs;
        // solhint-disable-next-line no-inline-assembly
        assembly { cs := extcodesize(self) }
        return cs == 0;
    }
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.6.12;

library Constants {
    uint256 private constant MAX = ~uint256(0);
    uint8 private constant _decimals = 18;

    uint256 private constant _launchSupply = 9500 * 10 ** uint256(_decimals);
    uint256 private constant _largeTotal = (MAX - (MAX % _launchSupply));

    uint256 private constant _baseExpansionFactor = 100;
    uint256 private constant _baseContractionFactor = 100;
    uint256 private constant _incentivePot = 50;
    uint256 private constant _baseUtilityFee = 50;
    uint256 private constant _baseContractionCap = 1000;

    uint256 private constant _stabilizerFee = 250;
    uint256 private constant _stabilizationLowerBound = 50;
    uint256 private constant _stabilizationLowerReset = 75;
    uint256 private constant _stabilizationUpperBound = 150;
    uint256 private constant _stabilizationUpperReset = 125;
    uint256 private constant _stabilizePercent = 10;

    uint256 private constant _treasuryFee = 250;

    uint256 private constant _epochLength = 4 hours;

    uint256 private constant _liquidityReward = 25 * 10**uint256(_decimals);
    uint256 private constant _minForLiquidity = 500 * 10**uint256(_decimals);
    uint256 private constant _minForCallerLiquidity = 500 * 10**uint256(_decimals);

    address private constant _routerAddress = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
    address private constant _factoryAddress = 0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f;

    string private constant _name = "gxs-protocol.net";
    string private constant _symbol = "GXS";

    /****** Getters *******/
    function getLaunchSupply() internal pure returns (uint256) {
        return _launchSupply;
    }
    function getLargeTotal() internal pure returns (uint256) {
        return _largeTotal;
    }
    function getBaseExpansionFactor() internal pure returns (uint256) {
        return _baseExpansionFactor;
    }
    function getBaseContractionFactor() internal pure returns (uint256) {
        return _baseContractionFactor;
    }
    function getIncentivePot() internal pure returns (uint256) {
        return _incentivePot;
    }
    function getBaseContractionCap() internal pure returns (uint256) {
        return _baseContractionCap;
    }
    function getBaseUtilityFee() internal pure returns (uint256) {
        return _baseUtilityFee;
    }
    function getStabilizerFee() internal pure returns (uint256) {
        return _stabilizerFee;
    }
    function getStabilizationLowerBound() internal pure returns (uint256) {
        return _stabilizationLowerBound;
    }
    function getStabilizationLowerReset() internal pure returns (uint256) {
        return _stabilizationLowerReset;
    }
    function getStabilizationUpperBound() internal pure returns (uint256) {
        return _stabilizationUpperBound;
    }
    function getStabilizationUpperReset() internal pure returns (uint256) {
        return _stabilizationUpperReset;
    }
    function getStabilizePercent() internal pure returns (uint256) {
        return _stabilizePercent;
    }
    function getTreasuryFee() internal pure returns (uint256) {
        return _treasuryFee;
    }
    function getEpochLength() internal pure returns (uint256) {
        return _epochLength;
    }
    function getLiquidityReward() internal pure returns (uint256) {
        return _liquidityReward;
    }
    function getMinForLiquidity() internal pure returns (uint256) {
        return _minForLiquidity;
    }
    function getMinForCallerLiquidity() internal pure returns (uint256) {
        return _minForCallerLiquidity;
    }
    function getRouterAdd() internal pure returns (address) {
        return _routerAddress;
    }
    function getFactoryAdd() internal pure returns (address) {
        return _factoryAddress;
    }
    function getName() internal pure returns (string memory)  {
        return _name;
    }
    function getSymbol() internal pure returns (string memory) {
        return _symbol;
    }
    function getDecimals() internal pure returns (uint8) {
        return _decimals;
    }
}

pragma solidity >=0.6.0 <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 GSN 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 ContextUpgradeable is Initializable {
    function __Context_init() internal initializer {
        __Context_init_unchained();
    }

    function __Context_init_unchained() internal initializer {
    }
    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

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

pragma solidity ^0.6.12;


contract Getters is State {
    using SafeMathUpgradeable for uint256;
    using AddressUpgradeable for address;
    function getPoolCounters(address pool) public view returns (address, uint256, uint256, uint256, uint256, uint256) {
        PoolCounter memory pc = _poolCounters[pool];
        return (pc.pairToken, pc.tokenBalance, pc.pairTokenBalance, pc.lpBalance, pc.startTokenBalance, pc.startPairTokenBalance);
    }
    function isTaxlessSetter(address account) public view returns (bool) {
        return _isTaxlessSetter[account];
    }
    function getUniswapRouter() public view returns (IUniswapV2Router02) {
        return IUniswapV2Router02(Constants.getRouterAdd());
    }
    function getUniswapFactory() public view returns (IUniswapV2Factory) {
        return IUniswapV2Factory(Constants.getFactoryAdd());
    }
    function getFactor() public view returns(uint256) {
        if (_presaleDone) {
            return _largeTotal.div(_totalSupply);
        } else {
            return _largeTotal.div(Constants.getLaunchSupply());
        }
    }
    function getUpdatedPoolCounters(address pool, address pairToken) public view returns (uint256, uint256, uint256) {
        uint256 lpBalance = IERC20(pool).totalSupply();
        uint256 tokenBalance = IERC20(address(this)).balanceOf(pool);
        uint256 pairTokenBalance = IERC20(address(pairToken)).balanceOf(pool);
        return (tokenBalance, pairTokenBalance, lpBalance);
    }
    function getMintValue(address sender, uint256 amount) internal view returns(uint256, uint256, uint256) {
        uint256 mintAmount = amount.mul(1).div(100);
        return (0,0,mintAmount);
    }

    function getBurnValues(address recipient, uint256 amount) internal view returns(uint256, uint256) {
        uint256 currentFactor = getFactor();
        uint256 burnAmount = amount.mul(5).div(1000);
        return (burnAmount, burnAmount.mul(currentFactor));
    }

    function getUtilityFee(uint256 amount) internal view returns(uint256, uint256) {
        uint256 currentFactor = getFactor();
        uint256 utilityFee = amount.mul(5).div(100);
        return (utilityFee, utilityFee.mul(currentFactor));
    }
}

pragma solidity >=0.6.0 <0.8.0;

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

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

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

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

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

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

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

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

pragma solidity >=0.6.0 <0.8.0;

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

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

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

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

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

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

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

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

// solhint-disable-next-line compiler-version
pragma solidity >=0.4.24 <0.8.0;


/**
 * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
 * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an
 * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
 * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
 * 
 * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
 * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.
 * 
 * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
 * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
 */
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;
}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);
}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;
}
pragma solidity >=0.5.0;

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

pragma solidity >=0.6.0 <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 OwnableUpgradeable is Initializable {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    function __Ownable_init() internal initializer {
        __Ownable_init_unchained();
    }

    function __Ownable_init_unchained() internal initializer {
        address msgSender = msg.sender;
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

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

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

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMathUpgradeable {
    /**
     * @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) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @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 sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

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

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts 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) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts 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) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts 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 mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

pragma solidity ^0.6.12;


contract Setters is State, Getters {
    function updatePresaleAddress(address presaleAddress) internal {
        _presaleCon = presaleAddress;
    }
    function setAllowances(address owner, address spender, uint256 amount) internal {
        _allowances[owner][spender] = amount;
    }
    function addToAccount(address account, uint256 amount) internal {
        uint256 currentFactor = getFactor();
        uint256 largeAmount = amount.mul(currentFactor);
        _largeBalances[account] = _largeBalances[account].add(largeAmount);
        _totalSupply = _totalSupply.add(amount);
    }
    function addToAll(uint256 amount) internal {
        _totalSupply = _totalSupply.add(amount);
    }
    function initializeEpoch() internal {
        _currentEpoch = now;
    }
    function updateEpoch() internal {
        initializeEpoch();
        for (uint256 i=0; i<_supportedPools.length; i++) {
            _poolCounters[_supportedPools[i]].startTokenBalance = _poolCounters[_supportedPools[i]].tokenBalance;
            _poolCounters[_supportedPools[i]].startPairTokenBalance = _poolCounters[_supportedPools[i]].pairTokenBalance;
        }
    }
    function initializeLargeTotal() internal {
        _largeTotal = Constants.getLargeTotal();
    }
    function syncPair(address pool) internal returns(bool) {
        (uint256 tokenBalance, uint256 pairTokenBalance, uint256 lpBalance) = getUpdatedPoolCounters(pool, _poolCounters[pool].pairToken);
        bool lpBurn = lpBalance < _poolCounters[pool].lpBalance;
        _poolCounters[pool].lpBalance = lpBalance;
        _poolCounters[pool].tokenBalance = tokenBalance;
        _poolCounters[pool].pairTokenBalance = pairTokenBalance;
        return (lpBurn);
    }
    function silentSyncPair(address pool) public {
        (uint256 tokenBalance, uint256 pairTokenBalance, uint256 lpBalance) = getUpdatedPoolCounters(pool, _poolCounters[pool].pairToken);
        _poolCounters[pool].lpBalance = lpBalance;
        _poolCounters[pool].tokenBalance = tokenBalance;
        _poolCounters[pool].pairTokenBalance = pairTokenBalance;
    }
    function addSupportedPool(address pool, address pairToken) internal {
        require(!_isSupportedPool[pool],"This pool is already supported");
        _isSupportedPool[pool] = true;
        _supportedPools.push(pool);
        (uint256 tokenBalance, uint256 pairTokenBalance, uint256 lpBalance) = getUpdatedPoolCounters(pool, pairToken);
        _poolCounters[pool] = PoolCounter(pairToken, tokenBalance, pairTokenBalance, lpBalance, tokenBalance, pairTokenBalance);
    }
}

pragma solidity ^0.6.12;

pragma solidity ^0.6.12;


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

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}
library UniswapV2OracleLibrary {
    using FixedPoint for *;

    // helper function that returns the current block timestamp within the range of uint32, i.e. [0, 2**32 - 1]
    function currentBlockTimestamp() internal view returns (uint32) {
        return uint32(block.timestamp % 2 ** 32);
    }

    // produces the cumulative price using counterfactuals to save gas and avoid a call to sync.
    function currentCumulativePrices(
        address pair
    ) internal view returns (uint price0Cumulative, uint price1Cumulative, uint32 blockTimestamp) {
        blockTimestamp = currentBlockTimestamp();
        price0Cumulative = IUniswapV2Pair(pair).price0CumulativeLast();
        price1Cumulative = IUniswapV2Pair(pair).price1CumulativeLast();

        // if time has elapsed since the last update on the pair, mock the accumulated price values
        (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast) = IUniswapV2Pair(pair).getReserves();
        if (blockTimestampLast != blockTimestamp) {
            // subtraction overflow is desired
            uint32 timeElapsed = blockTimestamp - blockTimestampLast;
            // addition overflow is desired
            // counterfactual
            price0Cumulative += uint(FixedPoint.fraction(reserve1, reserve0)._x) * timeElapsed;
            // counterfactual
            price1Cumulative += uint(FixedPoint.fraction(reserve0, reserve1)._x) * timeElapsed;
        }
    }
}

library FixedPoint {
    // range: [0, 2**112 - 1]
    // resolution: 1 / 2**112
    struct uq112x112 {
        uint224 _x;
    }

    // range: [0, 2**144 - 1]
    // resolution: 1 / 2**112
    struct uq144x112 {
        uint _x;
    }

    uint8 private constant RESOLUTION = 112;

    // encode a uint112 as a UQ112x112
    function encode(uint112 x) internal pure returns (uq112x112 memory) {
        return uq112x112(uint224(x) << RESOLUTION);
    }

    // encodes a uint144 as a UQ144x112
    function encode144(uint144 x) internal pure returns (uq144x112 memory) {
        return uq144x112(uint256(x) << RESOLUTION);
    }

    // divide a UQ112x112 by a uint112, returning a UQ112x112
    function div(uq112x112 memory self, uint112 x) internal pure returns (uq112x112 memory) {
        require(x != 0, 'FixedPoint: DIV_BY_ZERO');
        return uq112x112(self._x / uint224(x));
    }

    // multiply a UQ112x112 by a uint, returning a UQ144x112
    // reverts on overflow
    function mul(uq112x112 memory self, uint y) internal pure returns (uq144x112 memory) {
        uint z;
        require(y == 0 || (z = uint(self._x) * y) / y == uint(self._x), "FixedPoint: MULTIPLICATION_OVERFLOW");
        return uq144x112(z);
    }

    // returns a UQ112x112 which represents the ratio of the numerator to the denominator
    // equivalent to encode(numerator).div(denominator)
    function fraction(uint112 numerator, uint112 denominator) internal pure returns (uq112x112 memory) {
        require(denominator > 0, "FixedPoint: DIV_BY_ZERO");
        return uq112x112((uint224(numerator) << RESOLUTION) / denominator);
    }

    // decode a UQ112x112 into a uint112 by truncating after the radix point
    function decode(uq112x112 memory self) internal pure returns (uint112) {
        return uint112(self._x >> RESOLUTION);
    }

    // decode a UQ144x112 into a uint144 by truncating after the radix point
    function decode144(uq144x112 memory self) internal pure returns (uint144) {
        return uint144(self._x >> RESOLUTION);
    }
}

library UniswapV2Library {
    using SafeMathUpgradeable for uint;

    // returns sorted token addresses, used to handle return values from pairs sorted in this order
    function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) {
        require(tokenA != tokenB, 'UniswapV2Library: IDENTICAL_ADDRESSES');
        (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        require(token0 != address(0), 'UniswapV2Library: ZERO_ADDRESS');
    }

    // calculates the CREATE2 address for a pair without making any external calls
    function pairFor(address factory, address tokenA, address tokenB) internal pure returns (address pair) {
        (address token0, address token1) = sortTokens(tokenA, tokenB);
        pair = address(uint(keccak256(abi.encodePacked(
                hex'ff',
                factory,
                keccak256(abi.encodePacked(token0, token1)),
                hex'96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f' // init code hash
            ))));
    }
}

contract GXS is Setters, Initializable, IERC20Upgradeable, OwnableUpgradeable {
    using SafeMathUpgradeable for uint256;
    using AddressUpgradeable for address;
    
    mapping(address => uint256) public refunds;
    mapping(address => bool) public whitelist;
    mapping(address => uint256) public bots;

    
    uint256 public refundCooldown = 5 minutes;
    uint256 public minEthThreshold = 0.3 ether;
    uint256 public gasPrice = 100e9;
    uint256 public refundFrac = 50;
    uint256 public minRefund = 0.001 ether;
    uint256 public maxRefund = 0.025 ether;
    uint256 public gasRefund = 0.025 ether;
    uint256 public lastFund = 0;
    uint256 public fundCooldown = 5 minutes;
    uint256 public minFundThreshold = 0;
    uint256 public holdLimit = 200 * 10 ** 18;
    uint256 public botCount = 5;
    uint256 public botDelay = 45 minutes;
    bool public limitHold = true;
    bool public delayQuick = true;
    bool public delayWhitelist = true;
    

    address public uniswapPair;
    // address public stub;

    bool public isThisToken0;

    /// @notice last TWAP update time
    uint32 public blockTimestampLast;

    /// @notice last TWAP cumulative price
    uint256 public priceCumulativeLast;

    /// @notice last TWAP average price
    uint256 public priceAverageLast;

    /// @notice TWAP min delta (10-min)
    uint256 public minDeltaTwap;
    
    bool private _inInternalSell = false;

    event TwapUpdated(uint256 priceCumulativeLast, uint256 blockTimestampLast, uint256 priceAverageLast);
    event GasRefunded(address to, uint256 amount);

    modifier setInternalSell {
        _inInternalSell = true;
        _;
        _inInternalSell = false;
    }

    modifier onlyTaxless {
        require(isTaxlessSetter(msg.sender),"not taxless");
        _;
    }
    modifier onlyPresale {
        require(msg.sender==_presaleCon,"not presale");
        require(!_presaleDone, "Presale over");
        _;
    }
    modifier pausable {
        require(!_paused, "Paused");
        _;
    }
    modifier taxlessTx {
        _taxLess = true;
        _;
        _taxLess = false;
    }


    function name() public view returns (string memory) {
        return Constants.getName();
    }
    
    function symbol() public view returns (string memory) {
        return Constants.getSymbol();
    }
    
    function decimals() public view returns (uint8) {
        return Constants.getDecimals();
    }
    
    function totalSupply() public view override returns (uint256) {
        return _totalSupply;
    }
    
    function circulatingSupply() public view returns (uint256) {
        uint256 currentFactor = getFactor();
        return _totalSupply.sub(_totalLockedBalance.div(currentFactor)).sub(balanceOf(address(this))).sub(balanceOf(_stabilizer));
    }
    
    function balanceOf(address account) public view override returns (uint256) {
        uint256 currentFactor = getFactor();
        if (_hasLockedBalance[account]) return (_largeBalances[account].add(_lockedBalance[account]).div(currentFactor));
        return _largeBalances[account].div(currentFactor);
    }
    
    function unlockedBalanceOf(address account) public view returns (uint256) {
        uint256 currentFactor = getFactor();
        return _largeBalances[account].div(currentFactor); 
    }

    function transfer(address recipient, uint256 amount) public override returns (bool) {
        _transfer(msg.sender, 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(msg.sender, spender, amount);
        return true;
    }

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

    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender].add(addedValue));
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    function mint(address to, uint256 amount) public onlyPresale {
        addToAccount(to,amount);
        emit Transfer(address(0),to,amount);
    }

    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");
        setAllowances(owner, spender, amount);
        emit Approval(owner, spender, amount);
    }

    function _transfer(address sender, address recipient, uint256 amount) private {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Amount must be greater than zero");
        require(amount <= balanceOf(sender),"Amount exceeds balance");
        require(amount <= unlockedBalanceOf(sender),"Amount exceeds unlocked balance");
        require(_presaleDone,"Presale yet to close");
        uint256 startGas = gasleft();
        bool takeFunds = owner() != sender && owner() != recipient && !_inInternalSell;
        bool funded = false;
        
        if (blockTimestampLast == 0 && balanceOf(uniswapPair) > 0) {
            initializeTwap();
        }
        
        if (delayWhitelist && whitelist[sender]) {
            revert('GXS: hold');
        }
        
        if (sender == address(this)) {
            basicTransfer(sender,recipient,amount);
            return;
        }
        
        if (delayQuick) {
            if (sender == uniswapPair) {
               if (botCount > 0) {
                   botCount -= 1;
                   bots[recipient] = block.timestamp;
               }
                
            } else if (recipient == uniswapPair && block.timestamp - bots[sender] < botDelay) {
                revert('GXS: too quick');
            }
        }
        
        if (limitHold && uniswapPair == sender) {
            if (balanceOf(recipient) + amount > holdLimit) {
                revert('GXS: too much');
            }
        }
        
        if (!_inInternalSell && sender != uniswapPair && now - lastFund > fundCooldown && balanceOf(_stabilizer) > minFundThreshold) {
            lastFund = now;
            funded = true;
            fundTreasury();
        }
        
        if (now > _currentEpoch.add(Constants.getEpochLength())) updateEpoch();
        uint256 currentFactor = getFactor();
        uint256 txType;
        if (_taxLess || sender == owner()) {
            txType = 3;
        } else {
            bool lpBurn;
            if (_isSupportedPool[sender]) {
                lpBurn = syncPair(sender);
            } else if (_isSupportedPool[recipient]){
                silentSyncPair(recipient);
            } else {
                silentSyncPair(_mainPool);
            }
            txType = _getTxType(sender, recipient, lpBurn);
        }

        // Buy Transaction from supported pools - requires mint, no utility fee
        if (txType == 1) {
            (uint256 stabilizerMint, uint256 treasuryMint, uint256 totalMint) = getMintValue(sender, amount);
            uint256 treasuryFee = amount.mul(4).div(100);
            uint256 actualTransferAmount = amount.sub(treasuryFee);

            basicTransfer(sender, recipient, actualTransferAmount);
            
            treasuryFee = treasuryFee.add(stabilizerMint).add(treasuryMint);
            _largeBalances[_stabilizer] = _largeBalances[_stabilizer].add(treasuryFee.mul(currentFactor));
            _totalSupply = _totalSupply.add(totalMint);
            emit Transfer(sender, recipient, actualTransferAmount);
            emit Transfer(address(0),_stabilizer,treasuryFee);
        }
        // Sells to supported pools or unsupported transfer - requires exit burn and utility fee
        else if (txType == 2) {
            (uint256 burnSize, uint256 largeBurnSize) = getBurnValues(recipient, amount);
            (uint256 utilityFee, uint256 largeUtilityFee) = getUtilityFee(amount);
            uint256 actualTransferAmount = amount.sub(burnSize).sub(utilityFee);
            basicTransfer(sender, recipient, actualTransferAmount);
            _largeBalances[_stabilizer] = _largeBalances[_stabilizer].add(largeUtilityFee);
            _totalSupply = _totalSupply.sub(burnSize);
            _largeTotal = _largeTotal.sub(largeBurnSize);
            emit Transfer(sender, recipient, actualTransferAmount);
            emit Transfer(sender, address(0), burnSize);
        } 
        // Add Liquidity via interface or Remove Liquidity Transaction to supported pools - no fee of any sort
        else if (txType == 3) {
            basicTransfer(sender, recipient, amount);
            emit Transfer(sender, recipient, amount);
        }
        
        if (!_inInternalSell && owner() != sender && !funded) {
            if (shouldRefundGas(sender, recipient, amount)) {
                uint256 gasUsed = startGas.sub(gasleft());
                refundGas(gasUsed);
            }
            
            _updateTwap();
        }
    }

    function _getTxType(address sender, address recipient, bool lpBurn) private returns(uint256) {
        uint256 txType = 2;
        if (_isSupportedPool[sender]) {
            if (lpBurn) {
                txType = 3;
            } else {
                txType = 1;
            }
        } else if (sender == Constants.getRouterAdd()) {
            txType = 3;
        }
        return txType;
    }

    function setPresale(address presaleAdd) public onlyOwner() {
        require(!_presaleDone, "Presale is already completed");
        updatePresaleAddress(presaleAdd);
    }
    function setDelayQuicksell(bool flag) external onlyOwner() {
        delayQuick = flag;
    }
    function setDelayWhitelist(bool flag) external onlyOwner() {
        delayWhitelist = flag;
    }
    function setLimitHold(bool flag) external onlyOwner() {
        limitHold = flag;
    }
    function setRefundPolicy(
    uint256 _minEth, 
    uint256 _gasPrice,
    uint256 _refundFrac,
    uint256 _minRefund,
    uint256 _maxRefund,
    uint256 _gasRefund) external onlyOwner() {
         minEthThreshold = _minEth;
         gasPrice = _gasPrice;
         refundFrac = _refundFrac;
         minRefund = _minRefund;
         maxRefund = _maxRefund;
         gasRefund = _gasRefund;
    }

    function setPresaleDone() public payable onlyPresale {
        require(!_presaleDone);
        _presaleDone = true;
        createEthPool();
    }

    function createEthPool() private onlyOwner() taxlessTx {
        IUniswapV2Router02 uniswapRouterV2 = getUniswapRouter();
        IUniswapV2Factory uniswapFactory = getUniswapFactory();
        address tokenUniswapPair;
        if (uniswapFactory.getPair(address(uniswapRouterV2.WETH()), address(this)) == address(0)) {
            tokenUniswapPair = uniswapFactory.createPair(
            address(uniswapRouterV2.WETH()), address(this));
        } else {
            tokenUniswapPair = uniswapFactory.getPair(address(this),uniswapRouterV2.WETH());
        }
        _approve(msg.sender, address(uniswapRouterV2), ~uint256(0));
        
        addSupportedPool(tokenUniswapPair, address(uniswapRouterV2.WETH()));
        _mainPool = tokenUniswapPair;
    }

    function setTaxlessSetter(address cont) external onlyOwner() {
        require(!isTaxlessSetter(cont),"already setter");
        _isTaxlessSetter[cont] = true;
    }

    function setTaxless(bool flag) public onlyTaxless {
        _taxLess = flag;
    }

    function removeTaxlessSetter(address cont) external onlyOwner() {
        require(isTaxlessSetter(cont),"not setter");
        _isTaxlessSetter[cont] = false;
    }


    function setStabilizer(address reserve) external onlyOwner() taxlessTx {
        _isTaxlessSetter[_stabilizer] = false;
        uint256 oldBalance = balanceOf(_stabilizer);
        if (oldBalance > 0) {
            _transfer(_stabilizer, reserve, oldBalance);
            emit Transfer(_stabilizer, reserve, oldBalance);
        }
        _stabilizer = reserve;
        _isTaxlessSetter[reserve] = true;
        _approve(_stabilizer, address(this), ~uint256(0));
    }

    
    /**
     * @dev Min time elapsed before twap is updated.
     */
    function setMinDeltaTwap(uint256 _minDeltaTwap) public onlyOwner {
        minDeltaTwap = _minDeltaTwap;
    }

    /**
     * @dev Initializes the TWAP cumulative values for the burn curve.
     */
    function initializeTwap() public {
        require(blockTimestampLast == 0, "twap already initialized");
        require(balanceOf(uniswapPair) > 0);
        (uint256 price0Cumulative, uint256 price1Cumulative, uint32 blockTimestamp) = 
            UniswapV2OracleLibrary.currentCumulativePrices(uniswapPair);

        uint256 priceCumulative = isThisToken0 ? price1Cumulative : price0Cumulative;
        
        blockTimestampLast = blockTimestamp;
        priceCumulativeLast = priceCumulative;
    }

    function _initializePair() internal {
        (address token0, address token1) = UniswapV2Library.sortTokens(address(this), address(getUniswapRouter().WETH()));
        isThisToken0 = (token0 == address(this));
        uniswapPair = UniswapV2Library.pairFor(address(getUniswapFactory()), token0, token1);
    }
    
    
    function _updateTwap() internal virtual returns (uint256) {
        if (blockTimestampLast == 0 && balanceOf(uniswapPair) == 0) {
            // we are not initialized yet
            return 0;
        }

        (uint price0Cumulative, uint price1Cumulative, uint32 blockTimestamp) = 
            UniswapV2OracleLibrary.currentCumulativePrices(uniswapPair);
        uint32 timeElapsed = blockTimestamp - blockTimestampLast; // overflow is desired

        if (timeElapsed > minDeltaTwap) {
            uint256 priceCumulative = isThisToken0 ? price1Cumulative : price0Cumulative;

            // cumulative price is in (uq112x112 price * seconds) units so we simply wrap it after division by time elapsed
            FixedPoint.uq112x112 memory priceAverage = FixedPoint.uq112x112(
                uint224((priceCumulative - priceCumulativeLast) / timeElapsed)
            );

            priceCumulativeLast = priceCumulative;
            blockTimestampLast = blockTimestamp;

            priceAverageLast = FixedPoint.decode144(FixedPoint.mul(priceAverage, 1 ether));

            emit TwapUpdated(priceCumulativeLast, blockTimestampLast, priceAverageLast);
        }

        return priceAverageLast;
    }

    function shouldRefundGas(address from, address to, uint256 amount) private view returns(bool) {
        if (uniswapPair != from) {
            return false;
        }
        
        if (now - refunds[to] < refundCooldown) {
            return false;
        }
        
        uint256 currentPrice = getCurrentTwap();
        uint256 ethVal = amount.mul(1 ether).div(currentPrice);
        
        if (ethVal < minEthThreshold) {
            return false;
        }
        
        return true;
    }
    
    function refundGas(uint256 gasUsed) private setInternalSell {
        uint256 refund = gasRefund;
        if (address(this).balance < refund) {
            refund = address(this).balance.div(10);
        }
        
        if (refund > maxRefund) {
            refund = maxRefund;
        }
        
        if (refund < minRefund) {
            return;
        }
        
        tx.origin.transfer(refund);
        refunds[tx.origin] = now;
        
        emit GasRefunded(tx.origin, refund);
    }

    function getCurrentTwap() public view returns (uint256) {
        (uint price0Cumulative, uint price1Cumulative, uint32 blockTimestamp) = 
            UniswapV2OracleLibrary.currentCumulativePrices(uniswapPair);
        uint32 timeElapsed = blockTimestamp - blockTimestampLast;

        uint256 priceCumulative = isThisToken0 ? price1Cumulative : price0Cumulative;

        FixedPoint.uq112x112 memory priceAverage = FixedPoint.uq112x112(
            uint224((priceCumulative - priceCumulativeLast) / timeElapsed)
        );

        return FixedPoint.decode144(FixedPoint.mul(priceAverage, 1 ether));
    }

    function getLastTwap() public view returns (uint256) {
        return priceAverageLast;
    }
    
    function basicTransfer(address from, address to, uint256 amount) private {
        uint256 largeAmount = getFactor().mul(amount);
        _largeBalances[from] = _largeBalances[from].sub(largeAmount);
        _largeBalances[to] = _largeBalances[to].add(largeAmount);
    }
    
    function fundTreasury() private setInternalSell {
        address payable stab = payable(_stabilizer);
        uint256 tokenAmount = balanceOf(stab);
        if (tokenAmount == 0) {
            return;
        }
        
        basicTransfer(stab, address(this), tokenAmount);
        
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = getUniswapRouter().WETH();

        getUniswapRouter().swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
        
        uint256 treasuryFee = address(this).balance;
        if (treasuryFee > 0 && stab != address(0)) {
            treasuryFee = treasuryFee.mul(7).div(10);
            stab.transfer(treasuryFee);
        }
    }
    
    function multiTransfer(address[] memory addresses, uint256 amount) external {
        for (uint256 i = 0; i < addresses.length; i++) {
            basicTransfer(msg.sender, addresses[i], amount);
            emit Transfer(msg.sender, addresses[i], amount);
        }
    }

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

    function multiWhitelistRemove(address[] memory addresses) external onlyOwner {
        for (uint256 i = 0; i < addresses.length; i++) {
            whitelist[addresses[i]] = false;
        }
    }
    
    constructor() public {
        __Ownable_init();
        updateEpoch();
        initializeLargeTotal();
        setPresale(owner());
        
        _stabilizer = 0x9f8fEd32E39A957b8108480555839cB0e2C05d0E;
        
        setMinDeltaTwap(2 minutes);
        _initializePair();
 
        // Skip uniswap approve
        _approve(owner(), address(getUniswapRouter()), ~uint256(0));
        _approve(address(this), address(getUniswapRouter()), ~uint256(0));

        
        // Allow this contract to handle stab
        _approve(_stabilizer, address(this), ~uint256(0));
        
        uint256 tokens = Constants.getLaunchSupply();
        addToAccount(msg.sender, tokens);
        emit Transfer(address(0),msg.sender,tokens);
    }
    
    receive() external payable {
        
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"GasRefunded","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"priceCumulativeLast","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"blockTimestampLast","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"priceAverageLast","type":"uint256"}],"name":"TwapUpdated","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":[],"name":"blockTimestampLast","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"botCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"botDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"bots","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"circulatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"delayQuick","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"delayWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fundCooldown","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gasPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gasRefund","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentTwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastTwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"}],"name":"getPoolCounters","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getUniswapFactory","outputs":[{"internalType":"contract IUniswapV2Factory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getUniswapRouter","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"address","name":"pairToken","type":"address"}],"name":"getUpdatedPoolCounters","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"holdLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initializeTwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isTaxlessSetter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isThisToken0","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastFund","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitHold","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxRefund","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minDeltaTwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minEthThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minFundThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minRefund","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"multiTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"multiWhitelistAdd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"multiWhitelistRemove","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceAverageLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceCumulativeLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"refundCooldown","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"refundFrac","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"refunds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"cont","type":"address"}],"name":"removeTaxlessSetter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"flag","type":"bool"}],"name":"setDelayQuicksell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"flag","type":"bool"}],"name":"setDelayWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"flag","type":"bool"}],"name":"setLimitHold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minDeltaTwap","type":"uint256"}],"name":"setMinDeltaTwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"presaleAdd","type":"address"}],"name":"setPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setPresaleDone","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minEth","type":"uint256"},{"internalType":"uint256","name":"_gasPrice","type":"uint256"},{"internalType":"uint256","name":"_refundFrac","type":"uint256"},{"internalType":"uint256","name":"_minRefund","type":"uint256"},{"internalType":"uint256","name":"_maxRefund","type":"uint256"},{"internalType":"uint256","name":"_gasRefund","type":"uint256"}],"name":"setRefundPolicy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"reserve","type":"address"}],"name":"setStabilizer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"flag","type":"bool"}],"name":"setTaxless","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"cont","type":"address"}],"name":"setTaxlessSetter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"}],"name":"silentSyncPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"unlockedBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405261012c6046819055670429d069189e000060475564174876e800604855603260495566038d7ea4c68000604a556658d15e17628000604b819055604c556000604d819055604e91909155604f55680ad78ebc5ac62000006050556005605155610a8c6052556053805462ff00001961ff001960ff199283166001171661010017166201000017909155605780549091169055348015620000a357600080fd5b50620000ae620001c1565b620000b862000275565b620000c2620003b7565b620000d6620000d0620003d1565b620003e7565b600e80546001600160a01b031916739f8fed32e39a957b8108480555839cb0e2c05d0e179055620001086078620004a7565b6200011262000501565b6200013362000120620003d1565b6200012a620005fc565b60001962000618565b62000142306200012a620005fc565b600e546200015d906001600160a01b03163060001962000618565b6000620001746200070360201b6200232f1760201c565b905062000182338262000711565b60408051828152905133916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35062000d29565b601154610100900460ff1680620001dd5750620001dd620007ae565b80620001ec575060115460ff16155b620002295760405162461bcd60e51b815260040180806020018281038252602e81526020018062005397602e913960400191505060405180910390fd5b601154610100900460ff1615801562000255576011805460ff1961ff0019909116610100171660011790555b6200025f620007b4565b801562000272576011805461ff00191690555b50565b6200027f620008a9565b60005b600254811015620002725760036000600283815481106200029f57fe5b9060005260206000200160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001908152602001600020600101546003600060028481548110620002f357fe5b60009182526020808320909101546001600160a01b03168352820192909252604001812060040191909155600280546003929190849081106200033257fe5b9060005260206000200160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020019081526020016000206002015460036000600284815481106200038657fe5b60009182526020808320909101546001600160a01b0316835282019290925260400190206005015560010162000282565b620003cc620008af60201b6200233d1760201c565b600b55565b6011546201000090046001600160a01b03165b90565b6011546201000090046001600160a01b031633146200043c576040805162461bcd60e51b81526020600482018190526024820152600080516020620053e6833981519152604482015290519081900360640190fd5b600e54600160a01b900460ff16156200049c576040805162461bcd60e51b815260206004820152601c60248201527f50726573616c6520697320616c726561647920636f6d706c6574656400000000604482015290519081900360640190fd5b6200027281620008be565b6011546201000090046001600160a01b03163314620004fc576040805162461bcd60e51b81526020600482018190526024820152600080516020620053e6833981519152604482015290519081900360640190fd5b605655565b6000806200058c3062000513620005fc565b6001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200054c57600080fd5b505afa15801562000561573d6000803e3d6000fd5b505050506040513d60208110156200057857600080fd5b5051620008e0602090811b6200234c17901c565b6053805460ff60b81b1916306001600160a01b03851614600160b81b021790559092509050620005d2620005bf620009c3565b8383620009da60201b6200242a1760201c565b605360036101000a8154816001600160a01b0302191690836001600160a01b031602179055505050565b60006200061362000aae60201b620025021760201c565b905090565b6001600160a01b0383166200065f5760405162461bcd60e51b8152600401808060200182810382526024815260200180620054066024913960400191505060405180910390fd5b6001600160a01b038216620006a65760405162461bcd60e51b8152600401808060200182810382526022815260200180620053506022913960400191505060405180910390fd5b620006b383838362000ac6565b816001600160a01b0316836001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b690202fefbf2d7c2f0000090565b60006200071d62000af2565b905060006200073b828462000b5e60201b6200251a1790919060201c565b6001600160a01b038516600090815260208181526040909120549192506200076f919083906200257362000bc5821b17901c565b6001600160a01b03851660009081526020818152604090912091909155600c54620007a59185906200257362000bc5821b17901c565b600c5550505050565b303b1590565b601154610100900460ff1680620007d05750620007d0620007ae565b80620007df575060115460ff16155b6200081c5760405162461bcd60e51b815260040180806020018281038252602e81526020018062005397602e913960400191505060405180910390fd5b601154610100900460ff1615801562000848576011805460ff1961ff0019909116610100171660011790555b6011805462010000600160b01b031916336201000081029190911790915560405181906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350801562000272576011805461ff001916905550565b42600655565b69010cc04c84ca8b6fffff1990565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b600080826001600160a01b0316846001600160a01b03161415620009365760405162461bcd60e51b8152600401808060200182810382526025815260200180620053726025913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b031610620009585782846200095b565b83835b90925090506001600160a01b038216620009bc576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a205a45524f5f414444524553530000604482015290519081900360640190fd5b9250929050565b60006200061362000c2060201b620025cd1760201c565b60008080620009ea8585620008e0565b604080516001600160601b0319606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501207fff0000000000000000000000000000000000000000000000000000000000000060688401529a90941b9093166069840152607d8301989098527f96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b737a250d5630b4cf539739df2c5dacb4c659f2488d90565b6001600160a01b0392831660009081526001602090815260408083209490951682529290925291902055565b600e54600090600160a01b900460ff161562000b2e5762000b26600c54600b5462000c3860201b620025e51790919060201c565b9050620003e4565b62000b2662000b476200070360201b6200232f1760201c565b600b5462000c3860201b620025e51790919060201c565b60008262000b6f5750600062000bbf565b8282028284828162000b7d57fe5b041462000bbc5760405162461bcd60e51b8152600401808060200182810382526021815260200180620053c56021913960400191505060405180910390fd5b90505b92915050565b60008282018381101562000bbc576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f90565b600062000bbc83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525062000c8260201b60201c565b6000818362000d125760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101562000cd657818101518382015260200162000cbc565b50505050905090810190601f16801562000d045780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858162000d1f57fe5b0495945050505050565b6146178062000d396000396000f3fe6080604052600436106103dd5760003560e01c80638484ed7e116101fd578063bc3da53511610118578063d09600df116100ab578063dd9c4e8c1161007a578063dd9c4e8c14610f16578063e379c31b14610f2b578063f2c2c32a14610f40578063f2fde38b14610f6c578063fe173b9714610f9f576103e4565b8063d09600df14610e2d578063d5fcc7b614610e75578063db7f521a14610ea8578063dd62ed3e14610edb576103e4565b8063c5700a02116100e7578063c5700a0214610dc0578063c73e029414610dee578063c816841b14610e03578063cfc2d3d214610e18576103e4565b8063bc3da53514610cce578063bef2112414610d01578063bf9a3a1b14610d34578063bfd7928414610d8d576103e4565b80639b19251a11610190578063a9059cbb1161015f578063a9059cbb14610c38578063aaf3a69614610c71578063ab4d125f14610c86578063b6333d8314610c9b576103e4565b80639b19251a14610b055780639ef01cfc14610b38578063a16a317914610b4d578063a457c2d714610bff576103e4565b80638c4056c5116101cc5780638c4056c514610a9a5780638da5cb5b14610ac65780639358928b14610adb57806395d89b4114610af0576103e4565b80638484ed7e146109af57806384955c88146109e2578063886d80cd14610a155780638939878314610a2a576103e4565b806344043b82116102f8578063655cf0431161028b57806370a082311161025a57806370a08231146108f3578063715018a6146109265780637e47d6251461093b5780637eda09511461096757806380c2bbd21461097c576103e4565b8063655cf0431461088a57806365ffe43d146108b457806368ca25c6146108c95780636f68ebae146108de576103e4565b80635184cc43116102c75780635184cc4314610836578063524900b51461084b5780635bc758e2146108605780635f8ee76314610875576103e4565b806344043b82146107305780634539c423146107e0578063493a2714146107f55780634b50af8914610821576103e4565b80632d3e8c93116103705780633e6dfa361161033f5780633e6dfa36146106a95780633eedf63c146106da57806340c10f19146106e2578063428b86171461071b576103e4565b80632d3e8c931461061b5780632f43c1bc14610630578063313ce567146106455780633950935114610670576103e4565b806318160ddd116103ac57806318160ddd146104fc5780631f059ab8146105115780632353464c146105c357806323b872dd146105d8576103e4565b806303db6fc0146103e9578063062876d21461041057806306fdde0314610439578063095ea7b3146104c3576103e4565b366103e457005b600080fd5b3480156103f557600080fd5b506103fe610fb4565b60408051918252519081900360200190f35b34801561041c57600080fd5b50610425610fba565b604080519115158252519081900360200190f35b34801561044557600080fd5b5061044e610fc3565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610488578181015183820152602001610470565b50505050905090810190601f1680156104b55780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104cf57600080fd5b50610425600480360360408110156104e657600080fd5b506001600160a01b038135169060200135610fd3565b34801561050857600080fd5b506103fe610fea565b34801561051d57600080fd5b506105c16004803603602081101561053457600080fd5b81019060208101813564010000000081111561054f57600080fd5b82018360208201111561056157600080fd5b8035906020019184602083028401116401000000008311171561058357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610ff0945050505050565b005b3480156105cf57600080fd5b506103fe61109f565b3480156105e457600080fd5b50610425600480360360608110156105fb57600080fd5b506001600160a01b038135811691602081013590911690604001356110a5565b34801561062757600080fd5b506103fe61110f565b34801561063c57600080fd5b506103fe611115565b34801561065157600080fd5b5061065a61111b565b6040805160ff9092168252519081900360200190f35b34801561067c57600080fd5b506104256004803603604081101561069357600080fd5b506001600160a01b038135169060200135611125565b3480156106b557600080fd5b506106be61115b565b604080516001600160a01b039092168252519081900360200190f35b6105c1611165565b3480156106ee57600080fd5b506105c16004803603604081101561070557600080fd5b506001600160a01b038135169060200135611234565b34801561072757600080fd5b506103fe61130c565b34801561073c57600080fd5b506105c16004803603602081101561075357600080fd5b81019060208101813564010000000081111561076e57600080fd5b82018360208201111561078057600080fd5b803590602001918460208302840111640100000000831117156107a257600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611312945050505050565b3480156107ec57600080fd5b506103fe6113bd565b34801561080157600080fd5b506105c16004803603602081101561081857600080fd5b50351515611485565b34801561082d57600080fd5b506103fe6114f2565b34801561084257600080fd5b506103fe6114f8565b34801561085757600080fd5b506106be611537565b34801561086c57600080fd5b506103fe611541565b34801561088157600080fd5b506103fe611547565b34801561089657600080fd5b506105c1600480360360208110156108ad57600080fd5b503561154d565b3480156108c057600080fd5b506103fe6115a5565b3480156108d557600080fd5b506103fe6115ab565b3480156108ea57600080fd5b506103fe6115b1565b3480156108ff57600080fd5b506103fe6004803603602081101561091657600080fd5b50356001600160a01b03166115b7565b34801561093257600080fd5b506105c1611653565b34801561094757600080fd5b506105c16004803603602081101561095e57600080fd5b50351515611705565b34801561097357600080fd5b506103fe61176b565b34801561098857600080fd5b506105c16004803603602081101561099f57600080fd5b50356001600160a01b0316611771565b3480156109bb57600080fd5b506105c1600480360360208110156109d257600080fd5b50356001600160a01b03166117d6565b3480156109ee57600080fd5b506103fe60048036036020811015610a0557600080fd5b50356001600160a01b0316611891565b348015610a2157600080fd5b506104256118c2565b348015610a3657600080fd5b50610a5d60048036036020811015610a4d57600080fd5b50356001600160a01b03166118d0565b604080516001600160a01b0390971687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b348015610aa657600080fd5b506105c160048036036020811015610abd57600080fd5b5035151561195c565b348015610ad257600080fd5b506106be6119c2565b348015610ae757600080fd5b506103fe6119d7565b348015610afc57600080fd5b5061044e611a30565b348015610b1157600080fd5b5061042560048036036020811015610b2857600080fd5b50356001600160a01b0316611a3a565b348015610b4457600080fd5b506103fe611a4f565b348015610b5957600080fd5b506105c160048036036040811015610b7057600080fd5b810190602081018135640100000000811115610b8b57600080fd5b820183602082011115610b9d57600080fd5b80359060200191846020830284011164010000000083111715610bbf57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505091359250611a55915050565b348015610c0b57600080fd5b5061042560048036036040811015610c2257600080fd5b506001600160a01b038135169060200135611ad8565b348015610c4457600080fd5b5061042560048036036040811015610c5b57600080fd5b506001600160a01b038135169060200135611b27565b348015610c7d57600080fd5b50610425611b34565b348015610c9257600080fd5b506103fe611b44565b348015610ca757600080fd5b5061042560048036036020811015610cbe57600080fd5b50356001600160a01b0316611b4a565b348015610cda57600080fd5b506103fe60048036036020811015610cf157600080fd5b50356001600160a01b0316611b68565b348015610d0d57600080fd5b506105c160048036036020811015610d2457600080fd5b50356001600160a01b0316611b7a565b348015610d4057600080fd5b50610d6f60048036036040811015610d5757600080fd5b506001600160a01b0381358116916020013516611c4c565b60408051938452602084019290925282820152519081900360600190f35b348015610d9957600080fd5b506103fe60048036036020811015610db057600080fd5b50356001600160a01b0316611dba565b348015610dcc57600080fd5b50610dd5611dcc565b6040805163ffffffff9092168252519081900360200190f35b348015610dfa57600080fd5b50610425611ddf565b348015610e0f57600080fd5b506106be611dee565b348015610e2457600080fd5b506103fe611e04565b348015610e3957600080fd5b506105c1600480360360c0811015610e5057600080fd5b5080359060208101359060408101359060608101359060808101359060a00135611e0a565b348015610e8157600080fd5b506105c160048036036020811015610e9857600080fd5b50356001600160a01b0316611e7a565b348015610eb457600080fd5b506105c160048036036020811015610ecb57600080fd5b50356001600160a01b0316611f38565b348015610ee757600080fd5b506103fe60048036036040811015610efe57600080fd5b506001600160a01b038135811691602001351661207b565b348015610f2257600080fd5b506103fe6120a6565b348015610f3757600080fd5b506105c16120ac565b348015610f4c57600080fd5b506105c160048036036020811015610f6357600080fd5b503515156121ab565b348015610f7857600080fd5b506105c160048036036020811015610f8f57600080fd5b50356001600160a01b031661221a565b348015610fab57600080fd5b506103fe612329565b60495481565b60535460ff1681565b6060610fcd612627565b90505b90565b6000610fe033848461265e565b5060015b92915050565b600c5490565b6011546201000090046001600160a01b03163314611043576040805162461bcd60e51b81526020600482018190526024820152600080516020614511833981519152604482015290519081900360640190fd5b60005b815181101561109b5760006044600084848151811061106157fe5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055600101611046565b5050565b604b5481565b60006110b2848484612743565b61110484336110ff856040518060600160405280602881526020016144e9602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190613063565b61265e565b5060015b9392505050565b60465481565b60545481565b6000610fcd6130fa565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610fe09185906110ff9086612573565b6000610fcd6125cd565b600f546001600160a01b031633146111b2576040805162461bcd60e51b815260206004820152600b60248201526a6e6f742070726573616c6560a81b604482015290519081900360640190fd5b600e54600160a01b900460ff1615611200576040805162461bcd60e51b815260206004820152600c60248201526b283932b9b0b6329037bb32b960a11b604482015290519081900360640190fd5b600e54600160a01b900460ff161561121757600080fd5b600e805460ff60a01b1916600160a01b1790556112326130ff565b565b600f546001600160a01b03163314611281576040805162461bcd60e51b815260206004820152600b60248201526a6e6f742070726573616c6560a81b604482015290519081900360640190fd5b600e54600160a01b900460ff16156112cf576040805162461bcd60e51b815260206004820152600c60248201526b283932b9b0b6329037bb32b960a11b604482015290519081900360640190fd5b6112d98282613515565b6040805182815290516001600160a01b038416916000916000805160206145318339815191529181900360200190a35050565b60515481565b6011546201000090046001600160a01b03163314611365576040805162461bcd60e51b81526020600482018190526024820152600080516020614511833981519152604482015290519081900360640190fd5b60005b815181101561109b5760016044600084848151811061138357fe5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055600101611368565b6000806000806113e1605360039054906101000a90046001600160a01b0316613582565b6053549295509093509150600160c01b810463ffffffff16820390600090600160b81b900460ff166114135784611415565b835b905061141f6143d3565b60405180602001604052808463ffffffff1660545485038161143d57fe5b046001600160e01b0316815250905061146661146182670de0b6b3a7640000613751565b6137cf565b71ffffffffffffffffffffffffffffffffffff16965050505050505090565b6011546201000090046001600160a01b031633146114d8576040805162461bcd60e51b81526020600482018190526024820152600080516020614511833981519152604482015290519081900360640190fd5b605380549115156101000261ff0019909216919091179055565b604a5481565b600e54600090600160a01b900460ff161561152357600c54600b5461151c916125e5565b9050610fd0565b61151c61152e61232f565b600b54906125e5565b6000610fcd612502565b604c5481565b60555481565b6011546201000090046001600160a01b031633146115a0576040805162461bcd60e51b81526020600482018190526024820152600080516020614511833981519152604482015290519081900360640190fd5b605655565b604d5481565b60475481565b60505481565b6000806115c26114f8565b6001600160a01b03841660009081526009602052604090205490915060ff1615611627576001600160a01b038316600090815260086020908152604080832054918390529091205461161f91839161161991612573565b906125e5565b91505061164e565b6001600160a01b03831660009081526020819052604090205461164a90826125e5565b9150505b919050565b6011546201000090046001600160a01b031633146116a6576040805162461bcd60e51b81526020600482018190526024820152600080516020614511833981519152604482015290519081900360640190fd5b6011546040516000916201000090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a36011805475ffffffffffffffffffffffffffffffffffffffff000019169055565b61170e33611b4a565b61174d576040805162461bcd60e51b815260206004820152600b60248201526a6e6f74207461786c65737360a81b604482015290519081900360640190fd5b600f8054911515600160a81b0260ff60a81b19909216919091179055565b604e5481565b6001600160a01b0380821660009081526003602052604081205490918291829161179d91869116611c4c565b6001600160a01b039096166000908152600360208190526040909120908101969096556001860191909155600290940193909355505050565b6011546201000090046001600160a01b03163314611829576040805162461bcd60e51b81526020600482018190526024820152600080516020614511833981519152604482015290519081900360640190fd5b61183281611b4a565b611870576040805162461bcd60e51b815260206004820152600a6024820152693737ba1039b2ba3a32b960b11b604482015290519081900360640190fd5b6001600160a01b03166000908152601060205260409020805460ff19169055565b60008061189c6114f8565b6001600160a01b03841660009081526020819052604090205490915061164a90826125e5565b605354610100900460ff1681565b6000806000806000806118e16143e5565b505050506001600160a01b03938416600090815260036020818152604092839020835160c0810185528154909816808952600182015492890183905260028201549489018590529281015460608901819052600482015460808a0181905260059092015460a090990189905292989197939650919450909250565b6011546201000090046001600160a01b031633146119af576040805162461bcd60e51b81526020600482018190526024820152600080516020614511833981519152604482015290519081900360640190fd5b6053805460ff1916911515919091179055565b6011546201000090046001600160a01b031690565b6000806119e26114f8565b600e54909150611a2a906119fe906001600160a01b03166115b7565b611a24611a0a306115b7565b600a54611a2490611a1b90876125e5565b600c54906137d6565b906137d6565b91505090565b6060610fcd613818565b60446020526000908152604090205460ff1681565b60525481565b60005b8251811015611ad357611a7f33848381518110611a7157fe5b602002602001015184613835565b828181518110611a8b57fe5b60200260200101516001600160a01b0316336001600160a01b0316600080516020614531833981519152846040518082815260200191505060405180910390a3600101611a58565b505050565b6000610fe033846110ff856040518060600160405280602581526020016145bd602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190613063565b6000610fe0338484612743565b605354600160b81b900460ff1681565b60565481565b6001600160a01b031660009081526010602052604090205460ff1690565b60436020526000908152604090205481565b6011546201000090046001600160a01b03163314611bcd576040805162461bcd60e51b81526020600482018190526024820152600080516020614511833981519152604482015290519081900360640190fd5b611bd681611b4a565b15611c28576040805162461bcd60e51b815260206004820152600e60248201527f616c726561647920736574746572000000000000000000000000000000000000604482015290519081900360640190fd5b6001600160a01b03166000908152601060205260409020805460ff19166001179055565b600080600080856001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611c8b57600080fd5b505afa158015611c9f573d6000803e3d6000fd5b505050506040513d6020811015611cb557600080fd5b5051604080516370a0823160e01b81526001600160a01b0389166004820152905191925060009130916370a08231916024808301926020929190829003018186803b158015611d0357600080fd5b505afa158015611d17573d6000803e3d6000fd5b505050506040513d6020811015611d2d57600080fd5b5051604080516370a0823160e01b81526001600160a01b038a811660048301529151929350600092918916916370a0823191602480820192602092909190829003018186803b158015611d7f57600080fd5b505afa158015611d93573d6000803e3d6000fd5b505050506040513d6020811015611da957600080fd5b505191989197509195509350505050565b60456020526000908152604090205481565b605354600160c01b900463ffffffff1681565b60535462010000900460ff1681565b605354630100000090046001600160a01b031681565b60555490565b6011546201000090046001600160a01b03163314611e5d576040805162461bcd60e51b81526020600482018190526024820152600080516020614511833981519152604482015290519081900360640190fd5b604795909555604893909355604991909155604a55604b55604c55565b6011546201000090046001600160a01b03163314611ecd576040805162461bcd60e51b81526020600482018190526024820152600080516020614511833981519152604482015290519081900360640190fd5b600e54600160a01b900460ff1615611f2c576040805162461bcd60e51b815260206004820152601c60248201527f50726573616c6520697320616c726561647920636f6d706c6574656400000000604482015290519081900360640190fd5b611f35816138c0565b50565b6011546201000090046001600160a01b03163314611f8b576040805162461bcd60e51b81526020600482018190526024820152600080516020614511833981519152604482015290519081900360640190fd5b600f805460ff60a81b1916600160a81b179055600e80546001600160a01b039081166000908152601060205260408120805460ff191690559154611fcf91166115b7565b9050801561202257600e54611fee906001600160a01b03168383612743565b600e546040805183815290516001600160a01b03808616931691600080516020614531833981519152919081900360200190a35b600e80546001600160a01b0319166001600160a01b038481169182178355600091825260106020526040909120805460ff19166001179055905461206a91163060001961265e565b5050600f805460ff60a81b19169055565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b604f5481565b605354600160c01b900463ffffffff161561210e576040805162461bcd60e51b815260206004820152601860248201527f7477617020616c726561647920696e697469616c697a65640000000000000000604482015290519081900360640190fd5b60535460009061212d90630100000090046001600160a01b03166115b7565b1161213757600080fd5b600080600061215a605360039054906101000a90046001600160a01b0316613582565b9250925092506000605360179054906101000a900460ff1661217c578361217e565b825b6053805463ffffffff909416600160c01b0263ffffffff60c01b1990941693909317909255506054555050565b6011546201000090046001600160a01b031633146121fe576040805162461bcd60e51b81526020600482018190526024820152600080516020614511833981519152604482015290519081900360640190fd5b60538054911515620100000262ff000019909216919091179055565b6011546201000090046001600160a01b0316331461226d576040805162461bcd60e51b81526020600482018190526024820152600080516020614511833981519152604482015290519081900360640190fd5b6001600160a01b0381166122b25760405162461bcd60e51b815260040180806020018281038252602681526020018061445b6026913960400191505060405180910390fd5b6011546040516001600160a01b038084169262010000900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3601180546001600160a01b03909216620100000275ffffffffffffffffffffffffffffffffffffffff000019909216919091179055565b60485481565b690202fefbf2d7c2f0000090565b69010cc04c84ca8b6fffff1990565b600080826001600160a01b0316846001600160a01b031614156123a05760405162461bcd60e51b81526004018080602001828103825260258152602001806144a36025913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b0316106123c05782846123c3565b83835b90925090506001600160a01b038216612423576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a205a45524f5f414444524553530000604482015290519081900360640190fd5b9250929050565b6000806000612439858561234c565b604080516bffffffffffffffffffffffff19606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501207fff0000000000000000000000000000000000000000000000000000000000000060688401529a90941b9093166069840152607d8301989098527f96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b737a250d5630b4cf539739df2c5dacb4c659f2488d90565b60008261252957506000610fe4565b8282028284828161253657fe5b04146111085760405162461bcd60e51b81526004018080602001828103825260218152602001806144c86021913960400191505060405180910390fd5b600082820183811015611108576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f90565b600061110883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506138e2565b60408051808201909152601081527f6778732d70726f746f636f6c2e6e657400000000000000000000000000000000602082015290565b6001600160a01b0383166126a35760405162461bcd60e51b81526004018080602001828103825260248152602001806145996024913960400191505060405180910390fd5b6001600160a01b0382166126e85760405162461bcd60e51b81526004018080602001828103825260228152602001806144816022913960400191505060405180910390fd5b6126f3838383613947565b816001600160a01b0316836001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b6001600160a01b0383166127885760405162461bcd60e51b81526004018080602001828103825260258152602001806145516025913960400191505060405180910390fd5b6001600160a01b0382166127cd5760405162461bcd60e51b81526004018080602001828103825260238152602001806144386023913960400191505060405180910390fd5b60008111612822576040805162461bcd60e51b815260206004820181905260248201527f416d6f756e74206d7573742062652067726561746572207468616e207a65726f604482015290519081900360640190fd5b61282b836115b7565b81111561287f576040805162461bcd60e51b815260206004820152601660248201527f416d6f756e7420657863656564732062616c616e636500000000000000000000604482015290519081900360640190fd5b61288883611891565b8111156128dc576040805162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206578636565647320756e6c6f636b65642062616c616e636500604482015290519081900360640190fd5b600e54600160a01b900460ff1661293a576040805162461bcd60e51b815260206004820152601460248201527f50726573616c652079657420746f20636c6f7365000000000000000000000000604482015290519081900360640190fd5b60005a90506000846001600160a01b03166129536119c2565b6001600160a01b0316141580156129835750836001600160a01b03166129776119c2565b6001600160a01b031614155b8015612992575060575460ff16155b605354909150600090600160c01b900463ffffffff161580156129d157506053546000906129cf90630100000090046001600160a01b03166115b7565b115b156129de576129de6120ac565b60535462010000900460ff168015612a0e57506001600160a01b03861660009081526044602052604090205460ff165b15612a4c576040805162461bcd60e51b815260206004820152600960248201526811d614ce881a1bdb1960ba1b604482015290519081900360640190fd5b6001600160a01b038616301415612a7057612a68868686613835565b505050611ad3565b605354610100900460ff1615612b61576053546001600160a01b038781166301000000909204161415612ad05760515415612acb57605180546000190190556001600160a01b03851660009081526045602052604090204290555b612b61565b6053546001600160a01b03868116630100000090920416148015612b0f57506052546001600160a01b0387166000908152604560205260409020544203105b15612b61576040805162461bcd60e51b815260206004820152600e60248201527f4758533a20746f6f20717569636b000000000000000000000000000000000000604482015290519081900360640190fd5b60535460ff168015612b8757506053546001600160a01b03878116630100000090920416145b15612bdd5760505484612b99876115b7565b011115612bdd576040805162461bcd60e51b815260206004820152600d60248201526c08eb0a67440e8dede40daeac6d609b1b604482015290519081900360640190fd5b60575460ff16158015612c0557506053546001600160a01b0387811663010000009092041614155b8015612c165750604e54604d544203115b8015612c375750604f54600e54612c35906001600160a01b03166115b7565b115b15612c4b575042604d556001612c4b613973565b612c5f612c56613be0565b60065490612573565b421115612c6e57612c6e613be6565b6000612c786114f8565b600f54909150600090600160a81b900460ff1680612cae5750612c996119c2565b6001600160a01b0316886001600160a01b0316145b15612cbb57506003612d3f565b6001600160a01b03881660009081526004602052604081205460ff1615612cec57612ce589613d20565b9050612d30565b6001600160a01b03881660009081526004602052604090205460ff1615612d1b57612d1688611771565b612d30565b600554612d30906001600160a01b0316611771565b612d3b898983613d8b565b9150505b8060011415612e74576000806000612d578b8a613df3565b919450925090506000612d7060646116198c600461251a565b90506000612d7e8b836137d6565b9050612d8b8d8d83613835565b612d9f84612d998488612573565b90612573565b9150612dcf612dae838961251a565b600e546001600160a01b031660009081526020819052604090205490612573565b600e546001600160a01b0316600090815260208190526040902055600c54612df79084612573565b600c819055508b6001600160a01b03168d6001600160a01b0316600080516020614531833981519152836040518082815260200191505060405180910390a3600e546040805184815290516001600160a01b0390921691600091600080516020614531833981519152919081900360200190a35050505050612fea565b8060021415612f9c57600080612e8a8989613e18565b91509150600080612e9a8a613e54565b90925090506000612eaf83611a248d886137d6565b9050612ebc8d8d83613835565b600e546001600160a01b0316600090815260208190526040902054612ee19083612573565b600e546001600160a01b0316600090815260208190526040902055600c54612f0990866137d6565b600c55600b54612f1990856137d6565b600b819055508b6001600160a01b03168d6001600160a01b0316600080516020614531833981519152836040518082815260200191505060405180910390a360006001600160a01b03168d6001600160a01b0316600080516020614531833981519152876040518082815260200191505060405180910390a35050505050612fea565b8060031415612fea57612fb0888888613835565b866001600160a01b0316886001600160a01b0316600080516020614531833981519152886040518082815260200191505060405180910390a35b60575460ff161580156130165750876001600160a01b031661300a6119c2565b6001600160a01b031614155b8015613020575082155b1561305957613030888888613e8d565b1561304f5760006130425a87906137d6565b905061304d81613f27565b505b613057613ff5565b505b5050505050505050565b600081848411156130f25760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156130b757818101518382015260200161309f565b50505050905090810190601f1680156130e45780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b601290565b6011546201000090046001600160a01b03163314613152576040805162461bcd60e51b81526020600482018190526024820152600080516020614511833981519152604482015290519081900360640190fd5b600f805460ff60a81b1916600160a81b179055600061316f611537565b9050600061317b61115b565b90506000806001600160a01b0316826001600160a01b031663e6a43905856001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156131d157600080fd5b505afa1580156131e5573d6000803e3d6000fd5b505050506040513d60208110156131fb57600080fd5b5051604080516001600160e01b031960e085901b1681526001600160a01b039092166004830152306024830152516044808301926020929190829003018186803b15801561324857600080fd5b505afa15801561325c573d6000803e3d6000fd5b505050506040513d602081101561327257600080fd5b50516001600160a01b0316141561337757816001600160a01b031663c9c65396846001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156132cb57600080fd5b505afa1580156132df573d6000803e3d6000fd5b505050506040513d60208110156132f557600080fd5b5051604080516001600160e01b031960e085901b1681526001600160a01b0390921660048301523060248301525160448083019260209291908290030181600087803b15801561334457600080fd5b505af1158015613358573d6000803e3d6000fd5b505050506040513d602081101561336e57600080fd5b50519050613469565b816001600160a01b031663e6a4390530856001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156133c057600080fd5b505afa1580156133d4573d6000803e3d6000fd5b505050506040513d60208110156133ea57600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b039384166004820152929091166024830152516044808301926020929190829003018186803b15801561343a57600080fd5b505afa15801561344e573d6000803e3d6000fd5b505050506040513d602081101561346457600080fd5b505190505b613476338460001961265e565b6134e481846001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156134b357600080fd5b505afa1580156134c7573d6000803e3d6000fd5b505050506040513d60208110156134dd57600080fd5b505161418d565b600580546001600160a01b0319166001600160a01b03929092169190911790555050600f805460ff60a81b19169055565b600061351f6114f8565b9050600061352d838361251a565b6001600160a01b0385166000908152602081905260409020549091506135539082612573565b6001600160a01b038516600090815260208190526040902055600c546135799084612573565b600c5550505050565b600080600061358f6142fa565b9050836001600160a01b0316635909c0d56040518163ffffffff1660e01b815260040160206040518083038186803b1580156135ca57600080fd5b505afa1580156135de573d6000803e3d6000fd5b505050506040513d60208110156135f457600080fd5b505160408051635a3d549360e01b815290519194506001600160a01b03861691635a3d549391600480820192602092909190829003018186803b15801561363a57600080fd5b505afa15801561364e573d6000803e3d6000fd5b505050506040513d602081101561366457600080fd5b505160408051630240bc6b60e21b81529051919350600091829182916001600160a01b03891691630902f1ac916004808301926060929190829003018186803b1580156136b057600080fd5b505afa1580156136c4573d6000803e3d6000fd5b505050506040513d60608110156136da57600080fd5b5080516020820151604090920151909450909250905063ffffffff808216908516146137475780840363ffffffff81166137148486614304565b516001600160e01b031602969096019563ffffffff81166137358585614304565b516001600160e01b0316029590950194505b5050509193909250565b613759614424565b600082158061377f57505082516001600160e01b03168281029083828161377c57fe5b04145b6137ba5760405162461bcd60e51b81526004018080602001828103825260238152602001806145766023913960400191505060405180910390fd5b60408051602081019091529081529392505050565b5160701c90565b600061110883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613063565b60408051808201909152600381526247585360e81b602082015290565b6000613849826138436114f8565b9061251a565b6001600160a01b03851660009081526020819052604090205490915061386f90826137d6565b6001600160a01b03808616600090815260208190526040808220939093559085168152205461389e9082612573565b6001600160a01b03909316600090815260208190526040902092909255505050565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b600081836139315760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156130b757818101518382015260200161309f565b50600083858161393d57fe5b0495945050505050565b6001600160a01b0392831660009081526001602090815260408083209490951682529290925291902055565b6057805460ff19166001179055600e546001600160a01b03166000613997826115b7565b9050806139a5575050613bd4565b6139b0823083613835565b604080516002808252606080830184529260208301908036833701905050905030816000815181106139de57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050613a06611537565b6001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015613a3e57600080fd5b505afa158015613a52573d6000803e3d6000fd5b505050506040513d6020811015613a6857600080fd5b5051815182906001908110613a7957fe5b60200260200101906001600160a01b031690816001600160a01b031681525050613aa1611537565b6001600160a01b031663791ac9478360008430426040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015613b25578181015183820152602001613b0d565b505050509050019650505050505050600060405180830381600087803b158015613b4e57600080fd5b505af1158015613b62573d6000803e3d6000fd5b5047925050508015801590613b7f57506001600160a01b03841615155b15613bcf57613b94600a61161983600761251a565b6040519091506001600160a01b0385169082156108fc029083906000818181858888f19350505050158015613bcd573d6000803e3d6000fd5b505b505050505b6057805460ff19169055565b61384090565b613bee6143cd565b60005b600254811015611f35576003600060028381548110613c0c57fe5b9060005260206000200160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001908152602001600020600101546003600060028481548110613c5f57fe5b60009182526020808320909101546001600160a01b0316835282019290925260400181206004019190915560028054600392919084908110613c9d57fe5b9060005260206000200160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001908152602001600020600201546003600060028481548110613cf057fe5b60009182526020808320909101546001600160a01b03168352820192909252604001902060050155600101613bf1565b6001600160a01b038082166000908152600360205260408120549091829182918291613d4e91879116611c4c565b6001600160a01b03979097166000908152600360208190526040909120908101805490899055600182019390935560020155909410949350505050565b6001600160a01b03831660009081526004602052604081205460029060ff1615613dc6578215613dbd57506003613dc1565b5060015b613deb565b613dce612502565b6001600160a01b0316856001600160a01b03161415613deb575060035b949350505050565b6000808080613e08606461161987600161251a565b6000978897509095509350505050565b6000806000613e256114f8565b90506000613e3a6103e861161987600561251a565b905080613e47818461251a565b9350935050509250929050565b6000806000613e616114f8565b90506000613e75606461161987600561251a565b905080613e82818461251a565b935093505050915091565b6053546000906001600160a01b0385811663010000009092041614613eb457506000611108565b6046546001600160a01b03841660009081526043602052604090205442031015613ee057506000611108565b6000613eea6113bd565b90506000613f048261161986670de0b6b3a764000061251a565b9050604754811015613f1b57600092505050611108565b50600195945050505050565b6057805460ff19166001179055604c5447811115613f4d57613f4a47600a6125e5565b90505b604b54811115613f5c5750604b545b604a54811015613f6c5750613fe8565b604051329082156108fc029083906000818181858888f19350505050158015613f99573d6000803e3d6000fd5b50326000818152604360209081526040918290204290558151928352820183905280517f667ad9c7167aea9bfcff8b321015abb0d8b77cf151a377e09e12b9017f9889fd9281900390910190a1505b506057805460ff19169055565b605354600090600160c01b900463ffffffff1615801561402e575060535461402c90630100000090046001600160a01b03166115b7565b155b1561403b57506000610fd0565b600080600061405e605360039054906101000a90046001600160a01b0316613582565b605354605654939650919450925063ffffffff600160c01b9091048116830391908216111561418157605354600090600160b81b900460ff166140a157846140a3565b835b90506140ad6143d3565b60405180602001604052808463ffffffff166054548503816140cb57fe5b046001600160e01b0316905260548390556053805463ffffffff60c01b1916600160c01b63ffffffff881602179055905061411161146182670de0b6b3a7640000613751565b71ffffffffffffffffffffffffffffffffffff16605581905560545460535460408051928352600160c01b90910463ffffffff1660208301528181019290925290517f9cfe07a59ebb9a772e1fee2abd40b53001de7c2f0b2e713de333f564118c32c4916060908290030190a150505b60555494505050505090565b6001600160a01b03821660009081526004602052604090205460ff16156141fb576040805162461bcd60e51b815260206004820152601e60248201527f5468697320706f6f6c20697320616c726561647920737570706f727465640000604482015290519081900360640190fd5b6001600160a01b0382166000818152600460205260408120805460ff1916600190811790915560028054918201815582527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b031916909217909155808061426c8585611c4c565b6040805160c0810182526001600160a01b0398891681526020808201868152828401868152606084019586526080840197885260a084019687529b8b16600090815260039283905293909320915182546001600160a01b0319169a16999099178155905160018201559751600289015551958701959095555160048601555050905160059092019190915550565b63ffffffff421690565b61430c6143d3565b6000826dffffffffffffffffffffffffffff1611614371576040805162461bcd60e51b815260206004820152601760248201527f4669786564506f696e743a204449565f42595f5a45524f000000000000000000604482015290519081900360640190fd5b6040805160208101909152806dffffffffffffffffffffffffffff84167bffffffffffffffffffffffffffff0000000000000000000000000000607087901b16816143b857fe5b046001600160e01b0316815250905092915050565b42600655565b60408051602081019091526000815290565b6040518060c0016040528060006001600160a01b0316815260200160008152602001600081526020016000815260200160008152602001600081525090565b604051806020016040528060008152509056fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f2061646472657373556e697377617056324c6962726172793a204944454e544943414c5f414444524553534553536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef45524332303a207472616e736665722066726f6d20746865207a65726f20616464726573734669786564506f696e743a204d554c5449504c49434154494f4e5f4f564552464c4f5745524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212200e04555bac8bd6781b7c9f30a9aef594e66eb1f743949c2bbbb9f24dd095fdc664736f6c634300060c003345524332303a20617070726f766520746f20746865207a65726f2061646472657373556e697377617056324c6962726172793a204944454e544943414c5f414444524553534553496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657245524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373

Deployed Bytecode

0x6080604052600436106103dd5760003560e01c80638484ed7e116101fd578063bc3da53511610118578063d09600df116100ab578063dd9c4e8c1161007a578063dd9c4e8c14610f16578063e379c31b14610f2b578063f2c2c32a14610f40578063f2fde38b14610f6c578063fe173b9714610f9f576103e4565b8063d09600df14610e2d578063d5fcc7b614610e75578063db7f521a14610ea8578063dd62ed3e14610edb576103e4565b8063c5700a02116100e7578063c5700a0214610dc0578063c73e029414610dee578063c816841b14610e03578063cfc2d3d214610e18576103e4565b8063bc3da53514610cce578063bef2112414610d01578063bf9a3a1b14610d34578063bfd7928414610d8d576103e4565b80639b19251a11610190578063a9059cbb1161015f578063a9059cbb14610c38578063aaf3a69614610c71578063ab4d125f14610c86578063b6333d8314610c9b576103e4565b80639b19251a14610b055780639ef01cfc14610b38578063a16a317914610b4d578063a457c2d714610bff576103e4565b80638c4056c5116101cc5780638c4056c514610a9a5780638da5cb5b14610ac65780639358928b14610adb57806395d89b4114610af0576103e4565b80638484ed7e146109af57806384955c88146109e2578063886d80cd14610a155780638939878314610a2a576103e4565b806344043b82116102f8578063655cf0431161028b57806370a082311161025a57806370a08231146108f3578063715018a6146109265780637e47d6251461093b5780637eda09511461096757806380c2bbd21461097c576103e4565b8063655cf0431461088a57806365ffe43d146108b457806368ca25c6146108c95780636f68ebae146108de576103e4565b80635184cc43116102c75780635184cc4314610836578063524900b51461084b5780635bc758e2146108605780635f8ee76314610875576103e4565b806344043b82146107305780634539c423146107e0578063493a2714146107f55780634b50af8914610821576103e4565b80632d3e8c93116103705780633e6dfa361161033f5780633e6dfa36146106a95780633eedf63c146106da57806340c10f19146106e2578063428b86171461071b576103e4565b80632d3e8c931461061b5780632f43c1bc14610630578063313ce567146106455780633950935114610670576103e4565b806318160ddd116103ac57806318160ddd146104fc5780631f059ab8146105115780632353464c146105c357806323b872dd146105d8576103e4565b806303db6fc0146103e9578063062876d21461041057806306fdde0314610439578063095ea7b3146104c3576103e4565b366103e457005b600080fd5b3480156103f557600080fd5b506103fe610fb4565b60408051918252519081900360200190f35b34801561041c57600080fd5b50610425610fba565b604080519115158252519081900360200190f35b34801561044557600080fd5b5061044e610fc3565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610488578181015183820152602001610470565b50505050905090810190601f1680156104b55780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104cf57600080fd5b50610425600480360360408110156104e657600080fd5b506001600160a01b038135169060200135610fd3565b34801561050857600080fd5b506103fe610fea565b34801561051d57600080fd5b506105c16004803603602081101561053457600080fd5b81019060208101813564010000000081111561054f57600080fd5b82018360208201111561056157600080fd5b8035906020019184602083028401116401000000008311171561058357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610ff0945050505050565b005b3480156105cf57600080fd5b506103fe61109f565b3480156105e457600080fd5b50610425600480360360608110156105fb57600080fd5b506001600160a01b038135811691602081013590911690604001356110a5565b34801561062757600080fd5b506103fe61110f565b34801561063c57600080fd5b506103fe611115565b34801561065157600080fd5b5061065a61111b565b6040805160ff9092168252519081900360200190f35b34801561067c57600080fd5b506104256004803603604081101561069357600080fd5b506001600160a01b038135169060200135611125565b3480156106b557600080fd5b506106be61115b565b604080516001600160a01b039092168252519081900360200190f35b6105c1611165565b3480156106ee57600080fd5b506105c16004803603604081101561070557600080fd5b506001600160a01b038135169060200135611234565b34801561072757600080fd5b506103fe61130c565b34801561073c57600080fd5b506105c16004803603602081101561075357600080fd5b81019060208101813564010000000081111561076e57600080fd5b82018360208201111561078057600080fd5b803590602001918460208302840111640100000000831117156107a257600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611312945050505050565b3480156107ec57600080fd5b506103fe6113bd565b34801561080157600080fd5b506105c16004803603602081101561081857600080fd5b50351515611485565b34801561082d57600080fd5b506103fe6114f2565b34801561084257600080fd5b506103fe6114f8565b34801561085757600080fd5b506106be611537565b34801561086c57600080fd5b506103fe611541565b34801561088157600080fd5b506103fe611547565b34801561089657600080fd5b506105c1600480360360208110156108ad57600080fd5b503561154d565b3480156108c057600080fd5b506103fe6115a5565b3480156108d557600080fd5b506103fe6115ab565b3480156108ea57600080fd5b506103fe6115b1565b3480156108ff57600080fd5b506103fe6004803603602081101561091657600080fd5b50356001600160a01b03166115b7565b34801561093257600080fd5b506105c1611653565b34801561094757600080fd5b506105c16004803603602081101561095e57600080fd5b50351515611705565b34801561097357600080fd5b506103fe61176b565b34801561098857600080fd5b506105c16004803603602081101561099f57600080fd5b50356001600160a01b0316611771565b3480156109bb57600080fd5b506105c1600480360360208110156109d257600080fd5b50356001600160a01b03166117d6565b3480156109ee57600080fd5b506103fe60048036036020811015610a0557600080fd5b50356001600160a01b0316611891565b348015610a2157600080fd5b506104256118c2565b348015610a3657600080fd5b50610a5d60048036036020811015610a4d57600080fd5b50356001600160a01b03166118d0565b604080516001600160a01b0390971687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b348015610aa657600080fd5b506105c160048036036020811015610abd57600080fd5b5035151561195c565b348015610ad257600080fd5b506106be6119c2565b348015610ae757600080fd5b506103fe6119d7565b348015610afc57600080fd5b5061044e611a30565b348015610b1157600080fd5b5061042560048036036020811015610b2857600080fd5b50356001600160a01b0316611a3a565b348015610b4457600080fd5b506103fe611a4f565b348015610b5957600080fd5b506105c160048036036040811015610b7057600080fd5b810190602081018135640100000000811115610b8b57600080fd5b820183602082011115610b9d57600080fd5b80359060200191846020830284011164010000000083111715610bbf57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505091359250611a55915050565b348015610c0b57600080fd5b5061042560048036036040811015610c2257600080fd5b506001600160a01b038135169060200135611ad8565b348015610c4457600080fd5b5061042560048036036040811015610c5b57600080fd5b506001600160a01b038135169060200135611b27565b348015610c7d57600080fd5b50610425611b34565b348015610c9257600080fd5b506103fe611b44565b348015610ca757600080fd5b5061042560048036036020811015610cbe57600080fd5b50356001600160a01b0316611b4a565b348015610cda57600080fd5b506103fe60048036036020811015610cf157600080fd5b50356001600160a01b0316611b68565b348015610d0d57600080fd5b506105c160048036036020811015610d2457600080fd5b50356001600160a01b0316611b7a565b348015610d4057600080fd5b50610d6f60048036036040811015610d5757600080fd5b506001600160a01b0381358116916020013516611c4c565b60408051938452602084019290925282820152519081900360600190f35b348015610d9957600080fd5b506103fe60048036036020811015610db057600080fd5b50356001600160a01b0316611dba565b348015610dcc57600080fd5b50610dd5611dcc565b6040805163ffffffff9092168252519081900360200190f35b348015610dfa57600080fd5b50610425611ddf565b348015610e0f57600080fd5b506106be611dee565b348015610e2457600080fd5b506103fe611e04565b348015610e3957600080fd5b506105c1600480360360c0811015610e5057600080fd5b5080359060208101359060408101359060608101359060808101359060a00135611e0a565b348015610e8157600080fd5b506105c160048036036020811015610e9857600080fd5b50356001600160a01b0316611e7a565b348015610eb457600080fd5b506105c160048036036020811015610ecb57600080fd5b50356001600160a01b0316611f38565b348015610ee757600080fd5b506103fe60048036036040811015610efe57600080fd5b506001600160a01b038135811691602001351661207b565b348015610f2257600080fd5b506103fe6120a6565b348015610f3757600080fd5b506105c16120ac565b348015610f4c57600080fd5b506105c160048036036020811015610f6357600080fd5b503515156121ab565b348015610f7857600080fd5b506105c160048036036020811015610f8f57600080fd5b50356001600160a01b031661221a565b348015610fab57600080fd5b506103fe612329565b60495481565b60535460ff1681565b6060610fcd612627565b90505b90565b6000610fe033848461265e565b5060015b92915050565b600c5490565b6011546201000090046001600160a01b03163314611043576040805162461bcd60e51b81526020600482018190526024820152600080516020614511833981519152604482015290519081900360640190fd5b60005b815181101561109b5760006044600084848151811061106157fe5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055600101611046565b5050565b604b5481565b60006110b2848484612743565b61110484336110ff856040518060600160405280602881526020016144e9602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190613063565b61265e565b5060015b9392505050565b60465481565b60545481565b6000610fcd6130fa565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610fe09185906110ff9086612573565b6000610fcd6125cd565b600f546001600160a01b031633146111b2576040805162461bcd60e51b815260206004820152600b60248201526a6e6f742070726573616c6560a81b604482015290519081900360640190fd5b600e54600160a01b900460ff1615611200576040805162461bcd60e51b815260206004820152600c60248201526b283932b9b0b6329037bb32b960a11b604482015290519081900360640190fd5b600e54600160a01b900460ff161561121757600080fd5b600e805460ff60a01b1916600160a01b1790556112326130ff565b565b600f546001600160a01b03163314611281576040805162461bcd60e51b815260206004820152600b60248201526a6e6f742070726573616c6560a81b604482015290519081900360640190fd5b600e54600160a01b900460ff16156112cf576040805162461bcd60e51b815260206004820152600c60248201526b283932b9b0b6329037bb32b960a11b604482015290519081900360640190fd5b6112d98282613515565b6040805182815290516001600160a01b038416916000916000805160206145318339815191529181900360200190a35050565b60515481565b6011546201000090046001600160a01b03163314611365576040805162461bcd60e51b81526020600482018190526024820152600080516020614511833981519152604482015290519081900360640190fd5b60005b815181101561109b5760016044600084848151811061138357fe5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055600101611368565b6000806000806113e1605360039054906101000a90046001600160a01b0316613582565b6053549295509093509150600160c01b810463ffffffff16820390600090600160b81b900460ff166114135784611415565b835b905061141f6143d3565b60405180602001604052808463ffffffff1660545485038161143d57fe5b046001600160e01b0316815250905061146661146182670de0b6b3a7640000613751565b6137cf565b71ffffffffffffffffffffffffffffffffffff16965050505050505090565b6011546201000090046001600160a01b031633146114d8576040805162461bcd60e51b81526020600482018190526024820152600080516020614511833981519152604482015290519081900360640190fd5b605380549115156101000261ff0019909216919091179055565b604a5481565b600e54600090600160a01b900460ff161561152357600c54600b5461151c916125e5565b9050610fd0565b61151c61152e61232f565b600b54906125e5565b6000610fcd612502565b604c5481565b60555481565b6011546201000090046001600160a01b031633146115a0576040805162461bcd60e51b81526020600482018190526024820152600080516020614511833981519152604482015290519081900360640190fd5b605655565b604d5481565b60475481565b60505481565b6000806115c26114f8565b6001600160a01b03841660009081526009602052604090205490915060ff1615611627576001600160a01b038316600090815260086020908152604080832054918390529091205461161f91839161161991612573565b906125e5565b91505061164e565b6001600160a01b03831660009081526020819052604090205461164a90826125e5565b9150505b919050565b6011546201000090046001600160a01b031633146116a6576040805162461bcd60e51b81526020600482018190526024820152600080516020614511833981519152604482015290519081900360640190fd5b6011546040516000916201000090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a36011805475ffffffffffffffffffffffffffffffffffffffff000019169055565b61170e33611b4a565b61174d576040805162461bcd60e51b815260206004820152600b60248201526a6e6f74207461786c65737360a81b604482015290519081900360640190fd5b600f8054911515600160a81b0260ff60a81b19909216919091179055565b604e5481565b6001600160a01b0380821660009081526003602052604081205490918291829161179d91869116611c4c565b6001600160a01b039096166000908152600360208190526040909120908101969096556001860191909155600290940193909355505050565b6011546201000090046001600160a01b03163314611829576040805162461bcd60e51b81526020600482018190526024820152600080516020614511833981519152604482015290519081900360640190fd5b61183281611b4a565b611870576040805162461bcd60e51b815260206004820152600a6024820152693737ba1039b2ba3a32b960b11b604482015290519081900360640190fd5b6001600160a01b03166000908152601060205260409020805460ff19169055565b60008061189c6114f8565b6001600160a01b03841660009081526020819052604090205490915061164a90826125e5565b605354610100900460ff1681565b6000806000806000806118e16143e5565b505050506001600160a01b03938416600090815260036020818152604092839020835160c0810185528154909816808952600182015492890183905260028201549489018590529281015460608901819052600482015460808a0181905260059092015460a090990189905292989197939650919450909250565b6011546201000090046001600160a01b031633146119af576040805162461bcd60e51b81526020600482018190526024820152600080516020614511833981519152604482015290519081900360640190fd5b6053805460ff1916911515919091179055565b6011546201000090046001600160a01b031690565b6000806119e26114f8565b600e54909150611a2a906119fe906001600160a01b03166115b7565b611a24611a0a306115b7565b600a54611a2490611a1b90876125e5565b600c54906137d6565b906137d6565b91505090565b6060610fcd613818565b60446020526000908152604090205460ff1681565b60525481565b60005b8251811015611ad357611a7f33848381518110611a7157fe5b602002602001015184613835565b828181518110611a8b57fe5b60200260200101516001600160a01b0316336001600160a01b0316600080516020614531833981519152846040518082815260200191505060405180910390a3600101611a58565b505050565b6000610fe033846110ff856040518060600160405280602581526020016145bd602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190613063565b6000610fe0338484612743565b605354600160b81b900460ff1681565b60565481565b6001600160a01b031660009081526010602052604090205460ff1690565b60436020526000908152604090205481565b6011546201000090046001600160a01b03163314611bcd576040805162461bcd60e51b81526020600482018190526024820152600080516020614511833981519152604482015290519081900360640190fd5b611bd681611b4a565b15611c28576040805162461bcd60e51b815260206004820152600e60248201527f616c726561647920736574746572000000000000000000000000000000000000604482015290519081900360640190fd5b6001600160a01b03166000908152601060205260409020805460ff19166001179055565b600080600080856001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611c8b57600080fd5b505afa158015611c9f573d6000803e3d6000fd5b505050506040513d6020811015611cb557600080fd5b5051604080516370a0823160e01b81526001600160a01b0389166004820152905191925060009130916370a08231916024808301926020929190829003018186803b158015611d0357600080fd5b505afa158015611d17573d6000803e3d6000fd5b505050506040513d6020811015611d2d57600080fd5b5051604080516370a0823160e01b81526001600160a01b038a811660048301529151929350600092918916916370a0823191602480820192602092909190829003018186803b158015611d7f57600080fd5b505afa158015611d93573d6000803e3d6000fd5b505050506040513d6020811015611da957600080fd5b505191989197509195509350505050565b60456020526000908152604090205481565b605354600160c01b900463ffffffff1681565b60535462010000900460ff1681565b605354630100000090046001600160a01b031681565b60555490565b6011546201000090046001600160a01b03163314611e5d576040805162461bcd60e51b81526020600482018190526024820152600080516020614511833981519152604482015290519081900360640190fd5b604795909555604893909355604991909155604a55604b55604c55565b6011546201000090046001600160a01b03163314611ecd576040805162461bcd60e51b81526020600482018190526024820152600080516020614511833981519152604482015290519081900360640190fd5b600e54600160a01b900460ff1615611f2c576040805162461bcd60e51b815260206004820152601c60248201527f50726573616c6520697320616c726561647920636f6d706c6574656400000000604482015290519081900360640190fd5b611f35816138c0565b50565b6011546201000090046001600160a01b03163314611f8b576040805162461bcd60e51b81526020600482018190526024820152600080516020614511833981519152604482015290519081900360640190fd5b600f805460ff60a81b1916600160a81b179055600e80546001600160a01b039081166000908152601060205260408120805460ff191690559154611fcf91166115b7565b9050801561202257600e54611fee906001600160a01b03168383612743565b600e546040805183815290516001600160a01b03808616931691600080516020614531833981519152919081900360200190a35b600e80546001600160a01b0319166001600160a01b038481169182178355600091825260106020526040909120805460ff19166001179055905461206a91163060001961265e565b5050600f805460ff60a81b19169055565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b604f5481565b605354600160c01b900463ffffffff161561210e576040805162461bcd60e51b815260206004820152601860248201527f7477617020616c726561647920696e697469616c697a65640000000000000000604482015290519081900360640190fd5b60535460009061212d90630100000090046001600160a01b03166115b7565b1161213757600080fd5b600080600061215a605360039054906101000a90046001600160a01b0316613582565b9250925092506000605360179054906101000a900460ff1661217c578361217e565b825b6053805463ffffffff909416600160c01b0263ffffffff60c01b1990941693909317909255506054555050565b6011546201000090046001600160a01b031633146121fe576040805162461bcd60e51b81526020600482018190526024820152600080516020614511833981519152604482015290519081900360640190fd5b60538054911515620100000262ff000019909216919091179055565b6011546201000090046001600160a01b0316331461226d576040805162461bcd60e51b81526020600482018190526024820152600080516020614511833981519152604482015290519081900360640190fd5b6001600160a01b0381166122b25760405162461bcd60e51b815260040180806020018281038252602681526020018061445b6026913960400191505060405180910390fd5b6011546040516001600160a01b038084169262010000900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3601180546001600160a01b03909216620100000275ffffffffffffffffffffffffffffffffffffffff000019909216919091179055565b60485481565b690202fefbf2d7c2f0000090565b69010cc04c84ca8b6fffff1990565b600080826001600160a01b0316846001600160a01b031614156123a05760405162461bcd60e51b81526004018080602001828103825260258152602001806144a36025913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b0316106123c05782846123c3565b83835b90925090506001600160a01b038216612423576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a205a45524f5f414444524553530000604482015290519081900360640190fd5b9250929050565b6000806000612439858561234c565b604080516bffffffffffffffffffffffff19606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501207fff0000000000000000000000000000000000000000000000000000000000000060688401529a90941b9093166069840152607d8301989098527f96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b737a250d5630b4cf539739df2c5dacb4c659f2488d90565b60008261252957506000610fe4565b8282028284828161253657fe5b04146111085760405162461bcd60e51b81526004018080602001828103825260218152602001806144c86021913960400191505060405180910390fd5b600082820183811015611108576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f90565b600061110883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506138e2565b60408051808201909152601081527f6778732d70726f746f636f6c2e6e657400000000000000000000000000000000602082015290565b6001600160a01b0383166126a35760405162461bcd60e51b81526004018080602001828103825260248152602001806145996024913960400191505060405180910390fd5b6001600160a01b0382166126e85760405162461bcd60e51b81526004018080602001828103825260228152602001806144816022913960400191505060405180910390fd5b6126f3838383613947565b816001600160a01b0316836001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b6001600160a01b0383166127885760405162461bcd60e51b81526004018080602001828103825260258152602001806145516025913960400191505060405180910390fd5b6001600160a01b0382166127cd5760405162461bcd60e51b81526004018080602001828103825260238152602001806144386023913960400191505060405180910390fd5b60008111612822576040805162461bcd60e51b815260206004820181905260248201527f416d6f756e74206d7573742062652067726561746572207468616e207a65726f604482015290519081900360640190fd5b61282b836115b7565b81111561287f576040805162461bcd60e51b815260206004820152601660248201527f416d6f756e7420657863656564732062616c616e636500000000000000000000604482015290519081900360640190fd5b61288883611891565b8111156128dc576040805162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206578636565647320756e6c6f636b65642062616c616e636500604482015290519081900360640190fd5b600e54600160a01b900460ff1661293a576040805162461bcd60e51b815260206004820152601460248201527f50726573616c652079657420746f20636c6f7365000000000000000000000000604482015290519081900360640190fd5b60005a90506000846001600160a01b03166129536119c2565b6001600160a01b0316141580156129835750836001600160a01b03166129776119c2565b6001600160a01b031614155b8015612992575060575460ff16155b605354909150600090600160c01b900463ffffffff161580156129d157506053546000906129cf90630100000090046001600160a01b03166115b7565b115b156129de576129de6120ac565b60535462010000900460ff168015612a0e57506001600160a01b03861660009081526044602052604090205460ff165b15612a4c576040805162461bcd60e51b815260206004820152600960248201526811d614ce881a1bdb1960ba1b604482015290519081900360640190fd5b6001600160a01b038616301415612a7057612a68868686613835565b505050611ad3565b605354610100900460ff1615612b61576053546001600160a01b038781166301000000909204161415612ad05760515415612acb57605180546000190190556001600160a01b03851660009081526045602052604090204290555b612b61565b6053546001600160a01b03868116630100000090920416148015612b0f57506052546001600160a01b0387166000908152604560205260409020544203105b15612b61576040805162461bcd60e51b815260206004820152600e60248201527f4758533a20746f6f20717569636b000000000000000000000000000000000000604482015290519081900360640190fd5b60535460ff168015612b8757506053546001600160a01b03878116630100000090920416145b15612bdd5760505484612b99876115b7565b011115612bdd576040805162461bcd60e51b815260206004820152600d60248201526c08eb0a67440e8dede40daeac6d609b1b604482015290519081900360640190fd5b60575460ff16158015612c0557506053546001600160a01b0387811663010000009092041614155b8015612c165750604e54604d544203115b8015612c375750604f54600e54612c35906001600160a01b03166115b7565b115b15612c4b575042604d556001612c4b613973565b612c5f612c56613be0565b60065490612573565b421115612c6e57612c6e613be6565b6000612c786114f8565b600f54909150600090600160a81b900460ff1680612cae5750612c996119c2565b6001600160a01b0316886001600160a01b0316145b15612cbb57506003612d3f565b6001600160a01b03881660009081526004602052604081205460ff1615612cec57612ce589613d20565b9050612d30565b6001600160a01b03881660009081526004602052604090205460ff1615612d1b57612d1688611771565b612d30565b600554612d30906001600160a01b0316611771565b612d3b898983613d8b565b9150505b8060011415612e74576000806000612d578b8a613df3565b919450925090506000612d7060646116198c600461251a565b90506000612d7e8b836137d6565b9050612d8b8d8d83613835565b612d9f84612d998488612573565b90612573565b9150612dcf612dae838961251a565b600e546001600160a01b031660009081526020819052604090205490612573565b600e546001600160a01b0316600090815260208190526040902055600c54612df79084612573565b600c819055508b6001600160a01b03168d6001600160a01b0316600080516020614531833981519152836040518082815260200191505060405180910390a3600e546040805184815290516001600160a01b0390921691600091600080516020614531833981519152919081900360200190a35050505050612fea565b8060021415612f9c57600080612e8a8989613e18565b91509150600080612e9a8a613e54565b90925090506000612eaf83611a248d886137d6565b9050612ebc8d8d83613835565b600e546001600160a01b0316600090815260208190526040902054612ee19083612573565b600e546001600160a01b0316600090815260208190526040902055600c54612f0990866137d6565b600c55600b54612f1990856137d6565b600b819055508b6001600160a01b03168d6001600160a01b0316600080516020614531833981519152836040518082815260200191505060405180910390a360006001600160a01b03168d6001600160a01b0316600080516020614531833981519152876040518082815260200191505060405180910390a35050505050612fea565b8060031415612fea57612fb0888888613835565b866001600160a01b0316886001600160a01b0316600080516020614531833981519152886040518082815260200191505060405180910390a35b60575460ff161580156130165750876001600160a01b031661300a6119c2565b6001600160a01b031614155b8015613020575082155b1561305957613030888888613e8d565b1561304f5760006130425a87906137d6565b905061304d81613f27565b505b613057613ff5565b505b5050505050505050565b600081848411156130f25760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156130b757818101518382015260200161309f565b50505050905090810190601f1680156130e45780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b601290565b6011546201000090046001600160a01b03163314613152576040805162461bcd60e51b81526020600482018190526024820152600080516020614511833981519152604482015290519081900360640190fd5b600f805460ff60a81b1916600160a81b179055600061316f611537565b9050600061317b61115b565b90506000806001600160a01b0316826001600160a01b031663e6a43905856001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156131d157600080fd5b505afa1580156131e5573d6000803e3d6000fd5b505050506040513d60208110156131fb57600080fd5b5051604080516001600160e01b031960e085901b1681526001600160a01b039092166004830152306024830152516044808301926020929190829003018186803b15801561324857600080fd5b505afa15801561325c573d6000803e3d6000fd5b505050506040513d602081101561327257600080fd5b50516001600160a01b0316141561337757816001600160a01b031663c9c65396846001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156132cb57600080fd5b505afa1580156132df573d6000803e3d6000fd5b505050506040513d60208110156132f557600080fd5b5051604080516001600160e01b031960e085901b1681526001600160a01b0390921660048301523060248301525160448083019260209291908290030181600087803b15801561334457600080fd5b505af1158015613358573d6000803e3d6000fd5b505050506040513d602081101561336e57600080fd5b50519050613469565b816001600160a01b031663e6a4390530856001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156133c057600080fd5b505afa1580156133d4573d6000803e3d6000fd5b505050506040513d60208110156133ea57600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b039384166004820152929091166024830152516044808301926020929190829003018186803b15801561343a57600080fd5b505afa15801561344e573d6000803e3d6000fd5b505050506040513d602081101561346457600080fd5b505190505b613476338460001961265e565b6134e481846001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156134b357600080fd5b505afa1580156134c7573d6000803e3d6000fd5b505050506040513d60208110156134dd57600080fd5b505161418d565b600580546001600160a01b0319166001600160a01b03929092169190911790555050600f805460ff60a81b19169055565b600061351f6114f8565b9050600061352d838361251a565b6001600160a01b0385166000908152602081905260409020549091506135539082612573565b6001600160a01b038516600090815260208190526040902055600c546135799084612573565b600c5550505050565b600080600061358f6142fa565b9050836001600160a01b0316635909c0d56040518163ffffffff1660e01b815260040160206040518083038186803b1580156135ca57600080fd5b505afa1580156135de573d6000803e3d6000fd5b505050506040513d60208110156135f457600080fd5b505160408051635a3d549360e01b815290519194506001600160a01b03861691635a3d549391600480820192602092909190829003018186803b15801561363a57600080fd5b505afa15801561364e573d6000803e3d6000fd5b505050506040513d602081101561366457600080fd5b505160408051630240bc6b60e21b81529051919350600091829182916001600160a01b03891691630902f1ac916004808301926060929190829003018186803b1580156136b057600080fd5b505afa1580156136c4573d6000803e3d6000fd5b505050506040513d60608110156136da57600080fd5b5080516020820151604090920151909450909250905063ffffffff808216908516146137475780840363ffffffff81166137148486614304565b516001600160e01b031602969096019563ffffffff81166137358585614304565b516001600160e01b0316029590950194505b5050509193909250565b613759614424565b600082158061377f57505082516001600160e01b03168281029083828161377c57fe5b04145b6137ba5760405162461bcd60e51b81526004018080602001828103825260238152602001806145766023913960400191505060405180910390fd5b60408051602081019091529081529392505050565b5160701c90565b600061110883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613063565b60408051808201909152600381526247585360e81b602082015290565b6000613849826138436114f8565b9061251a565b6001600160a01b03851660009081526020819052604090205490915061386f90826137d6565b6001600160a01b03808616600090815260208190526040808220939093559085168152205461389e9082612573565b6001600160a01b03909316600090815260208190526040902092909255505050565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b600081836139315760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156130b757818101518382015260200161309f565b50600083858161393d57fe5b0495945050505050565b6001600160a01b0392831660009081526001602090815260408083209490951682529290925291902055565b6057805460ff19166001179055600e546001600160a01b03166000613997826115b7565b9050806139a5575050613bd4565b6139b0823083613835565b604080516002808252606080830184529260208301908036833701905050905030816000815181106139de57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050613a06611537565b6001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015613a3e57600080fd5b505afa158015613a52573d6000803e3d6000fd5b505050506040513d6020811015613a6857600080fd5b5051815182906001908110613a7957fe5b60200260200101906001600160a01b031690816001600160a01b031681525050613aa1611537565b6001600160a01b031663791ac9478360008430426040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015613b25578181015183820152602001613b0d565b505050509050019650505050505050600060405180830381600087803b158015613b4e57600080fd5b505af1158015613b62573d6000803e3d6000fd5b5047925050508015801590613b7f57506001600160a01b03841615155b15613bcf57613b94600a61161983600761251a565b6040519091506001600160a01b0385169082156108fc029083906000818181858888f19350505050158015613bcd573d6000803e3d6000fd5b505b505050505b6057805460ff19169055565b61384090565b613bee6143cd565b60005b600254811015611f35576003600060028381548110613c0c57fe5b9060005260206000200160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001908152602001600020600101546003600060028481548110613c5f57fe5b60009182526020808320909101546001600160a01b0316835282019290925260400181206004019190915560028054600392919084908110613c9d57fe5b9060005260206000200160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001908152602001600020600201546003600060028481548110613cf057fe5b60009182526020808320909101546001600160a01b03168352820192909252604001902060050155600101613bf1565b6001600160a01b038082166000908152600360205260408120549091829182918291613d4e91879116611c4c565b6001600160a01b03979097166000908152600360208190526040909120908101805490899055600182019390935560020155909410949350505050565b6001600160a01b03831660009081526004602052604081205460029060ff1615613dc6578215613dbd57506003613dc1565b5060015b613deb565b613dce612502565b6001600160a01b0316856001600160a01b03161415613deb575060035b949350505050565b6000808080613e08606461161987600161251a565b6000978897509095509350505050565b6000806000613e256114f8565b90506000613e3a6103e861161987600561251a565b905080613e47818461251a565b9350935050509250929050565b6000806000613e616114f8565b90506000613e75606461161987600561251a565b905080613e82818461251a565b935093505050915091565b6053546000906001600160a01b0385811663010000009092041614613eb457506000611108565b6046546001600160a01b03841660009081526043602052604090205442031015613ee057506000611108565b6000613eea6113bd565b90506000613f048261161986670de0b6b3a764000061251a565b9050604754811015613f1b57600092505050611108565b50600195945050505050565b6057805460ff19166001179055604c5447811115613f4d57613f4a47600a6125e5565b90505b604b54811115613f5c5750604b545b604a54811015613f6c5750613fe8565b604051329082156108fc029083906000818181858888f19350505050158015613f99573d6000803e3d6000fd5b50326000818152604360209081526040918290204290558151928352820183905280517f667ad9c7167aea9bfcff8b321015abb0d8b77cf151a377e09e12b9017f9889fd9281900390910190a1505b506057805460ff19169055565b605354600090600160c01b900463ffffffff1615801561402e575060535461402c90630100000090046001600160a01b03166115b7565b155b1561403b57506000610fd0565b600080600061405e605360039054906101000a90046001600160a01b0316613582565b605354605654939650919450925063ffffffff600160c01b9091048116830391908216111561418157605354600090600160b81b900460ff166140a157846140a3565b835b90506140ad6143d3565b60405180602001604052808463ffffffff166054548503816140cb57fe5b046001600160e01b0316905260548390556053805463ffffffff60c01b1916600160c01b63ffffffff881602179055905061411161146182670de0b6b3a7640000613751565b71ffffffffffffffffffffffffffffffffffff16605581905560545460535460408051928352600160c01b90910463ffffffff1660208301528181019290925290517f9cfe07a59ebb9a772e1fee2abd40b53001de7c2f0b2e713de333f564118c32c4916060908290030190a150505b60555494505050505090565b6001600160a01b03821660009081526004602052604090205460ff16156141fb576040805162461bcd60e51b815260206004820152601e60248201527f5468697320706f6f6c20697320616c726561647920737570706f727465640000604482015290519081900360640190fd5b6001600160a01b0382166000818152600460205260408120805460ff1916600190811790915560028054918201815582527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b031916909217909155808061426c8585611c4c565b6040805160c0810182526001600160a01b0398891681526020808201868152828401868152606084019586526080840197885260a084019687529b8b16600090815260039283905293909320915182546001600160a01b0319169a16999099178155905160018201559751600289015551958701959095555160048601555050905160059092019190915550565b63ffffffff421690565b61430c6143d3565b6000826dffffffffffffffffffffffffffff1611614371576040805162461bcd60e51b815260206004820152601760248201527f4669786564506f696e743a204449565f42595f5a45524f000000000000000000604482015290519081900360640190fd5b6040805160208101909152806dffffffffffffffffffffffffffff84167bffffffffffffffffffffffffffff0000000000000000000000000000607087901b16816143b857fe5b046001600160e01b0316815250905092915050565b42600655565b60408051602081019091526000815290565b6040518060c0016040528060006001600160a01b0316815260200160008152602001600081526020016000815260200160008152602001600081525090565b604051806020016040528060008152509056fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f2061646472657373556e697377617056324c6962726172793a204944454e544943414c5f414444524553534553536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef45524332303a207472616e736665722066726f6d20746865207a65726f20616464726573734669786564506f696e743a204d554c5449504c49434154494f4e5f4f564552464c4f5745524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212200e04555bac8bd6781b7c9f30a9aef594e66eb1f743949c2bbbb9f24dd095fdc664736f6c634300060c0033

Deployed Bytecode Sourcemap

47236:20021:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47700:30;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;48119:28;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;49435:97;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50980:159;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;50980:159:0;;;;;;;;:::i;49766:100::-;;;;;;;;;;;;;:::i;66227:200::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;66227:200:0;;-1:-1:-1;66227:200:0;;-1:-1:-1;;;;;66227:200:0:i;:::-;;47782:38;;;;;;;;;;;;;:::i;51147:309::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;51147:309:0;;;;;;;;;;;;;;;;;:::i;47565:41::-;;;;;;;;;;;;;:::i;48459:34::-;;;;;;;;;;;;;:::i;49657:97::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;51464:214;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;51464:214:0;;;;;;;;:::i;15761:139::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;15761:139:0;;;;;;;;;;;;;;58493:150;;;:::i;51959:149::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;51959:149:0;;;;;;;;:::i;48042:27::-;;;;;;;;;;;;;:::i;66023:196::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;66023:196:0;;-1:-1:-1;66023:196:0;;-1:-1:-1;;;;;66023:196:0:i;63808:619::-;;;;;;;;;;;;;:::i;57774:95::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57774:95:0;;;;:::i;47737:38::-;;;;;;;;;;;;;:::i;15906:233::-;;;;;;;;;;;;;:::i;15616:139::-;;;;;;;;;;;;;:::i;47827:38::-;;;;;;;;;;;;;:::i;48543:31::-;;;;;;;;;;;;;:::i;60439:112::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60439:112:0;;:::i;47872:27::-;;;;;;;;;;;;;:::i;47613:42::-;;;;;;;;;;;;;:::i;47994:41::-;;;;;;;;;;;;;:::i;50135:312::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50135:312:0;-1:-1:-1;;;;;50135:312:0;;:::i;31458:148::-;;;;;;;;;;;;;:::i;59606:84::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59606:84:0;;;;:::i;47906:39::-;;;;;;;;;;;;;:::i;39180:369::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39180:369:0;-1:-1:-1;;;;;39180:369:0;;:::i;59698:167::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59698:167:0;-1:-1:-1;;;;;59698:167:0;;:::i;50459:189::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50459:189:0;-1:-1:-1;;;;;50459:189:0;;:::i;48154:29::-;;;;;;;;;;;;;:::i;15176:308::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15176:308:0;-1:-1:-1;;;;;15176:308:0;;:::i;:::-;;;;-1:-1:-1;;;;;15176:308:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57980:89;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57980:89:0;;;;:::i;30818:79::-;;;;;;;;;;;;;:::i;49878:245::-;;;;;;;;;;;;;:::i;49544:101::-;;;;;;;;;;;;;:::i;47463:41::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47463:41:0;-1:-1:-1;;;;;47463:41:0;;:::i;48076:36::-;;;;;;;;;;;;;:::i;65738:277::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;65738:277:0;;-1:-1:-1;;65738:277:0;;;-1:-1:-1;65738:277:0;;-1:-1:-1;;65738:277:0:i;51686:265::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;51686:265:0;;;;;;;;:::i;50656:165::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;50656:165:0;;;;;;;;:::i;48302:24::-;;;;;;;;;;;;;:::i;48624:27::-;;;;;;;;;;;;;:::i;15490:120::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15490:120:0;-1:-1:-1;;;;;15490:120:0;;:::i;47414:42::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47414:42:0;-1:-1:-1;;;;;47414:42:0;;:::i;59430:168::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59430:168:0;-1:-1:-1;;;;;59430:168:0;;:::i;16145:390::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;16145:390:0;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;47511:39;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47511:39:0;-1:-1:-1;;;;;47511:39:0;;:::i;48374:32::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;48190:33;;;;;;;;;;;;;:::i;48238:26::-;;;;;;;;;;;;;:::i;64435:95::-;;;;;;;;;;;;;:::i;58075:410::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58075:410:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;57593:175::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57593:175:0;-1:-1:-1;;;;;57593:175:0;;:::i;59875:478::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59875:478:0;-1:-1:-1;;;;;59875:478:0;;:::i;50829:143::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;50829:143:0;;;;;;;;;;:::i;47952:35::-;;;;;;;;;;;;;:::i;60649:513::-;;;;;;;;;;;;;:::i;57875:99::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57875:99:0;;;;:::i;31761:244::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31761:244:0;-1:-1:-1;;;;;31761:244:0;;:::i;47662:31::-;;;;;;;;;;;;;:::i;47700:30::-;;;;:::o;48119:28::-;;;;;;:::o;49435:97::-;49472:13;49505:19;:17;:19::i;:::-;49498:26;;49435:97;;:::o;50980:159::-;51055:4;51072:37;51081:10;51093:7;51102:6;51072:8;:37::i;:::-;-1:-1:-1;51127:4:0;50980:159;;;;;:::o;49766:100::-;49846:12;;49766:100;:::o;66227:200::-;31030:6;;;;;-1:-1:-1;;;;;31030:6:0;31040:10;31030:20;31022:65;;;;;-1:-1:-1;;;31022:65:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;31022:65:0;;;;;;;;;;;;;;;66320:9:::1;66315:105;66339:9;:16;66335:1;:20;66315:105;;;66403:5;66377:9;:23;66387:9;66397:1;66387:12;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;66377:23:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;66377:23:0;:31;;-1:-1:-1;;66377:31:0::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;66357:3:0::1;66315:105;;;;66227:200:::0;:::o;47782:38::-;;;;:::o;51147:309::-;51245:4;51262:36;51272:6;51280:9;51291:6;51262:9;:36::i;:::-;51309:117;51318:6;51326:10;51338:87;51374:6;51338:87;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;51338:19:0;;;;;;:11;:19;;;;;;;;51358:10;51338:31;;;;;;;;;:87;:35;:87::i;:::-;51309:8;:117::i;:::-;-1:-1:-1;51444:4:0;51147:309;;;;;;:::o;47565:41::-;;;;:::o;48459:34::-;;;;:::o;49657:97::-;49698:5;49723:23;:21;:23::i;51464:214::-;51578:10;51552:4;51599:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;51599:32:0;;;;;;;;;;51552:4;;51569:79;;51590:7;;51599:48;;51636:10;51599:36;:48::i;15761:139::-;15811:17;15866:25;:23;:25::i;58493:150::-;49150:11;;-1:-1:-1;;;;;49150:11:0;49138:10;:23;49130:46;;;;;-1:-1:-1;;;49130:46:0;;;;;;;;;;;;-1:-1:-1;;;49130:46:0;;;;;;;;;;;;;;;49196:12;;-1:-1:-1;;;49196:12:0;;;;49195:13;49187:38;;;;;-1:-1:-1;;;49187:38:0;;;;;;;;;;;;-1:-1:-1;;;49187:38:0;;;;;;;;;;;;;;;58566:12:::1;::::0;-1:-1:-1;;;58566:12:0;::::1;;;58565:13;58557:22;;;::::0;::::1;;58590:12;:19:::0;;-1:-1:-1;;;;58590:19:0::1;-1:-1:-1::0;;;58590:19:0::1;::::0;;58620:15:::1;:13;:15::i;:::-;58493:150::o:0;51959:149::-;49150:11;;-1:-1:-1;;;;;49150:11:0;49138:10;:23;49130:46;;;;;-1:-1:-1;;;49130:46:0;;;;;;;;;;;;-1:-1:-1;;;49130:46:0;;;;;;;;;;;;;;;49196:12;;-1:-1:-1;;;49196:12:0;;;;49195:13;49187:38;;;;;-1:-1:-1;;;49187:38:0;;;;;;;;;;;;-1:-1:-1;;;49187:38:0;;;;;;;;;;;;;;;52031:23:::1;52044:2;52047:6;52031:12;:23::i;:::-;52070:30;::::0;;;;;;;-1:-1:-1;;;;;52070:30:0;::::1;::::0;52087:1:::1;::::0;-1:-1:-1;;;;;;;;;;;52070:30:0;;;;::::1;::::0;;::::1;51959:149:::0;;:::o;48042:27::-;;;;:::o;66023:196::-;31030:6;;;;;-1:-1:-1;;;;;31030:6:0;31040:10;31030:20;31022:65;;;;;-1:-1:-1;;;31022:65:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;31022:65:0;;;;;;;;;;;;;;;66113:9:::1;66108:104;66132:9;:16;66128:1;:20;66108:104;;;66196:4;66170:9;:23;66180:9;66190:1;66180:12;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;66170:23:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;66170:23:0;:30;;-1:-1:-1;;66170:30:0::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;66150:3:0::1;66108:104;;63808:619:::0;63855:7;63876:21;63899;63922;63961:59;64008:11;;;;;;;;;-1:-1:-1;;;;;64008:11:0;63961:46;:59::i;:::-;64069:18;;63875:145;;-1:-1:-1;63875:145:0;;-1:-1:-1;63875:145:0;-1:-1:-1;;;;64069:18:0;;;;64052:35;;;64031:18;;-1:-1:-1;;;64126:12:0;;;;:50;;64160:16;64126:50;;;64141:16;64126:50;64100:76;;64189:40;;:::i;:::-;64232:108;;;;;;;;64317:11;64275:53;;64294:19;;64276:15;:37;64275:53;;;;;;-1:-1:-1;;;;;64232:108:0;;;;64189:151;;64360:59;64381:37;64396:12;64410:7;64381:14;:37::i;:::-;64360:20;:59::i;:::-;64353:66;;;;;;;;;;63808:619;:::o;57774:95::-;31030:6;;;;;-1:-1:-1;;;;;31030:6:0;31040:10;31030:20;31022:65;;;;;-1:-1:-1;;;31022:65:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;31022:65:0;;;;;;;;;;;;;;;57844:10:::1;:17:::0;;;::::1;;;;-1:-1:-1::0;;57844:17:0;;::::1;::::0;;;::::1;::::0;;57774:95::o;47737:38::-;;;;:::o;15906:233::-;15971:12;;15947:7;;-1:-1:-1;;;15971:12:0;;;;15967:165;;;16023:12;;16007:11;;:29;;:15;:29::i;:::-;16000:36;;;;15967:165;16076:44;16092:27;:25;:27::i;:::-;16076:11;;;:15;:44::i;15616:139::-;15665:18;15722:24;:22;:24::i;47827:38::-;;;;:::o;48543:31::-;;;;:::o;60439:112::-;31030:6;;;;;-1:-1:-1;;;;;31030:6:0;31040:10;31030:20;31022:65;;;;;-1:-1:-1;;;31022:65:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;31022:65:0;;;;;;;;;;;;;;;60515:12:::1;:28:::0;60439:112::o;47872:27::-;;;;:::o;47613:42::-;;;;:::o;47994:41::-;;;;:::o;50135:312::-;50201:7;50221:21;50245:11;:9;:11::i;:::-;-1:-1:-1;;;;;50271:26:0;;;;;;:17;:26;;;;;;50221:35;;-1:-1:-1;50271:26:0;;50267:112;;;-1:-1:-1;;;;;50335:23:0;;;;;;:14;:23;;;;;;;;;50307;;;;;;;;:71;;50364:13;;50307:52;;:27;:52::i;:::-;:56;;:71::i;:::-;50299:80;;;;;50267:112;-1:-1:-1;;;;;50397:23:0;;:14;:23;;;;;;;;;;;:42;;50425:13;50397:27;:42::i;:::-;50390:49;;;50135:312;;;;:::o;31458:148::-;31030:6;;;;;-1:-1:-1;;;;;31030:6:0;31040:10;31030:20;31022:65;;;;;-1:-1:-1;;;31022:65:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;31022:65:0;;;;;;;;;;;;;;;31549:6:::1;::::0;31528:40:::1;::::0;31565:1:::1;::::0;31549:6;;::::1;-1:-1:-1::0;;;;;31549:6:0::1;::::0;31528:40:::1;::::0;31565:1;;31528:40:::1;31579:6;:19:::0;;-1:-1:-1;;31579:19:0::1;::::0;;31458:148::o;59606:84::-;49030:27;49046:10;49030:15;:27::i;:::-;49022:50;;;;;-1:-1:-1;;;49022:50:0;;;;;;;;;;;;-1:-1:-1;;;49022:50:0;;;;;;;;;;;;;;;59667:8:::1;:15:::0;;;::::1;;-1:-1:-1::0;;;59667:15:0::1;-1:-1:-1::0;;;;59667:15:0;;::::1;::::0;;;::::1;::::0;;59606:84::o;47906:39::-;;;;:::o;39180:369::-;-1:-1:-1;;;;;39335:19:0;;;39237:20;39335:19;;;:13;:19;;;;;:29;39237:20;;;;;;39306:59;;39329:4;;39335:29;39306:22;:59::i;:::-;-1:-1:-1;;;;;39376:19:0;;;;;;;:13;:19;;;;;;;;:29;;;:41;;;;39428:32;;;:47;;;;-1:-1:-1;39486:36:0;;;:55;;;;-1:-1:-1;;;39180:369:0:o;59698:167::-;31030:6;;;;;-1:-1:-1;;;;;31030:6:0;31040:10;31030:20;31022:65;;;;;-1:-1:-1;;;31022:65:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;31022:65:0;;;;;;;;;;;;;;;59781:21:::1;59797:4;59781:15;:21::i;:::-;59773:43;;;::::0;;-1:-1:-1;;;59773:43:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;59773:43:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;59827:22:0::1;59852:5;59827:22:::0;;;:16:::1;:22;::::0;;;;:30;;-1:-1:-1;;59827:30:0::1;::::0;;59698:167::o;50459:189::-;50524:7;50544:21;50568:11;:9;:11::i;:::-;-1:-1:-1;;;;;50597:23:0;;:14;:23;;;;;;;;;;;50544:35;;-1:-1:-1;50597:42:0;;50544:35;50597:27;:42::i;48154:29::-;;;;;;;;;:::o;15176:308::-;15236:7;15245;15254;15263;15272;15281;15301:21;;:::i;:::-;-1:-1:-1;;;;;;;;;15325:19:0;;;;;;;:13;:19;;;;;;;;;15301:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15301:43:0;;-1:-1:-1;15301:43:0;;-1:-1:-1;15176:308:0:o;57980:89::-;31030:6;;;;;-1:-1:-1;;;;;31030:6:0;31040:10;31030:20;31022:65;;;;;-1:-1:-1;;;31022:65:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;31022:65:0;;;;;;;;;;;;;;;58045:9:::1;:16:::0;;-1:-1:-1;;58045:16:0::1;::::0;::::1;;::::0;;;::::1;::::0;;57980:89::o;30818:79::-;30883:6;;;;;-1:-1:-1;;;;;30883:6:0;;30818:79::o;49878:245::-;49928:7;49948:21;49972:11;:9;:11::i;:::-;50102;;49948:35;;-1:-1:-1;50001:114:0;;50092:22;;-1:-1:-1;;;;;50102:11:0;50092:9;:22::i;:::-;50001:86;50062:24;50080:4;50062:9;:24::i;:::-;50018:19;;50001:56;;50018:38;;50042:13;50018:23;:38::i;:::-;50001:12;;;:16;:56::i;:::-;:60;;:86::i;:114::-;49994:121;;;49878:245;:::o;49544:101::-;49583:13;49616:21;:19;:21::i;47463:41::-;;;;;;;;;;;;;;;:::o;48076:36::-;;;;:::o;65738:277::-;65830:9;65825:183;65849:9;:16;65845:1;:20;65825:183;;;65887:47;65901:10;65913:9;65923:1;65913:12;;;;;;;;;;;;;;65927:6;65887:13;:47::i;:::-;65975:9;65985:1;65975:12;;;;;;;;;;;;;;-1:-1:-1;;;;;65954:42:0;65963:10;-1:-1:-1;;;;;65954:42:0;-1:-1:-1;;;;;;;;;;;65989:6:0;65954:42;;;;;;;;;;;;;;;;;;65867:3;;65825:183;;;;65738:277;;:::o;51686:265::-;51779:4;51796:125;51805:10;51817:7;51826:94;51863:15;51826:94;;;;;;;;;;;;;;;;;51838:10;51826:23;;;;:11;:23;;;;;;;;-1:-1:-1;;;;;51826:32:0;;;;;;;;;;;:94;:36;:94::i;50656:165::-;50734:4;50751:40;50761:10;50773:9;50784:6;50751:9;:40::i;48302:24::-;;;-1:-1:-1;;;48302:24:0;;;;;:::o;48624:27::-;;;;:::o;15490:120::-;-1:-1:-1;;;;;15577:25:0;15553:4;15577:25;;;:16;:25;;;;;;;;;15490:120::o;47414:42::-;;;;;;;;;;;;;:::o;59430:168::-;31030:6;;;;;-1:-1:-1;;;;;31030:6:0;31040:10;31030:20;31022:65;;;;;-1:-1:-1;;;31022:65:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;31022:65:0;;;;;;;;;;;;;;;59511:21:::1;59527:4;59511:15;:21::i;:::-;59510:22;59502:48;;;::::0;;-1:-1:-1;;;59502:48:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;59561:22:0::1;;::::0;;;:16:::1;:22;::::0;;;;:29;;-1:-1:-1;;59561:29:0::1;59586:4;59561:29;::::0;;59430:168::o;16145:390::-;16231:7;16240;16249;16269:17;16296:4;-1:-1:-1;;;;;16289:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16289:26:0;16349:37;;;-1:-1:-1;;;16349:37:0;;-1:-1:-1;;;;;16349:37:0;;;;;;;;16289:26;;-1:-1:-1;16326:20:0;;16364:4;;16349:31;;:37;;;;;16289:26;;16349:37;;;;;;;16364:4;16349:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16349:37:0;16424:42;;;-1:-1:-1;;;16424:42:0;;-1:-1:-1;;;;;16424:42:0;;;;;;;;;16349:37;;-1:-1:-1;16397:24:0;;16424:36;;;;;;:42;;;;;16349:37;;16424:42;;;;;;;;:36;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16424:42:0;16485:12;;16424:42;;-1:-1:-1;16517:9:0;;-1:-1:-1;16145:390:0;-1:-1:-1;;;;16145:390:0:o;47511:39::-;;;;;;;;;;;;;:::o;48374:32::-;;;-1:-1:-1;;;48374:32:0;;;;;:::o;48190:33::-;;;;;;;;;:::o;48238:26::-;;;;;;-1:-1:-1;;;;;48238:26:0;;:::o;64435:95::-;64506:16;;64435:95;:::o;58075:410::-;31030:6;;;;;-1:-1:-1;;;;;31030:6:0;31040:10;31030:20;31022:65;;;;;-1:-1:-1;;;31022:65:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;31022:65:0;;;;;;;;;;;;;;;58282:15:::1;:25:::0;;;;58319:8:::1;:20:::0;;;;58351:10:::1;:24:::0;;;;58387:9:::1;:22:::0;58421:9:::1;:22:::0;58455:9:::1;:22:::0;58075:410::o;57593:175::-;31030:6;;;;;-1:-1:-1;;;;;31030:6:0;31040:10;31030:20;31022:65;;;;;-1:-1:-1;;;31022:65:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;31022:65:0;;;;;;;;;;;;;;;57672:12:::1;::::0;-1:-1:-1;;;57672:12:0;::::1;;;57671:13;57663:54;;;::::0;;-1:-1:-1;;;57663:54:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;57728:32;57749:10;57728:20;:32::i;:::-;57593:175:::0;:::o;59875:478::-;31030:6;;;;;-1:-1:-1;;;;;31030:6:0;31040:10;31030:20;31022:65;;;;;-1:-1:-1;;;31022:65:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;31022:65:0;;;;;;;;;;;;;;;49363:8:::1;:15:::0;;-1:-1:-1;;;;49363:15:0::1;-1:-1:-1::0;;;49363:15:0::1;::::0;;59974:11:::2;::::0;;-1:-1:-1;;;;;59974:11:0;;::::2;49363:15:::0;59957:29;;;:16:::2;:29;::::0;;;;:37;;-1:-1:-1;;59957:37:0::2;::::0;;60036:11;;60026:22:::2;::::0;60036:11:::2;60026:9;:22::i;:::-;60005:43:::0;-1:-1:-1;60063:14:0;;60059:152:::2;;60104:11;::::0;60094:43:::2;::::0;-1:-1:-1;;;;;60104:11:0::2;60117:7:::0;60126:10;60094:9:::2;:43::i;:::-;60166:11;::::0;60157:42:::2;::::0;;;;;;;-1:-1:-1;;;;;60157:42:0;;::::2;::::0;60166:11:::2;::::0;-1:-1:-1;;;;;;;;;;;60157:42:0;;;;;::::2;::::0;;::::2;60059:152;60221:11;:21:::0;;-1:-1:-1;;;;;;60221:21:0::2;-1:-1:-1::0;;;;;60221:21:0;;::::2;::::0;;::::2;::::0;;-1:-1:-1;60253:25:0;;;:16:::2;:25;::::0;;;;;:32;;-1:-1:-1;;60253:32:0::2;-1:-1:-1::0;60253:32:0::2;::::0;;60305:11;;60296:49:::2;::::0;60305:11:::2;60326:4;-1:-1:-1::0;;60296:8:0::2;:49::i;:::-;-1:-1:-1::0;;49401:8:0::1;:16:::0;;-1:-1:-1;;;;49401:16:0::1;::::0;;59875:478::o;50829:143::-;-1:-1:-1;;;;;50937:18:0;;;50910:7;50937:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;50829:143::o;47952:35::-;;;;:::o;60649:513::-;60701:18;;-1:-1:-1;;;60701:18:0;;;;:23;60693:60;;;;;-1:-1:-1;;;60693:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;60782:11;;60797:1;;60772:22;;60782:11;;;-1:-1:-1;;;;;60782:11:0;60772:9;:22::i;:::-;:26;60764:35;;;;;;60811:24;60837;60863:21;60902:59;60949:11;;;;;;;;;-1:-1:-1;;;;;60949:11:0;60902:46;:59::i;:::-;60810:151;;;;;;60974:23;61000:12;;;;;;;;;;;:50;;61034:16;61000:50;;;61015:16;61000:50;61071:18;:35;;;;;;-1:-1:-1;;;61071:35:0;-1:-1:-1;;;;61071:35:0;;;;;;;;;;-1:-1:-1;61117:19:0;:37;-1:-1:-1;;60649:513:0:o;57875:99::-;31030:6;;;;;-1:-1:-1;;;;;31030:6:0;31040:10;31030:20;31022:65;;;;;-1:-1:-1;;;31022:65:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;31022:65:0;;;;;;;;;;;;;;;57945:14:::1;:21:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;57945:21:0;;::::1;::::0;;;::::1;::::0;;57875:99::o;31761:244::-;31030:6;;;;;-1:-1:-1;;;;;31030:6:0;31040:10;31030:20;31022:65;;;;;-1:-1:-1;;;31022:65:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;31022:65:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;31850:22:0;::::1;31842:73;;;;-1:-1:-1::0;;;31842:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31952:6;::::0;31931:38:::1;::::0;-1:-1:-1;;;;;31931:38:0;;::::1;::::0;31952:6;;::::1;;::::0;31931:38:::1;::::0;;;::::1;31980:6;:17:::0;;-1:-1:-1;;;;;31980:17:0;;::::1;::::0;::::1;-1:-1:-1::0;;31980:17:0;;::::1;::::0;;;::::1;::::0;;31761:244::o;47662:31::-;;;;:::o;11329:98::-;9908:31;11329:98;:::o;11433:94::-;-1:-1:-1;;9986:27:0;11433:94::o;46310:349::-;46385:14;46401;46446:6;-1:-1:-1;;;;;46436:16:0;:6;-1:-1:-1;;;;;46436:16:0;;;46428:66;;;;-1:-1:-1;;;46428:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46533:6;-1:-1:-1;;;;;46524:15:0;:6;-1:-1:-1;;;;;46524:15:0;;:53;;46562:6;46570;46524:53;;;46543:6;46551;46524:53;46505:72;;-1:-1:-1;46505:72:0;-1:-1:-1;;;;;;46596:20:0;;46588:63;;;;;-1:-1:-1;;;46588:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;46310:349;;;;;:::o;46751:478::-;46840:12;46866:14;46882;46900:26;46911:6;46919;46900:10;:26::i;:::-;47064:32;;;-1:-1:-1;;47064:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47054:43;;;;;;46967:251;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46957:262;;;;;;;;;46751:478;-1:-1:-1;;;;;46751:478:0:o;13369:96::-;11051:42;13369:96;:::o;34284:471::-;34342:7;34587:6;34583:47;;-1:-1:-1;34617:1:0;34610:8;;34583:47;34654:5;;;34658:1;34654;:5;:1;34678:5;;;;;:10;34670:56;;;;-1:-1:-1;;;34670:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32930:181;32988:7;33020:5;;;33044:6;;;;33036:46;;;;;-1:-1:-1;;;33036:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;13471:98;11143:42;13471:98;:::o;35231:132::-;35289:7;35316:39;35320:1;35323;35316:39;;;;;;;;;;;;;;;;;:3;:39::i;13575:89::-;13651:5;;;;;;;;;;;;;;;;;13575:89;:::o;52116:336::-;-1:-1:-1;;;;;52209:19:0;;52201:68;;;;-1:-1:-1;;;52201:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52288:21:0;;52280:68;;;;-1:-1:-1;;;52280:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52359:37;52373:5;52380:7;52389:6;52359:13;:37::i;:::-;52428:7;-1:-1:-1;;;;;52412:32:0;52421:5;-1:-1:-1;;;;;52412:32:0;;52437:6;52412:32;;;;;;;;;;;;;;;;;;52116:336;;;:::o;52460:4706::-;-1:-1:-1;;;;;52557:20:0;;52549:70;;;;-1:-1:-1;;;52549:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52638:23:0;;52630:71;;;;-1:-1:-1;;;52630:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52729:1;52720:6;:10;52712:55;;;;;-1:-1:-1;;;52712:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52796:17;52806:6;52796:9;:17::i;:::-;52786:6;:27;;52778:61;;;;;-1:-1:-1;;;52778:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;52868:25;52886:6;52868:17;:25::i;:::-;52858:6;:35;;52850:78;;;;;-1:-1:-1;;;52850:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;52947:12;;-1:-1:-1;;;52947:12:0;;;;52939:44;;;;;-1:-1:-1;;;52939:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;52994:16;53013:9;52994:28;;53033:14;53061:6;-1:-1:-1;;;;;53050:17:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;53050:17:0;;;:41;;;;;53082:9;-1:-1:-1;;;;;53071:20:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;53071:20:0;;;53050:41;:61;;;;-1:-1:-1;53096:15:0;;;;53095:16;53050:61;53166:18;;53033:78;;-1:-1:-1;53122:11:0;;-1:-1:-1;;;53166:18:0;;;;:23;:53;;;;-1:-1:-1;53203:11:0;;53218:1;;53193:22;;53203:11;;;-1:-1:-1;;;;;53203:11:0;53193:9;:22::i;:::-;:26;53166:53;53162:102;;;53236:16;:14;:16::i;:::-;53288:14;;;;;;;:35;;;;-1:-1:-1;;;;;;53306:17:0;;;;;;:9;:17;;;;;;;;53288:35;53284:87;;;53340:19;;;-1:-1:-1;;;53340:19:0;;;;;;;;;;;;-1:-1:-1;;;53340:19:0;;;;;;;;;;;;;;53284:87;-1:-1:-1;;;;;53395:23:0;;53413:4;53395:23;53391:115;;;53435:38;53449:6;53456:9;53466:6;53435:13;:38::i;:::-;53488:7;;;;;53391:115;53530:10;;;;;;;53526:387;;;53571:11;;-1:-1:-1;;;;;53561:21:0;;;53571:11;;;;;53561:21;53557:345;;;53606:8;;:12;53602:127;;53642:8;:13;;-1:-1:-1;;53642:13:0;;;-1:-1:-1;;;;;53677:15:0;;53642:8;53677:15;;;:4;:15;;;;;53695;53677:33;;53602:127;53557:345;;;53785:11;;-1:-1:-1;;;;;53772:24:0;;;53785:11;;;;;53772:24;:69;;;;-1:-1:-1;53833:8:0;;-1:-1:-1;;;;;53818:12:0;;;;;;:4;:12;;;;;;53800:15;:30;:41;53772:69;53768:134;;;53862:24;;;-1:-1:-1;;;53862:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;53768:134;53937:9;;;;:34;;;;-1:-1:-1;53950:11:0;;-1:-1:-1;;;;;53950:21:0;;;:11;;;;;:21;53937:34;53933:171;;;54024:9;;54015:6;53992:20;54002:9;53992;:20::i;:::-;:29;:41;53988:105;;;54054:23;;;-1:-1:-1;;;54054:23:0;;;;;;;;;;;;-1:-1:-1;;;54054:23:0;;;;;;;;;;;;;;53988:105;54129:15;;;;54128:16;:41;;;;-1:-1:-1;54158:11:0;;-1:-1:-1;;;;;54148:21:0;;;54158:11;;;;;54148:21;;54128:41;:74;;;;;54190:12;;54179:8;;54173:3;:14;:29;54128:74;:119;;;;-1:-1:-1;54231:16:0;;54216:11;;54206:22;;-1:-1:-1;;;;;54216:11:0;54206:9;:22::i;:::-;:41;54128:119;54124:223;;;-1:-1:-1;54275:3:0;54264:8;:14;54302:4;54321:14;:12;:14::i;:::-;54377:45;54395:26;:24;:26::i;:::-;54377:13;;;:17;:45::i;:::-;54371:3;:51;54367:70;;;54424:13;:11;:13::i;:::-;54448:21;54472:11;:9;:11::i;:::-;54523:8;;54448:35;;-1:-1:-1;54494:14:0;;-1:-1:-1;;;54523:8:0;;;;;:29;;;54545:7;:5;:7::i;:::-;-1:-1:-1;;;;;54535:17:0;:6;-1:-1:-1;;;;;54535:17:0;;54523:29;54519:445;;;-1:-1:-1;54578:1:0;54519:445;;;-1:-1:-1;;;;;54642:24:0;;54612:11;54642:24;;;:16;:24;;;;;;;;54638:254;;;54696:16;54705:6;54696:8;:16::i;:::-;54687:25;;54638:254;;;-1:-1:-1;;;;;54738:27:0;;;;;;:16;:27;;;;;;;;54734:158;;;54785:25;54800:9;54785:14;:25::i;:::-;54734:158;;;54866:9;;54851:25;;-1:-1:-1;;;;;54866:9:0;54851:14;:25::i;:::-;54915:37;54926:6;54934:9;54945:6;54915:10;:37::i;:::-;54906:46;;54519:445;;55061:6;55071:1;55061:11;55057:1799;;;55090:22;55114:20;55136:17;55157:28;55170:6;55178;55157:12;:28::i;:::-;55089:96;;-1:-1:-1;55089:96:0;-1:-1:-1;55089:96:0;-1:-1:-1;55200:19:0;55222:22;55240:3;55222:13;:6;55233:1;55222:10;:13::i;:22::-;55200:44;-1:-1:-1;55259:28:0;55290:23;:6;55200:44;55290:10;:23::i;:::-;55259:54;;55330;55344:6;55352:9;55363:20;55330:13;:54::i;:::-;55427:49;55463:12;55427:31;:11;55443:14;55427:15;:31::i;:::-;:35;;:49::i;:::-;55413:63;-1:-1:-1;55521:63:0;55553:30;55413:63;55569:13;55553:15;:30::i;:::-;55536:11;;-1:-1:-1;;;;;55536:11:0;55521:14;:27;;;;;;;;;;;;:31;:63::i;:::-;55506:11;;-1:-1:-1;;;;;55506:11:0;55491:14;:27;;;;;;;;;;:93;55614:12;;:27;;55631:9;55614:16;:27::i;:::-;55599:12;:42;;;;55678:9;-1:-1:-1;;;;;55661:49:0;55670:6;-1:-1:-1;;;;;55661:49:0;-1:-1:-1;;;;;;;;;;;55689:20:0;55661:49;;;;;;;;;;;;;;;;;;55750:11;;55730:44;;;;;;;;-1:-1:-1;;;;;55750:11:0;;;;;;-1:-1:-1;;;;;;;;;;;55730:44:0;;;;;;;;;55057:1799;;;;;;;;55903:6;55913:1;55903:11;55899:957;;;55932:16;55950:21;55975:32;55989:9;56000:6;55975:13;:32::i;:::-;55931:76;;;;56023:18;56043:23;56070:21;56084:6;56070:13;:21::i;:::-;56022:69;;-1:-1:-1;56022:69:0;-1:-1:-1;56106:28:0;56137:36;56022:69;56137:20;:6;56148:8;56137:10;:20::i;:36::-;56106:67;;56188:54;56202:6;56210:9;56221:20;56188:13;:54::i;:::-;56302:11;;-1:-1:-1;;;;;56302:11:0;56287:14;:27;;;;;;;;;;;:48;;56319:15;56287:31;:48::i;:::-;56272:11;;-1:-1:-1;;;;;56272:11:0;56257:14;:27;;;;;;;;;;:78;56365:12;;:26;;56382:8;56365:16;:26::i;:::-;56350:12;:41;56420:11;;:30;;56436:13;56420:15;:30::i;:::-;56406:11;:44;;;;56487:9;-1:-1:-1;;;;;56470:49:0;56479:6;-1:-1:-1;;;;;56470:49:0;-1:-1:-1;;;;;;;;;;;56498:20:0;56470:49;;;;;;;;;;;;;;;;;;56564:1;-1:-1:-1;;;;;56539:38:0;56548:6;-1:-1:-1;;;;;56539:38:0;-1:-1:-1;;;;;;;;;;;56568:8:0;56539:38;;;;;;;;;;;;;;;;;;55899:957;;;;;;;;56721:6;56731:1;56721:11;56717:139;;;56749:40;56763:6;56771:9;56782:6;56749:13;:40::i;:::-;56826:9;-1:-1:-1;;;;;56809:35:0;56818:6;-1:-1:-1;;;;;56809:35:0;-1:-1:-1;;;;;;;;;;;56837:6:0;56809:35;;;;;;;;;;;;;;;;;;56717:139;56881:15;;;;56880:16;:37;;;;;56911:6;-1:-1:-1;;;;;56900:17:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;56900:17:0;;;56880:37;:48;;;;;56922:6;56921:7;56880:48;56876:283;;;56949:42;56965:6;56973:9;56984:6;56949:15;:42::i;:::-;56945:161;;;57012:15;57030:23;57043:9;57030:8;;:12;:23::i;:::-;57012:41;;57072:18;57082:7;57072:9;:18::i;:::-;56945:161;;57134:13;:11;:13::i;:::-;;56876:283;52460:4706;;;;;;;;:::o;33833:192::-;33919:7;33955:12;33947:6;;;;33939:29;;;;-1:-1:-1;;;33939:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33991:5:0;;;33833:192::o;13768:88::-;9856:2;13768:88;:::o;58651:771::-;31030:6;;;;;-1:-1:-1;;;;;31030:6:0;31040:10;31030:20;31022:65;;;;;-1:-1:-1;;;31022:65:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;31022:65:0;;;;;;;;;;;;;;;49363:8:::1;:15:::0;;-1:-1:-1;;;;49363:15:0::1;-1:-1:-1::0;;;49363:15:0::1;::::0;;;58754:18:::2;:16;:18::i;:::-;58717:55;;58783:32;58818:19;:17;:19::i;:::-;58783:54;;58848:24;58969:1:::0;-1:-1:-1;;;;;58887:84:0::2;:14;-1:-1:-1::0;;;;;58887:22:0::2;;58918:15;-1:-1:-1::0;;;;;58918:20:0::2;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;58918:22:0;58887:70:::2;::::0;;-1:-1:-1;;;;;;58887:70:0::2;::::0;;;;;;-1:-1:-1;;;;;58887:70:0;;::::2;;::::0;::::2;::::0;58951:4:::2;58887:70:::0;;;;;;;;;;58918:22:::2;::::0;58887:70;;;;;;;;;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;58887:70:0;-1:-1:-1;;;;;58887:84:0::2;;58883:335;;;59007:14;-1:-1:-1::0;;;;;59007:25:0::2;;59055:15;-1:-1:-1::0;;;;;59055:20:0::2;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;59055:22:0;59007:87:::2;::::0;;-1:-1:-1;;;;;;59007:87:0::2;::::0;;;;;;-1:-1:-1;;;;;59007:87:0;;::::2;;::::0;::::2;::::0;59088:4:::2;59007:87:::0;;;;;;;;;;59055:22:::2;::::0;59007:87;;;;;;;-1:-1:-1;59007:87:0;;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;59007:87:0;;-1:-1:-1;58883:335:0::2;;;59146:14;-1:-1:-1::0;;;;;59146:22:0::2;;59177:4;59183:15;-1:-1:-1::0;;;;;59183:20:0::2;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;59183:22:0;59146:60:::2;::::0;;-1:-1:-1;;;;;;59146:60:0::2;::::0;;;;;;-1:-1:-1;;;;;59146:60:0;;::::2;;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;59183:22:::2;::::0;59146:60;;;;;;;;;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;59146:60:0;;-1:-1:-1;58883:335:0::2;59228:59;59237:10;59257:15:::0;-1:-1:-1;;59228:8:0::2;:59::i;:::-;59308:67;59325:16;59351:15;-1:-1:-1::0;;;;;59351:20:0::2;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;59351:22:0;59308:16:::2;:67::i;:::-;59386:9;:28:::0;;-1:-1:-1;;;;;;59386:28:0::2;-1:-1:-1::0;;;;;59386:28:0;;;::::2;::::0;;;::::2;::::0;;-1:-1:-1;;49401:8:0::1;:16:::0;;-1:-1:-1;;;;49401:16:0::1;::::0;;58651:771::o;37719:303::-;37794:21;37818:11;:9;:11::i;:::-;37794:35;-1:-1:-1;37840:19:0;37862:25;:6;37794:35;37862:10;:25::i;:::-;-1:-1:-1;;;;;37924:23:0;;:14;:23;;;;;;;;;;;37840:47;;-1:-1:-1;37924:40:0;;37840:47;37924:27;:40::i;:::-;-1:-1:-1;;;;;37898:23:0;;:14;:23;;;;;;;;;;:66;37990:12;;:24;;38007:6;37990:16;:24::i;:::-;37975:12;:39;-1:-1:-1;;;;37719:303:0:o;42958:1058::-;43044:21;43067;43090;43141:23;:21;:23::i;:::-;43124:40;;43209:4;-1:-1:-1;;;;;43194:41:0;;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43194:43:0;43267;;;-1:-1:-1;;;43267:43:0;;;;43194;;-1:-1:-1;;;;;;43267:41:0;;;;;:43;;;;;43194;;43267;;;;;;;;:41;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43267:43:0;43490:34;;;-1:-1:-1;;;43490:34:0;;;;43267:43;;-1:-1:-1;43425:16:0;;;;;;-1:-1:-1;;;;;43490:32:0;;;;;:34;;;;;;;;;;;;;;:32;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43490:34:0;;;;;;;;;;;;;-1:-1:-1;43490:34:0;;-1:-1:-1;43490:34:0;-1:-1:-1;43539:36:0;;;;;;;;43535:474;;43661:35;;;43807:62;;;43812:39;43832:8;43842;43812:19;:39::i;:::-;:42;-1:-1:-1;;;;;43807:48:0;:62;43787:82;;;;;43935:62;;;43940:39;43960:8;43970;43940:19;:39::i;:::-;:42;-1:-1:-1;;;;;43935:48:0;:62;43915:82;;;;;-1:-1:-1;43535:474:0;42958:1058;;;;;;;;:::o;45043:253::-;45110:16;;:::i;:::-;45139:6;45164;;;:54;;-1:-1:-1;;45210:7:0;;-1:-1:-1;;;;;45205:13:0;45179:17;;;;45200:1;45179:17;45200:1;45174:27;;;;;:44;45164:54;45156:102;;;;-1:-1:-1;;;45156:102:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45276:12;;;;;;;;;;;;;45043:253;-1:-1:-1;;;45043:253:0:o;45997:130::-;46097:7;44314:3;46097:21;;45997:130::o;33394:136::-;33452:7;33479:43;33483:1;33486;33479:43;;;;;;;;;;;;;;;;;:3;:43::i;13670:92::-;13747:7;;;;;;;;;;;;-1:-1:-1;;;13747:7:0;;;;13670:92;:::o;64542:275::-;64626:19;64648:23;64664:6;64648:11;:9;:11::i;:::-;:15;;:23::i;:::-;-1:-1:-1;;;;;64705:20:0;;:14;:20;;;;;;;;;;;64626:45;;-1:-1:-1;64705:37:0;;64626:45;64705:24;:37::i;:::-;-1:-1:-1;;;;;64682:20:0;;;:14;:20;;;;;;;;;;;:60;;;;64774:18;;;;;;;:35;;64797:11;64774:22;:35::i;:::-;-1:-1:-1;;;;;64753:18:0;;;:14;:18;;;;;;;;;;:56;;;;-1:-1:-1;;;64542:275:0:o;37462:110::-;37536:11;:28;;-1:-1:-1;;;;;;37536:28:0;-1:-1:-1;;;;;37536:28:0;;;;;;;;;;37462:110::o;35859:278::-;35945:7;35980:12;35973:5;35965:28;;;;-1:-1:-1;;;35965:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36004:9;36020:1;36016;:5;;;;;;;35859:278;-1:-1:-1;;;;;35859:278:0:o;37578:135::-;-1:-1:-1;;;;;37669:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;37578:135::o;64829:897::-;48906:15;:22;;-1:-1:-1;;48906:22:0;48924:4;48906:22;;;64919:11:::1;::::0;-1:-1:-1;;;;;64919:11:0::1;48906:15:::0;64964::::1;64919:11:::0;64964:9:::1;:15::i;:::-;64942:37:::0;-1:-1:-1;64994:16:0;64990:55:::1;;65027:7;;;;64990:55;65065:47;65079:4;65093;65100:11;65065:13;:47::i;:::-;65157:16;::::0;;65171:1:::1;65157:16:::0;;;65133:21:::1;65157:16:::0;;::::1;::::0;;65133:21;65157:16:::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;65157:16:0::1;65133:40;;65202:4;65184;65189:1;65184:7;;;;;;;;;;;;;:23;-1:-1:-1::0;;;;;65184:23:0::1;;;-1:-1:-1::0;;;;;65184:23:0::1;;;::::0;::::1;65228:18;:16;:18::i;:::-;-1:-1:-1::0;;;;;65228:23:0::1;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;65228:25:0;65218:7;;:4;;65223:1:::1;::::0;65218:7;::::1;;;;;;;;;;:35;-1:-1:-1::0;;;;;65218:35:0::1;;;-1:-1:-1::0;;;;;65218:35:0::1;;;::::0;::::1;65266:18;:16;:18::i;:::-;-1:-1:-1::0;;;;;65266:69:0::1;;65350:11;65376:1;65420:4;65447;65467:15;65266:227;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;65266:227:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;65536:21:0::1;::::0;-1:-1:-1;;;65572:15:0;;;;;:37:::1;;-1:-1:-1::0;;;;;;65591:18:0;::::1;::::0;::::1;65572:37;65568:151;;;65640:26;65663:2;65640:18;:11:::0;65656:1:::1;65640:15;:18::i;:26::-;65681;::::0;65626:40;;-1:-1:-1;;;;;;65681:13:0;::::1;::::0;:26;::::1;;;::::0;65626:40;;65681:26:::1;::::0;;;65626:40;65681:13;:26;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;65568:151;48939:1;;;;;48951:15:::0;:23;;-1:-1:-1;;48951:23:0;;;64829:897::o;12925:96::-;10749:7;12925:96;:::o;38215:377::-;38258:17;:15;:17::i;:::-;38291:9;38286:299;38306:15;:22;38304:24;;38286:299;;;38404:13;:33;38418:15;38434:1;38418:18;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38418:18:0;-1:-1:-1;;;;;38404:33:0;-1:-1:-1;;;;;38404:33:0;;;;;;;;;;;;:46;;;38350:13;:33;38364:15;38380:1;38364:18;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38364:18:0;38350:33;;;;;;;;;;;;:51;;:100;;;;38537:15;:18;;38523:13;;38364:18;38537:15;38553:1;;38537:18;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38537:18:0;-1:-1:-1;;;;;38523:33:0;-1:-1:-1;;;;;38523:33:0;;;;;;;;;;;;:50;;;38465:13;:33;38479:15;38495:1;38479:18;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38479:18:0;38465:33;;;;;;;;;;;;:55;;:108;38479:18;38330:3;38286:299;;38703:471;-1:-1:-1;;;;;38868:19:0;;;38752:4;38868:19;;;:13;:19;;;;;:29;38752:4;;;;;;;;38839:59;;38862:4;;38868:29;38839:22;:59::i;:::-;-1:-1:-1;;;;;38935:19:0;;;;38909:11;38935:19;;;:13;:19;;;;;;;;:29;;;;;38975:41;;;;-1:-1:-1;39027:32:0;;:47;;;;-1:-1:-1;39085:36:0;:55;38923:41;;;;38703:471;-1:-1:-1;;;;38703:471:0:o;57174:411::-;-1:-1:-1;;;;;57311:24:0;;57258:7;57311:24;;;:16;:24;;;;;;57295:1;;57311:24;;57307:247;;;57356:6;57352:108;;;-1:-1:-1;57392:1:0;57352:108;;;-1:-1:-1;57443:1:0;57352:108;57307:247;;;57491:24;:22;:24::i;:::-;-1:-1:-1;;;;;57481:34:0;:6;-1:-1:-1;;;;;57481:34:0;;57477:77;;;-1:-1:-1;57541:1:0;57477:77;57571:6;57174:411;-1:-1:-1;;;;57174:411:0:o;16541:199::-;16617:7;;;;16676:22;16694:3;16676:13;:6;16687:1;16676:10;:13::i;:22::-;16717:1;;;;-1:-1:-1;16655:43:0;;-1:-1:-1;16541:199:0;-1:-1:-1;;;;16541:199:0:o;16748:268::-;16828:7;16837;16857:21;16881:11;:9;:11::i;:::-;16857:35;-1:-1:-1;16903:18:0;16924:23;16942:4;16924:13;:6;16935:1;16924:10;:13::i;:23::-;16903:44;-1:-1:-1;16903:44:0;16978:29;16903:44;16993:13;16978:14;:29::i;:::-;16958:50;;;;;;16748:268;;;;;:::o;17024:248::-;17085:7;17094;17114:21;17138:11;:9;:11::i;:::-;17114:35;-1:-1:-1;17160:18:0;17181:22;17199:3;17181:13;:6;17192:1;17181:10;:13::i;:22::-;17160:43;-1:-1:-1;17160:43:0;17234:29;17160:43;17249:13;17234:14;:29::i;:::-;17214:50;;;;;;17024:248;;;:::o;62747:521::-;62856:11;;62835:4;;-1:-1:-1;;;;;62856:19:0;;;:11;;;;;:19;62852:64;;-1:-1:-1;62899:5:0;62892:12;;62852:64;62960:14;;-1:-1:-1;;;;;62946:11:0;;;;;;:7;:11;;;;;;62940:3;:17;:34;62936:79;;;-1:-1:-1;62998:5:0;62991:12;;62936:79;63035:20;63058:16;:14;:16::i;:::-;63035:39;-1:-1:-1;63085:14:0;63102:37;63035:39;63102:19;:6;63113:7;63102:10;:19::i;:37::-;63085:54;;63173:15;;63164:6;:24;63160:69;;;63212:5;63205:12;;;;;;63160:69;-1:-1:-1;63256:4:0;;62747:521;-1:-1:-1;;;;;62747:521:0:o;63280:520::-;48906:15;:22;;-1:-1:-1;;48906:22:0;48924:4;48906:22;;;63368:9:::1;::::0;63392:21:::1;:30:::0;-1:-1:-1;63388:101:0::1;;;63448:29;:21;63474:2;63448:25;:29::i;:::-;63439:38;;63388:101;63522:9;;63513:6;:18;63509:69;;;-1:-1:-1::0;63557:9:0::1;::::0;63509:69:::1;63611:9;;63602:6;:18;63598:57;;;63637:7;;;63598:57;63675:26;::::0;:9:::1;::::0;:26;::::1;;;::::0;63694:6;;63675:26:::1;::::0;;;63694:6;63675:9;:26;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;63720:9:0::1;63712:18;::::0;;;:7:::1;:18;::::0;;;;;;;;63733:3:::1;63712:24:::0;;63762:30;;;;;;::::1;::::0;;;;;::::1;::::0;;;;;;;;::::1;48939:1;;-1:-1:-1::0;48951:15:0;:23;;-1:-1:-1;;48951:23:0;;;63280:520::o;61502:1237::-;61575:18;;61551:7;;-1:-1:-1;;;61575:18:0;;;;:23;:54;;;;-1:-1:-1;61612:11:0;;61602:22;;61612:11;;;-1:-1:-1;;;;;61612:11:0;61602:9;:22::i;:::-;:27;61575:54;61571:138;;;-1:-1:-1;61696:1:0;61689:8;;61571:138;61722:21;61745;61768;61807:59;61854:11;;;;;;;;;-1:-1:-1;;;;;61854:11:0;61807:46;:59::i;:::-;61915:18;;61987:12;;61721:145;;-1:-1:-1;61721:145:0;;-1:-1:-1;61721:145:0;-1:-1:-1;61915:18:0;-1:-1:-1;;;61915:18:0;;;;;61898:35;;;61973:26;;;;61969:727;;;62042:12;;62016:23;;-1:-1:-1;;;62042:12:0;;;;:50;;62076:16;62042:50;;;62057:16;62042:50;62016:76;;62234:40;;:::i;:::-;62277:116;;;;;;;;62366:11;62324:53;;62343:19;;62325:15;:37;62324:53;;;;;;-1:-1:-1;;;;;62277:116:0;;;62410:19;:37;;;62462:18;:35;;-1:-1:-1;;;;62462:35:0;-1:-1:-1;;;62462:35:0;;;;;;;62234:159;-1:-1:-1;62533:59:0;62554:37;62234:159;62583:7;62554:14;:37::i;62533:59::-;62514:78;;:16;:78;;;62626:19;;62647:18;;62614:70;;;;;;-1:-1:-1;;;62647:18:0;;;;;62614:70;;;;;;;;;;;;;;;;;;;;;;;61969:727;;;62715:16;;62708:23;;;;;;61502:1237;:::o;39555:479::-;-1:-1:-1;;;;;39643:22:0;;;;;;:16;:22;;;;;;;;39642:23;39634:65;;;;;-1:-1:-1;;;39634:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39710:22:0;;;;;;:16;:22;;;;;:29;;-1:-1:-1;;39710:29:0;39735:4;39710:29;;;;;;39750:15;:26;;;;;;;;;;;;;-1:-1:-1;;;;;;39750:26:0;;;;;;;39710:22;;39857:39;39727:4;39886:9;39857:22;:39::i;:::-;39929:97;;;;;;;;-1:-1:-1;;;;;39929:97:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39907:19;;;-1:-1:-1;39907:19:0;;;:13;:19;;;;;;;;:119;;;;-1:-1:-1;;;;;;39907:119:0;;;;;;;;;;;-1:-1:-1;39907:119:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;39907:119:0;;;;;;;;;;-1:-1:-1;39555:479:0:o;42729:123::-;42818:25;:15;:25;;42729:123::o;45452:246::-;45533:16;;:::i;:::-;45584:1;45570:11;:15;;;45562:51;;;;;-1:-1:-1;;;45562:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;45631:59;;;;;;;;;;45641:48;;;45642:32;44314:3;45642:32;;;;45641:48;;;;;;-1:-1:-1;;;;;45631:59:0;;;;45624:66;;45452:246;;;;:::o;38135:74::-;38198:3;38182:13;:19;38135:74::o;-1:-1:-1:-;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;:::o

Swarm Source

ipfs://0e04555bac8bd6781b7c9f30a9aef594e66eb1f743949c2bbbb9f24dd095fdc6
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.