ETH Price: $2,612.29 (+1.19%)

Token

DNA Token (DNA)
 

Overview

Max Total Supply

1,000,000,000,000,000 DNA

Holders

71

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
3,131,597,853,630.774467020544042258 DNA

Value
$0.00
0xfe97bdcee63e6721b556c10766677be3bbb7a7ed
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
DNAToken

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-06-11
*/

// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;

interface IERC20 {
    function totalSupply() external view returns (uint256);

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

    function transfer(address recipient, 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 sender,
        address recipient,
        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 IFactory {
    function createPair(address tokenA, address tokenB) external returns (address pair);

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

interface IRouter {
    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 swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable;

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

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

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

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

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

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

library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

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

        return c;
    }

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

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

        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

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

library SafeMathInt {
    int256 private constant MIN_INT256 = int256(1) << 255;
    int256 private constant MAX_INT256 = ~(int256(1) << 255);

    function mul(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a * b;

        // Detect overflow when multiplying MIN_INT256 with -1
        require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
        require((b == 0) || (c / b == a));
        return c;
    }

    function div(int256 a, int256 b) internal pure returns (int256) {
        // Prevent overflow when dividing MIN_INT256 by -1
        require(b != -1 || a != MIN_INT256);

        // Solidity already throws when dividing by 0.
        return a / b;
    }

    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a));
        return c;
    }

    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a));
        return c;
    }

    function abs(int256 a) internal pure returns (int256) {
        require(a != MIN_INT256);
        return a < 0 ? -a : a;
    }

    function toUint256Safe(int256 a) internal pure returns (uint256) {
        require(a >= 0);
        return uint256(a);
    }
}

library SafeMathUint {
    function toInt256Safe(uint256 a) internal pure returns (int256) {
        int256 b = int256(a);
        require(b >= 0);
        return b;
    }
}

library Address {
	function isContract(address account) internal view returns (bool) {
		uint256 size;
		assembly {
			size := extcodesize(account)
		}
		return size > 0;
	}

	function sendValue(address payable recipient, uint256 amount) internal {
		require(
			address(this).balance >= amount,
			"Address: insufficient balance"
		);

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

	function functionCall(address target, bytes memory data)
	internal
	returns (bytes memory)
	{
		return functionCall(target, data, "Address: low-level call failed");
	}

	function functionCall(
		address target,
		bytes memory data,
		string memory errorMessage
	) internal returns (bytes memory) {
		return functionCallWithValue(target, data, 0, errorMessage);
	}

	function functionCallWithValue(
		address target,
		bytes memory data,
		uint256 value
	) internal returns (bytes memory) {
		return
		functionCallWithValue(
			target,
			data,
			value,
			"Address: low-level call with value failed"
		);
	}

	function functionCallWithValue(
		address target,
		bytes memory data,
		uint256 value,
		string memory errorMessage
	) internal returns (bytes memory) {
		require(
			address(this).balance >= value,
			"Address: insufficient balance for call"
		);
		require(isContract(target), "Address: call to non-contract");

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

	function functionStaticCall(address target, bytes memory data)
	internal
	view
	returns (bytes memory)
	{
		return
		functionStaticCall(
			target,
			data,
			"Address: low-level static call failed"
		);
	}

	function functionStaticCall(
		address target,
		bytes memory data,
		string memory errorMessage
	) internal view returns (bytes memory) {
		require(isContract(target), "Address: static call to non-contract");

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

	function functionDelegateCall(address target, bytes memory data)
	internal
	returns (bytes memory)
	{
		return
		functionDelegateCall(
			target,
			data,
			"Address: low-level delegate call failed"
		);
	}

	function functionDelegateCall(
		address target,
		bytes memory data,
		string memory errorMessage
	) internal returns (bytes memory) {
		require(isContract(target), "Address: delegate call to non-contract");

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

	function _verifyCallResult(
		bool success,
		bytes memory returndata,
		string memory errorMessage
	) private pure returns (bytes memory) {
		if (success) {
			return returndata;
		} else {
			if (returndata.length > 0) {
				assembly {
					let returndata_size := mload(returndata)
					revert(add(32, returndata), returndata_size)
				}
			} else {
				revert(errorMessage);
			}
		}
	}
}

library IterableMapping {
    struct Map {
        address[] keys;
        mapping(address => uint256) values;
        mapping(address => uint256) indexOf;
        mapping(address => bool) inserted;
    }

    function get(Map storage map, address key) public view returns (uint256) {
        return map.values[key];
    }

    function getIndexOfKey(Map storage map, address key) public view returns (int256) {
        if (!map.inserted[key]) {
            return -1;
        }
        return int256(map.indexOf[key]);
    }

    function getKeyAtIndex(Map storage map, uint256 index) public view returns (address) {
        return map.keys[index];
    }

    function size(Map storage map) public view returns (uint256) {
        return map.keys.length;
    }

    function set(
        Map storage map,
        address key,
        uint256 val
    ) public {
        if (map.inserted[key]) {
            map.values[key] = val;
        } else {
            map.inserted[key] = true;
            map.values[key] = val;
            map.indexOf[key] = map.keys.length;
            map.keys.push(key);
        }
    }

    function remove(Map storage map, address key) public {
        if (!map.inserted[key]) {
            return;
        }

        delete map.inserted[key];
        delete map.values[key];

        uint256 index = map.indexOf[key];
        uint256 lastIndex = map.keys.length - 1;
        address lastKey = map.keys[lastIndex];

        map.indexOf[lastKey] = index;
        delete map.indexOf[key];

        map.keys[index] = lastKey;
        map.keys.pop();
    }
}

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

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

contract Ownable is Context {
    address private _owner;

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

    constructor() {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

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

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

contract ERC20 is Context, IERC20, IERC20Metadata {
    using SafeMath for uint256;

    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 recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, 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) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

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

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

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

    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");
        _beforeTokenTransfer(sender, recipient, amount);
        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, 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 = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(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);
        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(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 _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

contract DividendPayingToken is
    ERC20,
    Ownable,
    DividendPayingTokenInterface,
    DividendPayingTokenOptionalInterface
{
    using SafeMath for uint256;
    using SafeMathUint for uint256;
    using SafeMathInt for int256;

    uint256 internal constant magnitude = 2**128;
    uint256 internal magnifiedDividendPerShare;
    uint256 public totalDividendsDistributed;
    address public rewardToken;
    IRouter public uniswapV2Router;

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

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

    receive() external payable {
        distributeDividends();
    }

    function distributeDividends() public payable override onlyOwner {
        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 onlyOwner {
        _withdrawDividendOfUser(payable(msg.sender));
    }

    function _withdrawDividendOfUser(address payable user) internal returns (uint256) {
        uint256 _withdrawableDividend = withdrawableDividendOf(user);
        if (_withdrawableDividend > 0) {
            withdrawnDividends[user] = withdrawnDividends[user].add(_withdrawableDividend);
            emit DividendWithdrawn(user, _withdrawableDividend);
            (bool success,) = user.call{value: _withdrawableDividend, gas: 3000}("");
            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))
                .toInt256Safe()
                .add(magnifiedDividendCorrections[_owner])
                .toUint256Safe() / magnitude;
    }

    function _transfer(
        address from,
        address to,
        uint256 value
    ) internal virtual override {
        require(false);
        int256 _magCorrection = magnifiedDividendPerShare.mul(value).toInt256Safe();
        magnifiedDividendCorrections[from] = magnifiedDividendCorrections[from].add(_magCorrection);
        magnifiedDividendCorrections[to] = magnifiedDividendCorrections[to].sub(_magCorrection);
    }

    function _mint(address account, uint256 value) internal override {
        super._mint(account, value);
        magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account].sub(
            (magnifiedDividendPerShare.mul(value)).toInt256Safe()
        );
    }

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

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

contract DNAToken is Ownable, ERC20 {
    using Address for address;

    IRouter public uniswapV2Router;
    address public immutable uniswapV2Pair;

    string private constant _name = "DNA Token";
    string private constant _symbol = "DNA";

    DNADividendTracker public dividendTracker;

    uint256 public initialSupply = 1000000000000000 * (10**18);

    bool public isTradingEnabled;

    // max wallet is 1% of initialSupply
    uint256 public maxWalletAmount = initialSupply * 10000 / 10000;

    // max buy and sell tx is 2% of initialSupply
    uint256 public maxTxAmount = initialSupply * 10000 / 10000;

    bool private _swapping;
    uint256 public minimumTokensBeforeSwap = initialSupply * 25 / 100000;

    address public liquidityWallet;
    address public operationsWallet;
    address public buyBackWallet;
    address public treasuryWallet;
    address public WalletAWallet;

    struct CustomTaxPeriod {
        bytes23 periodName;
        uint8 blocksInPeriod;
        uint256 timeInPeriod;
        uint8 liquidityFeeOnBuy;
        uint8 liquidityFeeOnSell;
        uint8 operationsFeeOnBuy;
        uint8 operationsFeeOnSell;
        uint8 buyBackFeeOnBuy;
        uint8 buyBackFeeOnSell;
        uint8 treasuryFeeOnBuy;
        uint8 treasuryFeeOnSell;
        uint8 WalletAFeeOnBuy;
        uint8 WalletAFeeOnSell;
        uint8 holdersFeeOnBuy;
        uint8 holdersFeeOnSell;
    }

    // Base taxes
    CustomTaxPeriod private _base = CustomTaxPeriod("base", 0, 0, 2, 4, 1, 4, 2, 3, 1, 4, 1, 1, 2, 5);

    bool private _isLaunched;
    uint256 private _launchStartTimestamp;
    uint256 private _launchBlockNumber;

    mapping (address => bool) private _isBlocked;
    mapping(address => bool) private _isAllowedToTradeWhenDisabled;
    mapping(address => bool) private _feeOnSelectedWalletTransfers;
    mapping(address => bool) private _isExcludedFromFee;
    mapping(address => bool) private _isExcludedFromMaxTransactionLimit;
    mapping(address => bool) private _isExcludedFromMaxWalletLimit;
    mapping(address => bool) public automatedMarketMakerPairs;

    uint8 private _liquidityFee;
    uint8 private _operationsFee;
    uint8 private _buyBackFee;
    uint8 private _treasuryFee;
    uint8 private _WalletAFee;
    uint8 private _holdersFee;
    uint8 private _totalFee;

    event AutomatedMarketMakerPairChange(address indexed pair, bool indexed value);
    event BlockedAccountChange(address indexed holder, bool indexed status);
    event UniswapV2RouterChange(address indexed newAddress, address indexed oldAddress);
    event WalletChange(string indexed indentifier,address indexed newWallet,address indexed oldWallet);
    event FeeChange(string indexed identifier,uint8 liquidityFee,uint8 operationsFee,uint8 buyBackFee,uint8 treasuryFee, uint8 WalletAFee, uint8 holdersFee);
    event CustomTaxPeriodChange(uint256 indexed newValue,uint256 indexed oldValue,string indexed taxType,bytes23 period);
    event MaxTransactionAmountChange(uint256 indexed newValue, uint256 indexed oldValue);
    event MaxWalletAmountChange(uint256 indexed newValue, uint256 indexed oldValue);
    event ExcludeFromFeesChange(address indexed account, bool isExcluded);
    event ExcludeFromMaxTransferChange(address indexed account, bool isExcluded);
    event ExcludeFromMaxWalletChange(address indexed account, bool isExcluded);
    event AllowedWhenTradingDisabledChange(address indexed account, bool isExcluded);
    event MinTokenAmountBeforeSwapChange(uint256 indexed newValue, uint256 indexed oldValue);
    event DividendsSent(uint256 tokensSwapped);
    event SwapAndLiquify(uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiqudity);
    event FeeOnSelectedWalletTransfersChange(address indexed account, bool newValue);
    event ClaimETHOverflow(uint256 amount);
    event FeesApplied(uint8 liquidityFee,uint8 operationsFee,uint8 buyBackFee,uint8 treasuryFee, uint8 WalletAFee, uint8 holdersFee,uint8 totalFee);

    constructor() ERC20(_name, _symbol) {
        dividendTracker = new DNADividendTracker();

        liquidityWallet = owner();
        operationsWallet = owner();
        buyBackWallet = owner();
		treasuryWallet = owner();
        WalletAWallet = owner();

        IRouter _uniswapV2Router = IRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        address _uniswapV2Pair = IFactory(_uniswapV2Router.factory()).createPair(address(this),_uniswapV2Router.WETH());
        uniswapV2Router = _uniswapV2Router;
        uniswapV2Pair = _uniswapV2Pair;
        _setAutomatedMarketMakerPair(_uniswapV2Pair, true);

        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[address(this)] = true;
        _isExcludedFromFee[address(dividendTracker)] = true;

        dividendTracker.excludeFromDividends(address(dividendTracker));
        dividendTracker.excludeFromDividends(address(this));
        dividendTracker.excludeFromDividends(address(0x000000000000000000000000000000000000dEaD));
        dividendTracker.excludeFromDividends(owner());
        dividendTracker.excludeFromDividends(address(_uniswapV2Router));

        _isAllowedToTradeWhenDisabled[owner()] = true;
        _isAllowedToTradeWhenDisabled[address(this)] = true;

        _isExcludedFromMaxTransactionLimit[address(dividendTracker)] = true;
        _isExcludedFromMaxTransactionLimit[address(this)] = true;

        _isExcludedFromMaxWalletLimit[_uniswapV2Pair] = true;
        _isExcludedFromMaxWalletLimit[address(dividendTracker)] = true;
        _isExcludedFromMaxWalletLimit[address(uniswapV2Router)] = true;
        _isExcludedFromMaxWalletLimit[address(this)] = true;
        _isExcludedFromMaxWalletLimit[owner()] = true;

        _mint(owner(), initialSupply);
    }

    receive() external payable {}

    // Setters
    function activateTrading() external onlyOwner {
        isTradingEnabled = true;
        if(_launchBlockNumber == 0) {
            _launchBlockNumber = block.number;
            _launchStartTimestamp = block.timestamp;
            _isLaunched = true;
        }
    }
    function deactivateTrading() external onlyOwner {
        isTradingEnabled = false;
    }
    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        require(automatedMarketMakerPairs[pair] != value,"DNA: Automated market maker pair is already set to that value");
        automatedMarketMakerPairs[pair] = value;
        if (value) {
            dividendTracker.excludeFromDividends(pair);
        }
        emit AutomatedMarketMakerPairChange(pair, value);
    }
    function allowTradingWhenDisabled(address account, bool allowed) external onlyOwner {
        _isAllowedToTradeWhenDisabled[account] = allowed;
        emit AllowedWhenTradingDisabledChange(account, allowed);
    }
    function blockAccount(address account) external onlyOwner {
        require(!_isBlocked[account], "DNA: Account is already blocked");
        if (_isLaunched) {
            require((block.timestamp - _launchStartTimestamp) < 172800, "DNA: Time to block accounts has expired");
        }
        _isBlocked[account] = true;
        emit BlockedAccountChange(account, true);
    }
    function unblockAccount(address account) external onlyOwner {
        require(_isBlocked[account], "DNA: Account is not blcoked");
        _isBlocked[account] = false;
        emit BlockedAccountChange(account, false);
    }
    function setFeeOnSelectedWalletTransfers(address account, bool value) external onlyOwner {
        require(_feeOnSelectedWalletTransfers[account] != value,"DNA: The selected wallet is already set to the value ");
        _feeOnSelectedWalletTransfers[account] = value;
        emit FeeOnSelectedWalletTransfersChange(account, value);
    }
    function excludeFromFees(address account, bool excluded) external onlyOwner {
        require(_isExcludedFromFee[account] != excluded,"DNA: Account is already the value of 'excluded'");
        _isExcludedFromFee[account] = excluded;
        emit ExcludeFromFeesChange(account, excluded);
    }
    function excludeFromDividends(address account) external onlyOwner {
        dividendTracker.excludeFromDividends(account);
    }
    function excludeFromMaxTransactionLimit(address account, bool excluded) external onlyOwner {
        require(_isExcludedFromMaxTransactionLimit[account] != excluded,"DNA: Account is already the value of 'excluded'");
        _isExcludedFromMaxTransactionLimit[account] = excluded;
        emit ExcludeFromMaxTransferChange(account, excluded);
    }
    function excludeFromMaxWalletLimit(address account, bool excluded) external onlyOwner {
        require(_isExcludedFromMaxWalletLimit[account] != excluded,"DNA: Account is already the value of 'excluded'");
        _isExcludedFromMaxWalletLimit[account] = excluded;
        emit ExcludeFromMaxWalletChange(account, excluded);
    }
    function setWallets(address newLiquidityWallet,address newOperationsWallet,address newBuyBackWallet,address newTreasuryWallet, address newWalletAWallet) external onlyOwner {
        if (liquidityWallet != newLiquidityWallet) {
            require(newLiquidityWallet != address(0), "DNA: The liquidityWallet cannot be 0");
            emit WalletChange("liquidityWallet", newLiquidityWallet, liquidityWallet);
            liquidityWallet = newLiquidityWallet;
        }
        if (operationsWallet != newOperationsWallet) {
            require(newOperationsWallet != address(0), "DNA: The operationsWallet cannot be 0");
            emit WalletChange("operationsWallet", newOperationsWallet, operationsWallet);
            operationsWallet = newOperationsWallet;
        }
        if (buyBackWallet != newBuyBackWallet) {
            require(newBuyBackWallet != address(0), "DNA: The buyBackWallet cannot be 0");
            emit WalletChange("buyBackWallet", newBuyBackWallet, buyBackWallet);
            buyBackWallet = newBuyBackWallet;
        }
        if (treasuryWallet != newTreasuryWallet) {
            require(newTreasuryWallet != address(0), "DNA: The treasuryWallet cannot be 0");
            emit WalletChange("treasuryWallet", newTreasuryWallet, treasuryWallet);
            treasuryWallet = newTreasuryWallet;
        }
        if (WalletAWallet != newWalletAWallet) {
            require(newWalletAWallet != address(0), "DNA: The WalletAWallet cannot be 0");
            emit WalletChange("WalletAWallet", newWalletAWallet, WalletAWallet);
            WalletAWallet = newWalletAWallet;
        }
    }
    // Base fees
    function setBaseFeesOnBuy(uint8 _liquidityFeeOnBuy,uint8 _operationsFeeOnBuy,uint8 _buyBackFeeOnBuy,uint8 _treasuryFeeOnBuy, uint8 _WalletAFeeOnBuy, uint8 _holdersFeeOnBuy) external onlyOwner {
        _setCustomBuyTaxPeriod(_base,_liquidityFeeOnBuy,_operationsFeeOnBuy,_buyBackFeeOnBuy,_treasuryFeeOnBuy, _WalletAFeeOnBuy, _holdersFeeOnBuy);
        emit FeeChange("baseFees-Buy",_liquidityFeeOnBuy,_operationsFeeOnBuy,_buyBackFeeOnBuy,_treasuryFeeOnBuy, _WalletAFeeOnBuy, _holdersFeeOnBuy);
    }
    function setBaseFeesOnSell(uint8 _liquidityFeeOnSell,uint8 _operationsFeeOnSell,uint8 _buyBackFeeOnSell,uint8 _treasuryFeeOnSell, uint8 _WalletAFeeOnSell, uint8 _holdersFeeOnSell) external onlyOwner {
        _setCustomSellTaxPeriod(_base,_liquidityFeeOnSell,_operationsFeeOnSell,_buyBackFeeOnSell,_treasuryFeeOnSell,_WalletAFeeOnSell, _holdersFeeOnSell);
        emit FeeChange("baseFees-Sell",_liquidityFeeOnSell,_operationsFeeOnSell,_buyBackFeeOnSell,_treasuryFeeOnSell,_WalletAFeeOnSell, _holdersFeeOnSell);
    }
    function setUniswapRouter(address newAddress) external onlyOwner {
        require(newAddress != address(uniswapV2Router),"DNA: The router already has that address");
        emit UniswapV2RouterChange(newAddress, address(uniswapV2Router));
        uniswapV2Router = IRouter(newAddress);
    }
    function setMaxTransactionAmount(uint256 newValue) external onlyOwner {
        require(newValue != maxTxAmount, "DNA: Cannot update maxTxAmount to same value");
        emit MaxTransactionAmountChange(newValue, maxTxAmount);
        maxTxAmount = newValue;
    }
    function setMaxWalletAmount(uint256 newValue) external onlyOwner {
        require(newValue != maxWalletAmount,"DNA: Cannot update maxWalletAmount to same value");
        emit MaxWalletAmountChange(newValue, maxWalletAmount);
        maxWalletAmount = newValue;
    }
    function setMinimumTokensBeforeSwap(uint256 newValue) external onlyOwner {
        require(newValue != minimumTokensBeforeSwap,"DNA: Cannot update minimumTokensBeforeSwap to same value");
        emit MinTokenAmountBeforeSwapChange(newValue, minimumTokensBeforeSwap);
        minimumTokensBeforeSwap = newValue;
    }
    function setMinimumTokenBalanceForDividends(uint256 newValue) external onlyOwner {
        dividendTracker.setTokenBalanceForDividends(newValue);
    }
    function claim() external {
        dividendTracker.processAccount(payable(msg.sender), false);
    }
    function claimETHOverflow(uint256 amount) external onlyOwner {
        require(amount < address(this).balance, "DNA: Cannot send more than contract balance");
        (bool success, ) = address(owner()).call{ value: amount }("");
        if (success) {
            emit ClaimETHOverflow(amount);
        }
    }
    // Getters
    function getTotalDividendsDistributed() external view returns (uint256) {
        return dividendTracker.totalDividendsDistributed();
    }
    function withdrawableDividendOf(address account) external view returns (uint256) {
        return dividendTracker.withdrawableDividendOf(account);
    }
    function dividendTokenBalanceOf(address account) external view returns (uint256) {
        return dividendTracker.balanceOf(account);
    }
    function getNumberOfDividendTokenHolders() external view returns (uint256) {
        return dividendTracker.getNumberOfTokenHolders();
    }
    function getBaseBuyFees() external view returns (uint8,uint8,uint8,uint8,uint8,uint8) {
        return (_base.liquidityFeeOnBuy,_base.operationsFeeOnBuy,_base.buyBackFeeOnBuy,_base.treasuryFeeOnBuy,_base.WalletAFeeOnBuy, _base.holdersFeeOnBuy);
    }
    function getBaseSellFees() external view returns (uint8,uint8,uint8,uint8,uint8,uint8) {
        return (_base.liquidityFeeOnSell,_base.operationsFeeOnSell,_base.buyBackFeeOnSell,_base.treasuryFeeOnSell,_base.WalletAFeeOnSell, _base.holdersFeeOnSell);
    }
    // Main
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

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

        if (!_isAllowedToTradeWhenDisabled[from] && !_isAllowedToTradeWhenDisabled[to]) {
            require(isTradingEnabled, "DNA: Trading is currently disabled.");
            require(!_isBlocked[to], "DNA: Account is blocked");
            require(!_isBlocked[from], "DNA: Account is blocked");
            if (!_isExcludedFromMaxTransactionLimit[to] && !_isExcludedFromMaxTransactionLimit[from]) {
                require(amount <= maxTxAmount, "DNA: Buy amount exceeds the maxTxBuyAmount.");
            }
            if (!_isExcludedFromMaxWalletLimit[to]) {
                require((balanceOf(to) + amount) <= maxWalletAmount, "DNA: Expected wallet amount exceeds the maxWalletAmount.");
            }
        }

        _adjustTaxes(automatedMarketMakerPairs[from], automatedMarketMakerPairs[to], from, to);
        bool canSwap = balanceOf(address(this)) >= minimumTokensBeforeSwap;

        if (
            isTradingEnabled &&
            canSwap &&
            !_swapping &&
            _totalFee > 0 &&
            automatedMarketMakerPairs[to]
        ) {
            _swapping = true;
            _swapAndLiquify();
            _swapping = false;
        }

        bool takeFee = !_swapping && isTradingEnabled;

        if (_isExcludedFromFee[from] || _isExcludedFromFee[to]) {
            takeFee = false;
        }
        if (takeFee && _totalFee > 0) {
            uint256 fee = (amount * _totalFee) / 100;
            amount = amount - fee;
            super._transfer(from, address(this), fee);
        }
        super._transfer(from, to, amount);

        try dividendTracker.setBalance(payable(from), balanceOf(from)) {} catch {}
        try dividendTracker.setBalance(payable(to), balanceOf(to)) {} catch {}
    }
    function _adjustTaxes(bool isBuyFromLp,bool isSelltoLp,address from,address to) private {
        _liquidityFee = 0;
        _operationsFee = 0;
        _buyBackFee = 0;
        _treasuryFee = 0;
        _WalletAFee = 0;
        _holdersFee = 0;

        if (isBuyFromLp) {
            if (_isLaunched && block.number - _launchBlockNumber <= 5) {
                _liquidityFee = 100;
            } else {
                _liquidityFee = _base.liquidityFeeOnBuy;
                _operationsFee = _base.operationsFeeOnBuy;
                _buyBackFee = _base.buyBackFeeOnBuy;
                _treasuryFee = _base.treasuryFeeOnBuy;
                _WalletAFee = _base.WalletAFeeOnBuy;
                _holdersFee = _base.holdersFeeOnBuy;
            }
        }
        if (isSelltoLp) {
            _liquidityFee = _base.liquidityFeeOnSell;
            _operationsFee = _base.operationsFeeOnSell;
            _buyBackFee = _base.buyBackFeeOnSell;
            _treasuryFee = _base.treasuryFeeOnSell;
            _WalletAFee = _base.WalletAFeeOnSell;
            _holdersFee = _base.holdersFeeOnSell;
        }
        if (!isSelltoLp && !isBuyFromLp && (_feeOnSelectedWalletTransfers[from] || _feeOnSelectedWalletTransfers[to])) {
            _liquidityFee = _base.liquidityFeeOnBuy;
            _operationsFee = _base.operationsFeeOnBuy;
            _buyBackFee = _base.buyBackFeeOnBuy;
            _treasuryFee = _base.treasuryFeeOnBuy;
            _WalletAFee = _base.WalletAFeeOnSell;
            _holdersFee = _base.holdersFeeOnBuy;
        }
        _totalFee = _liquidityFee + _operationsFee + _buyBackFee + _treasuryFee + _WalletAFee + _holdersFee;
        emit FeesApplied(_liquidityFee, _operationsFee, _buyBackFee, _treasuryFee, _WalletAFee, _holdersFee, _totalFee);
    }
    function _setCustomSellTaxPeriod(CustomTaxPeriod storage map,uint8 _liquidityFeeOnSell,uint8 _operationsFeeOnSell,uint8 _buyBackFeeOnSell,uint8 _treasuryFeeOnSell,uint8 _WalletAFeeOnSell, uint8 _holdersFeeOnSell) private {
        if (map.liquidityFeeOnSell != _liquidityFeeOnSell) {
            emit CustomTaxPeriodChange(_liquidityFeeOnSell,map.liquidityFeeOnSell,"liquidityFeeOnSell",map.periodName);
            map.liquidityFeeOnSell = _liquidityFeeOnSell;
        }
        if (map.operationsFeeOnSell != _operationsFeeOnSell) {
            emit CustomTaxPeriodChange(_operationsFeeOnSell,map.operationsFeeOnSell,"operationsFeeOnSell",map.periodName);
            map.operationsFeeOnSell = _operationsFeeOnSell;
        }
        if (map.buyBackFeeOnSell != _buyBackFeeOnSell) {
            emit CustomTaxPeriodChange(_buyBackFeeOnSell,map.buyBackFeeOnSell,"buyBackFeeOnSell",map.periodName);
            map.buyBackFeeOnSell = _buyBackFeeOnSell;
        }
        if (map.treasuryFeeOnSell != _treasuryFeeOnSell) {
            emit CustomTaxPeriodChange(_treasuryFeeOnSell,map.treasuryFeeOnSell,"treasuryFeeOnSell",map.periodName);
            map.treasuryFeeOnSell = _treasuryFeeOnSell;
        }
        if (map.WalletAFeeOnSell != _WalletAFeeOnSell) {
            emit CustomTaxPeriodChange(_WalletAFeeOnSell,map.WalletAFeeOnSell,"WalletAFeeOnSell",map.periodName);
            map.WalletAFeeOnSell = _WalletAFeeOnSell;
        }
        if (map.holdersFeeOnSell != _holdersFeeOnSell) {
            emit CustomTaxPeriodChange(_holdersFeeOnSell,map.holdersFeeOnSell,"holdersFeeOnSell",map.periodName);
            map.holdersFeeOnSell = _holdersFeeOnSell;
        }
    }
    function _setCustomBuyTaxPeriod(CustomTaxPeriod storage map,uint8 _liquidityFeeOnBuy,uint8 _operationsFeeOnBuy,uint8 _buyBackFeeOnBuy,uint8 _treasuryFeeOnBuy, uint8 _WalletAFeeOnBuy, uint8 _holdersFeeOnBuy) private {
        if (map.liquidityFeeOnBuy != _liquidityFeeOnBuy) {
            emit CustomTaxPeriodChange(_liquidityFeeOnBuy,map.liquidityFeeOnBuy,"liquidityFeeOnBuy",map.periodName);
            map.liquidityFeeOnBuy = _liquidityFeeOnBuy;
        }
        if (map.operationsFeeOnBuy != _operationsFeeOnBuy) {
            emit CustomTaxPeriodChange(_operationsFeeOnBuy,map.operationsFeeOnBuy,"operationsFeeOnBuy",map.periodName);
            map.operationsFeeOnBuy = _operationsFeeOnBuy;
        }
        if (map.buyBackFeeOnBuy != _buyBackFeeOnBuy) {
            emit CustomTaxPeriodChange(_buyBackFeeOnBuy,map.buyBackFeeOnBuy,"buyBackFeeOnBuy",map.periodName);
            map.buyBackFeeOnBuy = _buyBackFeeOnBuy;
        }
        if (map.treasuryFeeOnBuy != _treasuryFeeOnBuy) {
            emit CustomTaxPeriodChange(_treasuryFeeOnBuy,map.treasuryFeeOnBuy,"treasuryFeeOnBuy",map.periodName);
            map.treasuryFeeOnBuy = _treasuryFeeOnBuy;
        }
        if (map.WalletAFeeOnBuy != _WalletAFeeOnBuy) {
            emit CustomTaxPeriodChange(_WalletAFeeOnBuy,map.WalletAFeeOnBuy,"WalletAFeeOnBuy",map.periodName);
            map.WalletAFeeOnBuy = _WalletAFeeOnBuy;
        }
        if (map.holdersFeeOnBuy != _holdersFeeOnBuy) {
            emit CustomTaxPeriodChange(_holdersFeeOnBuy,map.holdersFeeOnBuy,"holdersFeeOnBuy",map.periodName);
            map.holdersFeeOnBuy = _holdersFeeOnBuy;
        }
    }

    function _swapAndLiquify() private {
        uint256 contractBalance = balanceOf(address(this));
        uint256 initialETHBalance = address(this).balance;

        uint256 amountToLiquify = (contractBalance * _liquidityFee) / _totalFee / 2;
        uint256 amountToSwap = contractBalance - amountToLiquify;

        _swapTokensForETH(amountToSwap);

        uint256 ETHBalanceAfterSwap = address(this).balance - initialETHBalance;
        uint256 totalETHFee = _totalFee - (_liquidityFee / 2);
        uint256 amountETHLiquidity = (ETHBalanceAfterSwap * _liquidityFee) / totalETHFee / 2;
        uint256 amountETHOperations = (ETHBalanceAfterSwap * _operationsFee) / totalETHFee;
        uint256 amountETHBuyBack = (ETHBalanceAfterSwap * _buyBackFee) / totalETHFee;
        uint256 amountETHTreasury = (ETHBalanceAfterSwap * _treasuryFee) / totalETHFee;
        uint256 amountETHWalletA = (ETHBalanceAfterSwap * _WalletAFee) / totalETHFee;
        uint256 amountETHHolders = ETHBalanceAfterSwap - (amountETHLiquidity + amountETHBuyBack + amountETHOperations + amountETHTreasury + amountETHWalletA);

        Address.sendValue(payable(operationsWallet),amountETHOperations);
        Address.sendValue(payable(buyBackWallet),amountETHBuyBack);
        Address.sendValue(payable(treasuryWallet),amountETHTreasury);
        Address.sendValue(payable(WalletAWallet), amountETHWalletA);

        if (amountToLiquify > 0) {
            _addLiquidity(amountToLiquify, amountETHLiquidity);
            emit SwapAndLiquify(amountToSwap, amountETHLiquidity, amountToLiquify);
        }

        (bool success, ) = address(dividendTracker).call{ value: amountETHHolders }("");
        if (success) {
            emit DividendsSent(amountETHHolders);
        }
    }

    function _swapTokensForETH(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            1, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }

    function _addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        uniswapV2Router.addLiquidityETH{ value: ethAmount }(
            address(this),
            tokenAmount,
            1, // slippage is unavoidable
            1, // slippage is unavoidable
            liquidityWallet,
            block.timestamp
        );
    }
}

contract DNADividendTracker is DividendPayingToken {
    using SafeMath for uint256;
    using SafeMathInt for int256;
    using IterableMapping for IterableMapping.Map;

    IterableMapping.Map private tokenHoldersMap;

    mapping(address => bool) public excludedFromDividends;
    mapping(address => uint256) public lastClaimTimes;
    uint256 public claimWait;
    uint256 public minimumTokenBalanceForDividends;

    event ExcludeFromDividends(address indexed account);
    event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue);
    event Claim(address indexed account, uint256 amount, bool indexed automatic);

    constructor() DividendPayingToken("DNA_Dividend_Tracker", "DNA_Dividend_Tracker") {
        claimWait = 3600;
        minimumTokenBalanceForDividends = 0 * (10**18);
    }
    function _transfer(
        address,
        address,
        uint256
    ) internal pure override {
        require(false, "DNA_Dividend_Tracker: No transfers allowed");
    }
    function excludeFromDividends(address account) external onlyOwner {
        require(!excludedFromDividends[account]);
        excludedFromDividends[account] = true;
        _setBalance(account, 0);
        tokenHoldersMap.remove(account);
        emit ExcludeFromDividends(account);
    }
    function setTokenBalanceForDividends(uint256 newValue) external onlyOwner {
        require(
            minimumTokenBalanceForDividends != newValue,
            "DNA_Dividend_Tracker: minimumTokenBalanceForDividends already the value of 'newValue'."
        );
        minimumTokenBalanceForDividends = newValue;
    }
    function getNumberOfTokenHolders() external view returns (uint256) {
        return tokenHoldersMap.keys.length;
    }
    function setBalance(address payable account, uint256 newBalance) external onlyOwner {
        if (excludedFromDividends[account]) {
            return;
        }
        if (newBalance >= minimumTokenBalanceForDividends) {
            _setBalance(account, newBalance);
            tokenHoldersMap.set(account, newBalance);
        } else {
            _setBalance(account, 0);
            tokenHoldersMap.remove(account);
        }
        processAccount(account, true);
    }
    function processAccount(address payable account, bool automatic)
        public
        onlyOwner
        returns (bool)
    {
        uint256 amount = _withdrawDividendOfUser(account);
        if (amount > 0) {
            lastClaimTimes[account] = block.timestamp;
            emit Claim(account, amount, automatic);
            return true;
        }
        return false;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"AllowedWhenTradingDisabledChange","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":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"AutomatedMarketMakerPairChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"holder","type":"address"},{"indexed":true,"internalType":"bool","name":"status","type":"bool"}],"name":"BlockedAccountChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ClaimETHOverflow","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"},{"indexed":true,"internalType":"string","name":"taxType","type":"string"},{"indexed":false,"internalType":"bytes23","name":"period","type":"bytes23"}],"name":"CustomTaxPeriodChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"}],"name":"DividendsSent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFeesChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromMaxTransferChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromMaxWalletChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"identifier","type":"string"},{"indexed":false,"internalType":"uint8","name":"liquidityFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"operationsFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"buyBackFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"treasuryFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"WalletAFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"holdersFee","type":"uint8"}],"name":"FeeChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"newValue","type":"bool"}],"name":"FeeOnSelectedWalletTransfersChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"liquidityFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"operationsFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"buyBackFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"treasuryFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"WalletAFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"holdersFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"totalFee","type":"uint8"}],"name":"FeesApplied","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"MaxTransactionAmountChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"MaxWalletAmountChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"MinTokenAmountBeforeSwapChange","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":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UniswapV2RouterChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"indentifier","type":"string"},{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"WalletChange","type":"event"},{"inputs":[],"name":"WalletAWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activateTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"allowed","type":"bool"}],"name":"allowTradingWhenDisabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"blockAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyBackWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"claimETHOverflow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deactivateTrading","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 DNADividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromMaxTransactionLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromMaxWalletLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getBaseBuyFees","outputs":[{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBaseSellFees","outputs":[{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfDividendTokenHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"initialSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isTradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTokensBeforeSwap","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":"operationsWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_liquidityFeeOnBuy","type":"uint8"},{"internalType":"uint8","name":"_operationsFeeOnBuy","type":"uint8"},{"internalType":"uint8","name":"_buyBackFeeOnBuy","type":"uint8"},{"internalType":"uint8","name":"_treasuryFeeOnBuy","type":"uint8"},{"internalType":"uint8","name":"_WalletAFeeOnBuy","type":"uint8"},{"internalType":"uint8","name":"_holdersFeeOnBuy","type":"uint8"}],"name":"setBaseFeesOnBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_liquidityFeeOnSell","type":"uint8"},{"internalType":"uint8","name":"_operationsFeeOnSell","type":"uint8"},{"internalType":"uint8","name":"_buyBackFeeOnSell","type":"uint8"},{"internalType":"uint8","name":"_treasuryFeeOnSell","type":"uint8"},{"internalType":"uint8","name":"_WalletAFeeOnSell","type":"uint8"},{"internalType":"uint8","name":"_holdersFeeOnSell","type":"uint8"}],"name":"setBaseFeesOnSell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setFeeOnSelectedWalletTransfers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setMaxTransactionAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setMinimumTokenBalanceForDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setMinimumTokensBeforeSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"setUniswapRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newLiquidityWallet","type":"address"},{"internalType":"address","name":"newOperationsWallet","type":"address"},{"internalType":"address","name":"newBuyBackWallet","type":"address"},{"internalType":"address","name":"newTreasuryWallet","type":"address"},{"internalType":"address","name":"newWalletAWallet","type":"address"}],"name":"setWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"unblockAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IRouter","name":"","type":"address"}],"stateMutability":"view","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"}]

60a06040526d314dc6448d9338c15b0a000000006008556127106008546127106200002b919062000ad5565b62000037919062000aef565b600a556127106008546127106200004f919062000ad5565b6200005b919062000aef565b600b55620186a0600854601962000073919062000ad5565b6200007f919062000aef565b600d55604080516101e081018252636261736560e01b8152600060208201819052918101829052600260608201819052600460808301819052600160a0840181905260c0840182905260e084018390526003610100850152610120840181905261014084019190915261016083018190526101808301526101a082015260056101c090910152601380546001600160c01b031916636261736560981b179055601455601580546b0502010104010302040104026001600160601b03199091161790553480156200014e57600080fd5b5060405180604001604052806009815260200168222720902a37b5b2b760b91b81525060405180604001604052806003815260200162444e4160e81b81525060006200019f620007be60201b60201c565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506004620001f7838262000bb6565b50600562000206828262000bb6565b505050604051620002179062000ab1565b604051809103906000f08015801562000234573d6000803e3d6000fd5b50600780546001600160a01b039283166001600160a01b03199182161790915560008054600e8054841691909416908117909355600f805483168417905560108054831684179055601180548316841790556012805490921690921790556040805163c45a015560e01b81529051737a250d5630b4cf539739df2c5dacb4c659f2488d9291839163c45a0155916004808201926020929091908290030181865afa158015620002e7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200030d919062000c82565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200035b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000381919062000c82565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015620003cf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003f5919062000c82565b600680546001600160a01b0319166001600160a01b03858116919091179091558116608052905062000429816001620007d1565b6001601c6000620004426000546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff19968716179055308152601c9093528183208054851660019081179091556007805483168552938390208054909516179093559054905163031e79db60e41b8152911660048201819052906331e79db090602401600060405180830381600087803b158015620004d857600080fd5b505af1158015620004ed573d6000803e3d6000fd5b505060075460405163031e79db60e41b81523060048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b1580156200053757600080fd5b505af11580156200054c573d6000803e3d6000fd5b505060075460405163031e79db60e41b815261dead60048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b1580156200059857600080fd5b505af1158015620005ad573d6000803e3d6000fd5b50506007546001600160a01b031691506331e79db09050620005d76000546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b1580156200061957600080fd5b505af11580156200062e573d6000803e3d6000fd5b505060075460405163031e79db60e41b81526001600160a01b03868116600483015290911692506331e79db09150602401600060405180830381600087803b1580156200067a57600080fd5b505af11580156200068f573d6000803e3d6000fd5b505050506001601a6000620006a9620007c260201b60201c565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff1996871617905530808252601a85528382208054871660019081179091556007805485168452601d8752858420805489168317905582845285842080548916831790558885168452601e96879052858420805489168317905554841683528483208054881682179055600654909316825283822080548716841790558152918220805490941681179093556200076e6000546001600160a01b031690565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055620007b6620007ad6000546001600160a01b031690565b60085462000939565b505062000cc3565b3390565b6000546001600160a01b031690565b6001600160a01b0382166000908152601f602052604090205481151560ff9091161515036200086d5760405162461bcd60e51b815260206004820152603d60248201527f444e413a204175746f6d61746564206d61726b6574206d616b6572207061697260448201527f20697320616c72656164792073657420746f20746861742076616c756500000060648201526084015b60405180910390fd5b6001600160a01b0382166000908152601f60205260409020805460ff19168215801591909117909155620008fd5760075460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b158015620008e357600080fd5b505af1158015620008f8573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fa666b9b2dc2c8f2d86fda7ba3a115be30d3a958fd84d359cbc6bc919df97990a90600090a35050565b6001600160a01b038216620009915760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000864565b620009ad8160035462000a4560201b6200213e1790919060201c565b6003556001600160a01b038216600090815260016020908152604090912054620009e29183906200213e62000a45821b17901c565b6001600160a01b0383166000818152600160205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9062000a349085815260200190565b60405180910390a35050565b505050565b60008062000a54838562000cad565b90508381101562000aa85760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640162000864565b90505b92915050565b611c5e8062004e1083390190565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141762000aab5762000aab62000abf565b60008262000b0d57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168062000b3d57607f821691505b60208210810362000b5e57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000a4057600081815260208120601f850160051c8101602086101562000b8d5750805b601f850160051c820191505b8181101562000bae5782815560010162000b99565b505050505050565b81516001600160401b0381111562000bd25762000bd262000b12565b62000bea8162000be3845462000b28565b8462000b64565b602080601f83116001811462000c22576000841562000c095750858301515b600019600386901b1c1916600185901b17855562000bae565b600085815260208120601f198616915b8281101562000c535788860151825594840194600190910190840162000c32565b508582101562000c725787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121562000c9557600080fd5b81516001600160a01b038116811462000aa857600080fd5b8082018082111562000aab5762000aab62000abf565b60805161413162000cdf600039600061061201526141316000f3fe6080604052600436106103395760003560e01c80636843cd84116101ab578063a9059cbb116100f7578063d2d7ad8311610095578063dd62ed3e1161006f578063dd62ed3e146109d0578063f2fde38b14610a16578063fd72e22a14610a36578063fe01753514610a5657600080fd5b8063d2d7ad831461097a578063d322157614610990578063d4698016146109b057600080fd5b8063b62496f5116100d1578063b62496f514610888578063bea9849e146108b8578063c0246668146108d8578063cd43e228146108f857600080fd5b8063a9059cbb14610832578063aa4bde2814610852578063aee50b1e1461086857600080fd5b806382528791116101645780638da5cb5b1161013e5780638da5cb5b146107bf57806395d89b41146107dd578063a457c2d7146107f2578063a8b9d2401461081257600080fd5b80638252879114610769578063880bcbc1146107895780638c0b5e22146107a957600080fd5b80636843cd841461069e5780636b6d37c5146106be57806370a08231146106de578063715018a614610714578063781edb3c146107295780637c0a893d1461074957600080fd5b806330bb4cff1161028557806345ea4ed2116102235780634d78fdc6116101fd5780634d78fdc6146106345780634e71d92d146106545780635ebf4db91461066957806364b0f6531461068957600080fd5b806345ea4ed2146105c05780634626402b146105e057806349bd5a5e1461060057600080fd5b806334cf1fea1161025f57806334cf1fea14610555578063378dc3dc1461056a578063395093511461058057806345a42329146105a057600080fd5b806330bb4cff14610504578063313ce5671461051957806331e79db01461053557600080fd5b80631694505e116102f25780631e293c10116102cc5780631e293c101461048457806323b872dd146104a457806327a14fc2146104c45780632c1f5216146104e457600080fd5b80631694505e1461042557806318160ddd146104455780631cd348c01461046457600080fd5b8063064a59d01461034557806306fdde0314610374578063095ea7b314610396578063098df585146103b65780630a159be0146103d85780630bd05b691461041057600080fd5b3661034057005b600080fd5b34801561035157600080fd5b5060095461035f9060ff1681565b60405190151581526020015b60405180910390f35b34801561038057600080fd5b50610389610aa5565b60405161036b9190613a9c565b3480156103a257600080fd5b5061035f6103b1366004613aff565b610b37565b3480156103c257600080fd5b506103d66103d1366004613b2b565b610b4e565b005b3480156103e457600080fd5b506012546103f8906001600160a01b031681565b6040516001600160a01b03909116815260200161036b565b34801561041c57600080fd5b506103d6610c78565b34801561043157600080fd5b506006546103f8906001600160a01b031681565b34801561045157600080fd5b506003545b60405190815260200161036b565b34801561047057600080fd5b506010546103f8906001600160a01b031681565b34801561049057600080fd5b506103d661049f366004613b2b565b610cd1565b3480156104b057600080fd5b5061035f6104bf366004613b44565b610d94565b3480156104d057600080fd5b506103d66104df366004613b2b565b610dfd565b3480156104f057600080fd5b506007546103f8906001600160a01b031681565b34801561051057600080fd5b50610456610ec4565b34801561052557600080fd5b506040516012815260200161036b565b34801561054157600080fd5b506103d6610550366004613b85565b610f37565b34801561056157600080fd5b506103d6610fc4565b34801561057657600080fd5b5061045660085481565b34801561058c57600080fd5b5061035f61059b366004613aff565b610ffa565b3480156105ac57600080fd5b506103d66105bb366004613bb0565b611030565b3480156105cc57600080fd5b506103d66105db366004613bff565b611148565b3480156105ec57600080fd5b506011546103f8906001600160a01b031681565b34801561060c57600080fd5b506103f87f000000000000000000000000000000000000000000000000000000000000000081565b34801561064057600080fd5b506103d661064f366004613b85565b61120a565b34801561066057600080fd5b506103d66112e9565b34801561067557600080fd5b506103d6610684366004613b2b565b611361565b34801561069557600080fd5b506104566113bc565b3480156106aa57600080fd5b506104566106b9366004613b85565b611406565b3480156106ca57600080fd5b506103d66106d9366004613bff565b611476565b3480156106ea57600080fd5b506104566106f9366004613b85565b6001600160a01b031660009081526001602052604090205490565b34801561072057600080fd5b506103d66114cd565b34801561073557600080fd5b506103d6610744366004613bb0565b611541565b34801561075557600080fd5b506103d6610764366004613b85565b611603565b34801561077557600080fd5b506103d6610784366004613c73565b611762565b34801561079557600080fd5b506103d66107a4366004613bb0565b611be6565b3480156107b557600080fd5b50610456600b5481565b3480156107cb57600080fd5b506000546001600160a01b03166103f8565b3480156107e957600080fd5b50610389611ca8565b3480156107fe57600080fd5b5061035f61080d366004613aff565b611cb7565b34801561081e57600080fd5b5061045661082d366004613b85565b611d06565b34801561083e57600080fd5b5061035f61084d366004613aff565b611d39565b34801561085e57600080fd5b50610456600a5481565b34801561087457600080fd5b506103d6610883366004613b2b565b611d46565b34801561089457600080fd5b5061035f6108a3366004613b85565b601f6020526000908152604090205460ff1681565b3480156108c457600080fd5b506103d66108d3366004613b85565b611e1a565b3480156108e457600080fd5b506103d66108f3366004613bb0565b611f10565b34801561090457600080fd5b5060155460ff80821691620100008104821691600160201b8204811691600160301b8104821691600160401b8204811691600160501b9004165b6040805160ff978816815295871660208701529386169385019390935290841660608401528316608083015290911660a082015260c00161036b565b34801561098657600080fd5b50610456600d5481565b34801561099c57600080fd5b506103d66109ab366004613bb0565b611fd2565b3480156109bc57600080fd5b50600e546103f8906001600160a01b031681565b3480156109dc57600080fd5b506104566109eb366004613ce4565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b348015610a2257600080fd5b506103d6610a31366004613b85565b612054565b348015610a4257600080fd5b50600f546103f8906001600160a01b031681565b348015610a6257600080fd5b5060155460ff610100820481169163010000008104821691600160281b8204811691600160381b8104821691600160481b8204811691600160581b90041661093e565b606060048054610ab490613d12565b80601f0160208091040260200160405190810160405280929190818152602001828054610ae090613d12565b8015610b2d5780601f10610b0257610100808354040283529160200191610b2d565b820191906000526020600020905b815481529060010190602001808311610b1057829003601f168201915b5050505050905090565b6000610b443384846121a4565b5060015b92915050565b6000546001600160a01b03163314610b815760405162461bcd60e51b8152600401610b7890613d4c565b60405180910390fd5b478110610be45760405162461bcd60e51b815260206004820152602b60248201527f444e413a2043616e6e6f742073656e64206d6f7265207468616e20636f6e747260448201526a6163742062616c616e636560a81b6064820152608401610b78565b600080546040516001600160a01b039091169083908381818185875af1925050503d8060008114610c31576040519150601f19603f3d011682016040523d82523d6000602084013e610c36565b606091505b505090508015610c74576040518281527f362ae087cf4ccfc970d45b9e8ce6520f03b4eda3f9d76a70b655dc22badcca489060200160405180910390a15b5050565b6000546001600160a01b03163314610ca25760405162461bcd60e51b8152600401610b7890613d4c565b6009805460ff19166001179055601854600003610ccf5743601855426017556016805460ff191660011790555b565b6000546001600160a01b03163314610cfb5760405162461bcd60e51b8152600401610b7890613d4c565b600b548103610d615760405162461bcd60e51b815260206004820152602c60248201527f444e413a2043616e6e6f7420757064617465206d61785478416d6f756e74207460448201526b6f2073616d652076616c756560a01b6064820152608401610b78565b600b5460405182907f75f1c17bf623f0f7a2bd91ba61e89dff216960370e3e9a46b250750d03e4215e90600090a3600b55565b6000610da18484846122c9565b610df38433610dee8560405180606001604052806028815260200161408f602891396001600160a01b038a16600090815260026020908152604080832033845290915290205491906128bb565b6121a4565b5060019392505050565b6000546001600160a01b03163314610e275760405162461bcd60e51b8152600401610b7890613d4c565b600a548103610e915760405162461bcd60e51b815260206004820152603060248201527f444e413a2043616e6e6f7420757064617465206d617857616c6c6574416d6f7560448201526f6e7420746f2073616d652076616c756560801b6064820152608401610b78565b600a5460405182907f6d3e257c59a11116c3e97bb144abf5ba1a6a9da6bd509192ecf0d48f7be1fc7690600090a3600a55565b600754604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015610f0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f329190613d81565b905090565b6000546001600160a01b03163314610f615760405162461bcd60e51b8152600401610b7890613d4c565b60075460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024015b600060405180830381600087803b158015610fa957600080fd5b505af1158015610fbd573d6000803e3d6000fd5b5050505050565b6000546001600160a01b03163314610fee5760405162461bcd60e51b8152600401610b7890613d4c565b6009805460ff19169055565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610b44918590610dee908661213e565b6000546001600160a01b0316331461105a5760405162461bcd60e51b8152600401610b7890613d4c565b6001600160a01b0382166000908152601b602052604090205481151560ff9091161515036110e85760405162461bcd60e51b815260206004820152603560248201527f444e413a205468652073656c65637465642077616c6c657420697320616c7265604482015274030b23c9039b2ba103a37903a3432903b30b63ab29605d1b6064820152608401610b78565b6001600160a01b0382166000818152601b6020908152604091829020805460ff191685151590811790915591519182527fe70512a569cf898db2e20aa3b4cc3f0dd13377b82a493840d326ab5a1966687791015b60405180910390a25050565b6000546001600160a01b031633146111725760405162461bcd60e51b8152600401610b7890613d4c565b61118260138787878787876128f5565b6040516c18985cd95199595ccb54d95b1b609a1b8152600d015b6040805191829003822060ff898116845288811660208501528781168484015286811660608501528581166080850152841660a0840152905190917fc5b0189242ee94396fea9d585d7b5ec493a5a69180d0793c05f7525862878af3919081900360c00190a2505050505050565b6000546001600160a01b031633146112345760405162461bcd60e51b8152600401610b7890613d4c565b6001600160a01b03811660009081526019602052604090205460ff1661129c5760405162461bcd60e51b815260206004820152601b60248201527f444e413a204163636f756e74206973206e6f7420626c636f6b656400000000006044820152606401610b78565b6001600160a01b038116600081815260196020526040808220805460ff19169055519091907f2f092974a5a89dc001cc04aa60bc3afe575e0b7444ef2197f7bb5714b51528ba908390a350565b60075460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af115801561133a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061135e9190613d9a565b50565b6000546001600160a01b0316331461138b5760405162461bcd60e51b8152600401610b7890613d4c565b60075460405163163c7cef60e01b8152600481018390526001600160a01b039091169063163c7cef90602401610f8f565b600754604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015610f0e573d6000803e3d6000fd5b6007546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa158015611452573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b489190613d81565b6000546001600160a01b031633146114a05760405162461bcd60e51b8152600401610b7890613d4c565b6114b06013878787878787612c90565b6040516b62617365466565732d42757960a01b8152600c0161119c565b6000546001600160a01b031633146114f75760405162461bcd60e51b8152600401610b7890613d4c565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b0316331461156b5760405162461bcd60e51b8152600401610b7890613d4c565b6001600160a01b0382166000908152601e602052604090205481151560ff9091161515036115ab5760405162461bcd60e51b8152600401610b7890613db7565b6001600160a01b0382166000818152601e6020908152604091829020805460ff191685151590811790915591519182527ff5133f371b17bf21ce0df4ae2c1b6e11ca7c2f27257eb55282edb1ccfd4ecb2e910161113c565b6000546001600160a01b0316331461162d5760405162461bcd60e51b8152600401610b7890613d4c565b6001600160a01b03811660009081526019602052604090205460ff16156116965760405162461bcd60e51b815260206004820152601f60248201527f444e413a204163636f756e7420697320616c726561647920626c6f636b6564006044820152606401610b78565b60165460ff1615611710576202a300601754426116b39190613e1c565b106117105760405162461bcd60e51b815260206004820152602760248201527f444e413a2054696d6520746f20626c6f636b206163636f756e74732068617320604482015266195e1c1a5c995960ca1b6064820152608401610b78565b6001600160a01b038116600081815260196020526040808220805460ff1916600190811790915590519092917f2f092974a5a89dc001cc04aa60bc3afe575e0b7444ef2197f7bb5714b51528ba91a350565b6000546001600160a01b0316331461178c5760405162461bcd60e51b8152600401610b7890613d4c565b600e546001600160a01b0386811691161461186a576001600160a01b0385166118035760405162461bcd60e51b8152602060048201526024808201527f444e413a20546865206c697175696469747957616c6c65742063616e6e6f74206044820152630626520360e41b6064820152608401610b78565b600e546040516e1b1a5c5d5a591a5d1e55d85b1b195d608a1b81526001600160a01b0391821691871690600f016040519081900381209060008051602061406f83398151915290600090a4600e80546001600160a01b0319166001600160a01b0387161790555b600f546001600160a01b0385811691161461194b576001600160a01b0384166118e35760405162461bcd60e51b815260206004820152602560248201527f444e413a20546865206f7065726174696f6e7357616c6c65742063616e6e6f74604482015264020626520360dc1b6064820152608401610b78565b600f546040516f1bdc195c985d1a5bdb9cd5d85b1b195d60821b81526001600160a01b03918216918616906010016040519081900381209060008051602061406f83398151915290600090a4600f80546001600160a01b0319166001600160a01b0386161790555b6010546001600160a01b03848116911614611a26576001600160a01b0383166119c15760405162461bcd60e51b815260206004820152602260248201527f444e413a20546865206275794261636b57616c6c65742063616e6e6f74206265604482015261020360f41b6064820152608401610b78565b6010546040516c189d5e509858dad5d85b1b195d609a1b81526001600160a01b0391821691851690600d016040519081900381209060008051602061406f83398151915290600090a4601080546001600160a01b0319166001600160a01b0385161790555b6011546001600160a01b03838116911614611b03576001600160a01b038216611a9d5760405162461bcd60e51b815260206004820152602360248201527f444e413a2054686520747265617375727957616c6c65742063616e6e6f74206260448201526206520360ec1b6064820152608401610b78565b6011546040516d1d1c99585cdd5c9e55d85b1b195d60921b81526001600160a01b0391821691841690600e016040519081900381209060008051602061406f83398151915290600090a4601180546001600160a01b0319166001600160a01b0384161790555b6012546001600160a01b03828116911614610fbd576001600160a01b038116611b795760405162461bcd60e51b815260206004820152602260248201527f444e413a205468652057616c6c65744157616c6c65742063616e6e6f74206265604482015261020360f41b6064820152608401610b78565b6012546040516c15d85b1b195d1055d85b1b195d609a1b81526001600160a01b0391821691831690600d016040519081900381209060008051602061406f83398151915290600090a4601280546001600160a01b0383166001600160a01b03199091161790555050505050565b6000546001600160a01b03163314611c105760405162461bcd60e51b8152600401610b7890613d4c565b6001600160a01b0382166000908152601d602052604090205481151560ff909116151503611c505760405162461bcd60e51b8152600401610b7890613db7565b6001600160a01b0382166000818152601d6020908152604091829020805460ff191685151590811790915591519182527f30098fc83ab61b1a98835d32c4e611adedccfc260eeef586bd329d48e8a40a40910161113c565b606060058054610ab490613d12565b6000610b443384610dee856040518060600160405280602581526020016140d7602591393360009081526002602090815260408083206001600160a01b038d16845290915290205491906128bb565b6007546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d24090602401611435565b6000610b443384846122c9565b6000546001600160a01b03163314611d705760405162461bcd60e51b8152600401610b7890613d4c565b600d548103611de75760405162461bcd60e51b815260206004820152603860248201527f444e413a2043616e6e6f7420757064617465206d696e696d756d546f6b656e7360448201527f4265666f72655377617020746f2073616d652076616c756500000000000000006064820152608401610b78565b600d5460405182907f5b0491f767c1463bea8972339f785795be1a38784cc6483cf649cdcbb28c46b090600090a3600d55565b6000546001600160a01b03163314611e445760405162461bcd60e51b8152600401610b7890613d4c565b6006546001600160a01b0390811690821603611eb35760405162461bcd60e51b815260206004820152602860248201527f444e413a2054686520726f7574657220616c7265616479206861732074686174604482015267206164647265737360c01b6064820152608401610b78565b6006546040516001600160a01b03918216918316907f2afbff3ed601a8723765c7072d8ea8445e08f6f1874afd34a2b747a272c3ebad90600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314611f3a5760405162461bcd60e51b8152600401610b7890613d4c565b6001600160a01b0382166000908152601c602052604090205481151560ff909116151503611f7a5760405162461bcd60e51b8152600401610b7890613db7565b6001600160a01b0382166000818152601c6020908152604091829020805460ff191685151590811790915591519182527fa856ba9fdc54a5434b2359874c95612f520a2d7f858864ae98d15c1b2099ca8b910161113c565b6000546001600160a01b03163314611ffc5760405162461bcd60e51b8152600401610b7890613d4c565b6001600160a01b0382166000818152601a6020908152604091829020805460ff191685151590811790915591519182527fcb9f97b7b4b41413e5c8d418a8cf9a88db1cf34dee66b213d070faf881d9d350910161113c565b6000546001600160a01b0316331461207e5760405162461bcd60e51b8152600401610b7890613d4c565b6001600160a01b0381166120e35760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b78565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60008061214b8385613e2f565b90508381101561219d5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610b78565b9392505050565b6001600160a01b0383166122065760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610b78565b6001600160a01b0382166122675760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610b78565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166122ef5760405162461bcd60e51b8152600401610b7890613e42565b6001600160a01b0382166123155760405162461bcd60e51b8152600401610b7890613e87565b8060000361232e5761232983836000613012565b505050565b6001600160a01b0383166000908152601a602052604090205460ff1615801561237057506001600160a01b0382166000908152601a602052604090205460ff16155b156126075760095460ff166123d35760405162461bcd60e51b815260206004820152602360248201527f444e413a2054726164696e672069732063757272656e746c792064697361626c60448201526232b21760e91b6064820152608401610b78565b6001600160a01b03821660009081526019602052604090205460ff16156124365760405162461bcd60e51b81526020600482015260176024820152761113904e881058d8dbdd5b9d081a5cc8189b1bd8dad959604a1b6044820152606401610b78565b6001600160a01b03831660009081526019602052604090205460ff16156124995760405162461bcd60e51b81526020600482015260176024820152761113904e881058d8dbdd5b9d081a5cc8189b1bd8dad959604a1b6044820152606401610b78565b6001600160a01b0382166000908152601d602052604090205460ff161580156124db57506001600160a01b0383166000908152601d602052604090205460ff16155b1561254657600b548111156125465760405162461bcd60e51b815260206004820152602b60248201527f444e413a2042757920616d6f756e74206578636565647320746865206d61785460448201526a3c213abca0b6b7bab73a1760a91b6064820152608401610b78565b6001600160a01b0382166000908152601e602052604090205460ff1661260757600a5481612589846001600160a01b031660009081526001602052604090205490565b6125939190613e2f565b11156126075760405162461bcd60e51b815260206004820152603860248201527f444e413a2045787065637465642077616c6c657420616d6f756e74206578636560448201527f65647320746865206d617857616c6c6574416d6f756e742e00000000000000006064820152608401610b78565b6001600160a01b038084166000908152601f602052604080822054928516825290205461263c9160ff9081169116858561311e565b600d54306000908152600160205260409020546009549111159060ff1680156126625750805b80156126715750600c5460ff16155b80156126885750602054600160301b900460ff1615155b80156126ac57506001600160a01b0383166000908152601f602052604090205460ff165b156126d157600c805460ff191660011790556126c6613488565b600c805460ff191690555b600c5460009060ff161580156126e9575060095460ff165b6001600160a01b0386166000908152601c602052604090205490915060ff168061272b57506001600160a01b0384166000908152601c602052604090205460ff165b15612734575060005b80801561274c5750602054600160301b900460ff1615155b156127935760205460009060649061276e90600160301b900460ff1686613eca565b6127789190613ef7565b90506127848185613e1c565b9350612791863083613012565b505b61279e858585613012565b6007546001600160a01b031663e30443bc866127cf816001600160a01b031660009081526001602052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561281557600080fd5b505af1925050508015612826575060015b506007546001600160a01b031663e30443bc85612858816001600160a01b031660009081526001602052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561289e57600080fd5b505af19250505080156128af575060015b15610fbd575050505050565b600081848411156128df5760405162461bcd60e51b8152600401610b789190613a9c565b5060006128ec8486613e1c565b95945050505050565b600287015460ff878116610100909204161461298657604051711b1a5c5d5a591a5d1e51995953db94d95b1b60721b815260120160405190819003812060028901548954919260ff610100909204821692918a16916000805160206140b7833981519152916129679160481b90613f0b565b60405180910390a460028701805461ff00191661010060ff8916021790555b600287015460ff86811663010000009092041614612a2057604051721bdc195c985d1a5bdb9cd1995953db94d95b1b606a1b815260130160405190819003812060028901548954919260ff6301000000909204821692918916916000805160206140b7833981519152916129fd9160481b90613f0b565b60405180910390a460028701805463ff0000001916630100000060ff8816021790555b600287015460ff858116600160281b9092041614612ab7576040516f189d5e509858dad1995953db94d95b1b60821b815260100160405190819003812060028901548954919260ff600160281b909204821692918816916000805160206140b783398151915291612a949160481b90613f0b565b60405180910390a460028701805460ff60281b1916600160281b60ff8716021790555b600287015460ff848116600160381b9092041614612b5357604051701d1c99585cdd5c9e51995953db94d95b1b607a1b815260110160405190819003812060028901548954919260ff600160381b909204821692918716916000805160206140b783398151915291612b2c9160481b90613f0b565b60405180910390a460028701805467ff000000000000001916600160381b60ff8616021790555b600287015460ff838116600160481b9092041614612bf0576040516f15d85b1b195d1051995953db94d95b1b60821b815260100160405190819003812060028901548954919260ff600160481b909204821692918616916000805160206140b783398151915291612bc79160481b90613f0b565b60405180910390a460028701805469ff0000000000000000001916600160481b60ff8516021790555b600287015460ff828116600160581b9092041614612c87576040516f1a1bdb19195c9cd1995953db94d95b1b60821b815260100160405190819003812060028901548954919260ff600160581b909204821692918516916000805160206140b783398151915291612c649160481b90613f0b565b60405180910390a460028701805460ff60581b1916600160581b60ff8416021790555b50505050505050565b600287015460ff878116911614612d1157604051706c69717569646974794665654f6e42757960781b815260110160405190819003812060028901548954919260ff91821692918a16916000805160206140b783398151915291612cf79160481b90613f0b565b60405180910390a460028701805460ff191660ff88161790555b600287015460ff868116620100009092041614612da657604051716f7065726174696f6e734665654f6e42757960701b815260120160405190819003812060028901548954919260ff62010000909204821692918916916000805160206140b783398151915291612d859160481b90613f0b565b60405180910390a460028701805462ff000019166201000060ff8816021790555b600287015460ff858116600160201b9092041614612e3d576040516e6275794261636b4665654f6e42757960881b8152600f0160405190819003812060028901548954919260ff600160201b909204821692918816916000805160206140b783398151915291612e199160481b90613f0b565b60405180910390a460028701805464ff000000001916600160201b60ff8716021790555b600287015460ff848116600160301b9092041614612ed7576040516f74726561737572794665654f6e42757960801b815260100160405190819003812060028901548954919260ff600160301b909204821692918716916000805160206140b783398151915291612eb19160481b90613f0b565b60405180910390a460028701805466ff0000000000001916600160301b60ff8616021790555b600287015460ff838116600160401b9092041614612f72576040516e57616c6c6574414665654f6e42757960881b8152600f0160405190819003812060028901548954919260ff600160401b909204821692918616916000805160206140b783398151915291612f4a9160481b90613f0b565b60405180910390a460028701805468ff00000000000000001916600160401b60ff8516021790555b600287015460ff828116600160501b9092041614612c87576040516e686f6c646572734665654f6e42757960881b8152600f0160405190819003812060028901548954919260ff600160501b909204821692918516916000805160206140b783398151915291612fe59160481b90613f0b565b60405180910390a460028701805460ff8316600160501b0260ff60501b1990911617905550505050505050565b6001600160a01b0383166130385760405162461bcd60e51b8152600401610b7890613e42565b6001600160a01b03821661305e5760405162461bcd60e51b8152600401610b7890613e87565b61309b81604051806060016040528060268152602001614049602691396001600160a01b03861660009081526001602052604090205491906128bb565b6001600160a01b0380851660009081526001602052604080822093909355908416815220546130ca908261213e565b6001600160a01b0380841660008181526001602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906122bc9085815260200190565b6020805465ffffffffffff1916905583156131f65760165460ff16801561315357506005601854436131509190613e1c565b11155b1561316a576020805460ff191660641790556131f6565b6015546020805460ff80841661ffff1990921691909117610100620100008086048416919091029190911763ffff00001916600160201b80860484169290920263ff000000191617600160301b850483166301000000021765ffff000000001916600160401b850483169190910260ff60281b191617600160501b90930416600160281b029190911790555b821561328e576015546020805461010080840460ff90811661ffff199093169290921763010000008086048416929092021763ffff00001916600160281b8086048416620100000263ff000000191691909117600160381b86048416929092029190911765ffff000000001916600160481b85048316600160201b0260ff60281b191617600160581b90940491909116029190911790555b8215801561329a575083155b80156132e057506001600160a01b0382166000908152601b602052604090205460ff16806132e057506001600160a01b0381166000908152601b602052604090205460ff165b15613371576015546020805460ff80841661ffff1990921691909117610100620100008086048416919091029190911763ffff00001916600160201b80860484169290920263ff000000191617600160301b850483166301000000021765ffff000000001916600160481b850483169190910260ff60281b191617600160501b90930416600160281b029190911790555b60205460ff600160281b8204811691600160201b8104821691630100000082048116916201000081048216916133af91610100810482169116613f22565b6133b99190613f22565b6133c39190613f22565b6133cd9190613f22565b6133d79190613f22565b6020805460ff928316600160301b90810266ff00000000000019831681178085556040805192871694871694909417825261010081048616948201949094526201000084048516818401526301000000840485166060820152600160201b840485166080820152600160281b8404851660a0820152920490921660c082015290517f2a4a4430d0dfe3335da17f31f84e9395eaad8f0cad29e482d8315db5856243f79181900360e00190a150505050565b30600090815260016020526040812054602054909150479060009060029060ff600160301b82048116916134bd911686613eca565b6134c79190613ef7565b6134d19190613ef7565b905060006134df8285613e1c565b90506134ea8161377c565b60006134f68447613e1c565b60205490915060009061350e9060029060ff16613f3b565b6020546135259190600160301b900460ff16613f5d565b60205460ff91821692506000916002918491613542911686613eca565b61354c9190613ef7565b6135569190613ef7565b602054909150600090839061357390610100900460ff1686613eca565b61357d9190613ef7565b602054909150600090849061359b9062010000900460ff1687613eca565b6135a59190613ef7565b60205490915060009085906135c4906301000000900460ff1688613eca565b6135ce9190613ef7565b60205490915060009086906135ed90600160201b900460ff1689613eca565b6135f79190613ef7565b90506000818386613608878a613e2f565b6136129190613e2f565b61361c9190613e2f565b6136269190613e2f565b6136309089613e1c565b600f54909150613649906001600160a01b0316866138d6565b60105461365f906001600160a01b0316856138d6565b601154613675906001600160a01b0316846138d6565b60125461368b906001600160a01b0316836138d6565b89156136dd5761369b8a876139ef565b604080518a8152602081018890529081018b90527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15b6007546040516000916001600160a01b03169083908381818185875af1925050503d806000811461372a576040519150601f19603f3d011682016040523d82523d6000602084013e61372f565b606091505b50509050801561376d576040518281527fa4049db804d87a845be4dd8b54ae7048131238fba985dd37234309ac8668d9699060200160405180910390a15b50505050505050505050505050565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106137b1576137b1613f76565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa15801561380a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061382e9190613f8c565b8160018151811061384157613841613f76565b6001600160a01b03928316602091820292909201015260065461386791309116846121a4565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac947906138a0908590600190869030904290600401613fa9565b600060405180830381600087803b1580156138ba57600080fd5b505af11580156138ce573d6000803e3d6000fd5b505050505050565b804710156139265760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610b78565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613973576040519150601f19603f3d011682016040523d82523d6000602084013e613978565b606091505b50509050806123295760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610b78565b600654613a079030906001600160a01b0316846121a4565b600654600e5460405163f305d71960e01b81523060048201526024810185905260016044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af1158015613a77573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610fbd919061401a565b600060208083528351808285015260005b81811015613ac957858101830151858201604001528201613aad565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461135e57600080fd5b60008060408385031215613b1257600080fd5b8235613b1d81613aea565b946020939093013593505050565b600060208284031215613b3d57600080fd5b5035919050565b600080600060608486031215613b5957600080fd5b8335613b6481613aea565b92506020840135613b7481613aea565b929592945050506040919091013590565b600060208284031215613b9757600080fd5b813561219d81613aea565b801515811461135e57600080fd5b60008060408385031215613bc357600080fd5b8235613bce81613aea565b91506020830135613bde81613ba2565b809150509250929050565b803560ff81168114613bfa57600080fd5b919050565b60008060008060008060c08789031215613c1857600080fd5b613c2187613be9565b9550613c2f60208801613be9565b9450613c3d60408801613be9565b9350613c4b60608801613be9565b9250613c5960808801613be9565b9150613c6760a08801613be9565b90509295509295509295565b600080600080600060a08688031215613c8b57600080fd5b8535613c9681613aea565b94506020860135613ca681613aea565b93506040860135613cb681613aea565b92506060860135613cc681613aea565b91506080860135613cd681613aea565b809150509295509295909350565b60008060408385031215613cf757600080fd5b8235613d0281613aea565b91506020830135613bde81613aea565b600181811c90821680613d2657607f821691505b602082108103613d4657634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060208284031215613d9357600080fd5b5051919050565b600060208284031215613dac57600080fd5b815161219d81613ba2565b6020808252602f908201527f444e413a204163636f756e7420697320616c7265616479207468652076616c7560408201526e65206f6620276578636c756465642760881b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b81810381811115610b4857610b48613e06565b80820180821115610b4857610b48613e06565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b8082028115828204841417610b4857610b48613e06565b634e487b7160e01b600052601260045260246000fd5b600082613f0657613f06613ee1565b500490565b68ffffffffffffffffff1991909116815260200190565b60ff8181168382160190811115610b4857610b48613e06565b600060ff831680613f4e57613f4e613ee1565b8060ff84160491505092915050565b60ff8281168282160390811115610b4857610b48613e06565b634e487b7160e01b600052603260045260246000fd5b600060208284031215613f9e57600080fd5b815161219d81613aea565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015613ff95784516001600160a01b031683529383019391830191600101613fd4565b50506001600160a01b03969096166060850152505050608001529392505050565b60008060006060848603121561402f57600080fd5b835192506020840151915060408401519050925092509256fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654af24be54adc5e716fbcaa3fca0ad593e28dff90dffd49487c0a33b1547c6b5245524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636500edc71549f0cbe47086c2237ce0cf874d6897fd1d7ce43ee6b65c0230d7606e45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220f52456c9a67860176f60befab0ce62986aeac351ffb11d6530f973f6d266ca6264736f6c6343000811003360806040523480156200001157600080fd5b5060408051808201825260148082527f444e415f4469766964656e645f547261636b65720000000000000000000000006020808401829052845180860190955291845290830152908181600362000069838262000197565b50600462000078828262000197565b50505060006200008d620000ee60201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35050610e1060125550600060135562000263565b3390565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200011d57607f821691505b6020821081036200013e57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200019257600081815260208120601f850160051c810160208610156200016d5750805b601f850160051c820191505b818110156200018e5782815560010162000179565b5050505b505050565b81516001600160401b03811115620001b357620001b3620000f2565b620001cb81620001c4845462000108565b8462000144565b602080601f831160018114620002035760008415620001ea5750858301515b600019600386901b1c1916600185901b1785556200018e565b600085815260208120601f198616915b82811015620002345788860151825594840194600190910190840162000213565b5085821015620002535787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6119eb80620002736000396000f3fe6080604052600436106101e75760003560e01c806370a0823111610102578063a9059cbb11610095578063dd62ed3e11610064578063dd62ed3e1461058e578063e30443bc146105d4578063f2fde38b146105f4578063f7c618c11461061457600080fd5b8063a9059cbb14610502578063aafd847a14610522578063bc4c4b3714610558578063be10b6141461057857600080fd5b806391b89fba116100d157806391b89fba1461048d57806395d89b41146104ad578063a457c2d7146104c2578063a8b9d240146104e257600080fd5b806370a082311461040e578063715018a61461044457806385a6b3ae146104595780638da5cb5b1461046f57600080fd5b806323b872dd1161017a578063395093511161014957806339509351146103935780634e7b827f146103b35780636a474002146103e35780636f2789ec146103f857600080fd5b806323b872dd1461031757806327ce014714610337578063313ce5671461035757806331e79db01461037357600080fd5b8063163c7cef116101b6578063163c7cef1461027d5780631694505e1461029d57806318160ddd146102d5578063226cfa3d146102ea57600080fd5b806303c83302146101fb57806306fdde0314610203578063095ea7b31461022e57806309bbedde1461025e57600080fd5b366101f6576101f4610634565b005b600080fd5b6101f4610634565b34801561020f57600080fd5b506102186106fa565b60405161022591906116a8565b60405180910390f35b34801561023a57600080fd5b5061024e61024936600461170b565b61078c565b6040519015158152602001610225565b34801561026a57600080fd5b50600c545b604051908152602001610225565b34801561028957600080fd5b506101f4610298366004611737565b6107a3565b3480156102a957600080fd5b506009546102bd906001600160a01b031681565b6040516001600160a01b039091168152602001610225565b3480156102e157600080fd5b5060025461026f565b3480156102f657600080fd5b5061026f610305366004611750565b60116020526000908152604090205481565b34801561032357600080fd5b5061024e61033236600461176d565b610868565b34801561034357600080fd5b5061026f610352366004611750565b6108d1565b34801561036357600080fd5b5060405160128152602001610225565b34801561037f57600080fd5b506101f461038e366004611750565b61092d565b34801561039f57600080fd5b5061024e6103ae36600461170b565b610a54565b3480156103bf57600080fd5b5061024e6103ce366004611750565b60106020526000908152604090205460ff1681565b3480156103ef57600080fd5b506101f4610a8a565b34801561040457600080fd5b5061026f60125481565b34801561041a57600080fd5b5061026f610429366004611750565b6001600160a01b031660009081526020819052604090205490565b34801561045057600080fd5b506101f4610ac0565b34801561046557600080fd5b5061026f60075481565b34801561047b57600080fd5b506005546001600160a01b03166102bd565b34801561049957600080fd5b5061026f6104a8366004611750565b610b34565b3480156104b957600080fd5b50610218610b3f565b3480156104ce57600080fd5b5061024e6104dd36600461170b565b610b4e565b3480156104ee57600080fd5b5061026f6104fd366004611750565b610b9d565b34801561050e57600080fd5b5061024e61051d36600461170b565b610bc9565b34801561052e57600080fd5b5061026f61053d366004611750565b6001600160a01b03166000908152600b602052604090205490565b34801561056457600080fd5b5061024e6105733660046117ae565b610bd6565b34801561058457600080fd5b5061026f60135481565b34801561059a57600080fd5b5061026f6105a93660046117ec565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3480156105e057600080fd5b506101f46105ef36600461170b565b610c84565b34801561060057600080fd5b506101f461060f366004611750565b610dee565b34801561062057600080fd5b506008546102bd906001600160a01b031681565b6005546001600160a01b031633146106675760405162461bcd60e51b815260040161065e9061181a565b60405180910390fd5b600061067260025490565b1161067c57600080fd5b34156106f8576106af61068e60025490565b61069c34600160801b610ed9565b6106a69190611865565b60065490610f62565b60065560405134815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a26007546106f49034610f62565b6007555b565b60606003805461070990611887565b80601f016020809104026020016040519081016040528092919081815260200182805461073590611887565b80156107825780601f1061075757610100808354040283529160200191610782565b820191906000526020600020905b81548152906001019060200180831161076557829003601f168201915b5050505050905090565b6000610799338484610fc1565b5060015b92915050565b6005546001600160a01b031633146107cd5760405162461bcd60e51b815260040161065e9061181a565b80601354036108635760405162461bcd60e51b815260206004820152605660248201527f444e415f4469766964656e645f547261636b65723a206d696e696d756d546f6b60448201527f656e42616c616e6365466f724469766964656e647320616c726561647920746860648201527532903b30b63ab29037b31013b732bbab30b63ab2939760511b608482015260a40161065e565b601355565b60006108758484846110e5565b6108c784336108c285604051806060016040528060288152602001611969602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190611140565b610fc1565b5060019392505050565b6001600160a01b0381166000908152600a602090815260408083205491839052822054600654600160801b926109239261091e92610918916109139190610ed9565b61117a565b9061118a565b6111c8565b61079d9190611865565b6005546001600160a01b031633146109575760405162461bcd60e51b815260040161065e9061181a565b6001600160a01b03811660009081526010602052604090205460ff161561097d57600080fd5b6001600160a01b0381166000908152601060205260408120805460ff191660011790556109ab9082906111db565b60405163131836e760e21b8152600c60048201526001600160a01b03821660248201527365e55ced87907bc043184ce38c941358a8a0b20b90634c60db9c9060440160006040518083038186803b158015610a0557600080fd5b505af4158015610a19573d6000803e3d6000fd5b50506040516001600160a01b03841692507fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b259150600090a250565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916107999185906108c29086610f62565b6005546001600160a01b03163314610ab45760405162461bcd60e51b815260040161065e9061181a565b610abd33611240565b50565b6005546001600160a01b03163314610aea5760405162461bcd60e51b815260040161065e9061181a565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b600061079d82610b9d565b60606004805461070990611887565b600061079933846108c285604051806060016040528060258152602001611991602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190611140565b6001600160a01b0381166000908152600b602052604081205461079d90610bc3846108d1565b90611386565b60006107993384846110e5565b6005546000906001600160a01b03163314610c035760405162461bcd60e51b815260040161065e9061181a565b6000610c0e84611240565b90508015610c7a576001600160a01b038416600081815260116020526040908190204290555184151591907fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf09290610c689085815260200190565b60405180910390a3600191505061079d565b5060009392505050565b6005546001600160a01b03163314610cae5760405162461bcd60e51b815260040161065e9061181a565b6001600160a01b03821660009081526010602052604090205460ff16610dea576013548110610d5f57610ce182826111db565b604051632f0ad01760e21b8152600c60048201526001600160a01b0383166024820152604481018290527365e55ced87907bc043184ce38c941358a8a0b20b9063bc2b405c9060640160006040518083038186803b158015610d4257600080fd5b505af4158015610d56573d6000803e3d6000fd5b50505050610ddd565b610d6a8260006111db565b60405163131836e760e21b8152600c60048201526001600160a01b03831660248201527365e55ced87907bc043184ce38c941358a8a0b20b90634c60db9c9060440160006040518083038186803b158015610dc457600080fd5b505af4158015610dd8573d6000803e3d6000fd5b505050505b610de8826001610bd6565b505b5050565b6005546001600160a01b03163314610e185760405162461bcd60e51b815260040161065e9061181a565b6001600160a01b038116610e7d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161065e565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b600082600003610eeb5750600061079d565b6000610ef783856118c1565b905082610f048583611865565b14610f5b5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b606482015260840161065e565b9392505050565b600080610f6f83856118d8565b905083811015610f5b5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640161065e565b6001600160a01b0383166110235760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161065e565b6001600160a01b0382166110845760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161065e565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60405162461bcd60e51b815260206004820152602a60248201527f444e415f4469766964656e645f547261636b65723a204e6f207472616e7366656044820152691c9cc8185b1b1bddd95960b21b606482015260840161065e565b600081848411156111645760405162461bcd60e51b815260040161065e91906116a8565b50600061117184866118eb565b95945050505050565b6000818181121561079d57600080fd5b60008061119783856118fe565b9050600083121580156111aa5750838112155b806111bf57506000831280156111bf57508381125b610f5b57600080fd5b6000808212156111d757600080fd5b5090565b6001600160a01b0382166000908152602081905260409020548082111561121a5760006112088383611386565b905061121484826113c8565b50610de8565b80821015610de857600061122e8284611386565b905061123a848261142c565b50505050565b60008061124c83610b9d565b9050801561137d576001600160a01b0383166000908152600b60205260409020546112779082610f62565b6001600160a01b0384166000818152600b6020526040908190209290925590517fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d906112c69084815260200190565b60405180910390a26000836001600160a01b031682610bb890604051600060405180830381858888f193505050503d8060008114611320576040519150601f19603f3d011682016040523d82523d6000602084013e611325565b606091505b5050905080611376576001600160a01b0384166000908152600b60205260409020546113519083611386565b6001600160a01b039094166000908152600b6020526040812094909455509192915050565b5092915050565b50600092915050565b6000610f5b83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611140565b6113d28282611470565b61140c6113ed61091383600654610ed990919063ffffffff16565b6001600160a01b0384166000908152600a60205260409020549061155b565b6001600160a01b039092166000908152600a602052604090209190915550565b6114368282611598565b61140c61145161091383600654610ed990919063ffffffff16565b6001600160a01b0384166000908152600a60205260409020549061118a565b6001600160a01b0382166114c65760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161065e565b6114d260008383610de8565b6002546114df9082610f62565b6002556001600160a01b0382166000908152602081905260409020546115059082610f62565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b6000806115688385611926565b90506000831215801561157b5750838113155b806111bf57506000831280156111bf5750838113610f5b57600080fd5b6001600160a01b0382166115f85760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161065e565b61160482600083610de8565b61164181604051806060016040528060228152602001611947602291396001600160a01b0385166000908152602081905260409020549190611140565b6001600160a01b0383166000908152602081905260409020556002546116679082611386565b6002556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200161154f565b600060208083528351808285015260005b818110156116d5578581018301518582016040015282016116b9565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610abd57600080fd5b6000806040838503121561171e57600080fd5b8235611729816116f6565b946020939093013593505050565b60006020828403121561174957600080fd5b5035919050565b60006020828403121561176257600080fd5b8135610f5b816116f6565b60008060006060848603121561178257600080fd5b833561178d816116f6565b9250602084013561179d816116f6565b929592945050506040919091013590565b600080604083850312156117c157600080fd5b82356117cc816116f6565b9150602083013580151581146117e157600080fd5b809150509250929050565b600080604083850312156117ff57600080fd5b823561180a816116f6565b915060208301356117e1816116f6565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008261188257634e487b7160e01b600052601260045260246000fd5b500490565b600181811c9082168061189b57607f821691505b6020821081036118bb57634e487b7160e01b600052602260045260246000fd5b50919050565b808202811582820484141761079d5761079d61184f565b8082018082111561079d5761079d61184f565b8181038181111561079d5761079d61184f565b808201828112600083128015821682158216171561191e5761191e61184f565b505092915050565b81810360008312801583831316838312821617156113765761137661184f56fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220d06ecf47c07c6646216e7aaf4a68db8ed5532d543bf646409a900ea3bf29756564736f6c63430008110033

Deployed Bytecode

0x6080604052600436106103395760003560e01c80636843cd84116101ab578063a9059cbb116100f7578063d2d7ad8311610095578063dd62ed3e1161006f578063dd62ed3e146109d0578063f2fde38b14610a16578063fd72e22a14610a36578063fe01753514610a5657600080fd5b8063d2d7ad831461097a578063d322157614610990578063d4698016146109b057600080fd5b8063b62496f5116100d1578063b62496f514610888578063bea9849e146108b8578063c0246668146108d8578063cd43e228146108f857600080fd5b8063a9059cbb14610832578063aa4bde2814610852578063aee50b1e1461086857600080fd5b806382528791116101645780638da5cb5b1161013e5780638da5cb5b146107bf57806395d89b41146107dd578063a457c2d7146107f2578063a8b9d2401461081257600080fd5b80638252879114610769578063880bcbc1146107895780638c0b5e22146107a957600080fd5b80636843cd841461069e5780636b6d37c5146106be57806370a08231146106de578063715018a614610714578063781edb3c146107295780637c0a893d1461074957600080fd5b806330bb4cff1161028557806345ea4ed2116102235780634d78fdc6116101fd5780634d78fdc6146106345780634e71d92d146106545780635ebf4db91461066957806364b0f6531461068957600080fd5b806345ea4ed2146105c05780634626402b146105e057806349bd5a5e1461060057600080fd5b806334cf1fea1161025f57806334cf1fea14610555578063378dc3dc1461056a578063395093511461058057806345a42329146105a057600080fd5b806330bb4cff14610504578063313ce5671461051957806331e79db01461053557600080fd5b80631694505e116102f25780631e293c10116102cc5780631e293c101461048457806323b872dd146104a457806327a14fc2146104c45780632c1f5216146104e457600080fd5b80631694505e1461042557806318160ddd146104455780631cd348c01461046457600080fd5b8063064a59d01461034557806306fdde0314610374578063095ea7b314610396578063098df585146103b65780630a159be0146103d85780630bd05b691461041057600080fd5b3661034057005b600080fd5b34801561035157600080fd5b5060095461035f9060ff1681565b60405190151581526020015b60405180910390f35b34801561038057600080fd5b50610389610aa5565b60405161036b9190613a9c565b3480156103a257600080fd5b5061035f6103b1366004613aff565b610b37565b3480156103c257600080fd5b506103d66103d1366004613b2b565b610b4e565b005b3480156103e457600080fd5b506012546103f8906001600160a01b031681565b6040516001600160a01b03909116815260200161036b565b34801561041c57600080fd5b506103d6610c78565b34801561043157600080fd5b506006546103f8906001600160a01b031681565b34801561045157600080fd5b506003545b60405190815260200161036b565b34801561047057600080fd5b506010546103f8906001600160a01b031681565b34801561049057600080fd5b506103d661049f366004613b2b565b610cd1565b3480156104b057600080fd5b5061035f6104bf366004613b44565b610d94565b3480156104d057600080fd5b506103d66104df366004613b2b565b610dfd565b3480156104f057600080fd5b506007546103f8906001600160a01b031681565b34801561051057600080fd5b50610456610ec4565b34801561052557600080fd5b506040516012815260200161036b565b34801561054157600080fd5b506103d6610550366004613b85565b610f37565b34801561056157600080fd5b506103d6610fc4565b34801561057657600080fd5b5061045660085481565b34801561058c57600080fd5b5061035f61059b366004613aff565b610ffa565b3480156105ac57600080fd5b506103d66105bb366004613bb0565b611030565b3480156105cc57600080fd5b506103d66105db366004613bff565b611148565b3480156105ec57600080fd5b506011546103f8906001600160a01b031681565b34801561060c57600080fd5b506103f87f0000000000000000000000002ee5ea7f0fcbe05fe5099c78baa25eaf4e811ee881565b34801561064057600080fd5b506103d661064f366004613b85565b61120a565b34801561066057600080fd5b506103d66112e9565b34801561067557600080fd5b506103d6610684366004613b2b565b611361565b34801561069557600080fd5b506104566113bc565b3480156106aa57600080fd5b506104566106b9366004613b85565b611406565b3480156106ca57600080fd5b506103d66106d9366004613bff565b611476565b3480156106ea57600080fd5b506104566106f9366004613b85565b6001600160a01b031660009081526001602052604090205490565b34801561072057600080fd5b506103d66114cd565b34801561073557600080fd5b506103d6610744366004613bb0565b611541565b34801561075557600080fd5b506103d6610764366004613b85565b611603565b34801561077557600080fd5b506103d6610784366004613c73565b611762565b34801561079557600080fd5b506103d66107a4366004613bb0565b611be6565b3480156107b557600080fd5b50610456600b5481565b3480156107cb57600080fd5b506000546001600160a01b03166103f8565b3480156107e957600080fd5b50610389611ca8565b3480156107fe57600080fd5b5061035f61080d366004613aff565b611cb7565b34801561081e57600080fd5b5061045661082d366004613b85565b611d06565b34801561083e57600080fd5b5061035f61084d366004613aff565b611d39565b34801561085e57600080fd5b50610456600a5481565b34801561087457600080fd5b506103d6610883366004613b2b565b611d46565b34801561089457600080fd5b5061035f6108a3366004613b85565b601f6020526000908152604090205460ff1681565b3480156108c457600080fd5b506103d66108d3366004613b85565b611e1a565b3480156108e457600080fd5b506103d66108f3366004613bb0565b611f10565b34801561090457600080fd5b5060155460ff80821691620100008104821691600160201b8204811691600160301b8104821691600160401b8204811691600160501b9004165b6040805160ff978816815295871660208701529386169385019390935290841660608401528316608083015290911660a082015260c00161036b565b34801561098657600080fd5b50610456600d5481565b34801561099c57600080fd5b506103d66109ab366004613bb0565b611fd2565b3480156109bc57600080fd5b50600e546103f8906001600160a01b031681565b3480156109dc57600080fd5b506104566109eb366004613ce4565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b348015610a2257600080fd5b506103d6610a31366004613b85565b612054565b348015610a4257600080fd5b50600f546103f8906001600160a01b031681565b348015610a6257600080fd5b5060155460ff610100820481169163010000008104821691600160281b8204811691600160381b8104821691600160481b8204811691600160581b90041661093e565b606060048054610ab490613d12565b80601f0160208091040260200160405190810160405280929190818152602001828054610ae090613d12565b8015610b2d5780601f10610b0257610100808354040283529160200191610b2d565b820191906000526020600020905b815481529060010190602001808311610b1057829003601f168201915b5050505050905090565b6000610b443384846121a4565b5060015b92915050565b6000546001600160a01b03163314610b815760405162461bcd60e51b8152600401610b7890613d4c565b60405180910390fd5b478110610be45760405162461bcd60e51b815260206004820152602b60248201527f444e413a2043616e6e6f742073656e64206d6f7265207468616e20636f6e747260448201526a6163742062616c616e636560a81b6064820152608401610b78565b600080546040516001600160a01b039091169083908381818185875af1925050503d8060008114610c31576040519150601f19603f3d011682016040523d82523d6000602084013e610c36565b606091505b505090508015610c74576040518281527f362ae087cf4ccfc970d45b9e8ce6520f03b4eda3f9d76a70b655dc22badcca489060200160405180910390a15b5050565b6000546001600160a01b03163314610ca25760405162461bcd60e51b8152600401610b7890613d4c565b6009805460ff19166001179055601854600003610ccf5743601855426017556016805460ff191660011790555b565b6000546001600160a01b03163314610cfb5760405162461bcd60e51b8152600401610b7890613d4c565b600b548103610d615760405162461bcd60e51b815260206004820152602c60248201527f444e413a2043616e6e6f7420757064617465206d61785478416d6f756e74207460448201526b6f2073616d652076616c756560a01b6064820152608401610b78565b600b5460405182907f75f1c17bf623f0f7a2bd91ba61e89dff216960370e3e9a46b250750d03e4215e90600090a3600b55565b6000610da18484846122c9565b610df38433610dee8560405180606001604052806028815260200161408f602891396001600160a01b038a16600090815260026020908152604080832033845290915290205491906128bb565b6121a4565b5060019392505050565b6000546001600160a01b03163314610e275760405162461bcd60e51b8152600401610b7890613d4c565b600a548103610e915760405162461bcd60e51b815260206004820152603060248201527f444e413a2043616e6e6f7420757064617465206d617857616c6c6574416d6f7560448201526f6e7420746f2073616d652076616c756560801b6064820152608401610b78565b600a5460405182907f6d3e257c59a11116c3e97bb144abf5ba1a6a9da6bd509192ecf0d48f7be1fc7690600090a3600a55565b600754604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015610f0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f329190613d81565b905090565b6000546001600160a01b03163314610f615760405162461bcd60e51b8152600401610b7890613d4c565b60075460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024015b600060405180830381600087803b158015610fa957600080fd5b505af1158015610fbd573d6000803e3d6000fd5b5050505050565b6000546001600160a01b03163314610fee5760405162461bcd60e51b8152600401610b7890613d4c565b6009805460ff19169055565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610b44918590610dee908661213e565b6000546001600160a01b0316331461105a5760405162461bcd60e51b8152600401610b7890613d4c565b6001600160a01b0382166000908152601b602052604090205481151560ff9091161515036110e85760405162461bcd60e51b815260206004820152603560248201527f444e413a205468652073656c65637465642077616c6c657420697320616c7265604482015274030b23c9039b2ba103a37903a3432903b30b63ab29605d1b6064820152608401610b78565b6001600160a01b0382166000818152601b6020908152604091829020805460ff191685151590811790915591519182527fe70512a569cf898db2e20aa3b4cc3f0dd13377b82a493840d326ab5a1966687791015b60405180910390a25050565b6000546001600160a01b031633146111725760405162461bcd60e51b8152600401610b7890613d4c565b61118260138787878787876128f5565b6040516c18985cd95199595ccb54d95b1b609a1b8152600d015b6040805191829003822060ff898116845288811660208501528781168484015286811660608501528581166080850152841660a0840152905190917fc5b0189242ee94396fea9d585d7b5ec493a5a69180d0793c05f7525862878af3919081900360c00190a2505050505050565b6000546001600160a01b031633146112345760405162461bcd60e51b8152600401610b7890613d4c565b6001600160a01b03811660009081526019602052604090205460ff1661129c5760405162461bcd60e51b815260206004820152601b60248201527f444e413a204163636f756e74206973206e6f7420626c636f6b656400000000006044820152606401610b78565b6001600160a01b038116600081815260196020526040808220805460ff19169055519091907f2f092974a5a89dc001cc04aa60bc3afe575e0b7444ef2197f7bb5714b51528ba908390a350565b60075460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af115801561133a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061135e9190613d9a565b50565b6000546001600160a01b0316331461138b5760405162461bcd60e51b8152600401610b7890613d4c565b60075460405163163c7cef60e01b8152600481018390526001600160a01b039091169063163c7cef90602401610f8f565b600754604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015610f0e573d6000803e3d6000fd5b6007546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa158015611452573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b489190613d81565b6000546001600160a01b031633146114a05760405162461bcd60e51b8152600401610b7890613d4c565b6114b06013878787878787612c90565b6040516b62617365466565732d42757960a01b8152600c0161119c565b6000546001600160a01b031633146114f75760405162461bcd60e51b8152600401610b7890613d4c565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b0316331461156b5760405162461bcd60e51b8152600401610b7890613d4c565b6001600160a01b0382166000908152601e602052604090205481151560ff9091161515036115ab5760405162461bcd60e51b8152600401610b7890613db7565b6001600160a01b0382166000818152601e6020908152604091829020805460ff191685151590811790915591519182527ff5133f371b17bf21ce0df4ae2c1b6e11ca7c2f27257eb55282edb1ccfd4ecb2e910161113c565b6000546001600160a01b0316331461162d5760405162461bcd60e51b8152600401610b7890613d4c565b6001600160a01b03811660009081526019602052604090205460ff16156116965760405162461bcd60e51b815260206004820152601f60248201527f444e413a204163636f756e7420697320616c726561647920626c6f636b6564006044820152606401610b78565b60165460ff1615611710576202a300601754426116b39190613e1c565b106117105760405162461bcd60e51b815260206004820152602760248201527f444e413a2054696d6520746f20626c6f636b206163636f756e74732068617320604482015266195e1c1a5c995960ca1b6064820152608401610b78565b6001600160a01b038116600081815260196020526040808220805460ff1916600190811790915590519092917f2f092974a5a89dc001cc04aa60bc3afe575e0b7444ef2197f7bb5714b51528ba91a350565b6000546001600160a01b0316331461178c5760405162461bcd60e51b8152600401610b7890613d4c565b600e546001600160a01b0386811691161461186a576001600160a01b0385166118035760405162461bcd60e51b8152602060048201526024808201527f444e413a20546865206c697175696469747957616c6c65742063616e6e6f74206044820152630626520360e41b6064820152608401610b78565b600e546040516e1b1a5c5d5a591a5d1e55d85b1b195d608a1b81526001600160a01b0391821691871690600f016040519081900381209060008051602061406f83398151915290600090a4600e80546001600160a01b0319166001600160a01b0387161790555b600f546001600160a01b0385811691161461194b576001600160a01b0384166118e35760405162461bcd60e51b815260206004820152602560248201527f444e413a20546865206f7065726174696f6e7357616c6c65742063616e6e6f74604482015264020626520360dc1b6064820152608401610b78565b600f546040516f1bdc195c985d1a5bdb9cd5d85b1b195d60821b81526001600160a01b03918216918616906010016040519081900381209060008051602061406f83398151915290600090a4600f80546001600160a01b0319166001600160a01b0386161790555b6010546001600160a01b03848116911614611a26576001600160a01b0383166119c15760405162461bcd60e51b815260206004820152602260248201527f444e413a20546865206275794261636b57616c6c65742063616e6e6f74206265604482015261020360f41b6064820152608401610b78565b6010546040516c189d5e509858dad5d85b1b195d609a1b81526001600160a01b0391821691851690600d016040519081900381209060008051602061406f83398151915290600090a4601080546001600160a01b0319166001600160a01b0385161790555b6011546001600160a01b03838116911614611b03576001600160a01b038216611a9d5760405162461bcd60e51b815260206004820152602360248201527f444e413a2054686520747265617375727957616c6c65742063616e6e6f74206260448201526206520360ec1b6064820152608401610b78565b6011546040516d1d1c99585cdd5c9e55d85b1b195d60921b81526001600160a01b0391821691841690600e016040519081900381209060008051602061406f83398151915290600090a4601180546001600160a01b0319166001600160a01b0384161790555b6012546001600160a01b03828116911614610fbd576001600160a01b038116611b795760405162461bcd60e51b815260206004820152602260248201527f444e413a205468652057616c6c65744157616c6c65742063616e6e6f74206265604482015261020360f41b6064820152608401610b78565b6012546040516c15d85b1b195d1055d85b1b195d609a1b81526001600160a01b0391821691831690600d016040519081900381209060008051602061406f83398151915290600090a4601280546001600160a01b0383166001600160a01b03199091161790555050505050565b6000546001600160a01b03163314611c105760405162461bcd60e51b8152600401610b7890613d4c565b6001600160a01b0382166000908152601d602052604090205481151560ff909116151503611c505760405162461bcd60e51b8152600401610b7890613db7565b6001600160a01b0382166000818152601d6020908152604091829020805460ff191685151590811790915591519182527f30098fc83ab61b1a98835d32c4e611adedccfc260eeef586bd329d48e8a40a40910161113c565b606060058054610ab490613d12565b6000610b443384610dee856040518060600160405280602581526020016140d7602591393360009081526002602090815260408083206001600160a01b038d16845290915290205491906128bb565b6007546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d24090602401611435565b6000610b443384846122c9565b6000546001600160a01b03163314611d705760405162461bcd60e51b8152600401610b7890613d4c565b600d548103611de75760405162461bcd60e51b815260206004820152603860248201527f444e413a2043616e6e6f7420757064617465206d696e696d756d546f6b656e7360448201527f4265666f72655377617020746f2073616d652076616c756500000000000000006064820152608401610b78565b600d5460405182907f5b0491f767c1463bea8972339f785795be1a38784cc6483cf649cdcbb28c46b090600090a3600d55565b6000546001600160a01b03163314611e445760405162461bcd60e51b8152600401610b7890613d4c565b6006546001600160a01b0390811690821603611eb35760405162461bcd60e51b815260206004820152602860248201527f444e413a2054686520726f7574657220616c7265616479206861732074686174604482015267206164647265737360c01b6064820152608401610b78565b6006546040516001600160a01b03918216918316907f2afbff3ed601a8723765c7072d8ea8445e08f6f1874afd34a2b747a272c3ebad90600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314611f3a5760405162461bcd60e51b8152600401610b7890613d4c565b6001600160a01b0382166000908152601c602052604090205481151560ff909116151503611f7a5760405162461bcd60e51b8152600401610b7890613db7565b6001600160a01b0382166000818152601c6020908152604091829020805460ff191685151590811790915591519182527fa856ba9fdc54a5434b2359874c95612f520a2d7f858864ae98d15c1b2099ca8b910161113c565b6000546001600160a01b03163314611ffc5760405162461bcd60e51b8152600401610b7890613d4c565b6001600160a01b0382166000818152601a6020908152604091829020805460ff191685151590811790915591519182527fcb9f97b7b4b41413e5c8d418a8cf9a88db1cf34dee66b213d070faf881d9d350910161113c565b6000546001600160a01b0316331461207e5760405162461bcd60e51b8152600401610b7890613d4c565b6001600160a01b0381166120e35760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b78565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60008061214b8385613e2f565b90508381101561219d5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610b78565b9392505050565b6001600160a01b0383166122065760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610b78565b6001600160a01b0382166122675760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610b78565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166122ef5760405162461bcd60e51b8152600401610b7890613e42565b6001600160a01b0382166123155760405162461bcd60e51b8152600401610b7890613e87565b8060000361232e5761232983836000613012565b505050565b6001600160a01b0383166000908152601a602052604090205460ff1615801561237057506001600160a01b0382166000908152601a602052604090205460ff16155b156126075760095460ff166123d35760405162461bcd60e51b815260206004820152602360248201527f444e413a2054726164696e672069732063757272656e746c792064697361626c60448201526232b21760e91b6064820152608401610b78565b6001600160a01b03821660009081526019602052604090205460ff16156124365760405162461bcd60e51b81526020600482015260176024820152761113904e881058d8dbdd5b9d081a5cc8189b1bd8dad959604a1b6044820152606401610b78565b6001600160a01b03831660009081526019602052604090205460ff16156124995760405162461bcd60e51b81526020600482015260176024820152761113904e881058d8dbdd5b9d081a5cc8189b1bd8dad959604a1b6044820152606401610b78565b6001600160a01b0382166000908152601d602052604090205460ff161580156124db57506001600160a01b0383166000908152601d602052604090205460ff16155b1561254657600b548111156125465760405162461bcd60e51b815260206004820152602b60248201527f444e413a2042757920616d6f756e74206578636565647320746865206d61785460448201526a3c213abca0b6b7bab73a1760a91b6064820152608401610b78565b6001600160a01b0382166000908152601e602052604090205460ff1661260757600a5481612589846001600160a01b031660009081526001602052604090205490565b6125939190613e2f565b11156126075760405162461bcd60e51b815260206004820152603860248201527f444e413a2045787065637465642077616c6c657420616d6f756e74206578636560448201527f65647320746865206d617857616c6c6574416d6f756e742e00000000000000006064820152608401610b78565b6001600160a01b038084166000908152601f602052604080822054928516825290205461263c9160ff9081169116858561311e565b600d54306000908152600160205260409020546009549111159060ff1680156126625750805b80156126715750600c5460ff16155b80156126885750602054600160301b900460ff1615155b80156126ac57506001600160a01b0383166000908152601f602052604090205460ff165b156126d157600c805460ff191660011790556126c6613488565b600c805460ff191690555b600c5460009060ff161580156126e9575060095460ff165b6001600160a01b0386166000908152601c602052604090205490915060ff168061272b57506001600160a01b0384166000908152601c602052604090205460ff165b15612734575060005b80801561274c5750602054600160301b900460ff1615155b156127935760205460009060649061276e90600160301b900460ff1686613eca565b6127789190613ef7565b90506127848185613e1c565b9350612791863083613012565b505b61279e858585613012565b6007546001600160a01b031663e30443bc866127cf816001600160a01b031660009081526001602052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561281557600080fd5b505af1925050508015612826575060015b506007546001600160a01b031663e30443bc85612858816001600160a01b031660009081526001602052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561289e57600080fd5b505af19250505080156128af575060015b15610fbd575050505050565b600081848411156128df5760405162461bcd60e51b8152600401610b789190613a9c565b5060006128ec8486613e1c565b95945050505050565b600287015460ff878116610100909204161461298657604051711b1a5c5d5a591a5d1e51995953db94d95b1b60721b815260120160405190819003812060028901548954919260ff610100909204821692918a16916000805160206140b7833981519152916129679160481b90613f0b565b60405180910390a460028701805461ff00191661010060ff8916021790555b600287015460ff86811663010000009092041614612a2057604051721bdc195c985d1a5bdb9cd1995953db94d95b1b606a1b815260130160405190819003812060028901548954919260ff6301000000909204821692918916916000805160206140b7833981519152916129fd9160481b90613f0b565b60405180910390a460028701805463ff0000001916630100000060ff8816021790555b600287015460ff858116600160281b9092041614612ab7576040516f189d5e509858dad1995953db94d95b1b60821b815260100160405190819003812060028901548954919260ff600160281b909204821692918816916000805160206140b783398151915291612a949160481b90613f0b565b60405180910390a460028701805460ff60281b1916600160281b60ff8716021790555b600287015460ff848116600160381b9092041614612b5357604051701d1c99585cdd5c9e51995953db94d95b1b607a1b815260110160405190819003812060028901548954919260ff600160381b909204821692918716916000805160206140b783398151915291612b2c9160481b90613f0b565b60405180910390a460028701805467ff000000000000001916600160381b60ff8616021790555b600287015460ff838116600160481b9092041614612bf0576040516f15d85b1b195d1051995953db94d95b1b60821b815260100160405190819003812060028901548954919260ff600160481b909204821692918616916000805160206140b783398151915291612bc79160481b90613f0b565b60405180910390a460028701805469ff0000000000000000001916600160481b60ff8516021790555b600287015460ff828116600160581b9092041614612c87576040516f1a1bdb19195c9cd1995953db94d95b1b60821b815260100160405190819003812060028901548954919260ff600160581b909204821692918516916000805160206140b783398151915291612c649160481b90613f0b565b60405180910390a460028701805460ff60581b1916600160581b60ff8416021790555b50505050505050565b600287015460ff878116911614612d1157604051706c69717569646974794665654f6e42757960781b815260110160405190819003812060028901548954919260ff91821692918a16916000805160206140b783398151915291612cf79160481b90613f0b565b60405180910390a460028701805460ff191660ff88161790555b600287015460ff868116620100009092041614612da657604051716f7065726174696f6e734665654f6e42757960701b815260120160405190819003812060028901548954919260ff62010000909204821692918916916000805160206140b783398151915291612d859160481b90613f0b565b60405180910390a460028701805462ff000019166201000060ff8816021790555b600287015460ff858116600160201b9092041614612e3d576040516e6275794261636b4665654f6e42757960881b8152600f0160405190819003812060028901548954919260ff600160201b909204821692918816916000805160206140b783398151915291612e199160481b90613f0b565b60405180910390a460028701805464ff000000001916600160201b60ff8716021790555b600287015460ff848116600160301b9092041614612ed7576040516f74726561737572794665654f6e42757960801b815260100160405190819003812060028901548954919260ff600160301b909204821692918716916000805160206140b783398151915291612eb19160481b90613f0b565b60405180910390a460028701805466ff0000000000001916600160301b60ff8616021790555b600287015460ff838116600160401b9092041614612f72576040516e57616c6c6574414665654f6e42757960881b8152600f0160405190819003812060028901548954919260ff600160401b909204821692918616916000805160206140b783398151915291612f4a9160481b90613f0b565b60405180910390a460028701805468ff00000000000000001916600160401b60ff8516021790555b600287015460ff828116600160501b9092041614612c87576040516e686f6c646572734665654f6e42757960881b8152600f0160405190819003812060028901548954919260ff600160501b909204821692918516916000805160206140b783398151915291612fe59160481b90613f0b565b60405180910390a460028701805460ff8316600160501b0260ff60501b1990911617905550505050505050565b6001600160a01b0383166130385760405162461bcd60e51b8152600401610b7890613e42565b6001600160a01b03821661305e5760405162461bcd60e51b8152600401610b7890613e87565b61309b81604051806060016040528060268152602001614049602691396001600160a01b03861660009081526001602052604090205491906128bb565b6001600160a01b0380851660009081526001602052604080822093909355908416815220546130ca908261213e565b6001600160a01b0380841660008181526001602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906122bc9085815260200190565b6020805465ffffffffffff1916905583156131f65760165460ff16801561315357506005601854436131509190613e1c565b11155b1561316a576020805460ff191660641790556131f6565b6015546020805460ff80841661ffff1990921691909117610100620100008086048416919091029190911763ffff00001916600160201b80860484169290920263ff000000191617600160301b850483166301000000021765ffff000000001916600160401b850483169190910260ff60281b191617600160501b90930416600160281b029190911790555b821561328e576015546020805461010080840460ff90811661ffff199093169290921763010000008086048416929092021763ffff00001916600160281b8086048416620100000263ff000000191691909117600160381b86048416929092029190911765ffff000000001916600160481b85048316600160201b0260ff60281b191617600160581b90940491909116029190911790555b8215801561329a575083155b80156132e057506001600160a01b0382166000908152601b602052604090205460ff16806132e057506001600160a01b0381166000908152601b602052604090205460ff165b15613371576015546020805460ff80841661ffff1990921691909117610100620100008086048416919091029190911763ffff00001916600160201b80860484169290920263ff000000191617600160301b850483166301000000021765ffff000000001916600160481b850483169190910260ff60281b191617600160501b90930416600160281b029190911790555b60205460ff600160281b8204811691600160201b8104821691630100000082048116916201000081048216916133af91610100810482169116613f22565b6133b99190613f22565b6133c39190613f22565b6133cd9190613f22565b6133d79190613f22565b6020805460ff928316600160301b90810266ff00000000000019831681178085556040805192871694871694909417825261010081048616948201949094526201000084048516818401526301000000840485166060820152600160201b840485166080820152600160281b8404851660a0820152920490921660c082015290517f2a4a4430d0dfe3335da17f31f84e9395eaad8f0cad29e482d8315db5856243f79181900360e00190a150505050565b30600090815260016020526040812054602054909150479060009060029060ff600160301b82048116916134bd911686613eca565b6134c79190613ef7565b6134d19190613ef7565b905060006134df8285613e1c565b90506134ea8161377c565b60006134f68447613e1c565b60205490915060009061350e9060029060ff16613f3b565b6020546135259190600160301b900460ff16613f5d565b60205460ff91821692506000916002918491613542911686613eca565b61354c9190613ef7565b6135569190613ef7565b602054909150600090839061357390610100900460ff1686613eca565b61357d9190613ef7565b602054909150600090849061359b9062010000900460ff1687613eca565b6135a59190613ef7565b60205490915060009085906135c4906301000000900460ff1688613eca565b6135ce9190613ef7565b60205490915060009086906135ed90600160201b900460ff1689613eca565b6135f79190613ef7565b90506000818386613608878a613e2f565b6136129190613e2f565b61361c9190613e2f565b6136269190613e2f565b6136309089613e1c565b600f54909150613649906001600160a01b0316866138d6565b60105461365f906001600160a01b0316856138d6565b601154613675906001600160a01b0316846138d6565b60125461368b906001600160a01b0316836138d6565b89156136dd5761369b8a876139ef565b604080518a8152602081018890529081018b90527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15b6007546040516000916001600160a01b03169083908381818185875af1925050503d806000811461372a576040519150601f19603f3d011682016040523d82523d6000602084013e61372f565b606091505b50509050801561376d576040518281527fa4049db804d87a845be4dd8b54ae7048131238fba985dd37234309ac8668d9699060200160405180910390a15b50505050505050505050505050565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106137b1576137b1613f76565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa15801561380a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061382e9190613f8c565b8160018151811061384157613841613f76565b6001600160a01b03928316602091820292909201015260065461386791309116846121a4565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac947906138a0908590600190869030904290600401613fa9565b600060405180830381600087803b1580156138ba57600080fd5b505af11580156138ce573d6000803e3d6000fd5b505050505050565b804710156139265760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610b78565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613973576040519150601f19603f3d011682016040523d82523d6000602084013e613978565b606091505b50509050806123295760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610b78565b600654613a079030906001600160a01b0316846121a4565b600654600e5460405163f305d71960e01b81523060048201526024810185905260016044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af1158015613a77573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610fbd919061401a565b600060208083528351808285015260005b81811015613ac957858101830151858201604001528201613aad565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461135e57600080fd5b60008060408385031215613b1257600080fd5b8235613b1d81613aea565b946020939093013593505050565b600060208284031215613b3d57600080fd5b5035919050565b600080600060608486031215613b5957600080fd5b8335613b6481613aea565b92506020840135613b7481613aea565b929592945050506040919091013590565b600060208284031215613b9757600080fd5b813561219d81613aea565b801515811461135e57600080fd5b60008060408385031215613bc357600080fd5b8235613bce81613aea565b91506020830135613bde81613ba2565b809150509250929050565b803560ff81168114613bfa57600080fd5b919050565b60008060008060008060c08789031215613c1857600080fd5b613c2187613be9565b9550613c2f60208801613be9565b9450613c3d60408801613be9565b9350613c4b60608801613be9565b9250613c5960808801613be9565b9150613c6760a08801613be9565b90509295509295509295565b600080600080600060a08688031215613c8b57600080fd5b8535613c9681613aea565b94506020860135613ca681613aea565b93506040860135613cb681613aea565b92506060860135613cc681613aea565b91506080860135613cd681613aea565b809150509295509295909350565b60008060408385031215613cf757600080fd5b8235613d0281613aea565b91506020830135613bde81613aea565b600181811c90821680613d2657607f821691505b602082108103613d4657634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060208284031215613d9357600080fd5b5051919050565b600060208284031215613dac57600080fd5b815161219d81613ba2565b6020808252602f908201527f444e413a204163636f756e7420697320616c7265616479207468652076616c7560408201526e65206f6620276578636c756465642760881b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b81810381811115610b4857610b48613e06565b80820180821115610b4857610b48613e06565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b8082028115828204841417610b4857610b48613e06565b634e487b7160e01b600052601260045260246000fd5b600082613f0657613f06613ee1565b500490565b68ffffffffffffffffff1991909116815260200190565b60ff8181168382160190811115610b4857610b48613e06565b600060ff831680613f4e57613f4e613ee1565b8060ff84160491505092915050565b60ff8281168282160390811115610b4857610b48613e06565b634e487b7160e01b600052603260045260246000fd5b600060208284031215613f9e57600080fd5b815161219d81613aea565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015613ff95784516001600160a01b031683529383019391830191600101613fd4565b50506001600160a01b03969096166060850152505050608001529392505050565b60008060006060848603121561402f57600080fd5b835192506020840151915060408401519050925092509256fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654af24be54adc5e716fbcaa3fca0ad593e28dff90dffd49487c0a33b1547c6b5245524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636500edc71549f0cbe47086c2237ce0cf874d6897fd1d7ce43ee6b65c0230d7606e45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220f52456c9a67860176f60befab0ce62986aeac351ffb11d6530f973f6d266ca6264736f6c63430008110033

Libraries Used


Deployed Bytecode Sourcemap

21363:24763:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21739:28;;;;;;;;;;-1:-1:-1;21739:28:0;;;;;;;;;;;179:14:1;;172:22;154:41;;142:2;127:18;21739:28:0;;;;;;;;12891:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;13855:169::-;;;;;;;;;;-1:-1:-1;13855:169:0;;;;;:::i;:::-;;:::i;34554:317::-;;;;;;;;;;-1:-1:-1;34554:317:0;;;;;:::i;:::-;;:::i;:::-;;22259:28;;;;;;;;;;-1:-1:-1;22259:28:0;;;;-1:-1:-1;;;;;22259:28:0;;;;;;-1:-1:-1;;;;;1564:32:1;;;1546:51;;1534:2;1519:18;22259:28:0;1400:203:1;27283:273:0;;;;;;;;;;;;;:::i;21440:30::-;;;;;;;;;;-1:-1:-1;21440:30:0;;;;-1:-1:-1;;;;;21440:30:0;;;13212:108;;;;;;;;;;-1:-1:-1;13300:12:0;;13212:108;;;1977:25:1;;;1965:2;1950:18;13212:108:0;1831:177:1;22188:28:0;;;;;;;;;;-1:-1:-1;22188:28:0;;;;-1:-1:-1;;;;;22188:28:0;;;33408:267;;;;;;;;;;-1:-1:-1;33408:267:0;;;;;:::i;:::-;;:::i;14032:454::-;;;;;;;;;;-1:-1:-1;14032:454:0;;;;;:::i;:::-;;:::i;33681:272::-;;;;;;;;;;-1:-1:-1;33681:272:0;;;;;:::i;:::-;;:::i;21622:41::-;;;;;;;;;;-1:-1:-1;21622:41:0;;;;-1:-1:-1;;;;;21622:41:0;;;34893:141;;;;;;;;;;;;;:::i;13111:93::-;;;;;;;;;;-1:-1:-1;13111:93:0;;13194:2;2859:36:1;;2847:2;2832:18;13111:93:0;2717:184:1;29569:130:0;;;;;;;;;;-1:-1:-1;29569:130:0;;;;;:::i;:::-;;:::i;27562:91::-;;;;;;;;;;;;;:::i;21672:58::-;;;;;;;;;;;;;;;;14494:218;;;;;;;;;;-1:-1:-1;14494:218:0;;;;;:::i;:::-;;:::i;28916:343::-;;;;;;;;;;-1:-1:-1;28916:343:0;;;;;:::i;:::-;;:::i;32579:520::-;;;;;;;;;;-1:-1:-1;32579:520:0;;;;;:::i;:::-;;:::i;22223:29::-;;;;;;;;;;-1:-1:-1;22223:29:0;;;;-1:-1:-1;;;;;22223:29:0;;;21477:38;;;;;;;;;;;;;;;28682:228;;;;;;;;;;-1:-1:-1;28682:228:0;;;;;:::i;:::-;;:::i;34445:103::-;;;;;;;;;;;;;:::i;34286:153::-;;;;;;;;;;-1:-1:-1;34286:153:0;;;;;:::i;:::-;;:::i;35347:142::-;;;;;;;;;;;;;:::i;35200:141::-;;;;;;;;;;-1:-1:-1;35200:141:0;;;;;:::i;:::-;;:::i;32072:501::-;;;;;;;;;;-1:-1:-1;32072:501:0;;;;;:::i;:::-;;:::i;13328:127::-;;;;;;;;;;-1:-1:-1;13328:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;13429:18:0;13402:7;13429:18;;;:9;:18;;;;;;;13328:127;12047:148;;;;;;;;;;;;;:::i;30063:335::-;;;;;;;;;;-1:-1:-1;30063:335:0;;;;;:::i;:::-;;:::i;28291:385::-;;;;;;;;;;-1:-1:-1;28291:385:0;;;;;:::i;:::-;;:::i;30404:1644::-;;;;;;;;;;-1:-1:-1;30404:1644:0;;;;;:::i;:::-;;:::i;29705:352::-;;;;;;;;;;-1:-1:-1;29705:352:0;;;;;:::i;:::-;;:::i;21940:58::-;;;;;;;;;;;;;;;;11833:79;;;;;;;;;;-1:-1:-1;11871:7:0;11898:6;-1:-1:-1;;;;;11898:6:0;11833:79;;12999:104;;;;;;;;;;;;;:::i;14720:400::-;;;;;;;;;;-1:-1:-1;14720:400:0;;;;;:::i;:::-;;:::i;35040:154::-;;;;;;;;;;-1:-1:-1;35040:154:0;;;;;:::i;:::-;;:::i;13463:175::-;;;;;;;;;;-1:-1:-1;13463:175:0;;;;;:::i;:::-;;:::i;21818:62::-;;;;;;;;;;;;;;;;33959:321;;;;;;;;;;-1:-1:-1;33959:321:0;;;;;:::i;:::-;;:::i;23461:57::-;;;;;;;;;;-1:-1:-1;23461:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;33105:297;;;;;;;;;;-1:-1:-1;33105:297:0;;;;;:::i;:::-;;:::i;29265:298::-;;;;;;;;;;-1:-1:-1;29265:298:0;;;;;:::i;:::-;;:::i;35495:252::-;;;;;;;;;;-1:-1:-1;35600:23:0;;;;;;;35624:24;;;;;;-1:-1:-1;;;35649:21:0;;;;;-1:-1:-1;;;35671:22:0;;;;;-1:-1:-1;;;35694:21:0;;;;;-1:-1:-1;;;35717:21:0;;;35495:252;;;;5460:4:1;5491:15;;;5473:34;;5543:15;;;5538:2;5523:18;;5516:43;5595:15;;;5575:18;;;5568:43;;;;5647:15;;;5642:2;5627:18;;5620:43;5700:15;;5694:3;5679:19;;5672:44;5753:15;;;5747:3;5732:19;;5725:44;5437:3;5422:19;35495:252:0;5187:588:1;22036:68:0;;;;;;;;;;;;;;;;28068:217;;;;;;;;;;-1:-1:-1;28068:217:0;;;;;:::i;:::-;;:::i;22113:30::-;;;;;;;;;;-1:-1:-1;22113:30:0;;;;-1:-1:-1;;;;;22113:30:0;;;13646:201;;;;;;;;;;-1:-1:-1;13646:201:0;;;;;:::i;:::-;-1:-1:-1;;;;;13812:18:0;;;13780:7;13812:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;13646:201;12203:244;;;;;;;;;;-1:-1:-1;12203:244:0;;;;;:::i;:::-;;:::i;22150:31::-;;;;;;;;;;-1:-1:-1;22150:31:0;;;;-1:-1:-1;;;;;22150:31:0;;;35753:259;;;;;;;;;;-1:-1:-1;35859:24:0;;;;;;;;;35884:25;;;;;;-1:-1:-1;;;35910:22:0;;;;;-1:-1:-1;;;35933:23:0;;;;;-1:-1:-1;;;35957:22:0;;;;;-1:-1:-1;;;35981:22:0;;;35753:259;;12891:100;12945:13;12978:5;12971:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12891:100;:::o;13855:169::-;13938:4;13955:39;11246:10;13978:7;13987:6;13955:8;:39::i;:::-;-1:-1:-1;14012:4:0;13855:169;;;;;:::o;34554:317::-;11960:6;;-1:-1:-1;;;;;11960:6:0;11246:10;11960:22;11952:67;;;;-1:-1:-1;;;11952:67:0;;;;;;;:::i;:::-;;;;;;;;;34643:21:::1;34634:6;:30;34626:86;;;::::0;-1:-1:-1;;;34626:86:0;;7121:2:1;34626:86:0::1;::::0;::::1;7103:21:1::0;7160:2;7140:18;;;7133:30;7199:34;7179:18;;;7172:62;-1:-1:-1;;;7250:18:1;;;7243:41;7301:19;;34626:86:0::1;6919:407:1::0;34626:86:0::1;34724:12;11898:6:::0;;34742:42:::1;::::0;-1:-1:-1;;;;;11898:6:0;;;;34772;;34724:12;34742:42;34724:12;34742:42;34772:6;11898;34742:42:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34723:61;;;34799:7;34795:69;;;34828:24;::::0;1977:25:1;;;34828:24:0::1;::::0;1965:2:1;1950:18;34828:24:0::1;;;;;;;34795:69;34615:256;34554:317:::0;:::o;27283:273::-;11960:6;;-1:-1:-1;;;;;11960:6:0;11246:10;11960:22;11952:67;;;;-1:-1:-1;;;11952:67:0;;;;;;;:::i;:::-;27340:16:::1;:23:::0;;-1:-1:-1;;27340:23:0::1;27359:4;27340:23;::::0;;27377:18:::1;::::0;27340:16:::1;27377:23:::0;27374:175:::1;;27438:12;27417:18;:33:::0;27489:15:::1;27465:21;:39:::0;27519:11:::1;:18:::0;;-1:-1:-1;;27519:18:0::1;-1:-1:-1::0;27519:18:0::1;::::0;;27374:175:::1;27283:273::o:0;33408:267::-;11960:6;;-1:-1:-1;;;;;11960:6:0;11246:10;11960:22;11952:67;;;;-1:-1:-1;;;11952:67:0;;;;;;;:::i;:::-;33509:11:::1;;33497:8;:23:::0;33489:80:::1;;;::::0;-1:-1:-1;;;33489:80:0;;7743:2:1;33489:80:0::1;::::0;::::1;7725:21:1::0;7782:2;7762:18;;;7755:30;7821:34;7801:18;;;7794:62;-1:-1:-1;;;7872:18:1;;;7865:42;7924:19;;33489:80:0::1;7541:408:1::0;33489:80:0::1;33622:11;::::0;33585:49:::1;::::0;33612:8;;33585:49:::1;::::0;;;::::1;33645:11;:22:::0;33408:267::o;14032:454::-;14172:4;14189:36;14199:6;14207:9;14218:6;14189:9;:36::i;:::-;14236:220;14259:6;11246:10;14307:138;14363:6;14307:138;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14307:19:0;;;;;;:11;:19;;;;;;;;11246:10;14307:33;;;;;;;;;;:37;:138::i;:::-;14236:8;:220::i;:::-;-1:-1:-1;14474:4:0;14032:454;;;;;:::o;33681:272::-;11960:6;;-1:-1:-1;;;;;11960:6:0;11246:10;11960:22;11952:67;;;;-1:-1:-1;;;11952:67:0;;;;;;;:::i;:::-;33777:15:::1;;33765:8;:27:::0;33757:87:::1;;;::::0;-1:-1:-1;;;33757:87:0;;8156:2:1;33757:87:0::1;::::0;::::1;8138:21:1::0;8195:2;8175:18;;;8168:30;8234:34;8214:18;;;8207:62;-1:-1:-1;;;8285:18:1;;;8278:46;8341:19;;33757:87:0::1;7954:412:1::0;33757:87:0::1;33892:15;::::0;33860:48:::1;::::0;33882:8;;33860:48:::1;::::0;;;::::1;33919:15;:26:::0;33681:272::o;34893:141::-;34983:15;;:43;;;-1:-1:-1;;;34983:43:0;;;;34956:7;;-1:-1:-1;;;;;34983:15:0;;:41;;:43;;;;;;;;;;;;;;:15;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34976:50;;34893:141;:::o;29569:130::-;11960:6;;-1:-1:-1;;;;;11960:6:0;11246:10;11960:22;11952:67;;;;-1:-1:-1;;;11952:67:0;;;;;;;:::i;:::-;29646:15:::1;::::0;:45:::1;::::0;-1:-1:-1;;;29646:45:0;;-1:-1:-1;;;;;1564:32:1;;;29646:45:0::1;::::0;::::1;1546:51:1::0;29646:15:0;;::::1;::::0;:36:::1;::::0;1519:18:1;;29646:45:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;29569:130:::0;:::o;27562:91::-;11960:6;;-1:-1:-1;;;;;11960:6:0;11246:10;11960:22;11952:67;;;;-1:-1:-1;;;11952:67:0;;;;;;;:::i;:::-;27621:16:::1;:24:::0;;-1:-1:-1;;27621:24:0::1;::::0;;27562:91::o;14494:218::-;11246:10;14582:4;14631:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;14631:34:0;;;;;;;;;;14582:4;;14599:83;;14622:7;;14631:50;;14670:10;14631:38;:50::i;28916:343::-;11960:6;;-1:-1:-1;;;;;11960:6:0;11246:10;11960:22;11952:67;;;;-1:-1:-1;;;11952:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29024:38:0;::::1;;::::0;;;:29:::1;:38;::::0;;;;;:47;::::1;;:38;::::0;;::::1;:47;;::::0;29016:112:::1;;;::::0;-1:-1:-1;;;29016:112:0;;8762:2:1;29016:112:0::1;::::0;::::1;8744:21:1::0;8801:2;8781:18;;;8774:30;8840:34;8820:18;;;8813:62;-1:-1:-1;;;8891:18:1;;;8884:51;8952:19;;29016:112:0::1;8560:417:1::0;29016:112:0::1;-1:-1:-1::0;;;;;29139:38:0;::::1;;::::0;;;:29:::1;:38;::::0;;;;;;;;:46;;-1:-1:-1;;29139:46:0::1;::::0;::::1;;::::0;;::::1;::::0;;;29201:50;;154:41:1;;;29201:50:0::1;::::0;127:18:1;29201:50:0::1;;;;;;;;28916:343:::0;;:::o;32579:520::-;11960:6;;-1:-1:-1;;;;;11960:6:0;11246:10;11960:22;11952:67;;;;-1:-1:-1;;;11952:67:0;;;;;;;:::i;:::-;32789:145:::1;32813:5;32819:19;32839:20;32860:17;32878:18;32897:17;32916;32789:23;:145::i;:::-;32950:141;::::0;-1:-1:-1;;;9184:28:1;;9237:2;9228:12;32950:141:0::1;;::::0;;;;;::::1;::::0;;5460:4:1;5491:15;;;5473:34;;5543:15;;;5538:2;5523:18;;5516:43;5595:15;;;5575:18;;;5568:43;5647:15;;;5642:2;5627:18;;5620:43;5700:15;;;5694:3;5679:19;;5672:44;5753:15;;5747:3;5732:19;;5725:44;32950:141:0;;;;::::1;::::0;;;;;5437:3:1;32950:141:0;;::::1;32579:520:::0;;;;;;:::o;28682:228::-;11960:6;;-1:-1:-1;;;;;11960:6:0;11246:10;11960:22;11952:67;;;;-1:-1:-1;;;11952:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;28761:19:0;::::1;;::::0;;;:10:::1;:19;::::0;;;;;::::1;;28753:59;;;::::0;-1:-1:-1;;;28753:59:0;;9453:2:1;28753:59:0::1;::::0;::::1;9435:21:1::0;9492:2;9472:18;;;9465:30;9531:29;9511:18;;;9504:57;9578:18;;28753:59:0::1;9251:351:1::0;28753:59:0::1;-1:-1:-1::0;;;;;28823:19:0;::::1;28845:5;28823:19:::0;;;:10:::1;:19;::::0;;;;;:27;;-1:-1:-1;;28823:27:0::1;::::0;;28866:36;28845:5;;28823:19;28866:36:::1;::::0;28845:5;;28866:36:::1;28682:228:::0;:::o;34445:103::-;34482:15;;:58;;-1:-1:-1;;;34482:58:0;;34521:10;34482:58;;;9791:51:1;34482:15:0;9858:18:1;;;9851:50;-1:-1:-1;;;;;34482:15:0;;;;:30;;9764:18:1;;34482:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;34445:103::o;34286:153::-;11960:6;;-1:-1:-1;;;;;11960:6:0;11246:10;11960:22;11952:67;;;;-1:-1:-1;;;11952:67:0;;;;;;;:::i;:::-;34378:15:::1;::::0;:53:::1;::::0;-1:-1:-1;;;34378:53:0;;::::1;::::0;::::1;1977:25:1::0;;;-1:-1:-1;;;;;34378:15:0;;::::1;::::0;:43:::1;::::0;1950:18:1;;34378:53:0::1;1831:177:1::0;35347:142:0;35440:15;;:41;;;-1:-1:-1;;;35440:41:0;;;;35413:7;;-1:-1:-1;;;;;35440:15:0;;:39;;:41;;;;;;;;;;;;;;:15;:41;;;;;;;;;;;;;;35200:141;35299:15;;:34;;-1:-1:-1;;;35299:34:0;;-1:-1:-1;;;;;1564:32:1;;;35299:34:0;;;1546:51:1;35272:7:0;;35299:15;;:25;;1519:18:1;;35299:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;32072:501::-;11960:6;;-1:-1:-1;;;;;11960:6:0;11246:10;11960:22;11952:67;;;;-1:-1:-1;;;11952:67:0;;;;;;;:::i;:::-;32275:139:::1;32298:5;32304:18;32323:19;32343:16;32360:17;32379:16;32397;32275:22;:139::i;:::-;32430:135;::::0;-1:-1:-1;;;10364:27:1;;10416:2;10407:12;32430:135:0::1;10162:263:1::0;12047:148:0;11960:6;;-1:-1:-1;;;;;11960:6:0;11246:10;11960:22;11952:67;;;;-1:-1:-1;;;11952:67:0;;;;;;;:::i;:::-;12154:1:::1;12138:6:::0;;12117:40:::1;::::0;-1:-1:-1;;;;;12138:6:0;;::::1;::::0;12117:40:::1;::::0;12154:1;;12117:40:::1;12185:1;12168:19:::0;;-1:-1:-1;;;;;;12168:19:0::1;::::0;;12047:148::o;30063:335::-;11960:6;;-1:-1:-1;;;;;11960:6:0;11246:10;11960:22;11952:67;;;;-1:-1:-1;;;11952:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30168:38:0;::::1;;::::0;;;:29:::1;:38;::::0;;;;;:50;::::1;;:38;::::0;;::::1;:50;;::::0;30160:109:::1;;;;-1:-1:-1::0;;;30160:109:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;30280:38:0;::::1;;::::0;;;:29:::1;:38;::::0;;;;;;;;:49;;-1:-1:-1;;30280:49:0::1;::::0;::::1;;::::0;;::::1;::::0;;;30345:45;;154:41:1;;;30345:45:0::1;::::0;127:18:1;30345:45:0::1;14:187:1::0;28291:385:0;11960:6;;-1:-1:-1;;;;;11960:6:0;11246:10;11960:22;11952:67;;;;-1:-1:-1;;;11952:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;28369:19:0;::::1;;::::0;;;:10:::1;:19;::::0;;;;;::::1;;28368:20;28360:64;;;::::0;-1:-1:-1;;;28360:64:0;;11048:2:1;28360:64:0::1;::::0;::::1;11030:21:1::0;11087:2;11067:18;;;11060:30;11126:33;11106:18;;;11099:61;11177:18;;28360:64:0::1;10846:355:1::0;28360:64:0::1;28439:11;::::0;::::1;;28435:146;;;28519:6;28494:21;;28476:15;:39;;;;:::i;:::-;28475:50;28467:102;;;::::0;-1:-1:-1;;;28467:102:0;;11673:2:1;28467:102:0::1;::::0;::::1;11655:21:1::0;11712:2;11692:18;;;11685:30;11751:34;11731:18;;;11724:62;-1:-1:-1;;;11802:18:1;;;11795:37;11849:19;;28467:102:0::1;11471:403:1::0;28467:102:0::1;-1:-1:-1::0;;;;;28591:19:0;::::1;;::::0;;;:10:::1;:19;::::0;;;;;:26;;-1:-1:-1;;28591:26:0::1;28613:4;28591:26:::0;;::::1;::::0;;;28633:35;;28613:4;;28591:19;28633:35:::1;::::0;::::1;28291:385:::0;:::o;30404:1644::-;11960:6;;-1:-1:-1;;;;;11960:6:0;11246:10;11960:22;11952:67;;;;-1:-1:-1;;;11952:67:0;;;;;;;:::i;:::-;30591:15:::1;::::0;-1:-1:-1;;;;;30591:37:0;;::::1;:15:::0;::::1;:37;30587:290;;-1:-1:-1::0;;;;;30653:32:0;::::1;30645:81;;;::::0;-1:-1:-1;;;30645:81:0;;12081:2:1;30645:81:0::1;::::0;::::1;12063:21:1::0;12120:2;12100:18;;;12093:30;12159:34;12139:18;;;12132:62;-1:-1:-1;;;12210:18:1;;;12203:34;12254:19;;30645:81:0::1;11879:400:1::0;30645:81:0::1;30798:15;::::0;30746:68:::1;::::0;-1:-1:-1;;;12486:30:1;;-1:-1:-1;;;;;30798:15:0;;::::1;::::0;30746:68;::::1;::::0;12541:2:1;12532:12;30746:68:0::1;::::0;;;;::::1;::::0;;;-1:-1:-1;;;;;;;;;;;30746:68:0;;;::::1;30829:15;:36:::0;;-1:-1:-1;;;;;;30829:36:0::1;-1:-1:-1::0;;;;;30829:36:0;::::1;;::::0;;30587:290:::1;30891:16;::::0;-1:-1:-1;;;;;30891:39:0;;::::1;:16:::0;::::1;:39;30887:299;;-1:-1:-1::0;;;;;30955:33:0;::::1;30947:83;;;::::0;-1:-1:-1;;;30947:83:0;;12757:2:1;30947:83:0::1;::::0;::::1;12739:21:1::0;12796:2;12776:18;;;12769:30;12835:34;12815:18;;;12808:62;-1:-1:-1;;;12886:18:1;;;12879:35;12931:19;;30947:83:0::1;12555:401:1::0;30947:83:0::1;31104:16;::::0;31050:71:::1;::::0;-1:-1:-1;;;13163:31:1;;-1:-1:-1;;;;;31104:16:0;;::::1;::::0;31050:71;::::1;::::0;13219:2:1;13210:12;31050:71:0::1;::::0;;;;::::1;::::0;;;-1:-1:-1;;;;;;;;;;;31050:71:0;;;::::1;31136:16;:38:::0;;-1:-1:-1;;;;;;31136:38:0::1;-1:-1:-1::0;;;;;31136:38:0;::::1;;::::0;;30887:299:::1;31200:13;::::0;-1:-1:-1;;;;;31200:33:0;;::::1;:13:::0;::::1;:33;31196:272;;-1:-1:-1::0;;;;;31258:30:0;::::1;31250:77;;;::::0;-1:-1:-1;;;31250:77:0;;13435:2:1;31250:77:0::1;::::0;::::1;13417:21:1::0;13474:2;13454:18;;;13447:30;13513:34;13493:18;;;13486:62;-1:-1:-1;;;13564:18:1;;;13557:32;13606:19;;31250:77:0::1;13233:398:1::0;31250:77:0::1;31395:13;::::0;31347:62:::1;::::0;-1:-1:-1;;;13838:28:1;;-1:-1:-1;;;;;31395:13:0;;::::1;::::0;31347:62;::::1;::::0;13891:2:1;13882:12;31347:62:0::1;::::0;;;;::::1;::::0;;;-1:-1:-1;;;;;;;;;;;31347:62:0;;;::::1;31424:13;:32:::0;;-1:-1:-1;;;;;;31424:32:0::1;-1:-1:-1::0;;;;;31424:32:0;::::1;;::::0;;31196:272:::1;31482:14;::::0;-1:-1:-1;;;;;31482:35:0;;::::1;:14:::0;::::1;:35;31478:281;;-1:-1:-1::0;;;;;31542:31:0;::::1;31534:79;;;::::0;-1:-1:-1;;;31534:79:0;;14107:2:1;31534:79:0::1;::::0;::::1;14089:21:1::0;14146:2;14126:18;;;14119:30;14185:34;14165:18;;;14158:62;-1:-1:-1;;;14236:18:1;;;14229:33;14279:19;;31534:79:0::1;13905:399:1::0;31534:79:0::1;31683:14;::::0;31633:65:::1;::::0;-1:-1:-1;;;14511:29:1;;-1:-1:-1;;;;;31683:14:0;;::::1;::::0;31633:65;::::1;::::0;14565:2:1;14556:12;31633:65:0::1;::::0;;;;::::1;::::0;;;-1:-1:-1;;;;;;;;;;;31633:65:0;;;::::1;31713:14;:34:::0;;-1:-1:-1;;;;;;31713:34:0::1;-1:-1:-1::0;;;;;31713:34:0;::::1;;::::0;;31478:281:::1;31773:13;::::0;-1:-1:-1;;;;;31773:33:0;;::::1;:13:::0;::::1;:33;31769:272;;-1:-1:-1::0;;;;;31831:30:0;::::1;31823:77;;;::::0;-1:-1:-1;;;31823:77:0;;14781:2:1;31823:77:0::1;::::0;::::1;14763:21:1::0;14820:2;14800:18;;;14793:30;14859:34;14839:18;;;14832:62;-1:-1:-1;;;14910:18:1;;;14903:32;14952:19;;31823:77:0::1;14579:398:1::0;31823:77:0::1;31968:13;::::0;31920:62:::1;::::0;-1:-1:-1;;;15184:28:1;;-1:-1:-1;;;;;31968:13:0;;::::1;::::0;31920:62;::::1;::::0;15237:2:1;15228:12;31920:62:0::1;::::0;;;;::::1;::::0;;;-1:-1:-1;;;;;;;;;;;31920:62:0;;;::::1;31997:13;:32:::0;;-1:-1:-1;;;;;31997:32:0;::::1;-1:-1:-1::0;;;;;;31997:32:0;;::::1;;::::0;;30404:1644;;;;;:::o;29705:352::-;11960:6;;-1:-1:-1;;;;;11960:6:0;11246:10;11960:22;11952:67;;;;-1:-1:-1;;;11952:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29815:43:0;::::1;;::::0;;;:34:::1;:43;::::0;;;;;:55;::::1;;:43;::::0;;::::1;:55;;::::0;29807:114:::1;;;;-1:-1:-1::0;;;29807:114:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;29932:43:0;::::1;;::::0;;;:34:::1;:43;::::0;;;;;;;;:54;;-1:-1:-1;;29932:54:0::1;::::0;::::1;;::::0;;::::1;::::0;;;30002:47;;154:41:1;;;30002:47:0::1;::::0;127:18:1;30002:47:0::1;14:187:1::0;12999:104:0;13055:13;13088:7;13081:14;;;;;:::i;14720:400::-;14840:4;14862:228;11246:10;14912:7;14934:145;14991:15;14934:145;;;;;;;;;;;;;;;;;11246:10;14934:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;14934:34:0;;;;;;;;;;;;:38;:145::i;35040:154::-;35139:15;;:47;;-1:-1:-1;;;35139:47:0;;-1:-1:-1;;;;;1564:32:1;;;35139:47:0;;;1546:51:1;35112:7:0;;35139:15;;:38;;1519:18:1;;35139:47:0;1400:203:1;13463:175:0;13549:4;13566:42;11246:10;13590:9;13601:6;13566:9;:42::i;33959:321::-;11960:6;;-1:-1:-1;;;;;11960:6:0;11246:10;11960:22;11952:67;;;;-1:-1:-1;;;11952:67:0;;;;;;;:::i;:::-;34063:23:::1;;34051:8;:35:::0;34043:103:::1;;;::::0;-1:-1:-1;;;34043:103:0;;15453:2:1;34043:103:0::1;::::0;::::1;15435:21:1::0;15492:2;15472:18;;;15465:30;15531:34;15511:18;;;15504:62;15602:26;15582:18;;;15575:54;15646:19;;34043:103:0::1;15251:420:1::0;34043:103:0::1;34203:23;::::0;34162:65:::1;::::0;34193:8;;34162:65:::1;::::0;;;::::1;34238:23;:34:::0;33959:321::o;33105:297::-;11960:6;;-1:-1:-1;;;;;11960:6:0;11246:10;11960:22;11952:67;;;;-1:-1:-1;;;11952:67:0;;;;;;;:::i;:::-;33211:15:::1;::::0;-1:-1:-1;;;;;33211:15:0;;::::1;33189:38:::0;;::::1;::::0;33181:90:::1;;;::::0;-1:-1:-1;;;33181:90:0;;15878:2:1;33181:90:0::1;::::0;::::1;15860:21:1::0;15917:2;15897:18;;;15890:30;15956:34;15936:18;;;15929:62;-1:-1:-1;;;16007:18:1;;;16000:38;16055:19;;33181:90:0::1;15676:404:1::0;33181:90:0::1;33329:15;::::0;33287:59:::1;::::0;-1:-1:-1;;;;;33329:15:0;;::::1;::::0;33287:59;::::1;::::0;::::1;::::0;33329:15:::1;::::0;33287:59:::1;33357:15;:37:::0;;-1:-1:-1;;;;;;33357:37:0::1;-1:-1:-1::0;;;;;33357:37:0;;;::::1;::::0;;;::::1;::::0;;33105:297::o;29265:298::-;11960:6;;-1:-1:-1;;;;;11960:6:0;11246:10;11960:22;11952:67;;;;-1:-1:-1;;;11952:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29360:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;:39;::::1;;:27;::::0;;::::1;:39;;::::0;29352:98:::1;;;;-1:-1:-1::0;;;29352:98:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;29461:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;;;;:38;;-1:-1:-1;;29461:38:0::1;::::0;::::1;;::::0;;::::1;::::0;;;29515:40;;154:41:1;;;29515:40:0::1;::::0;127:18:1;29515:40:0::1;14:187:1::0;28068:217:0;11960:6;;-1:-1:-1;;;;;11960:6:0;11246:10;11960:22;11952:67;;;;-1:-1:-1;;;11952:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;28163:38:0;::::1;;::::0;;;:29:::1;:38;::::0;;;;;;;;:48;;-1:-1:-1;;28163:48:0::1;::::0;::::1;;::::0;;::::1;::::0;;;28227:50;;154:41:1;;;28227:50:0::1;::::0;127:18:1;28227:50:0::1;14:187:1::0;12203:244:0;11960:6;;-1:-1:-1;;;;;11960:6:0;11246:10;11960:22;11952:67;;;;-1:-1:-1;;;11952:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;12292:22:0;::::1;12284:73;;;::::0;-1:-1:-1;;;12284:73:0;;16287:2:1;12284:73:0::1;::::0;::::1;16269:21:1::0;16326:2;16306:18;;;16299:30;16365:34;16345:18;;;16338:62;-1:-1:-1;;;16416:18:1;;;16409:36;16462:19;;12284:73:0::1;16085:402:1::0;12284:73:0::1;12394:6;::::0;;12373:38:::1;::::0;-1:-1:-1;;;;;12373:38:0;;::::1;::::0;12394:6;::::1;::::0;12373:38:::1;::::0;::::1;12422:6;:17:::0;;-1:-1:-1;;;;;;12422:17:0::1;-1:-1:-1::0;;;;;12422:17:0;;;::::1;::::0;;;::::1;::::0;;12203:244::o;2869:181::-;2927:7;;2959:5;2963:1;2959;:5;:::i;:::-;2947:17;;2988:1;2983;:6;;2975:46;;;;-1:-1:-1;;;2975:46:0;;16824:2:1;2975:46:0;;;16806:21:1;16863:2;16843:18;;;16836:30;16902:29;16882:18;;;16875:57;16949:18;;2975:46:0;16622:351:1;2975:46:0;3041:1;2869:181;-1:-1:-1;;;2869:181:0:o;16509:378::-;-1:-1:-1;;;;;16645:19:0;;16637:68;;;;-1:-1:-1;;;16637:68:0;;17180:2:1;16637:68:0;;;17162:21:1;17219:2;17199:18;;;17192:30;17258:34;17238:18;;;17231:62;-1:-1:-1;;;17309:18:1;;;17302:34;17353:19;;16637:68:0;16978:400:1;16637:68:0;-1:-1:-1;;;;;16724:21:0;;16716:68;;;;-1:-1:-1;;;16716:68:0;;17585:2:1;16716:68:0;;;17567:21:1;17624:2;17604:18;;;17597:30;17663:34;17643:18;;;17636:62;-1:-1:-1;;;17714:18:1;;;17707:32;17756:19;;16716:68:0;17383:398:1;16716:68:0;-1:-1:-1;;;;;16795:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;16847:32;;1977:25:1;;;16847:32:0;;1950:18:1;16847:32:0;;;;;;;;16509:378;;;:::o;36031:2159::-;-1:-1:-1;;;;;36163:18:0;;36155:68;;;;-1:-1:-1;;;36155:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36242:16:0;;36234:64;;;;-1:-1:-1;;;36234:64:0;;;;;;;:::i;:::-;36315:6;36325:1;36315:11;36311:93;;36343:28;36359:4;36365:2;36369:1;36343:15;:28::i;:::-;36031:2159;;;:::o;36311:93::-;-1:-1:-1;;;;;36421:35:0;;;;;;:29;:35;;;;;;;;36420:36;:74;;;;-1:-1:-1;;;;;;36461:33:0;;;;;;:29;:33;;;;;;;;36460:34;36420:74;36416:722;;;36519:16;;;;36511:64;;;;-1:-1:-1;;;36511:64:0;;18798:2:1;36511:64:0;;;18780:21:1;18837:2;18817:18;;;18810:30;18876:34;18856:18;;;18849:62;-1:-1:-1;;;18927:18:1;;;18920:33;18970:19;;36511:64:0;18596:399:1;36511:64:0;-1:-1:-1;;;;;36599:14:0;;;;;;:10;:14;;;;;;;;36598:15;36590:51;;;;-1:-1:-1;;;36590:51:0;;19202:2:1;36590:51:0;;;19184:21:1;19241:2;19221:18;;;19214:30;-1:-1:-1;;;19260:18:1;;;19253:53;19323:18;;36590:51:0;19000:347:1;36590:51:0;-1:-1:-1;;;;;36665:16:0;;;;;;:10;:16;;;;;;;;36664:17;36656:53;;;;-1:-1:-1;;;36656:53:0;;19202:2:1;36656:53:0;;;19184:21:1;19241:2;19221:18;;;19214:30;-1:-1:-1;;;19260:18:1;;;19253:53;19323:18;;36656:53:0;19000:347:1;36656:53:0;-1:-1:-1;;;;;36729:38:0;;;;;;:34;:38;;;;;;;;36728:39;:84;;;;-1:-1:-1;;;;;;36772:40:0;;;;;;:34;:40;;;;;;;;36771:41;36728:84;36724:202;;;36851:11;;36841:6;:21;;36833:77;;;;-1:-1:-1;;;36833:77:0;;19554:2:1;36833:77:0;;;19536:21:1;19593:2;19573:18;;;19566:30;19632:34;19612:18;;;19605:62;-1:-1:-1;;;19683:18:1;;;19676:41;19734:19;;36833:77:0;19352:407:1;36833:77:0;-1:-1:-1;;;;;36945:33:0;;;;;;:29;:33;;;;;;;;36940:187;;37035:15;;37024:6;37008:13;37018:2;-1:-1:-1;;;;;13429:18:0;13402:7;13429:18;;;:9;:18;;;;;;;13328:127;37008:13;:22;;;;:::i;:::-;37007:43;;36999:112;;;;-1:-1:-1;;;36999:112:0;;19966:2:1;36999:112:0;;;19948:21:1;20005:2;19985:18;;;19978:30;20044:34;20024:18;;;20017:62;20115:26;20095:18;;;20088:54;20159:19;;36999:112:0;19764:420:1;36999:112:0;-1:-1:-1;;;;;37163:31:0;;;;;;;:25;:31;;;;;;;37196:29;;;;;;;;37150:86;;37163:31;;;;;37196:29;37189:4;37222:2;37150:12;:86::i;:::-;37290:23;;37280:4;37247:12;13429:18;;;:9;:18;;;;;;37344:16;;-1:-1:-1;;37262:51:0;;37344:16;;:40;;;;;37377:7;37344:40;:67;;;;-1:-1:-1;37402:9:0;;;;37401:10;37344:67;:97;;;;-1:-1:-1;37428:9:0;;-1:-1:-1;;;37428:9:0;;;;:13;;37344:97;:143;;;;-1:-1:-1;;;;;;37458:29:0;;;;;;:25;:29;;;;;;;;37344:143;37326:280;;;37514:9;:16;;-1:-1:-1;;37514:16:0;37526:4;37514:16;;;37545:17;:15;:17::i;:::-;37577:9;:17;;-1:-1:-1;;37577:17:0;;;37326:280;37634:9;;37618:12;;37634:9;;37633:10;:30;;;;-1:-1:-1;37647:16:0;;;;37633:30;-1:-1:-1;;;;;37680:24:0;;;;;;:18;:24;;;;;;37618:45;;-1:-1:-1;37680:24:0;;;:50;;-1:-1:-1;;;;;;37708:22:0;;;;;;:18;:22;;;;;;;;37680:50;37676:98;;;-1:-1:-1;37757:5:0;37676:98;37788:7;:24;;;;-1:-1:-1;37799:9:0;;-1:-1:-1;;;37799:9:0;;;;:13;;37788:24;37784:189;;;37853:9;;37829:11;;37866:3;;37844:18;;-1:-1:-1;;;37853:9:0;;;;37844:6;:18;:::i;:::-;37843:26;;;;:::i;:::-;37829:40;-1:-1:-1;37893:12:0;37829:40;37893:6;:12;:::i;:::-;37884:21;;37920:41;37936:4;37950;37957:3;37920:15;:41::i;:::-;37814:159;37784:189;37983:33;37999:4;38005:2;38009:6;37983:15;:33::i;:::-;38033:15;;-1:-1:-1;;;;;38033:15:0;:26;38068:4;38075:15;38068:4;-1:-1:-1;;;;;13429:18:0;13402:7;13429:18;;;:9;:18;;;;;;;13328:127;38075:15;38033:58;;-1:-1:-1;;;;;;38033:58:0;;;;;;;-1:-1:-1;;;;;20827:32:1;;;38033:58:0;;;20809:51:1;20876:18;;;20869:34;20782:18;;38033:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38029:74;38117:15;;-1:-1:-1;;;;;38117:15:0;:26;38152:2;38157:13;38152:2;-1:-1:-1;;;;;13429:18:0;13402:7;13429:18;;;:9;:18;;;;;;;13328:127;38157:13;38117:54;;-1:-1:-1;;;;;;38117:54:0;;;;;;;-1:-1:-1;;;;;20827:32:1;;;38117:54:0;;;20809:51:1;20876:18;;;20869:34;20782:18;;38117:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38113:70;;;36144:2046;;36031:2159;;;:::o;3202:226::-;3322:7;3358:12;3350:6;;;;3342:29;;;;-1:-1:-1;;;3342:29:0;;;;;;;;:::i;:::-;-1:-1:-1;3382:9:0;3394:5;3398:1;3394;:5;:::i;:::-;3382:17;3202:226;-1:-1:-1;;;;;3202:226:0:o;40020:1705::-;40256:22;;;;:45;;;;:22;;;;;:45;40252:243;;40323:101;;-1:-1:-1;;;21116:33:1;;21174:2;21165:12;40323:101:0;;;;;;;;40365:22;;;;40409:14;;40323:101;;40365:22;;;;;;;;40323:101;;;;-1:-1:-1;;;;;;;;;;;40323:101:0;;;40409:14;;;40323:101;:::i;:::-;;;;;;;;40439:22;;;:44;;-1:-1:-1;;40439:44:0;;;;;;;;;40252:243;40509:23;;;;:47;;;;:23;;;;;:47;40505:250;;40578:104;;-1:-1:-1;;;21604:34:1;;21663:2;21654:12;40578:104:0;;;;;;;;40621:23;;;;40667:14;;40578:104;;40621:23;;;;;;;;40578:104;;;;-1:-1:-1;;;;;;;;;;;40578:104:0;;;40667:14;;;40578:104;:::i;:::-;;;;;;;;40697:23;;;:46;;-1:-1:-1;;40697:46:0;;;;;;;;;40505:250;40769:20;;;;:41;;;;-1:-1:-1;;;40769:20:0;;;;:41;40765:229;;40832:95;;-1:-1:-1;;;21879:31:1;;21935:2;21926:12;40832:95:0;;;;;;;;40872:20;;;;40912:14;;40832:95;;40872:20;-1:-1:-1;;;40872:20:0;;;;;;40832:95;;;;-1:-1:-1;;;;;;;;;;;40832:95:0;;;40912:14;;;40832:95;:::i;:::-;;;;;;;;40942:20;;;:40;;-1:-1:-1;;;;40942:40:0;-1:-1:-1;;;40942:40:0;;;;;;;40765:229;41008:21;;;;:43;;;;-1:-1:-1;;;41008:21:0;;;;:43;41004:236;;41073:98;;-1:-1:-1;;;22151:32:1;;22208:2;22199:12;41073:98:0;;;;;;;;41114:21;;;;41156:14;;41073:98;;41114:21;-1:-1:-1;;;41114:21:0;;;;;;41073:98;;;;-1:-1:-1;;;;;;;;;;;41073:98:0;;;41156:14;;;41073:98;:::i;:::-;;;;;;;;41186:21;;;:42;;-1:-1:-1;;41186:42:0;-1:-1:-1;;;41186:42:0;;;;;;;41004:236;41254:20;;;;:41;;;;-1:-1:-1;;;41254:20:0;;;;:41;41250:229;;41317:95;;-1:-1:-1;;;22424:31:1;;22480:2;22471:12;41317:95:0;;;;;;;;41357:20;;;;41397:14;;41317:95;;41357:20;-1:-1:-1;;;41357:20:0;;;;;;41317:95;;;;-1:-1:-1;;;;;;;;;;;41317:95:0;;;41397:14;;;41317:95;:::i;:::-;;;;;;;;41427:20;;;:40;;-1:-1:-1;;41427:40:0;-1:-1:-1;;;41427:40:0;;;;;;;41250:229;41493:20;;;;:41;;;;-1:-1:-1;;;41493:20:0;;;;:41;41489:229;;41556:95;;-1:-1:-1;;;22696:31:1;;22752:2;22743:12;41556:95:0;;;;;;;;41596:20;;;;41636:14;;41556:95;;41596:20;-1:-1:-1;;;41596:20:0;;;;;;41556:95;;;;-1:-1:-1;;;;;;;;;;;41556:95:0;;;41636:14;;;41556:95;:::i;:::-;;;;;;;;41666:20;;;:40;;-1:-1:-1;;;;41666:40:0;-1:-1:-1;;;41666:40:0;;;;;;;41489:229;40020:1705;;;;;;;:::o;41731:1657::-;41961:21;;;;:43;;;;:21;;:43;41957:236;;42026:98;;-1:-1:-1;;;22968:32:1;;23025:2;23016:12;42026:98:0;;;;;;;;42067:21;;;;42109:14;;42026:98;;42067:21;;;;;42026:98;;;;-1:-1:-1;;;;;;;;;;;42026:98:0;;;42109:14;;;42026:98;:::i;:::-;;;;;;;;42139:21;;;:42;;-1:-1:-1;;42139:42:0;;;;;;;41957:236;42207:22;;;;:45;;;;:22;;;;;:45;42203:243;;42274:101;;-1:-1:-1;;;23241:33:1;;23299:2;23290:12;42274:101:0;;;;;;;;42316:22;;;;42360:14;;42274:101;;42316:22;;;;;;;;42274:101;;;;-1:-1:-1;;;;;;;;;;;42274:101:0;;;42360:14;;;42274:101;:::i;:::-;;;;;;;;42390:22;;;:44;;-1:-1:-1;;42390:44:0;;;;;;;;;42203:243;42460:19;;;;:39;;;;-1:-1:-1;;;42460:19:0;;;;:39;42456:222;;42521:92;;-1:-1:-1;;;23515:30:1;;23570:2;23561:12;42521:92:0;;;;;;;;42560:19;;;;42598:14;;42521:92;;42560:19;-1:-1:-1;;;42560:19:0;;;;;;42521:92;;;;-1:-1:-1;;;;;;;;;;;42521:92:0;;;42598:14;;;42521:92;:::i;:::-;;;;;;;;42628:19;;;:38;;-1:-1:-1;;42628:38:0;-1:-1:-1;;;42628:38:0;;;;;;;42456:222;42692:20;;;;:41;;;;-1:-1:-1;;;42692:20:0;;;;:41;42688:229;;42755:95;;-1:-1:-1;;;23786:31:1;;23842:2;23833:12;42755:95:0;;;;;;;;42795:20;;;;42835:14;;42755:95;;42795:20;-1:-1:-1;;;42795:20:0;;;;;;42755:95;;;;-1:-1:-1;;;;;;;;;;;42755:95:0;;;42835:14;;;42755:95;:::i;:::-;;;;;;;;42865:20;;;:40;;-1:-1:-1;;42865:40:0;-1:-1:-1;;;42865:40:0;;;;;;;42688:229;42931:19;;;;:39;;;;-1:-1:-1;;;42931:19:0;;;;:39;42927:222;;42992:92;;-1:-1:-1;;;24058:30:1;;24113:2;24104:12;42992:92:0;;;;;;;;43031:19;;;;43069:14;;42992:92;;43031:19;-1:-1:-1;;;43031:19:0;;;;;;42992:92;;;;-1:-1:-1;;;;;;;;;;;42992:92:0;;;43069:14;;;42992:92;:::i;:::-;;;;;;;;43099:19;;;:38;;-1:-1:-1;;43099:38:0;-1:-1:-1;;;43099:38:0;;;;;;;42927:222;43163:19;;;;:39;;;;-1:-1:-1;;;43163:19:0;;;;:39;43159:222;;43224:92;;-1:-1:-1;;;24329:30:1;;24384:2;24375:12;43224:92:0;;;;;;;;43263:19;;;;43301:14;;43224:92;;43263:19;-1:-1:-1;;;43263:19:0;;;;;;43224:92;;;;-1:-1:-1;;;;;;;;;;;43224:92:0;;;43301:14;;;43224:92;:::i;:::-;;;;;;;;43331:19;;;:38;;;;;-1:-1:-1;;;43331:38:0;-1:-1:-1;;;;43331:38:0;;;;;;41731:1657;;;;;;;:::o;15128:569::-;-1:-1:-1;;;;;15268:20:0;;15260:70;;;;-1:-1:-1;;;15260:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;15349:23:0;;15341:71;;;;-1:-1:-1;;;15341:71:0;;;;;;;:::i;:::-;15501;15523:6;15501:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15501:17:0;;;;;;:9;:17;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;15481:17:0;;;;;;;:9;:17;;;;;;:91;;;;15606:20;;;;;;;:32;;15631:6;15606:24;:32::i;:::-;-1:-1:-1;;;;;15583:20:0;;;;;;;:9;:20;;;;;;;:55;;;;15654:35;;;;;;;;;;15682:6;1977:25:1;;1965:2;1950:18;;1831:177;38196:1818:0;38295:13;:17;;-1:-1:-1;;38431:15:0;;;38459:514;;;;38495:11;;;;:53;;;;;38547:1;38525:18;;38510:12;:33;;;;:::i;:::-;:38;;38495:53;38491:471;;;38569:13;:19;;-1:-1:-1;;38569:19:0;38585:3;38569:19;;;38491:471;;;38645:23;;38629:13;:39;;38645:23;;;;-1:-1:-1;;38687:41:0;;;;;;;38645:23;38704:24;;;;;;38687:41;;;;;;;;-1:-1:-1;;38801:37:0;-1:-1:-1;;;38761:21:0;;;;;38747:35;;;;-1:-1:-1;;38801:37:0;;-1:-1:-1;;;38816:22:0;;;;38801:37;;;-1:-1:-1;;38911:35:0;-1:-1:-1;;;38871:21:0;;;;38857:35;;;;-1:-1:-1;;;;38911:35:0;;-1:-1:-1;;;38925:21:0;;;;-1:-1:-1;;;38911:35:0;;;;;;;38491:471;38987:10;38983:346;;;39030:24;;39014:13;:40;;39030:24;;;;;;;;-1:-1:-1;;39069:42:0;;;;;;;39086:25;;;;;;39069:42;;;;;-1:-1:-1;;39177:38:0;-1:-1:-1;;;39140:22:0;;;;;39126:36;;-1:-1:-1;;39177:38:0;;;;;-1:-1:-1;;;39192:23:0;;;;39177:38;;;;;;;;-1:-1:-1;;39281:36:0;-1:-1:-1;;;39244:22:0;;;;-1:-1:-1;;;39230:36:0;-1:-1:-1;;;;39281:36:0;;-1:-1:-1;;;39295:22:0;;;;;;;39281:36;;;;;;;38983:346;39344:10;39343:11;:27;;;;;39359:11;39358:12;39343:27;:105;;;;-1:-1:-1;;;;;;39375:35:0;;;;;;:29;:35;;;;;;;;;:72;;-1:-1:-1;;;;;;39414:33:0;;;;;;:29;:33;;;;;;;;39375:72;39339:436;;;39481:23;;39465:13;:39;;39481:23;;;;-1:-1:-1;;39519:41:0;;;;;;;39481:23;39536:24;;;;;;39519:41;;;;;;;;-1:-1:-1;;39625:37:0;-1:-1:-1;;;39589:21:0;;;;;39575:35;;;;-1:-1:-1;;39625:37:0;;-1:-1:-1;;;39640:22:0;;;;39625:37;;;-1:-1:-1;;39728:35:0;-1:-1:-1;;;39691:22:0;;;;39677:36;;;;-1:-1:-1;;;;39728:35:0;;-1:-1:-1;;;39742:21:0;;;;-1:-1:-1;;;39728:35:0;;;;;;;39339:436;39873:11;;;-1:-1:-1;;;39873:11:0;;;;;-1:-1:-1;;;39859:11:0;;;;;39844:12;;;;;;39830:11;;;;;;39797:30;;39873:11;39813:14;;;;;39797:13;:30;:::i;:::-;:44;;;;:::i;:::-;:59;;;;:::i;:::-;:73;;;;:::i;:::-;:87;;;;:::i;:::-;39785:9;:99;;;;;;-1:-1:-1;;;39785:99:0;;;-1:-1:-1;;39785:99:0;;;;;;;39900:106;;;39912:13;;;;;;;;;;24861:34:1;;39785:99:0;39927:14;;;;24911:18:1;;;24904:43;;;;39943:11:0;;;;;24963:18:1;;;24956:43;39956:12:0;;;;;25030:2:1;25015:18;;25008:43;-1:-1:-1;;;39970:11:0;;;;25082:3:1;25067:19;;25060:44;-1:-1:-1;;;39983:11:0;;;;25135:3:1;25120:19;;25113:44;39996:9:0;;;;;25188:3:1;25173:19;;25166:44;39900:106:0;;;;;;;24825:3:1;39900:106:0;;;38196:1818;;;;:::o;43396:1786::-;43486:4;43442:23;13429:18;;;:9;:18;;;;;;43627:9;;43442:50;;-1:-1:-1;43531:21:0;;43503:25;;43639:1;;43627:9;-1:-1:-1;;;43627:9:0;;;;;43592:31;;43610:13;43442:50;43592:31;:::i;:::-;43591:45;;;;:::i;:::-;:49;;;;:::i;:::-;43565:75;-1:-1:-1;43651:20:0;43674:33;43565:75;43674:15;:33;:::i;:::-;43651:56;;43720:31;43738:12;43720:17;:31::i;:::-;43764:27;43794:41;43818:17;43794:21;:41;:::i;:::-;43881:13;;43764:71;;-1:-1:-1;43846:19:0;;43881:17;;43897:1;;43881:13;;:17;:::i;:::-;43868:9;;:31;;;-1:-1:-1;;;43868:9:0;;;;:31;:::i;:::-;43962:13;;43846:53;;;;;-1:-1:-1;43910:26:0;;43993:1;;43846:53;;43940:35;;43962:13;43940:19;:35;:::i;:::-;43939:51;;;;:::i;:::-;:55;;;;:::i;:::-;44058:14;;43910:84;;-1:-1:-1;44005:27:0;;44076:11;;44036:36;;44058:14;;;;;44036:19;:36;:::i;:::-;44035:52;;;;:::i;:::-;44148:11;;44005:82;;-1:-1:-1;44098:24:0;;44163:11;;44126:33;;44148:11;;;;;44126:19;:33;:::i;:::-;44125:49;;;;:::i;:::-;44236:12;;44098:76;;-1:-1:-1;44185:25:0;;44252:11;;44214:34;;44236:12;;;;;44214:19;:34;:::i;:::-;44213:50;;;;:::i;:::-;44324:11;;44185:78;;-1:-1:-1;44274:24:0;;44339:11;;44302:33;;-1:-1:-1;;;44324:11:0;;;;44302:19;:33;:::i;:::-;44301:49;;;;:::i;:::-;44274:76;-1:-1:-1;44361:24:0;44274:76;44473:17;44451:19;44411:37;44432:16;44411:18;:37;:::i;:::-;:59;;;;:::i;:::-;:79;;;;:::i;:::-;:98;;;;:::i;:::-;44388:122;;:19;:122;:::i;:::-;44549:16;;44361:149;;-1:-1:-1;44523:64:0;;-1:-1:-1;;;;;44549:16:0;44567:19;44523:17;:64::i;:::-;44624:13;;44598:58;;-1:-1:-1;;;;;44624:13:0;44639:16;44598:17;:58::i;:::-;44693:14;;44667:60;;-1:-1:-1;;;;;44693:14:0;44709:17;44667;:60::i;:::-;44764:13;;44738:59;;-1:-1:-1;;;;;44764:13:0;44780:16;44738:17;:59::i;:::-;44814:19;;44810:187;;44850:50;44864:15;44881:18;44850:13;:50::i;:::-;44920:65;;;25749:25:1;;;25805:2;25790:18;;25783:34;;;25833:18;;;25826:34;;;44920:65:0;;25737:2:1;25722:18;44920:65:0;;;;;;;44810:187;45036:15;;45028:60;;45010:12;;-1:-1:-1;;;;;45036:15:0;;45066:16;;45010:12;45028:60;45010:12;45028:60;45066:16;45036:15;45028:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45009:79;;;45103:7;45099:76;;;45132:31;;1977:25:1;;;45132:31:0;;1965:2:1;1950:18;45132:31:0;;;;;;;45099:76;43431:1751;;;;;;;;;;;;;43396:1786::o;45190:500::-;45281:16;;;45295:1;45281:16;;;;;;;;45257:21;;45281:16;;;;;;;;;;-1:-1:-1;45281:16:0;45257:40;;45326:4;45308;45313:1;45308:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;45308:23:0;;;:7;;;;;;;;;;:23;;;;45352:15;;:22;;;-1:-1:-1;;;45352:22:0;;;;:15;;;;;:20;;:22;;;;;45308:7;;45352:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45342:4;45347:1;45342:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;45342:32:0;;;:7;;;;;;;;;:32;45417:15;;45385:62;;45402:4;;45417:15;45435:11;45385:8;:62::i;:::-;45458:15;;:224;;-1:-1:-1;;;45458:224:0;;-1:-1:-1;;;;;45458:15:0;;;;:66;;:224;;45539:11;;45458:15;;45609:4;;45636;;45656:15;;45458:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45246:444;45190:500;:::o;6457:322::-;6571:6;6546:21;:31;;6533:86;;;;-1:-1:-1;;;6533:86:0;;27578:2:1;6533:86:0;;;27560:21:1;27617:2;27597:18;;;27590:30;27656:31;27636:18;;;27629:59;27705:18;;6533:86:0;27376:353:1;6533:86:0;6627:12;6645:9;-1:-1:-1;;;;;6645:14:0;6667:6;6645:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6626:52;;;6696:7;6683:91;;;;-1:-1:-1;;;6683:91:0;;27936:2:1;6683:91:0;;;27918:21:1;27975:2;27955:18;;;27948:30;28014:34;27994:18;;;27987:62;28085:28;28065:18;;;28058:56;28131:19;;6683:91:0;27734:422:1;45698:425:0;45812:15;;45780:62;;45797:4;;-1:-1:-1;;;;;45812:15:0;45830:11;45780:8;:62::i;:::-;45853:15;;46059;;45853:262;;-1:-1:-1;;;45853:262:0;;45927:4;45853:262;;;28502:34:1;28552:18;;;28545:34;;;45853:15:0;28595:18:1;;;28588:34;;;28638:18;;;28631:34;-1:-1:-1;;;;;46059:15:0;;;28681:19:1;;;28674:44;46089:15:0;28734:19:1;;;28727:35;45853:15:0;;;:31;;45893:9;;28436:19:1;;45853:262:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;206:548:1:-;318:4;347:2;376;365:9;358:21;408:6;402:13;451:6;446:2;435:9;431:18;424:34;476:1;486:140;500:6;497:1;494:13;486:140;;;595:14;;;591:23;;585:30;561:17;;;580:2;557:26;550:66;515:10;;486:140;;;490:3;675:1;670:2;661:6;650:9;646:22;642:31;635:42;745:2;738;734:7;729:2;721:6;717:15;713:29;702:9;698:45;694:54;686:62;;;;206:548;;;;:::o;759:131::-;-1:-1:-1;;;;;834:31:1;;824:42;;814:70;;880:1;877;870:12;895:315;963:6;971;1024:2;1012:9;1003:7;999:23;995:32;992:52;;;1040:1;1037;1030:12;992:52;1079:9;1066:23;1098:31;1123:5;1098:31;:::i;:::-;1148:5;1200:2;1185:18;;;;1172:32;;-1:-1:-1;;;895:315:1:o;1215:180::-;1274:6;1327:2;1315:9;1306:7;1302:23;1298:32;1295:52;;;1343:1;1340;1333:12;1295:52;-1:-1:-1;1366:23:1;;1215:180;-1:-1:-1;1215:180:1:o;2013:456::-;2090:6;2098;2106;2159:2;2147:9;2138:7;2134:23;2130:32;2127:52;;;2175:1;2172;2165:12;2127:52;2214:9;2201:23;2233:31;2258:5;2233:31;:::i;:::-;2283:5;-1:-1:-1;2340:2:1;2325:18;;2312:32;2353:33;2312:32;2353:33;:::i;:::-;2013:456;;2405:7;;-1:-1:-1;;;2459:2:1;2444:18;;;;2431:32;;2013:456::o;2906:247::-;2965:6;3018:2;3006:9;2997:7;2993:23;2989:32;2986:52;;;3034:1;3031;3024:12;2986:52;3073:9;3060:23;3092:31;3117:5;3092:31;:::i;3158:118::-;3244:5;3237:13;3230:21;3223:5;3220:32;3210:60;;3266:1;3263;3256:12;3281:382;3346:6;3354;3407:2;3395:9;3386:7;3382:23;3378:32;3375:52;;;3423:1;3420;3413:12;3375:52;3462:9;3449:23;3481:31;3506:5;3481:31;:::i;:::-;3531:5;-1:-1:-1;3588:2:1;3573:18;;3560:32;3601:30;3560:32;3601:30;:::i;:::-;3650:7;3640:17;;;3281:382;;;;;:::o;3668:156::-;3734:20;;3794:4;3783:16;;3773:27;;3763:55;;3814:1;3811;3804:12;3763:55;3668:156;;;:::o;3829:535::-;3921:6;3929;3937;3945;3953;3961;4014:3;4002:9;3993:7;3989:23;3985:33;3982:53;;;4031:1;4028;4021:12;3982:53;4054:27;4071:9;4054:27;:::i;:::-;4044:37;;4100:36;4132:2;4121:9;4117:18;4100:36;:::i;:::-;4090:46;;4155:36;4187:2;4176:9;4172:18;4155:36;:::i;:::-;4145:46;;4210:36;4242:2;4231:9;4227:18;4210:36;:::i;:::-;4200:46;;4265:37;4297:3;4286:9;4282:19;4265:37;:::i;:::-;4255:47;;4321:37;4353:3;4342:9;4338:19;4321:37;:::i;:::-;4311:47;;3829:535;;;;;;;;:::o;4369:813::-;4464:6;4472;4480;4488;4496;4549:3;4537:9;4528:7;4524:23;4520:33;4517:53;;;4566:1;4563;4556:12;4517:53;4605:9;4592:23;4624:31;4649:5;4624:31;:::i;:::-;4674:5;-1:-1:-1;4731:2:1;4716:18;;4703:32;4744:33;4703:32;4744:33;:::i;:::-;4796:7;-1:-1:-1;4855:2:1;4840:18;;4827:32;4868:33;4827:32;4868:33;:::i;:::-;4920:7;-1:-1:-1;4979:2:1;4964:18;;4951:32;4992:33;4951:32;4992:33;:::i;:::-;5044:7;-1:-1:-1;5103:3:1;5088:19;;5075:33;5117;5075;5117;:::i;:::-;5169:7;5159:17;;;4369:813;;;;;;;;:::o;5780:388::-;5848:6;5856;5909:2;5897:9;5888:7;5884:23;5880:32;5877:52;;;5925:1;5922;5915:12;5877:52;5964:9;5951:23;5983:31;6008:5;5983:31;:::i;:::-;6033:5;-1:-1:-1;6090:2:1;6075:18;;6062:32;6103:33;6062:32;6103:33;:::i;6173:380::-;6252:1;6248:12;;;;6295;;;6316:61;;6370:4;6362:6;6358:17;6348:27;;6316:61;6423:2;6415:6;6412:14;6392:18;6389:38;6386:161;;6469:10;6464:3;6460:20;6457:1;6450:31;6504:4;6501:1;6494:15;6532:4;6529:1;6522:15;6386:161;;6173:380;;;:::o;6558:356::-;6760:2;6742:21;;;6779:18;;;6772:30;6838:34;6833:2;6818:18;;6811:62;6905:2;6890:18;;6558:356::o;8371:184::-;8441:6;8494:2;8482:9;8473:7;8469:23;8465:32;8462:52;;;8510:1;8507;8500:12;8462:52;-1:-1:-1;8533:16:1;;8371:184;-1:-1:-1;8371:184:1:o;9912:245::-;9979:6;10032:2;10020:9;10011:7;10007:23;10003:32;10000:52;;;10048:1;10045;10038:12;10000:52;10080:9;10074:16;10099:28;10121:5;10099:28;:::i;10430:411::-;10632:2;10614:21;;;10671:2;10651:18;;;10644:30;10710:34;10705:2;10690:18;;10683:62;-1:-1:-1;;;10776:2:1;10761:18;;10754:45;10831:3;10816:19;;10430:411::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:128;11405:9;;;11426:11;;;11423:37;;;11440:18;;:::i;16492:125::-;16557:9;;;16578:10;;;16575:36;;;16591:18;;:::i;17786:401::-;17988:2;17970:21;;;18027:2;18007:18;;;18000:30;18066:34;18061:2;18046:18;;18039:62;-1:-1:-1;;;18132:2:1;18117:18;;18110:35;18177:3;18162:19;;17786:401::o;18192:399::-;18394:2;18376:21;;;18433:2;18413:18;;;18406:30;18472:34;18467:2;18452:18;;18445:62;-1:-1:-1;;;18538:2:1;18523:18;;18516:33;18581:3;18566:19;;18192:399::o;20189:168::-;20262:9;;;20293;;20310:15;;;20304:22;;20290:37;20280:71;;20331:18;;:::i;20362:127::-;20423:10;20418:3;20414:20;20411:1;20404:31;20454:4;20451:1;20444:15;20478:4;20475:1;20468:15;20494:120;20534:1;20560;20550:35;;20565:18;;:::i;:::-;-1:-1:-1;20599:9:1;;20494:120::o;21188:209::-;-1:-1:-1;;21352:38:1;;;;21334:57;;21322:2;21307:18;;21188:209::o;24398:148::-;24486:4;24465:12;;;24479;;;24461:31;;24504:13;;24501:39;;;24520:18;;:::i;25221:165::-;25259:1;25293:4;25290:1;25286:12;25317:3;25307:37;;25324:18;;:::i;:::-;25376:3;25369:4;25366:1;25362:12;25358:22;25353:27;;;25221:165;;;;:::o;25391:151::-;25481:4;25474:12;;;25460;;;25456:31;;25499:14;;25496:40;;;25516:18;;:::i;26003:127::-;26064:10;26059:3;26055:20;26052:1;26045:31;26095:4;26092:1;26085:15;26119:4;26116:1;26109:15;26135:251;26205:6;26258:2;26246:9;26237:7;26233:23;26229:32;26226:52;;;26274:1;26271;26264:12;26226:52;26306:9;26300:16;26325:31;26350:5;26325:31;:::i;26391:980::-;26653:4;26701:3;26690:9;26686:19;26732:6;26721:9;26714:25;26758:2;26796:6;26791:2;26780:9;26776:18;26769:34;26839:3;26834:2;26823:9;26819:18;26812:31;26863:6;26898;26892:13;26929:6;26921;26914:22;26967:3;26956:9;26952:19;26945:26;;27006:2;26998:6;26994:15;26980:29;;27027:1;27037:195;27051:6;27048:1;27045:13;27037:195;;;27116:13;;-1:-1:-1;;;;;27112:39:1;27100:52;;27207:15;;;;27172:12;;;;27148:1;27066:9;27037:195;;;-1:-1:-1;;;;;;;27288:32:1;;;;27283:2;27268:18;;27261:60;-1:-1:-1;;;27352:3:1;27337:19;27330:35;27249:3;26391:980;-1:-1:-1;;;26391:980:1:o;28773:306::-;28861:6;28869;28877;28930:2;28918:9;28909:7;28905:23;28901:32;28898:52;;;28946:1;28943;28936:12;28898:52;28975:9;28969:16;28959:26;;29025:2;29014:9;29010:18;29004:25;28994:35;;29069:2;29058:9;29054:18;29048:25;29038:35;;28773:306;;;;;:::o

Swarm Source

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