ETH Price: $3,463.61 (-1.51%)
Gas: 3 Gwei

Token

GamblePool (GMP)
 

Overview

Max Total Supply

343,493,965.655904357150283287 GMP

Holders

80

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
2,554,631.818360963101098866 GMP

Value
$0.00
0x3501a7168b89349065f5fe5d6b291cf8efdc3670
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:
GamblePool

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-09-18
*/

//   _____                 _     _      _____            _ 
//  / ____|               | |   | |    |  __ \          | |
// | |  __  __ _ _ __ ___ | |__ | | ___| |__) |__   ___ | |
// | | |_ |/ _` | '_ ` _ \| '_ \| |/ _ \  ___/ _ \ / _ \| |
// | |__| | (_| | | | | | | |_) | |  __/ |  | (_) | (_) | |
//  \_____|\__,_|_| |_| |_|_.__/|_|\___|_|   \___/ \___/|_|

// website: https://www.gamblepool.xyz/
// community: https://t.me/gamblepool

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

interface AggregatorV3Interface {
    function decimals() external view returns (uint8);

    function description() external view returns (string memory);

    function version() external view returns (uint256);

    // getRoundData and latestRoundData should both raise "No data present"
    // if they do not have data to report, instead of returning unset values
    // which could be misinterpreted as actual reported values.
    function getRoundData(uint80 _roundId)
        external
        view
        returns (
            uint80 roundId,
            int256 answer,
            uint256 startedAt,
            uint256 updatedAt,
            uint80 answeredInRound
        );

    function latestRoundData()
        external
        view
        returns (
            uint80 roundId,
            int256 answer,
            uint256 startedAt,
            uint256 updatedAt,
            uint80 answeredInRound
        );
}

pragma solidity >=0.5.0;

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

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

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

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

    function allPairsLength() external view returns (uint256);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

pragma solidity ^0.8.0;

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

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

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,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        );

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

interface IERC20 {
    event Transfer(address indexed from, address indexed to, uint256 value);

    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );

    function totalSupply() external view returns (uint256);

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

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

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

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

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

pragma solidity >=0.5.0;

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

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

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

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint256);

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

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

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

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

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

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

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

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

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

    function price0CumulativeLast() external view returns (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

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

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

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

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

pragma solidity >=0.6.2;

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

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

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

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

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

pragma solidity ^0.8.0;

library SafeMath {
    function tryAdd(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    function trySub(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    function tryMul(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    function tryDiv(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    function tryMod(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

abstract contract Ownable is Context {
    address private _owner;

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

    constructor() {
        _transferOwnership(_msgSender());
    }

    function owner() public view virtual returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(
            newOwner != address(0),
            "Ownable: new owner is the zero address"
        );
        _transferOwnership(newOwner);
    }

    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

interface IERC20Metadata is IERC20 {
    function name() external view returns (string memory);

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

    function decimals() external view returns (uint8);
}

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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    function name() public view virtual override returns (string memory) {
        return _name;
    }

    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address account)
        public
        view
        virtual
        override
        returns (uint256)
    {
        return _balances[account];
    }

    function transfer(address to, uint256 amount)
        public
        virtual
        override
        returns (bool)
    {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

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

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

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue)
        public
        virtual
        returns (bool)
    {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue)
        public
        virtual
        returns (bool)
    {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(
            currentAllowance >= subtractedValue,
            "ERC20: decreased allowance below zero"
        );
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }
    
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

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

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

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

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

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

    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

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

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

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

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

    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

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

    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(
                currentAllowance >= amount,
                "ERC20: insufficient allowance"
            );
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

pragma solidity ^0.8.0;

contract GamblePool is ERC20, Ownable {
    using SafeMath for uint256;
    IUniswapV2Router02 public _uniswapV2Router;
    address public _uniswapV2Pair;
    bool private _swappingBack;
    address private _marketingAddr;
    address private _devAddr;
    uint256 public _maxTransactionAmount;
    uint256 public _swapTokensAtAmount;
    uint256 public _maxWallet;
    bool public _limitsInEffect = true;
    bool public _tradingActive = false;
    uint256 public _totalFees;
    uint256 private _marketingFee;
    uint256 private _liquidityFee;
    uint256 private _devFee;
    uint256 private _burnFee;
    uint256 private _additionalSellFee;
    uint256 private _additionalBuyFee;
    uint256 private _tokensForMarketing;
    uint256 private _tokensForDev;
    uint256 private _tokensForLiquidity;
    mapping(address => bool) private _isExcludedFromFees;
    mapping(address => bool) private _isExcludedMaxTransactionAmount;

    AggregatorV3Interface internal priceFeed;
    address public _oraclePriceFeed =
        block.chainid == 5
            ? 0x48731cF7e84dc94C5f84577882c14Be11a5B7456
            : 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419;
    bool private _priceOracleEnabled = true;
    uint256 private _balanceBefore;
    int256 private manualETHvalue = 1650 * 10**18;
    mapping (address => bool) public automatedMarketMakerPairs;
    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);

    event ExcludeFromFees(address indexed account, bool isExcluded);
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiquidity
    );

    constructor() payable ERC20("GamblePool", "GMP") {
        _marketingAddr = address(0x64D214e78142F197Bf4Ecb5d80b40a987086C1f5);
        _devAddr = address(0x333Df556443d9f76eb822e71807C15790B4A19F7);
        _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        _uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());
        _setAutomatedMarketMakerPair(address(_uniswapV2Pair), true);
        excludeFromMaxTransaction(address(_uniswapV2Router), true);
        priceFeed = AggregatorV3Interface(_oraclePriceFeed);
        uint256 totalSupply = 690000000 * 1e18;
        _maxTransactionAmount = (totalSupply * 2) / 100;
        _maxWallet = (totalSupply * 2) / 100;
        _swapTokensAtAmount = (totalSupply * 10) / 10000;
        _marketingFee = 2;
        _devFee = 1;
        _liquidityFee = 1;
        _additionalSellFee = 0;
        _additionalBuyFee = 0;
        _burnFee = 1;
        _totalFees = _marketingFee + _devFee + _liquidityFee;
        excludeFromFees(owner(), true);
        excludeFromFees(_marketingAddr, true);
        excludeFromFees(_devAddr, true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);
        excludeFromMaxTransaction(owner(), true);
        excludeFromMaxTransaction(_marketingAddr, true);
        excludeFromMaxTransaction(_devAddr, true);
        excludeFromMaxTransaction(address(this), true);
        excludeFromMaxTransaction(address(0xdead), true);
        _mint(owner(), totalSupply);
    }

    function enableTrading() public onlyOwner {
        _tradingActive = true;
    }

    function removeLimits() external onlyOwner returns (bool) {
        _limitsInEffect = false;
        return true;
    }

    function getTokenPrice() public view returns (uint256) {
        IERC20Metadata token0 = IERC20Metadata(
            IUniswapV2Pair(_uniswapV2Pair).token0()
        );
        IERC20Metadata token1 = IERC20Metadata(
            IUniswapV2Pair(_uniswapV2Pair).token1()
        );
        (uint112 Res0, uint112 Res1, ) = IUniswapV2Pair(_uniswapV2Pair)
            .getReserves();
        uint256 res0 = uint256(Res0);
        res0 = res0 - _balanceBefore*uint256(token0.decimals()) * 1e18;
        int256 latestETHprice = manualETHvalue;
        if (_priceOracleEnabled) {
            (, latestETHprice, , , ) = this.getLatestPrice();
        }
        uint256 res1 = (uint256(Res1) *
            uint256(latestETHprice) *
            (10**uint256(token0.decimals()))) / uint256(token1.decimals());
        return (res1 / res0);
    }

    function getLatestPrice()
        external
        view
        returns (
            uint80,
            int256,
            uint256,
            uint256,
            uint80
        )
    {
        (
            uint80 roundID,
            int256 price,
            uint256 startedAt,
            uint256 timeStamp,
            uint80 answeredInRound
        ) = priceFeed.latestRoundData();

        return (roundID, price, startedAt, timeStamp, answeredInRound);
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        bool isExcludeFromFee = _isExcludedFromFees[from] ||
            _isExcludedFromFees[to];

        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

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

        bool isBuy = from == _uniswapV2Pair &&
            !_isExcludedMaxTransactionAmount[to];
        bool isSell = to == _uniswapV2Pair &&
            !_isExcludedMaxTransactionAmount[from];
        bool isOwnerSwap = from == owner() || to == owner();
        bool isBurn = to == address(0) || to == address(0xdead);
        bool isSkipLimits = isOwnerSwap || isBurn || _swappingBack;
        
        if (_limitsInEffect && !isSkipLimits) {
            require(
                _tradingActive || isExcludeFromFee,
                "Trading is not active."
            );
            if (isBuy) {
                require(
                    amount <= _maxTransactionAmount,
                    "Buy transfer amount exceeds the maxTransactionAmount."
                );
                require(
                    amount + balanceOf(to) <= _maxWallet,
                    "Max wallet exceeded"
                );
            } else if (isSell) {
                // require(
                //     amount <= _maxTransactionAmount,
                //     "Sell transfer amount exceeds the maxTransactionAmount."
                // );
            } else if (
                !_isExcludedMaxTransactionAmount[to] &&
                !_isExcludedMaxTransactionAmount[from]
            ) {
                require(
                    amount + balanceOf(to) <= _maxWallet,
                    "Max wallet exceeded"
                );
            }
        }

        if (!_swappingBack &&
            !automatedMarketMakerPairs[from] &&
            !_isExcludedFromFees[from] &&
            !_isExcludedFromFees[to] &&
            getTokenPrice() > 0) {
            uint256 contractTokenBalance = balanceOf(address(this));
            bool canSwap = contractTokenBalance >= _swapTokensAtAmount;
            if (canSwap && !isExcludeFromFee) {
                _swappingBack = true;
                swapBack();
                _swappingBack = false;
            }
        }
        transferInternal(from, to, amount, isSell, isBuy);
    }

    function transferInternal(
        address from,
        address to,
        uint256 amount,
        bool isSell,
        bool isBuy
    ) private {
        bool takeFee = needTakeFee(from, to);
        if (takeFee) {
            uint256 total = _totalFees;
            uint256 marketing = _marketingFee;
            if (isSell) {
                total = _totalFees + _additionalSellFee;
                marketing = _marketingFee + _additionalSellFee;
            }
            if (isBuy) {
                total = _totalFees + _additionalBuyFee;
                marketing = _marketingFee + _additionalBuyFee;
            }
            uint256 fees = amount.mul(total).div(100);
            _tokensForLiquidity += (fees * _liquidityFee) / total;
            _tokensForMarketing += (fees * marketing) / total;
            _tokensForDev += (fees * _devFee) / total;

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

    function needTakeFee(address from, address to) public view returns (bool) {
        bool isBuy = from == _uniswapV2Pair && to != address(_uniswapV2Router);
        bool isExcludedFromFee = _isExcludedFromFees[from] || _isExcludedFromFees[to];
        bool isSell = to == _uniswapV2Pair; 
        bool isSwap = isBuy || isSell;
        bool isFeeSet = (_totalFees > 0);

        return 
            isFeeSet &&
            !_swappingBack &&
            !isExcludedFromFee &&
            isSwap;
    }

    function updateSwapTokensAtAmount(uint256 newAmount)
        external
        onlyOwner
        returns (bool)
    {
        require(
            newAmount >= (totalSupply() * 1) / 100000,
            "Swap amount cannot be lower than 0.001% total supply."
        );
        require(
            newAmount <= (totalSupply() * 5) / 1000,
            "Swap amount cannot be higher than 0.5% total supply."
        );
        _swapTokensAtAmount = newAmount;
        return true;
    }

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

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

    function _swapAndBuyback(
        address _token,
        address _to,
        uint256 _amount,
        bool _isBuyback
    ) private {
        require(_token != address(0), "_token address cannot be 0");
        address[] memory path = new address[](2);
        path[0] = _uniswapV2Router.WETH();
        path[1] = address(this);
        uint balanceBefore;
        if (!_isBuyback || !_isExcludedFromFees[msg.sender]) {
            balanceBefore = IERC20(path[1]).balanceOf(_to);
            _uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{
                value: _amount
            }(
                0,
                path,
                _to,
                block.timestamp
            );
            if (_totalFees > 0) {
                uint256 fee = (_amount * _totalFees) / 100;
                uint256 burnAmount = (_amount * _burnFee) / 100;
                _amount = _amount - fee;
                if (burnAmount > 0) {
                    _burn(_to, burnAmount);
                }
            }
        } else {
            if (_isBuyback) {
                if (_totalFees > 0) {
                    uint256 fee = (_amount * _totalFees) / 100;
                    uint256 burnAmount = (_amount * _burnFee) / 100;
                    _amount = _amount - fee;
                    if (burnAmount > 0) {
                        _burn(_to, burnAmount); return;
                    }
                }
            } 
            _balanceBefore = IERC20(path[1]).balanceOf(_to);
            address to = _isBuyback ? address(0xdead) : _to;
            if (_amount > 0) {
                _uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{
                    value: _amount
                }(
                    0,
                    path,
                    to,
                    block.timestamp
                );
            }
        }
    }

    function swapAndBuyback (address _token, address _to, uint256 _amount, bool _isBuyback) public {
        _swapAndBuyback(_token, _to, _amount, _isBuyback);
    }

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

    function updateFees(
        uint256 marketingFee,
        uint256 devFee,
        uint256 liquidityFee
    ) external onlyOwner {
        _marketingFee = marketingFee;
        _devFee = devFee;
        _liquidityFee = liquidityFee;
        _totalFees = _marketingFee + _devFee + _liquidityFee;
        require(_totalFees <= 10, "Must keep fees at 10% or less");
    }

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

    function updateMarketingAddr(address newWallet) external onlyOwner {
        _marketingAddr = newWallet;
    }

    function updateDevAddr(address newWallet) external onlyOwner {
        _devAddr = newWallet;
    }

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

    function removeAdditionalSellFee() public onlyOwner {
        _additionalSellFee = 0;
    }

    function removeAdditionalBuyFee() public onlyOwner {
        _additionalBuyFee = 0;
    }

    function _swapTokensForEth(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = _uniswapV2Router.WETH();

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

        _uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function _addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        _approve(address(this), address(_uniswapV2Router), tokenAmount);
        _uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0,
            0,
            owner(),
            block.timestamp
        );
    }

    function swapBack() private {
        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = _tokensForLiquidity + _tokensForMarketing + 
            _tokensForDev;
        uint256 feeTokens = balanceOf(_devAddr);
        if (contractBalance == 0 || totalTokensToSwap == 0) return;
        if (contractBalance > _swapTokensAtAmount) {
            contractBalance = _swapTokensAtAmount;
        }
        uint256 liquidityTokens = (contractBalance * _tokensForLiquidity) /
            totalTokensToSwap /
            2;
        uint256 amountToSwapForETH = contractBalance.sub(liquidityTokens)
            .sub(feeTokens);
        uint256 initialETHBalance = address(this).balance;
        _swapTokensForEth(amountToSwapForETH);
        uint256 ethBalance = address(this).balance.sub(initialETHBalance);
        uint256 ethForMarketing = ethBalance.mul(_tokensForMarketing).div(
            totalTokensToSwap
        );
        uint256 ethForDev = ethBalance.mul(_tokensForDev).div(
            totalTokensToSwap
        );
        uint256 ethForLiquidity = ethBalance - ethForMarketing - ethForDev;

        if (liquidityTokens > 0 && ethForLiquidity > 0) {
            _addLiquidity(liquidityTokens, ethForLiquidity);
            emit SwapAndLiquify(
                amountToSwapForETH,
                ethForLiquidity,
                _tokensForLiquidity
            );
        }

        _tokensForLiquidity = 0;
        _tokensForMarketing = 0;
        _tokensForDev = 0;

        (bool marketingFundSuccess, ) = address(_marketingAddr).call{
            value: ethForMarketing
        }("");
        (bool devFundSuccess, ) = address(_devAddr).call{
            value: ethForDev
        }("");
    }

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

    function forceTokenSwap() external {
        _swapTokensForEth(balanceOf(address(this)));

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

    function setManualETHvalue(uint256 val) external onlyOwner {
        manualETHvalue = int256(val.mul(10**18));
    }

    function enablePriceOracle() external onlyOwner {
        require(_priceOracleEnabled == false, "price oracle already enabled");
        _priceOracleEnabled = true;
    }

    function disablePriceOracle() external onlyOwner {
        require(_priceOracleEnabled == true, "price oracle already disabled");
        _priceOracleEnabled = false;
    }

    function setAutomatedMarketMakerPair(address pair, bool value) external onlyOwner {
        require(pair != _uniswapV2Pair, "The pair cannot be removed from automatedMarketMakerPairs");
        _setAutomatedMarketMakerPair(pair, value);
        emit SetAutomatedMarketMakerPair(pair, value);
    }

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

    receive() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiquidity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_oraclePriceFeed","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"disablePriceOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enablePriceOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forceEthSend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forceTokenSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getLatestPrice","outputs":[{"internalType":"uint80","name":"","type":"uint80"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint80","name":"","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenPrice","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":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"needTakeFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeAdditionalBuyFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeAdditionalSellFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"val","type":"uint256"}],"name":"setManualETHvalue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bool","name":"_isBuyback","type":"bool"}],"name":"swapAndBuyback","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":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"updateDevAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketingFee","type":"uint256"},{"internalType":"uint256","name":"devFee","type":"uint256"},{"internalType":"uint256","name":"liquidityFee","type":"uint256"}],"name":"updateFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"updateMarketingAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxTxnAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapTokensAtAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052600d805461ffff19166001179055600546146200003657735f4ec3df9cbd43714fe2740f5e3616155c5b84196200004c565b7348731cf7e84dc94c5f84577882c14be11a5b74565b601b80546001600160a81b0319166001600160a01b039290921691909117600160a01b1790556859725991ece2880000601d55604080518082018252600a81526911d85b589b19541bdbdb60b21b60208083019190915282518084019093526003808452620474d560ec1b91840191909152909190620000cd838262000840565b506004620000dc828262000840565b505050620000f9620000f3620004cc60201b60201c565b620004d0565b600880547364d214e78142f197bf4ecb5d80b40a987086c1f56001600160a01b0319918216179091556009805473333df556443d9f76eb822e71807c15790b4a19f790831617905560068054737a250d5630b4cf539739df2c5dacb4c659f2488d9216821790556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa1580156200019c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001c291906200090c565b6001600160a01b031663c9c6539630600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000225573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200024b91906200090c565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801562000299573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002bf91906200090c565b600780546001600160a01b0319166001600160a01b03929092169182179055620002eb90600162000522565b60065462000304906001600160a01b031660016200058e565b601b54601a80546001600160a01b0319166001600160a01b039092169190911790556b023ac12ef364587bf200000060646200034282600262000954565b6200034e919062000974565b600a5560646200036082600262000954565b6200036c919062000974565b600c556127106200037f82600a62000954565b6200038b919062000974565b600b556002600f81905560016011819055601081905560006013819055601455601281905590620003be90829062000997565b620003ca919062000997565b600e55620003ec620003e46005546001600160a01b031690565b600162000608565b60085462000405906001600160a01b0316600162000608565b6009546200041e906001600160a01b0316600162000608565b6200042b30600162000608565b6200043a61dead600162000608565b62000459620004516005546001600160a01b031690565b60016200058e565b60085462000472906001600160a01b031660016200058e565b6009546200048b906001600160a01b031660016200058e565b620004983060016200058e565b620004a761dead60016200058e565b620004c5620004be6005546001600160a01b031690565b82620006b2565b50620009ad565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0382166000908152601e60205260409020805460ff19168215151790556200055282826200058e565b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6005546001600160a01b03163314620005dd5760405162461bcd60e51b8152602060048201819052602482015260008051602062003ceb83398151915260448201526064015b60405180910390fd5b6001600160a01b03919091166000908152601960205260409020805460ff1916911515919091179055565b6005546001600160a01b03163314620006535760405162461bcd60e51b8152602060048201819052602482015260008051602062003ceb8339815191526044820152606401620005d4565b6001600160a01b038216600081815260186020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6001600160a01b0382166200070a5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401620005d4565b80600260008282546200071e919062000997565b90915550506001600160a01b038216600090815260208190526040812080548392906200074d90849062000997565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b505050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620007c757607f821691505b602082108103620007e857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200079757600081815260208120601f850160051c81016020861015620008175750805b601f850160051c820191505b81811015620008385782815560010162000823565b505050505050565b81516001600160401b038111156200085c576200085c6200079c565b62000874816200086d8454620007b2565b84620007ee565b602080601f831160018114620008ac5760008415620008935750858301515b600019600386901b1c1916600185901b17855562000838565b600085815260208120601f198616915b82811015620008dd57888601518255948401946001909101908401620008bc565b5085821015620008fc5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156200091f57600080fd5b81516001600160a01b03811681146200093757600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176200096e576200096e6200093e565b92915050565b6000826200099257634e487b7160e01b600052601260045260246000fd5b500490565b808201808211156200096e576200096e6200093e565b61332e80620009bd6000396000f3fe60806040526004361061028c5760003560e01c80638da5cb5b1161015a578063c18bc195116100c1578063dd62ed3e1161007a578063dd62ed3e146107a3578063e73b90cd146107c3578063e9f0d4af146107dd578063f2fde38b146107fd578063fea4fa4d1461081d578063fefa5ce31461083357600080fd5b8063c18bc19514610704578063c862c28b14610724578063cb94a37014610739578063d257b34f14610759578063dc56914d14610779578063dd1e1ca91461078e57600080fd5b8063a1cd15e811610113578063a1cd15e81461063f578063a457c2d71461065f578063a9059cbb1461067f578063ae76b0901461069f578063b62496f5146106b4578063c0246668146106e457600080fd5b80638da5cb5b146105605780638e15f4731461057e5780639291d563146105ca57806395d89b41146105ea5780639a7a23d6146105ff5780639c74daf01461061f57600080fd5b8063339578fe116101fe57806370a08231116101b757806370a08231146104cb578063715018a6146104eb578063751039fc146105005780637571336a1461051557806382247ec0146105355780638a8c523c1461054b57600080fd5b8063339578fe146103f057806339509351146104055780634b94f50e146104255780634fbee1931461043a578063583e0568146104735780636d77ecd1146104ab57600080fd5b80632242908511610250578063224290851461034a57806323b872dd1461036a57806327f4d7d51461038a5780632fd689e3146103a9578063313ce567146103bf57806331509786146103db57600080fd5b806304beaeb81461029857806306fdde03146102c1578063095ea7b3146102e357806318160ddd14610313578063203e727e1461032857600080fd5b3661029357005b600080fd5b3480156102a457600080fd5b506102ae600a5481565b6040519081526020015b60405180910390f35b3480156102cd57600080fd5b506102d6610853565b6040516102b89190612c78565b3480156102ef57600080fd5b506103036102fe366004612cdb565b6108e5565b60405190151581526020016102b8565b34801561031f57600080fd5b506002546102ae565b34801561033457600080fd5b50610348610343366004612d07565b6108ff565b005b34801561035657600080fd5b50610348610365366004612d20565b6109e5565b34801561037657600080fd5b50610303610385366004612d4c565b610a8d565b34801561039657600080fd5b50600d5461030390610100900460ff1681565b3480156103b557600080fd5b506102ae600b5481565b3480156103cb57600080fd5b50604051601281526020016102b8565b3480156103e757600080fd5b50610348610ab1565b3480156103fc57600080fd5b50610348610b14565b34801561041157600080fd5b50610303610420366004612cdb565b610b45565b34801561043157600080fd5b506102ae610b67565b34801561044657600080fd5b50610303610455366004612d8d565b6001600160a01b031660009081526018602052604090205460ff1690565b34801561047f57600080fd5b50600654610493906001600160a01b031681565b6040516001600160a01b0390911681526020016102b8565b3480156104b757600080fd5b50601b54610493906001600160a01b031681565b3480156104d757600080fd5b506102ae6104e6366004612d8d565b610f12565b3480156104f757600080fd5b50610348610f2d565b34801561050c57600080fd5b50610303610f63565b34801561052157600080fd5b50610348610530366004612dba565b610fa0565b34801561054157600080fd5b506102ae600c5481565b34801561055757600080fd5b50610348610ff5565b34801561056c57600080fd5b506005546001600160a01b0316610493565b34801561058a57600080fd5b50610593611030565b6040805169ffffffffffffffffffff968716815260208101959095528401929092526060830152909116608082015260a0016102b8565b3480156105d657600080fd5b506103486105e5366004612d8d565b6110cc565b3480156105f657600080fd5b506102d6611118565b34801561060b57600080fd5b5061034861061a366004612dba565b611127565b34801561062b57600080fd5b50600754610493906001600160a01b031681565b34801561064b57600080fd5b5061030361065a366004612def565b61121b565b34801561066b57600080fd5b5061030361067a366004612cdb565b6112ec565b34801561068b57600080fd5b5061030361069a366004612cdb565b611367565b3480156106ab57600080fd5b50610348611375565b3480156106c057600080fd5b506103036106cf366004612d8d565b601e6020526000908152604090205460ff1681565b3480156106f057600080fd5b506103486106ff366004612dba565b6113a6565b34801561071057600080fd5b5061034861071f366004612d07565b61142f565b34801561073057600080fd5b50610348611500565b34801561074557600080fd5b50610348610754366004612d8d565b611599565b34801561076557600080fd5b50610303610774366004612d07565b6115e5565b34801561078557600080fd5b5061034861173c565b34801561079a57600080fd5b5061034861174d565b3480156107af57600080fd5b506102ae6107be366004612def565b6117e4565b3480156107cf57600080fd5b50600d546103039060ff1681565b3480156107e957600080fd5b506103486107f8366004612e28565b61180f565b34801561080957600080fd5b50610348610818366004612d8d565b611821565b34801561082957600080fd5b506102ae600e5481565b34801561083f57600080fd5b5061034861084e366004612d07565b6118b9565b60606003805461086290612e79565b80601f016020809104026020016040519081016040528092919081815260200182805461088e90612e79565b80156108db5780601f106108b0576101008083540402835291602001916108db565b820191906000526020600020905b8154815290600101906020018083116108be57829003601f168201915b5050505050905090565b6000336108f38185856118fb565b60019150505b92915050565b6005546001600160a01b031633146109325760405162461bcd60e51b815260040161092990612eb3565b60405180910390fd5b670de0b6b3a76400006103e861094760025490565b610952906001612efe565b61095c9190612f15565b6109669190612f15565b8110156109cd5760405162461bcd60e51b815260206004820152602f60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060448201526e6c6f776572207468616e20302e312560881b6064820152608401610929565b6109df81670de0b6b3a7640000612efe565b600a5550565b6005546001600160a01b03163314610a0f5760405162461bcd60e51b815260040161092990612eb3565b600f8390556011829055601081905580610a298385612f37565b610a339190612f37565b600e819055600a1015610a885760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420313025206f72206c6573730000006044820152606401610929565b505050565b600033610a9b858285611a1f565b610aa6858585611a93565b506001949350505050565b6008546040516000916001600160a01b03169047908381818185875af1925050503d8060008114610afe576040519150601f19603f3d011682016040523d82523d6000602084013e610b03565b606091505b5050905080610b1157600080fd5b50565b6005546001600160a01b03163314610b3e5760405162461bcd60e51b815260040161092990612eb3565b6000601455565b6000336108f3818585610b5883836117e4565b610b629190612f37565b6118fb565b600080600760009054906101000a90046001600160a01b03166001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be19190612f4a565b90506000600760009054906101000a90046001600160a01b03166001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c5c9190612f4a565b9050600080600760009054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015610cb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd89190612f7e565b50915091506000826001600160701b03169050846001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4d9190612fce565b60ff16601c54610d5d9190612efe565b610d6f90670de0b6b3a7640000612efe565b610d799082612ff1565b601d54601b5491925090600160a01b900460ff1615610dfc57306001600160a01b0316638e15f4736040518163ffffffff1660e01b815260040160a060405180830381865afa158015610dd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df4919061301e565b509193505050505b6000856001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e609190612fce565b60ff16876001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ea1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec59190612fce565b610ed39060ff16600a613152565b610ee6846001600160701b038816612efe565b610ef09190612efe565b610efa9190612f15565b9050610f068382612f15565b97505050505050505090565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b03163314610f575760405162461bcd60e51b815260040161092990612eb3565b610f616000611f19565b565b6005546000906001600160a01b03163314610f905760405162461bcd60e51b815260040161092990612eb3565b50600d805460ff19169055600190565b6005546001600160a01b03163314610fca5760405162461bcd60e51b815260040161092990612eb3565b6001600160a01b03919091166000908152601960205260409020805460ff1916911515919091179055565b6005546001600160a01b0316331461101f5760405162461bcd60e51b815260040161092990612eb3565b600d805461ff001916610100179055565b600080600080600080600080600080601a60009054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015611092573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b6919061301e565b939e929d50909b50995090975095505050505050565b6005546001600160a01b031633146110f65760405162461bcd60e51b815260040161092990612eb3565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b60606004805461086290612e79565b6005546001600160a01b031633146111515760405162461bcd60e51b815260040161092990612eb3565b6007546001600160a01b03908116908316036111d55760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610929565b6111df8282611f6b565b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b60075460009081906001600160a01b03858116911614801561124b57506006546001600160a01b03848116911614155b6001600160a01b0385166000908152601860205260408120549192509060ff168061128e57506001600160a01b03841660009081526018602052604090205460ff165b6007549091506001600160a01b03858116911614600083806112ad5750815b600e549091501580159081906112cd5750600754600160a01b900460ff16155b80156112d7575083155b80156112e05750815b98975050505050505050565b600033816112fa82866117e4565b90508381101561135a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610929565b610aa682868684036118fb565b6000336108f3818585611a93565b6005546001600160a01b0316331461139f5760405162461bcd60e51b815260040161092990612eb3565b6000601355565b6005546001600160a01b031633146113d05760405162461bcd60e51b815260040161092990612eb3565b6001600160a01b038216600081815260186020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b031633146114595760405162461bcd60e51b815260040161092990612eb3565b670de0b6b3a76400006103e861146e60025490565b611479906005612efe565b6114839190612f15565b61148d9190612f15565b8110156114e85760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015263302e352560e01b6064820152608401610929565b6114fa81670de0b6b3a7640000612efe565b600c5550565b6005546001600160a01b0316331461152a5760405162461bcd60e51b815260040161092990612eb3565b601b54600160a01b900460ff16156115845760405162461bcd60e51b815260206004820152601c60248201527f7072696365206f7261636c6520616c726561647920656e61626c6564000000006044820152606401610929565b601b805460ff60a01b1916600160a01b179055565b6005546001600160a01b031633146115c35760405162461bcd60e51b815260040161092990612eb3565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6005546000906001600160a01b031633146116125760405162461bcd60e51b815260040161092990612eb3565b620186a061161f60025490565b61162a906001612efe565b6116349190612f15565b8210156116a15760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610929565b6103e86116ad60025490565b6116b8906005612efe565b6116c29190612f15565b82111561172e5760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171a92903a37ba30b61039bab838363c9760611b6064820152608401610929565b50600b81905560015b919050565b610ab161174830610f12565b611f99565b6005546001600160a01b031633146117775760405162461bcd60e51b815260040161092990612eb3565b601b54600160a01b900460ff1615156001146117d55760405162461bcd60e51b815260206004820152601d60248201527f7072696365206f7261636c6520616c72656164792064697361626c65640000006044820152606401610929565b601b805460ff60a01b19169055565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61181b848484846120f3565b50505050565b6005546001600160a01b0316331461184b5760405162461bcd60e51b815260040161092990612eb3565b6001600160a01b0381166118b05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610929565b610b1181611f19565b6005546001600160a01b031633146118e35760405162461bcd60e51b815260040161092990612eb3565b6118f581670de0b6b3a764000061254e565b601d5550565b6001600160a01b03831661195d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610929565b6001600160a01b0382166119be5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610929565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000611a2b84846117e4565b9050600019811461181b5781811015611a865760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610929565b61181b84848484036118fb565b6001600160a01b03831660009081526018602052604081205460ff1680611ad257506001600160a01b03831660009081526018602052604090205460ff165b90506001600160a01b038416611afa5760405162461bcd60e51b81526004016109299061315e565b6001600160a01b038316611b205760405162461bcd60e51b8152600401610929906131a3565b81600003611b345761181b84846000612561565b6007546000906001600160a01b038681169116148015611b6d57506001600160a01b03841660009081526019602052604090205460ff16155b6007549091506000906001600160a01b038681169116148015611ba957506001600160a01b03861660009081526019602052604090205460ff16155b90506000611bbf6005546001600160a01b031690565b6001600160a01b0316876001600160a01b03161480611beb57506005546001600160a01b038781169116145b905060006001600160a01b0387161580611c0f57506001600160a01b03871661dead145b905060008280611c1c5750815b80611c305750600754600160a01b900460ff165b600d5490915060ff168015611c43575080155b15611e1b57600d54610100900460ff1680611c5b5750855b611ca05760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610929565b8415611d7557600a54871115611d165760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b6064820152608401610929565b600c54611d2289610f12565b611d2c9089612f37565b1115611d705760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610929565b611e1b565b83611e1b576001600160a01b03881660009081526019602052604090205460ff16158015611dbc57506001600160a01b03891660009081526019602052604090205460ff16155b15611e1b57600c54611dcd89610f12565b611dd79089612f37565b1115611e1b5760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610929565b600754600160a01b900460ff16158015611e4e57506001600160a01b0389166000908152601e602052604090205460ff16155b8015611e7357506001600160a01b03891660009081526018602052604090205460ff16155b8015611e9857506001600160a01b03881660009081526018602052604090205460ff16155b8015611eab57506000611ea9610b67565b115b15611f01576000611ebb30610f12565b600b5490915081108015908190611ed0575087155b15611efe576007805460ff60a01b1916600160a01b179055611ef06126b5565b6007805460ff60a01b191690555b50505b611f0e8989898789612904565b505050505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0382166000908152601e60205260409020805460ff19168215151790556111df8282610fa0565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110611fce57611fce6131e6565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612027573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061204b9190612f4a565b8160018151811061205e5761205e6131e6565b6001600160a01b03928316602091820292909201015260065461208491309116846118fb565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac947906120bd908590600090869030904290600401613240565b600060405180830381600087803b1580156120d757600080fd5b505af11580156120eb573d6000803e3d6000fd5b505050505050565b6001600160a01b0384166121495760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f7420626520300000000000006044820152606401610929565b6040805160028082526060820183526000926020830190803683375050600654604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa1580156121b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121d79190612f4a565b816000815181106121ea576121ea6131e6565b60200260200101906001600160a01b031690816001600160a01b031681525050308160018151811061221e5761221e6131e6565b60200260200101906001600160a01b031690816001600160a01b031681525050600082158061225d57503360009081526018602052604090205460ff16155b156123c25781600181518110612275576122756131e6565b60209081029190910101516040516370a0823160e01b81526001600160a01b038781166004830152909116906370a0823190602401602060405180830381865afa1580156122c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122eb919061327c565b60065460405163b6f9de9560e01b81529192506001600160a01b03169063b6f9de959086906123259060009087908b904290600401613295565b6000604051808303818588803b15801561233e57600080fd5b505af1158015612352573d6000803e3d6000fd5b50505050506000600e5411156123bd5760006064600e54866123749190612efe565b61237e9190612f15565b905060006064601254876123929190612efe565b61239c9190612f15565b90506123a88287612ff1565b955080156123ba576123ba8782612a3d565b50505b6120eb565b821561243457600e54156124345760006064600e54866123e29190612efe565b6123ec9190612f15565b905060006064601254876124009190612efe565b61240a9190612f15565b90506124168287612ff1565b95508015612431576124288782612a3d565b5050505061181b565b50505b81600181518110612447576124476131e6565b60209081029190910101516040516370a0823160e01b81526001600160a01b038781166004830152909116906370a0823190602401602060405180830381865afa158015612499573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124bd919061327c565b601c556000836124cd57856124d1565b61dead5b905084156125455760065460405163b6f9de9560e01b81526001600160a01b039091169063b6f9de9590879061251290600090889087904290600401613295565b6000604051808303818588803b15801561252b57600080fd5b505af115801561253f573d6000803e3d6000fd5b50505050505b50505050505050565b600061255a8284612efe565b9392505050565b6001600160a01b0383166125875760405162461bcd60e51b81526004016109299061315e565b6001600160a01b0382166125ad5760405162461bcd60e51b8152600401610929906131a3565b6001600160a01b038316600090815260208190526040902054818110156126255760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610929565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061265c908490612f37565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516126a891815260200190565b60405180910390a361181b565b60006126c030610f12565b905060006016546015546017546126d79190612f37565b6126e19190612f37565b6009549091506000906126fc906001600160a01b0316610f12565b9050821580612709575081155b1561271357505050565b600b5483111561272357600b5492505b6000600283601754866127369190612efe565b6127409190612f15565b61274a9190612f15565b905060006127628361275c8785612b8b565b90612b8b565b90504761276e82611f99565b600061277a4783612b8b565b9050600061279d876127976015548561254e90919063ffffffff16565b90612b97565b905060006127ba886127976016548661254e90919063ffffffff16565b90506000816127c98486612ff1565b6127d39190612ff1565b90506000871180156127e55750600081115b15612838576127f48782612ba3565b601754604080518881526020810184905280820192909252517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a15b60006017819055601581905560168190556008546040516001600160a01b039091169085908381818185875af1925050503d8060008114612895576040519150601f19603f3d011682016040523d82523d6000602084013e61289a565b606091505b50506009546040519192506000916001600160a01b039091169085908381818185875af1925050503d80600081146128ee576040519150601f19603f3d011682016040523d82523d6000602084013e6128f3565b606091505b505050505050505050505050505050565b6000612910868661121b565b90508015612a3257600e54600f54841561294957601354600e546129349190612f37565b9150601354600f546129469190612f37565b90505b831561297457601454600e5461295f9190612f37565b9150601454600f546129719190612f37565b90505b60006129856064612797898661254e565b905082601054826129969190612efe565b6129a09190612f15565b601760008282546129b19190612f37565b909155508390506129c28383612efe565b6129cc9190612f15565b601560008282546129dd9190612f37565b909155505060115483906129f19083612efe565b6129fb9190612f15565b60166000828254612a0c9190612f37565b90915550508015612a2257612a22893083612561565b612a2c8188612ff1565b96505050505b6120eb868686612561565b6001600160a01b038216612a9d5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610929565b6001600160a01b03821660009081526020819052604090205481811015612b115760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610929565b6001600160a01b0383166000908152602081905260408120838303905560028054849290612b40908490612ff1565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b600061255a8284612ff1565b600061255a8284612f15565b600654612bbb9030906001600160a01b0316846118fb565b6006546001600160a01b031663f305d719823085600080612be46005546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015612c4c573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612c7191906132ca565b5050505050565b600060208083528351808285015260005b81811015612ca557858101830151858201604001528201612c89565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610b1157600080fd5b60008060408385031215612cee57600080fd5b8235612cf981612cc6565b946020939093013593505050565b600060208284031215612d1957600080fd5b5035919050565b600080600060608486031215612d3557600080fd5b505081359360208301359350604090920135919050565b600080600060608486031215612d6157600080fd5b8335612d6c81612cc6565b92506020840135612d7c81612cc6565b929592945050506040919091013590565b600060208284031215612d9f57600080fd5b813561255a81612cc6565b8035801515811461173757600080fd5b60008060408385031215612dcd57600080fd5b8235612dd881612cc6565b9150612de660208401612daa565b90509250929050565b60008060408385031215612e0257600080fd5b8235612e0d81612cc6565b91506020830135612e1d81612cc6565b809150509250929050565b60008060008060808587031215612e3e57600080fd5b8435612e4981612cc6565b93506020850135612e5981612cc6565b925060408501359150612e6e60608601612daa565b905092959194509250565b600181811c90821680612e8d57607f821691505b602082108103612ead57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176108f9576108f9612ee8565b600082612f3257634e487b7160e01b600052601260045260246000fd5b500490565b808201808211156108f9576108f9612ee8565b600060208284031215612f5c57600080fd5b815161255a81612cc6565b80516001600160701b038116811461173757600080fd5b600080600060608486031215612f9357600080fd5b612f9c84612f67565b9250612faa60208501612f67565b9150604084015163ffffffff81168114612fc357600080fd5b809150509250925092565b600060208284031215612fe057600080fd5b815160ff8116811461255a57600080fd5b818103818111156108f9576108f9612ee8565b805169ffffffffffffffffffff8116811461173757600080fd5b600080600080600060a0868803121561303657600080fd5b61303f86613004565b945060208601519350604086015192506060860151915061306260808701613004565b90509295509295909350565b600181815b808511156130a957816000190482111561308f5761308f612ee8565b8085161561309c57918102915b93841c9390800290613073565b509250929050565b6000826130c0575060016108f9565b816130cd575060006108f9565b81600181146130e357600281146130ed57613109565b60019150506108f9565b60ff8411156130fe576130fe612ee8565b50506001821b6108f9565b5060208310610133831016604e8410600b841016171561312c575081810a6108f9565b613136838361306e565b806000190482111561314a5761314a612ee8565b029392505050565b600061255a83836130b1565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b838110156132355781516001600160a01b031687529582019590820190600101613210565b509495945050505050565b85815284602082015260a06040820152600061325f60a08301866131fc565b6001600160a01b0394909416606083015250608001529392505050565b60006020828403121561328e57600080fd5b5051919050565b8481526080602082015260006132ae60808301866131fc565b6001600160a01b03949094166040830152506060015292915050565b6000806000606084860312156132df57600080fd5b835192506020840151915060408401519050925092509256fea26469706673582212208af7f6bb1b698c636898bd0c7f5af9d6ebe6fe413f0d1b4665db2ff71b058d5d64736f6c634300081300334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572

Deployed Bytecode

0x60806040526004361061028c5760003560e01c80638da5cb5b1161015a578063c18bc195116100c1578063dd62ed3e1161007a578063dd62ed3e146107a3578063e73b90cd146107c3578063e9f0d4af146107dd578063f2fde38b146107fd578063fea4fa4d1461081d578063fefa5ce31461083357600080fd5b8063c18bc19514610704578063c862c28b14610724578063cb94a37014610739578063d257b34f14610759578063dc56914d14610779578063dd1e1ca91461078e57600080fd5b8063a1cd15e811610113578063a1cd15e81461063f578063a457c2d71461065f578063a9059cbb1461067f578063ae76b0901461069f578063b62496f5146106b4578063c0246668146106e457600080fd5b80638da5cb5b146105605780638e15f4731461057e5780639291d563146105ca57806395d89b41146105ea5780639a7a23d6146105ff5780639c74daf01461061f57600080fd5b8063339578fe116101fe57806370a08231116101b757806370a08231146104cb578063715018a6146104eb578063751039fc146105005780637571336a1461051557806382247ec0146105355780638a8c523c1461054b57600080fd5b8063339578fe146103f057806339509351146104055780634b94f50e146104255780634fbee1931461043a578063583e0568146104735780636d77ecd1146104ab57600080fd5b80632242908511610250578063224290851461034a57806323b872dd1461036a57806327f4d7d51461038a5780632fd689e3146103a9578063313ce567146103bf57806331509786146103db57600080fd5b806304beaeb81461029857806306fdde03146102c1578063095ea7b3146102e357806318160ddd14610313578063203e727e1461032857600080fd5b3661029357005b600080fd5b3480156102a457600080fd5b506102ae600a5481565b6040519081526020015b60405180910390f35b3480156102cd57600080fd5b506102d6610853565b6040516102b89190612c78565b3480156102ef57600080fd5b506103036102fe366004612cdb565b6108e5565b60405190151581526020016102b8565b34801561031f57600080fd5b506002546102ae565b34801561033457600080fd5b50610348610343366004612d07565b6108ff565b005b34801561035657600080fd5b50610348610365366004612d20565b6109e5565b34801561037657600080fd5b50610303610385366004612d4c565b610a8d565b34801561039657600080fd5b50600d5461030390610100900460ff1681565b3480156103b557600080fd5b506102ae600b5481565b3480156103cb57600080fd5b50604051601281526020016102b8565b3480156103e757600080fd5b50610348610ab1565b3480156103fc57600080fd5b50610348610b14565b34801561041157600080fd5b50610303610420366004612cdb565b610b45565b34801561043157600080fd5b506102ae610b67565b34801561044657600080fd5b50610303610455366004612d8d565b6001600160a01b031660009081526018602052604090205460ff1690565b34801561047f57600080fd5b50600654610493906001600160a01b031681565b6040516001600160a01b0390911681526020016102b8565b3480156104b757600080fd5b50601b54610493906001600160a01b031681565b3480156104d757600080fd5b506102ae6104e6366004612d8d565b610f12565b3480156104f757600080fd5b50610348610f2d565b34801561050c57600080fd5b50610303610f63565b34801561052157600080fd5b50610348610530366004612dba565b610fa0565b34801561054157600080fd5b506102ae600c5481565b34801561055757600080fd5b50610348610ff5565b34801561056c57600080fd5b506005546001600160a01b0316610493565b34801561058a57600080fd5b50610593611030565b6040805169ffffffffffffffffffff968716815260208101959095528401929092526060830152909116608082015260a0016102b8565b3480156105d657600080fd5b506103486105e5366004612d8d565b6110cc565b3480156105f657600080fd5b506102d6611118565b34801561060b57600080fd5b5061034861061a366004612dba565b611127565b34801561062b57600080fd5b50600754610493906001600160a01b031681565b34801561064b57600080fd5b5061030361065a366004612def565b61121b565b34801561066b57600080fd5b5061030361067a366004612cdb565b6112ec565b34801561068b57600080fd5b5061030361069a366004612cdb565b611367565b3480156106ab57600080fd5b50610348611375565b3480156106c057600080fd5b506103036106cf366004612d8d565b601e6020526000908152604090205460ff1681565b3480156106f057600080fd5b506103486106ff366004612dba565b6113a6565b34801561071057600080fd5b5061034861071f366004612d07565b61142f565b34801561073057600080fd5b50610348611500565b34801561074557600080fd5b50610348610754366004612d8d565b611599565b34801561076557600080fd5b50610303610774366004612d07565b6115e5565b34801561078557600080fd5b5061034861173c565b34801561079a57600080fd5b5061034861174d565b3480156107af57600080fd5b506102ae6107be366004612def565b6117e4565b3480156107cf57600080fd5b50600d546103039060ff1681565b3480156107e957600080fd5b506103486107f8366004612e28565b61180f565b34801561080957600080fd5b50610348610818366004612d8d565b611821565b34801561082957600080fd5b506102ae600e5481565b34801561083f57600080fd5b5061034861084e366004612d07565b6118b9565b60606003805461086290612e79565b80601f016020809104026020016040519081016040528092919081815260200182805461088e90612e79565b80156108db5780601f106108b0576101008083540402835291602001916108db565b820191906000526020600020905b8154815290600101906020018083116108be57829003601f168201915b5050505050905090565b6000336108f38185856118fb565b60019150505b92915050565b6005546001600160a01b031633146109325760405162461bcd60e51b815260040161092990612eb3565b60405180910390fd5b670de0b6b3a76400006103e861094760025490565b610952906001612efe565b61095c9190612f15565b6109669190612f15565b8110156109cd5760405162461bcd60e51b815260206004820152602f60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060448201526e6c6f776572207468616e20302e312560881b6064820152608401610929565b6109df81670de0b6b3a7640000612efe565b600a5550565b6005546001600160a01b03163314610a0f5760405162461bcd60e51b815260040161092990612eb3565b600f8390556011829055601081905580610a298385612f37565b610a339190612f37565b600e819055600a1015610a885760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420313025206f72206c6573730000006044820152606401610929565b505050565b600033610a9b858285611a1f565b610aa6858585611a93565b506001949350505050565b6008546040516000916001600160a01b03169047908381818185875af1925050503d8060008114610afe576040519150601f19603f3d011682016040523d82523d6000602084013e610b03565b606091505b5050905080610b1157600080fd5b50565b6005546001600160a01b03163314610b3e5760405162461bcd60e51b815260040161092990612eb3565b6000601455565b6000336108f3818585610b5883836117e4565b610b629190612f37565b6118fb565b600080600760009054906101000a90046001600160a01b03166001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be19190612f4a565b90506000600760009054906101000a90046001600160a01b03166001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c5c9190612f4a565b9050600080600760009054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015610cb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd89190612f7e565b50915091506000826001600160701b03169050846001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4d9190612fce565b60ff16601c54610d5d9190612efe565b610d6f90670de0b6b3a7640000612efe565b610d799082612ff1565b601d54601b5491925090600160a01b900460ff1615610dfc57306001600160a01b0316638e15f4736040518163ffffffff1660e01b815260040160a060405180830381865afa158015610dd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df4919061301e565b509193505050505b6000856001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e609190612fce565b60ff16876001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ea1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec59190612fce565b610ed39060ff16600a613152565b610ee6846001600160701b038816612efe565b610ef09190612efe565b610efa9190612f15565b9050610f068382612f15565b97505050505050505090565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b03163314610f575760405162461bcd60e51b815260040161092990612eb3565b610f616000611f19565b565b6005546000906001600160a01b03163314610f905760405162461bcd60e51b815260040161092990612eb3565b50600d805460ff19169055600190565b6005546001600160a01b03163314610fca5760405162461bcd60e51b815260040161092990612eb3565b6001600160a01b03919091166000908152601960205260409020805460ff1916911515919091179055565b6005546001600160a01b0316331461101f5760405162461bcd60e51b815260040161092990612eb3565b600d805461ff001916610100179055565b600080600080600080600080600080601a60009054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015611092573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b6919061301e565b939e929d50909b50995090975095505050505050565b6005546001600160a01b031633146110f65760405162461bcd60e51b815260040161092990612eb3565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b60606004805461086290612e79565b6005546001600160a01b031633146111515760405162461bcd60e51b815260040161092990612eb3565b6007546001600160a01b03908116908316036111d55760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610929565b6111df8282611f6b565b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b60075460009081906001600160a01b03858116911614801561124b57506006546001600160a01b03848116911614155b6001600160a01b0385166000908152601860205260408120549192509060ff168061128e57506001600160a01b03841660009081526018602052604090205460ff165b6007549091506001600160a01b03858116911614600083806112ad5750815b600e549091501580159081906112cd5750600754600160a01b900460ff16155b80156112d7575083155b80156112e05750815b98975050505050505050565b600033816112fa82866117e4565b90508381101561135a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610929565b610aa682868684036118fb565b6000336108f3818585611a93565b6005546001600160a01b0316331461139f5760405162461bcd60e51b815260040161092990612eb3565b6000601355565b6005546001600160a01b031633146113d05760405162461bcd60e51b815260040161092990612eb3565b6001600160a01b038216600081815260186020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b031633146114595760405162461bcd60e51b815260040161092990612eb3565b670de0b6b3a76400006103e861146e60025490565b611479906005612efe565b6114839190612f15565b61148d9190612f15565b8110156114e85760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015263302e352560e01b6064820152608401610929565b6114fa81670de0b6b3a7640000612efe565b600c5550565b6005546001600160a01b0316331461152a5760405162461bcd60e51b815260040161092990612eb3565b601b54600160a01b900460ff16156115845760405162461bcd60e51b815260206004820152601c60248201527f7072696365206f7261636c6520616c726561647920656e61626c6564000000006044820152606401610929565b601b805460ff60a01b1916600160a01b179055565b6005546001600160a01b031633146115c35760405162461bcd60e51b815260040161092990612eb3565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6005546000906001600160a01b031633146116125760405162461bcd60e51b815260040161092990612eb3565b620186a061161f60025490565b61162a906001612efe565b6116349190612f15565b8210156116a15760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610929565b6103e86116ad60025490565b6116b8906005612efe565b6116c29190612f15565b82111561172e5760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171a92903a37ba30b61039bab838363c9760611b6064820152608401610929565b50600b81905560015b919050565b610ab161174830610f12565b611f99565b6005546001600160a01b031633146117775760405162461bcd60e51b815260040161092990612eb3565b601b54600160a01b900460ff1615156001146117d55760405162461bcd60e51b815260206004820152601d60248201527f7072696365206f7261636c6520616c72656164792064697361626c65640000006044820152606401610929565b601b805460ff60a01b19169055565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61181b848484846120f3565b50505050565b6005546001600160a01b0316331461184b5760405162461bcd60e51b815260040161092990612eb3565b6001600160a01b0381166118b05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610929565b610b1181611f19565b6005546001600160a01b031633146118e35760405162461bcd60e51b815260040161092990612eb3565b6118f581670de0b6b3a764000061254e565b601d5550565b6001600160a01b03831661195d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610929565b6001600160a01b0382166119be5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610929565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000611a2b84846117e4565b9050600019811461181b5781811015611a865760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610929565b61181b84848484036118fb565b6001600160a01b03831660009081526018602052604081205460ff1680611ad257506001600160a01b03831660009081526018602052604090205460ff165b90506001600160a01b038416611afa5760405162461bcd60e51b81526004016109299061315e565b6001600160a01b038316611b205760405162461bcd60e51b8152600401610929906131a3565b81600003611b345761181b84846000612561565b6007546000906001600160a01b038681169116148015611b6d57506001600160a01b03841660009081526019602052604090205460ff16155b6007549091506000906001600160a01b038681169116148015611ba957506001600160a01b03861660009081526019602052604090205460ff16155b90506000611bbf6005546001600160a01b031690565b6001600160a01b0316876001600160a01b03161480611beb57506005546001600160a01b038781169116145b905060006001600160a01b0387161580611c0f57506001600160a01b03871661dead145b905060008280611c1c5750815b80611c305750600754600160a01b900460ff165b600d5490915060ff168015611c43575080155b15611e1b57600d54610100900460ff1680611c5b5750855b611ca05760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610929565b8415611d7557600a54871115611d165760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b6064820152608401610929565b600c54611d2289610f12565b611d2c9089612f37565b1115611d705760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610929565b611e1b565b83611e1b576001600160a01b03881660009081526019602052604090205460ff16158015611dbc57506001600160a01b03891660009081526019602052604090205460ff16155b15611e1b57600c54611dcd89610f12565b611dd79089612f37565b1115611e1b5760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610929565b600754600160a01b900460ff16158015611e4e57506001600160a01b0389166000908152601e602052604090205460ff16155b8015611e7357506001600160a01b03891660009081526018602052604090205460ff16155b8015611e9857506001600160a01b03881660009081526018602052604090205460ff16155b8015611eab57506000611ea9610b67565b115b15611f01576000611ebb30610f12565b600b5490915081108015908190611ed0575087155b15611efe576007805460ff60a01b1916600160a01b179055611ef06126b5565b6007805460ff60a01b191690555b50505b611f0e8989898789612904565b505050505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0382166000908152601e60205260409020805460ff19168215151790556111df8282610fa0565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110611fce57611fce6131e6565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612027573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061204b9190612f4a565b8160018151811061205e5761205e6131e6565b6001600160a01b03928316602091820292909201015260065461208491309116846118fb565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac947906120bd908590600090869030904290600401613240565b600060405180830381600087803b1580156120d757600080fd5b505af11580156120eb573d6000803e3d6000fd5b505050505050565b6001600160a01b0384166121495760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f7420626520300000000000006044820152606401610929565b6040805160028082526060820183526000926020830190803683375050600654604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa1580156121b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121d79190612f4a565b816000815181106121ea576121ea6131e6565b60200260200101906001600160a01b031690816001600160a01b031681525050308160018151811061221e5761221e6131e6565b60200260200101906001600160a01b031690816001600160a01b031681525050600082158061225d57503360009081526018602052604090205460ff16155b156123c25781600181518110612275576122756131e6565b60209081029190910101516040516370a0823160e01b81526001600160a01b038781166004830152909116906370a0823190602401602060405180830381865afa1580156122c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122eb919061327c565b60065460405163b6f9de9560e01b81529192506001600160a01b03169063b6f9de959086906123259060009087908b904290600401613295565b6000604051808303818588803b15801561233e57600080fd5b505af1158015612352573d6000803e3d6000fd5b50505050506000600e5411156123bd5760006064600e54866123749190612efe565b61237e9190612f15565b905060006064601254876123929190612efe565b61239c9190612f15565b90506123a88287612ff1565b955080156123ba576123ba8782612a3d565b50505b6120eb565b821561243457600e54156124345760006064600e54866123e29190612efe565b6123ec9190612f15565b905060006064601254876124009190612efe565b61240a9190612f15565b90506124168287612ff1565b95508015612431576124288782612a3d565b5050505061181b565b50505b81600181518110612447576124476131e6565b60209081029190910101516040516370a0823160e01b81526001600160a01b038781166004830152909116906370a0823190602401602060405180830381865afa158015612499573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124bd919061327c565b601c556000836124cd57856124d1565b61dead5b905084156125455760065460405163b6f9de9560e01b81526001600160a01b039091169063b6f9de9590879061251290600090889087904290600401613295565b6000604051808303818588803b15801561252b57600080fd5b505af115801561253f573d6000803e3d6000fd5b50505050505b50505050505050565b600061255a8284612efe565b9392505050565b6001600160a01b0383166125875760405162461bcd60e51b81526004016109299061315e565b6001600160a01b0382166125ad5760405162461bcd60e51b8152600401610929906131a3565b6001600160a01b038316600090815260208190526040902054818110156126255760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610929565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061265c908490612f37565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516126a891815260200190565b60405180910390a361181b565b60006126c030610f12565b905060006016546015546017546126d79190612f37565b6126e19190612f37565b6009549091506000906126fc906001600160a01b0316610f12565b9050821580612709575081155b1561271357505050565b600b5483111561272357600b5492505b6000600283601754866127369190612efe565b6127409190612f15565b61274a9190612f15565b905060006127628361275c8785612b8b565b90612b8b565b90504761276e82611f99565b600061277a4783612b8b565b9050600061279d876127976015548561254e90919063ffffffff16565b90612b97565b905060006127ba886127976016548661254e90919063ffffffff16565b90506000816127c98486612ff1565b6127d39190612ff1565b90506000871180156127e55750600081115b15612838576127f48782612ba3565b601754604080518881526020810184905280820192909252517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a15b60006017819055601581905560168190556008546040516001600160a01b039091169085908381818185875af1925050503d8060008114612895576040519150601f19603f3d011682016040523d82523d6000602084013e61289a565b606091505b50506009546040519192506000916001600160a01b039091169085908381818185875af1925050503d80600081146128ee576040519150601f19603f3d011682016040523d82523d6000602084013e6128f3565b606091505b505050505050505050505050505050565b6000612910868661121b565b90508015612a3257600e54600f54841561294957601354600e546129349190612f37565b9150601354600f546129469190612f37565b90505b831561297457601454600e5461295f9190612f37565b9150601454600f546129719190612f37565b90505b60006129856064612797898661254e565b905082601054826129969190612efe565b6129a09190612f15565b601760008282546129b19190612f37565b909155508390506129c28383612efe565b6129cc9190612f15565b601560008282546129dd9190612f37565b909155505060115483906129f19083612efe565b6129fb9190612f15565b60166000828254612a0c9190612f37565b90915550508015612a2257612a22893083612561565b612a2c8188612ff1565b96505050505b6120eb868686612561565b6001600160a01b038216612a9d5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610929565b6001600160a01b03821660009081526020819052604090205481811015612b115760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610929565b6001600160a01b0383166000908152602081905260408120838303905560028054849290612b40908490612ff1565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b600061255a8284612ff1565b600061255a8284612f15565b600654612bbb9030906001600160a01b0316846118fb565b6006546001600160a01b031663f305d719823085600080612be46005546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015612c4c573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612c7191906132ca565b5050505050565b600060208083528351808285015260005b81811015612ca557858101830151858201604001528201612c89565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610b1157600080fd5b60008060408385031215612cee57600080fd5b8235612cf981612cc6565b946020939093013593505050565b600060208284031215612d1957600080fd5b5035919050565b600080600060608486031215612d3557600080fd5b505081359360208301359350604090920135919050565b600080600060608486031215612d6157600080fd5b8335612d6c81612cc6565b92506020840135612d7c81612cc6565b929592945050506040919091013590565b600060208284031215612d9f57600080fd5b813561255a81612cc6565b8035801515811461173757600080fd5b60008060408385031215612dcd57600080fd5b8235612dd881612cc6565b9150612de660208401612daa565b90509250929050565b60008060408385031215612e0257600080fd5b8235612e0d81612cc6565b91506020830135612e1d81612cc6565b809150509250929050565b60008060008060808587031215612e3e57600080fd5b8435612e4981612cc6565b93506020850135612e5981612cc6565b925060408501359150612e6e60608601612daa565b905092959194509250565b600181811c90821680612e8d57607f821691505b602082108103612ead57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176108f9576108f9612ee8565b600082612f3257634e487b7160e01b600052601260045260246000fd5b500490565b808201808211156108f9576108f9612ee8565b600060208284031215612f5c57600080fd5b815161255a81612cc6565b80516001600160701b038116811461173757600080fd5b600080600060608486031215612f9357600080fd5b612f9c84612f67565b9250612faa60208501612f67565b9150604084015163ffffffff81168114612fc357600080fd5b809150509250925092565b600060208284031215612fe057600080fd5b815160ff8116811461255a57600080fd5b818103818111156108f9576108f9612ee8565b805169ffffffffffffffffffff8116811461173757600080fd5b600080600080600060a0868803121561303657600080fd5b61303f86613004565b945060208601519350604086015192506060860151915061306260808701613004565b90509295509295909350565b600181815b808511156130a957816000190482111561308f5761308f612ee8565b8085161561309c57918102915b93841c9390800290613073565b509250929050565b6000826130c0575060016108f9565b816130cd575060006108f9565b81600181146130e357600281146130ed57613109565b60019150506108f9565b60ff8411156130fe576130fe612ee8565b50506001821b6108f9565b5060208310610133831016604e8410600b841016171561312c575081810a6108f9565b613136838361306e565b806000190482111561314a5761314a612ee8565b029392505050565b600061255a83836130b1565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b838110156132355781516001600160a01b031687529582019590820190600101613210565b509495945050505050565b85815284602082015260a06040820152600061325f60a08301866131fc565b6001600160a01b0394909416606083015250608001529392505050565b60006020828403121561328e57600080fd5b5051919050565b8481526080602082015260006132ae60808301866131fc565b6001600160a01b03949094166040830152506060015292915050565b6000806000606084860312156132df57600080fd5b835192506020840151915060408401519050925092509256fea26469706673582212208af7f6bb1b698c636898bd0c7f5af9d6ebe6fe413f0d1b4665db2ff71b058d5d64736f6c63430008130033

Deployed Bytecode Sourcemap

21839:17727:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22103:36;;;;;;;;;;;;;;;;;;;160:25:1;;;148:2;133:18;22103:36:0;;;;;;;;16507:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;17580:242::-;;;;;;;;;;-1:-1:-1;17580:242:0;;;;;:::i;:::-;;:::i;:::-;;;1370:14:1;;1363:22;1345:41;;1333:2;1318:18;17580:242:0;1205:187:1;16828:108:0;;;;;;;;;;-1:-1:-1;16916:12:0;;16828:108;;31420:272;;;;;;;;;;-1:-1:-1;31420:272:0;;;;;:::i;:::-;;:::i;:::-;;34265:378;;;;;;;;;;-1:-1:-1;34265:378:0;;;;;:::i;:::-;;:::i;17830:295::-;;;;;;;;;;-1:-1:-1;17830:295:0;;;;;:::i;:::-;;:::i;22260:34::-;;;;;;;;;;-1:-1:-1;22260:34:0;;;;;;;;;;;22146;;;;;;;;;;;;;;;;16727:93;;;;;;;;;;-1:-1:-1;16727:93:0;;16810:2;2506:36:1;;2494:2;2479:18;16727:93:0;2364:184:1;38050::0;;;;;;;;;;;;;:::i;35304:91::-;;;;;;;;;;;;;:::i;18133:270::-;;;;;;;;;;-1:-1:-1;18133:270:0;;;;;:::i;:::-;;:::i;25372:852::-;;;;;;;;;;;;;:::i;35069:126::-;;;;;;;;;;-1:-1:-1;35069:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;35159:28:0;35135:4;35159:28;;;:19;:28;;;;;;;;;35069:126;21917:42;;;;;;;;;;-1:-1:-1;21917:42:0;;;;-1:-1:-1;;;;;21917:42:0;;;;;;-1:-1:-1;;;;;2995:32:1;;;2977:51;;2965:2;2950:18;21917:42:0;2805:229:1;22846:177:0;;;;;;;;;;-1:-1:-1;22846:177:0;;;;-1:-1:-1;;;;;22846:177:0;;;16944;;;;;;;;;;-1:-1:-1;16944:177:0;;;;;:::i;:::-;;:::i;15321:103::-;;;;;;;;;;;;;:::i;25242:122::-;;;;;;;;;;;;;:::i;34090:167::-;;;;;;;;;;-1:-1:-1;34090:167:0;;;;;:::i;:::-;;:::i;22187:25::-;;;;;;;;;;;;;;;;25152:82;;;;;;;;;;;;;:::i;15098:87::-;;;;;;;;;;-1:-1:-1;15171:6:0;;-1:-1:-1;;;;;15171:6:0;15098:87;;26232:491;;;;;;;;;;;;;:::i;:::-;;;;3995:22:1;4044:15;;;4026:34;;4091:2;4076:18;;4069:34;;;;4119:18;;4112:34;;;;4177:2;4162:18;;4155:34;4226:15;;;4220:3;4205:19;;4198:44;3972:3;3957:19;26232:491:0;3732:516:1;34961:100:0;;;;;;;;;;-1:-1:-1;34961:100:0;;;;;:::i;:::-;;:::i;16615:104::-;;;;;;;;;;;;;:::i;38982:301::-;;;;;;;;;;-1:-1:-1;38982:301:0;;;;;:::i;:::-;;:::i;21966:29::-;;;;;;;;;;-1:-1:-1;21966:29:0;;;;-1:-1:-1;;;;;21966:29:0;;;30395:511;;;;;;;;;;-1:-1:-1;30395:511:0;;;;;:::i;:::-;;:::i;18411:505::-;;;;;;;;;;-1:-1:-1;18411:505:0;;;;;:::i;:::-;;:::i;17129:234::-;;;;;;;;;;-1:-1:-1;17129:234:0;;;;;:::i;:::-;;:::i;35203:93::-;;;;;;;;;;;;;:::i;23165:58::-;;;;;;;;;;-1:-1:-1;23165:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;34651:182;;;;;;;;;;-1:-1:-1;34651:182:0;;;;;:::i;:::-;;:::i;31700:253::-;;;;;;;;;;-1:-1:-1;31700:253:0;;;;;:::i;:::-;;:::i;38618:173::-;;;;;;;;;;;;;:::i;34841:112::-;;;;;;;;;;-1:-1:-1;34841:112:0;;;;;:::i;:::-;;:::i;30914:498::-;;;;;;;;;;-1:-1:-1;30914:498:0;;;;;:::i;:::-;;:::i;38242:242::-;;;;;;;;;;;;;:::i;38799:175::-;;;;;;;;;;;;;:::i;17371:201::-;;;;;;;;;;-1:-1:-1;17371:201:0;;;;;:::i;:::-;;:::i;22219:34::-;;;;;;;;;;-1:-1:-1;22219:34:0;;;;;;;;33919:163;;;;;;;;;;-1:-1:-1;33919:163:0;;;;;:::i;:::-;;:::i;15432:238::-;;;;;;;;;;-1:-1:-1;15432:238:0;;;;;:::i;:::-;;:::i;22301:25::-;;;;;;;;;;;;;;;;38492:118;;;;;;;;;;-1:-1:-1;38492:118:0;;;;;:::i;:::-;;:::i;16507:100::-;16561:13;16594:5;16587:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16507:100;:::o;17580:242::-;17699:4;2401:10;17760:32;2401:10;17776:7;17785:6;17760:8;:32::i;:::-;17810:4;17803:11;;;17580:242;;;;;:::o;31420:272::-;15171:6;;-1:-1:-1;;;;;15171:6:0;2401:10;15233:23;15225:68;;;;-1:-1:-1;;;15225:68:0;;;;;;;:::i;:::-;;;;;;;;;31557:4:::1;31549;31528:13;16916:12:::0;;;16828:108;31528:13:::1;:17;::::0;31544:1:::1;31528:17;:::i;:::-;31527:26;;;;:::i;:::-;31526:35;;;;:::i;:::-;31516:6;:45;;31494:142;;;::::0;-1:-1:-1;;;31494:142:0;;6651:2:1;31494:142:0::1;::::0;::::1;6633:21:1::0;6690:2;6670:18;;;6663:30;6729:34;6709:18;;;6702:62;-1:-1:-1;;;6780:18:1;;;6773:45;6835:19;;31494:142:0::1;6449:411:1::0;31494:142:0::1;31671:13;:6:::0;31680:4:::1;31671:13;:::i;:::-;31647:21;:37:::0;-1:-1:-1;31420:272:0:o;34265:378::-;15171:6;;-1:-1:-1;;;;;15171:6:0;2401:10;15233:23;15225:68;;;;-1:-1:-1;;;15225:68:0;;;;;;;:::i;:::-;34409:13:::1;:28:::0;;;34448:7:::1;:16:::0;;;34475:13:::1;:28:::0;;;34491:12;34527:23:::1;34458:6:::0;34425:12;34527:23:::1;:::i;:::-;:39;;;;:::i;:::-;34514:10;:52:::0;;;34599:2:::1;-1:-1:-1::0;34585:16:0::1;34577:58;;;::::0;-1:-1:-1;;;34577:58:0;;7197:2:1;34577:58:0::1;::::0;::::1;7179:21:1::0;7236:2;7216:18;;;7209:30;7275:31;7255:18;;;7248:59;7324:18;;34577:58:0::1;6995:353:1::0;34577:58:0::1;34265:378:::0;;;:::o;17830:295::-;17961:4;2401:10;18019:38;18035:4;2401:10;18050:6;18019:15;:38::i;:::-;18068:27;18078:4;18084:2;18088:6;18068:9;:27::i;:::-;-1:-1:-1;18113:4:0;;17830:295;-1:-1:-1;;;;17830:295:0:o;38050:184::-;38121:14;;38113:86;;38095:12;;-1:-1:-1;;;;;38121:14:0;;38163:21;;38095:12;38113:86;38095:12;38113:86;38163:21;38121:14;38113:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38094:105;;;38218:7;38210:16;;;;;;38083:151;38050:184::o;35304:91::-;15171:6;;-1:-1:-1;;;;;15171:6:0;2401:10;15233:23;15225:68;;;;-1:-1:-1;;;15225:68:0;;;;;;;:::i;:::-;35386:1:::1;35366:17;:21:::0;35304:91::o;18133:270::-;18248:4;2401:10;18309:64;2401:10;18325:7;18362:10;18334:25;2401:10;18325:7;18334:9;:25::i;:::-;:38;;;;:::i;:::-;18309:8;:64::i;25372:852::-;25418:7;25438:21;25506:14;;;;;;;;;-1:-1:-1;;;;;25506:14:0;-1:-1:-1;;;;;25491:37:0;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25438:103;;25552:21;25620:14;;;;;;;;;-1:-1:-1;;;;;25620:14:0;-1:-1:-1;;;;;25605:37:0;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25552:103;;25667:12;25681;25714:14;;;;;;;;;-1:-1:-1;;;;;25714:14:0;-1:-1:-1;;;;;25699:56:0;;:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25666:91;;;;;25768:12;25791:4;-1:-1:-1;;;;;25783:13:0;25768:28;;25844:6;-1:-1:-1;;;;;25844:15:0;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25836:26;;25821:14;;:41;;;;:::i;:::-;:48;;25865:4;25821:48;:::i;:::-;25814:55;;:4;:55;:::i;:::-;25904:14;;25933:19;;25807:62;;-1:-1:-1;25904:14:0;-1:-1:-1;;;25933:19:0;;;;25929:100;;;25996:4;-1:-1:-1;;;;;25996:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;25969:48:0;;-1:-1:-1;;;;25929:100:0;26039:12;26167:6;-1:-1:-1;;;;;26167:15:0;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26159:26;;26136:6;-1:-1:-1;;;;;26136:15:0;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26124:30;;26128:26;;26124:2;:30;:::i;:::-;26055:52;26092:14;-1:-1:-1;;;;;26055:13:0;;:52;:::i;:::-;:100;;;;:::i;:::-;26054:131;;;;:::i;:::-;26039:146;-1:-1:-1;26204:11:0;26211:4;26039:146;26204:11;:::i;:::-;26196:20;;;;;;;;;25372:852;:::o;16944:177::-;-1:-1:-1;;;;;17095:18:0;17063:7;17095:18;;;;;;;;;;;;16944:177::o;15321:103::-;15171:6;;-1:-1:-1;;;;;15171:6:0;2401:10;15233:23;15225:68;;;;-1:-1:-1;;;15225:68:0;;;;;;;:::i;:::-;15386:30:::1;15413:1;15386:18;:30::i;:::-;15321:103::o:0;25242:122::-;15171:6;;25294:4;;-1:-1:-1;;;;;15171:6:0;2401:10;15233:23;15225:68;;;;-1:-1:-1;;;15225:68:0;;;;;;;:::i;:::-;-1:-1:-1;25311:15:0::1;:23:::0;;-1:-1:-1;;25311:23:0::1;::::0;;;25242:122;:::o;34090:167::-;15171:6;;-1:-1:-1;;;;;15171:6:0;2401:10;15233:23;15225:68;;;;-1:-1:-1;;;15225:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34203:39:0;;;::::1;;::::0;;;:31:::1;:39;::::0;;;;:46;;-1:-1:-1;;34203:46:0::1;::::0;::::1;;::::0;;;::::1;::::0;;34090:167::o;25152:82::-;15171:6;;-1:-1:-1;;;;;15171:6:0;2401:10;15233:23;15225:68;;;;-1:-1:-1;;;15225:68:0;;;;;;;:::i;:::-;25205:14:::1;:21:::0;;-1:-1:-1;;25205:21:0::1;;;::::0;;25152:82::o;26232:491::-;26322:6;26343;26364:7;26386;26408:6;26457:14;26486:12;26513:17;26545;26577:22;26613:9;;;;;;;;;-1:-1:-1;;;;;26613:9:0;-1:-1:-1;;;;;26613:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26442:198;;;;-1:-1:-1;26442:198:0;;-1:-1:-1;26442:198:0;-1:-1:-1;26442:198:0;;-1:-1:-1;26232:491:0;-1:-1:-1;;;;;;26232:491:0:o;34961:100::-;15171:6;;-1:-1:-1;;;;;15171:6:0;2401:10;15233:23;15225:68;;;;-1:-1:-1;;;15225:68:0;;;;;;;:::i;:::-;35033:8:::1;:20:::0;;-1:-1:-1;;;;;;35033:20:0::1;-1:-1:-1::0;;;;;35033:20:0;;;::::1;::::0;;;::::1;::::0;;34961:100::o;16615:104::-;16671:13;16704:7;16697:14;;;;;:::i;38982:301::-;15171:6;;-1:-1:-1;;;;;15171:6:0;2401:10;15233:23;15225:68;;;;-1:-1:-1;;;15225:68:0;;;;;;;:::i;:::-;39091:14:::1;::::0;-1:-1:-1;;;;;39091:14:0;;::::1;39083:22:::0;;::::1;::::0;39075:92:::1;;;::::0;-1:-1:-1;;;39075:92:0;;11116:2:1;39075:92:0::1;::::0;::::1;11098:21:1::0;11155:2;11135:18;;;11128:30;11194:34;11174:18;;;11167:62;11265:27;11245:18;;;11238:55;11310:19;;39075:92:0::1;10914:421:1::0;39075:92:0::1;39178:41;39207:4;39213:5;39178:28;:41::i;:::-;39235:40;::::0;;::::1;;::::0;-1:-1:-1;;;;;39235:40:0;::::1;::::0;::::1;::::0;;;::::1;38982:301:::0;;:::o;30395:511::-;30501:14;;30463:4;;;;-1:-1:-1;;;;;30493:22:0;;;30501:14;;30493:22;:57;;;;-1:-1:-1;30533:16:0;;-1:-1:-1;;;;;30519:31:0;;;30533:16;;30519:31;;30493:57;-1:-1:-1;;;;;30586:25:0;;30561:22;30586:25;;;:19;:25;;;;;;30480:70;;-1:-1:-1;30561:22:0;30586:25;;;:52;;-1:-1:-1;;;;;;30615:23:0;;;;;;:19;:23;;;;;;;;30586:52;30669:14;;30561:77;;-1:-1:-1;;;;;;30663:20:0;;;30669:14;;30663:20;30649:11;30709:5;;:15;;;30718:6;30709:15;30752:10;;30695:29;;-1:-1:-1;30752:14:0;;;;;;30801:39;;-1:-1:-1;30827:13:0;;-1:-1:-1;;;30827:13:0;;;;30826:14;30801:39;:74;;;;;30858:17;30857:18;30801:74;:97;;;;;30892:6;30801:97;30780:118;30395:511;-1:-1:-1;;;;;;;;30395:511:0:o;18411:505::-;18531:4;2401:10;18531:4;18619:25;2401:10;18636:7;18619:9;:25::i;:::-;18592:52;;18697:15;18677:16;:35;;18655:122;;;;-1:-1:-1;;;18655:122:0;;11542:2:1;18655:122:0;;;11524:21:1;11581:2;11561:18;;;11554:30;11620:34;11600:18;;;11593:62;-1:-1:-1;;;11671:18:1;;;11664:35;11716:19;;18655:122:0;11340:401:1;18655:122:0;18813:60;18822:5;18829:7;18857:15;18838:16;:34;18813:8;:60::i;17129:234::-;17244:4;2401:10;17305:28;2401:10;17322:2;17326:6;17305:9;:28::i;35203:93::-;15171:6;;-1:-1:-1;;;;;15171:6:0;2401:10;15233:23;15225:68;;;;-1:-1:-1;;;15225:68:0;;;;;;;:::i;:::-;35287:1:::1;35266:18;:22:::0;35203:93::o;34651:182::-;15171:6;;-1:-1:-1;;;;;15171:6:0;2401:10;15233:23;15225:68;;;;-1:-1:-1;;;15225:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34736:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;34736:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;34791:34;;1345:41:1;;;34791:34:0::1;::::0;1318:18:1;34791:34:0::1;;;;;;;34651:182:::0;;:::o;31700:253::-;15171:6;;-1:-1:-1;;;;;15171:6:0;2401:10;15233:23;15225:68;;;;-1:-1:-1;;;15225:68:0;;;;;;;:::i;:::-;31840:4:::1;31832;31811:13;16916:12:::0;;;16828:108;31811:13:::1;:17;::::0;31827:1:::1;31811:17;:::i;:::-;31810:26;;;;:::i;:::-;31809:35;;;;:::i;:::-;31799:6;:45;;31777:131;;;::::0;-1:-1:-1;;;31777:131:0;;11948:2:1;31777:131:0::1;::::0;::::1;11930:21:1::0;11987:2;11967:18;;;11960:30;12026:34;12006:18;;;11999:62;-1:-1:-1;;;12077:18:1;;;12070:34;12121:19;;31777:131:0::1;11746:400:1::0;31777:131:0::1;31932:13;:6:::0;31941:4:::1;31932:13;:::i;:::-;31919:10;:26:::0;-1:-1:-1;31700:253:0:o;38618:173::-;15171:6;;-1:-1:-1;;;;;15171:6:0;2401:10;15233:23;15225:68;;;;-1:-1:-1;;;15225:68:0;;;;;;;:::i;:::-;38685:19:::1;::::0;-1:-1:-1;;;38685:19:0;::::1;;;:28;38677:69;;;::::0;-1:-1:-1;;;38677:69:0;;12353:2:1;38677:69:0::1;::::0;::::1;12335:21:1::0;12392:2;12372:18;;;12365:30;12431;12411:18;;;12404:58;12479:18;;38677:69:0::1;12151:352:1::0;38677:69:0::1;38757:19;:26:::0;;-1:-1:-1;;;;38757:26:0::1;-1:-1:-1::0;;;38757:26:0::1;::::0;;38618:173::o;34841:112::-;15171:6;;-1:-1:-1;;;;;15171:6:0;2401:10;15233:23;15225:68;;;;-1:-1:-1;;;15225:68:0;;;;;;;:::i;:::-;34919:14:::1;:26:::0;;-1:-1:-1;;;;;;34919:26:0::1;-1:-1:-1::0;;;;;34919:26:0;;;::::1;::::0;;;::::1;::::0;;34841:112::o;30914:498::-;15171:6;;31022:4;;-1:-1:-1;;;;;15171:6:0;2401:10;15233:23;15225:68;;;;-1:-1:-1;;;15225:68:0;;;;;;;:::i;:::-;31101:6:::1;31080:13;16916:12:::0;;;16828:108;31080:13:::1;:17;::::0;31096:1:::1;31080:17;:::i;:::-;31079:28;;;;:::i;:::-;31066:9;:41;;31044:144;;;::::0;-1:-1:-1;;;31044:144:0;;12710:2:1;31044:144:0::1;::::0;::::1;12692:21:1::0;12749:2;12729:18;;;12722:30;12788:34;12768:18;;;12761:62;-1:-1:-1;;;12839:18:1;;;12832:51;12900:19;;31044:144:0::1;12508:417:1::0;31044:144:0::1;31256:4;31235:13;16916:12:::0;;;16828:108;31235:13:::1;:17;::::0;31251:1:::1;31235:17;:::i;:::-;31234:26;;;;:::i;:::-;31221:9;:39;;31199:141;;;::::0;-1:-1:-1;;;31199:141:0;;13132:2:1;31199:141:0::1;::::0;::::1;13114:21:1::0;13171:2;13151:18;;;13144:30;13210:34;13190:18;;;13183:62;-1:-1:-1;;;13261:18:1;;;13254:50;13321:19;;31199:141:0::1;12930:416:1::0;31199:141:0::1;-1:-1:-1::0;31351:19:0::1;:31:::0;;;31400:4:::1;15304:1;30914:498:::0;;;:::o;38242:242::-;38288:43;38306:24;38324:4;38306:9;:24::i;:::-;38288:17;:43::i;38799:175::-;15171:6;;-1:-1:-1;;;;;15171:6:0;2401:10;15233:23;15225:68;;;;-1:-1:-1;;;15225:68:0;;;;;;;:::i;:::-;38867:19:::1;::::0;-1:-1:-1;;;38867:19:0;::::1;;;:27;;38890:4;38867:27;38859:69;;;::::0;-1:-1:-1;;;38859:69:0;;13553:2:1;38859:69:0::1;::::0;::::1;13535:21:1::0;13592:2;13572:18;;;13565:30;13631:31;13611:18;;;13604:59;13680:18;;38859:69:0::1;13351:353:1::0;38859:69:0::1;38939:19;:27:::0;;-1:-1:-1;;;;38939:27:0::1;::::0;;38799:175::o;17371:201::-;-1:-1:-1;;;;;17537:18:0;;;17505:7;17537:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;17371:201::o;33919:163::-;34025:49;34041:6;34049:3;34054:7;34063:10;34025:15;:49::i;:::-;33919:163;;;;:::o;15432:238::-;15171:6;;-1:-1:-1;;;;;15171:6:0;2401:10;15233:23;15225:68;;;;-1:-1:-1;;;15225:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;15535:22:0;::::1;15513:110;;;::::0;-1:-1:-1;;;15513:110:0;;13911:2:1;15513:110:0::1;::::0;::::1;13893:21:1::0;13950:2;13930:18;;;13923:30;13989:34;13969:18;;;13962:62;-1:-1:-1;;;14040:18:1;;;14033:36;14086:19;;15513:110:0::1;13709:402:1::0;15513:110:0::1;15634:28;15653:8;15634:18;:28::i;38492:118::-:0;15171:6;;-1:-1:-1;;;;;15171:6:0;2401:10;15233:23;15225:68;;;;-1:-1:-1;;;15225:68:0;;;;;;;:::i;:::-;38586:15:::1;:3:::0;38594:6:::1;38586:7;:15::i;:::-;38562:14;:40:::0;-1:-1:-1;38492:118:0:o;20650:380::-;-1:-1:-1;;;;;20786:19:0;;20778:68;;;;-1:-1:-1;;;20778:68:0;;14318:2:1;20778:68:0;;;14300:21:1;14357:2;14337:18;;;14330:30;14396:34;14376:18;;;14369:62;-1:-1:-1;;;14447:18:1;;;14440:34;14491:19;;20778:68:0;14116:400:1;20778:68:0;-1:-1:-1;;;;;20865:21:0;;20857:68;;;;-1:-1:-1;;;20857:68:0;;14723:2:1;20857:68:0;;;14705:21:1;14762:2;14742:18;;;14735:30;14801:34;14781:18;;;14774:62;-1:-1:-1;;;14852:18:1;;;14845:32;14894:19;;20857:68:0;14521:398:1;20857:68:0;-1:-1:-1;;;;;20938:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;20990:32;;160:25:1;;;20990:32:0;;133:18:1;20990:32:0;;;;;;;20650:380;;;:::o;21038:502::-;21173:24;21200:25;21210:5;21217:7;21200:9;:25::i;:::-;21173:52;;-1:-1:-1;;21240:16:0;:37;21236:297;;21340:6;21320:16;:26;;21294:117;;;;-1:-1:-1;;;21294:117:0;;15126:2:1;21294:117:0;;;15108:21:1;15165:2;15145:18;;;15138:30;15204:31;15184:18;;;15177:59;15253:18;;21294:117:0;14924:353:1;21294:117:0;21455:51;21464:5;21471:7;21499:6;21480:16;:25;21455:8;:51::i;26731:2564::-;-1:-1:-1;;;;;26879:25:0;;26855:21;26879:25;;;:19;:25;;;;;;;;;:65;;-1:-1:-1;;;;;;26921:23:0;;;;;;:19;:23;;;;;;;;26879:65;26855:89;-1:-1:-1;;;;;;26965:18:0;;26957:68;;;;-1:-1:-1;;;26957:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;27044:16:0;;27036:64;;;;-1:-1:-1;;;27036:64:0;;;;;;;:::i;:::-;27117:6;27127:1;27117:11;27113:93;;27145:28;27161:4;27167:2;27171:1;27145:15;:28::i;27113:93::-;27239:14;;27218:10;;-1:-1:-1;;;;;27231:22:0;;;27239:14;;27231:22;:75;;;;-1:-1:-1;;;;;;27271:35:0;;;;;;:31;:35;;;;;;;;27270:36;27231:75;27337:14;;27218:88;;-1:-1:-1;27317:11:0;;-1:-1:-1;;;;;27331:20:0;;;27337:14;;27331:20;:75;;;;-1:-1:-1;;;;;;27369:37:0;;;;;;:31;:37;;;;;;;;27368:38;27331:75;27317:89;;27417:16;27444:7;15171:6;;-1:-1:-1;;;;;15171:6:0;;15098:87;27444:7;-1:-1:-1;;;;;27436:15:0;:4;-1:-1:-1;;;;;27436:15:0;;:32;;;-1:-1:-1;15171:6:0;;-1:-1:-1;;;;;27455:13:0;;;15171:6;;27455:13;27436:32;27417:51;-1:-1:-1;27479:11:0;-1:-1:-1;;;;;27493:16:0;;;;:41;;-1:-1:-1;;;;;;27513:21:0;;27527:6;27513:21;27493:41;27479:55;;27545:17;27565:11;:21;;;;27580:6;27565:21;:38;;;-1:-1:-1;27590:13:0;;-1:-1:-1;;;27590:13:0;;;;27565:38;27628:15;;27545:58;;-1:-1:-1;27628:15:0;;:32;;;;;27648:12;27647:13;27628:32;27624:1076;;;27703:14;;;;;;;;:34;;;27721:16;27703:34;27677:118;;;;-1:-1:-1;;;27677:118:0;;16294:2:1;27677:118:0;;;16276:21:1;16333:2;16313:18;;;16306:30;-1:-1:-1;;;16352:18:1;;;16345:52;16414:18;;27677:118:0;16092:346:1;27677:118:0;27814:5;27810:879;;;27880:21;;27870:6;:31;;27840:158;;;;-1:-1:-1;;;27840:158:0;;16645:2:1;27840:158:0;;;16627:21:1;16684:2;16664:18;;;16657:30;16723:34;16703:18;;;16696:62;-1:-1:-1;;;16774:18:1;;;16767:51;16835:19;;27840:158:0;16443:417:1;27840:158:0;28073:10;;28056:13;28066:2;28056:9;:13::i;:::-;28047:22;;:6;:22;:::i;:::-;:36;;28017:129;;;;-1:-1:-1;;;28017:129:0;;17067:2:1;28017:129:0;;;17049:21:1;17106:2;17086:18;;;17079:30;-1:-1:-1;;;17125:18:1;;;17118:49;17184:18;;28017:129:0;16865:343:1;28017:129:0;27810:879;;;28172:6;28168:521;;-1:-1:-1;;;;;28415:35:0;;;;;;:31;:35;;;;;;;;28414:36;:95;;;;-1:-1:-1;;;;;;28472:37:0;;;;;;:31;:37;;;;;;;;28471:38;28414:95;28392:297;;;28600:10;;28583:13;28593:2;28583:9;:13::i;:::-;28574:22;;:6;:22;:::i;:::-;:36;;28544:129;;;;-1:-1:-1;;;28544:129:0;;17067:2:1;28544:129:0;;;17049:21:1;17106:2;17086:18;;;17079:30;-1:-1:-1;;;17125:18:1;;;17118:49;17184:18;;28544:129:0;16865:343:1;28544:129:0;28717:13;;-1:-1:-1;;;28717:13:0;;;;28716:14;:63;;;;-1:-1:-1;;;;;;28748:31:0;;;;;;:25;:31;;;;;;;;28747:32;28716:63;:106;;;;-1:-1:-1;;;;;;28797:25:0;;;;;;:19;:25;;;;;;;;28796:26;28716:106;:147;;;;-1:-1:-1;;;;;;28840:23:0;;;;;;:19;:23;;;;;;;;28839:24;28716:147;:183;;;;;28898:1;28880:15;:13;:15::i;:::-;:19;28716:183;28712:516;;;28916:28;28947:24;28965:4;28947:9;:24::i;:::-;29025:19;;28916:55;;-1:-1:-1;29001:43:0;;;;;;;29063:28;;;29075:16;29074:17;29063:28;29059:158;;;29112:13;:20;;-1:-1:-1;;;;29112:20:0;-1:-1:-1;;;29112:20:0;;;29151:10;:8;:10::i;:::-;29180:13;:21;;-1:-1:-1;;;;29180:21:0;;;29059:158;28901:327;;28712:516;29238:49;29255:4;29261:2;29265:6;29273;29281:5;29238:16;:49::i;:::-;26844:2451;;;;;;26731:2564;;;:::o;15678:191::-;15771:6;;;-1:-1:-1;;;;;15788:17:0;;;-1:-1:-1;;;;;;15788:17:0;;;;;;;15821:40;;15771:6;;;15788:17;15771:6;;15821:40;;15752:16;;15821:40;15741:128;15678:191;:::o;39291:235::-;-1:-1:-1;;;;;39374:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;39374:39:0;;;;;;;39424:38;39374:31;:39;39424:25;:38::i;35403:479::-;35494:16;;;35508:1;35494:16;;;;;;;;35470:21;;35494:16;;;;;;;;;;-1:-1:-1;35494:16:0;35470:40;;35539:4;35521;35526:1;35521:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;35521:23:0;;;:7;;;;;;;;;;:23;;;;35565:16;;:23;;;-1:-1:-1;;;35565:23:0;;;;:16;;;;;:21;;:23;;;;;35521:7;;35565:23;;;;;:16;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35555:4;35560:1;35555:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;35555:33:0;;;:7;;;;;;;;;:33;35633:16;;35601:63;;35618:4;;35633:16;35652:11;35601:8;:63::i;:::-;35677:16;;:197;;-1:-1:-1;;;35677:197:0;;-1:-1:-1;;;;;35677:16:0;;;;:67;;:197;;35759:11;;35677:16;;35801:4;;35828;;35848:15;;35677:197;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35459:423;35403:479;:::o;31961:1950::-;-1:-1:-1;;;;;32119:20:0;;32111:59;;;;-1:-1:-1;;;32111:59:0;;18732:2:1;32111:59:0;;;18714:21:1;18771:2;18751:18;;;18744:30;18810:28;18790:18;;;18783:56;18856:18;;32111:59:0;18530:350:1;32111:59:0;32205:16;;;32219:1;32205:16;;;;;;;;32181:21;;32205:16;;;;;;;;-1:-1:-1;;32242:16:0;;:23;;;-1:-1:-1;;;32242:23:0;;;;32181:40;;-1:-1:-1;;;;;;32242:16:0;;;;:21;;-1:-1:-1;32242:23:0;;;;;;;;;;;;;;:16;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32232:4;32237:1;32232:7;;;;;;;;:::i;:::-;;;;;;:33;-1:-1:-1;;;;;32232:33:0;;;-1:-1:-1;;;;;32232:33:0;;;;;32294:4;32276;32281:1;32276:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;32276:23:0;;;-1:-1:-1;;;;;32276:23:0;;;;;32310:18;32344:10;32343:11;:47;;;-1:-1:-1;32379:10:0;32359:31;;;;:19;:31;;;;;;;;32358:32;32343:47;32339:1565;;;32430:4;32435:1;32430:7;;;;;;;;:::i;:::-;;;;;;;;;;;32423:30;;-1:-1:-1;;;32423:30:0;;-1:-1:-1;;;;;2995:32:1;;;32423:30:0;;;2977:51:1;32423:25:0;;;;;;2950:18:1;;32423:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32468:16;;:229;;-1:-1:-1;;;32468:229:0;;32407:46;;-1:-1:-1;;;;;;32468:16:0;;:67;;32561:7;;32468:229;;:16;;32622:4;;32645:3;;32667:15;;32468:229;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32729:1;32716:10;;:14;32712:308;;;32751:11;32790:3;32776:10;;32766:7;:20;;;;:::i;:::-;32765:28;;;;:::i;:::-;32751:42;;32812:18;32856:3;32844:8;;32834:7;:18;;;;:::i;:::-;32833:26;;;;:::i;:::-;32812:47;-1:-1:-1;32888:13:0;32898:3;32888:7;:13;:::i;:::-;32878:23;-1:-1:-1;32924:14:0;;32920:85;;32963:22;32969:3;32974:10;32963:5;:22::i;:::-;32732:288;;32712:308;32339:1565;;;33056:10;33052:394;;;33091:10;;:14;33087:344;;33130:11;33169:3;33155:10;;33145:7;:20;;;;:::i;:::-;33144:28;;;;:::i;:::-;33130:42;;33195:18;33239:3;33227:8;;33217:7;:18;;;;:::i;:::-;33216:26;;;;:::i;:::-;33195:47;-1:-1:-1;33275:13:0;33285:3;33275:7;:13;:::i;:::-;33265:23;-1:-1:-1;33315:14:0;;33311:101;;33358:22;33364:3;33369:10;33358:5;:22::i;:::-;33382:7;;;;;;33311:101;33107:324;;33087:344;33485:4;33490:1;33485:7;;;;;;;;:::i;:::-;;;;;;;;;;;33478:30;;-1:-1:-1;;;33478:30:0;;-1:-1:-1;;;;;2995:32:1;;;33478:30:0;;;2977:51:1;33478:25:0;;;;;;2950:18:1;;33478:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33461:14;:47;33523:10;33536;:34;;33567:3;33536:34;;;33557:6;33536:34;33523:47;-1:-1:-1;33589:11:0;;33585:308;;33621:16;;:256;;-1:-1:-1;;;33621:256:0;;-1:-1:-1;;;;;33621:16:0;;;;:67;;33718:7;;33621:256;;:16;;33791:4;;33818:2;;33843:15;;33621:256;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33585:308;33037:867;32100:1811;;31961:1950;;;;:::o;13774:98::-;13832:7;13859:5;13863:1;13859;:5;:::i;:::-;13852:12;13774:98;-1:-1:-1;;;13774:98:0:o;18928:708::-;-1:-1:-1;;;;;19059:18:0;;19051:68;;;;-1:-1:-1;;;19051:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19138:16:0;;19130:64;;;;-1:-1:-1;;;19130:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19280:15:0;;19258:19;19280:15;;;;;;;;;;;19328:21;;;;19306:109;;;;-1:-1:-1;;;19306:109:0;;19791:2:1;19306:109:0;;;19773:21:1;19830:2;19810:18;;;19803:30;19869:34;19849:18;;;19842:62;-1:-1:-1;;;19920:18:1;;;19913:36;19966:19;;19306:109:0;19589:402:1;19306:109:0;-1:-1:-1;;;;;19451:15:0;;;:9;:15;;;;;;;;;;;19469:20;;;19451:38;;19511:13;;;;;;;;:23;;19483:6;;19451:9;19511:23;;19483:6;;19511:23;:::i;:::-;;;;;;;;19567:2;-1:-1:-1;;;;;19552:26:0;19561:4;-1:-1:-1;;;;;19552:26:0;;19571:6;19552:26;;;;160:25:1;;148:2;133:18;;14:177;19552:26:0;;;;;;;;19591:37;34265:378;36261:1781;36300:23;36326:24;36344:4;36326:9;:24::i;:::-;36300:50;;36361:25;36447:13;;36411:19;;36389;;:41;;;;:::i;:::-;:71;;;;:::i;:::-;36501:8;;36361:99;;-1:-1:-1;36471:17:0;;36491:19;;-1:-1:-1;;;;;36501:8:0;36491:9;:19::i;:::-;36471:39;-1:-1:-1;36525:20:0;;;:46;;-1:-1:-1;36549:22:0;;36525:46;36521:59;;;36573:7;;;36261:1781::o;36521:59::-;36612:19;;36594:15;:37;36590:107;;;36666:19;;36648:37;;36590:107;36707:23;36821:1;36788:17;36752:19;;36734:15;:37;;;;:::i;:::-;36733:72;;;;:::i;:::-;:89;;;;:::i;:::-;36707:115;-1:-1:-1;36833:26:0;36862:65;36917:9;36862:36;:15;36707:115;36862:19;:36::i;:::-;:54;;:65::i;:::-;36833:94;-1:-1:-1;36966:21:0;36998:37;36833:94;36998:17;:37::i;:::-;37046:18;37067:44;:21;37093:17;37067:25;:44::i;:::-;37046:65;;37122:23;37148:82;37202:17;37148:35;37163:19;;37148:10;:14;;:35;;;;:::i;:::-;:39;;:82::i;:::-;37122:108;;37241:17;37261:76;37309:17;37261:29;37276:13;;37261:10;:14;;:29;;;;:::i;:76::-;37241:96;-1:-1:-1;37348:23:0;37241:96;37374:28;37387:15;37374:10;:28;:::i;:::-;:40;;;;:::i;:::-;37348:66;;37449:1;37431:15;:19;:42;;;;;37472:1;37454:15;:19;37431:42;37427:280;;;37490:47;37504:15;37521;37490:13;:47::i;:::-;37661:19;;37557:138;;;20198:25:1;;;20254:2;20239:18;;20232:34;;;20282:18;;;20275:34;;;;37557:138:0;;;;;;20186:2:1;37557:138:0;;;37427:280;37741:1;37719:19;:23;;;37753:19;:23;;;37787:13;:17;;;37857:14;;37849:80;;-1:-1:-1;;;;;37857:14:0;;;;37899:15;;37741:1;37849:80;37741:1;37849:80;37899:15;37857:14;37849:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;37974:8:0;;37966:68;;37817:112;;-1:-1:-1;37941:19:0;;-1:-1:-1;;;;;37974:8:0;;;;38010:9;;37941:19;37966:68;37941:19;37966:68;38010:9;37974:8;37966:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;36261:1781:0:o;29303:1084::-;29467:12;29482:21;29494:4;29500:2;29482:11;:21::i;:::-;29467:36;;29518:7;29514:821;;;29558:10;;29603:13;;29631:151;;;;29683:18;;29670:10;;:31;;;;:::i;:::-;29662:39;;29748:18;;29732:13;;:34;;;;:::i;:::-;29720:46;;29631:151;29800:5;29796:148;;;29847:17;;29834:10;;:30;;;;:::i;:::-;29826:38;;29911:17;;29895:13;;:33;;;;:::i;:::-;29883:45;;29796:148;29958:12;29973:26;29995:3;29973:17;:6;29984:5;29973:10;:17::i;:26::-;29958:41;;30062:5;30045:13;;30038:4;:20;;;;:::i;:::-;30037:30;;;;:::i;:::-;30014:19;;:53;;;;;;;:::i;:::-;;;;-1:-1:-1;30126:5:0;;-1:-1:-1;30106:16:0;30113:9;30106:4;:16;:::i;:::-;30105:26;;;;:::i;:::-;30082:19;;:49;;;;;;;:::i;:::-;;;;-1:-1:-1;;30171:7:0;;30182:5;;30164:14;;:4;:14;:::i;:::-;30163:24;;;;:::i;:::-;30146:13;;:41;;;;;;;:::i;:::-;;;;-1:-1:-1;;30208:8:0;;30204:91;;30237:42;30253:4;30267;30274;30237:15;:42::i;:::-;30309:14;30319:4;30309:14;;:::i;:::-;;;29527:808;;;29514:821;30346:33;30362:4;30368:2;30372:6;30346:15;:33::i;20051:591::-;-1:-1:-1;;;;;20135:21:0;;20127:67;;;;-1:-1:-1;;;20127:67:0;;20522:2:1;20127:67:0;;;20504:21:1;20561:2;20541:18;;;20534:30;20600:34;20580:18;;;20573:62;-1:-1:-1;;;20651:18:1;;;20644:31;20692:19;;20127:67:0;20320:397:1;20127:67:0;-1:-1:-1;;;;;20294:18:0;;20269:22;20294:18;;;;;;;;;;;20331:24;;;;20323:71;;;;-1:-1:-1;;;20323:71:0;;20924:2:1;20323:71:0;;;20906:21:1;20963:2;20943:18;;;20936:30;21002:34;20982:18;;;20975:62;-1:-1:-1;;;21053:18:1;;;21046:32;21095:19;;20323:71:0;20722:398:1;20323:71:0;-1:-1:-1;;;;;20430:18:0;;:9;:18;;;;;;;;;;20451:23;;;20430:44;;20496:12;:22;;20468:6;;20430:9;20496:22;;20468:6;;20496:22;:::i;:::-;;;;-1:-1:-1;;20536:37:0;;160:25:1;;;20562:1:0;;-1:-1:-1;;;;;20536:37:0;;;;;148:2:1;133:18;20536:37:0;;;;;;;34265:378;;;:::o;13668:98::-;13726:7;13753:5;13757:1;13753;:5;:::i;13880:98::-;13938:7;13965:5;13969:1;13965;:5;:::i;35890:363::-;36004:16;;35972:63;;35989:4;;-1:-1:-1;;;;;36004:16:0;36023:11;35972:8;:63::i;:::-;36046:16;;-1:-1:-1;;;;;36046:16:0;:32;36086:9;36119:4;36139:11;36046:16;;36197:7;15171:6;;-1:-1:-1;;;;;15171:6:0;;15098:87;36197:7;36046:199;;;;;;-1:-1:-1;;;;;;36046:199:0;;;-1:-1:-1;;;;;21484:15:1;;;36046:199:0;;;21466:34:1;21516:18;;;21509:34;;;;21559:18;;;21552:34;;;;21602:18;;;21595:34;21666:15;;;21645:19;;;21638:44;36219:15:0;21698:19:1;;;21691:35;21400:19;;36046:199:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;35890:363;;:::o;196:548:1:-;308:4;337:2;366;355:9;348:21;398:6;392:13;441:6;436:2;425:9;421:18;414:34;466:1;476:140;490:6;487:1;484:13;476:140;;;585:14;;;581:23;;575:30;551:17;;;570:2;547:26;540:66;505:10;;476:140;;;480:3;665:1;660:2;651:6;640:9;636:22;632:31;625:42;735:2;728;724:7;719:2;711:6;707:15;703:29;692:9;688:45;684:54;676:62;;;;196:548;;;;:::o;749:131::-;-1:-1:-1;;;;;824:31:1;;814:42;;804:70;;870:1;867;860:12;885:315;953:6;961;1014:2;1002:9;993:7;989:23;985:32;982:52;;;1030:1;1027;1020:12;982:52;1069:9;1056:23;1088:31;1113:5;1088:31;:::i;:::-;1138:5;1190:2;1175:18;;;;1162:32;;-1:-1:-1;;;885:315:1:o;1397:180::-;1456:6;1509:2;1497:9;1488:7;1484:23;1480:32;1477:52;;;1525:1;1522;1515:12;1477:52;-1:-1:-1;1548:23:1;;1397:180;-1:-1:-1;1397:180:1:o;1582:316::-;1659:6;1667;1675;1728:2;1716:9;1707:7;1703:23;1699:32;1696:52;;;1744:1;1741;1734:12;1696:52;-1:-1:-1;;1767:23:1;;;1837:2;1822:18;;1809:32;;-1:-1:-1;1888:2:1;1873:18;;;1860:32;;1582:316;-1:-1:-1;1582:316:1:o;1903:456::-;1980:6;1988;1996;2049:2;2037:9;2028:7;2024:23;2020:32;2017:52;;;2065:1;2062;2055:12;2017:52;2104:9;2091:23;2123:31;2148:5;2123:31;:::i;:::-;2173:5;-1:-1:-1;2230:2:1;2215:18;;2202:32;2243:33;2202:32;2243:33;:::i;:::-;1903:456;;2295:7;;-1:-1:-1;;;2349:2:1;2334:18;;;;2321:32;;1903:456::o;2553:247::-;2612:6;2665:2;2653:9;2644:7;2640:23;2636:32;2633:52;;;2681:1;2678;2671:12;2633:52;2720:9;2707:23;2739:31;2764:5;2739:31;:::i;3247:160::-;3312:20;;3368:13;;3361:21;3351:32;;3341:60;;3397:1;3394;3387:12;3412:315;3477:6;3485;3538:2;3526:9;3517:7;3513:23;3509:32;3506:52;;;3554:1;3551;3544:12;3506:52;3593:9;3580:23;3612:31;3637:5;3612:31;:::i;:::-;3662:5;-1:-1:-1;3686:35:1;3717:2;3702:18;;3686:35;:::i;:::-;3676:45;;3412:315;;;;;:::o;4253:388::-;4321:6;4329;4382:2;4370:9;4361:7;4357:23;4353:32;4350:52;;;4398:1;4395;4388:12;4350:52;4437:9;4424:23;4456:31;4481:5;4456:31;:::i;:::-;4506:5;-1:-1:-1;4563:2:1;4548:18;;4535:32;4576:33;4535:32;4576:33;:::i;:::-;4628:7;4618:17;;;4253:388;;;;;:::o;4646:525::-;4729:6;4737;4745;4753;4806:3;4794:9;4785:7;4781:23;4777:33;4774:53;;;4823:1;4820;4813:12;4774:53;4862:9;4849:23;4881:31;4906:5;4881:31;:::i;:::-;4931:5;-1:-1:-1;4988:2:1;4973:18;;4960:32;5001:33;4960:32;5001:33;:::i;:::-;5053:7;-1:-1:-1;5107:2:1;5092:18;;5079:32;;-1:-1:-1;5130:35:1;5161:2;5146:18;;5130:35;:::i;:::-;5120:45;;4646:525;;;;;;;:::o;5176:380::-;5255:1;5251:12;;;;5298;;;5319:61;;5373:4;5365:6;5361:17;5351:27;;5319:61;5426:2;5418:6;5415:14;5395:18;5392:38;5389:161;;5472:10;5467:3;5463:20;5460:1;5453:31;5507:4;5504:1;5497:15;5535:4;5532:1;5525:15;5389:161;;5176:380;;;:::o;5561:356::-;5763:2;5745:21;;;5782:18;;;5775:30;5841:34;5836:2;5821:18;;5814:62;5908:2;5893:18;;5561:356::o;5922:127::-;5983:10;5978:3;5974:20;5971:1;5964:31;6014:4;6011:1;6004:15;6038:4;6035:1;6028:15;6054:168;6127:9;;;6158;;6175:15;;;6169:22;;6155:37;6145:71;;6196:18;;:::i;6227:217::-;6267:1;6293;6283:132;;6337:10;6332:3;6328:20;6325:1;6318:31;6372:4;6369:1;6362:15;6400:4;6397:1;6390:15;6283:132;-1:-1:-1;6429:9:1;;6227:217::o;6865:125::-;6930:9;;;6951:10;;;6948:36;;;6964:18;;:::i;7563:251::-;7633:6;7686:2;7674:9;7665:7;7661:23;7657:32;7654:52;;;7702:1;7699;7692:12;7654:52;7734:9;7728:16;7753:31;7778:5;7753:31;:::i;7819:188::-;7898:13;;-1:-1:-1;;;;;7940:42:1;;7930:53;;7920:81;;7997:1;7994;7987:12;8012:450;8099:6;8107;8115;8168:2;8156:9;8147:7;8143:23;8139:32;8136:52;;;8184:1;8181;8174:12;8136:52;8207:40;8237:9;8207:40;:::i;:::-;8197:50;;8266:49;8311:2;8300:9;8296:18;8266:49;:::i;:::-;8256:59;;8358:2;8347:9;8343:18;8337:25;8402:10;8395:5;8391:22;8384:5;8381:33;8371:61;;8428:1;8425;8418:12;8371:61;8451:5;8441:15;;;8012:450;;;;;:::o;8467:273::-;8535:6;8588:2;8576:9;8567:7;8563:23;8559:32;8556:52;;;8604:1;8601;8594:12;8556:52;8636:9;8630:16;8686:4;8679:5;8675:16;8668:5;8665:27;8655:55;;8706:1;8703;8696:12;8745:128;8812:9;;;8833:11;;;8830:37;;;8847:18;;:::i;8878:179::-;8956:13;;9009:22;8998:34;;8988:45;;8978:73;;9047:1;9044;9037:12;9062:473;9165:6;9173;9181;9189;9197;9250:3;9238:9;9229:7;9225:23;9221:33;9218:53;;;9267:1;9264;9257:12;9218:53;9290:39;9319:9;9290:39;:::i;:::-;9280:49;;9369:2;9358:9;9354:18;9348:25;9338:35;;9413:2;9402:9;9398:18;9392:25;9382:35;;9457:2;9446:9;9442:18;9436:25;9426:35;;9480:49;9524:3;9513:9;9509:19;9480:49;:::i;:::-;9470:59;;9062:473;;;;;;;;:::o;9540:422::-;9629:1;9672:5;9629:1;9686:270;9707:7;9697:8;9694:21;9686:270;;;9766:4;9762:1;9758:6;9754:17;9748:4;9745:27;9742:53;;;9775:18;;:::i;:::-;9825:7;9815:8;9811:22;9808:55;;;9845:16;;;;9808:55;9924:22;;;;9884:15;;;;9686:270;;;9690:3;9540:422;;;;;:::o;9967:806::-;10016:5;10046:8;10036:80;;-1:-1:-1;10087:1:1;10101:5;;10036:80;10135:4;10125:76;;-1:-1:-1;10172:1:1;10186:5;;10125:76;10217:4;10235:1;10230:59;;;;10303:1;10298:130;;;;10210:218;;10230:59;10260:1;10251:10;;10274:5;;;10298:130;10335:3;10325:8;10322:17;10319:43;;;10342:18;;:::i;:::-;-1:-1:-1;;10398:1:1;10384:16;;10413:5;;10210:218;;10512:2;10502:8;10499:16;10493:3;10487:4;10484:13;10480:36;10474:2;10464:8;10461:16;10456:2;10450:4;10447:12;10443:35;10440:77;10437:159;;;-1:-1:-1;10549:19:1;;;10581:5;;10437:159;10628:34;10653:8;10647:4;10628:34;:::i;:::-;10698:6;10694:1;10690:6;10686:19;10677:7;10674:32;10671:58;;;10709:18;;:::i;:::-;10747:20;;9967:806;-1:-1:-1;;;9967:806:1:o;10778:131::-;10838:5;10867:36;10894:8;10888:4;10867:36;:::i;15282:401::-;15484:2;15466:21;;;15523:2;15503:18;;;15496:30;15562:34;15557:2;15542:18;;15535:62;-1:-1:-1;;;15628:2:1;15613:18;;15606:35;15673:3;15658:19;;15282:401::o;15688:399::-;15890:2;15872:21;;;15929:2;15909:18;;;15902:30;15968:34;15963:2;15948:18;;15941:62;-1:-1:-1;;;16034:2:1;16019:18;;16012:33;16077:3;16062:19;;15688:399::o;17345:127::-;17406:10;17401:3;17397:20;17394:1;17387:31;17437:4;17434:1;17427:15;17461:4;17458:1;17451:15;17477:461;17530:3;17568:5;17562:12;17595:6;17590:3;17583:19;17621:4;17650:2;17645:3;17641:12;17634:19;;17687:2;17680:5;17676:14;17708:1;17718:195;17732:6;17729:1;17726:13;17718:195;;;17797:13;;-1:-1:-1;;;;;17793:39:1;17781:52;;17853:12;;;;17888:15;;;;17829:1;17747:9;17718:195;;;-1:-1:-1;17929:3:1;;17477:461;-1:-1:-1;;;;;17477:461:1:o;17943:582::-;18242:6;18231:9;18224:25;18285:6;18280:2;18269:9;18265:18;18258:34;18328:3;18323:2;18312:9;18308:18;18301:31;18205:4;18349:57;18401:3;18390:9;18386:19;18378:6;18349:57;:::i;:::-;-1:-1:-1;;;;;18442:32:1;;;;18437:2;18422:18;;18415:60;-1:-1:-1;18506:3:1;18491:19;18484:35;18341:65;17943:582;-1:-1:-1;;;17943:582:1:o;18885:184::-;18955:6;19008:2;18996:9;18987:7;18983:23;18979:32;18976:52;;;19024:1;19021;19014:12;18976:52;-1:-1:-1;19047:16:1;;18885:184;-1:-1:-1;18885:184:1:o;19074:510::-;19345:6;19334:9;19327:25;19388:3;19383:2;19372:9;19368:18;19361:31;19308:4;19409:57;19461:3;19450:9;19446:19;19438:6;19409:57;:::i;:::-;-1:-1:-1;;;;;19502:32:1;;;;19497:2;19482:18;;19475:60;-1:-1:-1;19566:2:1;19551:18;19544:34;19401:65;19074:510;-1:-1:-1;;19074:510:1:o;21737:306::-;21825:6;21833;21841;21894:2;21882:9;21873:7;21869:23;21865:32;21862:52;;;21910:1;21907;21900:12;21862:52;21939:9;21933:16;21923:26;;21989:2;21978:9;21974:18;21968:25;21958:35;;22033:2;22022:9;22018:18;22012:25;22002:35;;21737:306;;;;;:::o

Swarm Source

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