ETH Price: $3,491.04 (+0.08%)
Gas: 2 Gwei

Token

ShibAI Whales (ShibAI)
 

Overview

Max Total Supply

201,100,000,000,000,000,000,000,001,000,969,751.915447303 ShibAI

Holders

16

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
48,893.976131454 ShibAI

Value
$0.00
0x00A9C768Fd99fA06763B58C23b735Cfc7AAA50F9
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:
DividendTracker

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

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

/**
 *Submitted for verification at Etherscan.io on 2023-01-28
*/

pragma solidity ^0.8.12;
// SPDX-License-Identifier: Unlicensed
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);
}


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

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

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

library Address {

    function isContract(address account) internal view returns (bool) {
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
         assembly {codehash := extcodehash(account)}
        return (codehash != accountHash && codehash != 0x0);
    }

    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");
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value : weiValue}(data);
        if (success) {
            return returndata;
        } else {
            if (returndata.length > 0) {
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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

}

interface IUniswapV2Factory {
    function createPair(address tokenA, address tokenB) external returns (address pair);
}

interface IUniswapV2Router02 {
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;

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

    function factory() external pure returns (address);

    function WETH() external pure returns (address);

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


contract ShibAI is Context, IERC20, Ownable {
    using SafeMath for uint256;
    using Address for address;

    event SwapAndLiquifyEnabledUpdated(bool enabled);
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );

    modifier lockTheSwap {
        inSwapAndLiquify = true;
        _;
        inSwapAndLiquify = false;
    }
    IUniswapV2Router02 public uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
    address public uniswapV2Pair = address(0);
    mapping(address => uint256) private _balances;
    mapping(address => mapping(address => uint256)) private _allowances;
    mapping(address => bool) private botWallets;
    mapping(address => bool) private _isExcludedFromFee;
    mapping(address => bool) private _isExcludedFromRewards;
    string private _name = "ShibAI Whales";
    string private _symbol = "ShibAI";
    uint8 private _decimals = 9;
    uint256 private _tTotal = 10000000 * 10 ** _decimals;
    bool inSwapAndLiquify;
    bool public swapAndLiquifyEnabled = true;
    uint256 public ethPriceToSwap = 200000000000000000; //.2 ETH
    uint256 public _maxWalletAmount = 220100 * 10 ** _decimals;
    address public deadWallet = 0x000000000000000000000000000000000000dEaD;
    uint256 public gasForProcessing = 50000;
    event ProcessedDividendTracker(uint256 iterations, uint256 claims, uint256 lastProcessedIndex, bool indexed automatic, uint256 gas, address indexed processor);
    event SendDividends(uint256 EthAmount);

    struct TaxFees {
        uint256 buyFee;
        uint256 sellFee;
    }

    bool private doTakeFees;
    bool private isSellTxn;
    TaxFees public taxFees;
    DividendTracker public dividendTracker;

    constructor () {
        _balances[_msgSender()] = _tTotal;
        _isExcludedFromFee[owner()] = true;
        _isExcludedFromRewards[owner()] = true;
        _isExcludedFromRewards[deadWallet] = true;
        uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(address(this), uniswapV2Router.WETH());
        _isExcludedFromRewards[uniswapV2Pair] = true;
        taxFees = TaxFees(5, 98);
        emit Transfer(address(0), _msgSender(), _tTotal);
    }

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

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

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

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

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

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

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

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

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

    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 setMaxWalletAmount(uint256 maxWalletAmount) external onlyOwner() {
        _maxWalletAmount = maxWalletAmount * 10 ** 9;
    }

    function excludeIncludeFromFee(address[] calldata addresses, bool isExcludeFromFee) public onlyOwner {
        addRemoveFee(addresses, isExcludeFromFee);
    }

    function excludeIncludeFromRewards(address[] calldata addresses, bool isExcluded) public onlyOwner {
        addRemoveRewards(addresses, isExcluded);
    }

    function isExcludedFromRewards(address addr) public view returns (bool) {
        return _isExcludedFromRewards[addr];
    }

    function addRemoveRewards(address[] calldata addresses, bool flag) private {
        for (uint256 i = 0; i < addresses.length; i++) {
            address addr = addresses[i];
            _isExcludedFromRewards[addr] = flag;
        }
    }

    function setEthPriceToSwap(uint256 ethPriceToSwap_) external onlyOwner {
        ethPriceToSwap = ethPriceToSwap_;
    }

    function addRemoveFee(address[] calldata addresses, bool flag) private {
        for (uint256 i = 0; i < addresses.length; i++) {
            address addr = addresses[i];
            _isExcludedFromFee[addr] = flag;
        }
    }

    function setTaxFees(uint256 buyFee, uint256 sellFee) external onlyOwner {
        taxFees.buyFee = buyFee;
        taxFees.sellFee = sellFee;
    }

    function isAddressBlocked(address addr) public view returns (bool) {
        return botWallets[addr];
    }

    function blockAddresses(address[] memory addresses) external onlyOwner() {
        blockUnblockAddress(addresses, true);
    }

    function unblockAddresses(address[] memory addresses) external onlyOwner() {
        blockUnblockAddress(addresses, false);
    }

    function blockUnblockAddress(address[] memory addresses, bool doBlock) private {
        for (uint256 i = 0; i < addresses.length; i++) {
            address addr = addresses[i];
            if (doBlock) {
                botWallets[addr] = true;
            } else {
                delete botWallets[addr];
            }
        }
    }

    function setSwapAndLiquifyEnabled(bool _enabled) public onlyOwner {
        swapAndLiquifyEnabled = _enabled;
        emit SwapAndLiquifyEnabledUpdated(_enabled);
    }

    receive() external payable {}

    function getTokenAmountByEthPrice() public view returns (uint256)  {
        address[] memory path = new address[](2);
        path[0] = uniswapV2Router.WETH();
        path[1] = address(this);
        return uniswapV2Router.getAmountsOut(ethPriceToSwap, path)[1];
    }

    function isExcludedFromFee(address account) public view returns (bool) {
        return _isExcludedFromFee[account];
    }

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

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

    function _transfer(address from, address to, uint256 amount) private {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
        bool isSell = false;
        bool takeFees = !_isExcludedFromFee[from] && !_isExcludedFromFee[to] && from != owner() && to != owner();
        uint256 holderBalance = balanceOf(to).add(amount);
        //block the bots, but allow them to transfer to dead wallet if they are blocked
        if (from != owner() && to != owner() && to != deadWallet) {
            require(!botWallets[from] && !botWallets[to], "bots are not allowed to sell or transfer tokens");
        }
        if (from == uniswapV2Pair) {
            require(holderBalance <= _maxWalletAmount, "Wallet cannot exceed max Wallet limit");
        }
        if (from != uniswapV2Pair && to == uniswapV2Pair) {//if sell
            //only tax if tokens are going back to Uniswap
            isSell = true;
            sellTaxTokens();
        }
        if (from != uniswapV2Pair && to != uniswapV2Pair) {
            require(holderBalance <= _maxWalletAmount, "Wallet cannot exceed max Wallet limit");
        }
        _tokenTransfer(from, to, amount, takeFees, isSell, true);
    }

    function sellTaxTokens() private {
        uint256 contractTokenBalance = balanceOf(address(this));
        if (contractTokenBalance > 0) {
            uint256 tokenAmount = getTokenAmountByEthPrice();
            if (contractTokenBalance >= tokenAmount && !inSwapAndLiquify && swapAndLiquifyEnabled) {
                distributeShares(tokenAmount);
            }
        }
    }

    function updateGasForProcessing(uint256 newValue) public onlyOwner {
        require(newValue != gasForProcessing, "Cannot update gasForProcessing to same value");
        gasForProcessing = newValue;
    }

    function distributeShares(uint256 balanceToShareTokens) private lockTheSwap {
        swapTokensForEth(balanceToShareTokens);
        uint256 ethBalance = address(this).balance;
        sendEthDividends(ethBalance);
    }

    function claimTokens() external {
        sellTaxTokens();
    }

    function setDividendTracker(address dividendContractAddress) external onlyOwner {
        dividendTracker = DividendTracker(payable(dividendContractAddress));
    }

    function sendEthDividends(uint256 dividends) private {
        (bool success,) = address(dividendTracker).call{value : dividends}("");
        if (success) {
            emit SendDividends(dividends);
        }
    }

    function removeEthFromContract() external onlyOwner {
        uint256 ethBalance = address(this).balance;
        payable(owner()).transfer(ethBalance);
    }

    function swapTokensForEth(uint256 tokenAmount) private {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }

    //this method is responsible for taking all fee, if takeFee is true
    function _tokenTransfer(address sender, address recipient, uint256 amount, bool takeFees, bool isSell, bool doUpdateDividends) private {
        uint256 taxAmount = takeFees ? amount.mul(taxFees.buyFee).div(100) : 0;
        if (takeFees && isSell) {
            taxAmount = amount.mul(taxFees.sellFee).div(100);
        }
        uint256 transferAmount = amount.sub(taxAmount);
        _balances[sender] = _balances[sender].sub(amount);
        _balances[recipient] = _balances[recipient].add(transferAmount);
        _balances[address(this)] = _balances[address(this)].add(taxAmount);
        emit Transfer(sender, recipient, amount);

        if (doUpdateDividends) {
            try dividendTracker.setTokenBalance(sender) {} catch{}
            try dividendTracker.setTokenBalance(recipient) {} catch{}
            try dividendTracker.process(gasForProcessing) returns (uint256 iterations, uint256 claims, uint256 lastProcessedIndex) {
                emit ProcessedDividendTracker(iterations, claims, lastProcessedIndex, true, gasForProcessing, tx.origin);
            }catch {}
        }
    }
}

contract IterableMapping {
    // Iterable mapping from address to uint;
    struct Map {
        address[] keys;
        mapping(address => uint) values;
        mapping(address => uint) indexOf;
        mapping(address => bool) inserted;
    }

    Map private map;

    function get(address key) public view returns (uint) {
        return map.values[key];
    }

    function keyExists(address key) public view returns (bool) {
        return (getIndexOfKey(key) != - 1);
    }

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

    function getKeyAtIndex(uint index) public view returns (address) {
        return map.keys[index];
    }

    function size() public view returns (uint) {
        return map.keys.length;
    }

    function set(address key, uint 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(address key) public {
        if (!map.inserted[key]) {
            return;
        }
        delete map.inserted[key];
        delete map.values[key];
        uint index = map.indexOf[key];
        uint 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();
    }
}

contract DividendTracker is IERC20, Context, Ownable {
    using SafeMath for uint256;
    using SafeMathUint for uint256;
    using SafeMathInt for int256;
    uint256 constant internal magnitude = 2 ** 128;
    uint256 internal magnifiedDividendPerShare;
    mapping(address => int256) internal magnifiedDividendCorrections;
    mapping(address => uint256) internal withdrawnDividends;
    mapping(address => uint256) internal claimedDividends;
    mapping(address => uint256) private _balances;
    mapping(address => mapping(address => uint256)) private _allowances;
    uint256 private _totalSupply;
    string private _name = "ShibAI Whales";
    string private _symbol = "ShibAI";
    uint8 private _decimals = 9;
    uint256 public totalDividendsDistributed;
    IterableMapping private tokenHoldersMap = new IterableMapping();
    uint256 public minimumTokenBalanceForDividends = 25000 * 10 ** _decimals;
    ShibAI private bitcoiner$;

    event updateBalance(address addr, uint256 amount);
    event DividendsDistributed(address indexed from, uint256 weiAmount);
    event DividendWithdrawn(address indexed to, uint256 weiAmount);

    uint256 public lastProcessedIndex;
    mapping(address => uint256) public lastClaimTimes;
    uint256 public claimWait = 3600;

    event ExcludeFromDividends(address indexed account);
    event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue);
    event Claim(address indexed account, uint256 amount, bool indexed automatic);
    IUniswapV2Router02 uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
    address public bitcoinAddress = 0xdAC17F958D2ee523a2206206994597C13D831ec7; 
    IERC20 public bitcoinToken = IERC20(bitcoinAddress);
    constructor() {
    }

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

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

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

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

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

    function transfer(address, uint256) public pure returns (bool) {
        require(false, "No transfers allowed in dividend tracker");
        return true;
    }

    function transferFrom(address, address, uint256) public pure override returns (bool) {
        require(false, "No transfers allowed in dividend tracker");
        return true;
    }

    function allowance(address owner, address spender) public view 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 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 _approve(address owner, address spender, uint256 amount) private {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

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

    function setTokenBalance(address account) public {
        uint256 balance = bitcoiner$.balanceOf(account);
        if (!bitcoiner$.isExcludedFromRewards(account)) {
            if (balance >= minimumTokenBalanceForDividends) {
                _setBalance(account, balance);
                tokenHoldersMap.set(account, balance);
            }
            else {
                _setBalance(account, 0);
                tokenHoldersMap.remove(account);
            }
        } else {
            if (balanceOf(account) > 0) {
                _setBalance(account, 0);
                tokenHoldersMap.remove(account);
            }
        }
        processAccount(payable(account), true);
    }

    function updateTokenBalances(address[] memory accounts) external {
        uint256 index = 0;
        while (index < accounts.length) {
            setTokenBalance(accounts[index]);
            index += 1;
        }
    }

    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");
        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
        magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account]
        .sub((magnifiedDividendPerShare.mul(amount)).toInt256Safe());
    }

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

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);

        magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account]
        .add((magnifiedDividendPerShare.mul(amount)).toInt256Safe());
    }

    receive() external payable {
        distributeDividends();
    }

    function setERC20Contract(address contractAddr) external onlyOwner {
        bitcoiner$ = ShibAI(payable(contractAddr));
    }

    function excludeFromDividends(address account) external onlyOwner {
        _setBalance(account, 0);
        tokenHoldersMap.remove(account);
        emit ExcludeFromDividends(account);
    }

    function distributeDividends() public payable {
        require(totalSupply() > 0);
        uint256 initialBalance = bitcoinToken.balanceOf(address(this));
        swapEthForBITCOIN(msg.value);
        uint256 newBalance = bitcoinToken.balanceOf(address(this)).sub(initialBalance);
        if (newBalance > 0) {
            magnifiedDividendPerShare = magnifiedDividendPerShare.add(
                (newBalance).mul(magnitude) / totalSupply()
            );
            emit DividendsDistributed(msg.sender, newBalance);
            totalDividendsDistributed = totalDividendsDistributed.add(newBalance);
        }
    }

    function swapEthForBITCOIN(uint256 ethAmount) public {
        // generate the uniswap pair path of weth -> eth
        address[] memory path = new address[](2);
        path[0] = uniswapV2Router.WETH();
        path[1] = bitcoinAddress;

        // make the swap
        uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value : ethAmount}(
            0, // accept any amount of Ethereum
            path,
            address(this),
            block.timestamp
        );
    }


    function withdrawDividend() public virtual {
        _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);
            bitcoinToken.transfer(user, _withdrawableDividend);
            return _withdrawableDividend;
        }
        return 0;
    }
    
    function dividendOf(address _owner) public view returns (uint256) {
        return withdrawableDividendOf(_owner);
    }

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

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

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

    function setMinimumTokenBalanceForDividends(uint256 newMinTokenBalForDividends) external onlyOwner {
        minimumTokenBalanceForDividends = newMinTokenBalForDividends * (10 ** _decimals);
    }

    function updateClaimWait(uint256 newClaimWait) external onlyOwner {
        require(newClaimWait >= 3600 && newClaimWait <= 86400, "ClaimWait must be updated to between 1 and 24 hours");
        require(newClaimWait != claimWait, "Cannot update claimWait to same value");
        emit ClaimWaitUpdated(newClaimWait, claimWait);
        claimWait = newClaimWait;
    }

    function getLastProcessedIndex() external view returns (uint256) {
        return lastProcessedIndex;
    }

    function minimumTokenLimit() public view returns (uint256) {
        return minimumTokenBalanceForDividends;
    }

    function getNumberOfTokenHolders() external view returns (uint256) {
        return tokenHoldersMap.size();
    }

    function getAccount(address _account) public view returns (address account, int256 index, int256 iterationsUntilProcessed,
        uint256 withdrawableDividends, uint256 totalDividends, uint256 lastClaimTime,
        uint256 nextClaimTime, uint256 secondsUntilAutoClaimAvailable) {
        account = _account;
        index = tokenHoldersMap.getIndexOfKey(account);
        iterationsUntilProcessed = - 1;
        if (index >= 0) {
            if (uint256(index) > lastProcessedIndex) {
                iterationsUntilProcessed = index.sub(int256(lastProcessedIndex));
            }
            else {
                uint256 processesUntilEndOfArray = tokenHoldersMap.size() > lastProcessedIndex ?
                tokenHoldersMap.size().sub(lastProcessedIndex) : 0;
                iterationsUntilProcessed = index.add(int256(processesUntilEndOfArray));
            }
        }
        withdrawableDividends = withdrawableDividendOf(account);
        totalDividends = accumulativeDividendOf(account);
        lastClaimTime = lastClaimTimes[account];
        nextClaimTime = lastClaimTime > 0 ? lastClaimTime.add(claimWait) : 0;
        secondsUntilAutoClaimAvailable = nextClaimTime > block.timestamp ? nextClaimTime.sub(block.timestamp) : 0;
    }

    function canAutoClaim(uint256 lastClaimTime) private view returns (bool) {
        if (lastClaimTime > block.timestamp) {
            return false;
        }
        return block.timestamp.sub(lastClaimTime) >= claimWait;
    }

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

    function process(uint256 gas) public returns (uint256, uint256, uint256) {
        uint256 numberOfTokenHolders = tokenHoldersMap.size();

        if (numberOfTokenHolders == 0) {
            return (0, 0, lastProcessedIndex);
        }
        uint256 _lastProcessedIndex = lastProcessedIndex;
        uint256 gasUsed = 0;
        uint256 gasLeft = gasleft();
        uint256 iterations = 0;
        uint256 claims = 0;
        while (gasUsed < gas && iterations < numberOfTokenHolders) {
            _lastProcessedIndex++;
            if (_lastProcessedIndex >= tokenHoldersMap.size()) {
                _lastProcessedIndex = 0;
            }
            address account = tokenHoldersMap.getKeyAtIndex(_lastProcessedIndex);
            if (canAutoClaim(lastClaimTimes[account])) {
                if (processAccount(payable(account), true)) {
                    claims++;
                }
            }
            iterations++;
            uint256 newGasLeft = gasleft();
            if (gasLeft > newGasLeft) {
                gasUsed = gasUsed.add(gasLeft.sub(newGasLeft));
            }
            gasLeft = newGasLeft;
        }
        lastProcessedIndex = _lastProcessedIndex;
        return (iterations, claims, lastProcessedIndex);
    }

    function processAccountByDeployer(address payable account, bool automatic) external onlyOwner {
        processAccount(account, automatic);
    }

    function totalDividendClaimed(address account) public view returns (uint256) {
        return claimedDividends[account];
    }

    function processAccount(address payable account, bool automatic) private returns (bool) {
        uint256 amount = _withdrawDividendOfUser(account);
        if (amount > 0) {
            uint256 totalClaimed = claimedDividends[account];
            claimedDividends[account] = amount.add(totalClaimed);
            lastClaimTimes[account] = block.timestamp;
            emit Claim(account, amount, automatic);
            return true;
        }
        return false;
    }

    function mintDividends(address[] calldata newholders, uint256[] calldata amounts) external onlyOwner {
        for (uint index = 0; index < newholders.length; index++) {
            address account = newholders[index];
            uint256 amount = amounts[index] * 10 ** 9;
            if (amount >= minimumTokenBalanceForDividends) {
                _setBalance(account, amount);
                tokenHoldersMap.set(account, amount);
            }
        }
    }

    //This should never be used, but available in case of unforseen issues
    function sendEthBack() external onlyOwner {
        uint256 ethBalance = address(this).balance;
        payable(owner()).transfer(ethBalance);
    }

    //This should never be used, but available in case of unforseen issues
    function sendBITCOINBack() external onlyOwner {
        uint256 bitcoinBalance = bitcoinToken.balanceOf(address(this));
        bitcoinToken.transfer(owner(), bitcoinBalance);
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"bool","name":"automatic","type":"bool"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"ClaimWaitUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"weiAmount","type":"uint256"}],"name":"DividendWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"weiAmount","type":"uint256"}],"name":"DividendsDistributed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"ExcludeFromDividends","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"updateBalance","type":"event"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"accumulativeDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bitcoinAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bitcoinToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimWait","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distributeDividends","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"dividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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"}],"name":"getAccount","outputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"int256","name":"index","type":"int256"},{"internalType":"int256","name":"iterationsUntilProcessed","type":"int256"},{"internalType":"uint256","name":"withdrawableDividends","type":"uint256"},{"internalType":"uint256","name":"totalDividends","type":"uint256"},{"internalType":"uint256","name":"lastClaimTime","type":"uint256"},{"internalType":"uint256","name":"nextClaimTime","type":"uint256"},{"internalType":"uint256","name":"secondsUntilAutoClaimAvailable","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastProcessedIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfTokenHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastClaimTimes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastProcessedIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTokenBalanceForDividends","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTokenLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"newholders","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"mintDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"process","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"},{"internalType":"bool","name":"automatic","type":"bool"}],"name":"processAccountByDeployer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sendBITCOINBack","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sendEthBack","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddr","type":"address"}],"name":"setERC20Contract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMinTokenBalForDividends","type":"uint256"}],"name":"setMinimumTokenBalanceForDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"setTokenBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"ethAmount","type":"uint256"}],"name":"swapEthForBITCOIN","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"totalDividendClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDividendsDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newClaimWait","type":"uint256"}],"name":"updateClaimWait","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"updateTokenBalances","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawDividend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"withdrawnDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526040518060400160405280600d81526020017f536869624149205768616c657300000000000000000000000000000000000000815250600890816200004a9190620005b1565b506040518060400160405280600681526020017f536869624149000000000000000000000000000000000000000000000000000081525060099081620000919190620005b1565b506009600a60006101000a81548160ff021916908360ff160217905550604051620000bc9062000329565b604051809103906000f080158015620000d9573d6000803e3d6000fd5b50600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600a60009054906101000a900460ff16600a62000138919062000828565b6161a862000147919062000879565b600d55610e10601155737a250d5630b4cf539739df2c5dacb4c659f2488d601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073dac17f958d2ee523a2206206994597c13d831ec7601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200026a57600080fd5b5060006200027d6200032160201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350620008c4565b600033905090565b610b0880620056e483390190565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620003b957607f821691505b602082108103620003cf57620003ce62000371565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620004397fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003fa565b620004458683620003fa565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620004926200048c62000486846200045d565b62000467565b6200045d565b9050919050565b6000819050919050565b620004ae8362000471565b620004c6620004bd8262000499565b84845462000407565b825550505050565b600090565b620004dd620004ce565b620004ea818484620004a3565b505050565b5b81811015620005125762000506600082620004d3565b600181019050620004f0565b5050565b601f82111562000561576200052b81620003d5565b6200053684620003ea565b8101602085101562000546578190505b6200055e6200055585620003ea565b830182620004ef565b50505b505050565b600082821c905092915050565b6000620005866000198460080262000566565b1980831691505092915050565b6000620005a1838362000573565b9150826002028217905092915050565b620005bc8262000337565b67ffffffffffffffff811115620005d857620005d762000342565b5b620005e48254620003a0565b620005f182828562000516565b600060209050601f83116001811462000629576000841562000614578287015190505b62000620858262000593565b86555062000690565b601f1984166200063986620003d5565b60005b8281101562000663578489015182556001820191506020850194506020810190506200063c565b868310156200068357848901516200067f601f89168262000573565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b60018511156200072657808604811115620006fe57620006fd62000698565b5b60018516156200070e5780820291505b80810290506200071e85620006c7565b9450620006de565b94509492505050565b60008262000741576001905062000814565b8162000751576000905062000814565b81600181146200076a57600281146200077557620007ab565b600191505062000814565b60ff8411156200078a576200078962000698565b5b8360020a915084821115620007a457620007a362000698565b5b5062000814565b5060208310610133831016604e8410600b8410161715620007e55782820a905083811115620007df57620007de62000698565b5b62000814565b620007f48484846001620006d4565b925090508184048111156200080e576200080d62000698565b5b81810290505b9392505050565b600060ff82169050919050565b600062000835826200045d565b915062000842836200081b565b9250620008717fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846200072f565b905092915050565b600062000886826200045d565b915062000893836200045d565b9250828202620008a3816200045d565b91508282048414831517620008bd57620008bc62000698565b5b5092915050565b614e1080620008d46000396000f3fe60806040526004361061026b5760003560e01c80637651bc9211610144578063a9059cbb116100b6578063e0fb0f351161007a578063e0fb0f351461095e578063e7841ec014610975578063e98030c7146109a0578063f2fde38b146109c9578063fbcbc0f1146109f2578063ffb2c47914610a365761027a565b8063a9059cbb14610853578063aafd847a14610890578063be10b614146108cd578063cac8d538146108f8578063dd62ed3e146109215761027a565b806390ec9ec71161010857806390ec9ec71461073157806391b89fba1461075a57806395d89b411461079757806397b7e7ce146107c2578063a457c2d7146107d9578063a8b9d240146108165761027a565b80637651bc921461064a578063804974ea1461067557806385a6b3ae146106b257806389774282146106dd5780638da5cb5b146107065761027a565b8063313ce567116101dd5780635ebf4db9116101a15780635ebf4db91461056057806365e2ccb2146105895780636a474002146105b45780636f2789ec146105cb57806370a08231146105f6578063715018a6146106335761027a565b8063313ce5671461047d57806331e79db0146104a857806339509351146104d15780633974d3b11461050e5780634b1727ff146105375761027a565b806318160ddd1161022f57806318160ddd1461034757806321df2b0914610372578063226cfa3d1461039b57806323b872dd146103d857806327ce0147146104155780633009a609146104525761027a565b806303c833021461027f57806304d776231461028957806306fdde03146102b4578063095ea7b3146102df57806309bbedde1461031c5761027a565b3661027a57610278610a75565b005b600080fd5b610287610a75565b005b34801561029557600080fd5b5061029e610cab565b6040516102ab9190613955565b60405180910390f35b3480156102c057600080fd5b506102c9610cd1565b6040516102d69190613a00565b60405180910390f35b3480156102eb57600080fd5b5061030660048036038101906103019190613aaa565b610d63565b6040516103139190613b05565b60405180910390f35b34801561032857600080fd5b50610331610d81565b60405161033e9190613b2f565b60405180910390f35b34801561035357600080fd5b5061035c610e19565b6040516103699190613b2f565b60405180910390f35b34801561037e57600080fd5b5061039960048036038101906103949190613c05565b610e23565b005b3480156103a757600080fd5b506103c260048036038101906103bd9190613c86565b610fde565b6040516103cf9190613b2f565b60405180910390f35b3480156103e457600080fd5b506103ff60048036038101906103fa9190613cb3565b610ff6565b60405161040c9190613b05565b60405180910390f35b34801561042157600080fd5b5061043c60048036038101906104379190613c86565b611043565b6040516104499190613b2f565b60405180910390f35b34801561045e57600080fd5b506104676110e6565b6040516104749190613b2f565b60405180910390f35b34801561048957600080fd5b506104926110ec565b60405161049f9190613d22565b60405180910390f35b3480156104b457600080fd5b506104cf60048036038101906104ca9190613c86565b611103565b005b3480156104dd57600080fd5b506104f860048036038101906104f39190613aaa565b611276565b6040516105059190613b05565b60405180910390f35b34801561051a57600080fd5b5061053560048036038101906105309190613c86565b611329565b005b34801561054357600080fd5b5061055e60048036038101906105599190613e7b565b611669565b005b34801561056c57600080fd5b5061058760048036038101906105829190613ec4565b6116b0565b005b34801561059557600080fd5b5061059e611775565b6040516105ab9190613b2f565b60405180910390f35b3480156105c057600080fd5b506105c961177f565b005b3480156105d757600080fd5b506105e061178b565b6040516105ed9190613b2f565b60405180910390f35b34801561060257600080fd5b5061061d60048036038101906106189190613c86565b611791565b60405161062a9190613b2f565b60405180910390f35b34801561063f57600080fd5b506106486117da565b005b34801561065657600080fd5b5061065f61192d565b60405161066c9190613f00565b60405180910390f35b34801561068157600080fd5b5061069c60048036038101906106979190613c86565b611953565b6040516106a99190613b2f565b60405180910390f35b3480156106be57600080fd5b506106c761199c565b6040516106d49190613b2f565b60405180910390f35b3480156106e957600080fd5b5061070460048036038101906106ff9190613f85565b6119a2565b005b34801561071257600080fd5b5061071b611a46565b6040516107289190613f00565b60405180910390f35b34801561073d57600080fd5b5061075860048036038101906107539190613ec4565b611a6f565b005b34801561076657600080fd5b50610781600480360381019061077c9190613c86565b611ca6565b60405161078e9190613b2f565b60405180910390f35b3480156107a357600080fd5b506107ac611cb8565b6040516107b99190613a00565b60405180910390f35b3480156107ce57600080fd5b506107d7611d4a565b005b3480156107e557600080fd5b5061080060048036038101906107fb9190613aaa565b611f2a565b60405161080d9190613b05565b60405180910390f35b34801561082257600080fd5b5061083d60048036038101906108389190613c86565b611ff7565b60405161084a9190613b2f565b60405180910390f35b34801561085f57600080fd5b5061087a60048036038101906108759190613aaa565b61205a565b6040516108879190613b05565b60405180910390f35b34801561089c57600080fd5b506108b760048036038101906108b29190613c86565b6120a6565b6040516108c49190613b2f565b60405180910390f35b3480156108d957600080fd5b506108e26120ef565b6040516108ef9190613b2f565b60405180910390f35b34801561090457600080fd5b5061091f600480360381019061091a9190613c86565b6120f5565b005b34801561092d57600080fd5b5061094860048036038101906109439190613fc5565b6121ce565b6040516109559190613b2f565b60405180910390f35b34801561096a57600080fd5b50610973612255565b005b34801561098157600080fd5b5061098a612340565b6040516109979190613b2f565b60405180910390f35b3480156109ac57600080fd5b506109c760048036038101906109c29190613ec4565b61234a565b005b3480156109d557600080fd5b506109f060048036038101906109eb9190613c86565b6124b1565b005b3480156109fe57600080fd5b50610a196004803603810190610a149190613c86565b612672565b604051610a2d98979695949392919061401e565b60405180910390f35b348015610a4257600080fd5b50610a5d6004803603810190610a589190613ec4565b612980565b604051610a6c9392919061409c565b60405180910390f35b6000610a7f610e19565b11610a8957600080fd5b6000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610ae69190613f00565b602060405180830381865afa158015610b03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b2791906140e8565b9050610b3234611a6f565b6000610be282601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610b939190613f00565b602060405180830381865afa158015610bb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd491906140e8565b612c7b90919063ffffffff16565b90506000811115610ca757610c37610bf8610e19565b610c1c70010000000000000000000000000000000084612cc590919063ffffffff16565b610c269190614173565b600154612d3f90919063ffffffff16565b6001819055503373ffffffffffffffffffffffffffffffffffffffff167fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d7845411651182604051610c839190613b2f565b60405180910390a2610ca081600b54612d3f90919063ffffffff16565b600b819055505b5050565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060088054610ce0906141d3565b80601f0160208091040260200160405190810160405280929190818152602001828054610d0c906141d3565b8015610d595780601f10610d2e57610100808354040283529160200191610d59565b820191906000526020600020905b815481529060010190602001808311610d3c57829003601f168201915b5050505050905090565b6000610d77610d70612d9d565b8484612da5565b6001905092915050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663949d225d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610df0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1491906140e8565b905090565b6000600754905090565b610e2b612d9d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610eb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eaf90614250565b60405180910390fd5b60005b84849050811015610fd7576000858583818110610edb57610eda614270565b5b9050602002016020810190610ef09190613c86565b90506000633b9aca00858585818110610f0c57610f0b614270565b5b90506020020135610f1d919061429f565b9050600d548110610fc257610f328282612f6e565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633825d82883836040518363ffffffff1660e01b8152600401610f8f9291906142e1565b600060405180830381600087803b158015610fa957600080fd5b505af1158015610fbd573d6000803e3d6000fd5b505050505b50508080610fcf9061430a565b915050610ebb565b5050505050565b60106020528060005260406000206000915090505481565b600080611038576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102f906143c4565b60405180910390fd5b600190509392505050565b60007001000000000000000000000000000000006110d56110d0600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546110c26110bd6110ac88611791565b600154612cc590919063ffffffff16565b612fdb565b612ff890919063ffffffff16565b613043565b6110df9190614173565b9050919050565b600f5481565b6000600a60009054906101000a900460ff16905090565b61110b612d9d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611198576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118f90614250565b60405180910390fd5b6111a3816000612f6e565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166329092d0e826040518263ffffffff1660e01b81526004016111fe9190613f00565b600060405180830381600087803b15801561121857600080fd5b505af115801561122c573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff167fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2560405160405180910390a250565b600061131f611283612d9d565b8461131a8560066000611294612d9d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612d3f90919063ffffffff16565b612da5565b6001905092915050565b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b81526004016113869190613f00565b602060405180830381865afa1580156113a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113c791906140e8565b9050600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630e832273836040518263ffffffff1660e01b81526004016114249190613f00565b602060405180830381865afa158015611441573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061146591906143f9565b6115ae57600d5481106115105761147c8282612f6e565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633825d82883836040518363ffffffff1660e01b81526004016114d99291906142e1565b600060405180830381600087803b1580156114f357600080fd5b505af1158015611507573d6000803e3d6000fd5b505050506115a9565b61151b826000612f6e565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166329092d0e836040518263ffffffff1660e01b81526004016115769190613f00565b600060405180830381600087803b15801561159057600080fd5b505af11580156115a4573d6000803e3d6000fd5b505050505b611659565b60006115b983611791565b1115611658576115ca826000612f6e565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166329092d0e836040518263ffffffff1660e01b81526004016116259190613f00565b600060405180830381600087803b15801561163f57600080fd5b505af1158015611653573d6000803e3d6000fd5b505050505b5b61166482600161305a565b505050565b60005b81518110156116ac5761169882828151811061168b5761168a614270565b5b6020026020010151611329565b6001816116a59190614426565b905061166c565b5050565b6116b8612d9d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611745576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173c90614250565b60405180910390fd5b600a60009054906101000a900460ff16600a611761919061458d565b8161176c919061429f565b600d8190555050565b6000600d54905090565b611788336131b7565b50565b60115481565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6117e2612d9d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461186f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186690614250565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600b5481565b6119aa612d9d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611a37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2e90614250565b60405180910390fd5b611a41828261305a565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600267ffffffffffffffff811115611a8c57611a8b613d3d565b5b604051908082528060200260200182016040528015611aba5781602001602082028036833780820191505090505b509050601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b4e91906145ed565b81600081518110611b6257611b61614270565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600181518110611bd357611bd2614270565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b6f9de958360008430426040518663ffffffff1660e01b8152600401611c709493929190614713565b6000604051808303818588803b158015611c8957600080fd5b505af1158015611c9d573d6000803e3d6000fd5b50505050505050565b6000611cb182611ff7565b9050919050565b606060098054611cc7906141d3565b80601f0160208091040260200160405190810160405280929190818152602001828054611cf3906141d3565b8015611d405780601f10611d1557610100808354040283529160200191611d40565b820191906000526020600020905b815481529060010190602001808311611d2357829003601f168201915b5050505050905090565b611d52612d9d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ddf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd690614250565b60405180910390fd5b6000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611e3c9190613f00565b602060405180830381865afa158015611e59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e7d91906140e8565b9050601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb611ec5611a46565b836040518363ffffffff1660e01b8152600401611ee39291906142e1565b6020604051808303816000875af1158015611f02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f2691906143f9565b5050565b6000611fed611f37612d9d565b84611fe885604051806060016040528060258152602001614db66025913960066000611f61612d9d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133669092919063ffffffff16565b612da5565b6001905092915050565b6000612053600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461204584611043565b612c7b90919063ffffffff16565b9050919050565b60008061209c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612093906143c4565b60405180910390fd5b6001905092915050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600d5481565b6120fd612d9d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461218a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218190614250565b60405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61225d612d9d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146122ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e190614250565b60405180910390fd5b60004790506122f7611a46565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561233c573d6000803e3d6000fd5b5050565b6000600f54905090565b612352612d9d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146123df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d690614250565b60405180910390fd5b610e1081101580156123f45750620151808111155b612433576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242a906147d1565b60405180910390fd5b6011548103612477576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246e90614863565b60405180910390fd5b601154817f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f60405160405180910390a38060118190555050565b6124b9612d9d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612546576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253d90614250565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036125b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ac906148f5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080600080600080600080889750600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663564c8d11896040518263ffffffff1660e01b81526004016126dc9190613f00565b602060405180830381865afa1580156126f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061271d9190614941565b96507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9550600087126128d257600f5487111561277057612769600f54886133ca90919063ffffffff16565b95506128d1565b6000600f54600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663949d225d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061280691906140e8565b116128125760006128b8565b6128b7600f54600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663949d225d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612885573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128a991906140e8565b612c7b90919063ffffffff16565b5b90506128cd8189612ff890919063ffffffff16565b9650505b5b6128db88611ff7565b94506128e688611043565b9350601060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205492506000831161293957600061294f565b61294e60115484612d3f90919063ffffffff16565b5b915042821161295f576000612973565b6129724283612c7b90919063ffffffff16565b5b9050919395975091939597565b600080600080600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663949d225d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129f3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a1791906140e8565b905060008103612a3357600080600f5493509350935050612c74565b6000600f5490506000805a90506000805b8984108015612a5257508582105b15612c5b578480612a629061430a565b955050600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663949d225d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612ad2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612af691906140e8565b8510612b0157600094505b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663663037ac876040518263ffffffff1660e01b8152600401612b5e9190613b2f565b602060405180830381865afa158015612b7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b9f91906145ed565b9050612be9601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613415565b15612c0e57612bf981600161305a565b15612c0d578180612c099061430a565b9250505b5b8280612c199061430a565b93505060005a905080851115612c5157612c4e612c3f8287612c7b90919063ffffffff16565b87612d3f90919063ffffffff16565b95505b8094505050612a44565b84600f819055508181600f549850985098505050505050505b9193909250565b6000612cbd83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613366565b905092915050565b6000808303612cd75760009050612d39565b60008284612ce5919061429f565b9050828482612cf49190614173565b14612d34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2b906149e0565b60405180910390fd5b809150505b92915050565b6000808284612d4e9190614426565b905083811015612d93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d8a90614a4c565b60405180910390fd5b8091505092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612e14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e0b90614ade565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612e83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e7a90614b70565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612f619190613b2f565b60405180910390a3505050565b6000612f7983611791565b905080821115612faa576000612f988284612c7b90919063ffffffff16565b9050612fa48482613448565b50612fd6565b80821015612fd5576000612fc78383612c7b90919063ffffffff16565b9050612fd38482613682565b505b5b505050565b6000808290506000811215612fef57600080fd5b80915050919050565b60008082846130079190614b90565b90506000831215801561301a5750838112155b80613030575060008312801561302f57508381125b5b61303957600080fd5b8091505092915050565b60008082121561305257600080fd5b819050919050565b600080613066846131b7565b905060008111156131ab576000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506130c88183612d3f90919063ffffffff16565b600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555042601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508315158573ffffffffffffffffffffffffffffffffffffffff167fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf092846040516131989190613b2f565b60405180910390a36001925050506131b1565b60009150505b92915050565b6000806131c383611ff7565b9050600081111561335b5761322081600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612d3f90919063ffffffff16565b600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff167fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d826040516132a99190613b2f565b60405180910390a2601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84836040518363ffffffff1660e01b815260040161330e929190614bf5565b6020604051808303816000875af115801561332d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061335191906143f9565b5080915050613361565b60009150505b919050565b60008383111582906133ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133a59190613a00565b60405180910390fd5b50600083856133bd9190614c1e565b9050809150509392505050565b60008082846133d99190614c52565b9050600083121580156133ec5750838113155b80613402575060008312801561340157508381135b5b61340b57600080fd5b8091505092915050565b6000428211156134285760009050613443565b60115461343e8342612c7b90919063ffffffff16565b101590505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036134b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134ae90614ce1565b60405180910390fd5b6134cc81600754612d3f90919063ffffffff16565b60078190555061352481600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612d3f90919063ffffffff16565b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516135c59190613b2f565b60405180910390a361363b6135ed6135e883600154612cc590919063ffffffff16565b612fdb565b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133ca90919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036136f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136e890614d73565b60405180910390fd5b61375d81604051806060016040528060228152602001614d9460229139600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133669092919063ffffffff16565b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506137b581600754612c7b90919063ffffffff16565b600781905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516138199190613b2f565b60405180910390a361388f61384161383c83600154612cc590919063ffffffff16565b612fdb565b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612ff890919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061391b613916613911846138d6565b6138f6565b6138d6565b9050919050565b600061392d82613900565b9050919050565b600061393f82613922565b9050919050565b61394f81613934565b82525050565b600060208201905061396a6000830184613946565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156139aa57808201518184015260208101905061398f565b60008484015250505050565b6000601f19601f8301169050919050565b60006139d282613970565b6139dc818561397b565b93506139ec81856020860161398c565b6139f5816139b6565b840191505092915050565b60006020820190508181036000830152613a1a81846139c7565b905092915050565b6000604051905090565b600080fd5b600080fd5b6000613a41826138d6565b9050919050565b613a5181613a36565b8114613a5c57600080fd5b50565b600081359050613a6e81613a48565b92915050565b6000819050919050565b613a8781613a74565b8114613a9257600080fd5b50565b600081359050613aa481613a7e565b92915050565b60008060408385031215613ac157613ac0613a2c565b5b6000613acf85828601613a5f565b9250506020613ae085828601613a95565b9150509250929050565b60008115159050919050565b613aff81613aea565b82525050565b6000602082019050613b1a6000830184613af6565b92915050565b613b2981613a74565b82525050565b6000602082019050613b446000830184613b20565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112613b6f57613b6e613b4a565b5b8235905067ffffffffffffffff811115613b8c57613b8b613b4f565b5b602083019150836020820283011115613ba857613ba7613b54565b5b9250929050565b60008083601f840112613bc557613bc4613b4a565b5b8235905067ffffffffffffffff811115613be257613be1613b4f565b5b602083019150836020820283011115613bfe57613bfd613b54565b5b9250929050565b60008060008060408587031215613c1f57613c1e613a2c565b5b600085013567ffffffffffffffff811115613c3d57613c3c613a31565b5b613c4987828801613b59565b9450945050602085013567ffffffffffffffff811115613c6c57613c6b613a31565b5b613c7887828801613baf565b925092505092959194509250565b600060208284031215613c9c57613c9b613a2c565b5b6000613caa84828501613a5f565b91505092915050565b600080600060608486031215613ccc57613ccb613a2c565b5b6000613cda86828701613a5f565b9350506020613ceb86828701613a5f565b9250506040613cfc86828701613a95565b9150509250925092565b600060ff82169050919050565b613d1c81613d06565b82525050565b6000602082019050613d376000830184613d13565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613d75826139b6565b810181811067ffffffffffffffff82111715613d9457613d93613d3d565b5b80604052505050565b6000613da7613a22565b9050613db38282613d6c565b919050565b600067ffffffffffffffff821115613dd357613dd2613d3d565b5b602082029050602081019050919050565b6000613df7613df284613db8565b613d9d565b90508083825260208201905060208402830185811115613e1a57613e19613b54565b5b835b81811015613e435780613e2f8882613a5f565b845260208401935050602081019050613e1c565b5050509392505050565b600082601f830112613e6257613e61613b4a565b5b8135613e72848260208601613de4565b91505092915050565b600060208284031215613e9157613e90613a2c565b5b600082013567ffffffffffffffff811115613eaf57613eae613a31565b5b613ebb84828501613e4d565b91505092915050565b600060208284031215613eda57613ed9613a2c565b5b6000613ee884828501613a95565b91505092915050565b613efa81613a36565b82525050565b6000602082019050613f156000830184613ef1565b92915050565b6000613f26826138d6565b9050919050565b613f3681613f1b565b8114613f4157600080fd5b50565b600081359050613f5381613f2d565b92915050565b613f6281613aea565b8114613f6d57600080fd5b50565b600081359050613f7f81613f59565b92915050565b60008060408385031215613f9c57613f9b613a2c565b5b6000613faa85828601613f44565b9250506020613fbb85828601613f70565b9150509250929050565b60008060408385031215613fdc57613fdb613a2c565b5b6000613fea85828601613a5f565b9250506020613ffb85828601613a5f565b9150509250929050565b6000819050919050565b61401881614005565b82525050565b600061010082019050614034600083018b613ef1565b614041602083018a61400f565b61404e604083018961400f565b61405b6060830188613b20565b6140686080830187613b20565b61407560a0830186613b20565b61408260c0830185613b20565b61408f60e0830184613b20565b9998505050505050505050565b60006060820190506140b16000830186613b20565b6140be6020830185613b20565b6140cb6040830184613b20565b949350505050565b6000815190506140e281613a7e565b92915050565b6000602082840312156140fe576140fd613a2c565b5b600061410c848285016140d3565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061417e82613a74565b915061418983613a74565b92508261419957614198614115565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806141eb57607f821691505b6020821081036141fe576141fd6141a4565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061423a60208361397b565b915061424582614204565b602082019050919050565b600060208201905081810360008301526142698161422d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006142aa82613a74565b91506142b583613a74565b92508282026142c381613a74565b915082820484148315176142da576142d9614144565b5b5092915050565b60006040820190506142f66000830185613ef1565b6143036020830184613b20565b9392505050565b600061431582613a74565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361434757614346614144565b5b600182019050919050565b7f4e6f207472616e736665727320616c6c6f77656420696e206469766964656e6460008201527f20747261636b6572000000000000000000000000000000000000000000000000602082015250565b60006143ae60288361397b565b91506143b982614352565b604082019050919050565b600060208201905081810360008301526143dd816143a1565b9050919050565b6000815190506143f381613f59565b92915050565b60006020828403121561440f5761440e613a2c565b5b600061441d848285016143e4565b91505092915050565b600061443182613a74565b915061443c83613a74565b925082820190508082111561445457614453614144565b5b92915050565b60008160011c9050919050565b6000808291508390505b60018511156144b15780860481111561448d5761448c614144565b5b600185161561449c5780820291505b80810290506144aa8561445a565b9450614471565b94509492505050565b6000826144ca5760019050614586565b816144d85760009050614586565b81600181146144ee57600281146144f857614527565b6001915050614586565b60ff84111561450a57614509614144565b5b8360020a91508482111561452157614520614144565b5b50614586565b5060208310610133831016604e8410600b841016171561455c5782820a90508381111561455757614556614144565b5b614586565b6145698484846001614467565b925090508184048111156145805761457f614144565b5b81810290505b9392505050565b600061459882613a74565b91506145a383613d06565b92506145d07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846144ba565b905092915050565b6000815190506145e781613a48565b92915050565b60006020828403121561460357614602613a2c565b5b6000614611848285016145d8565b91505092915050565b6000819050919050565b600061463f61463a6146358461461a565b6138f6565b613a74565b9050919050565b61464f81614624565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61468a81613a36565b82525050565b600061469c8383614681565b60208301905092915050565b6000602082019050919050565b60006146c082614655565b6146ca8185614660565b93506146d583614671565b8060005b838110156147065781516146ed8882614690565b97506146f8836146a8565b9250506001810190506146d9565b5085935050505092915050565b60006080820190506147286000830187614646565b818103602083015261473a81866146b5565b90506147496040830185613ef1565b6147566060830184613b20565b95945050505050565b7f436c61696d57616974206d757374206265207570646174656420746f2062657460008201527f7765656e203120616e6420323420686f75727300000000000000000000000000602082015250565b60006147bb60338361397b565b91506147c68261475f565b604082019050919050565b600060208201905081810360008301526147ea816147ae565b9050919050565b7f43616e6e6f742075706461746520636c61696d5761697420746f2073616d652060008201527f76616c7565000000000000000000000000000000000000000000000000000000602082015250565b600061484d60258361397b565b9150614858826147f1565b604082019050919050565b6000602082019050818103600083015261487c81614840565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006148df60268361397b565b91506148ea82614883565b604082019050919050565b6000602082019050818103600083015261490e816148d2565b9050919050565b61491e81614005565b811461492957600080fd5b50565b60008151905061493b81614915565b92915050565b60006020828403121561495757614956613a2c565b5b60006149658482850161492c565b91505092915050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b60006149ca60218361397b565b91506149d58261496e565b604082019050919050565b600060208201905081810360008301526149f9816149bd565b9050919050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000614a36601b8361397b565b9150614a4182614a00565b602082019050919050565b60006020820190508181036000830152614a6581614a29565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614ac860248361397b565b9150614ad382614a6c565b604082019050919050565b60006020820190508181036000830152614af781614abb565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000614b5a60228361397b565b9150614b6582614afe565b604082019050919050565b60006020820190508181036000830152614b8981614b4d565b9050919050565b6000614b9b82614005565b9150614ba683614005565b925082820190508281121560008312168382126000841215161715614bce57614bcd614144565b5b92915050565b6000614bdf82613922565b9050919050565b614bef81614bd4565b82525050565b6000604082019050614c0a6000830185614be6565b614c176020830184613b20565b9392505050565b6000614c2982613a74565b9150614c3483613a74565b9250828203905081811115614c4c57614c4b614144565b5b92915050565b6000614c5d82614005565b9150614c6883614005565b9250828203905081811260008412168282136000851215161715614c8f57614c8e614144565b5b92915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000614ccb601f8361397b565b9150614cd682614c95565b602082019050919050565b60006020820190508181036000830152614cfa81614cbe565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000614d5d60218361397b565b9150614d6882614d01565b604082019050919050565b60006020820190508181036000830152614d8c81614d50565b905091905056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220b8e1d22a1faad524b5680d9405142cd51b74a969739f1b5cfacb5b846347befb64736f6c63430008120033608060405234801561001057600080fd5b50610ae8806100206000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c8063663037ac1161005b578063663037ac146100ea578063949d225d1461011a578063c2bc2efc14610138578063cd413329146101685761007d565b806329092d0e146100825780633825d8281461009e578063564c8d11146100ba575b600080fd5b61009c60048036038101906100979190610863565b610198565b005b6100b860048036038101906100b391906108c6565b610464565b005b6100d460048036038101906100cf9190610863565b61065f565b6040516100e1919061091f565b60405180910390f35b61010460048036038101906100ff919061093a565b610727565b6040516101119190610976565b60405180910390f35b610122610771565b60405161012f91906109a0565b60405180910390f35b610152600480360381019061014d9190610863565b610780565b60405161015f91906109a0565b60405180910390f35b610182600480360381019061017d9190610863565b6107cb565b60405161018f91906109d6565b60405180910390f35b600060030160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561046157600060030160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff0219169055600060010160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000905560008060020160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600160008001805490506102e19190610a20565b905060008060000182815481106102fb576102fa610a54565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905082600060020160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600060020160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009055806000800184815481106103cc576103cb610a54565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000800180548061042857610427610a83565b5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590555050505b50565b600060030160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156105055780600060010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061065b565b6001600060030160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080600060010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000800180549050600060020160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060008001829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5050565b60008060030160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166106dc577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9050610722565b600060020160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490505b919050565b600080600001828154811061073f5761073e610a54565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60008060000180549050905090565b60008060010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6107f78361065f565b14159050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061083082610805565b9050919050565b61084081610825565b811461084b57600080fd5b50565b60008135905061085d81610837565b92915050565b60006020828403121561087957610878610800565b5b60006108878482850161084e565b91505092915050565b6000819050919050565b6108a381610890565b81146108ae57600080fd5b50565b6000813590506108c08161089a565b92915050565b600080604083850312156108dd576108dc610800565b5b60006108eb8582860161084e565b92505060206108fc858286016108b1565b9150509250929050565b6000819050919050565b61091981610906565b82525050565b60006020820190506109346000830184610910565b92915050565b6000602082840312156109505761094f610800565b5b600061095e848285016108b1565b91505092915050565b61097081610825565b82525050565b600060208201905061098b6000830184610967565b92915050565b61099a81610890565b82525050565b60006020820190506109b56000830184610991565b92915050565b60008115159050919050565b6109d0816109bb565b82525050565b60006020820190506109eb60008301846109c7565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610a2b82610890565b9150610a3683610890565b9250828203905081811115610a4e57610a4d6109f1565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220ad926edb3c8a8700a55ac447243cfb5ce7efe13ae2a8b78d176ebba63e9e300964736f6c63430008120033

Deployed Bytecode

0x60806040526004361061026b5760003560e01c80637651bc9211610144578063a9059cbb116100b6578063e0fb0f351161007a578063e0fb0f351461095e578063e7841ec014610975578063e98030c7146109a0578063f2fde38b146109c9578063fbcbc0f1146109f2578063ffb2c47914610a365761027a565b8063a9059cbb14610853578063aafd847a14610890578063be10b614146108cd578063cac8d538146108f8578063dd62ed3e146109215761027a565b806390ec9ec71161010857806390ec9ec71461073157806391b89fba1461075a57806395d89b411461079757806397b7e7ce146107c2578063a457c2d7146107d9578063a8b9d240146108165761027a565b80637651bc921461064a578063804974ea1461067557806385a6b3ae146106b257806389774282146106dd5780638da5cb5b146107065761027a565b8063313ce567116101dd5780635ebf4db9116101a15780635ebf4db91461056057806365e2ccb2146105895780636a474002146105b45780636f2789ec146105cb57806370a08231146105f6578063715018a6146106335761027a565b8063313ce5671461047d57806331e79db0146104a857806339509351146104d15780633974d3b11461050e5780634b1727ff146105375761027a565b806318160ddd1161022f57806318160ddd1461034757806321df2b0914610372578063226cfa3d1461039b57806323b872dd146103d857806327ce0147146104155780633009a609146104525761027a565b806303c833021461027f57806304d776231461028957806306fdde03146102b4578063095ea7b3146102df57806309bbedde1461031c5761027a565b3661027a57610278610a75565b005b600080fd5b610287610a75565b005b34801561029557600080fd5b5061029e610cab565b6040516102ab9190613955565b60405180910390f35b3480156102c057600080fd5b506102c9610cd1565b6040516102d69190613a00565b60405180910390f35b3480156102eb57600080fd5b5061030660048036038101906103019190613aaa565b610d63565b6040516103139190613b05565b60405180910390f35b34801561032857600080fd5b50610331610d81565b60405161033e9190613b2f565b60405180910390f35b34801561035357600080fd5b5061035c610e19565b6040516103699190613b2f565b60405180910390f35b34801561037e57600080fd5b5061039960048036038101906103949190613c05565b610e23565b005b3480156103a757600080fd5b506103c260048036038101906103bd9190613c86565b610fde565b6040516103cf9190613b2f565b60405180910390f35b3480156103e457600080fd5b506103ff60048036038101906103fa9190613cb3565b610ff6565b60405161040c9190613b05565b60405180910390f35b34801561042157600080fd5b5061043c60048036038101906104379190613c86565b611043565b6040516104499190613b2f565b60405180910390f35b34801561045e57600080fd5b506104676110e6565b6040516104749190613b2f565b60405180910390f35b34801561048957600080fd5b506104926110ec565b60405161049f9190613d22565b60405180910390f35b3480156104b457600080fd5b506104cf60048036038101906104ca9190613c86565b611103565b005b3480156104dd57600080fd5b506104f860048036038101906104f39190613aaa565b611276565b6040516105059190613b05565b60405180910390f35b34801561051a57600080fd5b5061053560048036038101906105309190613c86565b611329565b005b34801561054357600080fd5b5061055e60048036038101906105599190613e7b565b611669565b005b34801561056c57600080fd5b5061058760048036038101906105829190613ec4565b6116b0565b005b34801561059557600080fd5b5061059e611775565b6040516105ab9190613b2f565b60405180910390f35b3480156105c057600080fd5b506105c961177f565b005b3480156105d757600080fd5b506105e061178b565b6040516105ed9190613b2f565b60405180910390f35b34801561060257600080fd5b5061061d60048036038101906106189190613c86565b611791565b60405161062a9190613b2f565b60405180910390f35b34801561063f57600080fd5b506106486117da565b005b34801561065657600080fd5b5061065f61192d565b60405161066c9190613f00565b60405180910390f35b34801561068157600080fd5b5061069c60048036038101906106979190613c86565b611953565b6040516106a99190613b2f565b60405180910390f35b3480156106be57600080fd5b506106c761199c565b6040516106d49190613b2f565b60405180910390f35b3480156106e957600080fd5b5061070460048036038101906106ff9190613f85565b6119a2565b005b34801561071257600080fd5b5061071b611a46565b6040516107289190613f00565b60405180910390f35b34801561073d57600080fd5b5061075860048036038101906107539190613ec4565b611a6f565b005b34801561076657600080fd5b50610781600480360381019061077c9190613c86565b611ca6565b60405161078e9190613b2f565b60405180910390f35b3480156107a357600080fd5b506107ac611cb8565b6040516107b99190613a00565b60405180910390f35b3480156107ce57600080fd5b506107d7611d4a565b005b3480156107e557600080fd5b5061080060048036038101906107fb9190613aaa565b611f2a565b60405161080d9190613b05565b60405180910390f35b34801561082257600080fd5b5061083d60048036038101906108389190613c86565b611ff7565b60405161084a9190613b2f565b60405180910390f35b34801561085f57600080fd5b5061087a60048036038101906108759190613aaa565b61205a565b6040516108879190613b05565b60405180910390f35b34801561089c57600080fd5b506108b760048036038101906108b29190613c86565b6120a6565b6040516108c49190613b2f565b60405180910390f35b3480156108d957600080fd5b506108e26120ef565b6040516108ef9190613b2f565b60405180910390f35b34801561090457600080fd5b5061091f600480360381019061091a9190613c86565b6120f5565b005b34801561092d57600080fd5b5061094860048036038101906109439190613fc5565b6121ce565b6040516109559190613b2f565b60405180910390f35b34801561096a57600080fd5b50610973612255565b005b34801561098157600080fd5b5061098a612340565b6040516109979190613b2f565b60405180910390f35b3480156109ac57600080fd5b506109c760048036038101906109c29190613ec4565b61234a565b005b3480156109d557600080fd5b506109f060048036038101906109eb9190613c86565b6124b1565b005b3480156109fe57600080fd5b50610a196004803603810190610a149190613c86565b612672565b604051610a2d98979695949392919061401e565b60405180910390f35b348015610a4257600080fd5b50610a5d6004803603810190610a589190613ec4565b612980565b604051610a6c9392919061409c565b60405180910390f35b6000610a7f610e19565b11610a8957600080fd5b6000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610ae69190613f00565b602060405180830381865afa158015610b03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b2791906140e8565b9050610b3234611a6f565b6000610be282601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610b939190613f00565b602060405180830381865afa158015610bb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd491906140e8565b612c7b90919063ffffffff16565b90506000811115610ca757610c37610bf8610e19565b610c1c70010000000000000000000000000000000084612cc590919063ffffffff16565b610c269190614173565b600154612d3f90919063ffffffff16565b6001819055503373ffffffffffffffffffffffffffffffffffffffff167fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d7845411651182604051610c839190613b2f565b60405180910390a2610ca081600b54612d3f90919063ffffffff16565b600b819055505b5050565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060088054610ce0906141d3565b80601f0160208091040260200160405190810160405280929190818152602001828054610d0c906141d3565b8015610d595780601f10610d2e57610100808354040283529160200191610d59565b820191906000526020600020905b815481529060010190602001808311610d3c57829003601f168201915b5050505050905090565b6000610d77610d70612d9d565b8484612da5565b6001905092915050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663949d225d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610df0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1491906140e8565b905090565b6000600754905090565b610e2b612d9d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610eb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eaf90614250565b60405180910390fd5b60005b84849050811015610fd7576000858583818110610edb57610eda614270565b5b9050602002016020810190610ef09190613c86565b90506000633b9aca00858585818110610f0c57610f0b614270565b5b90506020020135610f1d919061429f565b9050600d548110610fc257610f328282612f6e565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633825d82883836040518363ffffffff1660e01b8152600401610f8f9291906142e1565b600060405180830381600087803b158015610fa957600080fd5b505af1158015610fbd573d6000803e3d6000fd5b505050505b50508080610fcf9061430a565b915050610ebb565b5050505050565b60106020528060005260406000206000915090505481565b600080611038576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102f906143c4565b60405180910390fd5b600190509392505050565b60007001000000000000000000000000000000006110d56110d0600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546110c26110bd6110ac88611791565b600154612cc590919063ffffffff16565b612fdb565b612ff890919063ffffffff16565b613043565b6110df9190614173565b9050919050565b600f5481565b6000600a60009054906101000a900460ff16905090565b61110b612d9d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611198576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118f90614250565b60405180910390fd5b6111a3816000612f6e565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166329092d0e826040518263ffffffff1660e01b81526004016111fe9190613f00565b600060405180830381600087803b15801561121857600080fd5b505af115801561122c573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff167fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2560405160405180910390a250565b600061131f611283612d9d565b8461131a8560066000611294612d9d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612d3f90919063ffffffff16565b612da5565b6001905092915050565b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b81526004016113869190613f00565b602060405180830381865afa1580156113a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113c791906140e8565b9050600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630e832273836040518263ffffffff1660e01b81526004016114249190613f00565b602060405180830381865afa158015611441573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061146591906143f9565b6115ae57600d5481106115105761147c8282612f6e565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633825d82883836040518363ffffffff1660e01b81526004016114d99291906142e1565b600060405180830381600087803b1580156114f357600080fd5b505af1158015611507573d6000803e3d6000fd5b505050506115a9565b61151b826000612f6e565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166329092d0e836040518263ffffffff1660e01b81526004016115769190613f00565b600060405180830381600087803b15801561159057600080fd5b505af11580156115a4573d6000803e3d6000fd5b505050505b611659565b60006115b983611791565b1115611658576115ca826000612f6e565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166329092d0e836040518263ffffffff1660e01b81526004016116259190613f00565b600060405180830381600087803b15801561163f57600080fd5b505af1158015611653573d6000803e3d6000fd5b505050505b5b61166482600161305a565b505050565b60005b81518110156116ac5761169882828151811061168b5761168a614270565b5b6020026020010151611329565b6001816116a59190614426565b905061166c565b5050565b6116b8612d9d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611745576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173c90614250565b60405180910390fd5b600a60009054906101000a900460ff16600a611761919061458d565b8161176c919061429f565b600d8190555050565b6000600d54905090565b611788336131b7565b50565b60115481565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6117e2612d9d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461186f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186690614250565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600b5481565b6119aa612d9d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611a37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2e90614250565b60405180910390fd5b611a41828261305a565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600267ffffffffffffffff811115611a8c57611a8b613d3d565b5b604051908082528060200260200182016040528015611aba5781602001602082028036833780820191505090505b509050601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b4e91906145ed565b81600081518110611b6257611b61614270565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600181518110611bd357611bd2614270565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b6f9de958360008430426040518663ffffffff1660e01b8152600401611c709493929190614713565b6000604051808303818588803b158015611c8957600080fd5b505af1158015611c9d573d6000803e3d6000fd5b50505050505050565b6000611cb182611ff7565b9050919050565b606060098054611cc7906141d3565b80601f0160208091040260200160405190810160405280929190818152602001828054611cf3906141d3565b8015611d405780601f10611d1557610100808354040283529160200191611d40565b820191906000526020600020905b815481529060010190602001808311611d2357829003601f168201915b5050505050905090565b611d52612d9d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ddf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd690614250565b60405180910390fd5b6000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611e3c9190613f00565b602060405180830381865afa158015611e59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e7d91906140e8565b9050601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb611ec5611a46565b836040518363ffffffff1660e01b8152600401611ee39291906142e1565b6020604051808303816000875af1158015611f02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f2691906143f9565b5050565b6000611fed611f37612d9d565b84611fe885604051806060016040528060258152602001614db66025913960066000611f61612d9d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133669092919063ffffffff16565b612da5565b6001905092915050565b6000612053600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461204584611043565b612c7b90919063ffffffff16565b9050919050565b60008061209c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612093906143c4565b60405180910390fd5b6001905092915050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600d5481565b6120fd612d9d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461218a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218190614250565b60405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61225d612d9d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146122ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e190614250565b60405180910390fd5b60004790506122f7611a46565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561233c573d6000803e3d6000fd5b5050565b6000600f54905090565b612352612d9d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146123df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d690614250565b60405180910390fd5b610e1081101580156123f45750620151808111155b612433576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242a906147d1565b60405180910390fd5b6011548103612477576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246e90614863565b60405180910390fd5b601154817f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f60405160405180910390a38060118190555050565b6124b9612d9d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612546576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253d90614250565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036125b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ac906148f5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080600080600080600080889750600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663564c8d11896040518263ffffffff1660e01b81526004016126dc9190613f00565b602060405180830381865afa1580156126f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061271d9190614941565b96507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9550600087126128d257600f5487111561277057612769600f54886133ca90919063ffffffff16565b95506128d1565b6000600f54600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663949d225d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061280691906140e8565b116128125760006128b8565b6128b7600f54600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663949d225d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612885573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128a991906140e8565b612c7b90919063ffffffff16565b5b90506128cd8189612ff890919063ffffffff16565b9650505b5b6128db88611ff7565b94506128e688611043565b9350601060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205492506000831161293957600061294f565b61294e60115484612d3f90919063ffffffff16565b5b915042821161295f576000612973565b6129724283612c7b90919063ffffffff16565b5b9050919395975091939597565b600080600080600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663949d225d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129f3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a1791906140e8565b905060008103612a3357600080600f5493509350935050612c74565b6000600f5490506000805a90506000805b8984108015612a5257508582105b15612c5b578480612a629061430a565b955050600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663949d225d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612ad2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612af691906140e8565b8510612b0157600094505b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663663037ac876040518263ffffffff1660e01b8152600401612b5e9190613b2f565b602060405180830381865afa158015612b7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b9f91906145ed565b9050612be9601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613415565b15612c0e57612bf981600161305a565b15612c0d578180612c099061430a565b9250505b5b8280612c199061430a565b93505060005a905080851115612c5157612c4e612c3f8287612c7b90919063ffffffff16565b87612d3f90919063ffffffff16565b95505b8094505050612a44565b84600f819055508181600f549850985098505050505050505b9193909250565b6000612cbd83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613366565b905092915050565b6000808303612cd75760009050612d39565b60008284612ce5919061429f565b9050828482612cf49190614173565b14612d34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2b906149e0565b60405180910390fd5b809150505b92915050565b6000808284612d4e9190614426565b905083811015612d93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d8a90614a4c565b60405180910390fd5b8091505092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612e14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e0b90614ade565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612e83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e7a90614b70565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612f619190613b2f565b60405180910390a3505050565b6000612f7983611791565b905080821115612faa576000612f988284612c7b90919063ffffffff16565b9050612fa48482613448565b50612fd6565b80821015612fd5576000612fc78383612c7b90919063ffffffff16565b9050612fd38482613682565b505b5b505050565b6000808290506000811215612fef57600080fd5b80915050919050565b60008082846130079190614b90565b90506000831215801561301a5750838112155b80613030575060008312801561302f57508381125b5b61303957600080fd5b8091505092915050565b60008082121561305257600080fd5b819050919050565b600080613066846131b7565b905060008111156131ab576000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506130c88183612d3f90919063ffffffff16565b600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555042601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508315158573ffffffffffffffffffffffffffffffffffffffff167fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf092846040516131989190613b2f565b60405180910390a36001925050506131b1565b60009150505b92915050565b6000806131c383611ff7565b9050600081111561335b5761322081600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612d3f90919063ffffffff16565b600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff167fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d826040516132a99190613b2f565b60405180910390a2601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84836040518363ffffffff1660e01b815260040161330e929190614bf5565b6020604051808303816000875af115801561332d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061335191906143f9565b5080915050613361565b60009150505b919050565b60008383111582906133ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133a59190613a00565b60405180910390fd5b50600083856133bd9190614c1e565b9050809150509392505050565b60008082846133d99190614c52565b9050600083121580156133ec5750838113155b80613402575060008312801561340157508381135b5b61340b57600080fd5b8091505092915050565b6000428211156134285760009050613443565b60115461343e8342612c7b90919063ffffffff16565b101590505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036134b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134ae90614ce1565b60405180910390fd5b6134cc81600754612d3f90919063ffffffff16565b60078190555061352481600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612d3f90919063ffffffff16565b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516135c59190613b2f565b60405180910390a361363b6135ed6135e883600154612cc590919063ffffffff16565b612fdb565b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133ca90919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036136f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136e890614d73565b60405180910390fd5b61375d81604051806060016040528060228152602001614d9460229139600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133669092919063ffffffff16565b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506137b581600754612c7b90919063ffffffff16565b600781905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516138199190613b2f565b60405180910390a361388f61384161383c83600154612cc590919063ffffffff16565b612fdb565b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612ff890919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061391b613916613911846138d6565b6138f6565b6138d6565b9050919050565b600061392d82613900565b9050919050565b600061393f82613922565b9050919050565b61394f81613934565b82525050565b600060208201905061396a6000830184613946565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156139aa57808201518184015260208101905061398f565b60008484015250505050565b6000601f19601f8301169050919050565b60006139d282613970565b6139dc818561397b565b93506139ec81856020860161398c565b6139f5816139b6565b840191505092915050565b60006020820190508181036000830152613a1a81846139c7565b905092915050565b6000604051905090565b600080fd5b600080fd5b6000613a41826138d6565b9050919050565b613a5181613a36565b8114613a5c57600080fd5b50565b600081359050613a6e81613a48565b92915050565b6000819050919050565b613a8781613a74565b8114613a9257600080fd5b50565b600081359050613aa481613a7e565b92915050565b60008060408385031215613ac157613ac0613a2c565b5b6000613acf85828601613a5f565b9250506020613ae085828601613a95565b9150509250929050565b60008115159050919050565b613aff81613aea565b82525050565b6000602082019050613b1a6000830184613af6565b92915050565b613b2981613a74565b82525050565b6000602082019050613b446000830184613b20565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112613b6f57613b6e613b4a565b5b8235905067ffffffffffffffff811115613b8c57613b8b613b4f565b5b602083019150836020820283011115613ba857613ba7613b54565b5b9250929050565b60008083601f840112613bc557613bc4613b4a565b5b8235905067ffffffffffffffff811115613be257613be1613b4f565b5b602083019150836020820283011115613bfe57613bfd613b54565b5b9250929050565b60008060008060408587031215613c1f57613c1e613a2c565b5b600085013567ffffffffffffffff811115613c3d57613c3c613a31565b5b613c4987828801613b59565b9450945050602085013567ffffffffffffffff811115613c6c57613c6b613a31565b5b613c7887828801613baf565b925092505092959194509250565b600060208284031215613c9c57613c9b613a2c565b5b6000613caa84828501613a5f565b91505092915050565b600080600060608486031215613ccc57613ccb613a2c565b5b6000613cda86828701613a5f565b9350506020613ceb86828701613a5f565b9250506040613cfc86828701613a95565b9150509250925092565b600060ff82169050919050565b613d1c81613d06565b82525050565b6000602082019050613d376000830184613d13565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613d75826139b6565b810181811067ffffffffffffffff82111715613d9457613d93613d3d565b5b80604052505050565b6000613da7613a22565b9050613db38282613d6c565b919050565b600067ffffffffffffffff821115613dd357613dd2613d3d565b5b602082029050602081019050919050565b6000613df7613df284613db8565b613d9d565b90508083825260208201905060208402830185811115613e1a57613e19613b54565b5b835b81811015613e435780613e2f8882613a5f565b845260208401935050602081019050613e1c565b5050509392505050565b600082601f830112613e6257613e61613b4a565b5b8135613e72848260208601613de4565b91505092915050565b600060208284031215613e9157613e90613a2c565b5b600082013567ffffffffffffffff811115613eaf57613eae613a31565b5b613ebb84828501613e4d565b91505092915050565b600060208284031215613eda57613ed9613a2c565b5b6000613ee884828501613a95565b91505092915050565b613efa81613a36565b82525050565b6000602082019050613f156000830184613ef1565b92915050565b6000613f26826138d6565b9050919050565b613f3681613f1b565b8114613f4157600080fd5b50565b600081359050613f5381613f2d565b92915050565b613f6281613aea565b8114613f6d57600080fd5b50565b600081359050613f7f81613f59565b92915050565b60008060408385031215613f9c57613f9b613a2c565b5b6000613faa85828601613f44565b9250506020613fbb85828601613f70565b9150509250929050565b60008060408385031215613fdc57613fdb613a2c565b5b6000613fea85828601613a5f565b9250506020613ffb85828601613a5f565b9150509250929050565b6000819050919050565b61401881614005565b82525050565b600061010082019050614034600083018b613ef1565b614041602083018a61400f565b61404e604083018961400f565b61405b6060830188613b20565b6140686080830187613b20565b61407560a0830186613b20565b61408260c0830185613b20565b61408f60e0830184613b20565b9998505050505050505050565b60006060820190506140b16000830186613b20565b6140be6020830185613b20565b6140cb6040830184613b20565b949350505050565b6000815190506140e281613a7e565b92915050565b6000602082840312156140fe576140fd613a2c565b5b600061410c848285016140d3565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061417e82613a74565b915061418983613a74565b92508261419957614198614115565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806141eb57607f821691505b6020821081036141fe576141fd6141a4565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061423a60208361397b565b915061424582614204565b602082019050919050565b600060208201905081810360008301526142698161422d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006142aa82613a74565b91506142b583613a74565b92508282026142c381613a74565b915082820484148315176142da576142d9614144565b5b5092915050565b60006040820190506142f66000830185613ef1565b6143036020830184613b20565b9392505050565b600061431582613a74565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361434757614346614144565b5b600182019050919050565b7f4e6f207472616e736665727320616c6c6f77656420696e206469766964656e6460008201527f20747261636b6572000000000000000000000000000000000000000000000000602082015250565b60006143ae60288361397b565b91506143b982614352565b604082019050919050565b600060208201905081810360008301526143dd816143a1565b9050919050565b6000815190506143f381613f59565b92915050565b60006020828403121561440f5761440e613a2c565b5b600061441d848285016143e4565b91505092915050565b600061443182613a74565b915061443c83613a74565b925082820190508082111561445457614453614144565b5b92915050565b60008160011c9050919050565b6000808291508390505b60018511156144b15780860481111561448d5761448c614144565b5b600185161561449c5780820291505b80810290506144aa8561445a565b9450614471565b94509492505050565b6000826144ca5760019050614586565b816144d85760009050614586565b81600181146144ee57600281146144f857614527565b6001915050614586565b60ff84111561450a57614509614144565b5b8360020a91508482111561452157614520614144565b5b50614586565b5060208310610133831016604e8410600b841016171561455c5782820a90508381111561455757614556614144565b5b614586565b6145698484846001614467565b925090508184048111156145805761457f614144565b5b81810290505b9392505050565b600061459882613a74565b91506145a383613d06565b92506145d07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846144ba565b905092915050565b6000815190506145e781613a48565b92915050565b60006020828403121561460357614602613a2c565b5b6000614611848285016145d8565b91505092915050565b6000819050919050565b600061463f61463a6146358461461a565b6138f6565b613a74565b9050919050565b61464f81614624565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61468a81613a36565b82525050565b600061469c8383614681565b60208301905092915050565b6000602082019050919050565b60006146c082614655565b6146ca8185614660565b93506146d583614671565b8060005b838110156147065781516146ed8882614690565b97506146f8836146a8565b9250506001810190506146d9565b5085935050505092915050565b60006080820190506147286000830187614646565b818103602083015261473a81866146b5565b90506147496040830185613ef1565b6147566060830184613b20565b95945050505050565b7f436c61696d57616974206d757374206265207570646174656420746f2062657460008201527f7765656e203120616e6420323420686f75727300000000000000000000000000602082015250565b60006147bb60338361397b565b91506147c68261475f565b604082019050919050565b600060208201905081810360008301526147ea816147ae565b9050919050565b7f43616e6e6f742075706461746520636c61696d5761697420746f2073616d652060008201527f76616c7565000000000000000000000000000000000000000000000000000000602082015250565b600061484d60258361397b565b9150614858826147f1565b604082019050919050565b6000602082019050818103600083015261487c81614840565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006148df60268361397b565b91506148ea82614883565b604082019050919050565b6000602082019050818103600083015261490e816148d2565b9050919050565b61491e81614005565b811461492957600080fd5b50565b60008151905061493b81614915565b92915050565b60006020828403121561495757614956613a2c565b5b60006149658482850161492c565b91505092915050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b60006149ca60218361397b565b91506149d58261496e565b604082019050919050565b600060208201905081810360008301526149f9816149bd565b9050919050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000614a36601b8361397b565b9150614a4182614a00565b602082019050919050565b60006020820190508181036000830152614a6581614a29565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614ac860248361397b565b9150614ad382614a6c565b604082019050919050565b60006020820190508181036000830152614af781614abb565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000614b5a60228361397b565b9150614b6582614afe565b604082019050919050565b60006020820190508181036000830152614b8981614b4d565b9050919050565b6000614b9b82614005565b9150614ba683614005565b925082820190508281121560008312168382126000841215161715614bce57614bcd614144565b5b92915050565b6000614bdf82613922565b9050919050565b614bef81614bd4565b82525050565b6000604082019050614c0a6000830185614be6565b614c176020830184613b20565b9392505050565b6000614c2982613a74565b9150614c3483613a74565b9250828203905081811115614c4c57614c4b614144565b5b92915050565b6000614c5d82614005565b9150614c6883614005565b9250828203905081811260008412168282136000851215161715614c8f57614c8e614144565b5b92915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000614ccb601f8361397b565b9150614cd682614c95565b602082019050919050565b60006020820190508181036000830152614cfa81614cbe565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000614d5d60218361397b565b9150614d6882614d01565b604082019050919050565b60006020820190508181036000830152614d8c81614d50565b905091905056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220b8e1d22a1faad524b5680d9405142cd51b74a969739f1b5cfacb5b846347befb64736f6c63430008120033

Deployed Bytecode Sourcemap

22223:14691:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28082:21;:19;:21::i;:::-;22223:14691;;;;;28458:631;;;:::i;:::-;;23940:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24028:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25061:169;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31763:115;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24305:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35933:473;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23434:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24718:184;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30681:247;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23394:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24214:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28255:195;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25238:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26086:711;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26805:227;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30936:198;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31639:116;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29616:106;;;;;;;;;;;;;:::i;:::-;;23490:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24413:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7417:148;;;;;;;;;;;;;:::i;:::-;;23858:74;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35307:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22963:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35152:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7203:79;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29097:509;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30242:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24119:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36725:184;;;;;;;;;;;;;:::i;:::-;;25464:269;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30372:166;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24548:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30546:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23080:72;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28119:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24910:143;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36490:151;;;;;;;;;;;;;:::i;:::-;;31522:109;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31142:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7573:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31886:1270;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;33861:1283;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;28458:631;28539:1;28523:13;:11;:13::i;:::-;:17;28515:26;;;;;;28552:22;28577:12;;;;;;;;;;;:22;;;28608:4;28577:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28552:62;;28625:28;28643:9;28625:17;:28::i;:::-;28664:18;28685:57;28727:14;28685:12;;;;;;;;;;;:22;;;28716:4;28685:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41;;:57;;;;:::i;:::-;28664:78;;28770:1;28757:10;:14;28753:329;;;28816:106;28894:13;:11;:13::i;:::-;28864:27;22426:8;28865:10;28864:16;;:27;;;;:::i;:::-;:43;;;;:::i;:::-;28816:25;;:29;;:106;;;;:::i;:::-;28788:25;:134;;;;28963:10;28942:44;;;28975:10;28942:44;;;;;;:::i;:::-;;;;;;;;29029:41;29059:10;29029:25;;:29;;:41;;;;:::i;:::-;29001:25;:69;;;;28753:329;28504:585;;28458:631::o;23940:51::-;;;;;;;;;;;;;:::o;24028:83::-;24065:13;24098:5;24091:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24028:83;:::o;25061:169::-;25144:4;25161:39;25170:12;:10;:12::i;:::-;25184:7;25193:6;25161:8;:39::i;:::-;25218:4;25211:11;;25061:169;;;;:::o;31763:115::-;31821:7;31848:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31841:29;;31763:115;:::o;24305:100::-;24358:7;24385:12;;24378:19;;24305:100;:::o;35933:473::-;7340:12;:10;:12::i;:::-;7330:22;;:6;;;;;;;;;;:22;;;7322:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;36050:10:::1;36045:354;36074:10;;:17;;36066:5;:25;36045:354;;;36117:15;36135:10;;36146:5;36135:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;36117:35;;36167:14;36201:7;36184;;36192:5;36184:14;;;;;;;:::i;:::-;;;;;;;;:24;;;;:::i;:::-;36167:41;;36237:31;;36227:6;:41;36223:165;;36289:28;36301:7;36310:6;36289:11;:28::i;:::-;36336:15;;;;;;;;;;;:19;;;36356:7;36365:6;36336:36;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;36223:165;36102:297;;36093:7;;;;;:::i;:::-;;;;36045:354;;;;35933:473:::0;;;;:::o;23434:49::-;;;;;;;;;;;;;;;;;:::o;24718:184::-;24797:4;24822:5;24814:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;24890:4;24883:11;;24718:184;;;;;:::o;30681:247::-;30750:7;22426:8;30777:131;:115;30855:28;:36;30884:6;30855:36;;;;;;;;;;;;;;;;30777:63;:48;30807:17;30817:6;30807:9;:17::i;:::-;30777:25;;:29;;:48;;;;:::i;:::-;:61;:63::i;:::-;:77;;:115;;;;:::i;:::-;:129;:131::i;:::-;:143;;;;:::i;:::-;30770:150;;30681:247;;;:::o;23394:33::-;;;;:::o;24214:83::-;24255:5;24280:9;;;;;;;;;;;24273:16;;24214:83;:::o;28255:195::-;7340:12;:10;:12::i;:::-;7330:22;;:6;;;;;;;;;;:22;;;7322:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;28332:23:::1;28344:7;28353:1;28332:11;:23::i;:::-;28366:15;;;;;;;;;;;:22;;;28389:7;28366:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;28434:7;28413:29;;;;;;;;;;;;28255:195:::0;:::o;25238:218::-;25326:4;25343:83;25352:12;:10;:12::i;:::-;25366:7;25375:50;25414:10;25375:11;:25;25387:12;:10;:12::i;:::-;25375:25;;;;;;;;;;;;;;;:34;25401:7;25375:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;25343:8;:83::i;:::-;25444:4;25437:11;;25238:218;;;;:::o;26086:711::-;26146:15;26164:10;;;;;;;;;;;:20;;;26185:7;26164:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26146:47;;26209:10;;;;;;;;;;;:32;;;26242:7;26209:41;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26204:537;;26282:31;;26271:7;:42;26267:295;;26334:29;26346:7;26355;26334:11;:29::i;:::-;26382:15;;;;;;;;;;;:19;;;26402:7;26411;26382:37;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26267:295;;;26473:23;26485:7;26494:1;26473:11;:23::i;:::-;26515:15;;;;;;;;;;;:22;;;26538:7;26515:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26267:295;26204:537;;;26619:1;26598:18;26608:7;26598:9;:18::i;:::-;:22;26594:136;;;26641:23;26653:7;26662:1;26641:11;:23::i;:::-;26683:15;;;;;;;;;;;:22;;;26706:7;26683:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26594:136;26204:537;26751:38;26774:7;26784:4;26751:14;:38::i;:::-;;26135:662;26086:711;:::o;26805:227::-;26881:13;26909:116;26924:8;:15;26916:5;:23;26909:116;;;26956:32;26972:8;26981:5;26972:15;;;;;;;;:::i;:::-;;;;;;;;26956;:32::i;:::-;27012:1;27003:10;;;;;:::i;:::-;;;26909:116;;;26870:162;26805:227;:::o;30936:198::-;7340:12;:10;:12::i;:::-;7330:22;;:6;;;;;;;;;;:22;;;7322:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;31116:9:::1;;;;;;;;;;;31110:2;:15;;;;:::i;:::-;31080:26;:46;;;;:::i;:::-;31046:31;:80;;;;30936:198:::0;:::o;31639:116::-;31689:7;31716:31;;31709:38;;31639:116;:::o;29616:106::-;29670:44;29702:10;29670:23;:44::i;:::-;;29616:106::o;23490:31::-;;;;:::o;24413:127::-;24487:7;24514:9;:18;24524:7;24514:18;;;;;;;;;;;;;;;;24507:25;;24413:127;;;:::o;7417:148::-;7340:12;:10;:12::i;:::-;7330:22;;:6;;;;;;;;;;:22;;;7322:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;7524:1:::1;7487:40;;7508:6;::::0;::::1;;;;;;;;7487:40;;;;;;;;;;;;7555:1;7538:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;7417:148::o:0;23858:74::-;;;;;;;;;;;;;:::o;35307:128::-;35375:7;35402:16;:25;35419:7;35402:25;;;;;;;;;;;;;;;;35395:32;;35307:128;;;:::o;22963:40::-;;;;:::o;35152:147::-;7340:12;:10;:12::i;:::-;7330:22;;:6;;;;;;;;;;:22;;;7322:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;35257:34:::1;35272:7;35281:9;35257:14;:34::i;:::-;;35152:147:::0;;:::o;7203:79::-;7241:7;7268:6;;;;;;;;;;;7261:13;;7203:79;:::o;29097:509::-;29219:21;29257:1;29243:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29219:40;;29280:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29270:4;29275:1;29270:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;;;29323:14;;;;;;;;;;;29313:4;29318:1;29313:7;;;;;;;;:::i;:::-;;;;;;;:24;;;;;;;;;;;29376:15;;;;;;;;;;;:66;;;29451:9;29476:1;29525:4;29552;29572:15;29376:222;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29150:456;29097:509;:::o;30242:122::-;30299:7;30326:30;30349:6;30326:22;:30::i;:::-;30319:37;;30242:122;;;:::o;24119:87::-;24158:13;24191:7;24184:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24119:87;:::o;36725:184::-;7340:12;:10;:12::i;:::-;7330:22;;:6;;;;;;;;;;:22;;;7322:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;36782:22:::1;36807:12;;;;;;;;;;;:22;;;36838:4;36807:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36782:62;;36855:12;;;;;;;;;;;:21;;;36877:7;:5;:7::i;:::-;36886:14;36855:46;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;36771:138;36725:184::o:0;25464:269::-;25557:4;25574:129;25583:12;:10;:12::i;:::-;25597:7;25606:96;25645:15;25606:96;;;;;;;;;;;;;;;;;:11;:25;25618:12;:10;:12::i;:::-;25606:25;;;;;;;;;;;;;;;:34;25632:7;25606:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;25574:8;:129::i;:::-;25721:4;25714:11;;25464:269;;;;:::o;30372:166::-;30441:7;30468:62;30503:18;:26;30522:6;30503:26;;;;;;;;;;;;;;;;30468:30;30491:6;30468:22;:30::i;:::-;:34;;:62;;;;:::i;:::-;30461:69;;30372:166;;;:::o;24548:162::-;24605:4;24630:5;24622:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;24698:4;24691:11;;24548:162;;;;:::o;30546:127::-;30612:7;30639:18;:26;30658:6;30639:26;;;;;;;;;;;;;;;;30632:33;;30546:127;;;:::o;23080:72::-;;;;:::o;28119:128::-;7340:12;:10;:12::i;:::-;7330:22;;:6;;;;;;;;;;:22;;;7322:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;28225:12:::1;28197:10;;:42;;;;;;;;;;;;;;;;;;28119:128:::0;:::o;24910:143::-;24991:7;25018:11;:18;25030:5;25018:18;;;;;;;;;;;;;;;:27;25037:7;25018:27;;;;;;;;;;;;;;;;25011:34;;24910:143;;;;:::o;36490:151::-;7340:12;:10;:12::i;:::-;7330:22;;:6;;;;;;;;;;:22;;;7322:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;36543:18:::1;36564:21;36543:42;;36604:7;:5;:7::i;:::-;36596:25;;:37;36622:10;36596:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;36532:109;36490:151::o:0;31522:109::-;31578:7;31605:18;;31598:25;;31522:109;:::o;31142:372::-;7340:12;:10;:12::i;:::-;7330:22;;:6;;;;;;;;;;:22;;;7322:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;31243:4:::1;31227:12;:20;;:45;;;;;31267:5;31251:12;:21;;31227:45;31219:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;31363:9;;31347:12;:25:::0;31339:75:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;31461:9;;31447:12;31430:41;;;;;;;;;;31494:12;31482:9;:24;;;;31142:372:::0;:::o;7573:244::-;7340:12;:10;:12::i;:::-;7330:22;;:6;;;;;;;;;;:22;;;7322:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;7682:1:::1;7662:22;;:8;:22;;::::0;7654:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;7772:8;7743:38;;7764:6;::::0;::::1;;;;;;;;7743:38;;;;;;;;;;;;7801:8;7792:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;7573:244:::0;:::o;31886:1270::-;31945:15;31962:12;31976:31;32018:29;32049:22;32073:21;32105;32128:38;32189:8;32179:18;;32216:15;;;;;;;;;;;:29;;;32246:7;32216:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32208:46;;32292:3;32265:30;;32319:1;32310:5;:10;32306:473;;32358:18;;32349:5;32341:35;32337:431;;;32424:37;32441:18;;32424:5;:9;;:37;;;;:::i;:::-;32397:64;;32337:431;;;32515:32;32575:18;;32550:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:43;:113;;32662:1;32550:113;;;32613:46;32640:18;;32613:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:26;;:46;;;;:::i;:::-;32550:113;32515:148;;32709:43;32726:24;32709:5;:9;;:43;;;;:::i;:::-;32682:70;;32496:272;32337:431;32306:473;32813:31;32836:7;32813:22;:31::i;:::-;32789:55;;32872:31;32895:7;32872:22;:31::i;:::-;32855:48;;32930:14;:23;32945:7;32930:23;;;;;;;;;;;;;;;;32914:39;;32996:1;32980:13;:17;:52;;33031:1;32980:52;;;33000:28;33018:9;;33000:13;:17;;:28;;;;:::i;:::-;32980:52;32964:68;;33092:15;33076:13;:31;:72;;33147:1;33076:72;;;33110:34;33128:15;33110:13;:17;;:34;;;;:::i;:::-;33076:72;33043:105;;31886:1270;;;;;;;;;:::o;33861:1283::-;33907:7;33916;33925;33945:28;33976:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33945:53;;34039:1;34015:20;:25;34011:91;;34065:1;34068;34071:18;;34057:33;;;;;;;;;34011:91;34112:27;34142:18;;34112:48;;34171:15;34201;34219:9;34201:27;;34239:18;34272:14;34301:727;34318:3;34308:7;:13;:50;;;;;34338:20;34325:10;:33;34308:50;34301:727;;;34375:21;;;;;:::i;:::-;;;;34438:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34415:19;:45;34411:109;;34503:1;34481:23;;34411:109;34534:15;34552;;;;;;;;;;;:29;;;34582:19;34552:50;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34534:68;;34621:37;34634:14;:23;34649:7;34634:23;;;;;;;;;;;;;;;;34621:12;:37::i;:::-;34617:172;;;34683:38;34706:7;34716:4;34683:14;:38::i;:::-;34679:95;;;34746:8;;;;;:::i;:::-;;;;34679:95;34617:172;34803:12;;;;;:::i;:::-;;;;34830:18;34851:9;34830:30;;34889:10;34879:7;:20;34875:107;;;34930:36;34942:23;34954:10;34942:7;:11;;:23;;;;:::i;:::-;34930:7;:11;;:36;;;;:::i;:::-;34920:46;;34875:107;35006:10;34996:20;;34360:668;;34301:727;;;35059:19;35038:18;:40;;;;35097:10;35109:6;35117:18;;35089:47;;;;;;;;;;;;33861:1283;;;;;;:::o;2539:136::-;2597:7;2624:43;2628:1;2631;2624:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;2617:50;;2539:136;;;;:::o;2883:471::-;2941:7;3191:1;3186;:6;3182:47;;3216:1;3209:8;;;;3182:47;3241:9;3257:1;3253;:5;;;;:::i;:::-;3241:17;;3286:1;3281;3277;:5;;;;:::i;:::-;:10;3269:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;3345:1;3338:8;;;2883:471;;;;;:::o;2350:181::-;2408:7;2428:9;2444:1;2440;:5;;;;:::i;:::-;2428:17;;2469:1;2464;:6;;2456:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;2522:1;2515:8;;;2350:181;;;;:::o;4211:98::-;4264:7;4291:10;4284:17;;4211:98;:::o;25741:337::-;25851:1;25834:19;;:5;:19;;;25826:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;25932:1;25913:21;;:7;:21;;;25905:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;26016:6;25986:11;:18;25998:5;25986:18;;;;;;;;;;;;;;;:27;26005:7;25986:27;;;;;;;;;;;;;;;:36;;;;26054:7;26038:32;;26047:5;26038:32;;;26063:6;26038:32;;;;;;:::i;:::-;;;;;;;;25741:337;;;:::o;33404:449::-;33482:22;33507:18;33517:7;33507:9;:18::i;:::-;33482:43;;33553:14;33540:10;:27;33536:310;;;33584:18;33605:30;33620:14;33605:10;:14;;:30;;;;:::i;:::-;33584:51;;33650:26;33656:7;33665:10;33650:5;:26::i;:::-;33569:119;33536:310;;;33711:14;33698:10;:27;33694:152;;;33742:18;33763:30;33782:10;33763:14;:18;;:30;;;;:::i;:::-;33742:51;;33808:26;33814:7;33823:10;33808:5;:26::i;:::-;33727:119;33694:152;33536:310;33471:382;33404:449;;:::o;2169:148::-;2225:6;2244:8;2262:1;2244:20;;2288:1;2283;:6;;2275:15;;;;;;2308:1;2301:8;;;2169:148;;;:::o;1685:176::-;1741:6;1760:8;1775:1;1771;:5;;;;:::i;:::-;1760:16;;1801:1;1796;:6;;:16;;;;;1811:1;1806;:6;;1796:16;1795:38;;;;1822:1;1818;:5;:14;;;;;1831:1;1827;:5;1818:14;1795:38;1787:47;;;;;;1852:1;1845:8;;;1685:176;;;;:::o;2007:127::-;2063:7;2096:1;2091;:6;;2083:15;;;;;;2124:1;2109:17;;2007:127;;;:::o;35443:482::-;35525:4;35542:14;35559:32;35583:7;35559:23;:32::i;:::-;35542:49;;35615:1;35606:6;:10;35602:293;;;35633:20;35656:16;:25;35673:7;35656:25;;;;;;;;;;;;;;;;35633:48;;35724:24;35735:12;35724:6;:10;;:24;;;;:::i;:::-;35696:16;:25;35713:7;35696:25;;;;;;;;;;;;;;;:52;;;;35789:15;35763:14;:23;35778:7;35763:23;;;;;;;;;;;;;;;:41;;;;35847:9;35824:33;;35830:7;35824:33;;;35839:6;35824:33;;;;;;:::i;:::-;;;;;;;;35879:4;35872:11;;;;;;35602:293;35912:5;35905:12;;;35443:482;;;;;:::o;29730:500::-;29803:7;29823:29;29855:28;29878:4;29855:22;:28::i;:::-;29823:60;;29922:1;29898:21;:25;29894:310;;;29967:51;29996:21;29967:18;:24;29986:4;29967:24;;;;;;;;;;;;;;;;:28;;:51;;;;:::i;:::-;29940:18;:24;29959:4;29940:24;;;;;;;;;;;;;;;:78;;;;30056:4;30038:46;;;30062:21;30038:46;;;;;;:::i;:::-;;;;;;;;30099:12;;;;;;;;;;;:21;;;30121:4;30127:21;30099:50;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;30171:21;30164:28;;;;;29894:310;30221:1;30214:8;;;29730:500;;;;:::o;2683:192::-;2769:7;2802:1;2797;:6;;2805:12;2789:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;2829:9;2845:1;2841;:5;;;;:::i;:::-;2829:17;;2866:1;2859:8;;;2683:192;;;;;:::o;1501:176::-;1557:6;1576:8;1591:1;1587;:5;;;;:::i;:::-;1576:16;;1617:1;1612;:6;;:16;;;;;1627:1;1622;:6;;1612:16;1611:38;;;;1638:1;1634;:5;:14;;;;;1647:1;1643;:5;1634:14;1611:38;1603:47;;;;;;1668:1;1661:8;;;1501:176;;;;:::o;33164:232::-;33231:4;33268:15;33252:13;:31;33248:76;;;33307:5;33300:12;;;;33248:76;33379:9;;33341:34;33361:13;33341:15;:19;;:34;;;;:::i;:::-;:47;;33334:54;;33164:232;;;;:::o;27040:472::-;27143:1;27124:21;;:7;:21;;;27116:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;27207:24;27224:6;27207:12;;:16;;:24;;;;:::i;:::-;27192:12;:39;;;;27263:30;27286:6;27263:9;:18;27273:7;27263:18;;;;;;;;;;;;;;;;:22;;:30;;;;:::i;:::-;27242:9;:18;27252:7;27242:18;;;;;;;;;;;;;;;:51;;;;27330:7;27309:37;;27326:1;27309:37;;;27339:6;27309:37;;;;;;:::i;:::-;;;;;;;;27397:107;27449:54;27450:37;27480:6;27450:25;;:29;;:37;;;;:::i;:::-;27449:52;:54::i;:::-;27397:28;:37;27426:7;27397:37;;;;;;;;;;;;;;;;:51;;:107;;;;:::i;:::-;27357:28;:37;27386:7;27357:37;;;;;;;;;;;;;;;:147;;;;27040:472;;:::o;27520:516::-;27623:1;27604:21;;:7;:21;;;27596:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;27697:68;27720:6;27697:68;;;;;;;;;;;;;;;;;:9;:18;27707:7;27697:18;;;;;;;;;;;;;;;;:22;;:68;;;;;:::i;:::-;27676:9;:18;27686:7;27676:18;;;;;;;;;;;;;;;:89;;;;27791:24;27808:6;27791:12;;:16;;:24;;;;:::i;:::-;27776:12;:39;;;;27857:1;27831:37;;27840:7;27831:37;;;27861:6;27831:37;;;;;;:::i;:::-;;;;;;;;27921:107;27973:54;27974:37;28004:6;27974:25;;:29;;:37;;;;:::i;:::-;27973:52;:54::i;:::-;27921:28;:37;27950:7;27921:37;;;;;;;;;;;;;;;;:51;;:107;;;;:::i;:::-;27881:28;:37;27910:7;27881:37;;;;;;;;;;;;;;;:147;;;;27520:516;;:::o;7:126:1:-;44:7;84:42;77:5;73:54;62:65;;7:126;;;:::o;139:60::-;167:3;188:5;181:12;;139:60;;;:::o;205:142::-;255:9;288:53;306:34;315:24;333:5;315:24;:::i;:::-;306:34;:::i;:::-;288:53;:::i;:::-;275:66;;205:142;;;:::o;353:126::-;403:9;436:37;467:5;436:37;:::i;:::-;423:50;;353:126;;;:::o;485:139::-;548:9;581:37;612:5;581:37;:::i;:::-;568:50;;485:139;;;:::o;630:157::-;730:50;774:5;730:50;:::i;:::-;725:3;718:63;630:157;;:::o;793:248::-;899:4;937:2;926:9;922:18;914:26;;950:84;1031:1;1020:9;1016:17;1007:6;950:84;:::i;:::-;793:248;;;;:::o;1047:99::-;1099:6;1133:5;1127:12;1117:22;;1047:99;;;:::o;1152:169::-;1236:11;1270:6;1265:3;1258:19;1310:4;1305:3;1301:14;1286:29;;1152:169;;;;:::o;1327:246::-;1408:1;1418:113;1432:6;1429:1;1426:13;1418:113;;;1517:1;1512:3;1508:11;1502:18;1498:1;1493:3;1489:11;1482:39;1454:2;1451:1;1447:10;1442:15;;1418:113;;;1565:1;1556:6;1551:3;1547:16;1540:27;1389:184;1327:246;;;:::o;1579:102::-;1620:6;1671:2;1667:7;1662:2;1655:5;1651:14;1647:28;1637:38;;1579:102;;;:::o;1687:377::-;1775:3;1803:39;1836:5;1803:39;:::i;:::-;1858:71;1922:6;1917:3;1858:71;:::i;:::-;1851:78;;1938:65;1996:6;1991:3;1984:4;1977:5;1973:16;1938:65;:::i;:::-;2028:29;2050:6;2028:29;:::i;:::-;2023:3;2019:39;2012:46;;1779:285;1687:377;;;;:::o;2070:313::-;2183:4;2221:2;2210:9;2206:18;2198:26;;2270:9;2264:4;2260:20;2256:1;2245:9;2241:17;2234:47;2298:78;2371:4;2362:6;2298:78;:::i;:::-;2290:86;;2070:313;;;;:::o;2389:75::-;2422:6;2455:2;2449:9;2439:19;;2389:75;:::o;2470:117::-;2579:1;2576;2569:12;2593:117;2702:1;2699;2692:12;2716:96;2753:7;2782:24;2800:5;2782:24;:::i;:::-;2771:35;;2716:96;;;:::o;2818:122::-;2891:24;2909:5;2891:24;:::i;:::-;2884:5;2881:35;2871:63;;2930:1;2927;2920:12;2871:63;2818:122;:::o;2946:139::-;2992:5;3030:6;3017:20;3008:29;;3046:33;3073:5;3046:33;:::i;:::-;2946:139;;;;:::o;3091:77::-;3128:7;3157:5;3146:16;;3091:77;;;:::o;3174:122::-;3247:24;3265:5;3247:24;:::i;:::-;3240:5;3237:35;3227:63;;3286:1;3283;3276:12;3227:63;3174:122;:::o;3302:139::-;3348:5;3386:6;3373:20;3364:29;;3402:33;3429:5;3402:33;:::i;:::-;3302:139;;;;:::o;3447:474::-;3515:6;3523;3572:2;3560:9;3551:7;3547:23;3543:32;3540:119;;;3578:79;;:::i;:::-;3540:119;3698:1;3723:53;3768:7;3759:6;3748:9;3744:22;3723:53;:::i;:::-;3713:63;;3669:117;3825:2;3851:53;3896:7;3887:6;3876:9;3872:22;3851:53;:::i;:::-;3841:63;;3796:118;3447:474;;;;;:::o;3927:90::-;3961:7;4004:5;3997:13;3990:21;3979:32;;3927:90;;;:::o;4023:109::-;4104:21;4119:5;4104:21;:::i;:::-;4099:3;4092:34;4023:109;;:::o;4138:210::-;4225:4;4263:2;4252:9;4248:18;4240:26;;4276:65;4338:1;4327:9;4323:17;4314:6;4276:65;:::i;:::-;4138:210;;;;:::o;4354:118::-;4441:24;4459:5;4441:24;:::i;:::-;4436:3;4429:37;4354:118;;:::o;4478:222::-;4571:4;4609:2;4598:9;4594:18;4586:26;;4622:71;4690:1;4679:9;4675:17;4666:6;4622:71;:::i;:::-;4478:222;;;;:::o;4706:117::-;4815:1;4812;4805:12;4829:117;4938:1;4935;4928:12;4952:117;5061:1;5058;5051:12;5092:568;5165:8;5175:6;5225:3;5218:4;5210:6;5206:17;5202:27;5192:122;;5233:79;;:::i;:::-;5192:122;5346:6;5333:20;5323:30;;5376:18;5368:6;5365:30;5362:117;;;5398:79;;:::i;:::-;5362:117;5512:4;5504:6;5500:17;5488:29;;5566:3;5558:4;5550:6;5546:17;5536:8;5532:32;5529:41;5526:128;;;5573:79;;:::i;:::-;5526:128;5092:568;;;;;:::o;5683:::-;5756:8;5766:6;5816:3;5809:4;5801:6;5797:17;5793:27;5783:122;;5824:79;;:::i;:::-;5783:122;5937:6;5924:20;5914:30;;5967:18;5959:6;5956:30;5953:117;;;5989:79;;:::i;:::-;5953:117;6103:4;6095:6;6091:17;6079:29;;6157:3;6149:4;6141:6;6137:17;6127:8;6123:32;6120:41;6117:128;;;6164:79;;:::i;:::-;6117:128;5683:568;;;;;:::o;6257:934::-;6379:6;6387;6395;6403;6452:2;6440:9;6431:7;6427:23;6423:32;6420:119;;;6458:79;;:::i;:::-;6420:119;6606:1;6595:9;6591:17;6578:31;6636:18;6628:6;6625:30;6622:117;;;6658:79;;:::i;:::-;6622:117;6771:80;6843:7;6834:6;6823:9;6819:22;6771:80;:::i;:::-;6753:98;;;;6549:312;6928:2;6917:9;6913:18;6900:32;6959:18;6951:6;6948:30;6945:117;;;6981:79;;:::i;:::-;6945:117;7094:80;7166:7;7157:6;7146:9;7142:22;7094:80;:::i;:::-;7076:98;;;;6871:313;6257:934;;;;;;;:::o;7197:329::-;7256:6;7305:2;7293:9;7284:7;7280:23;7276:32;7273:119;;;7311:79;;:::i;:::-;7273:119;7431:1;7456:53;7501:7;7492:6;7481:9;7477:22;7456:53;:::i;:::-;7446:63;;7402:117;7197:329;;;;:::o;7532:619::-;7609:6;7617;7625;7674:2;7662:9;7653:7;7649:23;7645:32;7642:119;;;7680:79;;:::i;:::-;7642:119;7800:1;7825:53;7870:7;7861:6;7850:9;7846:22;7825:53;:::i;:::-;7815:63;;7771:117;7927:2;7953:53;7998:7;7989:6;7978:9;7974:22;7953:53;:::i;:::-;7943:63;;7898:118;8055:2;8081:53;8126:7;8117:6;8106:9;8102:22;8081:53;:::i;:::-;8071:63;;8026:118;7532:619;;;;;:::o;8157:86::-;8192:7;8232:4;8225:5;8221:16;8210:27;;8157:86;;;:::o;8249:112::-;8332:22;8348:5;8332:22;:::i;:::-;8327:3;8320:35;8249:112;;:::o;8367:214::-;8456:4;8494:2;8483:9;8479:18;8471:26;;8507:67;8571:1;8560:9;8556:17;8547:6;8507:67;:::i;:::-;8367:214;;;;:::o;8587:180::-;8635:77;8632:1;8625:88;8732:4;8729:1;8722:15;8756:4;8753:1;8746:15;8773:281;8856:27;8878:4;8856:27;:::i;:::-;8848:6;8844:40;8986:6;8974:10;8971:22;8950:18;8938:10;8935:34;8932:62;8929:88;;;8997:18;;:::i;:::-;8929:88;9037:10;9033:2;9026:22;8816:238;8773:281;;:::o;9060:129::-;9094:6;9121:20;;:::i;:::-;9111:30;;9150:33;9178:4;9170:6;9150:33;:::i;:::-;9060:129;;;:::o;9195:311::-;9272:4;9362:18;9354:6;9351:30;9348:56;;;9384:18;;:::i;:::-;9348:56;9434:4;9426:6;9422:17;9414:25;;9494:4;9488;9484:15;9476:23;;9195:311;;;:::o;9529:710::-;9625:5;9650:81;9666:64;9723:6;9666:64;:::i;:::-;9650:81;:::i;:::-;9641:90;;9751:5;9780:6;9773:5;9766:21;9814:4;9807:5;9803:16;9796:23;;9867:4;9859:6;9855:17;9847:6;9843:30;9896:3;9888:6;9885:15;9882:122;;;9915:79;;:::i;:::-;9882:122;10030:6;10013:220;10047:6;10042:3;10039:15;10013:220;;;10122:3;10151:37;10184:3;10172:10;10151:37;:::i;:::-;10146:3;10139:50;10218:4;10213:3;10209:14;10202:21;;10089:144;10073:4;10068:3;10064:14;10057:21;;10013:220;;;10017:21;9631:608;;9529:710;;;;;:::o;10262:370::-;10333:5;10382:3;10375:4;10367:6;10363:17;10359:27;10349:122;;10390:79;;:::i;:::-;10349:122;10507:6;10494:20;10532:94;10622:3;10614:6;10607:4;10599:6;10595:17;10532:94;:::i;:::-;10523:103;;10339:293;10262:370;;;;:::o;10638:539::-;10722:6;10771:2;10759:9;10750:7;10746:23;10742:32;10739:119;;;10777:79;;:::i;:::-;10739:119;10925:1;10914:9;10910:17;10897:31;10955:18;10947:6;10944:30;10941:117;;;10977:79;;:::i;:::-;10941:117;11082:78;11152:7;11143:6;11132:9;11128:22;11082:78;:::i;:::-;11072:88;;10868:302;10638:539;;;;:::o;11183:329::-;11242:6;11291:2;11279:9;11270:7;11266:23;11262:32;11259:119;;;11297:79;;:::i;:::-;11259:119;11417:1;11442:53;11487:7;11478:6;11467:9;11463:22;11442:53;:::i;:::-;11432:63;;11388:117;11183:329;;;;:::o;11518:118::-;11605:24;11623:5;11605:24;:::i;:::-;11600:3;11593:37;11518:118;;:::o;11642:222::-;11735:4;11773:2;11762:9;11758:18;11750:26;;11786:71;11854:1;11843:9;11839:17;11830:6;11786:71;:::i;:::-;11642:222;;;;:::o;11870:104::-;11915:7;11944:24;11962:5;11944:24;:::i;:::-;11933:35;;11870:104;;;:::o;11980:138::-;12061:32;12087:5;12061:32;:::i;:::-;12054:5;12051:43;12041:71;;12108:1;12105;12098:12;12041:71;11980:138;:::o;12124:155::-;12178:5;12216:6;12203:20;12194:29;;12232:41;12267:5;12232:41;:::i;:::-;12124:155;;;;:::o;12285:116::-;12355:21;12370:5;12355:21;:::i;:::-;12348:5;12345:32;12335:60;;12391:1;12388;12381:12;12335:60;12285:116;:::o;12407:133::-;12450:5;12488:6;12475:20;12466:29;;12504:30;12528:5;12504:30;:::i;:::-;12407:133;;;;:::o;12546:484::-;12619:6;12627;12676:2;12664:9;12655:7;12651:23;12647:32;12644:119;;;12682:79;;:::i;:::-;12644:119;12802:1;12827:61;12880:7;12871:6;12860:9;12856:22;12827:61;:::i;:::-;12817:71;;12773:125;12937:2;12963:50;13005:7;12996:6;12985:9;12981:22;12963:50;:::i;:::-;12953:60;;12908:115;12546:484;;;;;:::o;13036:474::-;13104:6;13112;13161:2;13149:9;13140:7;13136:23;13132:32;13129:119;;;13167:79;;:::i;:::-;13129:119;13287:1;13312:53;13357:7;13348:6;13337:9;13333:22;13312:53;:::i;:::-;13302:63;;13258:117;13414:2;13440:53;13485:7;13476:6;13465:9;13461:22;13440:53;:::i;:::-;13430:63;;13385:118;13036:474;;;;;:::o;13516:76::-;13552:7;13581:5;13570:16;;13516:76;;;:::o;13598:115::-;13683:23;13700:5;13683:23;:::i;:::-;13678:3;13671:36;13598:115;;:::o;13719:989::-;14004:4;14042:3;14031:9;14027:19;14019:27;;14056:71;14124:1;14113:9;14109:17;14100:6;14056:71;:::i;:::-;14137:70;14203:2;14192:9;14188:18;14179:6;14137:70;:::i;:::-;14217;14283:2;14272:9;14268:18;14259:6;14217:70;:::i;:::-;14297:72;14365:2;14354:9;14350:18;14341:6;14297:72;:::i;:::-;14379:73;14447:3;14436:9;14432:19;14423:6;14379:73;:::i;:::-;14462;14530:3;14519:9;14515:19;14506:6;14462:73;:::i;:::-;14545;14613:3;14602:9;14598:19;14589:6;14545:73;:::i;:::-;14628;14696:3;14685:9;14681:19;14672:6;14628:73;:::i;:::-;13719:989;;;;;;;;;;;:::o;14714:442::-;14863:4;14901:2;14890:9;14886:18;14878:26;;14914:71;14982:1;14971:9;14967:17;14958:6;14914:71;:::i;:::-;14995:72;15063:2;15052:9;15048:18;15039:6;14995:72;:::i;:::-;15077;15145:2;15134:9;15130:18;15121:6;15077:72;:::i;:::-;14714:442;;;;;;:::o;15162:143::-;15219:5;15250:6;15244:13;15235:22;;15266:33;15293:5;15266:33;:::i;:::-;15162:143;;;;:::o;15311:351::-;15381:6;15430:2;15418:9;15409:7;15405:23;15401:32;15398:119;;;15436:79;;:::i;:::-;15398:119;15556:1;15581:64;15637:7;15628:6;15617:9;15613:22;15581:64;:::i;:::-;15571:74;;15527:128;15311:351;;;;:::o;15668:180::-;15716:77;15713:1;15706:88;15813:4;15810:1;15803:15;15837:4;15834:1;15827:15;15854:180;15902:77;15899:1;15892:88;15999:4;15996:1;15989:15;16023:4;16020:1;16013:15;16040:185;16080:1;16097:20;16115:1;16097:20;:::i;:::-;16092:25;;16131:20;16149:1;16131:20;:::i;:::-;16126:25;;16170:1;16160:35;;16175:18;;:::i;:::-;16160:35;16217:1;16214;16210:9;16205:14;;16040:185;;;;:::o;16231:180::-;16279:77;16276:1;16269:88;16376:4;16373:1;16366:15;16400:4;16397:1;16390:15;16417:320;16461:6;16498:1;16492:4;16488:12;16478:22;;16545:1;16539:4;16535:12;16566:18;16556:81;;16622:4;16614:6;16610:17;16600:27;;16556:81;16684:2;16676:6;16673:14;16653:18;16650:38;16647:84;;16703:18;;:::i;:::-;16647:84;16468:269;16417:320;;;:::o;16743:182::-;16883:34;16879:1;16871:6;16867:14;16860:58;16743:182;:::o;16931:366::-;17073:3;17094:67;17158:2;17153:3;17094:67;:::i;:::-;17087:74;;17170:93;17259:3;17170:93;:::i;:::-;17288:2;17283:3;17279:12;17272:19;;16931:366;;;:::o;17303:419::-;17469:4;17507:2;17496:9;17492:18;17484:26;;17556:9;17550:4;17546:20;17542:1;17531:9;17527:17;17520:47;17584:131;17710:4;17584:131;:::i;:::-;17576:139;;17303:419;;;:::o;17728:180::-;17776:77;17773:1;17766:88;17873:4;17870:1;17863:15;17897:4;17894:1;17887:15;17914:410;17954:7;17977:20;17995:1;17977:20;:::i;:::-;17972:25;;18011:20;18029:1;18011:20;:::i;:::-;18006:25;;18066:1;18063;18059:9;18088:30;18106:11;18088:30;:::i;:::-;18077:41;;18267:1;18258:7;18254:15;18251:1;18248:22;18228:1;18221:9;18201:83;18178:139;;18297:18;;:::i;:::-;18178:139;17962:362;17914:410;;;;:::o;18330:332::-;18451:4;18489:2;18478:9;18474:18;18466:26;;18502:71;18570:1;18559:9;18555:17;18546:6;18502:71;:::i;:::-;18583:72;18651:2;18640:9;18636:18;18627:6;18583:72;:::i;:::-;18330:332;;;;;:::o;18668:233::-;18707:3;18730:24;18748:5;18730:24;:::i;:::-;18721:33;;18776:66;18769:5;18766:77;18763:103;;18846:18;;:::i;:::-;18763:103;18893:1;18886:5;18882:13;18875:20;;18668:233;;;:::o;18907:227::-;19047:34;19043:1;19035:6;19031:14;19024:58;19116:10;19111:2;19103:6;19099:15;19092:35;18907:227;:::o;19140:366::-;19282:3;19303:67;19367:2;19362:3;19303:67;:::i;:::-;19296:74;;19379:93;19468:3;19379:93;:::i;:::-;19497:2;19492:3;19488:12;19481:19;;19140:366;;;:::o;19512:419::-;19678:4;19716:2;19705:9;19701:18;19693:26;;19765:9;19759:4;19755:20;19751:1;19740:9;19736:17;19729:47;19793:131;19919:4;19793:131;:::i;:::-;19785:139;;19512:419;;;:::o;19937:137::-;19991:5;20022:6;20016:13;20007:22;;20038:30;20062:5;20038:30;:::i;:::-;19937:137;;;;:::o;20080:345::-;20147:6;20196:2;20184:9;20175:7;20171:23;20167:32;20164:119;;;20202:79;;:::i;:::-;20164:119;20322:1;20347:61;20400:7;20391:6;20380:9;20376:22;20347:61;:::i;:::-;20337:71;;20293:125;20080:345;;;;:::o;20431:191::-;20471:3;20490:20;20508:1;20490:20;:::i;:::-;20485:25;;20524:20;20542:1;20524:20;:::i;:::-;20519:25;;20567:1;20564;20560:9;20553:16;;20588:3;20585:1;20582:10;20579:36;;;20595:18;;:::i;:::-;20579:36;20431:191;;;;:::o;20628:102::-;20670:8;20717:5;20714:1;20710:13;20689:34;;20628:102;;;:::o;20736:848::-;20797:5;20804:4;20828:6;20819:15;;20852:5;20843:14;;20866:712;20887:1;20877:8;20874:15;20866:712;;;20982:4;20977:3;20973:14;20967:4;20964:24;20961:50;;;20991:18;;:::i;:::-;20961:50;21041:1;21031:8;21027:16;21024:451;;;21456:4;21449:5;21445:16;21436:25;;21024:451;21506:4;21500;21496:15;21488:23;;21536:32;21559:8;21536:32;:::i;:::-;21524:44;;20866:712;;;20736:848;;;;;;;:::o;21590:1073::-;21644:5;21835:8;21825:40;;21856:1;21847:10;;21858:5;;21825:40;21884:4;21874:36;;21901:1;21892:10;;21903:5;;21874:36;21970:4;22018:1;22013:27;;;;22054:1;22049:191;;;;21963:277;;22013:27;22031:1;22022:10;;22033:5;;;22049:191;22094:3;22084:8;22081:17;22078:43;;;22101:18;;:::i;:::-;22078:43;22150:8;22147:1;22143:16;22134:25;;22185:3;22178:5;22175:14;22172:40;;;22192:18;;:::i;:::-;22172:40;22225:5;;;21963:277;;22349:2;22339:8;22336:16;22330:3;22324:4;22321:13;22317:36;22299:2;22289:8;22286:16;22281:2;22275:4;22272:12;22268:35;22252:111;22249:246;;;22405:8;22399:4;22395:19;22386:28;;22440:3;22433:5;22430:14;22427:40;;;22447:18;;:::i;:::-;22427:40;22480:5;;22249:246;22520:42;22558:3;22548:8;22542:4;22539:1;22520:42;:::i;:::-;22505:57;;;;22594:4;22589:3;22585:14;22578:5;22575:25;22572:51;;;22603:18;;:::i;:::-;22572:51;22652:4;22645:5;22641:16;22632:25;;21590:1073;;;;;;:::o;22669:281::-;22727:5;22751:23;22769:4;22751:23;:::i;:::-;22743:31;;22795:25;22811:8;22795:25;:::i;:::-;22783:37;;22839:104;22876:66;22866:8;22860:4;22839:104;:::i;:::-;22830:113;;22669:281;;;;:::o;22956:143::-;23013:5;23044:6;23038:13;23029:22;;23060:33;23087:5;23060:33;:::i;:::-;22956:143;;;;:::o;23105:351::-;23175:6;23224:2;23212:9;23203:7;23199:23;23195:32;23192:119;;;23230:79;;:::i;:::-;23192:119;23350:1;23375:64;23431:7;23422:6;23411:9;23407:22;23375:64;:::i;:::-;23365:74;;23321:128;23105:351;;;;:::o;23462:85::-;23507:7;23536:5;23525:16;;23462:85;;;:::o;23553:158::-;23611:9;23644:61;23662:42;23671:32;23697:5;23671:32;:::i;:::-;23662:42;:::i;:::-;23644:61;:::i;:::-;23631:74;;23553:158;;;:::o;23717:147::-;23812:45;23851:5;23812:45;:::i;:::-;23807:3;23800:58;23717:147;;:::o;23870:114::-;23937:6;23971:5;23965:12;23955:22;;23870:114;;;:::o;23990:184::-;24089:11;24123:6;24118:3;24111:19;24163:4;24158:3;24154:14;24139:29;;23990:184;;;;:::o;24180:132::-;24247:4;24270:3;24262:11;;24300:4;24295:3;24291:14;24283:22;;24180:132;;;:::o;24318:108::-;24395:24;24413:5;24395:24;:::i;:::-;24390:3;24383:37;24318:108;;:::o;24432:179::-;24501:10;24522:46;24564:3;24556:6;24522:46;:::i;:::-;24600:4;24595:3;24591:14;24577:28;;24432:179;;;;:::o;24617:113::-;24687:4;24719;24714:3;24710:14;24702:22;;24617:113;;;:::o;24766:732::-;24885:3;24914:54;24962:5;24914:54;:::i;:::-;24984:86;25063:6;25058:3;24984:86;:::i;:::-;24977:93;;25094:56;25144:5;25094:56;:::i;:::-;25173:7;25204:1;25189:284;25214:6;25211:1;25208:13;25189:284;;;25290:6;25284:13;25317:63;25376:3;25361:13;25317:63;:::i;:::-;25310:70;;25403:60;25456:6;25403:60;:::i;:::-;25393:70;;25249:224;25236:1;25233;25229:9;25224:14;;25189:284;;;25193:14;25489:3;25482:10;;24890:608;;;24766:732;;;;:::o;25504:720::-;25739:4;25777:3;25766:9;25762:19;25754:27;;25791:79;25867:1;25856:9;25852:17;25843:6;25791:79;:::i;:::-;25917:9;25911:4;25907:20;25902:2;25891:9;25887:18;25880:48;25945:108;26048:4;26039:6;25945:108;:::i;:::-;25937:116;;26063:72;26131:2;26120:9;26116:18;26107:6;26063:72;:::i;:::-;26145;26213:2;26202:9;26198:18;26189:6;26145:72;:::i;:::-;25504:720;;;;;;;:::o;26230:238::-;26370:34;26366:1;26358:6;26354:14;26347:58;26439:21;26434:2;26426:6;26422:15;26415:46;26230:238;:::o;26474:366::-;26616:3;26637:67;26701:2;26696:3;26637:67;:::i;:::-;26630:74;;26713:93;26802:3;26713:93;:::i;:::-;26831:2;26826:3;26822:12;26815:19;;26474:366;;;:::o;26846:419::-;27012:4;27050:2;27039:9;27035:18;27027:26;;27099:9;27093:4;27089:20;27085:1;27074:9;27070:17;27063:47;27127:131;27253:4;27127:131;:::i;:::-;27119:139;;26846:419;;;:::o;27271:224::-;27411:34;27407:1;27399:6;27395:14;27388:58;27480:7;27475:2;27467:6;27463:15;27456:32;27271:224;:::o;27501:366::-;27643:3;27664:67;27728:2;27723:3;27664:67;:::i;:::-;27657:74;;27740:93;27829:3;27740:93;:::i;:::-;27858:2;27853:3;27849:12;27842:19;;27501:366;;;:::o;27873:419::-;28039:4;28077:2;28066:9;28062:18;28054:26;;28126:9;28120:4;28116:20;28112:1;28101:9;28097:17;28090:47;28154:131;28280:4;28154:131;:::i;:::-;28146:139;;27873:419;;;:::o;28298:225::-;28438:34;28434:1;28426:6;28422:14;28415:58;28507:8;28502:2;28494:6;28490:15;28483:33;28298:225;:::o;28529:366::-;28671:3;28692:67;28756:2;28751:3;28692:67;:::i;:::-;28685:74;;28768:93;28857:3;28768:93;:::i;:::-;28886:2;28881:3;28877:12;28870:19;;28529:366;;;:::o;28901:419::-;29067:4;29105:2;29094:9;29090:18;29082:26;;29154:9;29148:4;29144:20;29140:1;29129:9;29125:17;29118:47;29182:131;29308:4;29182:131;:::i;:::-;29174:139;;28901:419;;;:::o;29326:120::-;29398:23;29415:5;29398:23;:::i;:::-;29391:5;29388:34;29378:62;;29436:1;29433;29426:12;29378:62;29326:120;:::o;29452:141::-;29508:5;29539:6;29533:13;29524:22;;29555:32;29581:5;29555:32;:::i;:::-;29452:141;;;;:::o;29599:349::-;29668:6;29717:2;29705:9;29696:7;29692:23;29688:32;29685:119;;;29723:79;;:::i;:::-;29685:119;29843:1;29868:63;29923:7;29914:6;29903:9;29899:22;29868:63;:::i;:::-;29858:73;;29814:127;29599:349;;;;:::o;29954:220::-;30094:34;30090:1;30082:6;30078:14;30071:58;30163:3;30158:2;30150:6;30146:15;30139:28;29954:220;:::o;30180:366::-;30322:3;30343:67;30407:2;30402:3;30343:67;:::i;:::-;30336:74;;30419:93;30508:3;30419:93;:::i;:::-;30537:2;30532:3;30528:12;30521:19;;30180:366;;;:::o;30552:419::-;30718:4;30756:2;30745:9;30741:18;30733:26;;30805:9;30799:4;30795:20;30791:1;30780:9;30776:17;30769:47;30833:131;30959:4;30833:131;:::i;:::-;30825:139;;30552:419;;;:::o;30977:177::-;31117:29;31113:1;31105:6;31101:14;31094:53;30977:177;:::o;31160:366::-;31302:3;31323:67;31387:2;31382:3;31323:67;:::i;:::-;31316:74;;31399:93;31488:3;31399:93;:::i;:::-;31517:2;31512:3;31508:12;31501:19;;31160:366;;;:::o;31532:419::-;31698:4;31736:2;31725:9;31721:18;31713:26;;31785:9;31779:4;31775:20;31771:1;31760:9;31756:17;31749:47;31813:131;31939:4;31813:131;:::i;:::-;31805:139;;31532:419;;;:::o;31957:223::-;32097:34;32093:1;32085:6;32081:14;32074:58;32166:6;32161:2;32153:6;32149:15;32142:31;31957:223;:::o;32186:366::-;32328:3;32349:67;32413:2;32408:3;32349:67;:::i;:::-;32342:74;;32425:93;32514:3;32425:93;:::i;:::-;32543:2;32538:3;32534:12;32527:19;;32186:366;;;:::o;32558:419::-;32724:4;32762:2;32751:9;32747:18;32739:26;;32811:9;32805:4;32801:20;32797:1;32786:9;32782:17;32775:47;32839:131;32965:4;32839:131;:::i;:::-;32831:139;;32558:419;;;:::o;32983:221::-;33123:34;33119:1;33111:6;33107:14;33100:58;33192:4;33187:2;33179:6;33175:15;33168:29;32983:221;:::o;33210:366::-;33352:3;33373:67;33437:2;33432:3;33373:67;:::i;:::-;33366:74;;33449:93;33538:3;33449:93;:::i;:::-;33567:2;33562:3;33558:12;33551:19;;33210:366;;;:::o;33582:419::-;33748:4;33786:2;33775:9;33771:18;33763:26;;33835:9;33829:4;33825:20;33821:1;33810:9;33806:17;33799:47;33863:131;33989:4;33863:131;:::i;:::-;33855:139;;33582:419;;;:::o;34007:375::-;34046:3;34065:19;34082:1;34065:19;:::i;:::-;34060:24;;34098:19;34115:1;34098:19;:::i;:::-;34093:24;;34140:1;34137;34133:9;34126:16;;34338:1;34333:3;34329:11;34322:19;34318:1;34315;34311:9;34307:35;34290:1;34285:3;34281:11;34276:1;34273;34269:9;34262:17;34258:35;34242:110;34239:136;;;34355:18;;:::i;:::-;34239:136;34007:375;;;;:::o;34388:134::-;34446:9;34479:37;34510:5;34479:37;:::i;:::-;34466:50;;34388:134;;;:::o;34528:147::-;34623:45;34662:5;34623:45;:::i;:::-;34618:3;34611:58;34528:147;;:::o;34681:348::-;34810:4;34848:2;34837:9;34833:18;34825:26;;34861:79;34937:1;34926:9;34922:17;34913:6;34861:79;:::i;:::-;34950:72;35018:2;35007:9;35003:18;34994:6;34950:72;:::i;:::-;34681:348;;;;;:::o;35035:194::-;35075:4;35095:20;35113:1;35095:20;:::i;:::-;35090:25;;35129:20;35147:1;35129:20;:::i;:::-;35124:25;;35173:1;35170;35166:9;35158:17;;35197:1;35191:4;35188:11;35185:37;;;35202:18;;:::i;:::-;35185:37;35035:194;;;;:::o;35235:372::-;35274:4;35294:19;35311:1;35294:19;:::i;:::-;35289:24;;35327:19;35344:1;35327:19;:::i;:::-;35322:24;;35370:1;35367;35363:9;35355:17;;35564:1;35558:4;35554:12;35550:1;35547;35543:9;35539:28;35522:1;35516:4;35512:12;35507:1;35504;35500:9;35493:17;35489:36;35473:104;35470:130;;;35580:18;;:::i;:::-;35470:130;35235:372;;;;:::o;35613:181::-;35753:33;35749:1;35741:6;35737:14;35730:57;35613:181;:::o;35800:366::-;35942:3;35963:67;36027:2;36022:3;35963:67;:::i;:::-;35956:74;;36039:93;36128:3;36039:93;:::i;:::-;36157:2;36152:3;36148:12;36141:19;;35800:366;;;:::o;36172:419::-;36338:4;36376:2;36365:9;36361:18;36353:26;;36425:9;36419:4;36415:20;36411:1;36400:9;36396:17;36389:47;36453:131;36579:4;36453:131;:::i;:::-;36445:139;;36172:419;;;:::o;36597:220::-;36737:34;36733:1;36725:6;36721:14;36714:58;36806:3;36801:2;36793:6;36789:15;36782:28;36597:220;:::o;36823:366::-;36965:3;36986:67;37050:2;37045:3;36986:67;:::i;:::-;36979:74;;37062:93;37151:3;37062:93;:::i;:::-;37180:2;37175:3;37171:12;37164:19;;36823:366;;;:::o;37195:419::-;37361:4;37399:2;37388:9;37384:18;37376:26;;37448:9;37442:4;37438:20;37434:1;37423:9;37419:17;37412:47;37476:131;37602:4;37476:131;:::i;:::-;37468:139;;37195:419;;;:::o

Swarm Source

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