ETH Price: $3,424.14 (-1.50%)
Gas: 6 Gwei

Token

By Frens For Frens (BFF)
 

Overview

Max Total Supply

1,000,000,000,000 BFF

Holders

123

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
8,961,367.411755686866244779 BFF

Value
$0.00
0xff78ff02e9bdc2516377116867ec6eb4b3349102
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.

Contract Source Code Verified (Exact Match)

Contract Name:
BFF

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-06-21
*/

// File: contracts/BFF.sol

/**
 *Submitted for verification at Etherscan.io on 2022-06-21
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.11;

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

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
}

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

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

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

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

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

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, _allowances[owner][spender] + addedValue);
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue)
        public
        virtual
        returns (bool)
    {
        address owner = _msgSender();
        uint256 currentAllowance = _allowances[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 {}
}

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

library Counters {
    struct Counter {
        uint256 _value;
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

contract Ownable {
    address private _owner;
    address private _previousOwner;
    event OwnershipTransferred(
        address indexed previousOwner,
        address indexed newOwner
    );

    constructor() {
        _owner = msg.sender;
        emit OwnershipTransferred(address(0), _owner);
    }

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

    modifier onlyOwner() {
        require(_owner == msg.sender, "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }
}

interface IUniswapV2Factory {
    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);
     
    function createPair(address tokenA, address tokenB) external returns (address pair);
 }

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

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

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

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

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

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

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

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

    function initialize(address, address) external;
}

interface IUniswapV2Router02 {
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        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 factory() external pure returns (address);

    function WETH() external pure returns (address);

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

library Referrals {

    struct Data {
        uint256 tokensNeededForRefferalNumber;
        mapping(uint256 => address) registeredReferrersByCode;
        mapping(address => uint256) registeredReferrersByAddress;
        uint256 currentRefferralCode;
    }

    event RefferalCodeGenerated(address account, uint256 code, uint256 inc1, uint256 inc2);


    event UpdateTokensNeededForReferralNumber(uint256 value);


    function init(Data storage data) public {
        updateTokensNeededForReferralNumber(data, 10000 * (10**18)); //10000 tokens needed

        data.currentRefferralCode = 10000;
    }

    function updateTokensNeededForReferralNumber(Data storage data, uint256 value) public {
        data.tokensNeededForRefferalNumber = value;
        emit UpdateTokensNeededForReferralNumber(value);
    }

    function random(Data storage data, uint256 min, uint256 max) private view returns (uint256) {
        return min + uint256(keccak256(abi.encodePacked(block.difficulty, block.timestamp, data.currentRefferralCode))) % (max - min + 1);
    }

    function handleNewBalance(Data storage data, address account, uint256 balance) public {
        //already registered
        if(data.registeredReferrersByAddress[account] != 0) {
            return;
        }
        //not enough tokens
        if(balance < data.tokensNeededForRefferalNumber) {
            return;
        }
        //randomly increment referral code 
        //cannot be guessed easily
        uint256 inc1 = random(data, 1, 7);
        uint256 inc2 = random(data, 1, 9);
        data.currentRefferralCode += inc1;

        //don't allow referral code to end in 0,
        //so that ambiguous codes do not exist (ie, 420 and 4200)
        if(data.currentRefferralCode % 10 == 0) {
            data.currentRefferralCode += inc2;
        }

        if(data.currentRefferralCode < 10000) {
            uint256 inc3 = random(data, 51, 35156);
            data.currentRefferralCode = 10000;
            data.currentRefferralCode += inc3;

            if(data.currentRefferralCode % 10 == 0) {
            data.currentRefferralCode += inc2;
        }
        }
        
        if(data.currentRefferralCode > 99999) {
            uint256 inc4 = random(data, 111, 65644);
            data.currentRefferralCode = 10000;
            data.currentRefferralCode += inc4;

            if(data.currentRefferralCode % 10 == 0) {
            data.currentRefferralCode += inc2;
        }
        }

        if(data.registeredReferrersByCode[data.currentRefferralCode] != address(0)) {
            data.currentRefferralCode += inc2;
        }
        
        data.registeredReferrersByCode[data.currentRefferralCode] = account;
        data.registeredReferrersByAddress[account] = data.currentRefferralCode;

        emit RefferalCodeGenerated(account, data.currentRefferralCode, inc1, inc2);
    }

    function getReferralCode(Data storage referrals, address account) public view returns (uint256) {
        return referrals.registeredReferrersByAddress[account];
    }

    function getReferrer(Data storage referrals, uint256 referralCode) public view returns (address) {
        return referrals.registeredReferrersByCode[referralCode];
    }

    function getReferralCodeFromTokenAmount(uint256 tokenAmount) private pure returns (uint256) {

        return (tokenAmount % (10**18))/(10**(13));

    }

    function getReferrerFromTokenAmount(Data storage referrals, uint256 tokenAmount) public view returns (address) {
        uint256 referralCode = getReferralCodeFromTokenAmount(tokenAmount);

        return referrals.registeredReferrersByCode[referralCode];
    }

    function isValidReferrer(Data storage referrals, address referrer, uint256 referrerBalance, address transferTo) public view returns (bool) {
        if(referrer == address(0)) {
            return false;
        }

        uint256 tokensNeeded = referrals.tokensNeededForRefferalNumber;

        return referrerBalance >= tokensNeeded && referrer != transferTo;
    }
}

library SignedSafeMath {
    function mul(int256 a, int256 b) internal pure returns (int256) {
        return a * b;
    }

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

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

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

library UniswapV2PriceImpactCalculator {
    function calculateSellPriceImpact(address tokenAddress, address pairAddress, uint256 value) public view returns (uint256) {
        value = value * 998 / 1000;

        IUniswapV2Pair pair = IUniswapV2Pair(pairAddress);

        (uint256 r0, uint256 r1,) = pair.getReserves();

        IERC20Metadata token0 = IERC20Metadata(pair.token0());
        IERC20Metadata token1 = IERC20Metadata(pair.token1());

        if(address(token1) == tokenAddress) {
            IERC20Metadata tokenTemp = token0;
            token0 = token1;
            token1 = tokenTemp;

            uint256 rTemp = r0;
            r0 = r1;
            r1 = rTemp;
        }

        uint256 product = r0 * r1;

        uint256 r0After = r0 + value;
        uint256 r1After = product / r0After;

        return (10000 - (r1After * 10000 / r1)) * 998 / 1000;
    }
}

library SafeCast {
    function toUint224(uint256 value) internal pure returns (uint224) {
        require(
            value <= type(uint224).max,
            "SafeCast: value doesn't fit in 224 bits"
        );
        return uint224(value);
    }

    function toUint128(uint256 value) internal pure returns (uint128) {
        require(
            value <= type(uint128).max,
            "SafeCast: value doesn't fit in 128 bits"
        );
        return uint128(value);
    }

    function toUint96(uint256 value) internal pure returns (uint96) {
        require(
            value <= type(uint96).max,
            "SafeCast: value doesn't fit in 96 bits"
        );
        return uint96(value);
    }

    function toUint64(uint256 value) internal pure returns (uint64) {
        require(
            value <= type(uint64).max,
            "SafeCast: value doesn't fit in 64 bits"
        );
        return uint64(value);
    }

    function toUint32(uint256 value) internal pure returns (uint32) {
        require(
            value <= type(uint32).max,
            "SafeCast: value doesn't fit in 32 bits"
        );
        return uint32(value);
    }

    function toUint16(uint256 value) internal pure returns (uint16) {
        require(
            value <= type(uint16).max,
            "SafeCast: value doesn't fit in 16 bits"
        );
        return uint16(value);
    }

    function toUint8(uint256 value) internal pure returns (uint8) {
        require(
            value <= type(uint8).max,
            "SafeCast: value doesn't fit in 8 bits"
        );
        return uint8(value);
    }

    function toUint256(int256 value) internal pure returns (uint256) {
        require(value >= 0, "SafeCast: value must be positive");
        return uint256(value);
    }

    function toInt128(int256 value) internal pure returns (int128) {
        require(
            value >= type(int128).min && value <= type(int128).max,
            "SafeCast: value doesn't fit in 128 bits"
        );
        return int128(value);
    }

    function toInt64(int256 value) internal pure returns (int64) {
        require(
            value >= type(int64).min && value <= type(int64).max,
            "SafeCast: value doesn't fit in 64 bits"
        );
        return int64(value);
    }

    function toInt32(int256 value) internal pure returns (int32) {
        require(
            value >= type(int32).min && value <= type(int32).max,
            "SafeCast: value doesn't fit in 32 bits"
        );
        return int32(value);
    }

    function toInt16(int256 value) internal pure returns (int16) {
        require(
            value >= type(int16).min && value <= type(int16).max,
            "SafeCast: value doesn't fit in 16 bits"
        );
        return int16(value);
    }

    function toInt8(int256 value) internal pure returns (int8) {
        require(
            value >= type(int8).min && value <= type(int8).max,
            "SafeCast: value doesn't fit in 8 bits"
        );
        return int8(value);
    }

    function toInt256(uint256 value) internal pure returns (int256) {
        require(
            value <= uint256(type(int256).max),
            "SafeCast: value doesn't fit in an int256"
        );
        return int256(value);
    }
}

interface DividendPayingTokenInterface {
    function dividendOf(address _owner) external view returns (uint256);

    function distributeDividends() external payable;

    function withdrawDividend() external;

    event DividendsDistributed(address indexed from, uint256 weiAmount);
    event DividendWithdrawn(
        address indexed to,
        uint256 weiAmount,
        address received
    );
}

interface DividendPayingTokenOptionalInterface {
    function withdrawableDividendOf(address _owner)
        external
        view
        returns (uint256);

    function withdrawnDividendOf(address _owner)
        external
        view
        returns (uint256);

    function accumulativeDividendOf(address _owner)
        external
        view
        returns (uint256);
}

abstract contract DividendPayingToken is
    ERC20,
    DividendPayingTokenInterface,
    DividendPayingTokenOptionalInterface
{
    using SafeMath for uint256;
    using SignedSafeMath for int256;
    using SafeCast for uint256;
    using SafeCast for int256;
    uint256 internal constant magnitude = 2**128;

    uint256 internal magnifiedDividendPerShare;

    mapping(address => int256) internal magnifiedDividendCorrections;
    mapping(address => uint256) internal withdrawnDividends;

    uint256 public totalDividendsDistributed;

    constructor(string memory _name, string memory _symbol)
        ERC20(_name, _symbol)
    {}

    receive() external payable {
        distributeDividends();
    }

    function distributeDividends() public payable override {
        require(totalSupply() > 0);

        if (msg.value > 0) {
            magnifiedDividendPerShare = magnifiedDividendPerShare.add(
                (msg.value).mul(magnitude) / totalSupply()
            );
            emit DividendsDistributed(msg.sender, msg.value);

            totalDividendsDistributed = totalDividendsDistributed.add(
                msg.value
            );
        }
    }

    function withdrawDividend() public virtual override {
        _withdrawDividendOfUser(payable(msg.sender), payable(msg.sender));
    }

    function _withdrawDividendOfUser(address payable user, address payable to)
        internal
        returns (uint256)
    {
        uint256 _withdrawableDividend = withdrawableDividendOf(user);
        if (_withdrawableDividend > 0) {
            withdrawnDividends[user] = withdrawnDividends[user].add(
                _withdrawableDividend
            );
            emit DividendWithdrawn(user, _withdrawableDividend, to);
            (bool success, ) = to.call{value: _withdrawableDividend}("");

            if (!success) {
                withdrawnDividends[user] = withdrawnDividends[user].sub(
                    _withdrawableDividend
                );
                return 0;
            }

            return _withdrawableDividend;
        }

        return 0;
    }

    function dividendOf(address _owner) public view override returns (uint256) {
        return withdrawableDividendOf(_owner);
    }

    function withdrawableDividendOf(address _owner)
        public
        view
        override
        returns (uint256)
    {
        return accumulativeDividendOf(_owner).sub(withdrawnDividends[_owner]);
    }

    function withdrawnDividendOf(address _owner)
        public
        view
        override
        returns (uint256)
    {
        return withdrawnDividends[_owner];
    }

    function accumulativeDividendOf(address _owner)
        public
        view
        override
        returns (uint256)
    {
        return
            magnifiedDividendPerShare
                .mul(balanceOf(_owner))
                .toInt256()
                .add(magnifiedDividendCorrections[_owner])
                .toUint256() / magnitude;
    }

    function _mint(address account, uint256 value) internal override {
        super._mint(account, value);

        magnifiedDividendCorrections[account] = magnifiedDividendCorrections[
            account
        ].sub((magnifiedDividendPerShare.mul(value)).toInt256());
    }

    function _burn(address account, uint256 value) internal override {
        super._burn(account, value);
        magnifiedDividendCorrections[account] = magnifiedDividendCorrections[
            account
        ].add((magnifiedDividendPerShare.mul(value)).toInt256());
    }

    function _setBalance(address account, uint256 newBalance) internal {
        uint256 currentBalance = balanceOf(account);

        if (newBalance > currentBalance) {
            uint256 mintAmount = newBalance.sub(currentBalance);
            _mint(account, mintAmount);
        } else if (newBalance < currentBalance) {
            uint256 burnAmount = currentBalance.sub(newBalance);
            _burn(account, burnAmount);
        }
    }

    function getAccount(address _account)
        public
        view
        returns (uint256 _withdrawableDividends, uint256 _withdrawnDividends)
    {
        _withdrawableDividends = withdrawableDividendOf(_account);
        _withdrawnDividends = withdrawnDividends[_account];
    }
}

contract BFFDividendTracker is DividendPayingToken, Ownable {
    using SafeMath for uint256;
    using Counters for Counters.Counter;

    Counters.Counter private tokenHoldersCount;
    mapping(address => bool) private tokenHoldersMap;

    mapping(address => bool) public excludedFromDividends;

    uint256 public immutable minimumTokenBalanceForDividends;

    event ExcludeFromDividends(address indexed account);

    constructor()
        DividendPayingToken(
            "BFF_Dividend_Tracker",
            "BFF_Dividend_Tracker"
        )
    {
        minimumTokenBalanceForDividends = 10000 * 10**18;
    }

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

    function _approve(
        address,
        address,
        uint256
    ) internal pure override {
        require(false, "BFF_Dividend_Tracker: No approvals allowed");
    }

    function _transfer(
        address,
        address,
        uint256
    ) internal pure override {
        require(false, "BFF_Dividend_Tracker: No transfers allowed");
    }

    function withdrawDividend() public pure override {
        require(
            false,
            "BFF_Dividend_Tracker: withdrawDividend disabled. Use the 'claim' function on the main BFF contract."
        );
    }

    function excludeFromDividends(address account) external onlyOwner {
        excludedFromDividends[account] = true;

        _setBalance(account, 0);

        if (tokenHoldersMap[account] == true) {
            tokenHoldersMap[account] = false;
            tokenHoldersCount.decrement();
        }

        emit ExcludeFromDividends(account);
    }

    function includeFromDividends(address account, uint256 balance)
        external
        onlyOwner
    {
        excludedFromDividends[account] = false;

        if (balance >= minimumTokenBalanceForDividends) {
            _setBalance(account, balance);

            if (tokenHoldersMap[account] == false) {
                tokenHoldersMap[account] = true;
                tokenHoldersCount.increment();
            }
        }

        emit ExcludeFromDividends(account);
    }

    function isExcludeFromDividends(address account)
        external
        view
        onlyOwner
        returns (bool)
    {
        return excludedFromDividends[account];
    }

    function getNumberOfTokenHolders() external view returns (uint256) {
        return tokenHoldersCount.current();
    }

    function setBalance(address payable account, uint256 newBalance)
        external
        onlyOwner
    {
        if (excludedFromDividends[account]) {
            return;
        }

        if (newBalance >= minimumTokenBalanceForDividends) {
            _setBalance(account, newBalance);

            if (tokenHoldersMap[account] == false) {
                tokenHoldersMap[account] = true;
                tokenHoldersCount.increment();
            }
        } else {
            _setBalance(account, 0);

            if (tokenHoldersMap[account] == true) {
                tokenHoldersMap[account] = false;
                tokenHoldersCount.decrement();
            }
        }
    }

    function processAccount(address account, address toAccount)
        public
        onlyOwner
        returns (uint256)
    {
        uint256 amount = _withdrawDividendOfUser(
            payable(account),
            payable(toAccount)
        );
        return amount;
    }
}

contract BFF is ERC20, Ownable {
    using SafeMath for uint256;
    using Counters for Counters.Counter;
    using Referrals for Referrals.Data;

    string private constant _name = "By Frens For Frens";
    string private constant _symbol = "BFF";
    uint8 private constant _decimals = 18;
    uint256 private constant _tTotal = 1e12 * 10**18;

    IUniswapV2Router02 private uniswapV2Router =
        IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
    bool private tradingOpen = false;
    bool private allowClaims = false;
    uint256 private launchBlock = 0;
    address private uniswapV2Pair;

    IERC20 private PreSaleTokenAddress;
    uint256 private minimumPreSaleTokens;
    uint256 private preSaleTimestamp;
    uint256 private minutesForPreSale;
    uint256 private publicSaleTimestamp;
    bool private preSaleActive = false;

    mapping(address => bool) private automatedMarketMakerPairs;
    mapping(address => bool) public isExcludeFromFee;
    mapping(address => bool) public isBlacklist;
    mapping(address => bool) public isAllowedToClaim;
    mapping(address => bool) public isBot;
    mapping(address => bool) public isExcludeFromMaxWalletAmount;

    uint256 public maxWalletAmount;

    uint256 public baseBuyTax = 10;
    uint256 public baseSellTax = 5;
    uint256 public referralBuyTax = 5;
    uint256 public referrerBonus = 25; // 2.5% division in tenths to support
    uint256 public referredBonus = 25; // 2.5% division in tenths to support

    uint256 private autoLP = 20;
    uint256 private devFee = 10;
    uint256 private marketingFee = 70;

    uint256 public minContractTokensToSwap = 2e9 * 10**18;

    struct PriceImpactRangeTax {
        uint256 from;
        uint256 to;
        uint256 tax;
    }

    mapping(address => uint256) public initialBuyTimestamp;
    mapping(uint256 => PriceImpactRangeTax) public priceImpactRangeTaxes;
    uint8 public maxIndexImpactRange;

    address private devWalletAddress;
    address private marketingWalletAddress;

    BFFDividendTracker public dividendTracker;
    uint256 minimumTokenBalanceForDividends = 1000 * 10**18;
    mapping(address => uint256) public lastTransfer;

    uint256 public pendingTokensForReward;
    uint256 public minRewardTokensToSwap = 10000 * 10**18;

    uint256 public pendingEthReward;

    struct ClaimedEth {
        uint256 ethAmount;
        uint256 tokenAmount;
        uint256 timestamp;
    }

    Counters.Counter private claimedHistoryIds;
    Referrals.Data private _storage;

    mapping(uint256 => ClaimedEth) private claimedEthMap;
    mapping(address => uint256[]) private userClaimedIds;

    event BuyFees(address from, address to, uint256 amountTokens);
    event SellFees(address from, address to, uint256 amountTokens);
    event AddLiquidity(uint256 amountTokens, uint256 amountEth);
    event SwapTokensForEth(uint256 sentTokens, uint256 receivedEth);
    event SwapEthForTokens(uint256 sentEth, uint256 receivedTokens);
    event DistributeFees(uint256 devEth, uint256 remarketingEth);
    event AddRewardPool(uint256 _ethAmount);

    event SendDividends(uint256 amount);

    event DividendClaimed(
        uint256 ethAmount,
        uint256 tokenAmount,
        address account
    );

    constructor(
        address _devWalletAddress,
        address _marketingWalletAddress
    ) ERC20(_name, _symbol) {
        devWalletAddress = _devWalletAddress;
        marketingWalletAddress = _marketingWalletAddress;

        maxWalletAmount = (_tTotal * 25) / 10000; // 0.25% maxWalletAmount (initial limit)

        dividendTracker = new BFFDividendTracker();
        dividendTracker.excludeFromDividends(address(dividendTracker));
        dividendTracker.excludeFromDividends(address(this));
        dividendTracker.excludeFromDividends(owner());
        dividendTracker.excludeFromDividends(address(uniswapV2Router));

        isExcludeFromFee[owner()] = true;
        isExcludeFromFee[address(this)] = true;
        isExcludeFromFee[address(dividendTracker)] = true;
        isExcludeFromFee[devWalletAddress] = true;
        isExcludeFromFee[marketingWalletAddress] = true;
        isExcludeFromMaxWalletAmount[owner()] = true;
        isExcludeFromMaxWalletAmount[address(this)] = true;
        isExcludeFromMaxWalletAmount[address(uniswapV2Router)] = true;
        isExcludeFromMaxWalletAmount[devWalletAddress] = true;
        isExcludeFromMaxWalletAmount[marketingWalletAddress] = true;
        priceImpactRangeTaxes[1].from = 0;
        priceImpactRangeTaxes[1].to = 99;
        priceImpactRangeTaxes[1].tax = 5;
        priceImpactRangeTaxes[2].from = 100;
        priceImpactRangeTaxes[2].to = 149;
        priceImpactRangeTaxes[2].tax = 10;
        priceImpactRangeTaxes[3].from = 150;
        priceImpactRangeTaxes[3].to = 199;
        priceImpactRangeTaxes[3].tax = 15;
        priceImpactRangeTaxes[4].from = 200;
        priceImpactRangeTaxes[4].to = 249;
        priceImpactRangeTaxes[4].tax = 20;
        priceImpactRangeTaxes[5].from = 250;
        priceImpactRangeTaxes[5].to = 5000;
        priceImpactRangeTaxes[5].tax = 25;

        maxIndexImpactRange = 5;

        _mint(owner(), _tTotal);

        _storage.init();

    }

    // withdraw ETH if stuck before launch
    function withdrawStuckETH() external onlyOwner {
        require(!tradingOpen, "Can only withdraw if trading hasn't started");
        bool success;
        (success, ) = address(msg.sender).call{ value: address(this).balance }(
            ""
        );
    }

    function enablePreSale (uint256 _minutesForPreSale, address _preSaleTokenAddress, uint256 _minimumPreSaleTokens) external onlyOwner {
        require(!tradingOpen, "BFF: Can only enable PreSale before Trading has been opened.");
        minutesForPreSale = _minutesForPreSale;
        PreSaleTokenAddress = IERC20(_preSaleTokenAddress);
        minimumPreSaleTokens = _minimumPreSaleTokens * 10**18;
        preSaleActive = true;
    }

    function openTrading()
        external
        onlyOwner
    {
        require(!tradingOpen, "BFF: Trading is already open");
        
        uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(
                address(this),
                uniswapV2Router.WETH()
            );
        isExcludeFromMaxWalletAmount[address(uniswapV2Pair)] = true;

        automatedMarketMakerPairs[uniswapV2Pair] = true;
        dividendTracker.excludeFromDividends(uniswapV2Pair);

        addLiquidity(balanceOf(address(this)), address(this).balance);
        IERC20(uniswapV2Pair).approve(
            address(uniswapV2Router),
            type(uint256).max
        );

        tradingOpen = true;
        if (preSaleActive) {
            uint256 _launchTime;
            _launchTime = block.timestamp;

            preSaleTimestamp = _launchTime;
            publicSaleTimestamp = _launchTime.add(
                minutesForPreSale.mul(1 minutes)
            );
        }
        launchBlock = block.number;
    }

    function alowClaims(bool _alowClaims) external onlyOwner{
        allowClaims = _alowClaims;
    }

    function updateReferrals(uint256 _referralBuyTax, uint256 _referrerBonus, uint256 _referredBonus, uint256 tokensNeeded) public onlyOwner {
        referralBuyTax = _referralBuyTax;
        referrerBonus = _referrerBonus;
        referredBonus = _referredBonus;
        _storage.updateTokensNeededForReferralNumber(tokensNeeded);
    }
    
    function getReferralCode(address account) public view returns (uint256 referralCode) {
        referralCode = _storage.getReferralCode(account);
    }

    function getReferralCodeAddress(uint256 referralCode) public view returns (address referrerAddress) {
        referrerAddress = _storage.getReferrer(referralCode);
    }

    function getReferralAddressByTokenAmount(uint256 _amount) public view returns (address referrerAddress) {
        referrerAddress = _storage.getReferrerFromTokenAmount(_amount);
    }

    function isReferralValid(address referrer, address _to) public view returns (bool) {
        if(referrer == address(0)) {
            return false;
        }
        uint256 neededTokens = _storage.tokensNeededForRefferalNumber;

        return balanceOf(referrer) >= neededTokens && referrer != _to;
    }

    function handleNewBalanceForReferrals(address account) private {
        if(isExcludeFromFee[account] || isBlacklist[account]) {
            return;
        }

        if(account == address(uniswapV2Pair)) {
            return;
        }

        _storage.handleNewBalance(account, balanceOf(account));
    }

    function manualSwap() external onlyOwner {
        uint256 totalTokens = balanceOf(address(this)).sub(
            pendingTokensForReward
        );

        swapTokensForEth(totalTokens);
    }

    function manualSend() external onlyOwner {
        uint256 totalEth = address(this).balance.sub(pendingEthReward);

        uint256 devFeesToSend = totalEth.mul(devFee).div(
            uint256(100).sub(autoLP)
        );
        uint256 marketingFeesToSend = totalEth.mul(marketingFee).div(
            uint256(100).sub(autoLP)
        );
        uint256 remainingEthForFees = totalEth.sub(devFeesToSend).sub(
            marketingFeesToSend);
        devFeesToSend = devFeesToSend.add(remainingEthForFees);

        sendEthToWallets(devFeesToSend, marketingFeesToSend);
    }

    function getPriceImpactTax(address _ad, uint256 _amount) public view returns (uint256) {
        uint256 tax = baseSellTax;

        uint256 priceImpact = UniswapV2PriceImpactCalculator.calculateSellPriceImpact(address(_ad), uniswapV2Pair, _amount);

        for (uint8 x =1; x <= maxIndexImpactRange; x++) {
            if (
                (priceImpact >= priceImpactRangeTaxes[x].from &&
                    priceImpact <= priceImpactRangeTaxes[x].to)
            ) {
                tax = priceImpactRangeTaxes[x].tax;
                return tax;
            }
        }
        return tax;
    }

    function getTotalDividendsDistributed() external view returns (uint256) {
        return dividendTracker.totalDividendsDistributed();
    }

    function withdrawableDividendOf(address _account)
        public
        view
        returns (uint256)
    {
        return dividendTracker.withdrawableDividendOf(_account);
    }

    function dividendTokenBalanceOf(address _account)
        public
        view
        returns (uint256)
    {
        return dividendTracker.balanceOf(_account);
    }

    function claim() external {
        _claim(payable(msg.sender), false);
    }

    function reinvest() external {
        _claim(payable(msg.sender), true);
    }

    function _claim(address payable _account, bool _reinvest) private {
        uint256 withdrawableAmount = dividendTracker.withdrawableDividendOf(
            _account
        );
        require(
            withdrawableAmount > 0,
            "BFF: Claimer has no withdrawable dividends"
        );
        uint256 ethAmount;
        uint256 tokenAmount;

        if (!_reinvest) {
            require(
                allowClaims || isAllowedToClaim[_account],
                "BFF: Claimer not allowed to claim dividends, can only re-invest."
            );
            ethAmount = dividendTracker.processAccount(_account, _account);
        } else if (_reinvest) {
            ethAmount = dividendTracker.processAccount(_account, address(this));
            if (ethAmount > 0) {
                tokenAmount = swapEthForTokens(ethAmount, _account);
            }
        }
        if (ethAmount > 0) {
            claimedHistoryIds.increment();
            uint256 hId = claimedHistoryIds.current();
            claimedEthMap[hId].ethAmount = ethAmount;
            claimedEthMap[hId].tokenAmount = tokenAmount;
            claimedEthMap[hId].timestamp = block.timestamp;

            userClaimedIds[_account].push(hId);

            emit DividendClaimed(ethAmount, tokenAmount, _account);
        }
    }

    function getNumberOfDividendTokenHolders() external view returns (uint256) {
        return dividendTracker.getNumberOfTokenHolders();
    }

    function getAccount(address _account)
        public
        view
        returns (
            uint256 withdrawableDividends,
            uint256 withdrawnDividends,
            uint256 balance
        )
    {
        (withdrawableDividends, withdrawnDividends) = dividendTracker
            .getAccount(_account);
        return (withdrawableDividends, withdrawnDividends, balanceOf(_account));
    }

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

    function _transfer(
        address _from,
        address _to,
        uint256 _amount
    ) internal virtual override {
        require(!isBot[_from] && !isBot[_to]);
        require(!isBlacklist[_from] && !isBlacklist[_to]);

        uint256 transferAmount = _amount;
        if (
            tradingOpen &&
            (automatedMarketMakerPairs[_from] ||
                automatedMarketMakerPairs[_to]) &&
            !isExcludeFromFee[_from] &&
            !isExcludeFromFee[_to]
        ) {
            if (preSaleActive &&
                preSaleTimestamp <= block.timestamp &&
                publicSaleTimestamp > block.timestamp
            ) {
                require(
                    PreSaleTokenAddress.balanceOf(_to) >= minimumPreSaleTokens,
                    "PreSale: Not enough PreSale token balance."
                );
            }

            address _referrer; 
            _referrer = _storage.getReferrerFromTokenAmount(_amount);

            if(!_storage.isValidReferrer(_referrer, balanceOf(_referrer), _to)) {
                _referrer = address(0);
            }
            
            transferAmount = takeFees(_from, _to, _amount, _referrer);
            
        }
        if (initialBuyTimestamp[_to] == 0) {
            initialBuyTimestamp[_to] = block.timestamp;
        }
        if (!automatedMarketMakerPairs[_to] && !isExcludeFromMaxWalletAmount[_to]) {
            require(balanceOf(_to) + transferAmount <= maxWalletAmount,
                "BFF: Wallet balance limit reached"
            );
        }

        super._transfer(_from, _to, transferAmount);

        handleNewBalanceForReferrals(_to);

        if (!dividendTracker.isExcludeFromDividends(_from)) {
            try
                dividendTracker.setBalance(payable(_from), balanceOf(_from))
            {} catch {}
        }
        if (!dividendTracker.isExcludeFromDividends(_to)) {
            try
                dividendTracker.setBalance(payable(_to), balanceOf(_to))
            {} catch {}
        }
    }

    function _setAutomatedMarketMakerPair(address _pair, bool _value) private {
        require(
            automatedMarketMakerPairs[_pair] != _value,
            "BFF: Automated market maker pair is already set to that value"
        );
        automatedMarketMakerPairs[_pair] = _value;

        if (_value) {
            dividendTracker.excludeFromDividends(_pair);
        }
    }

    function setBlacklist(address _address, bool _isBlaklist)
        external onlyOwner {
        isBlacklist[_address] = _isBlaklist;
    }

    function isAlowedToClaim(address _address, bool _isAlowedToClaim)
        external onlyOwner {
        isAllowedToClaim[_address] = _isAlowedToClaim;
    }

    function setExcludeFromFee(address _address, bool _isExludeFromFee)
        external onlyOwner {
        isExcludeFromFee[_address] = _isExludeFromFee;
    }

    function setExcludeFromMaxWalletAmount(address _address, bool _isExludeFromMaxWalletAmount)
        external onlyOwner {
        isExcludeFromMaxWalletAmount[_address] = _isExludeFromMaxWalletAmount;
    }

    function setExludeFromDividends(address _address, bool _isExludeFromDividends)
        external onlyOwner {
        if (_isExludeFromDividends) {
            dividendTracker.excludeFromDividends(_address);
        } else {
            dividendTracker.includeFromDividends(_address, balanceOf(_address));
        }
    }

    function setMultipleExludeFromDividends(address[] calldata _isMultipleExludeFromDividends) public onlyOwner {
        for (uint256 i = 0; i < _isMultipleExludeFromDividends.length; i++) {
                dividendTracker.excludeFromDividends(_isMultipleExludeFromDividends[i]);
            }
    }

    function setMaxWallet(uint256 newMaxWallet) external onlyOwner {
        require(newMaxWallet >= (totalSupply() * 1 / 1000)/1e18, "Cannot set maxWallet lower than 0.1%");
        maxWalletAmount = newMaxWallet * (10**18);
    }
    

    function setTaxes(
        uint256 _baseBuyTax,
        uint256 _baseSellTax,
        uint256 _autoLP,
        uint256 _devFee,
        uint256 _marketingFee
    ) external onlyOwner {
        require(_baseBuyTax <= 10 && baseSellTax <= 10);

        baseBuyTax = _baseBuyTax;
        baseSellTax = _baseSellTax;
        autoLP = _autoLP;
        devFee = _devFee;
        marketingFee = _marketingFee;
    }

    function setMinContractTokensToSwap(uint256 _numToken) public onlyOwner {
        minContractTokensToSwap = _numToken;
    }

    function setMinRewardTokensToSwap(uint256 _numToken) public onlyOwner {
        minRewardTokensToSwap = _numToken;
    }

    function setPriceImpactRangeTax(
        uint8 _index,
        uint256 _from,
        uint256 _to,
        uint256 _tax
    ) external onlyOwner {
        priceImpactRangeTaxes[_index].from = _from;
        priceImpactRangeTaxes[_index].to = _to;
        priceImpactRangeTaxes[_index].tax = _tax;
    }

    function setMaxIndexImpactRange(uint8 _maxIndex) external onlyOwner {
        maxIndexImpactRange = _maxIndex;
    }

    function setBots(address[] calldata _bots) public onlyOwner {
        for (uint256 i = 0; i < _bots.length; i++) {
            if (
                _bots[i] != uniswapV2Pair &&
                _bots[i] != address(uniswapV2Router)
            ) {
                isBot[_bots[i]] = true;
            }
        }
    }

    function setWalletAddress(address _devWallet, address _marketingWallet)
        external
        onlyOwner
    {
        devWalletAddress = _devWallet;
        marketingWalletAddress = _marketingWallet;
    }

    function takeFees(
        address _from,
        address _to,
        uint256 _amount,
        address _referrer
    ) private returns (uint256) {
        uint256 fees;
        uint256 remainingAmount;
        require(
            automatedMarketMakerPairs[_from] || automatedMarketMakerPairs[_to],
            "BFF: No market makers found"
        );

        if (automatedMarketMakerPairs[_from]) {
            uint256 totalBuyTax;
            uint256 referrerFees;
            uint256 referredFees;
            if (block.number == launchBlock && !preSaleActive) {
                totalBuyTax = 90;
            } else if (block.number == launchBlock + 1 && !preSaleActive) {
                totalBuyTax = 50;
            } else if (_referrer != address(0)) {
                totalBuyTax = referralBuyTax.add(referrerBonus.add(referredBonus).div(10));
            } else {
                totalBuyTax = baseBuyTax;
            }

            fees = _amount.mul(totalBuyTax).div(100);
            
            if(_referrer != address(0)) {
                fees = _amount.mul(referralBuyTax).div(100);

                referrerFees = _amount.mul(referrerBonus).div(1000);
                referredFees = _amount.mul(referredBonus).div(1000);

                uint256 totalReferralFees = referrerFees.add(referredFees);

                remainingAmount = _amount.sub(fees).sub(totalReferralFees).add(referredFees);

                super._transfer(_from, address(this), fees);

                super._transfer(_from, _referrer, referrerFees);

                emit BuyFees(_from, address(this), fees);

                emit BuyFees(_from, _referrer, referrerFees);

            } else {

            remainingAmount = _amount.sub(fees);

            super._transfer(_from, address(this), fees);

            emit BuyFees(_from, address(this), fees);
            }
        } else {
            uint256 totalSellTax;
            if (block.number == launchBlock) {
                totalSellTax = 90;
            } else if (block.number == launchBlock + 1) {
                totalSellTax = 50;
            } else {
                uint256 increaseSellFee = getPriceImpactTax(address(this), _amount);

                totalSellTax = baseSellTax + increaseSellFee;

                if(totalSellTax >= 30) {
                    totalSellTax = 30;
                }
            }

            fees = _amount.mul(totalSellTax).div(100);
            uint256 rewardTokens = _amount
                .mul(totalSellTax.sub(baseSellTax))
                .div(100);
            pendingTokensForReward = pendingTokensForReward.add(rewardTokens);

            remainingAmount = _amount.sub(fees);

            super._transfer(_from, address(this), fees);
            uint256 tokensToSwap = balanceOf(address(this)).sub(
                pendingTokensForReward);

            if (tokensToSwap > minContractTokensToSwap) {
                distributeTokensEth(tokensToSwap);
            }
            if (pendingTokensForReward > minRewardTokensToSwap) {
                swapAndSendDividends(pendingTokensForReward);
            }

            emit SellFees(_from, address(this), fees);
        }

        return remainingAmount;
    }

    function distributeTokensEth(uint256 _tokenAmount) private {
        uint256 tokensForLiquidity = _tokenAmount.mul(autoLP).div(100);

        uint256 halfLiquidity = tokensForLiquidity.div(2);
        uint256 tokensForSwap = _tokenAmount.sub(halfLiquidity);

        uint256 totalEth = swapTokensForEth(tokensForSwap);

        uint256 ethForAddLP = totalEth.mul(autoLP).div(100);
        uint256 devFeesToSend = totalEth.mul(devFee).div(100);
        uint256 marketingFeesToSend = totalEth.mul(marketingFee).div(100);
        uint256 remainingEthForFees = totalEth
            .sub(ethForAddLP)
            .sub(devFeesToSend)
            .sub(marketingFeesToSend);
        devFeesToSend = devFeesToSend.add(remainingEthForFees);

        sendEthToWallets(devFeesToSend, marketingFeesToSend);

        if (halfLiquidity > 0 && ethForAddLP > 0) {
            addLiquidity(halfLiquidity, ethForAddLP);
        }
    }

    function sendEthToWallets(uint256 _devFees, uint256 _marketingFees)
        private
    {
        if (_devFees > 0) {
            payable(devWalletAddress).transfer(_devFees);
        }
        if (_marketingFees > 0) {
            payable(marketingWalletAddress).transfer(_marketingFees);
        }
        emit DistributeFees(_devFees, _marketingFees);
    }

    function swapTokensForEth(uint256 _tokenAmount) private returns (uint256) {
        uint256 initialEthBalance = address(this).balance;
        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
        );

        uint256 receivedEth = address(this).balance.sub(initialEthBalance);

        emit SwapTokensForEth(_tokenAmount, receivedEth);
        return receivedEth;
    }

    function swapEthForTokens(uint256 _ethAmount, address _to)
        private
        returns (uint256)
    {
        uint256 initialTokenBalance = balanceOf(address(this));
        address[] memory path = new address[](2);
        path[0] = uniswapV2Router.WETH();
        path[1] = address(this);

        uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{
            value: _ethAmount
        }(0, path, _to, block.timestamp);

        uint256 receivedTokens = balanceOf(address(this)).sub(
            initialTokenBalance
        );

        emit SwapEthForTokens(_ethAmount, receivedTokens);
        return receivedTokens;
    }

    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
        );
        emit AddLiquidity(_tokenAmount, _ethAmount);
    }

    function swapAndSendDividends(uint256 _tokenAmount) private {
        uint256 dividends = swapTokensForEth(_tokenAmount);

        pendingTokensForReward = pendingTokensForReward.sub(_tokenAmount);
        uint256 totalEthToSend = dividends.add(pendingEthReward);

        (bool success, ) = address(dividendTracker).call{value: totalEthToSend}(
            ""
        );

        if (success) {
            emit SendDividends(dividends);
        } else {
            pendingEthReward = pendingEthReward.add(dividends);
        }
    }

    function canHolderClaim(address _address) public view returns (uint256) {
        uint256 holderCanClaim;
        if(isAllowedToClaim[_address] || allowClaims) {
            holderCanClaim = 1000000;
        } else {
            holderCanClaim = 0;
        }

        return holderCanClaim;
    }

    function availableContractTokenBalance() public view returns (uint256) {
        return balanceOf(address(this)).sub(pendingTokensForReward);
    }

    function getHistory(
        address _account,
        uint256 _limit,
        uint256 _pageNumber
    ) external view returns (ClaimedEth[] memory) {
        require(_limit > 0 && _pageNumber > 0, "BFF: Invalid arguments");
        uint256 userClaimedCount = userClaimedIds[_account].length;
        uint256 end = _pageNumber * _limit;
        uint256 start = end - _limit;
        require(start < userClaimedCount, "BFF: Out of range");
        uint256 limit = _limit;
        if (end > userClaimedCount) {
            end = userClaimedCount;
            limit = userClaimedCount % _limit;
        }

        ClaimedEth[] memory myClaimedEth = new ClaimedEth[](limit);
        uint256 currentIndex = 0;
        for (uint256 i = start; i < end; i++) {
            uint256 hId = userClaimedIds[_account][i];
            myClaimedEth[currentIndex] = claimedEthMap[hId];
            currentIndex += 1;
        }
        return myClaimedEth;
    }

    function getHistoryCount(address _account) external view returns (uint256) {
        return userClaimedIds[_account].length;
    }

    receive() external payable {}
    
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_devWalletAddress","type":"address"},{"internalType":"address","name":"_marketingWalletAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountTokens","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountEth","type":"uint256"}],"name":"AddLiquidity","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_ethAmount","type":"uint256"}],"name":"AddRewardPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountTokens","type":"uint256"}],"name":"BuyFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"devEth","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"remarketingEth","type":"uint256"}],"name":"DistributeFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"DividendClaimed","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":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountTokens","type":"uint256"}],"name":"SellFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SendDividends","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"sentEth","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"receivedTokens","type":"uint256"}],"name":"SwapEthForTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"sentTokens","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"receivedEth","type":"uint256"}],"name":"SwapTokensForEth","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_alowClaims","type":"bool"}],"name":"alowClaims","outputs":[],"stateMutability":"nonpayable","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":[],"name":"availableContractTokenBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"baseBuyTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseSellTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"canHolderClaim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"address","name":"_account","type":"address"}],"name":"dividendTokenBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendTracker","outputs":[{"internalType":"contract BFFDividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minutesForPreSale","type":"uint256"},{"internalType":"address","name":"_preSaleTokenAddress","type":"address"},{"internalType":"uint256","name":"_minimumPreSaleTokens","type":"uint256"}],"name":"enablePreSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"getAccount","outputs":[{"internalType":"uint256","name":"withdrawableDividends","type":"uint256"},{"internalType":"uint256","name":"withdrawnDividends","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_limit","type":"uint256"},{"internalType":"uint256","name":"_pageNumber","type":"uint256"}],"name":"getHistory","outputs":[{"components":[{"internalType":"uint256","name":"ethAmount","type":"uint256"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"internalType":"struct BFF.ClaimedEth[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"getHistoryCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfDividendTokenHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_ad","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"getPriceImpactTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"getReferralAddressByTokenAmount","outputs":[{"internalType":"address","name":"referrerAddress","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getReferralCode","outputs":[{"internalType":"uint256","name":"referralCode","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"referralCode","type":"uint256"}],"name":"getReferralCodeAddress","outputs":[{"internalType":"address","name":"referrerAddress","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalDividendsDistributed","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":"","type":"address"}],"name":"initialBuyTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isAllowedToClaim","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_isAlowedToClaim","type":"bool"}],"name":"isAlowedToClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isBlacklist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isBot","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludeFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludeFromMaxWalletAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"referrer","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"isReferralValid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastTransfer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manualSend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"manualSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxIndexImpactRange","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minContractTokensToSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minRewardTokensToSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingEthReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingTokensForReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"priceImpactRangeTaxes","outputs":[{"internalType":"uint256","name":"from","type":"uint256"},{"internalType":"uint256","name":"to","type":"uint256"},{"internalType":"uint256","name":"tax","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"referralBuyTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"referredBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"referrerBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reinvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_isBlaklist","type":"bool"}],"name":"setBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_bots","type":"address[]"}],"name":"setBots","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_isExludeFromFee","type":"bool"}],"name":"setExcludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_isExludeFromMaxWalletAmount","type":"bool"}],"name":"setExcludeFromMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_isExludeFromDividends","type":"bool"}],"name":"setExludeFromDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_maxIndex","type":"uint8"}],"name":"setMaxIndexImpactRange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxWallet","type":"uint256"}],"name":"setMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numToken","type":"uint256"}],"name":"setMinContractTokensToSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numToken","type":"uint256"}],"name":"setMinRewardTokensToSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_isMultipleExludeFromDividends","type":"address[]"}],"name":"setMultipleExludeFromDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_index","type":"uint8"},{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"_to","type":"uint256"},{"internalType":"uint256","name":"_tax","type":"uint256"}],"name":"setPriceImpactRangeTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_baseBuyTax","type":"uint256"},{"internalType":"uint256","name":"_baseSellTax","type":"uint256"},{"internalType":"uint256","name":"_autoLP","type":"uint256"},{"internalType":"uint256","name":"_devFee","type":"uint256"},{"internalType":"uint256","name":"_marketingFee","type":"uint256"}],"name":"setTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_devWallet","type":"address"},{"internalType":"address","name":"_marketingWallet","type":"address"}],"name":"setWalletAddress","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":"uint256","name":"_referralBuyTax","type":"uint256"},{"internalType":"uint256","name":"_referrerBonus","type":"uint256"},{"internalType":"uint256","name":"_referredBonus","type":"uint256"},{"internalType":"uint256","name":"tokensNeeded","type":"uint256"}],"name":"updateReferrals","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawStuckETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052600780546001600160b01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d1790556000600855600f805460ff19169055600a6017819055600560188190556019908155601a819055601b556014601c55601d556046601e556b06765c793fa10079d0000000601f55683635c9adc5dea0000060255569021e19e0c9bab24000006028553480156200009957600080fd5b506040516200689e3803806200689e833981016040819052620000bc916200096d565b604051806040016040528060128152602001714279204672656e7320466f72204672656e7360701b8152506040518060400160405280600381526020016221232360e91b81525081600390805190602001906200011b9291906200089c565b508051620001319060049060208401906200089c565b5050600580546001600160a01b031916339081179091556040519091506000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a360228054610100600160a81b0319166101006001600160a01b038581169190910291909117909155602380546001600160a01b031916918316919091179055612710620001d26c0c9f2c9cd04674edea400000006019620009bb565b620001de9190620009dd565b601655604051620001ef906200092b565b604051809103906000f0801580156200020c573d6000803e3d6000fd5b50602480546001600160a01b0319166001600160a01b0392909216918217815560405163031e79db60e41b8152600481018390526331e79db09101600060405180830381600087803b1580156200026257600080fd5b505af115801562000277573d6000803e3d6000fd5b50506024805460405163031e79db60e41b81523060048201526001600160a01b0390911693506331e79db0925001600060405180830381600087803b158015620002c057600080fd5b505af1158015620002d5573d6000803e3d6000fd5b50506024546001600160a01b031691506331e79db09050620002ff6005546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b1580156200034157600080fd5b505af115801562000356573d6000803e3d6000fd5b50506024805460075460405163031e79db60e41b81526001600160a01b039182166004820152911693506331e79db0925001600060405180830381600087803b158015620003a357600080fd5b505af1158015620003b8573d6000803e3d6000fd5b50505050600160116000620003d2620007a560201b60201c565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff19968716179055308152601190935281832080548516600190811790915560245482168452828420805486168217905560225461010090048216845282842080548616821790556023549091168352908220805490931681179092556015906200046b6005546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff19968716179055308152601584528281208054861660019081179091556007548316825283822080548716821790556022805461010090048416835284832080548816831790556023548416835293822080548716909117905560219093527f2b59c9df127166d3570f589f0cb7377a6b175795e70ab275ebf42fa16c0a23f483905560637f2b59c9df127166d3570f589f0cb7377a6b175795e70ab275ebf42fa16c0a23f55560057f2b59c9df127166d3570f589f0cb7377a6b175795e70ab275ebf42fa16c0a23f681905560647f914a2534c436de5a3f77164e6b9b90d20144139ce899b6a8d30a442e7b9ef5335560957f914a2534c436de5a3f77164e6b9b90d20144139ce899b6a8d30a442e7b9ef53455600a7f914a2534c436de5a3f77164e6b9b90d20144139ce899b6a8d30a442e7b9ef5355560967fbae8fb7bb9008c9bfa6625328b7613a2bedfb2f936a7718f51173039a77c107c5560c77fbae8fb7bb9008c9bfa6625328b7613a2bedfb2f936a7718f51173039a77c107d55600f7fbae8fb7bb9008c9bfa6625328b7613a2bedfb2f936a7718f51173039a77c107e5560c87f1ae06646c6742a506302a1833f6c3f508643fd4c5dcb1e323706d5c3441af2985560f97f1ae06646c6742a506302a1833f6c3f508643fd4c5dcb1e323706d5c3441af2995560147f1ae06646c6742a506302a1833f6c3f508643fd4c5dcb1e323706d5c3441af29a559283905260fa7ffb8633a1617da4af6a760ee9a6f35275b7a2d26730de1bb585e883dd94ef868f556113887ffb8633a1617da4af6a760ee9a6f35275b7a2d26730de1bb585e883dd94ef86905560197ffb8633a1617da4af6a760ee9a6f35275b7a2d26730de1bb585e883dd94ef869155815490931682179055546200073891166c0c9f2c9cd04674edea40000000620007b4565b60405163020929fd60e41b8152602b600482015273a636249ba25ece6f11e5c1f5130da90a90c41789906320929fd09060240160006040518083038186803b1580156200078457600080fd5b505af415801562000799573d6000803e3d6000fd5b50505050505062000a58565b6005546001600160a01b031690565b6001600160a01b0382166200080f5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b806002600082825462000823919062000a00565b90915550506001600160a01b038216600090815260208190526040812080548392906200085290849062000a00565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b828054620008aa9062000a1b565b90600052602060002090601f016020900481019282620008ce576000855562000919565b82601f10620008e957805160ff191683800117855562000919565b8280016001018555821562000919579182015b8281111562000919578251825591602001919060010190620008fc565b506200092792915062000939565b5090565b6119aa8062004ef483390190565b5b808211156200092757600081556001016200093a565b80516001600160a01b03811681146200096857600080fd5b919050565b600080604083850312156200098157600080fd5b6200098c8362000950565b91506200099c6020840162000950565b90509250929050565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615620009d857620009d8620009a5565b500290565b600082620009fb57634e487b7160e01b600052601260045260246000fd5b500490565b6000821982111562000a165762000a16620009a5565b500190565b600181811c9082168062000a3057607f821691505b6020821081141562000a5257634e487b7160e01b600052602260045260246000fd5b50919050565b61448c8062000a686000396000f3fe6080604052600436106104095760003560e01c80637c4b492e11610213578063b80425c211610123578063e4132fd8116100ab578063f42938901161007a578063f429389014610c96578063f5648a4f14610cab578063fb66d86d14610cc0578063fbcbc0f114610cd6578063fdb5a03e14610cf657600080fd5b8063e4132fd814610c09578063ea084eef14610c29578063eb50d71f14610c49578063ec29f4e914610c6957600080fd5b8063c9e8714c116100f2578063c9e8714c14610b47578063d2469ba614610b77578063d297105914610b97578063dd62ed3e14610bad578063e3402c6714610bf357600080fd5b8063b80425c214610ab0578063ba762ddd14610b07578063c2b1b19914610b1c578063c9567bf914610b3257600080fd5b806395d89b41116101a6578063aa4bde2811610175578063aa4bde2814610a0e578063adc7f53e14610a24578063af9549e014610a3a578063b1fdb11b14610a5a578063b515566a14610a9057600080fd5b806395d89b4114610999578063a457c2d7146109ae578063a8b9d240146109ce578063a9059cbb146109ee57600080fd5b80638da5cb5b116101e25780638da5cb5b146108ff5780638e5916b21461091d578063906778331461094d57806392c403441461097957600080fd5b80637c4b492e14610883578063884289e3146108995780638954fb4a146108c957806389a5c691146108e957600080fd5b80633bbac579116103195780635d0dc8e4116102a157806368bfe6231161027057806368bfe623146107f45780636973cd091461080e57806370a082311461082e578063715018a61461084e578063753d654e1461086357600080fd5b80635d0dc8e41461077f5780635fcefa421461079f57806364b0f653146107bf5780636843cd84146107d457600080fd5b80634f0f9010116102e85780634f0f9010146106e757806351bc3c85146107075780635b6612ad1461071c5780635b683e66146107495780635d0044ca1461075f57600080fd5b80633bbac5791461066c5780634bae2ef11461069c5780634c590d87146106b25780634e71d92d146106d257600080fd5b80631c08bc5d1161039c5780632c7401b31161036b5780632c7401b3146105c557806330bb4cff146105e5578063313ce567146105fa578063333e99db1461061c578063395093511461064c57600080fd5b80631c08bc5d1461054557806323b872dd1461056557806324848348146105855780632c1f5216146105a557600080fd5b806312dfbd33116103d857806312dfbd33146104c6578063153b0d1e146104e657806318160ddd1461050657806319a1cca01461052557600080fd5b806302d7acda1461041557806306fdde03146104525780630829b32d14610474578063095ea7b31461049657600080fd5b3661041057005b600080fd5b34801561042157600080fd5b50610435610430366004613dbc565b610d0b565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561045e57600080fd5b50610467610d90565b6040516104499190613dd5565b34801561048057600080fd5b5061049461048f366004613e42565b610e22565b005b3480156104a257600080fd5b506104b66104b1366004613e7a565b610f1c565b6040519015158152602001610449565b3480156104d257600080fd5b506104946104e1366004613dbc565b610f34565b3480156104f257600080fd5b50610494610501366004613eb4565b610f63565b34801561051257600080fd5b506002545b604051908152602001610449565b34801561053157600080fd5b50610435610540366004613dbc565b610fb8565b34801561055157600080fd5b50610494610560366004613dbc565b610ffa565b34801561057157600080fd5b506104b6610580366004613eed565b611029565b34801561059157600080fd5b506104b66105a0366004613f1d565b61104d565b3480156105b157600080fd5b50602454610435906001600160a01b031681565b3480156105d157600080fd5b506105176105e0366004613e7a565b61109a565b3480156105f157600080fd5b506105176111b8565b34801561060657600080fd5b5060125b60405160ff9091168152602001610449565b34801561062857600080fd5b506104b6610637366004613f4b565b60126020526000908152604090205460ff1681565b34801561065857600080fd5b506104b6610667366004613e7a565b61122b565b34801561067857600080fd5b506104b6610687366004613f4b565b60146020526000908152604090205460ff1681565b3480156106a857600080fd5b50610517601a5481565b3480156106be57600080fd5b506104946106cd366004613f68565b61126a565b3480156106de57600080fd5b50610494611313565b3480156106f357600080fd5b50610517610702366004613f4b565b611320565b34801561071357600080fd5b5061049461136a565b34801561072857600080fd5b50610517610737366004613f4b565b60266020526000908152604090205481565b34801561075557600080fd5b5061051760185481565b34801561076b57600080fd5b5061049461077a366004613dbc565b6113ba565b34801561078b57600080fd5b5061049461079a366004613fb0565b61148b565b3480156107ab57600080fd5b506104946107ba366004613fcb565b6114cb565b3480156107cb57600080fd5b50610517611529565b3480156107e057600080fd5b506105176107ef366004613f4b565b611573565b34801561080057600080fd5b5060225461060a9060ff1681565b34801561081a57600080fd5b50610494610829366004613f1d565b6115e3565b34801561083a57600080fd5b50610517610849366004613f4b565b611645565b34801561085a57600080fd5b50610494611660565b34801561086f57600080fd5b5061049461087e366004613eb4565b6116d4565b34801561088f57600080fd5b5061051760275481565b3480156108a557600080fd5b506104b66108b4366004613f4b565b60136020526000908152604090205460ff1681565b3480156108d557600080fd5b506104946108e4366004613eb4565b611729565b3480156108f557600080fd5b50610517601f5481565b34801561090b57600080fd5b506005546001600160a01b0316610435565b34801561092957600080fd5b506104b6610938366004613f4b565b60116020526000908152604090205460ff1681565b34801561095957600080fd5b50610517610968366004613f4b565b602080526000908152604090205481565b34801561098557600080fd5b50610517610994366004613f4b565b611808565b3480156109a557600080fd5b5061046761186a565b3480156109ba57600080fd5b506104b66109c9366004613e7a565b611879565b3480156109da57600080fd5b506105176109e9366004613f4b565b61190b565b3480156109fa57600080fd5b506104b6610a09366004613e7a565b61193e565b348015610a1a57600080fd5b5061051760165481565b348015610a3057600080fd5b50610517601b5481565b348015610a4657600080fd5b50610494610a55366004613eb4565b61194c565b348015610a6657600080fd5b50610517610a75366004613f4b565b6001600160a01b031660009081526030602052604090205490565b348015610a9c57600080fd5b50610494610aab366004614006565b6119a1565b348015610abc57600080fd5b50610aec610acb366004613dbc565b60216020526000908152604090208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610449565b348015610b1357600080fd5b50610517611acc565b348015610b2857600080fd5b5061051760175481565b348015610b3e57600080fd5b50610494611add565b348015610b5357600080fd5b506104b6610b62366004613f4b565b60156020526000908152604090205460ff1681565b348015610b8357600080fd5b50610494610b92366004614006565b611e54565b348015610ba357600080fd5b5061051760295481565b348015610bb957600080fd5b50610517610bc8366004613f1d565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610bff57600080fd5b5061051760285481565b348015610c1557600080fd5b50610494610c2436600461407b565b611f2d565b348015610c3557600080fd5b50610494610c44366004613eb4565b611f75565b348015610c5557600080fd5b50610494610c64366004614098565b611fca565b348015610c7557600080fd5b50610c89610c843660046140d1565b612015565b6040516104499190614106565b348015610ca257600080fd5b5061049461223b565b348015610cb757600080fd5b50610494612308565b348015610ccc57600080fd5b5061051760195481565b348015610ce257600080fd5b50610aec610cf1366004613f4b565b6123e2565b348015610d0257600080fd5b50610494612471565b604051633b966bcd60e21b8152602b60048201526024810182905260009073a636249ba25ece6f11e5c1f5130da90a90c417899063ee59af34906044015b602060405180830381865af4158015610d66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8a919061415f565b92915050565b606060038054610d9f9061417c565b80601f0160208091040260200160405190810160405280929190818152602001828054610dcb9061417c565b8015610e185780601f10610ded57610100808354040283529160200191610e18565b820191906000526020600020905b815481529060010190602001808311610dfb57829003601f168201915b5050505050905090565b6005546001600160a01b03163314610e555760405162461bcd60e51b8152600401610e4c906141b7565b60405180910390fd5b600754600160a01b900460ff1615610ed55760405162461bcd60e51b815260206004820152603c60248201527f4246463a2043616e206f6e6c7920656e61626c652050726553616c652062656660448201527f6f72652054726164696e6720686173206265656e206f70656e65642e000000006064820152608401610e4c565b600d839055600a80546001600160a01b0319166001600160a01b038416179055610f0781670de0b6b3a7640000614202565b600b555050600f805460ff1916600117905550565b600033610f2a81858561247c565b5060019392505050565b6005546001600160a01b03163314610f5e5760405162461bcd60e51b8152600401610e4c906141b7565b601f55565b6005546001600160a01b03163314610f8d5760405162461bcd60e51b8152600401610e4c906141b7565b6001600160a01b03919091166000908152601260205260409020805460ff1916911515919091179055565b604051633325c8f560e21b8152602b60048201526024810182905260009073a636249ba25ece6f11e5c1f5130da90a90c417899063cc9723d490604401610d49565b6005546001600160a01b031633146110245760405162461bcd60e51b8152600401610e4c906141b7565b602855565b6000336110378582856125a0565b61104285858561262c565b506001949350505050565b60006001600160a01b03831661106557506000610d8a565b602b548061107285611645565b101580156110925750826001600160a01b0316846001600160a01b031614155b949350505050565b601854600954604051632f99934f60e01b81526000929183917389e3e1fee6b040e095965189094419d41184d9e991632f99934f916110eb9189916001600160a01b03909116908990600401614221565b602060405180830381865af4158015611108573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112c9190614245565b905060015b60225460ff908116908216116111ae5760ff81166000908152602160205260409020548210801590611178575060ff81166000908152602160205260409020600101548211155b1561119c5760ff166000908152602160205260409020600201549250610d8a915050565b806111a68161425e565b915050611131565b5090949350505050565b602454604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015611202573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112269190614245565b905090565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909190610f2a908290869061126590879061427e565b61247c565b6005546001600160a01b031633146112945760405162461bcd60e51b8152600401610e4c906141b7565b6019849055601a839055601b829055604051635fe4fbe160e11b8152602b60048201526024810182905273a636249ba25ece6f11e5c1f5130da90a90c417899063bfc9f7c29060440160006040518083038186803b1580156112f557600080fd5b505af4158015611309573d6000803e3d6000fd5b5050505050505050565b61131e336000612c6a565b565b6001600160a01b038116600090815260136020526040812054819060ff16806113525750600754600160a81b900460ff165b156113615750620f4240610d8a565b50600092915050565b6005546001600160a01b031633146113945760405162461bcd60e51b8152600401610e4c906141b7565b60006113ab6027546113a530611645565b90612fb1565b90506113b681612fc4565b5050565b6005546001600160a01b031633146113e45760405162461bcd60e51b8152600401610e4c906141b7565b670de0b6b3a76400006103e86113f960025490565b611404906001614202565b61140e91906142ac565b61141891906142ac565b8110156114735760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015263302e312560e01b6064820152608401610e4c565b61148581670de0b6b3a7640000614202565b60165550565b6005546001600160a01b031633146114b55760405162461bcd60e51b8152600401610e4c906141b7565b6022805460ff191660ff92909216919091179055565b6005546001600160a01b031633146114f55760405162461bcd60e51b8152600401610e4c906141b7565b600a85111580156115095750600a60185411155b61151257600080fd5b601794909455601892909255601c55601d55601e55565b602454604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015611202573d6000803e3d6000fd5b602480546040516370a0823160e01b81526001600160a01b0384811660048301526000939216916370a0823191015b602060405180830381865afa1580156115bf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8a9190614245565b6005546001600160a01b0316331461160d5760405162461bcd60e51b8152600401610e4c906141b7565b60228054610100600160a81b0319166101006001600160a01b0394851602179055602380546001600160a01b03191691909216179055565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b0316331461168a5760405162461bcd60e51b8152600401610e4c906141b7565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b031633146116fe5760405162461bcd60e51b8152600401610e4c906141b7565b6001600160a01b03919091166000908152601360205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146117535760405162461bcd60e51b8152600401610e4c906141b7565b80156117bc576024805460405163031e79db60e41b81526001600160a01b038581166004830152909116916331e79db091015b600060405180830381600087803b1580156117a057600080fd5b505af11580156117b4573d6000803e3d6000fd5b505050505050565b6024546001600160a01b03166318c18adb836117d781611645565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401611786565b60405163057c207360e21b8152602b60048201526001600160a01b038216602482015260009073a636249ba25ece6f11e5c1f5130da90a90c41789906315f081cc90604401602060405180830381865af41580156115bf573d6000803e3d6000fd5b606060048054610d9f9061417c565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909190838110156118fe5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610e4c565b611042828686840361247c565b602480546040516302a2e74960e61b81526001600160a01b03848116600483015260009392169163a8b9d24091016115a2565b600033610f2a81858561262c565b6005546001600160a01b031633146119765760405162461bcd60e51b8152600401610e4c906141b7565b6001600160a01b03919091166000908152601160205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146119cb5760405162461bcd60e51b8152600401610e4c906141b7565b60005b81811015611ac7576009546001600160a01b03168383838181106119f4576119f46142c0565b9050602002016020810190611a099190613f4b565b6001600160a01b031614158015611a5a57506007546001600160a01b0316838383818110611a3957611a396142c0565b9050602002016020810190611a4e9190613f4b565b6001600160a01b031614155b15611ab557600160146000858585818110611a7757611a776142c0565b9050602002016020810190611a8c9190613f4b565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790555b80611abf816142d6565b9150506119ce565b505050565b60006112266027546113a530611645565b6005546001600160a01b03163314611b075760405162461bcd60e51b8152600401610e4c906141b7565b600754600160a01b900460ff1615611b615760405162461bcd60e51b815260206004820152601c60248201527f4246463a2054726164696e6720697320616c7265616479206f70656e000000006044820152606401610e4c565b600760009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd8919061415f565b6001600160a01b031663c9c6539630600760009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c5e919061415f565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015611cab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ccf919061415f565b600980546001600160a01b0319166001600160a01b0392831690811782556000908152601560209081526040808320805460ff19908116600190811790925585548716855260109093529281902080549092169092179055602480549254915163031e79db60e41b8152918416600483015291909216916331e79db09101600060405180830381600087803b158015611d6757600080fd5b505af1158015611d7b573d6000803e3d6000fd5b50505050611d91611d8b30611645565b47613179565b60095460075460405163095ea7b360e01b81526001600160a01b039182166004820152600019602482015291169063095ea7b3906044016020604051808303816000875af1158015611de7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e0b91906142f1565b506007805460ff60a01b1916600160a01b179055600f5460ff1615611e4e5742600c819055600d54611e4990611e4290603c613288565b8290613294565b600e55505b43600855565b6005546001600160a01b03163314611e7e5760405162461bcd60e51b8152600401610e4c906141b7565b60005b81811015611ac7576024546001600160a01b03166331e79db0848484818110611eac57611eac6142c0565b9050602002016020810190611ec19190613f4b565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b158015611f0257600080fd5b505af1158015611f16573d6000803e3d6000fd5b505050508080611f25906142d6565b915050611e81565b6005546001600160a01b03163314611f575760405162461bcd60e51b8152600401610e4c906141b7565b60078054911515600160a81b0260ff60a81b19909216919091179055565b6005546001600160a01b03163314611f9f5760405162461bcd60e51b8152600401610e4c906141b7565b6001600160a01b03919091166000908152601560205260409020805460ff1916911515919091179055565b6005546001600160a01b03163314611ff45760405162461bcd60e51b8152600401610e4c906141b7565b60ff9093166000908152602160205260409020918255600182015560020155565b60606000831180156120275750600082115b61206c5760405162461bcd60e51b81526020600482015260166024820152754246463a20496e76616c696420617267756d656e747360501b6044820152606401610e4c565b6001600160a01b038416600090815260306020526040812054906120908585614202565b9050600061209e868361430e565b90508281106120e35760405162461bcd60e51b81526020600482015260116024820152704246463a204f7574206f662072616e676560781b6044820152606401610e4c565b85838311156120fc578392506120f98784614325565b90505b60008167ffffffffffffffff81111561211757612117614339565b60405190808252806020026020018201604052801561216c57816020015b61215960405180606001604052806000815260200160008152602001600081525090565b8152602001906001900390816121355790505b5090506000835b8581101561222c576001600160a01b038b1660009081526030602052604081208054839081106121a5576121a56142c0565b90600052602060002001549050602f60008281526020019081526020016000206040518060600160405290816000820154815260200160018201548152602001600282015481525050848481518110612200576122006142c0565b602090810291909101015261221660018461427e565b9250508080612224906142d6565b915050612173565b50909998505050505050505050565b6005546001600160a01b031633146122655760405162461bcd60e51b8152600401610e4c906141b7565b600061227c60295447612fb190919063ffffffff16565b905060006122ad612299601c546064612fb190919063ffffffff16565b601d546122a7908590613288565b906132a0565b905060006122d86122ca601c546064612fb190919063ffffffff16565b601e546122a7908690613288565b905060006122ea826113a58686612fb1565b90506122f68382613294565b925061230283836132ac565b50505050565b6005546001600160a01b031633146123325760405162461bcd60e51b8152600401610e4c906141b7565b600754600160a01b900460ff16156123a05760405162461bcd60e51b815260206004820152602b60248201527f43616e206f6e6c792077697468647261772069662074726164696e672068617360448201526a1b89dd081cdd185c9d195960aa1b6064820152608401610e4c565b604051600090339047908381818185875af1925050503d8060008114612302576040519150601f19603f3d011682016040523d82523d6000602084013e612302565b6024805460405163fbcbc0f160e01b81526001600160a01b0384811660048301526000938493849392169163fbcbc0f191016040805180830381865afa158015612430573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612454919061434f565b9093509150828261246486611645565b9250925092509193909250565b61131e336001612c6a565b6001600160a01b0383166124de5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610e4c565b6001600160a01b03821661253f5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610e4c565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114612302578181101561261f5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610e4c565b612302848484840361247c565b6001600160a01b03831660009081526014602052604090205460ff1615801561266e57506001600160a01b03821660009081526014602052604090205460ff16155b61267757600080fd5b6001600160a01b03831660009081526012602052604090205460ff161580156126b957506001600160a01b03821660009081526012602052604090205460ff16155b6126c257600080fd5b6007548190600160a01b900460ff16801561271757506001600160a01b03841660009081526010602052604090205460ff168061271757506001600160a01b03831660009081526010602052604090205460ff165b801561273c57506001600160a01b03841660009081526011602052604090205460ff16155b801561276157506001600160a01b03831660009081526011602052604090205460ff16155b1561299857600f5460ff16801561277a575042600c5411155b8015612787575042600e54115b1561285e57600b54600a546040516370a0823160e01b81526001600160a01b038681166004830152909116906370a0823190602401602060405180830381865afa1580156127d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127fd9190614245565b101561285e5760405162461bcd60e51b815260206004820152602a60248201527f50726553616c653a204e6f7420656e6f7567682050726553616c6520746f6b6560448201526937103130b630b731b29760b11b6064820152608401610e4c565b604051633325c8f560e21b8152602b60048201526024810183905260009073a636249ba25ece6f11e5c1f5130da90a90c417899063cc9723d490604401602060405180830381865af41580156128b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128dc919061415f565b905073a636249ba25ece6f11e5c1f5130da90a90c417896304ea10f2602b8361290481611645565b6040516001600160e01b031960e086901b16815260048101939093526001600160a01b039182166024840152604483015287166064820152608401602060405180830381865af415801561295c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061298091906142f1565b612988575060005b6129948585858461336a565b9150505b6001600160a01b03831660009081526020805260409020546129cf576001600160a01b038316600090815260208052604090204290555b6001600160a01b03831660009081526010602052604090205460ff16158015612a1157506001600160a01b03831660009081526015602052604090205460ff16155b15612a855760165481612a2385611645565b612a2d919061427e565b1115612a855760405162461bcd60e51b815260206004820152602160248201527f4246463a2057616c6c65742062616c616e6365206c696d6974207265616368656044820152601960fa1b6064820152608401610e4c565b612a90848483613782565b612a9983613950565b60248054604051631b4a89ab60e11b81526001600160a01b0387811660048301529091169163369513569101602060405180830381865afa158015612ae2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b0691906142f1565b612b7e576024546001600160a01b031663e30443bc85612b2581611645565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612b6b57600080fd5b505af1925050508015612b7c575060015b505b60248054604051631b4a89ab60e11b81526001600160a01b0386811660048301529091169163369513569101602060405180830381865afa158015612bc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612beb91906142f1565b612302576024546001600160a01b031663e30443bc84612c0a81611645565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612c5057600080fd5b505af1925050508015612c61575060015b61230257612302565b602480546040516302a2e74960e61b81526001600160a01b03858116600483015260009392169163a8b9d2409101602060405180830381865afa158015612cb5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cd99190614245565b905060008111612d3e5760405162461bcd60e51b815260206004820152602a60248201527f4246463a20436c61696d657220686173206e6f20776974686472617761626c65604482015269206469766964656e647360b01b6064820152608401610e4c565b60008083612e6a57600754600160a81b900460ff1680612d7657506001600160a01b03851660009081526013602052604090205460ff165b612dea576040805162461bcd60e51b81526020600482015260248101919091527f4246463a20436c61696d6572206e6f7420616c6c6f77656420746f20636c616960448201527f6d206469766964656e64732c2063616e206f6e6c792072652d696e766573742e6064820152608401610e4c565b602480546040516352b5f81d60e01b81526001600160a01b0388811660048301819052938201939093529116906352b5f81d906044016020604051808303816000875af1158015612e3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e639190614245565b9150612efd565b8315612efd57602480546040516352b5f81d60e01b81526001600160a01b03888116600483015230938201939093529116906352b5f81d906044016020604051808303816000875af1158015612ec4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ee89190614245565b91508115612efd57612efa8286613a36565b90505b8115612faa57612f11602a80546001019055565b6000612f1c602a5490565b6000818152602f602090815260408083208781556001808201889055426002909201919091556001600160a01b038b1680855260308452828520805492830181558552938390200184905580518781529182018690528101919091529091507f67dd3d116bf53e0ddda53bb148a5fdc129854e1c507c0eeda9190049a9bbc84f9060600160405180910390a1505b5050505050565b6000612fbd828461430e565b9392505050565b6040805160028082526060820183526000924792849290916020830190803683370190505090503081600081518110612fff57612fff6142c0565b6001600160a01b03928316602091820292909201810191909152600754604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015613058573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061307c919061415f565b8160018151811061308f5761308f6142c0565b6001600160a01b0392831660209182029290920101526007546130b5913091168661247c565b60075460405163791ac94760e01b81526001600160a01b039091169063791ac947906130ee9087906000908690309042906004016143b7565b600060405180830381600087803b15801561310857600080fd5b505af115801561311c573d6000803e3d6000fd5b5050505060006131358347612fb190919063ffffffff16565b60408051878152602081018390529192507f4a6c12eb4e479a4ea28c8acad8efde466ef9bf69cf473501dd76865234496273910160405180910390a1949350505050565b6007546131919030906001600160a01b03168461247c565b6007546001600160a01b031663f305d7198230856000806131ba6005546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015613222573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061324791906143f3565b505060408051848152602081018490527fcb1652de9aeec38545fc281847b3dbfc89aab56dfa907b1ab68466f602c36fb49250015b60405180910390a15050565b6000612fbd8284614202565b6000612fbd828461427e565b6000612fbd82846142ac565b81156132f2576022546040516101009091046001600160a01b0316906108fc8415029084906000818181858888f193505050501580156132f0573d6000803e3d6000fd5b505b8015613334576023546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015613332573d6000803e3d6000fd5b505b60408051838152602081018390527f916ad8171ef8c567c7790377a142f0200f9565940680c06e30dd105cfd924968910161327c565b6001600160a01b0384166000908152601060205260408120548190819060ff16806133ad57506001600160a01b03861660009081526010602052604090205460ff165b6133f95760405162461bcd60e51b815260206004820152601b60248201527f4246463a204e6f206d61726b6574206d616b65727320666f756e6400000000006044820152606401610e4c565b6001600160a01b03871660009081526010602052604090205460ff161561363d576000806000600854431480156134335750600f5460ff16155b1561344157605a92506134b2565b60085461344f90600161427e565b431480156134605750600f5460ff16155b1561346e57603292506134b2565b6001600160a01b038716156134ac576134a561349c600a6122a7601b54601a5461329490919063ffffffff16565b60195490613294565b92506134b2565b60175492505b6134c160646122a78a86613288565b94506001600160a01b038716156135e2576134ec60646122a76019548b61328890919063ffffffff16565b94506135096103e86122a7601a548b61328890919063ffffffff16565b91506135266103e86122a7601b548b61328890919063ffffffff16565b905060006135348383613294565b905061354e82613548836113a58d8b612fb1565b90613294565b945061355b8b3088613782565b6135668b8985613782565b7f6b0b46d0273ce53f1de696d2100b35dd3a405dcecbcbeede66215d858d5c401d8b308860405161359993929190614221565b60405180910390a17f6b0b46d0273ce53f1de696d2100b35dd3a405dcecbcbeede66215d858d5c401d8b89856040516135d493929190614221565b60405180910390a150613635565b6135ec8886612fb1565b93506135f98a3087613782565b7f6b0b46d0273ce53f1de696d2100b35dd3a405dcecbcbeede66215d858d5c401d8a308760405161362c93929190614221565b60405180910390a15b505050613778565b60006008544314156136515750605a61369b565b60085461365f90600161427e565b43141561366e5750603261369b565b600061367a308861109a565b90508060185461368a919061427e565b9150601e821061369957601e91505b505b6136aa60646122a78884613288565b925060006136d260646122a76136cb60185486612fb190919063ffffffff16565b8a90613288565b6027549091506136e29082613294565b6027556136ef8785612fb1565b92506136fc893086613782565b600061370d6027546113a530611645565b9050601f548111156137225761372281613be8565b602854602754111561373957613739602754613cde565b7f4ab5e0df8ff1605133dbdd1b8e3f52edb9539abe64595f6f70b30d2fea7f204a8a308760405161376c93929190614221565b60405180910390a15050505b9695505050505050565b6001600160a01b0383166137e65760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610e4c565b6001600160a01b0382166138485760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610e4c565b6001600160a01b038316600090815260208190526040902054818110156138c05760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610e4c565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906138f790849061427e565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161394391815260200190565b60405180910390a3612302565b6001600160a01b03811660009081526011602052604090205460ff168061398f57506001600160a01b03811660009081526012602052604090205460ff165b156139975750565b6009546001600160a01b03828116911614156139b05750565b73a636249ba25ece6f11e5c1f5130da90a90c4178963cdb09f68602b836139d681611645565b6040516001600160e01b031960e086901b16815260048101939093526001600160a01b039091166024830152604482015260640160006040518083038186803b158015613a2257600080fd5b505af4158015612faa573d6000803e3d6000fd5b600080613a4230611645565b60408051600280825260608201835292935060009290916020830190803683375050600754604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015613ab1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ad5919061415f565b81600081518110613ae857613ae86142c0565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110613b1c57613b1c6142c0565b6001600160a01b03928316602091820292909201015260075460405163b6f9de9560e01b815291169063b6f9de95908790613b629060009086908a904290600401614421565b6000604051808303818588803b158015613b7b57600080fd5b505af1158015613b8f573d6000803e3d6000fd5b50505050506000613ba3836113a530611645565b60408051888152602081018390529192507f2d5c8efb676a77fc04b6b50a19f6ccbf08ee66df0202de33576485f1f77b4b69910160405180910390a195945050505050565b6000613c0460646122a7601c548561328890919063ffffffff16565b90506000613c138260026132a0565b90506000613c218483612fb1565b90506000613c2e82612fc4565b90506000613c4c60646122a7601c548561328890919063ffffffff16565b90506000613c6a60646122a7601d548661328890919063ffffffff16565b90506000613c8860646122a7601e548761328890919063ffffffff16565b90506000613c9c826113a585818989612fb1565b9050613ca88382613294565b9250613cb483836132ac565b600087118015613cc45750600084115b15613cd357613cd38785613179565b505050505050505050565b6000613ce982612fc4565b602754909150613cf99083612fb1565b602755602954600090613d0d908390613294565b6024546040519192506000916001600160a01b039091169083908381818185875af1925050503d8060008114613d5f576040519150601f19603f3d011682016040523d82523d6000602084013e613d64565b606091505b505090508015613da6576040518381527fb0cc2628d6d644cf6be9d8110e142297ac910d6d8026d795a99f272fd9ad60b19060200160405180910390a1612302565b602954613db39084613294565b60295550505050565b600060208284031215613dce57600080fd5b5035919050565b600060208083528351808285015260005b81811015613e0257858101830151858201604001528201613de6565b81811115613e14576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b0381168114613e3f57600080fd5b50565b600080600060608486031215613e5757600080fd5b833592506020840135613e6981613e2a565b929592945050506040919091013590565b60008060408385031215613e8d57600080fd5b8235613e9881613e2a565b946020939093013593505050565b8015158114613e3f57600080fd5b60008060408385031215613ec757600080fd5b8235613ed281613e2a565b91506020830135613ee281613ea6565b809150509250929050565b600080600060608486031215613f0257600080fd5b8335613f0d81613e2a565b92506020840135613e6981613e2a565b60008060408385031215613f3057600080fd5b8235613f3b81613e2a565b91506020830135613ee281613e2a565b600060208284031215613f5d57600080fd5b8135612fbd81613e2a565b60008060008060808587031215613f7e57600080fd5b5050823594602084013594506040840135936060013592509050565b803560ff81168114613fab57600080fd5b919050565b600060208284031215613fc257600080fd5b612fbd82613f9a565b600080600080600060a08688031215613fe357600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b6000806020838503121561401957600080fd5b823567ffffffffffffffff8082111561403157600080fd5b818501915085601f83011261404557600080fd5b81358181111561405457600080fd5b8660208260051b850101111561406957600080fd5b60209290920196919550909350505050565b60006020828403121561408d57600080fd5b8135612fbd81613ea6565b600080600080608085870312156140ae57600080fd5b6140b785613f9a565b966020860135965060408601359560600135945092505050565b6000806000606084860312156140e657600080fd5b83356140f181613e2a565b95602085013595506040909401359392505050565b602080825282518282018190526000919060409081850190868401855b828110156141525781518051855286810151878601528501518585015260609093019290850190600101614123565b5091979650505050505050565b60006020828403121561417157600080fd5b8151612fbd81613e2a565b600181811c9082168061419057607f821691505b602082108114156141b157634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561421c5761421c6141ec565b500290565b6001600160a01b039384168152919092166020820152604081019190915260600190565b60006020828403121561425757600080fd5b5051919050565b600060ff821660ff811415614275576142756141ec565b60010192915050565b60008219821115614291576142916141ec565b500190565b634e487b7160e01b600052601260045260246000fd5b6000826142bb576142bb614296565b500490565b634e487b7160e01b600052603260045260246000fd5b60006000198214156142ea576142ea6141ec565b5060010190565b60006020828403121561430357600080fd5b8151612fbd81613ea6565b600082821015614320576143206141ec565b500390565b60008261433457614334614296565b500690565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561436257600080fd5b505080516020909101519092909150565b600081518084526020808501945080840160005b838110156143ac5781516001600160a01b031687529582019590820190600101614387565b509495945050505050565b85815284602082015260a0604082015260006143d660a0830186614373565b6001600160a01b0394909416606083015250608001529392505050565b60008060006060848603121561440857600080fd5b8351925060208401519150604084015190509250925092565b84815260806020820152600061443a6080830186614373565b6001600160a01b0394909416604083015250606001529291505056fea26469706673582212209a24f9b569365c3fe6c738299975d9f4b8a24d568443cc753184fe5b0022622264736f6c634300080b003360a06040523480156200001157600080fd5b5060408051808201825260148082527f4246465f4469766964656e645f547261636b6572000000000000000000000000602080840182815285518087019096529285528401528151919291839183916200006e91600391620000df565b50805162000084906004906020840190620000df565b5050600980546001600160a01b03191633908117909155604051909350600092507f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091508290a369021e19e0c9bab2400000608052620001c2565b828054620000ed9062000185565b90600052602060002090601f0160209004810192826200011157600085556200015c565b82601f106200012c57805160ff19168380011785556200015c565b828001600101855582156200015c579182015b828111156200015c5782518255916020019190600101906200013f565b506200016a9291506200016e565b5090565b5b808211156200016a57600081556001016200016f565b600181811c908216806200019a57607f821691505b60208210811415620001bc57634e487b7160e01b600052602260045260246000fd5b50919050565b6080516117be620001ec6000396000818161051c0152818161077d0152610cab01526117be6000f3fe6080604052600436106101c65760003560e01c80636a474002116100f7578063a457c2d711610095578063be10b61411610064578063be10b6141461050a578063dd62ed3e1461053e578063e30443bc14610584578063fbcbc0f1146105a457600080fd5b8063a457c2d714610474578063a8b9d24014610494578063a9059cbb146104b4578063aafd847a146104d457600080fd5b806385a6b3ae116100d157806385a6b3ae146104015780638da5cb5b1461041757806391b89fba1461043f57806395d89b411461045f57600080fd5b80636a474002146103a157806370a08231146103b6578063715018a6146103ec57600080fd5b806327ce014711610164578063369513561161013e578063369513561461031157806339509351146103315780634e7b827f1461035157806352b5f81d1461038157600080fd5b806327ce0147146102b5578063313ce567146102d557806331e79db0146102f157600080fd5b806309bbedde116101a057806309bbedde1461023d57806318160ddd1461026057806318c18adb1461027557806323b872dd1461029557600080fd5b806303c83302146101da57806306fdde03146101e2578063095ea7b31461020d57600080fd5b366101d5576101d36105d9565b005b600080fd5b6101d36105d9565b3480156101ee57600080fd5b506101f761066c565b60405161020491906114e2565b60405180910390f35b34801561021957600080fd5b5061022d61022836600461154f565b6106fe565b6040519015158152602001610204565b34801561024957600080fd5b50610252610718565b604051908152602001610204565b34801561026c57600080fd5b50600254610252565b34801561028157600080fd5b506101d361029036600461154f565b610728565b3480156102a157600080fd5b5061022d6102b036600461157b565b610835565b3480156102c157600080fd5b506102526102d03660046115bc565b610859565b3480156102e157600080fd5b5060405160128152602001610204565b3480156102fd57600080fd5b506101d361030c3660046115bc565b6108b5565b34801561031d57600080fd5b5061022d61032c3660046115bc565b610994565b34801561033d57600080fd5b5061022d61034c36600461154f565b6109e0565b34801561035d57600080fd5b5061022d61036c3660046115bc565b600d6020526000908152604090205460ff1681565b34801561038d57600080fd5b5061025261039c3660046115d9565b610a1f565b3480156103ad57600080fd5b506101d3610a60565b3480156103c257600080fd5b506102526103d13660046115bc565b6001600160a01b031660009081526020819052604090205490565b3480156103f857600080fd5b506101d3610b00565b34801561040d57600080fd5b5061025260085481565b34801561042357600080fd5b506009546040516001600160a01b039091168152602001610204565b34801561044b57600080fd5b5061025261045a3660046115bc565b610b74565b34801561046b57600080fd5b506101f7610b7f565b34801561048057600080fd5b5061022d61048f36600461154f565b610b8e565b3480156104a057600080fd5b506102526104af3660046115bc565b610c20565b3480156104c057600080fd5b5061022d6104cf36600461154f565b610c4c565b3480156104e057600080fd5b506102526104ef3660046115bc565b6001600160a01b031660009081526007602052604090205490565b34801561051657600080fd5b506102527f000000000000000000000000000000000000000000000000000000000000000081565b34801561054a57600080fd5b506102526105593660046115d9565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561059057600080fd5b506101d361059f36600461154f565b610c5a565b3480156105b057600080fd5b506105c46105bf3660046115bc565b610d8a565b60408051928352602083019190915201610204565b60006105e460025490565b116105ee57600080fd5b341561066a5761062161060060025490565b61060e34600160801b610db7565b6106189190611628565b60055490610dca565b60055560405134815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a26008546106669034610dca565b6008555b565b60606003805461067b9061164a565b80601f01602080910402602001604051908101604052809291908181526020018280546106a79061164a565b80156106f45780601f106106c9576101008083540402835291602001916106f4565b820191906000526020600020905b8154815290600101906020018083116106d757829003601f168201915b5050505050905090565b60003361070c818585610dd6565b60019150505b92915050565b6000610723600b5490565b905090565b6009546001600160a01b0316331461075b5760405162461bcd60e51b815260040161075290611685565b60405180910390fd5b6001600160a01b0382166000908152600d60205260409020805460ff191690557f000000000000000000000000000000000000000000000000000000000000000081106107fd576107ac8282610e36565b6001600160a01b0382166000908152600c602052604090205460ff166107fd576001600160a01b0382166000908152600c60205260409020805460ff191660011790556107fd600b80546001019055565b6040516001600160a01b038316907fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2590600090a25050565b600033610843858285610e95565b61084e858585610f21565b506001949350505050565b6001600160a01b03811660009081526006602090815260408083205491839052822054600554600160801b926108ab926108a6926108a09161089b9190610db7565b610f7c565b90610fea565b610ff6565b6107129190611628565b6009546001600160a01b031633146108df5760405162461bcd60e51b815260040161075290611685565b6001600160a01b0381166000908152600d60205260408120805460ff1916600117905561090d908290610e36565b6001600160a01b0381166000908152600c602052604090205460ff1615156001141561095d576001600160a01b0381166000908152600c60205260409020805460ff1916905561095d600b611048565b6040516001600160a01b038216907fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2590600090a250565b6009546000906001600160a01b031633146109c15760405162461bcd60e51b815260040161075290611685565b506001600160a01b03166000908152600d602052604090205460ff1690565b3360008181526001602090815260408083206001600160a01b038716845290915281205490919061070c9082908690610a1a9087906116ba565b610dd6565b6009546000906001600160a01b03163314610a4c5760405162461bcd60e51b815260040161075290611685565b6000610a58848461109f565b949350505050565b60405162461bcd60e51b815260206004820152606360248201527f4246465f4469766964656e645f547261636b65723a207769746864726177446960448201527f766964656e642064697361626c65642e20557365207468652027636c61696d2760648201527f2066756e6374696f6e206f6e20746865206d61696e2042464620636f6e74726160848201526231ba1760e91b60a482015260c401610752565b6009546001600160a01b03163314610b2a5760405162461bcd60e51b815260040161075290611685565b6009546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600980546001600160a01b0319169055565b600061071282610c20565b60606004805461067b9061164a565b3360008181526001602090815260408083206001600160a01b038716845290915281205490919083811015610c135760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610752565b61084e8286868403610dd6565b6001600160a01b03811660009081526007602052604081205461071290610c4684610859565b906111f5565b60003361070c818585610f21565b6009546001600160a01b03163314610c845760405162461bcd60e51b815260040161075290611685565b6001600160a01b0382166000908152600d602052604090205460ff1615610ca9575050565b7f00000000000000000000000000000000000000000000000000000000000000008110610d2f57610cda8282610e36565b6001600160a01b0382166000908152600c602052604090205460ff16610d2b576001600160a01b0382166000908152600c60205260409020805460ff19166001179055610d2b600b80546001019055565b5050565b610d3a826000610e36565b6001600160a01b0382166000908152600c602052604090205460ff16151560011415610d2b576001600160a01b0382166000908152600c60205260409020805460ff19169055610d2b600b611048565b600080610d9683610c20565b6001600160a01b039093166000908152600760205260409020549293915050565b6000610dc382846116d2565b9392505050565b6000610dc382846116ba565b60405162461bcd60e51b815260206004820152602a60248201527f4246465f4469766964656e645f547261636b65723a204e6f20617070726f76616044820152691b1cc8185b1b1bddd95960b21b6064820152608401610752565b505050565b6001600160a01b03821660009081526020819052604090205480821115610e75576000610e6383836111f5565b9050610e6f8482611201565b50505050565b80821015610e31576000610e8982846111f5565b9050610e6f8482611265565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114610e6f5781811015610f145760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610752565b610e6f8484848403610dd6565b60405162461bcd60e51b815260206004820152602a60248201527f4246465f4469766964656e645f547261636b65723a204e6f207472616e7366656044820152691c9cc8185b1b1bddd95960b21b6064820152608401610752565b60006001600160ff1b03821115610fe65760405162461bcd60e51b815260206004820152602860248201527f53616665436173743a2076616c756520646f65736e27742066697420696e2061604482015267371034b73a191a9b60c11b6064820152608401610752565b5090565b6000610dc382846116f1565b600080821215610fe65760405162461bcd60e51b815260206004820181905260248201527f53616665436173743a2076616c7565206d75737420626520706f7369746976656044820152606401610752565b8054806110975760405162461bcd60e51b815260206004820152601b60248201527f436f756e7465723a2064656372656d656e74206f766572666c6f7700000000006044820152606401610752565b600019019055565b6000806110ab84610c20565b905080156111eb576001600160a01b0384166000908152600760205260409020546110d69082610dca565b6001600160a01b038516600081815260076020526040908190209290925590517feb063efb53b3790d2bc15284b59af7544466c8787c2883321ee27095647911b69061113790849087909182526001600160a01b0316602082015260400190565b60405180910390a26000836001600160a01b03168260405160006040518083038185875af1925050503d806000811461118c576040519150601f19603f3d011682016040523d82523d6000602084013e611191565b606091505b50509050806111e3576001600160a01b0385166000908152600760205260409020546111bd90836111f5565b6001600160a01b0386166000908152600760205260408120919091559250610712915050565b509050610712565b5060009392505050565b6000610dc38284611732565b61120b82826112a9565b61124561122661089b83600554610db790919063ffffffff16565b6001600160a01b03841660009081526006602052604090205490611388565b6001600160a01b0390921660009081526006602052604090209190915550565b61126f8282611394565b61124561128a61089b83600554610db790919063ffffffff16565b6001600160a01b03841660009081526006602052604090205490610fea565b6001600160a01b0382166112ff5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610752565b806002600082825461131191906116ba565b90915550506001600160a01b0382166000908152602081905260408120805483929061133e9084906116ba565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6000610dc38284611749565b6001600160a01b0382166113f45760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610752565b6001600160a01b038216600090815260208190526040902054818110156114685760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610752565b6001600160a01b0383166000908152602081905260408120838303905560028054849290611497908490611732565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b600060208083528351808285015260005b8181101561150f578581018301518582016040015282016114f3565b81811115611521576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b038116811461154c57600080fd5b50565b6000806040838503121561156257600080fd5b823561156d81611537565b946020939093013593505050565b60008060006060848603121561159057600080fd5b833561159b81611537565b925060208401356115ab81611537565b929592945050506040919091013590565b6000602082840312156115ce57600080fd5b8135610dc381611537565b600080604083850312156115ec57600080fd5b82356115f781611537565b9150602083013561160781611537565b809150509250929050565b634e487b7160e01b600052601160045260246000fd5b60008261164557634e487b7160e01b600052601260045260246000fd5b500490565b600181811c9082168061165e57607f821691505b6020821081141561167f57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600082198211156116cd576116cd611612565b500190565b60008160001904831182151516156116ec576116ec611612565b500290565b600080821280156001600160ff1b038490038513161561171357611713611612565b600160ff1b839003841281161561172c5761172c611612565b50500190565b60008282101561174457611744611612565b500390565b60008083128015600160ff1b85018412161561176757611767611612565b6001600160ff1b038401831381161561178257611782611612565b5050039056fea264697066735822122080e5a226483e0df38603cebf1c96fe2aa9aff63f4de330b288983c933263bbbb64736f6c634300080b00330000000000000000000000005a377aecf9b9deaf61ab116fe14ed56a3f4b4a7e00000000000000000000000058782fc478221bfb381ce8d61560eb0f9f8402a8

Deployed Bytecode

0x6080604052600436106104095760003560e01c80637c4b492e11610213578063b80425c211610123578063e4132fd8116100ab578063f42938901161007a578063f429389014610c96578063f5648a4f14610cab578063fb66d86d14610cc0578063fbcbc0f114610cd6578063fdb5a03e14610cf657600080fd5b8063e4132fd814610c09578063ea084eef14610c29578063eb50d71f14610c49578063ec29f4e914610c6957600080fd5b8063c9e8714c116100f2578063c9e8714c14610b47578063d2469ba614610b77578063d297105914610b97578063dd62ed3e14610bad578063e3402c6714610bf357600080fd5b8063b80425c214610ab0578063ba762ddd14610b07578063c2b1b19914610b1c578063c9567bf914610b3257600080fd5b806395d89b41116101a6578063aa4bde2811610175578063aa4bde2814610a0e578063adc7f53e14610a24578063af9549e014610a3a578063b1fdb11b14610a5a578063b515566a14610a9057600080fd5b806395d89b4114610999578063a457c2d7146109ae578063a8b9d240146109ce578063a9059cbb146109ee57600080fd5b80638da5cb5b116101e25780638da5cb5b146108ff5780638e5916b21461091d578063906778331461094d57806392c403441461097957600080fd5b80637c4b492e14610883578063884289e3146108995780638954fb4a146108c957806389a5c691146108e957600080fd5b80633bbac579116103195780635d0dc8e4116102a157806368bfe6231161027057806368bfe623146107f45780636973cd091461080e57806370a082311461082e578063715018a61461084e578063753d654e1461086357600080fd5b80635d0dc8e41461077f5780635fcefa421461079f57806364b0f653146107bf5780636843cd84146107d457600080fd5b80634f0f9010116102e85780634f0f9010146106e757806351bc3c85146107075780635b6612ad1461071c5780635b683e66146107495780635d0044ca1461075f57600080fd5b80633bbac5791461066c5780634bae2ef11461069c5780634c590d87146106b25780634e71d92d146106d257600080fd5b80631c08bc5d1161039c5780632c7401b31161036b5780632c7401b3146105c557806330bb4cff146105e5578063313ce567146105fa578063333e99db1461061c578063395093511461064c57600080fd5b80631c08bc5d1461054557806323b872dd1461056557806324848348146105855780632c1f5216146105a557600080fd5b806312dfbd33116103d857806312dfbd33146104c6578063153b0d1e146104e657806318160ddd1461050657806319a1cca01461052557600080fd5b806302d7acda1461041557806306fdde03146104525780630829b32d14610474578063095ea7b31461049657600080fd5b3661041057005b600080fd5b34801561042157600080fd5b50610435610430366004613dbc565b610d0b565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561045e57600080fd5b50610467610d90565b6040516104499190613dd5565b34801561048057600080fd5b5061049461048f366004613e42565b610e22565b005b3480156104a257600080fd5b506104b66104b1366004613e7a565b610f1c565b6040519015158152602001610449565b3480156104d257600080fd5b506104946104e1366004613dbc565b610f34565b3480156104f257600080fd5b50610494610501366004613eb4565b610f63565b34801561051257600080fd5b506002545b604051908152602001610449565b34801561053157600080fd5b50610435610540366004613dbc565b610fb8565b34801561055157600080fd5b50610494610560366004613dbc565b610ffa565b34801561057157600080fd5b506104b6610580366004613eed565b611029565b34801561059157600080fd5b506104b66105a0366004613f1d565b61104d565b3480156105b157600080fd5b50602454610435906001600160a01b031681565b3480156105d157600080fd5b506105176105e0366004613e7a565b61109a565b3480156105f157600080fd5b506105176111b8565b34801561060657600080fd5b5060125b60405160ff9091168152602001610449565b34801561062857600080fd5b506104b6610637366004613f4b565b60126020526000908152604090205460ff1681565b34801561065857600080fd5b506104b6610667366004613e7a565b61122b565b34801561067857600080fd5b506104b6610687366004613f4b565b60146020526000908152604090205460ff1681565b3480156106a857600080fd5b50610517601a5481565b3480156106be57600080fd5b506104946106cd366004613f68565b61126a565b3480156106de57600080fd5b50610494611313565b3480156106f357600080fd5b50610517610702366004613f4b565b611320565b34801561071357600080fd5b5061049461136a565b34801561072857600080fd5b50610517610737366004613f4b565b60266020526000908152604090205481565b34801561075557600080fd5b5061051760185481565b34801561076b57600080fd5b5061049461077a366004613dbc565b6113ba565b34801561078b57600080fd5b5061049461079a366004613fb0565b61148b565b3480156107ab57600080fd5b506104946107ba366004613fcb565b6114cb565b3480156107cb57600080fd5b50610517611529565b3480156107e057600080fd5b506105176107ef366004613f4b565b611573565b34801561080057600080fd5b5060225461060a9060ff1681565b34801561081a57600080fd5b50610494610829366004613f1d565b6115e3565b34801561083a57600080fd5b50610517610849366004613f4b565b611645565b34801561085a57600080fd5b50610494611660565b34801561086f57600080fd5b5061049461087e366004613eb4565b6116d4565b34801561088f57600080fd5b5061051760275481565b3480156108a557600080fd5b506104b66108b4366004613f4b565b60136020526000908152604090205460ff1681565b3480156108d557600080fd5b506104946108e4366004613eb4565b611729565b3480156108f557600080fd5b50610517601f5481565b34801561090b57600080fd5b506005546001600160a01b0316610435565b34801561092957600080fd5b506104b6610938366004613f4b565b60116020526000908152604090205460ff1681565b34801561095957600080fd5b50610517610968366004613f4b565b602080526000908152604090205481565b34801561098557600080fd5b50610517610994366004613f4b565b611808565b3480156109a557600080fd5b5061046761186a565b3480156109ba57600080fd5b506104b66109c9366004613e7a565b611879565b3480156109da57600080fd5b506105176109e9366004613f4b565b61190b565b3480156109fa57600080fd5b506104b6610a09366004613e7a565b61193e565b348015610a1a57600080fd5b5061051760165481565b348015610a3057600080fd5b50610517601b5481565b348015610a4657600080fd5b50610494610a55366004613eb4565b61194c565b348015610a6657600080fd5b50610517610a75366004613f4b565b6001600160a01b031660009081526030602052604090205490565b348015610a9c57600080fd5b50610494610aab366004614006565b6119a1565b348015610abc57600080fd5b50610aec610acb366004613dbc565b60216020526000908152604090208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610449565b348015610b1357600080fd5b50610517611acc565b348015610b2857600080fd5b5061051760175481565b348015610b3e57600080fd5b50610494611add565b348015610b5357600080fd5b506104b6610b62366004613f4b565b60156020526000908152604090205460ff1681565b348015610b8357600080fd5b50610494610b92366004614006565b611e54565b348015610ba357600080fd5b5061051760295481565b348015610bb957600080fd5b50610517610bc8366004613f1d565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610bff57600080fd5b5061051760285481565b348015610c1557600080fd5b50610494610c2436600461407b565b611f2d565b348015610c3557600080fd5b50610494610c44366004613eb4565b611f75565b348015610c5557600080fd5b50610494610c64366004614098565b611fca565b348015610c7557600080fd5b50610c89610c843660046140d1565b612015565b6040516104499190614106565b348015610ca257600080fd5b5061049461223b565b348015610cb757600080fd5b50610494612308565b348015610ccc57600080fd5b5061051760195481565b348015610ce257600080fd5b50610aec610cf1366004613f4b565b6123e2565b348015610d0257600080fd5b50610494612471565b604051633b966bcd60e21b8152602b60048201526024810182905260009073a636249ba25ece6f11e5c1f5130da90a90c417899063ee59af34906044015b602060405180830381865af4158015610d66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8a919061415f565b92915050565b606060038054610d9f9061417c565b80601f0160208091040260200160405190810160405280929190818152602001828054610dcb9061417c565b8015610e185780601f10610ded57610100808354040283529160200191610e18565b820191906000526020600020905b815481529060010190602001808311610dfb57829003601f168201915b5050505050905090565b6005546001600160a01b03163314610e555760405162461bcd60e51b8152600401610e4c906141b7565b60405180910390fd5b600754600160a01b900460ff1615610ed55760405162461bcd60e51b815260206004820152603c60248201527f4246463a2043616e206f6e6c7920656e61626c652050726553616c652062656660448201527f6f72652054726164696e6720686173206265656e206f70656e65642e000000006064820152608401610e4c565b600d839055600a80546001600160a01b0319166001600160a01b038416179055610f0781670de0b6b3a7640000614202565b600b555050600f805460ff1916600117905550565b600033610f2a81858561247c565b5060019392505050565b6005546001600160a01b03163314610f5e5760405162461bcd60e51b8152600401610e4c906141b7565b601f55565b6005546001600160a01b03163314610f8d5760405162461bcd60e51b8152600401610e4c906141b7565b6001600160a01b03919091166000908152601260205260409020805460ff1916911515919091179055565b604051633325c8f560e21b8152602b60048201526024810182905260009073a636249ba25ece6f11e5c1f5130da90a90c417899063cc9723d490604401610d49565b6005546001600160a01b031633146110245760405162461bcd60e51b8152600401610e4c906141b7565b602855565b6000336110378582856125a0565b61104285858561262c565b506001949350505050565b60006001600160a01b03831661106557506000610d8a565b602b548061107285611645565b101580156110925750826001600160a01b0316846001600160a01b031614155b949350505050565b601854600954604051632f99934f60e01b81526000929183917389e3e1fee6b040e095965189094419d41184d9e991632f99934f916110eb9189916001600160a01b03909116908990600401614221565b602060405180830381865af4158015611108573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112c9190614245565b905060015b60225460ff908116908216116111ae5760ff81166000908152602160205260409020548210801590611178575060ff81166000908152602160205260409020600101548211155b1561119c5760ff166000908152602160205260409020600201549250610d8a915050565b806111a68161425e565b915050611131565b5090949350505050565b602454604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015611202573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112269190614245565b905090565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909190610f2a908290869061126590879061427e565b61247c565b6005546001600160a01b031633146112945760405162461bcd60e51b8152600401610e4c906141b7565b6019849055601a839055601b829055604051635fe4fbe160e11b8152602b60048201526024810182905273a636249ba25ece6f11e5c1f5130da90a90c417899063bfc9f7c29060440160006040518083038186803b1580156112f557600080fd5b505af4158015611309573d6000803e3d6000fd5b5050505050505050565b61131e336000612c6a565b565b6001600160a01b038116600090815260136020526040812054819060ff16806113525750600754600160a81b900460ff165b156113615750620f4240610d8a565b50600092915050565b6005546001600160a01b031633146113945760405162461bcd60e51b8152600401610e4c906141b7565b60006113ab6027546113a530611645565b90612fb1565b90506113b681612fc4565b5050565b6005546001600160a01b031633146113e45760405162461bcd60e51b8152600401610e4c906141b7565b670de0b6b3a76400006103e86113f960025490565b611404906001614202565b61140e91906142ac565b61141891906142ac565b8110156114735760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015263302e312560e01b6064820152608401610e4c565b61148581670de0b6b3a7640000614202565b60165550565b6005546001600160a01b031633146114b55760405162461bcd60e51b8152600401610e4c906141b7565b6022805460ff191660ff92909216919091179055565b6005546001600160a01b031633146114f55760405162461bcd60e51b8152600401610e4c906141b7565b600a85111580156115095750600a60185411155b61151257600080fd5b601794909455601892909255601c55601d55601e55565b602454604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015611202573d6000803e3d6000fd5b602480546040516370a0823160e01b81526001600160a01b0384811660048301526000939216916370a0823191015b602060405180830381865afa1580156115bf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8a9190614245565b6005546001600160a01b0316331461160d5760405162461bcd60e51b8152600401610e4c906141b7565b60228054610100600160a81b0319166101006001600160a01b0394851602179055602380546001600160a01b03191691909216179055565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b0316331461168a5760405162461bcd60e51b8152600401610e4c906141b7565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b031633146116fe5760405162461bcd60e51b8152600401610e4c906141b7565b6001600160a01b03919091166000908152601360205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146117535760405162461bcd60e51b8152600401610e4c906141b7565b80156117bc576024805460405163031e79db60e41b81526001600160a01b038581166004830152909116916331e79db091015b600060405180830381600087803b1580156117a057600080fd5b505af11580156117b4573d6000803e3d6000fd5b505050505050565b6024546001600160a01b03166318c18adb836117d781611645565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401611786565b60405163057c207360e21b8152602b60048201526001600160a01b038216602482015260009073a636249ba25ece6f11e5c1f5130da90a90c41789906315f081cc90604401602060405180830381865af41580156115bf573d6000803e3d6000fd5b606060048054610d9f9061417c565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909190838110156118fe5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610e4c565b611042828686840361247c565b602480546040516302a2e74960e61b81526001600160a01b03848116600483015260009392169163a8b9d24091016115a2565b600033610f2a81858561262c565b6005546001600160a01b031633146119765760405162461bcd60e51b8152600401610e4c906141b7565b6001600160a01b03919091166000908152601160205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146119cb5760405162461bcd60e51b8152600401610e4c906141b7565b60005b81811015611ac7576009546001600160a01b03168383838181106119f4576119f46142c0565b9050602002016020810190611a099190613f4b565b6001600160a01b031614158015611a5a57506007546001600160a01b0316838383818110611a3957611a396142c0565b9050602002016020810190611a4e9190613f4b565b6001600160a01b031614155b15611ab557600160146000858585818110611a7757611a776142c0565b9050602002016020810190611a8c9190613f4b565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790555b80611abf816142d6565b9150506119ce565b505050565b60006112266027546113a530611645565b6005546001600160a01b03163314611b075760405162461bcd60e51b8152600401610e4c906141b7565b600754600160a01b900460ff1615611b615760405162461bcd60e51b815260206004820152601c60248201527f4246463a2054726164696e6720697320616c7265616479206f70656e000000006044820152606401610e4c565b600760009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd8919061415f565b6001600160a01b031663c9c6539630600760009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c5e919061415f565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015611cab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ccf919061415f565b600980546001600160a01b0319166001600160a01b0392831690811782556000908152601560209081526040808320805460ff19908116600190811790925585548716855260109093529281902080549092169092179055602480549254915163031e79db60e41b8152918416600483015291909216916331e79db09101600060405180830381600087803b158015611d6757600080fd5b505af1158015611d7b573d6000803e3d6000fd5b50505050611d91611d8b30611645565b47613179565b60095460075460405163095ea7b360e01b81526001600160a01b039182166004820152600019602482015291169063095ea7b3906044016020604051808303816000875af1158015611de7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e0b91906142f1565b506007805460ff60a01b1916600160a01b179055600f5460ff1615611e4e5742600c819055600d54611e4990611e4290603c613288565b8290613294565b600e55505b43600855565b6005546001600160a01b03163314611e7e5760405162461bcd60e51b8152600401610e4c906141b7565b60005b81811015611ac7576024546001600160a01b03166331e79db0848484818110611eac57611eac6142c0565b9050602002016020810190611ec19190613f4b565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b158015611f0257600080fd5b505af1158015611f16573d6000803e3d6000fd5b505050508080611f25906142d6565b915050611e81565b6005546001600160a01b03163314611f575760405162461bcd60e51b8152600401610e4c906141b7565b60078054911515600160a81b0260ff60a81b19909216919091179055565b6005546001600160a01b03163314611f9f5760405162461bcd60e51b8152600401610e4c906141b7565b6001600160a01b03919091166000908152601560205260409020805460ff1916911515919091179055565b6005546001600160a01b03163314611ff45760405162461bcd60e51b8152600401610e4c906141b7565b60ff9093166000908152602160205260409020918255600182015560020155565b60606000831180156120275750600082115b61206c5760405162461bcd60e51b81526020600482015260166024820152754246463a20496e76616c696420617267756d656e747360501b6044820152606401610e4c565b6001600160a01b038416600090815260306020526040812054906120908585614202565b9050600061209e868361430e565b90508281106120e35760405162461bcd60e51b81526020600482015260116024820152704246463a204f7574206f662072616e676560781b6044820152606401610e4c565b85838311156120fc578392506120f98784614325565b90505b60008167ffffffffffffffff81111561211757612117614339565b60405190808252806020026020018201604052801561216c57816020015b61215960405180606001604052806000815260200160008152602001600081525090565b8152602001906001900390816121355790505b5090506000835b8581101561222c576001600160a01b038b1660009081526030602052604081208054839081106121a5576121a56142c0565b90600052602060002001549050602f60008281526020019081526020016000206040518060600160405290816000820154815260200160018201548152602001600282015481525050848481518110612200576122006142c0565b602090810291909101015261221660018461427e565b9250508080612224906142d6565b915050612173565b50909998505050505050505050565b6005546001600160a01b031633146122655760405162461bcd60e51b8152600401610e4c906141b7565b600061227c60295447612fb190919063ffffffff16565b905060006122ad612299601c546064612fb190919063ffffffff16565b601d546122a7908590613288565b906132a0565b905060006122d86122ca601c546064612fb190919063ffffffff16565b601e546122a7908690613288565b905060006122ea826113a58686612fb1565b90506122f68382613294565b925061230283836132ac565b50505050565b6005546001600160a01b031633146123325760405162461bcd60e51b8152600401610e4c906141b7565b600754600160a01b900460ff16156123a05760405162461bcd60e51b815260206004820152602b60248201527f43616e206f6e6c792077697468647261772069662074726164696e672068617360448201526a1b89dd081cdd185c9d195960aa1b6064820152608401610e4c565b604051600090339047908381818185875af1925050503d8060008114612302576040519150601f19603f3d011682016040523d82523d6000602084013e612302565b6024805460405163fbcbc0f160e01b81526001600160a01b0384811660048301526000938493849392169163fbcbc0f191016040805180830381865afa158015612430573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612454919061434f565b9093509150828261246486611645565b9250925092509193909250565b61131e336001612c6a565b6001600160a01b0383166124de5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610e4c565b6001600160a01b03821661253f5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610e4c565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114612302578181101561261f5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610e4c565b612302848484840361247c565b6001600160a01b03831660009081526014602052604090205460ff1615801561266e57506001600160a01b03821660009081526014602052604090205460ff16155b61267757600080fd5b6001600160a01b03831660009081526012602052604090205460ff161580156126b957506001600160a01b03821660009081526012602052604090205460ff16155b6126c257600080fd5b6007548190600160a01b900460ff16801561271757506001600160a01b03841660009081526010602052604090205460ff168061271757506001600160a01b03831660009081526010602052604090205460ff165b801561273c57506001600160a01b03841660009081526011602052604090205460ff16155b801561276157506001600160a01b03831660009081526011602052604090205460ff16155b1561299857600f5460ff16801561277a575042600c5411155b8015612787575042600e54115b1561285e57600b54600a546040516370a0823160e01b81526001600160a01b038681166004830152909116906370a0823190602401602060405180830381865afa1580156127d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127fd9190614245565b101561285e5760405162461bcd60e51b815260206004820152602a60248201527f50726553616c653a204e6f7420656e6f7567682050726553616c6520746f6b6560448201526937103130b630b731b29760b11b6064820152608401610e4c565b604051633325c8f560e21b8152602b60048201526024810183905260009073a636249ba25ece6f11e5c1f5130da90a90c417899063cc9723d490604401602060405180830381865af41580156128b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128dc919061415f565b905073a636249ba25ece6f11e5c1f5130da90a90c417896304ea10f2602b8361290481611645565b6040516001600160e01b031960e086901b16815260048101939093526001600160a01b039182166024840152604483015287166064820152608401602060405180830381865af415801561295c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061298091906142f1565b612988575060005b6129948585858461336a565b9150505b6001600160a01b03831660009081526020805260409020546129cf576001600160a01b038316600090815260208052604090204290555b6001600160a01b03831660009081526010602052604090205460ff16158015612a1157506001600160a01b03831660009081526015602052604090205460ff16155b15612a855760165481612a2385611645565b612a2d919061427e565b1115612a855760405162461bcd60e51b815260206004820152602160248201527f4246463a2057616c6c65742062616c616e6365206c696d6974207265616368656044820152601960fa1b6064820152608401610e4c565b612a90848483613782565b612a9983613950565b60248054604051631b4a89ab60e11b81526001600160a01b0387811660048301529091169163369513569101602060405180830381865afa158015612ae2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b0691906142f1565b612b7e576024546001600160a01b031663e30443bc85612b2581611645565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612b6b57600080fd5b505af1925050508015612b7c575060015b505b60248054604051631b4a89ab60e11b81526001600160a01b0386811660048301529091169163369513569101602060405180830381865afa158015612bc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612beb91906142f1565b612302576024546001600160a01b031663e30443bc84612c0a81611645565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612c5057600080fd5b505af1925050508015612c61575060015b61230257612302565b602480546040516302a2e74960e61b81526001600160a01b03858116600483015260009392169163a8b9d2409101602060405180830381865afa158015612cb5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cd99190614245565b905060008111612d3e5760405162461bcd60e51b815260206004820152602a60248201527f4246463a20436c61696d657220686173206e6f20776974686472617761626c65604482015269206469766964656e647360b01b6064820152608401610e4c565b60008083612e6a57600754600160a81b900460ff1680612d7657506001600160a01b03851660009081526013602052604090205460ff165b612dea576040805162461bcd60e51b81526020600482015260248101919091527f4246463a20436c61696d6572206e6f7420616c6c6f77656420746f20636c616960448201527f6d206469766964656e64732c2063616e206f6e6c792072652d696e766573742e6064820152608401610e4c565b602480546040516352b5f81d60e01b81526001600160a01b0388811660048301819052938201939093529116906352b5f81d906044016020604051808303816000875af1158015612e3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e639190614245565b9150612efd565b8315612efd57602480546040516352b5f81d60e01b81526001600160a01b03888116600483015230938201939093529116906352b5f81d906044016020604051808303816000875af1158015612ec4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ee89190614245565b91508115612efd57612efa8286613a36565b90505b8115612faa57612f11602a80546001019055565b6000612f1c602a5490565b6000818152602f602090815260408083208781556001808201889055426002909201919091556001600160a01b038b1680855260308452828520805492830181558552938390200184905580518781529182018690528101919091529091507f67dd3d116bf53e0ddda53bb148a5fdc129854e1c507c0eeda9190049a9bbc84f9060600160405180910390a1505b5050505050565b6000612fbd828461430e565b9392505050565b6040805160028082526060820183526000924792849290916020830190803683370190505090503081600081518110612fff57612fff6142c0565b6001600160a01b03928316602091820292909201810191909152600754604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015613058573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061307c919061415f565b8160018151811061308f5761308f6142c0565b6001600160a01b0392831660209182029290920101526007546130b5913091168661247c565b60075460405163791ac94760e01b81526001600160a01b039091169063791ac947906130ee9087906000908690309042906004016143b7565b600060405180830381600087803b15801561310857600080fd5b505af115801561311c573d6000803e3d6000fd5b5050505060006131358347612fb190919063ffffffff16565b60408051878152602081018390529192507f4a6c12eb4e479a4ea28c8acad8efde466ef9bf69cf473501dd76865234496273910160405180910390a1949350505050565b6007546131919030906001600160a01b03168461247c565b6007546001600160a01b031663f305d7198230856000806131ba6005546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015613222573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061324791906143f3565b505060408051848152602081018490527fcb1652de9aeec38545fc281847b3dbfc89aab56dfa907b1ab68466f602c36fb49250015b60405180910390a15050565b6000612fbd8284614202565b6000612fbd828461427e565b6000612fbd82846142ac565b81156132f2576022546040516101009091046001600160a01b0316906108fc8415029084906000818181858888f193505050501580156132f0573d6000803e3d6000fd5b505b8015613334576023546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015613332573d6000803e3d6000fd5b505b60408051838152602081018390527f916ad8171ef8c567c7790377a142f0200f9565940680c06e30dd105cfd924968910161327c565b6001600160a01b0384166000908152601060205260408120548190819060ff16806133ad57506001600160a01b03861660009081526010602052604090205460ff165b6133f95760405162461bcd60e51b815260206004820152601b60248201527f4246463a204e6f206d61726b6574206d616b65727320666f756e6400000000006044820152606401610e4c565b6001600160a01b03871660009081526010602052604090205460ff161561363d576000806000600854431480156134335750600f5460ff16155b1561344157605a92506134b2565b60085461344f90600161427e565b431480156134605750600f5460ff16155b1561346e57603292506134b2565b6001600160a01b038716156134ac576134a561349c600a6122a7601b54601a5461329490919063ffffffff16565b60195490613294565b92506134b2565b60175492505b6134c160646122a78a86613288565b94506001600160a01b038716156135e2576134ec60646122a76019548b61328890919063ffffffff16565b94506135096103e86122a7601a548b61328890919063ffffffff16565b91506135266103e86122a7601b548b61328890919063ffffffff16565b905060006135348383613294565b905061354e82613548836113a58d8b612fb1565b90613294565b945061355b8b3088613782565b6135668b8985613782565b7f6b0b46d0273ce53f1de696d2100b35dd3a405dcecbcbeede66215d858d5c401d8b308860405161359993929190614221565b60405180910390a17f6b0b46d0273ce53f1de696d2100b35dd3a405dcecbcbeede66215d858d5c401d8b89856040516135d493929190614221565b60405180910390a150613635565b6135ec8886612fb1565b93506135f98a3087613782565b7f6b0b46d0273ce53f1de696d2100b35dd3a405dcecbcbeede66215d858d5c401d8a308760405161362c93929190614221565b60405180910390a15b505050613778565b60006008544314156136515750605a61369b565b60085461365f90600161427e565b43141561366e5750603261369b565b600061367a308861109a565b90508060185461368a919061427e565b9150601e821061369957601e91505b505b6136aa60646122a78884613288565b925060006136d260646122a76136cb60185486612fb190919063ffffffff16565b8a90613288565b6027549091506136e29082613294565b6027556136ef8785612fb1565b92506136fc893086613782565b600061370d6027546113a530611645565b9050601f548111156137225761372281613be8565b602854602754111561373957613739602754613cde565b7f4ab5e0df8ff1605133dbdd1b8e3f52edb9539abe64595f6f70b30d2fea7f204a8a308760405161376c93929190614221565b60405180910390a15050505b9695505050505050565b6001600160a01b0383166137e65760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610e4c565b6001600160a01b0382166138485760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610e4c565b6001600160a01b038316600090815260208190526040902054818110156138c05760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610e4c565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906138f790849061427e565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161394391815260200190565b60405180910390a3612302565b6001600160a01b03811660009081526011602052604090205460ff168061398f57506001600160a01b03811660009081526012602052604090205460ff165b156139975750565b6009546001600160a01b03828116911614156139b05750565b73a636249ba25ece6f11e5c1f5130da90a90c4178963cdb09f68602b836139d681611645565b6040516001600160e01b031960e086901b16815260048101939093526001600160a01b039091166024830152604482015260640160006040518083038186803b158015613a2257600080fd5b505af4158015612faa573d6000803e3d6000fd5b600080613a4230611645565b60408051600280825260608201835292935060009290916020830190803683375050600754604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015613ab1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ad5919061415f565b81600081518110613ae857613ae86142c0565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110613b1c57613b1c6142c0565b6001600160a01b03928316602091820292909201015260075460405163b6f9de9560e01b815291169063b6f9de95908790613b629060009086908a904290600401614421565b6000604051808303818588803b158015613b7b57600080fd5b505af1158015613b8f573d6000803e3d6000fd5b50505050506000613ba3836113a530611645565b60408051888152602081018390529192507f2d5c8efb676a77fc04b6b50a19f6ccbf08ee66df0202de33576485f1f77b4b69910160405180910390a195945050505050565b6000613c0460646122a7601c548561328890919063ffffffff16565b90506000613c138260026132a0565b90506000613c218483612fb1565b90506000613c2e82612fc4565b90506000613c4c60646122a7601c548561328890919063ffffffff16565b90506000613c6a60646122a7601d548661328890919063ffffffff16565b90506000613c8860646122a7601e548761328890919063ffffffff16565b90506000613c9c826113a585818989612fb1565b9050613ca88382613294565b9250613cb483836132ac565b600087118015613cc45750600084115b15613cd357613cd38785613179565b505050505050505050565b6000613ce982612fc4565b602754909150613cf99083612fb1565b602755602954600090613d0d908390613294565b6024546040519192506000916001600160a01b039091169083908381818185875af1925050503d8060008114613d5f576040519150601f19603f3d011682016040523d82523d6000602084013e613d64565b606091505b505090508015613da6576040518381527fb0cc2628d6d644cf6be9d8110e142297ac910d6d8026d795a99f272fd9ad60b19060200160405180910390a1612302565b602954613db39084613294565b60295550505050565b600060208284031215613dce57600080fd5b5035919050565b600060208083528351808285015260005b81811015613e0257858101830151858201604001528201613de6565b81811115613e14576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b0381168114613e3f57600080fd5b50565b600080600060608486031215613e5757600080fd5b833592506020840135613e6981613e2a565b929592945050506040919091013590565b60008060408385031215613e8d57600080fd5b8235613e9881613e2a565b946020939093013593505050565b8015158114613e3f57600080fd5b60008060408385031215613ec757600080fd5b8235613ed281613e2a565b91506020830135613ee281613ea6565b809150509250929050565b600080600060608486031215613f0257600080fd5b8335613f0d81613e2a565b92506020840135613e6981613e2a565b60008060408385031215613f3057600080fd5b8235613f3b81613e2a565b91506020830135613ee281613e2a565b600060208284031215613f5d57600080fd5b8135612fbd81613e2a565b60008060008060808587031215613f7e57600080fd5b5050823594602084013594506040840135936060013592509050565b803560ff81168114613fab57600080fd5b919050565b600060208284031215613fc257600080fd5b612fbd82613f9a565b600080600080600060a08688031215613fe357600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b6000806020838503121561401957600080fd5b823567ffffffffffffffff8082111561403157600080fd5b818501915085601f83011261404557600080fd5b81358181111561405457600080fd5b8660208260051b850101111561406957600080fd5b60209290920196919550909350505050565b60006020828403121561408d57600080fd5b8135612fbd81613ea6565b600080600080608085870312156140ae57600080fd5b6140b785613f9a565b966020860135965060408601359560600135945092505050565b6000806000606084860312156140e657600080fd5b83356140f181613e2a565b95602085013595506040909401359392505050565b602080825282518282018190526000919060409081850190868401855b828110156141525781518051855286810151878601528501518585015260609093019290850190600101614123565b5091979650505050505050565b60006020828403121561417157600080fd5b8151612fbd81613e2a565b600181811c9082168061419057607f821691505b602082108114156141b157634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561421c5761421c6141ec565b500290565b6001600160a01b039384168152919092166020820152604081019190915260600190565b60006020828403121561425757600080fd5b5051919050565b600060ff821660ff811415614275576142756141ec565b60010192915050565b60008219821115614291576142916141ec565b500190565b634e487b7160e01b600052601260045260246000fd5b6000826142bb576142bb614296565b500490565b634e487b7160e01b600052603260045260246000fd5b60006000198214156142ea576142ea6141ec565b5060010190565b60006020828403121561430357600080fd5b8151612fbd81613ea6565b600082821015614320576143206141ec565b500390565b60008261433457614334614296565b500690565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561436257600080fd5b505080516020909101519092909150565b600081518084526020808501945080840160005b838110156143ac5781516001600160a01b031687529582019590820190600101614387565b509495945050505050565b85815284602082015260a0604082015260006143d660a0830186614373565b6001600160a01b0394909416606083015250608001529392505050565b60008060006060848603121561440857600080fd5b8351925060208401519150604084015190509250925092565b84815260806020820152600061443a6080830186614373565b6001600160a01b0394909416604083015250606001529291505056fea26469706673582212209a24f9b569365c3fe6c738299975d9f4b8a24d568443cc753184fe5b0022622264736f6c634300080b0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000005a377aecf9b9deaf61ab116fe14ed56a3f4b4a7e00000000000000000000000058782fc478221bfb381ce8d61560eb0f9f8402a8

-----Decoded View---------------
Arg [0] : _devWalletAddress (address): 0x5a377AECF9b9DEAF61aB116FE14ED56A3F4b4A7e
Arg [1] : _marketingWalletAddress (address): 0x58782fC478221BfB381ce8d61560eB0f9f8402a8

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000005a377aecf9b9deaf61ab116fe14ed56a3f4b4a7e
Arg [1] : 00000000000000000000000058782fc478221bfb381ce8d61560eb0f9f8402a8


Libraries Used

UniswapV2PriceImpactCalculator : 0x89e3e1fee6b040e095965189094419d41184d9e9Unverified

Deployed Bytecode Sourcemap

32624:27402:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40428:171;;;;;;;;;;-1:-1:-1;40428:171:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;363:32:1;;;345:51;;333:2;318:18;40428:171:0;;;;;;;;1810:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;38295:441::-;;;;;;;;;;-1:-1:-1;38295:441:0;;;;;:::i;:::-;;:::i;:::-;;2883:242;;;;;;;;;;-1:-1:-1;2883:242:0;;;;;:::i;:::-;;:::i;:::-;;;2018:14:1;;2011:22;1993:41;;1981:2;1966:18;2883:242:0;1853:187:1;50113:126:0;;;;;;;;;;-1:-1:-1;50113:126:0;;;;;:::i;:::-;;:::i;48099:140::-;;;;;;;;;;-1:-1:-1;48099:140:0;;;;;:::i;:::-;;:::i;2131:108::-;;;;;;;;;;-1:-1:-1;2219:12:0;;2131:108;;;2701:25:1;;;2689:2;2674:18;2131:108:0;2555:177:1;40607:185:0;;;;;;;;;;-1:-1:-1;40607:185:0;;;;;:::i;:::-;;:::i;50247:122::-;;;;;;;;;;-1:-1:-1;50247:122:0;;;;;:::i;:::-;;:::i;3133:295::-;;;;;;;;;;-1:-1:-1;3133:295:0;;;;;:::i;:::-;;:::i;40800:313::-;;;;;;;;;;-1:-1:-1;40800:313:0;;;;;:::i;:::-;;:::i;34704:41::-;;;;;;;;;;-1:-1:-1;34704:41:0;;;;-1:-1:-1;;;;;34704:41:0;;;42254:615;;;;;;;;;;-1:-1:-1;42254:615:0;;;;;:::i;:::-;;:::i;42877:141::-;;;;;;;;;;;;;:::i;45497:100::-;;;;;;;;;;-1:-1:-1;32920:2:0;45497:100;;;4006:4:1;3994:17;;;3976:36;;3964:2;3949:18;45497:100:0;3834:184:1;33631:43:0;;;;;;;;;;-1:-1:-1;33631:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;3436:272;;;;;;;;;;-1:-1:-1;3436:272:0;;;;;:::i;:::-;;:::i;33736:37::-;;;;;;;;;;-1:-1:-1;33736:37:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;34002:33;;;;;;;;;;;;;;;;39917:339;;;;;;;;;;-1:-1:-1;39917:339:0;;;;;:::i;:::-;;:::i;43401:79::-;;;;;;;;;;;;;:::i;58402:305::-;;;;;;;;;;-1:-1:-1;58402:305:0;;;;;:::i;:::-;;:::i;41447:200::-;;;;;;;;;;;;;:::i;34814:47::-;;;;;;;;;;-1:-1:-1;34814:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;33925:30;;;;;;;;;;;;;;;;49439:230;;;;;;;;;;-1:-1:-1;49439:230:0;;;;;:::i;:::-;;:::i;50696:118::-;;;;;;;;;;-1:-1:-1;50696:118:0;;;;;:::i;:::-;;:::i;49683:422::-;;;;;;;;;;-1:-1:-1;49683:422:0;;;;;:::i;:::-;;:::i;44925:142::-;;;;;;;;;;;;;:::i;43220:173::-;;;;;;;;;;-1:-1:-1;43220:173:0;;;;;:::i;:::-;;:::i;34577:32::-;;;;;;;;;;-1:-1:-1;34577:32:0;;;;;;;;51154:214;;;;;;;;;;-1:-1:-1;51154:214:0;;;;;:::i;:::-;;:::i;2247:177::-;;;;;;;;;;-1:-1:-1;2247:177:0;;;;;:::i;:::-;;:::i;10894:148::-;;;;;;;;;;;;;:::i;48247:158::-;;;;;;;;;;-1:-1:-1;48247:158:0;;;;;:::i;:::-;;:::i;34870:37::-;;;;;;;;;;;;;;;;33681:48;;;;;;;;;;-1:-1:-1;33681:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;48797:326;;;;;;;;;;-1:-1:-1;48797:326:0;;;;;:::i;:::-;;:::i;34270:53::-;;;;;;;;;;;;;;;;10682:79;;;;;;;;;;-1:-1:-1;10747:6:0;;-1:-1:-1;;;;;10747:6:0;10682:79;;33576:48;;;;;;;;;;-1:-1:-1;33576:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;34441:54;;;;;;;;;;-1:-1:-1;34441:54:0;;;;;:::i;:::-;;;;;;;;;;;;;;40268:152;;;;;;;;;;-1:-1:-1;40268:152:0;;;;;:::i;:::-;;:::i;1918:104::-;;;;;;;;;;;;;:::i;3716:507::-;;;;;;;;;;-1:-1:-1;3716:507:0;;;;;:::i;:::-;;:::i;43026:186::-;;;;;;;;;;-1:-1:-1;43026:186:0;;;;;:::i;:::-;;:::i;2432:234::-;;;;;;;;;;-1:-1:-1;2432:234:0;;;;;:::i;:::-;;:::i;33849:30::-;;;;;;;;;;;;;;;;34080:33;;;;;;;;;;;;;;;;48413:160;;;;;;;;;;-1:-1:-1;48413:160:0;;;;;:::i;:::-;;:::i;59848:132::-;;;;;;;;;;-1:-1:-1;59848:132:0;;;;;:::i;:::-;-1:-1:-1;;;;;59941:24:0;59914:7;59941:24;;;:14;:24;;;;;:31;;59848:132;50822:324;;;;;;;;;;-1:-1:-1;50822:324:0;;;;;:::i;:::-;;:::i;34502:68::-;;;;;;;;;;-1:-1:-1;34502:68:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6294:25:1;;;6350:2;6335:18;;6328:34;;;;6378:18;;;6371:34;6282:2;6267:18;34502:68:0;6092:319:1;58715:149:0;;;;;;;;;;;;;:::i;33888:30::-;;;;;;;;;;;;;;;;38744:1057;;;;;;;;;;;;;:::i;33780:60::-;;;;;;;;;;-1:-1:-1;33780:60:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;49131:300;;;;;;;;;;-1:-1:-1;49131:300:0;;;;;:::i;:::-;;:::i;34976:31::-;;;;;;;;;;;;;;;;2674:201;;;;;;;;;;-1:-1:-1;2674:201:0;;;;;:::i;:::-;-1:-1:-1;;;;;2840:18:0;;;2808:7;2840:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;2674:201;34914:53;;;;;;;;;;;;;;;;39809:100;;;;;;;;;;-1:-1:-1;39809:100:0;;;;;:::i;:::-;;:::i;48581:208::-;;;;;;;;;;-1:-1:-1;48581:208:0;;;;;:::i;:::-;;:::i;50377:311::-;;;;;;;;;;-1:-1:-1;50377:311:0;;;;;:::i;:::-;;:::i;58872:968::-;;;;;;;;;;-1:-1:-1;58872:968:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;41655:591::-;;;;;;;;;;;;;:::i;38021:266::-;;;;;;;;;;;;;:::i;33962:33::-;;;;;;;;;;;;;;;;45075:414;;;;;;;;;;-1:-1:-1;45075:414:0;;;;;:::i;:::-;;:::i;43488:81::-;;;;;;;;;;;;;:::i;40428:171::-;40557:34;;-1:-1:-1;;;40557:34:0;;:8;:34;;;8501:25:1;8542:18;;;8535:34;;;40503:23:0;;40557:20;;;;8474:18:1;;40557:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40539:52;40428:171;-1:-1:-1;;40428:171:0:o;1810:100::-;1864:13;1897:5;1890:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1810:100;:::o;38295:441::-;10809:6;;-1:-1:-1;;;;;10809:6:0;10819:10;10809:20;10801:65;;;;-1:-1:-1;;;10801:65:0;;;;;;;:::i;:::-;;;;;;;;;38447:11:::1;::::0;-1:-1:-1;;;38447:11:0;::::1;;;38446:12;38438:85;;;::::0;-1:-1:-1;;;38438:85:0;;9784:2:1;38438:85:0::1;::::0;::::1;9766:21:1::0;9823:2;9803:18;;;9796:30;9862:34;9842:18;;;9835:62;9933:30;9913:18;;;9906:58;9981:19;;38438:85:0::1;9582:424:1::0;38438:85:0::1;38534:17;:38:::0;;;38583:19:::1;:50:::0;;-1:-1:-1;;;;;;38583:50:0::1;-1:-1:-1::0;;;;;38583:50:0;::::1;;::::0;;38667:30:::1;:21:::0;38691:6:::1;38667:30;:::i;:::-;38644:20;:53:::0;-1:-1:-1;;38708:13:0::1;:20:::0;;-1:-1:-1;;38708:20:0::1;38724:4;38708:20;::::0;;-1:-1:-1;38295:441:0:o;2883:242::-;3002:4;1270:10;3063:32;1270:10;3079:7;3088:6;3063:8;:32::i;:::-;-1:-1:-1;3113:4:0;;2883:242;-1:-1:-1;;;2883:242:0:o;50113:126::-;10809:6;;-1:-1:-1;;;;;10809:6:0;10819:10;10809:20;10801:65;;;;-1:-1:-1;;;10801:65:0;;;;;;;:::i;:::-;50196:23:::1;:35:::0;50113:126::o;48099:140::-;10809:6;;-1:-1:-1;;;;;10809:6:0;10819:10;10809:20;10801:65;;;;-1:-1:-1;;;10801:65:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;48196:21:0;;;::::1;;::::0;;;:11:::1;:21;::::0;;;;:35;;-1:-1:-1;;48196:35:0::1;::::0;::::1;;::::0;;;::::1;::::0;;48099:140::o;40607:185::-;40740:44;;-1:-1:-1;;;40740:44:0;;:8;:44;;;8501:25:1;8542:18;;;8535:34;;;40686:23:0;;40740:35;;;;8474:18:1;;40740:44:0;8296:279:1;50247:122:0;10809:6;;-1:-1:-1;;;;;10809:6:0;10819:10;10809:20;10801:65;;;;-1:-1:-1;;;10801:65:0;;;;;;;:::i;:::-;50328:21:::1;:33:::0;50247:122::o;3133:295::-;3264:4;1270:10;3322:38;3338:4;1270:10;3353:6;3322:15;:38::i;:::-;3371:27;3381:4;3387:2;3391:6;3371:9;:27::i;:::-;-1:-1:-1;3416:4:0;;3133:295;-1:-1:-1;;;;3133:295:0:o;40800:313::-;40877:4;-1:-1:-1;;;;;40897:22:0;;40894:66;;-1:-1:-1;40943:5:0;40936:12;;40894:66;40993:8;:38;;41051:19;41061:8;41051:9;:19::i;:::-;:35;;:54;;;;;41102:3;-1:-1:-1;;;;;41090:15:0;:8;-1:-1:-1;;;;;41090:15:0;;;41051:54;41044:61;40800:313;-1:-1:-1;;;;40800:313:0:o;42254:615::-;42366:11;;42482:13;;42412:93;;-1:-1:-1;;;42412:93:0;;42332:7;;42366:11;42332:7;;42412:30;;:55;;:93;;42476:3;;-1:-1:-1;;;;;42482:13:0;;;;42497:7;;42412:93;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42390:115;-1:-1:-1;42532:1:0;42518:323;42540:19;;;;;;42535:24;;;;42518:323;;42619:24;;;;;;;:21;:24;;;;;:29;42604:44;;;;;:111;;-1:-1:-1;42688:24:0;;;;;;;:21;:24;;;;;:27;;;42673:42;;;42604:111;42581:249;;;42757:24;;;;;;:21;:24;;;;;:28;;;;-1:-1:-1;42804:10:0;;-1:-1:-1;;42804:10:0;42581:249;42561:3;;;;:::i;:::-;;;;42518:323;;;-1:-1:-1;42858:3:0;;42254:615;-1:-1:-1;;;;42254:615:0:o;42877:141::-;42967:15;;:43;;;-1:-1:-1;;;42967:43:0;;;;42940:7;;-1:-1:-1;;;;;42967:15:0;;:41;;:43;;;;;;;;;;;;;;:15;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42960:50;;42877:141;:::o;3436:272::-;1270:10;3551:4;3637:18;;;:11;:18;;;;;;;;-1:-1:-1;;;;;3637:27:0;;;;;;;;;;3551:4;;1270:10;3612:66;;1270:10;;3637:27;;:40;;3667:10;;3637:40;:::i;:::-;3612:8;:66::i;39917:339::-;10809:6;;-1:-1:-1;;;;;10809:6:0;10819:10;10809:20;10801:65;;;;-1:-1:-1;;;10801:65:0;;;;;;;:::i;:::-;40065:14:::1;:32:::0;;;40108:13:::1;:30:::0;;;40149:13:::1;:30:::0;;;40190:58:::1;::::0;-1:-1:-1;;;40190:58:0;;:8:::1;:58;::::0;::::1;8501:25:1::0;8542:18;;;8535:34;;;40190:44:0::1;::::0;::::1;::::0;8474:18:1;;40190:58:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;39917:339:::0;;;;:::o;43401:79::-;43438:34;43453:10;43466:5;43438:6;:34::i;:::-;43401:79::o;58402:305::-;-1:-1:-1;;;;;58521:26:0;;58465:7;58521:26;;;:16;:26;;;;;;58465:7;;58521:26;;;:41;;-1:-1:-1;58551:11:0;;-1:-1:-1;;;58551:11:0;;;;58521:41;58518:148;;;-1:-1:-1;58596:7:0;58518:148;;;-1:-1:-1;58653:1:0;58685:14;58402:305;-1:-1:-1;;58402:305:0:o;41447:200::-;10809:6;;-1:-1:-1;;;;;10809:6:0;10819:10;10809:20;10801:65;;;;-1:-1:-1;;;10801:65:0;;;;;;;:::i;:::-;41499:19:::1;41521:76;41564:22;;41521:24;41539:4;41521:9;:24::i;:::-;:28:::0;::::1;:76::i;:::-;41499:98;;41610:29;41627:11;41610:16;:29::i;:::-;;41488:159;41447:200::o:0;49439:230::-;10809:6;;-1:-1:-1;;;;;10809:6:0;10819:10;10809:20;10801:65;;;;-1:-1:-1;;;10801:65:0;;;;;;;:::i;:::-;49564:4:::1;49558;49538:13;2219:12:::0;;;2131:108;49538:13:::1;:17;::::0;49554:1:::1;49538:17;:::i;:::-;:24;;;;:::i;:::-;49537:31;;;;:::i;:::-;49521:12;:47;;49513:96;;;::::0;-1:-1:-1;;;49513:96:0;;11665:2:1;49513:96:0::1;::::0;::::1;11647:21:1::0;11704:2;11684:18;;;11677:30;11743:34;11723:18;;;11716:62;-1:-1:-1;;;11794:18:1;;;11787:34;11838:19;;49513:96:0::1;11463:400:1::0;49513:96:0::1;49638:23;:12:::0;49654:6:::1;49638:23;:::i;:::-;49620:15;:41:::0;-1:-1:-1;49439:230:0:o;50696:118::-;10809:6;;-1:-1:-1;;;;;10809:6:0;10819:10;10809:20;10801:65;;;;-1:-1:-1;;;10801:65:0;;;;;;;:::i;:::-;50775:19:::1;:31:::0;;-1:-1:-1;;50775:31:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;50696:118::o;49683:422::-;10809:6;;-1:-1:-1;;;;;10809:6:0;10819:10;10809:20;10801:65;;;;-1:-1:-1;;;10801:65:0;;;;;;;:::i;:::-;49906:2:::1;49891:11;:17;;:38;;;;;49927:2;49912:11;;:17;;49891:38;49883:47;;;::::0;::::1;;49943:10;:24:::0;;;;49978:11:::1;:26:::0;;;;50015:6:::1;:16:::0;50042:6:::1;:16:::0;50069:12:::1;:28:::0;49683:422::o;44925:142::-;45018:15;;:41;;;-1:-1:-1;;;45018:41:0;;;;44991:7;;-1:-1:-1;;;;;45018:15:0;;:39;;:41;;;;;;;;;;;;;;:15;:41;;;;;;;;;;;;;;43220:173;43350:15;;;:35;;-1:-1:-1;;;43350:35:0;;-1:-1:-1;;;;;363:32:1;;;43350:35:0;;;345:51:1;43318:7:0;;43350:15;;;:25;;318:18:1;43350:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;51154:214::-;10809:6;;-1:-1:-1;;;;;10809:6:0;10819:10;10809:20;10801:65;;;;-1:-1:-1;;;10801:65:0;;;;;;;:::i;:::-;51279:16:::1;:29:::0;;-1:-1:-1;;;;;;51279:29:0::1;;-1:-1:-1::0;;;;;51279:29:0;;::::1;;;::::0;;51319:22:::1;:41:::0;;-1:-1:-1;;;;;;51319:41:0::1;::::0;;;::::1;;::::0;;51154:214::o;2247:177::-;-1:-1:-1;;;;;2398:18:0;2366:7;2398:18;;;;;;;;;;;;2247:177::o;10894:148::-;10809:6;;-1:-1:-1;;;;;10809:6:0;10819:10;10809:20;10801:65;;;;-1:-1:-1;;;10801:65:0;;;;;;;:::i;:::-;10985:6:::1;::::0;10964:40:::1;::::0;11001:1:::1;::::0;-1:-1:-1;;;;;10985:6:0::1;::::0;10964:40:::1;::::0;11001:1;;10964:40:::1;11015:6;:19:::0;;-1:-1:-1;;;;;;11015:19:0::1;::::0;;10894:148::o;48247:158::-;10809:6;;-1:-1:-1;;;;;10809:6:0;10819:10;10809:20;10801:65;;;;-1:-1:-1;;;10801:65:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;48352:26:0;;;::::1;;::::0;;;:16:::1;:26;::::0;;;;:45;;-1:-1:-1;;48352:45:0::1;::::0;::::1;;::::0;;;::::1;::::0;;48247:158::o;48797:326::-;10809:6;;-1:-1:-1;;;;;10809:6:0;10819:10;10809:20;10801:65;;;;-1:-1:-1;;;10801:65:0;;;;;;;:::i;:::-;48919:22:::1;48915:201;;;48958:15;::::0;;:46:::1;::::0;-1:-1:-1;;;48958:46:0;;-1:-1:-1;;;;;363:32:1;;;48958:46:0::1;::::0;::::1;345:51:1::0;48958:15:0;;::::1;::::0;:36:::1;::::0;318:18:1;48958:46:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;41610:29;41488:159;41447:200::o:0;48915:201::-:1;49037:15;::::0;-1:-1:-1;;;;;49037:15:0::1;:36;49074:8:::0;49084:19:::1;49074:8:::0;49084:9:::1;:19::i;:::-;49037:67;::::0;-1:-1:-1;;;;;;49037:67:0::1;::::0;;;;;;-1:-1:-1;;;;;12060:32:1;;;49037:67:0::1;::::0;::::1;12042:51:1::0;12109:18;;;12102:34;12015:18;;49037:67:0::1;11868:274:1::0;40268:152:0;40379:33;;-1:-1:-1;;;40379:33:0;;:8;:33;;;12352:25:1;-1:-1:-1;;;;;12413:32:1;;12393:18;;;12386:60;40331:20:0;;40379:24;;;;12325:18:1;;40379:33:0;;;;;;;;;;;;;;;;;;;;;;1918:104;1974:13;2007:7;2000:14;;;;;:::i;3716:507::-;1270:10;3836:4;3924:18;;;:11;:18;;;;;;;;-1:-1:-1;;;;;3924:27:0;;;;;;;;;;3836:4;;1270:10;3984:35;;;;3962:122;;;;-1:-1:-1;;;3962:122:0;;12659:2:1;3962:122:0;;;12641:21:1;12698:2;12678:18;;;12671:30;12737:34;12717:18;;;12710:62;-1:-1:-1;;;12788:18:1;;;12781:35;12833:19;;3962:122:0;12457:401:1;3962:122:0;4120:60;4129:5;4136:7;4164:15;4145:16;:34;4120:8;:60::i;43026:186::-;43156:15;;;:48;;-1:-1:-1;;;43156:48:0;;-1:-1:-1;;;;;363:32:1;;;43156:48:0;;;345:51:1;43124:7:0;;43156:15;;;:38;;318:18:1;43156:48:0;199:203:1;2432:234:0;2547:4;1270:10;2608:28;1270:10;2625:2;2629:6;2608:9;:28::i;48413:160::-;10809:6;;-1:-1:-1;;;;;10809:6:0;10819:10;10809:20;10801:65;;;;-1:-1:-1;;;10801:65:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;48520:26:0;;;::::1;;::::0;;;:16:::1;:26;::::0;;;;:45;;-1:-1:-1;;48520:45:0::1;::::0;::::1;;::::0;;;::::1;::::0;;48413:160::o;50822:324::-;10809:6;;-1:-1:-1;;;;;10809:6:0;10819:10;10809:20;10801:65;;;;-1:-1:-1;;;10801:65:0;;;;;;;:::i;:::-;50898:9:::1;50893:246;50913:16:::0;;::::1;50893:246;;;50985:13;::::0;-1:-1:-1;;;;;50985:13:0::1;50973:5:::0;;50979:1;50973:8;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;50973:25:0::1;;;:82;;;;-1:-1:-1::0;51039:15:0::1;::::0;-1:-1:-1;;;;;51039:15:0::1;51019:5:::0;;51025:1;51019:8;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;51019:36:0::1;;;50973:82;50951:177;;;51108:4;51090:5;:15;51096:5;;51102:1;51096:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;51090:15:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;51090:15:0;:22;;-1:-1:-1;;51090:22:0::1;::::0;::::1;;::::0;;;::::1;::::0;;50951:177:::1;50931:3:::0;::::1;::::0;::::1;:::i;:::-;;;;50893:246;;;;50822:324:::0;;:::o;58715:149::-;58777:7;58804:52;58833:22;;58804:24;58822:4;58804:9;:24::i;38744:1057::-;10809:6;;-1:-1:-1;;;;;10809:6:0;10819:10;10809:20;10801:65;;;;-1:-1:-1;;;10801:65:0;;;;;;;:::i;:::-;38829:11:::1;::::0;-1:-1:-1;;;38829:11:0;::::1;;;38828:12;38820:53;;;::::0;-1:-1:-1;;;38820:53:0;;13337:2:1;38820:53:0::1;::::0;::::1;13319:21:1::0;13376:2;13356:18;;;13349:30;13415;13395:18;;;13388:58;13463:18;;38820:53:0::1;13135:352:1::0;38820:53:0::1;38928:15;;;;;;;;;-1:-1:-1::0;;;;;38928:15:0::1;-1:-1:-1::0;;;;;38928:23:0::1;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;38910:55:0::1;;38992:4;39016:15;;;;;;;;;-1:-1:-1::0;;;;;39016:15:0::1;-1:-1:-1::0;;;;;39016:20:0::1;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38910:143;::::0;-1:-1:-1;;;;;;38910:143:0::1;::::0;;;;;;-1:-1:-1;;;;;13722:15:1;;;38910:143:0::1;::::0;::::1;13704:34:1::0;13774:15;;13754:18;;;13747:43;13639:18;;38910:143:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38894:13;:159:::0;;-1:-1:-1;;;;;;38894:159:0::1;-1:-1:-1::0;;;;;38894:159:0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;39064:52:0;;;:28:::1;:52;::::0;;;;;;;:59;;-1:-1:-1;;39064:59:0;;::::1;-1:-1:-1::0;39064:59:0;;::::1;::::0;;;39162:13;;;::::1;39136:40:::0;;:25:::1;:40:::0;;;;;;;:47;;;;::::1;::::0;;::::1;::::0;;39194:15:::1;::::0;;39231:13;;39194:51;;-1:-1:-1;;;39194:51:0;;39231:13;;::::1;39194:51;::::0;::::1;345::1::0;39194:15:0;;;::::1;::::0;:36:::1;::::0;318:18:1;39194:51:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;39258:61;39271:24;39289:4;39271:9;:24::i;:::-;39297:21;39258:12;:61::i;:::-;39337:13;::::0;39382:15:::1;::::0;39330:111:::1;::::0;-1:-1:-1;;;39330:111:0;;-1:-1:-1;;;;;39382:15:0;;::::1;39330:111;::::0;::::1;12042:51:1::0;-1:-1:-1;;12109:18:1;;;12102:34;39337:13:0;::::1;::::0;39330:29:::1;::::0;12015:18:1;;39330:111:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;39454:11:0::1;:18:::0;;-1:-1:-1;;;;39454:18:0::1;-1:-1:-1::0;;;39454:18:0::1;::::0;;39487:13:::1;::::0;39454:18:::1;39487:13;39483:274;;;39565:15;39597:16;:30:::0;;;39698:17:::1;::::0;39664:81:::1;::::0;39698:32:::1;::::0;39720:9:::1;39698:21;:32::i;:::-;39664:11:::0;;:15:::1;:81::i;:::-;39642:19;:103:::0;-1:-1:-1;39483:274:0::1;39781:12;39767:11;:26:::0;38744:1057::o;49131:300::-;10809:6;;-1:-1:-1;;;;;10809:6:0;10819:10;10809:20;10801:65;;;;-1:-1:-1;;;10801:65:0;;;;;;;:::i;:::-;49255:9:::1;49250:174;49270:41:::0;;::::1;49250:174;;;49337:15;::::0;-1:-1:-1;;;;;49337:15:0::1;:36;49374:30:::0;;49405:1;49374:33;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;49337:71;::::0;-1:-1:-1;;;;;;49337:71:0::1;::::0;;;;;;-1:-1:-1;;;;;363:32:1;;;49337:71:0::1;::::0;::::1;345:51:1::0;318:18;;49337:71:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;49313:3;;;;;:::i;:::-;;;;49250:174;;39809:100:::0;10809:6;;-1:-1:-1;;;;;10809:6:0;10819:10;10809:20;10801:65;;;;-1:-1:-1;;;10801:65:0;;;;;;;:::i;:::-;39876:11:::1;:25:::0;;;::::1;;-1:-1:-1::0;;;39876:25:0::1;-1:-1:-1::0;;;;39876:25:0;;::::1;::::0;;;::::1;::::0;;39809:100::o;48581:208::-;10809:6;;-1:-1:-1;;;;;10809:6:0;10819:10;10809:20;10801:65;;;;-1:-1:-1;;;10801:65:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;48712:38:0;;;::::1;;::::0;;;:28:::1;:38;::::0;;;;:69;;-1:-1:-1;;48712:69:0::1;::::0;::::1;;::::0;;;::::1;::::0;;48581:208::o;50377:311::-;10809:6;;-1:-1:-1;;;;;10809:6:0;10819:10;10809:20;10801:65;;;;-1:-1:-1;;;10801:65:0;;;;;;;:::i;:::-;50538:29:::1;::::0;;::::1;;::::0;;;:21:::1;:29;::::0;;;;:42;;;50591:32:::1;::::0;::::1;:38:::0;50640:33:::1;;:40:::0;50377:311::o;58872:968::-;59004:19;59053:1;59044:6;:10;:29;;;;;59072:1;59058:11;:15;59044:29;59036:64;;;;-1:-1:-1;;;59036:64:0;;14253:2:1;59036:64:0;;;14235:21:1;14292:2;14272:18;;;14265:30;-1:-1:-1;;;14311:18:1;;;14304:52;14373:18;;59036:64:0;14051:346:1;59036:64:0;-1:-1:-1;;;;;59138:24:0;;59111;59138;;;:14;:24;;;;;:31;;59194:20;59208:6;59194:11;:20;:::i;:::-;59180:34;-1:-1:-1;59225:13:0;59241:12;59247:6;59180:34;59241:12;:::i;:::-;59225:28;;59280:16;59272:5;:24;59264:54;;;;-1:-1:-1;;;59264:54:0;;14734:2:1;59264:54:0;;;14716:21:1;14773:2;14753:18;;;14746:30;-1:-1:-1;;;14792:18:1;;;14785:47;14849:18;;59264:54:0;14532:341:1;59264:54:0;59345:6;59366:22;;;59362:125;;;59411:16;;-1:-1:-1;59450:25:0;59469:6;59411:16;59450:25;:::i;:::-;59442:33;;59362:125;59499:32;59551:5;59534:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;59534:23:0;;;;;;;;;;;;;;;;-1:-1:-1;59499:58:0;-1:-1:-1;59568:20:0;59620:5;59603:200;59631:3;59627:1;:7;59603:200;;;-1:-1:-1;;;;;59670:24:0;;59656:11;59670:24;;;:14;:24;;;;;:27;;59695:1;;59670:27;;;;;;:::i;:::-;;;;;;;;;59656:41;;59741:13;:18;59755:3;59741:18;;;;;;;;;;;59712:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:12;59725;59712:26;;;;;;;;:::i;:::-;;;;;;;;;;:47;59774:17;59790:1;59774:17;;:::i;:::-;;;59641:162;59636:3;;;;;:::i;:::-;;;;59603:200;;;-1:-1:-1;59820:12:0;;58872:968;-1:-1:-1;;;;;;;;;58872:968:0:o;41655:591::-;10809:6;;-1:-1:-1;;;;;10809:6:0;10819:10;10809:20;10801:65;;;;-1:-1:-1;;;10801:65:0;;;;;;;:::i;:::-;41707:16:::1;41726:43;41752:16;;41726:21;:25;;:43;;;;:::i;:::-;41707:62;;41782:21;41806:74;41845:24;41862:6;;41853:3;41845:16;;:24;;;;:::i;:::-;41819:6;::::0;41806:20:::1;::::0;:8;;:12:::1;:20::i;:::-;:24:::0;::::1;:74::i;:::-;41782:98;;41891:27;41921:80;41966:24;41983:6;;41974:3;41966:16;;:24;;;;:::i;:::-;41934:12;::::0;41921:26:::1;::::0;:8;;:12:::1;:26::i;:80::-;41891:110:::0;-1:-1:-1;42012:27:0::1;42042:66;41891:110:::0;42042:27:::1;:8:::0;42055:13;42042:12:::1;:27::i;:66::-;42012:96:::0;-1:-1:-1;42135:38:0::1;:13:::0;42012:96;42135:17:::1;:38::i;:::-;42119:54;;42186:52;42203:13;42218:19;42186:16;:52::i;:::-;41696:550;;;;41655:591::o:0;38021:266::-;10809:6;;-1:-1:-1;;;;;10809:6:0;10819:10;10809:20;10801:65;;;;-1:-1:-1;;;10801:65:0;;;;;;;:::i;:::-;38088:11:::1;::::0;-1:-1:-1;;;38088:11:0;::::1;;;38087:12;38079:68;;;::::0;-1:-1:-1;;;38079:68:0;;15329:2:1;38079:68:0::1;::::0;::::1;15311:21:1::0;15368:2;15348:18;;;15341:30;15407:34;15387:18;;;15380:62;-1:-1:-1;;;15458:18:1;;;15451:41;15509:19;;38079:68:0::1;15127:407:1::0;38079:68:0::1;38195:84;::::0;38158:12:::1;::::0;38203:10:::1;::::0;38228:21:::1;::::0;38158:12;38195:84;38158:12;38195:84;38228:21;38203:10;38195:84:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45075:414:::0;45349:15;;;:50;;-1:-1:-1;;;45349:50:0;;-1:-1:-1;;;;;363:32:1;;;45349:50:0;;;345:51:1;45175:29:0;;;;;;45349:15;;;:40;;318:18:1;45349:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45303:96;;-1:-1:-1;45303:96:0;-1:-1:-1;45303:96:0;;45461:19;45471:8;45461:9;:19::i;:::-;45410:71;;;;;;45075:414;;;;;:::o;43488:81::-;43528:33;43543:10;43556:4;43528:6;:33::i;5953:380::-;-1:-1:-1;;;;;6089:19:0;;6081:68;;;;-1:-1:-1;;;6081:68:0;;16201:2:1;6081:68:0;;;16183:21:1;16240:2;16220:18;;;16213:30;16279:34;16259:18;;;16252:62;-1:-1:-1;;;16330:18:1;;;16323:34;16374:19;;6081:68:0;15999:400:1;6081:68:0;-1:-1:-1;;;;;6168:21:0;;6160:68;;;;-1:-1:-1;;;6160:68:0;;16606:2:1;6160:68:0;;;16588:21:1;16645:2;16625:18;;;16618:30;16684:34;16664:18;;;16657:62;-1:-1:-1;;;16735:18:1;;;16728:32;16777:19;;6160:68:0;16404:398:1;6160:68:0;-1:-1:-1;;;;;6241:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;6293:32;;2701:25:1;;;6293:32:0;;2674:18:1;6293:32:0;;;;;;;5953:380;;;:::o;6341:502::-;-1:-1:-1;;;;;2840:18:0;;;6476:24;2840:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;-1:-1:-1;;6543:37:0;;6539:297;;6643:6;6623:16;:26;;6597:117;;;;-1:-1:-1;;;6597:117:0;;17009:2:1;6597:117:0;;;16991:21:1;17048:2;17028:18;;;17021:30;17087:31;17067:18;;;17060:59;17136:18;;6597:117:0;16807:353:1;6597:117:0;6758:51;6767:5;6774:7;6802:6;6783:16;:25;6758:8;:51::i;45605:2086::-;-1:-1:-1;;;;;45749:12:0;;;;;;:5;:12;;;;;;;;45748:13;:28;;;;-1:-1:-1;;;;;;45766:10:0;;;;;;:5;:10;;;;;;;;45765:11;45748:28;45740:37;;;;;;-1:-1:-1;;;;;45797:18:0;;;;;;:11;:18;;;;;;;;45796:19;:40;;;;-1:-1:-1;;;;;;45820:16:0;;;;;;:11;:16;;;;;;;;45819:17;45796:40;45788:49;;;;;;45911:11;;45875:7;;-1:-1:-1;;;45911:11:0;;;;:113;;;;-1:-1:-1;;;;;;45940:32:0;;;;;;:25;:32;;;;;;;;;:83;;-1:-1:-1;;;;;;45993:30:0;;;;;;:25;:30;;;;;;;;45940:83;45911:154;;;;-1:-1:-1;;;;;;46042:23:0;;;;;;:16;:23;;;;;;;;46041:24;45911:154;:193;;;;-1:-1:-1;;;;;;46083:21:0;;;;;;:16;:21;;;;;;;;46082:22;45911:193;45893:952;;;46135:13;;;;:69;;;;;46189:15;46169:16;;:35;;46135:69;:127;;;;;46247:15;46225:19;;:37;46135:127;46131:356;;;46365:20;;46327:19;;:34;;-1:-1:-1;;;46327:34:0;;-1:-1:-1;;;;;363:32:1;;;46327:34:0;;;345:51:1;46327:19:0;;;;:29;;318:18:1;;46327:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:58;;46297:174;;;;-1:-1:-1;;;46297:174:0;;17367:2:1;46297:174:0;;;17349:21:1;17406:2;17386:18;;;17379:30;17445:34;17425:18;;;17418:62;-1:-1:-1;;;17496:18:1;;;17489:40;17546:19;;46297:174:0;17165:406:1;46297:174:0;46548:44;;-1:-1:-1;;;46548:44:0;;:8;:44;;;8501:25:1;8542:18;;;8535:34;;;46503:17:0;;46548:35;;;;8474:18:1;;46548:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46536:56;-1:-1:-1;46613:24:0;;:8;46536:56;46649:20;46536:56;46649:9;:20::i;:::-;46613:62;;-1:-1:-1;;;;;;46613:62:0;;;;;;;;;;17838:25:1;;;;-1:-1:-1;;;;;17937:15:1;;;17917:18;;;17910:43;17969:18;;;17962:34;18032:15;;18012:18;;;18005:43;17810:19;;46613:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46609:125;;-1:-1:-1;46716:1:0;46609:125;46779:40;46788:5;46795:3;46800:7;46809:9;46779:8;:40::i;:::-;46762:57;;46116:729;45893:952;-1:-1:-1;;;;;46859:24:0;;;;;;:19;:24;;;;;;46855:104;;-1:-1:-1;;;;;46905:24:0;;;;;;:19;:24;;;;;46932:15;46905:42;;46855:104;-1:-1:-1;;;;;46974:30:0;;;;;;:25;:30;;;;;;;;46973:31;:69;;;;-1:-1:-1;;;;;;47009:33:0;;;;;;:28;:33;;;;;;;;47008:34;46973:69;46969:229;;;47102:15;;47084:14;47067;47077:3;47067:9;:14::i;:::-;:31;;;;:::i;:::-;:50;;47059:127;;;;-1:-1:-1;;;47059:127:0;;18261:2:1;47059:127:0;;;18243:21:1;18300:2;18280:18;;;18273:30;18339:34;18319:18;;;18312:62;-1:-1:-1;;;18390:18:1;;;18383:31;18431:19;;47059:127:0;18059:397:1;47059:127:0;47210:43;47226:5;47233:3;47238:14;47210:15;:43::i;:::-;47266:33;47295:3;47266:28;:33::i;:::-;47317:15;;;:45;;-1:-1:-1;;;47317:45:0;;-1:-1:-1;;;;;363:32:1;;;47317:45:0;;;345:51:1;47317:15:0;;;;:38;;318:18:1;47317:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47312:184;;47400:15;;-1:-1:-1;;;;;47400:15:0;:26;47435:5;47443:16;47435:5;47443:9;:16::i;:::-;47400:60;;-1:-1:-1;;;;;;47400:60:0;;;;;;;-1:-1:-1;;;;;12060:32:1;;;47400:60:0;;;12042:51:1;12109:18;;;12102:34;12015:18;;47400:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47379:106;;47511:15;;;:43;;-1:-1:-1;;;47511:43:0;;-1:-1:-1;;;;;363:32:1;;;47511:43:0;;;345:51:1;47511:15:0;;;;:38;;318:18:1;47511:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47506:178;;47592:15;;-1:-1:-1;;;;;47592:15:0;:26;47627:3;47633:14;47627:3;47633:9;:14::i;:::-;47592:56;;-1:-1:-1;;;;;;47592:56:0;;;;;;;-1:-1:-1;;;;;12060:32:1;;;47592:56:0;;;12042:51:1;12109:18;;;12102:34;12015:18;;47592:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47571:102;;;;43577:1340;43683:15;;;:72;;-1:-1:-1;;;43683:72:0;;-1:-1:-1;;;;;363:32:1;;;43683:72:0;;;345:51:1;43654:26:0;;43683:15;;;:38;;318:18:1;43683:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43654:101;;43809:1;43788:18;:22;43766:114;;;;-1:-1:-1;;;43766:114:0;;19174:2:1;43766:114:0;;;19156:21:1;19213:2;19193:18;;;19186:30;19252:34;19232:18;;;19225:62;-1:-1:-1;;;19303:18:1;;;19296:40;19353:19;;43766:114:0;18972:406:1;43766:114:0;43891:17;43919:19;43956:9;43951:521;;44008:11;;-1:-1:-1;;;44008:11:0;;;;;:41;;-1:-1:-1;;;;;;44023:26:0;;;;;;:16;:26;;;;;;;;44008:41;43982:167;;;;;-1:-1:-1;;;43982:167:0;;19585:2:1;43982:167:0;;;19567:21:1;19604:18;;;19597:30;;;;19663:34;19643:18;;;19636:62;19734:34;19714:18;;;19707:62;19786:19;;43982:167:0;19383:428:1;43982:167:0;44176:15;;;:50;;-1:-1:-1;;;44176:50:0;;-1:-1:-1;;;;;13722:15:1;;;44176:50:0;;;13704:34:1;;;13754:18;;;13747:43;;;;44176:15:0;;;:30;;13639:18:1;;44176:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44164:62;;43951:521;;;44248:9;44244:228;;;44286:15;;;:55;;-1:-1:-1;;;44286:55:0;;-1:-1:-1;;;;;13722:15:1;;;44286:55:0;;;13704:34:1;44335:4:0;13754:18:1;;;13747:43;;;;44286:15:0;;;:30;;13639:18:1;;44286:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44274:67;-1:-1:-1;44360:13:0;;44356:105;;44408:37;44425:9;44436:8;44408:16;:37::i;:::-;44394:51;;44356:105;44486:13;;44482:428;;44516:29;:17;9977:19;;9995:1;9977:19;;;9888:127;44516:29;44560:11;44574:27;:17;9858:14;;9766:114;44574:27;44616:18;;;;:13;:18;;;;;;;;:40;;;44671:30;;;;:44;;;44761:15;44730:28;;;;:46;;;;-1:-1:-1;;;;;44793:24:0;;;;;:14;:24;;;;;:34;;;;;;;;;;;;;;;;;44849:49;;20668:25:1;;;20709:18;;;20702:34;;;20752:18;;20745:60;;;;44616:18:0;;-1:-1:-1;44849:49:0;;20656:2:1;20641:18;44849:49:0;;;;;;;44501:409;44482:428;43643:1274;;;43577:1340;;:::o;8521:98::-;8579:7;8606:5;8610:1;8606;:5;:::i;:::-;8599:12;8521:98;-1:-1:-1;;;8521:98:0:o;56013:721::-;56182:16;;;56196:1;56182:16;;;;;;;;56078:7;;56126:21;;56078:7;;56182:16;;;;;;;;;;;;-1:-1:-1;56182:16:0;56158:40;;56227:4;56209;56214:1;56209:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;56209:23:0;;;:7;;;;;;;;;;:23;;;;56253:15;;:22;;;-1:-1:-1;;;56253:22:0;;;;:15;;;;;:20;;:22;;;;;56209:7;;56253:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56243:4;56248:1;56243:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;56243:32:0;;;:7;;;;;;;;;:32;56318:15;;56286:63;;56303:4;;56318:15;56336:12;56286:8;:63::i;:::-;56360:15;;:197;;-1:-1:-1;;;56360:197:0;;-1:-1:-1;;;;;56360:15:0;;;;:66;;:197;;56441:12;;56360:15;;56484:4;;56511;;56531:15;;56360:197;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56570:19;56592:44;56618:17;56592:21;:25;;:44;;;;:::i;:::-;56654:43;;;8501:25:1;;;8557:2;8542:18;;8535:34;;;56570:66:0;;-1:-1:-1;56654:43:0;;8474:18:1;56654:43:0;;;;;;;56715:11;56013:721;-1:-1:-1;;;;56013:721:0:o;57417:419::-;57532:15;;57500:63;;57517:4;;-1:-1:-1;;;;;57532:15:0;57550:12;57500:8;:63::i;:::-;57574:15;;-1:-1:-1;;;;;57574:15:0;:31;57613:10;57647:4;57667:12;57574:15;;57726:7;10747:6;;-1:-1:-1;;;;;10747:6:0;;10682:79;57726:7;57574:200;;;;;;-1:-1:-1;;;;;;57574:200:0;;;-1:-1:-1;;;;;22481:15:1;;;57574:200:0;;;22463:34:1;22513:18;;;22506:34;;;;22556:18;;;22549:34;;;;22599:18;;;22592:34;22663:15;;;22642:19;;;22635:44;57748:15:0;22695:19:1;;;22688:35;22397:19;;57574:200:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;57790:38:0;;;8501:25:1;;;8557:2;8542:18;;8535:34;;;57790:38:0;;-1:-1:-1;8474:18:1;57790:38:0;;;;;;;;57417:419;;:::o;8627:98::-;8685:7;8712:5;8716:1;8712;:5;:::i;8415:98::-;8473:7;8500:5;8504:1;8500;:5;:::i;8733:98::-;8791:7;8818:5;8822:1;8818;:5;:::i;55635:370::-;55740:12;;55736:89;;55777:16;;55769:44;;55777:16;;;;-1:-1:-1;;;;;55777:16:0;;55769:44;;;;;;;;;;;;55777:16;55769:44;;;;;;;;;;;;;;;;;;;;;55736:89;55839:18;;55835:107;;55882:22;;55874:56;;-1:-1:-1;;;;;55882:22:0;;;;55874:56;;;;;55915:14;;55882:22;55874:56;55882:22;55874:56;55915:14;55882:22;55874:56;;;;;;;;;;;;;;;;;;;;;55835:107;55957:40;;;8501:25:1;;;8557:2;8542:18;;8535:34;;;55957:40:0;;8474:18:1;55957:40:0;8296:279:1;51376:3305:0;-1:-1:-1;;;;;51617:32:0;;51518:7;51617:32;;;:25;:32;;;;;;51518:7;;;;51617:32;;;:66;;-1:-1:-1;;;;;;51653:30:0;;;;;;:25;:30;;;;;;;;51617:66;51595:143;;;;-1:-1:-1;;;51595:143:0;;23247:2:1;51595:143:0;;;23229:21:1;23286:2;23266:18;;;23259:30;23325:29;23305:18;;;23298:57;23372:18;;51595:143:0;23045:351:1;51595:143:0;-1:-1:-1;;;;;51755:32:0;;;;;;:25;:32;;;;;;;;51751:2888;;;51804:19;51838:20;51873;51928:11;;51912:12;:27;:45;;;;-1:-1:-1;51944:13:0;;;;51943:14;51912:45;51908:423;;;51992:2;51978:16;;51908:423;;;52036:11;;:15;;52050:1;52036:15;:::i;:::-;52020:12;:31;:49;;;;-1:-1:-1;52056:13:0;;;;52055:14;52020:49;52016:315;;;52104:2;52090:16;;52016:315;;;-1:-1:-1;;;;;52132:23:0;;;52128:203;;52190:60;52209:40;52246:2;52209:32;52227:13;;52209;;:17;;:32;;;;:::i;:40::-;52190:14;;;:18;:60::i;:::-;52176:74;;52128:203;;;52305:10;;52291:24;;52128:203;52354:33;52383:3;52354:24;:7;52366:11;52354;:24::i;:33::-;52347:40;-1:-1:-1;;;;;;52419:23:0;;;52416:875;;52470:36;52502:3;52470:27;52482:14;;52470:7;:11;;:27;;;;:::i;:36::-;52463:43;;52542:36;52573:4;52542:26;52554:13;;52542:7;:11;;:26;;;;:::i;:36::-;52527:51;;52612:36;52643:4;52612:26;52624:13;;52612:7;:11;;:26;;;;:::i;:36::-;52597:51;-1:-1:-1;52669:25:0;52697:30;:12;52597:51;52697:16;:30::i;:::-;52669:58;-1:-1:-1;52766:58:0;52811:12;52766:40;52669:58;52766:17;:7;52778:4;52766:11;:17::i;:40::-;:44;;:58::i;:::-;52748:76;;52845:43;52861:5;52876:4;52883;52845:15;:43::i;:::-;52909:47;52925:5;52932:9;52943:12;52909:15;:47::i;:::-;52982:35;52990:5;53005:4;53012;52982:35;;;;;;;;:::i;:::-;;;;;;;;53043:39;53051:5;53058:9;53069:12;53043:39;;;;;;;;:::i;:::-;;;;;;;;52444:656;52416:875;;;53141:17;:7;53153:4;53141:11;:17::i;:::-;53123:35;;53175:43;53191:5;53206:4;53213;53175:15;:43::i;:::-;53240:35;53248:5;53263:4;53270;53240:35;;;;;;;;:::i;:::-;;;;;;;;52416:875;51789:1513;;;51751:2888;;;53323:20;53378:11;;53362:12;:27;53358:456;;;-1:-1:-1;53425:2:0;53358:456;;;53469:11;;:15;;53483:1;53469:15;:::i;:::-;53453:12;:31;53449:365;;;-1:-1:-1;53520:2:0;53449:365;;;53563:23;53589:41;53615:4;53622:7;53589:17;:41::i;:::-;53563:67;;53680:15;53666:11;;:29;;;;:::i;:::-;53651:44;;53735:2;53719:12;:18;53716:83;;53777:2;53762:17;;53716:83;53544:270;53449:365;53837:34;53867:3;53837:25;:7;53849:12;53837:11;:25::i;:34::-;53830:41;;53886:20;53909:87;53992:3;53909:60;53939:29;53956:11;;53939:12;:16;;:29;;;;:::i;:::-;53909:7;;:29;:60::i;:87::-;54036:22;;53886:110;;-1:-1:-1;54036:40:0;;53886:110;54036:26;:40::i;:::-;54011:22;:65;54111:17;:7;54123:4;54111:11;:17::i;:::-;54093:35;;54145:43;54161:5;54176:4;54183;54145:15;:43::i;:::-;54203:20;54226:70;54273:22;;54226:24;54244:4;54226:9;:24::i;:70::-;54203:93;;54332:23;;54317:12;:38;54313:112;;;54376:33;54396:12;54376:19;:33::i;:::-;54468:21;;54443:22;;:46;54439:131;;;54510:44;54531:22;;54510:20;:44::i;:::-;54591:36;54600:5;54615:4;54622;54591:36;;;;;;;;:::i;:::-;;;;;;;;53308:1331;;;51751:2888;54658:15;51376:3305;-1:-1:-1;;;;;;51376:3305:0:o;4231:708::-;-1:-1:-1;;;;;4362:18:0;;4354:68;;;;-1:-1:-1;;;4354:68:0;;23983:2:1;4354:68:0;;;23965:21:1;24022:2;24002:18;;;23995:30;24061:34;24041:18;;;24034:62;-1:-1:-1;;;24112:18:1;;;24105:35;24157:19;;4354:68:0;23781:401:1;4354:68:0;-1:-1:-1;;;;;4441:16:0;;4433:64;;;;-1:-1:-1;;;4433:64:0;;24389:2:1;4433:64:0;;;24371:21:1;24428:2;24408:18;;;24401:30;24467:34;24447:18;;;24440:62;-1:-1:-1;;;24518:18:1;;;24511:33;24561:19;;4433:64:0;24187:399:1;4433:64:0;-1:-1:-1;;;;;4583:15:0;;4561:19;4583:15;;;;;;;;;;;4631:21;;;;4609:109;;;;-1:-1:-1;;;4609:109:0;;24793:2:1;4609:109:0;;;24775:21:1;24832:2;24812:18;;;24805:30;24871:34;24851:18;;;24844:62;-1:-1:-1;;;24922:18:1;;;24915:36;24968:19;;4609:109:0;24591:402:1;4609:109:0;-1:-1:-1;;;;;4754:15:0;;;:9;:15;;;;;;;;;;;4772:20;;;4754:38;;4814:13;;;;;;;;:23;;4786:6;;4754:9;4814:23;;4786:6;;4814:23;:::i;:::-;;;;;;;;4870:2;-1:-1:-1;;;;;4855:26:0;4864:4;-1:-1:-1;;;;;4855:26:0;;4874:6;4855:26;;;;2701:25:1;;2689:2;2674:18;;2555:177;4855:26:0;;;;;;;;4894:37;50822:324;41121:318;-1:-1:-1;;;;;41198:25:0;;;;;;:16;:25;;;;;;;;;:49;;-1:-1:-1;;;;;;41227:20:0;;;;;;:11;:20;;;;;;;;41198:49;41195:87;;;41121:318;:::o;41195:87::-;41316:13;;-1:-1:-1;;;;;41297:33:0;;;41316:13;;41297:33;41294:71;;;41121:318;:::o;41294:71::-;41377:25;;:8;41403:7;41412:18;41403:7;41412:9;:18::i;:::-;41377:54;;-1:-1:-1;;;;;;41377:54:0;;;;;;;;;;25231:25:1;;;;-1:-1:-1;;;;;25292:32:1;;;25272:18;;;25265:60;25341:18;;;25334:34;25204:18;;41377:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56742:667;56836:7;56861:27;56891:24;56909:4;56891:9;:24::i;:::-;56950:16;;;56964:1;56950:16;;;;;;;;56861:54;;-1:-1:-1;56926:21:0;;56950:16;;;;;;;;;;-1:-1:-1;;56987:15:0;;:22;;;-1:-1:-1;;;56987:22:0;;;;56926:40;;-1:-1:-1;;;;;;56987:15:0;;;;:20;;-1:-1:-1;56987:22:0;;;;;;;;;;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56977:4;56982:1;56977:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1;;;;;56977:32:0;;;-1:-1:-1;;;;;56977:32:0;;;;;57038:4;57020;57025:1;57020:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;57020:23:0;;;:7;;;;;;;;;:23;57056:15;;:140;;-1:-1:-1;;;57056:140:0;;:15;;;:66;;57144:10;;57056:140;;:15;;57169:4;;57175:3;;57180:15;;57056:140;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57209:22;57234:73;57277:19;57234:24;57252:4;57234:9;:24::i;:73::-;57325:44;;;8501:25:1;;;8557:2;8542:18;;8535:34;;;57209:98:0;;-1:-1:-1;57325:44:0;;8474:18:1;57325:44:0;;;;;;;57387:14;56742:667;-1:-1:-1;;;;;56742:667:0:o;54689:938::-;54759:26;54788:33;54817:3;54788:24;54805:6;;54788:12;:16;;:24;;;;:::i;:33::-;54759:62;-1:-1:-1;54834:21:0;54858:25;54759:62;54881:1;54858:22;:25::i;:::-;54834:49;-1:-1:-1;54894:21:0;54918:31;:12;54834:49;54918:16;:31::i;:::-;54894:55;;54962:16;54981:31;54998:13;54981:16;:31::i;:::-;54962:50;;55025:19;55047:29;55072:3;55047:20;55060:6;;55047:8;:12;;:20;;;;:::i;:29::-;55025:51;;55087:21;55111:29;55136:3;55111:20;55124:6;;55111:8;:12;;:20;;;;:::i;:29::-;55087:53;;55151:27;55181:35;55212:3;55181:26;55194:12;;55181:8;:12;;:26;;;;:::i;:35::-;55151:65;-1:-1:-1;55227:27:0;55257:111;55151:65;55257:72;55315:13;55257:72;:8;55284:11;55257:26;:39::i;:111::-;55227:141;-1:-1:-1;55395:38:0;:13;55227:141;55395:17;:38::i;:::-;55379:54;;55446:52;55463:13;55478:19;55446:16;:52::i;:::-;55531:1;55515:13;:17;:36;;;;;55550:1;55536:11;:15;55515:36;55511:109;;;55568:40;55581:13;55596:11;55568:12;:40::i;:::-;54748:879;;;;;;;;54689:938;:::o;57844:550::-;57915:17;57935:30;57952:12;57935:16;:30::i;:::-;58003:22;;57915:50;;-1:-1:-1;58003:40:0;;58030:12;58003:26;:40::i;:::-;57978:22;:65;58093:16;;58054:22;;58079:31;;:9;;:13;:31::i;:::-;58150:15;;58142:80;;58054:56;;-1:-1:-1;58124:12:0;;-1:-1:-1;;;;;58150:15:0;;;;58054:56;;58124:12;58142:80;58124:12;58142:80;58054:56;58150:15;58142:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58123:99;;;58239:7;58235:152;;;58268:24;;2701:25:1;;;58268:24:0;;2689:2:1;2674:18;58268:24:0;;;;;;;58235:152;;;58344:16;;:31;;58365:9;58344:20;:31::i;:::-;58325:16;:50;57904:490;;;57844:550;:::o;14:180:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:1;;14:180;-1:-1:-1;14:180:1:o;407:597::-;519:4;548:2;577;566:9;559:21;609:6;603:13;652:6;647:2;636:9;632:18;625:34;677:1;687:140;701:6;698:1;695:13;687:140;;;796:14;;;792:23;;786:30;762:17;;;781:2;758:26;751:66;716:10;;687:140;;;845:6;842:1;839:13;836:91;;;915:1;910:2;901:6;890:9;886:22;882:31;875:42;836:91;-1:-1:-1;988:2:1;967:15;-1:-1:-1;;963:29:1;948:45;;;;995:2;944:54;;407:597;-1:-1:-1;;;407:597:1:o;1009:131::-;-1:-1:-1;;;;;1084:31:1;;1074:42;;1064:70;;1130:1;1127;1120:12;1064:70;1009:131;:::o;1145:383::-;1222:6;1230;1238;1291:2;1279:9;1270:7;1266:23;1262:32;1259:52;;;1307:1;1304;1297:12;1259:52;1343:9;1330:23;1320:33;;1403:2;1392:9;1388:18;1375:32;1416:31;1441:5;1416:31;:::i;:::-;1145:383;;1466:5;;-1:-1:-1;;;1518:2:1;1503:18;;;;1490:32;;1145:383::o;1533:315::-;1601:6;1609;1662:2;1650:9;1641:7;1637:23;1633:32;1630:52;;;1678:1;1675;1668:12;1630:52;1717:9;1704:23;1736:31;1761:5;1736:31;:::i;:::-;1786:5;1838:2;1823:18;;;;1810:32;;-1:-1:-1;;;1533:315:1:o;2045:118::-;2131:5;2124:13;2117:21;2110:5;2107:32;2097:60;;2153:1;2150;2143:12;2168:382;2233:6;2241;2294:2;2282:9;2273:7;2269:23;2265:32;2262:52;;;2310:1;2307;2300:12;2262:52;2349:9;2336:23;2368:31;2393:5;2368:31;:::i;:::-;2418:5;-1:-1:-1;2475:2:1;2460:18;;2447:32;2488:30;2447:32;2488:30;:::i;:::-;2537:7;2527:17;;;2168:382;;;;;:::o;2737:456::-;2814:6;2822;2830;2883:2;2871:9;2862:7;2858:23;2854:32;2851:52;;;2899:1;2896;2889:12;2851:52;2938:9;2925:23;2957:31;2982:5;2957:31;:::i;:::-;3007:5;-1:-1:-1;3064:2:1;3049:18;;3036:32;3077:33;3036:32;3077:33;:::i;3198:388::-;3266:6;3274;3327:2;3315:9;3306:7;3302:23;3298:32;3295:52;;;3343:1;3340;3333:12;3295:52;3382:9;3369:23;3401:31;3426:5;3401:31;:::i;:::-;3451:5;-1:-1:-1;3508:2:1;3493:18;;3480:32;3521:33;3480:32;3521:33;:::i;4023:247::-;4082:6;4135:2;4123:9;4114:7;4110:23;4106:32;4103:52;;;4151:1;4148;4141:12;4103:52;4190:9;4177:23;4209:31;4234:5;4209:31;:::i;4275:385::-;4361:6;4369;4377;4385;4438:3;4426:9;4417:7;4413:23;4409:33;4406:53;;;4455:1;4452;4445:12;4406:53;-1:-1:-1;;4478:23:1;;;4548:2;4533:18;;4520:32;;-1:-1:-1;4599:2:1;4584:18;;4571:32;;4650:2;4635:18;4622:32;;-1:-1:-1;4275:385:1;-1:-1:-1;4275:385:1:o;4665:156::-;4731:20;;4791:4;4780:16;;4770:27;;4760:55;;4811:1;4808;4801:12;4760:55;4665:156;;;:::o;4826:182::-;4883:6;4936:2;4924:9;4915:7;4911:23;4907:32;4904:52;;;4952:1;4949;4942:12;4904:52;4975:27;4992:9;4975:27;:::i;5013:454::-;5108:6;5116;5124;5132;5140;5193:3;5181:9;5172:7;5168:23;5164:33;5161:53;;;5210:1;5207;5200:12;5161:53;-1:-1:-1;;5233:23:1;;;5303:2;5288:18;;5275:32;;-1:-1:-1;5354:2:1;5339:18;;5326:32;;5405:2;5390:18;;5377:32;;-1:-1:-1;5456:3:1;5441:19;5428:33;;-1:-1:-1;5013:454:1;-1:-1:-1;5013:454:1:o;5472:615::-;5558:6;5566;5619:2;5607:9;5598:7;5594:23;5590:32;5587:52;;;5635:1;5632;5625:12;5587:52;5675:9;5662:23;5704:18;5745:2;5737:6;5734:14;5731:34;;;5761:1;5758;5751:12;5731:34;5799:6;5788:9;5784:22;5774:32;;5844:7;5837:4;5833:2;5829:13;5825:27;5815:55;;5866:1;5863;5856:12;5815:55;5906:2;5893:16;5932:2;5924:6;5921:14;5918:34;;;5948:1;5945;5938:12;5918:34;6001:7;5996:2;5986:6;5983:1;5979:14;5975:2;5971:23;5967:32;5964:45;5961:65;;;6022:1;6019;6012:12;5961:65;6053:2;6045:11;;;;;6075:6;;-1:-1:-1;5472:615:1;;-1:-1:-1;;;;5472:615:1:o;6416:241::-;6472:6;6525:2;6513:9;6504:7;6500:23;6496:32;6493:52;;;6541:1;6538;6531:12;6493:52;6580:9;6567:23;6599:28;6621:5;6599:28;:::i;6662:387::-;6746:6;6754;6762;6770;6823:3;6811:9;6802:7;6798:23;6794:33;6791:53;;;6840:1;6837;6830:12;6791:53;6863:27;6880:9;6863:27;:::i;:::-;6853:37;6937:2;6922:18;;6909:32;;-1:-1:-1;6988:2:1;6973:18;;6960:32;;7039:2;7024:18;7011:32;;-1:-1:-1;6662:387:1;-1:-1:-1;;;6662:387:1:o;7054:383::-;7131:6;7139;7147;7200:2;7188:9;7179:7;7175:23;7171:32;7168:52;;;7216:1;7213;7206:12;7168:52;7255:9;7242:23;7274:31;7299:5;7274:31;:::i;:::-;7324:5;7376:2;7361:18;;7348:32;;-1:-1:-1;7427:2:1;7412:18;;;7399:32;;7054:383;-1:-1:-1;;;7054:383:1:o;7442:849::-;7669:2;7721:21;;;7791:13;;7694:18;;;7813:22;;;7640:4;;7669:2;7854;;7872:18;;;;7913:15;;;7640:4;7956:309;7970:6;7967:1;7964:13;7956:309;;;8029:13;;8067:9;;8055:22;;8117:11;;;8111:18;8097:12;;;8090:40;8170:11;;8164:18;8150:12;;;8143:40;8212:4;8203:14;;;;8240:15;;;;7992:1;7985:9;7956:309;;;-1:-1:-1;8282:3:1;;7442:849;-1:-1:-1;;;;;;;7442:849:1:o;8580:251::-;8650:6;8703:2;8691:9;8682:7;8678:23;8674:32;8671:52;;;8719:1;8716;8709:12;8671:52;8751:9;8745:16;8770:31;8795:5;8770:31;:::i;8836:380::-;8915:1;8911:12;;;;8958;;;8979:61;;9033:4;9025:6;9021:17;9011:27;;8979:61;9086:2;9078:6;9075:14;9055:18;9052:38;9049:161;;;9132:10;9127:3;9123:20;9120:1;9113:31;9167:4;9164:1;9157:15;9195:4;9192:1;9185:15;9049:161;;8836:380;;;:::o;9221:356::-;9423:2;9405:21;;;9442:18;;;9435:30;9501:34;9496:2;9481:18;;9474:62;9568:2;9553:18;;9221:356::o;10011:127::-;10072:10;10067:3;10063:20;10060:1;10053:31;10103:4;10100:1;10093:15;10127:4;10124:1;10117:15;10143:168;10183:7;10249:1;10245;10241:6;10237:14;10234:1;10231:21;10226:1;10219:9;10212:17;10208:45;10205:71;;;10256:18;;:::i;:::-;-1:-1:-1;10296:9:1;;10143:168::o;10316:383::-;-1:-1:-1;;;;;10582:15:1;;;10564:34;;10634:15;;;;10629:2;10614:18;;10607:43;10681:2;10666:18;;10659:34;;;;10514:2;10499:18;;10316:383::o;10704:184::-;10774:6;10827:2;10815:9;10806:7;10802:23;10798:32;10795:52;;;10843:1;10840;10833:12;10795:52;-1:-1:-1;10866:16:1;;10704:184;-1:-1:-1;10704:184:1:o;10893:175::-;10930:3;10974:4;10967:5;10963:16;11003:4;10994:7;10991:17;10988:43;;;11011:18;;:::i;:::-;11060:1;11047:15;;10893:175;-1:-1:-1;;10893:175:1:o;11073:128::-;11113:3;11144:1;11140:6;11137:1;11134:13;11131:39;;;11150:18;;:::i;:::-;-1:-1:-1;11186:9:1;;11073:128::o;11206:127::-;11267:10;11262:3;11258:20;11255:1;11248:31;11298:4;11295:1;11288:15;11322:4;11319:1;11312:15;11338:120;11378:1;11404;11394:35;;11409:18;;:::i;:::-;-1:-1:-1;11443:9:1;;11338:120::o;12863:127::-;12924:10;12919:3;12915:20;12912:1;12905:31;12955:4;12952:1;12945:15;12979:4;12976:1;12969:15;12995:135;13034:3;-1:-1:-1;;13055:17:1;;13052:43;;;13075:18;;:::i;:::-;-1:-1:-1;13122:1:1;13111:13;;12995:135::o;13801:245::-;13868:6;13921:2;13909:9;13900:7;13896:23;13892:32;13889:52;;;13937:1;13934;13927:12;13889:52;13969:9;13963:16;13988:28;14010:5;13988:28;:::i;14402:125::-;14442:4;14470:1;14467;14464:8;14461:34;;;14475:18;;:::i;:::-;-1:-1:-1;14512:9:1;;14402:125::o;14878:112::-;14910:1;14936;14926:35;;14941:18;;:::i;:::-;-1:-1:-1;14975:9:1;;14878:112::o;14995:127::-;15056:10;15051:3;15047:20;15044:1;15037:31;15087:4;15084:1;15077:15;15111:4;15108:1;15101:15;15749:245;15828:6;15836;15889:2;15877:9;15868:7;15864:23;15860:32;15857:52;;;15905:1;15902;15895:12;15857:52;-1:-1:-1;;15928:16:1;;15984:2;15969:18;;;15963:25;15928:16;;15963:25;;-1:-1:-1;15749:245:1:o;20816:461::-;20869:3;20907:5;20901:12;20934:6;20929:3;20922:19;20960:4;20989:2;20984:3;20980:12;20973:19;;21026:2;21019:5;21015:14;21047:1;21057:195;21071:6;21068:1;21065:13;21057:195;;;21136:13;;-1:-1:-1;;;;;21132:39:1;21120:52;;21192:12;;;;21227:15;;;;21168:1;21086:9;21057:195;;;-1:-1:-1;21268:3:1;;20816:461;-1:-1:-1;;;;;20816:461:1:o;21282:582::-;21581:6;21570:9;21563:25;21624:6;21619:2;21608:9;21604:18;21597:34;21667:3;21662:2;21651:9;21647:18;21640:31;21544:4;21688:57;21740:3;21729:9;21725:19;21717:6;21688:57;:::i;:::-;-1:-1:-1;;;;;21781:32:1;;;;21776:2;21761:18;;21754:60;-1:-1:-1;21845:3:1;21830:19;21823:35;21680:65;21282:582;-1:-1:-1;;;21282:582:1:o;22734:306::-;22822:6;22830;22838;22891:2;22879:9;22870:7;22866:23;22862:32;22859:52;;;22907:1;22904;22897:12;22859:52;22936:9;22930:16;22920:26;;22986:2;22975:9;22971:18;22965:25;22955:35;;23030:2;23019:9;23015:18;23009:25;22999:35;;22734:306;;;;;:::o;25379:510::-;25650:6;25639:9;25632:25;25693:3;25688:2;25677:9;25673:18;25666:31;25613:4;25714:57;25766:3;25755:9;25751:19;25743:6;25714:57;:::i;:::-;-1:-1:-1;;;;;25807:32:1;;;;25802:2;25787:18;;25780:60;-1:-1:-1;25871:2:1;25856:18;25849:34;25706:65;25379:510;-1:-1:-1;;25379:510:1:o

Swarm Source

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