ETH Price: $2,567.61 (-4.43%)
Gas: 6 Gwei

Token

SERENITY DAO (SERENITY)
 

Overview

Max Total Supply

500,000,000,000 SERENITY

Holders

76

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
111,905,437.549604646961639182 SERENITY

Value
$0.00
0xba6441cd7dcfe01bad8deac19d2366a6da1ac253
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:
SERENITYDAO

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-09-22
*/

/**
 
Serenity Dao introduces a novel approach to Ethereum 2.0 collaborative staking aimed at enabling small Ethereum holders and business to participate in consensus whilst earning passive income
TG: https://t.me/SerenityDao
Links: https://linktr.ee/SerenityDao
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address to, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);

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

interface IERC20Metadata is IERC20 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
}

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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

        return true;
    }

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

        _beforeTokenTransfer(from, to, amount);

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

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

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

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

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

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

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

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

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

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

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

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

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

    function initialize(address, address) external;
}

interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

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

abstract contract Ownable is Context {
    address private _owner;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

contract SERENITYDAO is ERC20, Ownable {
    using SafeMath for uint256;

    uint256 public maxSupply; // what the total supply can reach and not go beyond

    IUniswapV2Router02 private uniswapV2Router;
    address private uniswapV2Pair;

    bool private _swapping;

    address private _swapFeeReceiver;
    
    uint256 public maxTransactionAmount;
    uint256 public maxWallet;

    uint256 public swapTokensThreshold;
        
    bool public limitsInEffect = true;

    uint256 public totalFees;
    uint256 private _marketingFee;
    uint256 private _liquidityFee;
    uint256 private _validatorFee;
    
    uint256 private _tokensForMarketing;
    uint256 private _tokensForLiquidity;
    uint256 private _tokensForValidator;
    
    // staking vars
    uint256 public totalStaked;
    address public stakingToken;
    address public rewardToken;
    uint256 public apr;

    bool public stakingEnabled = false;
    uint256 public totalClaimed;

    struct Validator {
        uint256 creationTime;
        uint256 staked;
    }

    struct Staker {
        address staker;
        uint256 start;
        uint256 staked;
        uint256 earned;
    }

    struct ClaimHistory {
        uint256[] dates;
        uint256[] amounts;
    }

    // exlcude from fees and max transaction amount
    mapping (address => bool) private _isExcludedFromFees;
    mapping (address => bool) private _isExcludedMaxTransactionAmount;

    // store addresses that a automatic market maker pairs. Any transfer *to* these addresses
    // could be subject to a maximum transfer amount
    mapping (address => bool) private _automatedMarketMakerPairs;

    // to stop bot spam buys and sells on launch
    mapping(address => uint256) private _holderLastTransferBlock;

    // stake data
    mapping(address => mapping(uint256 => Staker)) private _stakers;
    mapping(address => ClaimHistory) private _claimHistory;
    Validator[] public validators;

    /**
     * @dev Throws if called by any account other than the _swapFeeReceiver
     */
    modifier teamOROwner() {
        require(_swapFeeReceiver == _msgSender() || owner() == _msgSender(), "Caller is not the _swapFeeReceiver address nor owner.");
        _;
    }

    modifier isStakingEnabled() {
        require(stakingEnabled, "Staking is not enabled.");
        _;
    }

    constructor() ERC20("SERENITY DAO", "SERENITY") payable {
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        
        _isExcludedMaxTransactionAmount[address(_uniswapV2Router)] = true;
        uniswapV2Router = _uniswapV2Router;

        uint256 marketingFee = 2;
        uint256 liquidityFee = 0;
        uint256 validatorFee = 4;

        uint256 totalSupply = 5e11 * 1e18;
        maxSupply = 1e12 * 1e18;

        maxTransactionAmount = totalSupply * 200 / 1000;
        maxWallet = totalSupply * 40 / 100;
        swapTokensThreshold = totalSupply * 1 / 1000;
        
        _marketingFee = marketingFee;
        _liquidityFee = liquidityFee;
        _validatorFee = validatorFee;
        totalFees = _marketingFee + _liquidityFee + _validatorFee;

        _swapFeeReceiver = owner();

        // exclude from paying fees or having max transaction amount
        excludeFromFees(owner(), true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);
        
        _isExcludedMaxTransactionAmount[owner()] = true;
        _isExcludedMaxTransactionAmount[address(this)] = true;
        _isExcludedMaxTransactionAmount[address(0xdead)] = true;
        
        stakingToken = address(this);
        rewardToken = address(this);
        apr = 50;

        _mint(address(this), totalSupply.sub(17e10 * 1e18));
        _mint(msg.sender, 17e10 * 1e18);
    }

    /**
    * @dev Once live, can never be switched off
    */
    function startTrading() external teamOROwner {
        uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(address(this), uniswapV2Router.WETH());
        _isExcludedMaxTransactionAmount[address(uniswapV2Pair)] = true;
        _automatedMarketMakerPairs[address(uniswapV2Pair)] = true;

        _approve(address(this), address(uniswapV2Router), balanceOf(address(this)));
        uniswapV2Router.addLiquidityETH{value: address(this).balance} (
            address(this),
            balanceOf(address(this)),
            0,
            0,
            owner(),
            block.timestamp
        );
    }

    /**
    * @dev Remove limits after token is somewhat stable
    */
    function removeLimits() external teamOROwner {
        limitsInEffect = false;
    }

    /**
    * @dev Exclude from fee calculation
    */
    function excludeFromFees(address account, bool excluded) public teamOROwner {
        _isExcludedFromFees[account] = excluded;
    }
    
    /**
    * @dev Update token fees (max set to initial fee)
    */
    function updateFees(uint256 marketingFee, uint256 liquidityFee, uint256 validatorFee) external onlyOwner {
        _marketingFee = marketingFee;
        _liquidityFee = liquidityFee;
        _validatorFee = validatorFee;

        totalFees = _marketingFee + _liquidityFee + _validatorFee;

        require(totalFees <= 6, "Must keep fees at 6% or less");
    }

    /**
    * @dev Update wallet that receives fees and newly added LP
    */
    function updateFeeReceiver(address newWallet) external teamOROwner {
        _swapFeeReceiver = newWallet;
    }

    /**
    * @dev Very important function. 
    * Updates the threshold of how many tokens that must be in the contract calculation for fees to be taken
    */
    function updateSwapTokensThreshold(uint256 newThreshold) external teamOROwner returns (bool) {
  	    require(newThreshold >= totalSupply() * 1 / 100000, "Swap threshold cannot be lower than 0.001% total supply.");
  	    require(newThreshold <= totalSupply() * 5 / 1000, "Swap threshold cannot be higher than 0.5% total supply.");
  	    swapTokensThreshold = newThreshold;
  	    return true;
  	}

    /**
    * @dev Check if an address is excluded from the fee calculation
    */
    function isExcludedFromFees(address account) external view returns(bool) {
        return _isExcludedFromFees[account];
    }

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

        // all to secure a smooth launch
        if (limitsInEffect) {
            if (
                from != owner() &&
                to != owner() &&
                to != address(0xdead) &&
                !_swapping
            ) {
                if (to != owner() && to != address(uniswapV2Router) && to != address(uniswapV2Pair)){
                    require(_holderLastTransferBlock[tx.origin] < block.number, "_transfer:: Transfer Delay enabled.  Only one purchase per block allowed.");
                    _holderLastTransferBlock[tx.origin] = block.number;
                }

                // on buy
                if (_automatedMarketMakerPairs[from] && !_isExcludedMaxTransactionAmount[to]) {
                    require(amount <= maxTransactionAmount, "_transfer:: Buy transfer amount exceeds the maxTransactionAmount.");
                    require(amount + balanceOf(to) <= maxWallet, "_transfer:: Max wallet exceeded");
                }
                
                // on sell
                else if (_automatedMarketMakerPairs[to] && !_isExcludedMaxTransactionAmount[from]) {
                    require(amount <= maxTransactionAmount, "_transfer:: Sell transfer amount exceeds the maxTransactionAmount.");
                }
                else if (!_isExcludedMaxTransactionAmount[to]) {
                    require(amount + balanceOf(to) <= maxWallet, "_transfer:: Max wallet exceeded");
                }
            }
        }
        
		uint256 contractTokenBalance = balanceOf(address(this));
        bool canSwap = contractTokenBalance >= swapTokensThreshold;
        if (
            canSwap &&
            !_swapping &&
            !_automatedMarketMakerPairs[from] &&
            !_isExcludedFromFees[from] &&
            !_isExcludedFromFees[to]
        ) {
            _swapping = true;
            swapBack();
            _swapping = false;
        }

        bool takeFee = !_swapping;

        // if any addy belongs to _isExcludedFromFee or isn't a swap then remove the fee
        if (
            _isExcludedFromFees[from] || 
            _isExcludedFromFees[to] || 
            (!_automatedMarketMakerPairs[from] && !_automatedMarketMakerPairs[to])
        ) takeFee = false;
        
        uint256 fees = 0;
        if (takeFee) {
            fees = amount.mul(totalFees).div(100);
            _tokensForLiquidity += fees * _liquidityFee / totalFees;
            _tokensForValidator += fees * _validatorFee / totalFees;
            _tokensForMarketing += fees * _marketingFee / totalFees;
            
            if (fees > 0) {
                super._transfer(from, address(this), fees);
            }
        	
        	amount -= fees;
        }

        super._transfer(from, to, amount);
    }

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

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

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

    function _addLiquidity(uint256 tokenAmount, uint256 ethAmount) internal {
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0,
            0,
            _swapFeeReceiver,
            block.timestamp
        );
    }

    function swapBack() internal {
        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = _tokensForLiquidity + _tokensForMarketing + _tokensForValidator;
        
        if (contractBalance == 0 || totalTokensToSwap == 0) return;
        if (contractBalance > swapTokensThreshold) contractBalance = swapTokensThreshold;
        
        
        // Halve the amount of liquidity tokens
        uint256 liquidityTokens = contractBalance * _tokensForLiquidity / totalTokensToSwap / 2;
        uint256 amountToSwapForETH = contractBalance.sub(liquidityTokens);
        
        uint256 initialETHBalance = address(this).balance;

        _swapTokensForEth(amountToSwapForETH);
        
        uint256 ethBalance = address(this).balance.sub(initialETHBalance);
        uint256 ethForMarketing = ethBalance.mul(_tokensForMarketing).div(totalTokensToSwap);
        uint256 ethForValidator = ethBalance.mul(_tokensForValidator).div(totalTokensToSwap);
        uint256 ethForLiquidity = ethBalance - ethForMarketing - ethForValidator;
        
        _tokensForLiquidity = 0;
        _tokensForMarketing = 0;
        _tokensForValidator = 0;

        payable(_swapFeeReceiver).transfer(ethForMarketing.add(ethForValidator));
                
        if (liquidityTokens > 0 && ethForLiquidity > 0) {
            _addLiquidity(liquidityTokens, ethForLiquidity);
        }
    }

    /**
    * @dev Transfer eth stuck in contract to _swapFeeReceiver
    */
    function withdrawContractETH() external {
        payable(_swapFeeReceiver).transfer(address(this).balance);
    }

    /**
    * @dev In case swap wont do it and sells/buys might be blocked
    */
    function forceSwap() external teamOROwner {
        _swapTokensForEth(balanceOf(address(this)));
    }

    /**
        *
        * @dev Staking part starts here
        *
    */

    /**
    * @dev Checks if holder is staking
    */
    function isStaking(address stakerAddr, uint256 validator) public view returns (bool) {
        return _stakers[stakerAddr][validator].staker == stakerAddr;
    }

    /**
    * @dev Returns how much staker is staking
    */
    function userStaked(address staker, uint256 validator) public view returns (uint256) {
        return _stakers[staker][validator].staked;
    }

    /**
    * @dev Returns how much staker has claimed over time
    */
    function userClaimHistory(address staker) public view returns (ClaimHistory memory) {
        return _claimHistory[staker];
    }

    /**
    * @dev Returns how much staker has earned
    */
    function userEarned(address staker, uint256 validator) public view returns (uint256) {
        uint256 currentlyEarned = _userEarned(staker, validator);
        uint256 previouslyEarned = _stakers[msg.sender][validator].earned;

        if (previouslyEarned > 0) return currentlyEarned.add(previouslyEarned);
        return currentlyEarned;
    }

    function _userEarned(address staker, uint256 validator) private view returns (uint256) {
        require(isStaking(staker, validator), "User is not staking.");

        uint256 staked = userStaked(staker, validator);
        uint256 stakersStartInSeconds = _stakers[staker][validator].start.div(1 seconds);
        uint256 blockTimestampInSeconds = block.timestamp.div(1 seconds);
        uint256 secondsStaked = blockTimestampInSeconds.sub(stakersStartInSeconds);

        uint256 earn = staked.mul(apr).div(100);
        uint256 rewardPerSec = earn.div(365).div(24).div(60).div(60);
        uint256 earned = rewardPerSec.mul(secondsStaked);

        return earned;
    }
 
    /**
    * @dev Stake tokens in validator
    */
    function stake(uint256 stakeAmount, uint256 validator) external isStakingEnabled {
        require(totalSupply() <= maxSupply, "There are no more rewards left to be claimed.");

        // Check user is registered as staker
        if (isStaking(msg.sender, validator)) {
            _stakers[msg.sender][validator].staked += stakeAmount;
            _stakers[msg.sender][validator].earned += _userEarned(msg.sender, validator);
            _stakers[msg.sender][validator].start = block.timestamp;
        } else {
            _stakers[msg.sender][validator] = Staker(msg.sender, block.timestamp, stakeAmount, 0);
        }

        validators[validator].staked += stakeAmount;
        totalStaked += stakeAmount;
        _burn(msg.sender, stakeAmount);
    }
    
    /**
    * @dev Claim earned tokens from stake in validator
    */
    function claim(uint256 validator) external isStakingEnabled {
        require(isStaking(msg.sender, validator), "You are not staking!?");
        require(totalSupply() <= maxSupply, "There are no more rewards left to be claimed.");

        uint256 reward = userEarned(msg.sender, validator);

        _claimHistory[msg.sender].dates.push(block.timestamp);
        _claimHistory[msg.sender].amounts.push(reward);
        totalClaimed += reward;

        _mint(msg.sender, reward);

        _stakers[msg.sender][validator].start = block.timestamp;
        _stakers[msg.sender][validator].earned = 0;
    }

    /**
    * @dev Claim earned and staked tokens from validator
    */
    function unstake(uint256 validator) external {
        require(isStaking(msg.sender, validator), "You are not staking!?");

        uint256 reward = userEarned(msg.sender, validator);

        if (totalSupply().add(reward) < maxSupply && stakingEnabled) {
            _claimHistory[msg.sender].dates.push(block.timestamp);
            _claimHistory[msg.sender].amounts.push(reward);
            totalClaimed += reward;

            _mint(msg.sender, _stakers[msg.sender][validator].staked.add(reward));
        } else {
            _mint(msg.sender, _stakers[msg.sender][validator].staked);
        }

        validators[validator].staked -= _stakers[msg.sender][validator].staked;
        totalStaked -= _stakers[msg.sender][validator].staked;

        delete _stakers[msg.sender][validator];
    }

    /**
    * @dev Creates validator 
    */
    function createValidator() external teamOROwner {
        Validator memory validator = Validator(block.timestamp, 0);
        validators.push(validator);
    }

    /**
    * @dev Returns amount of validators
    */
    function amountOfValidators() public view returns (uint256) {
        return validators.length;
    }

    /**
    * @dev Enables/disables staking
    */
    function setStakingState(bool onoff) external teamOROwner {
        stakingEnabled = onoff;
    }

    receive() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"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"},{"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":[],"name":"amountOfValidators","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":[],"name":"apr","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"validator","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"createValidator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forceSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"stakerAddr","type":"address"},{"internalType":"uint256","name":"validator","type":"uint256"}],"name":"isStaking","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"onoff","type":"bool"}],"name":"setStakingState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"stakeAmount","type":"uint256"},{"internalType":"uint256","name":"validator","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapTokensThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStaked","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":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"validator","type":"uint256"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"updateFeeReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketingFee","type":"uint256"},{"internalType":"uint256","name":"liquidityFee","type":"uint256"},{"internalType":"uint256","name":"validatorFee","type":"uint256"}],"name":"updateFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newThreshold","type":"uint256"}],"name":"updateSwapTokensThreshold","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"userClaimHistory","outputs":[{"components":[{"internalType":"uint256[]","name":"dates","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"internalType":"struct SERENITYDAO.ClaimHistory","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"uint256","name":"validator","type":"uint256"}],"name":"userEarned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"uint256","name":"validator","type":"uint256"}],"name":"userStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"validators","outputs":[{"internalType":"uint256","name":"creationTime","type":"uint256"},{"internalType":"uint256","name":"staked","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawContractETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526001600d60006101000a81548160ff0219169083151502179055506000601960006101000a81548160ff0219169083151502179055506040518060400160405280600c81526020017f534552454e4954592044414f00000000000000000000000000000000000000008152506040518060400160405280600881526020017f534552454e4954590000000000000000000000000000000000000000000000008152508160039081620000b7919062000b75565b508060049081620000c9919062000b75565b505050620000ec620000e06200051760201b60201c565b6200051f60201b60201c565b6000737a250d5630b4cf539739df2c5dacb4c659f2488d90506001601c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600290506000806004905060006c064f964e68233a76f52000000090506c0c9f2c9cd04674edea400000006006819055506103e860c882620001e3919062000c8b565b620001ef919062000d05565b600a81905550606460288262000206919062000c8b565b62000212919062000d05565b600b819055506103e86001826200022a919062000c8b565b62000236919062000d05565b600c8190555083600f819055508260108190555081601181905550601154601054600f5462000266919062000d3d565b62000272919062000d3d565b600e8190555062000288620005e560201b60201c565b600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620002ea620002dc620005e560201b60201c565b60016200060f60201b60201c565b620002fd3060016200060f60201b60201c565b6200031261dead60016200060f60201b60201c565b6001601c600062000328620005e560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601c60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601c600061dead73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555030601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555030601760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506032601881905550620004ed30620004e16c02254cb4422075287210000000846200076160201b62002c371790919060201c565b6200077960201b60201c565b6200050c336c02254cb44220752872100000006200077960201b60201c565b505050505062000efc565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6200061f6200051760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480620006c45750620006866200051760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620006ac620005e560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16145b62000706576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006fd9062000dff565b60405180910390fd5b80601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6000818362000771919062000e21565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620007eb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007e29062000eac565b60405180910390fd5b620007ff60008383620008f160201b60201c565b806002600082825462000813919062000d3d565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546200086a919062000d3d565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620008d1919062000edf565b60405180910390a3620008ed60008383620008f660201b60201c565b5050565b505050565b505050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200097d57607f821691505b60208210810362000993576200099262000935565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620009fd7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620009be565b62000a098683620009be565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000a5662000a5062000a4a8462000a21565b62000a2b565b62000a21565b9050919050565b6000819050919050565b62000a728362000a35565b62000a8a62000a818262000a5d565b848454620009cb565b825550505050565b600090565b62000aa162000a92565b62000aae81848462000a67565b505050565b5b8181101562000ad65762000aca60008262000a97565b60018101905062000ab4565b5050565b601f82111562000b255762000aef8162000999565b62000afa84620009ae565b8101602085101562000b0a578190505b62000b2262000b1985620009ae565b83018262000ab3565b50505b505050565b600082821c905092915050565b600062000b4a6000198460080262000b2a565b1980831691505092915050565b600062000b65838362000b37565b9150826002028217905092915050565b62000b8082620008fb565b67ffffffffffffffff81111562000b9c5762000b9b62000906565b5b62000ba8825462000964565b62000bb582828562000ada565b600060209050601f83116001811462000bed576000841562000bd8578287015190505b62000be4858262000b57565b86555062000c54565b601f19841662000bfd8662000999565b60005b8281101562000c275784890151825560018201915060208501945060208101905062000c00565b8683101562000c47578489015162000c43601f89168262000b37565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000c988262000a21565b915062000ca58362000a21565b925082820262000cb58162000a21565b9150828204841483151762000ccf5762000cce62000c5c565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600062000d128262000a21565b915062000d1f8362000a21565b92508262000d325762000d3162000cd6565b5b828204905092915050565b600062000d4a8262000a21565b915062000d578362000a21565b925082820190508082111562000d725762000d7162000c5c565b5b92915050565b600082825260208201905092915050565b7f43616c6c6572206973206e6f7420746865205f7377617046656552656365697660008201527f65722061646472657373206e6f72206f776e65722e0000000000000000000000602082015250565b600062000de760358362000d78565b915062000df48262000d89565b604082019050919050565b6000602082019050818103600083015262000e1a8162000dd8565b9050919050565b600062000e2e8262000a21565b915062000e3b8362000a21565b925082820390508181111562000e565762000e5562000c5c565b5b92915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062000e94601f8362000d78565b915062000ea18262000e5c565b602082019050919050565b6000602082019050818103600083015262000ec78162000e85565b9050919050565b62000ed98162000a21565b82525050565b600060208201905062000ef6600083018462000ece565b92915050565b615e158062000f0c6000396000f3fe6080604052600436106102815760003560e01c8063715018a61161014f578063c0246668116100c1578063d5abeb011161007a578063d5abeb01146109be578063dd62ed3e146109e9578063df778d2614610a26578063f2fde38b14610a3d578063f7c618c114610a66578063f8b45b0514610a9157610288565b8063c0246668146108d4578063c69bebe4146108fd578063c8c8ebe414610926578063cef8513914610951578063d125ca181461097c578063d54ad2a11461099357610288565b80638baa63b2116101135780638baa63b21461078a5780638da5cb5b146107c757806395d89b41146107f2578063a39b21531461081d578063a457c2d71461085a578063a9059cbb1461089757610288565b8063715018a6146106dd57806372f702f3146106f4578063751039fc1461071f5780637b0472f014610736578063817b1cd21461075f57610288565b806335aa2e44116101f35780634a62bb65116101ac5780634a62bb65146105a55780634fbee193146105d057806357ded9c91461060d578063590654e9146106385780636ceb23a11461066357806370a08231146106a057610288565b806335aa2e4414610484578063379607f5146104c257806339509351146104eb5780633b51e5cf146105285780633dd5b2da146105515780634093e7d51461056857610288565b80632242908511610245578063224290851461037657806323b872dd1461039f578063245fc1ba146103dc578063293230b8146104195780632e17de7814610430578063313ce5671461045957610288565b806306fdde031461028d578063095ea7b3146102b857806313114a9d146102f557806318160ddd146103205780631cfff51b1461034b57610288565b3661028857005b600080fd5b34801561029957600080fd5b506102a2610abc565b6040516102af9190614743565b60405180910390f35b3480156102c457600080fd5b506102df60048036038101906102da91906147fe565b610b4e565b6040516102ec9190614859565b60405180910390f35b34801561030157600080fd5b5061030a610b71565b6040516103179190614883565b60405180910390f35b34801561032c57600080fd5b50610335610b77565b6040516103429190614883565b60405180910390f35b34801561035757600080fd5b50610360610b81565b60405161036d9190614859565b60405180910390f35b34801561038257600080fd5b5061039d6004803603810190610398919061489e565b610b94565b005b3480156103ab57600080fd5b506103c660048036038101906103c191906148f1565b610c93565b6040516103d39190614859565b60405180910390f35b3480156103e857600080fd5b5061040360048036038101906103fe91906147fe565b610cc2565b6040516104109190614859565b60405180910390f35b34801561042557600080fd5b5061042e610d6e565b005b34801561043c57600080fd5b5061045760048036038101906104529190614944565b61120e565b005b34801561046557600080fd5b5061046e6115ee565b60405161047b919061498d565b60405180910390f35b34801561049057600080fd5b506104ab60048036038101906104a69190614944565b6115f7565b6040516104b99291906149a8565b60405180910390f35b3480156104ce57600080fd5b506104e960048036038101906104e49190614944565b61162b565b005b3480156104f757600080fd5b50610512600480360381019061050d91906147fe565b6118c7565b60405161051f9190614859565b60405180910390f35b34801561053457600080fd5b5061054f600480360381019061054a91906149fd565b611971565b005b34801561055d57600080fd5b50610566611a69565b005b34801561057457600080fd5b5061058f600480360381019061058a91906147fe565b611ad4565b60405161059c9190614883565b60405180910390f35b3480156105b157600080fd5b506105ba611b6c565b6040516105c79190614859565b60405180910390f35b3480156105dc57600080fd5b506105f760048036038101906105f29190614a2a565b611b7f565b6040516106049190614859565b60405180910390f35b34801561061957600080fd5b50610622611bd5565b60405161062f9190614883565b60405180910390f35b34801561064457600080fd5b5061064d611bdb565b60405161065a9190614883565b60405180910390f35b34801561066f57600080fd5b5061068a60048036038101906106859190614a2a565b611be8565b6040516106979190614b59565b60405180910390f35b3480156106ac57600080fd5b506106c760048036038101906106c29190614a2a565b611cf1565b6040516106d49190614883565b60405180910390f35b3480156106e957600080fd5b506106f2611d39565b005b34801561070057600080fd5b50610709611dc1565b6040516107169190614b8a565b60405180910390f35b34801561072b57600080fd5b50610734611de7565b005b34801561074257600080fd5b5061075d60048036038101906107589190614ba5565b611edf565b005b34801561076b57600080fd5b50610774612217565b6040516107819190614883565b60405180910390f35b34801561079657600080fd5b506107b160048036038101906107ac9190614944565b61221d565b6040516107be9190614859565b60405180910390f35b3480156107d357600080fd5b506107dc6123d1565b6040516107e99190614b8a565b60405180910390f35b3480156107fe57600080fd5b506108076123fb565b6040516108149190614743565b60405180910390f35b34801561082957600080fd5b50610844600480360381019061083f91906147fe565b61248d565b6040516108519190614883565b60405180910390f35b34801561086657600080fd5b50610881600480360381019061087c91906147fe565b6124eb565b60405161088e9190614859565b60405180910390f35b3480156108a357600080fd5b506108be60048036038101906108b991906147fe565b6125d5565b6040516108cb9190614859565b60405180910390f35b3480156108e057600080fd5b506108fb60048036038101906108f69190614be5565b6125f8565b005b34801561090957600080fd5b50610924600480360381019061091f9190614a2a565b61272e565b005b34801561093257600080fd5b5061093b61284d565b6040516109489190614883565b60405180910390f35b34801561095d57600080fd5b50610966612853565b6040516109739190614883565b60405180910390f35b34801561098857600080fd5b50610991612859565b005b34801561099f57600080fd5b506109a8612993565b6040516109b59190614883565b60405180910390f35b3480156109ca57600080fd5b506109d3612999565b6040516109e09190614883565b60405180910390f35b3480156109f557600080fd5b50610a106004803603810190610a0b9190614c25565b61299f565b604051610a1d9190614883565b60405180910390f35b348015610a3257600080fd5b50610a3b612a26565b005b348015610a4957600080fd5b50610a646004803603810190610a5f9190614a2a565b612b14565b005b348015610a7257600080fd5b50610a7b612c0b565b604051610a889190614b8a565b60405180910390f35b348015610a9d57600080fd5b50610aa6612c31565b604051610ab39190614883565b60405180910390f35b606060038054610acb90614c94565b80601f0160208091040260200160405190810160405280929190818152602001828054610af790614c94565b8015610b445780601f10610b1957610100808354040283529160200191610b44565b820191906000526020600020905b815481529060010190602001808311610b2757829003601f168201915b5050505050905090565b600080610b59612c4d565b9050610b66818585612c55565b600191505092915050565b600e5481565b6000600254905090565b601960009054906101000a900460ff1681565b610b9c612c4d565b73ffffffffffffffffffffffffffffffffffffffff16610bba6123d1565b73ffffffffffffffffffffffffffffffffffffffff1614610c10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0790614d11565b60405180910390fd5b82600f819055508160108190555080601181905550601154601054600f54610c389190614d60565b610c429190614d60565b600e819055506006600e541115610c8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8590614de0565b60405180910390fd5b505050565b600080610c9e612c4d565b9050610cab858285612e1e565b610cb6858585612eaa565b60019150509392505050565b60008273ffffffffffffffffffffffffffffffffffffffff16601f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b610d76612c4d565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480610e0a5750610dd4612c4d565b73ffffffffffffffffffffffffffffffffffffffff16610df26123d1565b73ffffffffffffffffffffffffffffffffffffffff16145b610e49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4090614e72565b60405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610eb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eda9190614ea7565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f879190614ea7565b6040518363ffffffff1660e01b8152600401610fa4929190614ed4565b6020604051808303816000875af1158015610fc3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe79190614ea7565b600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001601c6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601d6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061115030600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661114b30611cf1565b612c55565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719473061119930611cf1565b6000806111a46123d1565b426040518863ffffffff1660e01b81526004016111c696959493929190614f42565b60606040518083038185885af11580156111e4573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906112099190614fb8565b505050565b6112183382610cc2565b611257576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124e90615057565b60405180910390fd5b60006112633383611ad4565b905060065461128282611274610b77565b61390a90919063ffffffff16565b10801561129b5750601960009054906101000a900460ff165b156113ff57602060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001429080600181540180825580915050600190039060005260206000200160009091909190915055602060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181908060018154018082558091505060019003906000526020600020016000909190919091505580601a60008282546113849190614d60565b925050819055506113fa336113f583601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000206002015461390a90919063ffffffff16565b613920565b61145d565b61145c33601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002060020154613920565b5b601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060020154602183815481106114c5576114c4615077565b5b906000526020600020906002020160010160008282546114e591906150a6565b92505081905550601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020600201546015600082825461155191906150a6565b92505081905550601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560018201600090556002820160009055600382016000905550505050565b60006012905090565b6021818154811061160757600080fd5b90600052602060002090600202016000915090508060000154908060010154905082565b601960009054906101000a900460ff1661167a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167190615126565b60405180910390fd5b6116843382610cc2565b6116c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ba90615057565b60405180910390fd5b6006546116ce610b77565b111561170f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611706906151b8565b60405180910390fd5b600061171b3383611ad4565b9050602060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001429080600181540180825580915050600190039060005260206000200160009091909190915055602060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181908060018154018082558091505060019003906000526020600020016000909190919091505580601a60008282546118019190614d60565b925050819055506118123382613920565b42601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020600101819055506000601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020600301819055505050565b6000806118d2612c4d565b9050611966818585600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546119619190614d60565b612c55565b600191505092915050565b611979612c4d565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480611a0d57506119d7612c4d565b73ffffffffffffffffffffffffffffffffffffffff166119f56123d1565b73ffffffffffffffffffffffffffffffffffffffff16145b611a4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4390614e72565b60405180910390fd5b80601960006101000a81548160ff02191690831515021790555050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611ad1573d6000803e3d6000fd5b50565b600080611ae18484613a7f565b90506000601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008581526020019081526020016000206003015490506000811115611b6057611b57818361390a90919063ffffffff16565b92505050611b66565b81925050505b92915050565b600d60009054906101000a900460ff1681565b6000601b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60185481565b6000602180549050905090565b611bf0614699565b602060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180604001604052908160008201805480602002602001604051908101604052809291908181526020018280548015611c8957602002820191906000526020600020905b815481526020019060010190808311611c75575b5050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015611ce157602002820191906000526020600020905b815481526020019060010190808311611ccd575b5050505050815250509050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611d41612c4d565b73ffffffffffffffffffffffffffffffffffffffff16611d5f6123d1565b73ffffffffffffffffffffffffffffffffffffffff1614611db5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dac90614d11565b60405180910390fd5b611dbf6000613c17565b565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611def612c4d565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480611e835750611e4d612c4d565b73ffffffffffffffffffffffffffffffffffffffff16611e6b6123d1565b73ffffffffffffffffffffffffffffffffffffffff16145b611ec2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb990614e72565b60405180910390fd5b6000600d60006101000a81548160ff021916908315150217905550565b601960009054906101000a900460ff16611f2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2590615126565b60405180910390fd5b600654611f39610b77565b1115611f7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f71906151b8565b60405180910390fd5b611f843382610cc2565b156120c35781601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206002016000828254611fec9190614d60565b92505081905550611ffd3382613a7f565b601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020600301600082825461205f9190614d60565b9250508190555042601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020600101819055506121b4565b60405180608001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020014281526020018381526020016000815250601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301559050505b81602182815481106121c9576121c8615077565b5b906000526020600020906002020160010160008282546121e99190614d60565b9250508190555081601560008282546122029190614d60565b925050819055506122133383613cdd565b5050565b60155481565b6000612227612c4d565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806122bb5750612285612c4d565b73ffffffffffffffffffffffffffffffffffffffff166122a36123d1565b73ffffffffffffffffffffffffffffffffffffffff16145b6122fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f190614e72565b60405180910390fd5b620186a06001612308610b77565b61231291906151d8565b61231c9190615249565b82101561235e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612355906152ec565b60405180910390fd5b6103e8600561236b610b77565b61237591906151d8565b61237f9190615249565b8211156123c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b89061537e565b60405180910390fd5b81600c8190555060019050919050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461240a90614c94565b80601f016020809104026020016040519081016040528092919081815260200182805461243690614c94565b80156124835780601f1061245857610100808354040283529160200191612483565b820191906000526020600020905b81548152906001019060200180831161246657829003601f168201915b5050505050905090565b6000601f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060020154905092915050565b6000806124f6612c4d565b90506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050838110156125bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b390615410565b60405180910390fd5b6125c98286868403612c55565b60019250505092915050565b6000806125e0612c4d565b90506125ed818585612eaa565b600191505092915050565b612600612c4d565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480612694575061265e612c4d565b73ffffffffffffffffffffffffffffffffffffffff1661267c6123d1565b73ffffffffffffffffffffffffffffffffffffffff16145b6126d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ca90614e72565b60405180910390fd5b80601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b612736612c4d565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806127ca5750612794612c4d565b73ffffffffffffffffffffffffffffffffffffffff166127b26123d1565b73ffffffffffffffffffffffffffffffffffffffff16145b612809576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280090614e72565b60405180910390fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600a5481565b600c5481565b612861612c4d565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806128f557506128bf612c4d565b73ffffffffffffffffffffffffffffffffffffffff166128dd6123d1565b73ffffffffffffffffffffffffffffffffffffffff16145b612934576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292b90614e72565b60405180910390fd5b600060405180604001604052804281526020016000815250905060218190806001815401808255809150506001900390600052602060002090600202016000909190919091506000820151816000015560208201518160010155505050565b601a5481565b60065481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b612a2e612c4d565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480612ac25750612a8c612c4d565b73ffffffffffffffffffffffffffffffffffffffff16612aaa6123d1565b73ffffffffffffffffffffffffffffffffffffffff16145b612b01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af890614e72565b60405180910390fd5b612b12612b0d30611cf1565b613eb3565b565b612b1c612c4d565b73ffffffffffffffffffffffffffffffffffffffff16612b3a6123d1565b73ffffffffffffffffffffffffffffffffffffffff1614612b90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8790614d11565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612bff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf6906154a2565b60405180910390fd5b612c0881613c17565b50565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b5481565b60008183612c4591906150a6565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612cc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cbb90615534565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612d33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2a906155c6565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612e119190614883565b60405180910390a3505050565b6000612e2a848461299f565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114612ea45781811015612e96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e8d90615632565b60405180910390fd5b612ea38484848403612c55565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612f19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f10906156c4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612f88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f7f90615756565b60405180910390fd5b60008103612fa157612f9c838360006140f6565b613905565b600d60009054906101000a900460ff161561352457612fbe6123d1565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561302c5750612ffc6123d1565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015613066575061dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561307f5750600860149054906101000a900460ff16155b156135235761308c6123d1565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156131155750600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561316f5750600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b1561323a5743601e60003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054106131f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131ec9061580e565b60405180910390fd5b43601e60003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b601d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156132dd5750601c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561338457600a54811115613327576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161331e906158c6565b60405180910390fd5b600b5461333383611cf1565b8261333e9190614d60565b111561337f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161337690615932565b60405180910390fd5b613522565b601d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156134275750601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561347657600a54811115613471576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613468906159ea565b60405180910390fd5b613521565b601c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661352057600b546134d383611cf1565b826134de9190614d60565b111561351f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161351690615932565b60405180910390fd5b5b5b5b5b5b600061352f30611cf1565b90506000600c5482101590508080156135555750600860149054906101000a900460ff16155b80156135ab5750601d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156136015750601b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156136575750601b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561369b576001600860146101000a81548160ff02191690831515021790555061367f614375565b6000600860146101000a81548160ff0219169083151502179055505b6000600860149054906101000a900460ff16159050601b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806137515750601b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b806137fc5750601d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156137fb5750601d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b5b1561380657600090505b600081156138f5576138366064613828600e548861456390919063ffffffff16565b61457990919063ffffffff16565b9050600e546010548261384991906151d8565b6138539190615249565b601360008282546138649190614d60565b92505081905550600e546011548261387c91906151d8565b6138869190615249565b601460008282546138979190614d60565b92505081905550600e54600f54826138af91906151d8565b6138b99190615249565b601260008282546138ca9190614d60565b9250508190555060008111156138e6576138e58730836140f6565b5b80856138f291906150a6565b94505b6139008787876140f6565b505050505b505050565b600081836139189190614d60565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361398f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161398690615a56565b60405180910390fd5b61399b6000838361458f565b80600260008282546139ad9190614d60565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613a029190614d60565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051613a679190614883565b60405180910390a3613a7b60008383614594565b5050565b6000613a8b8383610cc2565b613aca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ac190615ac2565b60405180910390fd5b6000613ad6848461248d565b90506000613b416001601f60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000206001015461457990919063ffffffff16565b90506000613b5960014261457990919063ffffffff16565b90506000613b708383612c3790919063ffffffff16565b90506000613b9c6064613b8e6018548861456390919063ffffffff16565b61457990919063ffffffff16565b90506000613bee603c613be0603c613bd26018613bc461016d8961457990919063ffffffff16565b61457990919063ffffffff16565b61457990919063ffffffff16565b61457990919063ffffffff16565b90506000613c05848361456390919063ffffffff16565b90508097505050505050505092915050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613d4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d4390615b54565b60405180910390fd5b613d588260008361458f565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015613dde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613dd590615be6565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160026000828254613e3591906150a6565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051613e9a9190614883565b60405180910390a3613eae83600084614594565b505050565b6000600267ffffffffffffffff811115613ed057613ecf615c06565b5b604051908082528060200260200182016040528015613efe5781602001602082028036833780820191505090505b5090503081600081518110613f1657613f15615077565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613fbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fe19190614ea7565b81600181518110613ff557613ff4615077565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061405c30600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684612c55565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b81526004016140c0959493929190615cf3565b600060405180830381600087803b1580156140da57600080fd5b505af11580156140ee573d6000803e3d6000fd5b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603614165576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161415c906156c4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036141d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016141cb90615756565b60405180910390fd5b6141df83838361458f565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015614265576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161425c90615dbf565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546142f89190614d60565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161435c9190614883565b60405180910390a361436f848484614594565b50505050565b600061438030611cf1565b905060006014546012546013546143979190614d60565b6143a19190614d60565b905060008214806143b25750600081145b156143be575050614561565b600c548211156143ce57600c5491505b6000600282601354856143e191906151d8565b6143eb9190615249565b6143f59190615249565b9050600061440c8285612c3790919063ffffffff16565b9050600047905061441c82613eb3565b60006144318247612c3790919063ffffffff16565b9050600061445c8661444e6012548561456390919063ffffffff16565b61457990919063ffffffff16565b90506000614487876144796014548661456390919063ffffffff16565b61457990919063ffffffff16565b9050600081838561449891906150a6565b6144a291906150a6565b9050600060138190555060006012819055506000601481905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc61450b848661390a90919063ffffffff16565b9081150290604051600060405180830381858888f19350505050158015614536573d6000803e3d6000fd5b506000871180156145475750600081115b15614557576145568782614599565b5b5050505050505050505b565b6000818361457191906151d8565b905092915050565b600081836145879190615249565b905092915050565b505050565b505050565b6145c630600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684612c55565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518863ffffffff1660e01b815260040161464f96959493929190614f42565b60606040518083038185885af115801561466d573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906146929190614fb8565b5050505050565b604051806040016040528060608152602001606081525090565b600081519050919050565b600082825260208201905092915050565b60005b838110156146ed5780820151818401526020810190506146d2565b60008484015250505050565b6000601f19601f8301169050919050565b6000614715826146b3565b61471f81856146be565b935061472f8185602086016146cf565b614738816146f9565b840191505092915050565b6000602082019050818103600083015261475d818461470a565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006147958261476a565b9050919050565b6147a58161478a565b81146147b057600080fd5b50565b6000813590506147c28161479c565b92915050565b6000819050919050565b6147db816147c8565b81146147e657600080fd5b50565b6000813590506147f8816147d2565b92915050565b6000806040838503121561481557614814614765565b5b6000614823858286016147b3565b9250506020614834858286016147e9565b9150509250929050565b60008115159050919050565b6148538161483e565b82525050565b600060208201905061486e600083018461484a565b92915050565b61487d816147c8565b82525050565b60006020820190506148986000830184614874565b92915050565b6000806000606084860312156148b7576148b6614765565b5b60006148c5868287016147e9565b93505060206148d6868287016147e9565b92505060406148e7868287016147e9565b9150509250925092565b60008060006060848603121561490a57614909614765565b5b6000614918868287016147b3565b9350506020614929868287016147b3565b925050604061493a868287016147e9565b9150509250925092565b60006020828403121561495a57614959614765565b5b6000614968848285016147e9565b91505092915050565b600060ff82169050919050565b61498781614971565b82525050565b60006020820190506149a2600083018461497e565b92915050565b60006040820190506149bd6000830185614874565b6149ca6020830184614874565b9392505050565b6149da8161483e565b81146149e557600080fd5b50565b6000813590506149f7816149d1565b92915050565b600060208284031215614a1357614a12614765565b5b6000614a21848285016149e8565b91505092915050565b600060208284031215614a4057614a3f614765565b5b6000614a4e848285016147b3565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614a8c816147c8565b82525050565b6000614a9e8383614a83565b60208301905092915050565b6000602082019050919050565b6000614ac282614a57565b614acc8185614a62565b9350614ad783614a73565b8060005b83811015614b08578151614aef8882614a92565b9750614afa83614aaa565b925050600181019050614adb565b5085935050505092915050565b60006040830160008301518482036000860152614b328282614ab7565b91505060208301518482036020860152614b4c8282614ab7565b9150508091505092915050565b60006020820190508181036000830152614b738184614b15565b905092915050565b614b848161478a565b82525050565b6000602082019050614b9f6000830184614b7b565b92915050565b60008060408385031215614bbc57614bbb614765565b5b6000614bca858286016147e9565b9250506020614bdb858286016147e9565b9150509250929050565b60008060408385031215614bfc57614bfb614765565b5b6000614c0a858286016147b3565b9250506020614c1b858286016149e8565b9150509250929050565b60008060408385031215614c3c57614c3b614765565b5b6000614c4a858286016147b3565b9250506020614c5b858286016147b3565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614cac57607f821691505b602082108103614cbf57614cbe614c65565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614cfb6020836146be565b9150614d0682614cc5565b602082019050919050565b60006020820190508181036000830152614d2a81614cee565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614d6b826147c8565b9150614d76836147c8565b9250828201905080821115614d8e57614d8d614d31565b5b92915050565b7f4d757374206b6565702066656573206174203625206f72206c65737300000000600082015250565b6000614dca601c836146be565b9150614dd582614d94565b602082019050919050565b60006020820190508181036000830152614df981614dbd565b9050919050565b7f43616c6c6572206973206e6f7420746865205f7377617046656552656365697660008201527f65722061646472657373206e6f72206f776e65722e0000000000000000000000602082015250565b6000614e5c6035836146be565b9150614e6782614e00565b604082019050919050565b60006020820190508181036000830152614e8b81614e4f565b9050919050565b600081519050614ea18161479c565b92915050565b600060208284031215614ebd57614ebc614765565b5b6000614ecb84828501614e92565b91505092915050565b6000604082019050614ee96000830185614b7b565b614ef66020830184614b7b565b9392505050565b6000819050919050565b6000819050919050565b6000614f2c614f27614f2284614efd565b614f07565b6147c8565b9050919050565b614f3c81614f11565b82525050565b600060c082019050614f576000830189614b7b565b614f646020830188614874565b614f716040830187614f33565b614f7e6060830186614f33565b614f8b6080830185614b7b565b614f9860a0830184614874565b979650505050505050565b600081519050614fb2816147d2565b92915050565b600080600060608486031215614fd157614fd0614765565b5b6000614fdf86828701614fa3565b9350506020614ff086828701614fa3565b925050604061500186828701614fa3565b9150509250925092565b7f596f7520617265206e6f74207374616b696e67213f0000000000000000000000600082015250565b60006150416015836146be565b915061504c8261500b565b602082019050919050565b6000602082019050818103600083015261507081615034565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006150b1826147c8565b91506150bc836147c8565b92508282039050818111156150d4576150d3614d31565b5b92915050565b7f5374616b696e67206973206e6f7420656e61626c65642e000000000000000000600082015250565b60006151106017836146be565b915061511b826150da565b602082019050919050565b6000602082019050818103600083015261513f81615103565b9050919050565b7f546865726520617265206e6f206d6f72652072657761726473206c656674207460008201527f6f20626520636c61696d65642e00000000000000000000000000000000000000602082015250565b60006151a2602d836146be565b91506151ad82615146565b604082019050919050565b600060208201905081810360008301526151d181615195565b9050919050565b60006151e3826147c8565b91506151ee836147c8565b92508282026151fc816147c8565b9150828204841483151761521357615212614d31565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000615254826147c8565b915061525f836147c8565b92508261526f5761526e61521a565b5b828204905092915050565b7f53776170207468726573686f6c642063616e6e6f74206265206c6f776572207460008201527f68616e20302e3030312520746f74616c20737570706c792e0000000000000000602082015250565b60006152d66038836146be565b91506152e18261527a565b604082019050919050565b60006020820190508181036000830152615305816152c9565b9050919050565b7f53776170207468726573686f6c642063616e6e6f74206265206869676865722060008201527f7468616e20302e352520746f74616c20737570706c792e000000000000000000602082015250565b60006153686037836146be565b91506153738261530c565b604082019050919050565b600060208201905081810360008301526153978161535b565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006153fa6025836146be565b91506154058261539e565b604082019050919050565b60006020820190508181036000830152615429816153ed565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061548c6026836146be565b915061549782615430565b604082019050919050565b600060208201905081810360008301526154bb8161547f565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061551e6024836146be565b9150615529826154c2565b604082019050919050565b6000602082019050818103600083015261554d81615511565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006155b06022836146be565b91506155bb82615554565b604082019050919050565b600060208201905081810360008301526155df816155a3565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b600061561c601d836146be565b9150615627826155e6565b602082019050919050565b6000602082019050818103600083015261564b8161560f565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006156ae6025836146be565b91506156b982615652565b604082019050919050565b600060208201905081810360008301526156dd816156a1565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006157406023836146be565b915061574b826156e4565b604082019050919050565b6000602082019050818103600083015261576f81615733565b9050919050565b7f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60008201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b60208201527f20616c6c6f7765642e0000000000000000000000000000000000000000000000604082015250565b60006157f86049836146be565b915061580382615776565b606082019050919050565b60006020820190508181036000830152615827816157eb565b9050919050565b7f5f7472616e736665723a3a20427579207472616e7366657220616d6f756e742060008201527f6578636565647320746865206d61785472616e73616374696f6e416d6f756e7460208201527f2e00000000000000000000000000000000000000000000000000000000000000604082015250565b60006158b06041836146be565b91506158bb8261582e565b606082019050919050565b600060208201905081810360008301526158df816158a3565b9050919050565b7f5f7472616e736665723a3a204d61782077616c6c657420657863656564656400600082015250565b600061591c601f836146be565b9150615927826158e6565b602082019050919050565b6000602082019050818103600083015261594b8161590f565b9050919050565b7f5f7472616e736665723a3a2053656c6c207472616e7366657220616d6f756e7460008201527f206578636565647320746865206d61785472616e73616374696f6e416d6f756e60208201527f742e000000000000000000000000000000000000000000000000000000000000604082015250565b60006159d46042836146be565b91506159df82615952565b606082019050919050565b60006020820190508181036000830152615a03816159c7565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000615a40601f836146be565b9150615a4b82615a0a565b602082019050919050565b60006020820190508181036000830152615a6f81615a33565b9050919050565b7f55736572206973206e6f74207374616b696e672e000000000000000000000000600082015250565b6000615aac6014836146be565b9150615ab782615a76565b602082019050919050565b60006020820190508181036000830152615adb81615a9f565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000615b3e6021836146be565b9150615b4982615ae2565b604082019050919050565b60006020820190508181036000830152615b6d81615b31565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000615bd06022836146be565b9150615bdb82615b74565b604082019050919050565b60006020820190508181036000830152615bff81615bc3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b615c6a8161478a565b82525050565b6000615c7c8383615c61565b60208301905092915050565b6000602082019050919050565b6000615ca082615c35565b615caa8185615c40565b9350615cb583615c51565b8060005b83811015615ce6578151615ccd8882615c70565b9750615cd883615c88565b925050600181019050615cb9565b5085935050505092915050565b600060a082019050615d086000830188614874565b615d156020830187614f33565b8181036040830152615d278186615c95565b9050615d366060830185614b7b565b615d436080830184614874565b9695505050505050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000615da96026836146be565b9150615db482615d4d565b604082019050919050565b60006020820190508181036000830152615dd881615d9c565b905091905056fea2646970667358221220dd0227d0399c8206660b840c5d09b31a3e2cb1bbd7b6c953d25f19329cb9dd2a64736f6c63430008110033

Deployed Bytecode

0x6080604052600436106102815760003560e01c8063715018a61161014f578063c0246668116100c1578063d5abeb011161007a578063d5abeb01146109be578063dd62ed3e146109e9578063df778d2614610a26578063f2fde38b14610a3d578063f7c618c114610a66578063f8b45b0514610a9157610288565b8063c0246668146108d4578063c69bebe4146108fd578063c8c8ebe414610926578063cef8513914610951578063d125ca181461097c578063d54ad2a11461099357610288565b80638baa63b2116101135780638baa63b21461078a5780638da5cb5b146107c757806395d89b41146107f2578063a39b21531461081d578063a457c2d71461085a578063a9059cbb1461089757610288565b8063715018a6146106dd57806372f702f3146106f4578063751039fc1461071f5780637b0472f014610736578063817b1cd21461075f57610288565b806335aa2e44116101f35780634a62bb65116101ac5780634a62bb65146105a55780634fbee193146105d057806357ded9c91461060d578063590654e9146106385780636ceb23a11461066357806370a08231146106a057610288565b806335aa2e4414610484578063379607f5146104c257806339509351146104eb5780633b51e5cf146105285780633dd5b2da146105515780634093e7d51461056857610288565b80632242908511610245578063224290851461037657806323b872dd1461039f578063245fc1ba146103dc578063293230b8146104195780632e17de7814610430578063313ce5671461045957610288565b806306fdde031461028d578063095ea7b3146102b857806313114a9d146102f557806318160ddd146103205780631cfff51b1461034b57610288565b3661028857005b600080fd5b34801561029957600080fd5b506102a2610abc565b6040516102af9190614743565b60405180910390f35b3480156102c457600080fd5b506102df60048036038101906102da91906147fe565b610b4e565b6040516102ec9190614859565b60405180910390f35b34801561030157600080fd5b5061030a610b71565b6040516103179190614883565b60405180910390f35b34801561032c57600080fd5b50610335610b77565b6040516103429190614883565b60405180910390f35b34801561035757600080fd5b50610360610b81565b60405161036d9190614859565b60405180910390f35b34801561038257600080fd5b5061039d6004803603810190610398919061489e565b610b94565b005b3480156103ab57600080fd5b506103c660048036038101906103c191906148f1565b610c93565b6040516103d39190614859565b60405180910390f35b3480156103e857600080fd5b5061040360048036038101906103fe91906147fe565b610cc2565b6040516104109190614859565b60405180910390f35b34801561042557600080fd5b5061042e610d6e565b005b34801561043c57600080fd5b5061045760048036038101906104529190614944565b61120e565b005b34801561046557600080fd5b5061046e6115ee565b60405161047b919061498d565b60405180910390f35b34801561049057600080fd5b506104ab60048036038101906104a69190614944565b6115f7565b6040516104b99291906149a8565b60405180910390f35b3480156104ce57600080fd5b506104e960048036038101906104e49190614944565b61162b565b005b3480156104f757600080fd5b50610512600480360381019061050d91906147fe565b6118c7565b60405161051f9190614859565b60405180910390f35b34801561053457600080fd5b5061054f600480360381019061054a91906149fd565b611971565b005b34801561055d57600080fd5b50610566611a69565b005b34801561057457600080fd5b5061058f600480360381019061058a91906147fe565b611ad4565b60405161059c9190614883565b60405180910390f35b3480156105b157600080fd5b506105ba611b6c565b6040516105c79190614859565b60405180910390f35b3480156105dc57600080fd5b506105f760048036038101906105f29190614a2a565b611b7f565b6040516106049190614859565b60405180910390f35b34801561061957600080fd5b50610622611bd5565b60405161062f9190614883565b60405180910390f35b34801561064457600080fd5b5061064d611bdb565b60405161065a9190614883565b60405180910390f35b34801561066f57600080fd5b5061068a60048036038101906106859190614a2a565b611be8565b6040516106979190614b59565b60405180910390f35b3480156106ac57600080fd5b506106c760048036038101906106c29190614a2a565b611cf1565b6040516106d49190614883565b60405180910390f35b3480156106e957600080fd5b506106f2611d39565b005b34801561070057600080fd5b50610709611dc1565b6040516107169190614b8a565b60405180910390f35b34801561072b57600080fd5b50610734611de7565b005b34801561074257600080fd5b5061075d60048036038101906107589190614ba5565b611edf565b005b34801561076b57600080fd5b50610774612217565b6040516107819190614883565b60405180910390f35b34801561079657600080fd5b506107b160048036038101906107ac9190614944565b61221d565b6040516107be9190614859565b60405180910390f35b3480156107d357600080fd5b506107dc6123d1565b6040516107e99190614b8a565b60405180910390f35b3480156107fe57600080fd5b506108076123fb565b6040516108149190614743565b60405180910390f35b34801561082957600080fd5b50610844600480360381019061083f91906147fe565b61248d565b6040516108519190614883565b60405180910390f35b34801561086657600080fd5b50610881600480360381019061087c91906147fe565b6124eb565b60405161088e9190614859565b60405180910390f35b3480156108a357600080fd5b506108be60048036038101906108b991906147fe565b6125d5565b6040516108cb9190614859565b60405180910390f35b3480156108e057600080fd5b506108fb60048036038101906108f69190614be5565b6125f8565b005b34801561090957600080fd5b50610924600480360381019061091f9190614a2a565b61272e565b005b34801561093257600080fd5b5061093b61284d565b6040516109489190614883565b60405180910390f35b34801561095d57600080fd5b50610966612853565b6040516109739190614883565b60405180910390f35b34801561098857600080fd5b50610991612859565b005b34801561099f57600080fd5b506109a8612993565b6040516109b59190614883565b60405180910390f35b3480156109ca57600080fd5b506109d3612999565b6040516109e09190614883565b60405180910390f35b3480156109f557600080fd5b50610a106004803603810190610a0b9190614c25565b61299f565b604051610a1d9190614883565b60405180910390f35b348015610a3257600080fd5b50610a3b612a26565b005b348015610a4957600080fd5b50610a646004803603810190610a5f9190614a2a565b612b14565b005b348015610a7257600080fd5b50610a7b612c0b565b604051610a889190614b8a565b60405180910390f35b348015610a9d57600080fd5b50610aa6612c31565b604051610ab39190614883565b60405180910390f35b606060038054610acb90614c94565b80601f0160208091040260200160405190810160405280929190818152602001828054610af790614c94565b8015610b445780601f10610b1957610100808354040283529160200191610b44565b820191906000526020600020905b815481529060010190602001808311610b2757829003601f168201915b5050505050905090565b600080610b59612c4d565b9050610b66818585612c55565b600191505092915050565b600e5481565b6000600254905090565b601960009054906101000a900460ff1681565b610b9c612c4d565b73ffffffffffffffffffffffffffffffffffffffff16610bba6123d1565b73ffffffffffffffffffffffffffffffffffffffff1614610c10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0790614d11565b60405180910390fd5b82600f819055508160108190555080601181905550601154601054600f54610c389190614d60565b610c429190614d60565b600e819055506006600e541115610c8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8590614de0565b60405180910390fd5b505050565b600080610c9e612c4d565b9050610cab858285612e1e565b610cb6858585612eaa565b60019150509392505050565b60008273ffffffffffffffffffffffffffffffffffffffff16601f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b610d76612c4d565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480610e0a5750610dd4612c4d565b73ffffffffffffffffffffffffffffffffffffffff16610df26123d1565b73ffffffffffffffffffffffffffffffffffffffff16145b610e49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4090614e72565b60405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610eb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eda9190614ea7565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f879190614ea7565b6040518363ffffffff1660e01b8152600401610fa4929190614ed4565b6020604051808303816000875af1158015610fc3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe79190614ea7565b600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001601c6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601d6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061115030600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661114b30611cf1565b612c55565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719473061119930611cf1565b6000806111a46123d1565b426040518863ffffffff1660e01b81526004016111c696959493929190614f42565b60606040518083038185885af11580156111e4573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906112099190614fb8565b505050565b6112183382610cc2565b611257576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124e90615057565b60405180910390fd5b60006112633383611ad4565b905060065461128282611274610b77565b61390a90919063ffffffff16565b10801561129b5750601960009054906101000a900460ff165b156113ff57602060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001429080600181540180825580915050600190039060005260206000200160009091909190915055602060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181908060018154018082558091505060019003906000526020600020016000909190919091505580601a60008282546113849190614d60565b925050819055506113fa336113f583601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000206002015461390a90919063ffffffff16565b613920565b61145d565b61145c33601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002060020154613920565b5b601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060020154602183815481106114c5576114c4615077565b5b906000526020600020906002020160010160008282546114e591906150a6565b92505081905550601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020600201546015600082825461155191906150a6565b92505081905550601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560018201600090556002820160009055600382016000905550505050565b60006012905090565b6021818154811061160757600080fd5b90600052602060002090600202016000915090508060000154908060010154905082565b601960009054906101000a900460ff1661167a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167190615126565b60405180910390fd5b6116843382610cc2565b6116c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ba90615057565b60405180910390fd5b6006546116ce610b77565b111561170f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611706906151b8565b60405180910390fd5b600061171b3383611ad4565b9050602060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001429080600181540180825580915050600190039060005260206000200160009091909190915055602060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181908060018154018082558091505060019003906000526020600020016000909190919091505580601a60008282546118019190614d60565b925050819055506118123382613920565b42601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020600101819055506000601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020600301819055505050565b6000806118d2612c4d565b9050611966818585600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546119619190614d60565b612c55565b600191505092915050565b611979612c4d565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480611a0d57506119d7612c4d565b73ffffffffffffffffffffffffffffffffffffffff166119f56123d1565b73ffffffffffffffffffffffffffffffffffffffff16145b611a4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4390614e72565b60405180910390fd5b80601960006101000a81548160ff02191690831515021790555050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611ad1573d6000803e3d6000fd5b50565b600080611ae18484613a7f565b90506000601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008581526020019081526020016000206003015490506000811115611b6057611b57818361390a90919063ffffffff16565b92505050611b66565b81925050505b92915050565b600d60009054906101000a900460ff1681565b6000601b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60185481565b6000602180549050905090565b611bf0614699565b602060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180604001604052908160008201805480602002602001604051908101604052809291908181526020018280548015611c8957602002820191906000526020600020905b815481526020019060010190808311611c75575b5050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015611ce157602002820191906000526020600020905b815481526020019060010190808311611ccd575b5050505050815250509050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611d41612c4d565b73ffffffffffffffffffffffffffffffffffffffff16611d5f6123d1565b73ffffffffffffffffffffffffffffffffffffffff1614611db5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dac90614d11565b60405180910390fd5b611dbf6000613c17565b565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611def612c4d565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480611e835750611e4d612c4d565b73ffffffffffffffffffffffffffffffffffffffff16611e6b6123d1565b73ffffffffffffffffffffffffffffffffffffffff16145b611ec2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb990614e72565b60405180910390fd5b6000600d60006101000a81548160ff021916908315150217905550565b601960009054906101000a900460ff16611f2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2590615126565b60405180910390fd5b600654611f39610b77565b1115611f7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f71906151b8565b60405180910390fd5b611f843382610cc2565b156120c35781601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206002016000828254611fec9190614d60565b92505081905550611ffd3382613a7f565b601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020600301600082825461205f9190614d60565b9250508190555042601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020600101819055506121b4565b60405180608001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020014281526020018381526020016000815250601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301559050505b81602182815481106121c9576121c8615077565b5b906000526020600020906002020160010160008282546121e99190614d60565b9250508190555081601560008282546122029190614d60565b925050819055506122133383613cdd565b5050565b60155481565b6000612227612c4d565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806122bb5750612285612c4d565b73ffffffffffffffffffffffffffffffffffffffff166122a36123d1565b73ffffffffffffffffffffffffffffffffffffffff16145b6122fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f190614e72565b60405180910390fd5b620186a06001612308610b77565b61231291906151d8565b61231c9190615249565b82101561235e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612355906152ec565b60405180910390fd5b6103e8600561236b610b77565b61237591906151d8565b61237f9190615249565b8211156123c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b89061537e565b60405180910390fd5b81600c8190555060019050919050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461240a90614c94565b80601f016020809104026020016040519081016040528092919081815260200182805461243690614c94565b80156124835780601f1061245857610100808354040283529160200191612483565b820191906000526020600020905b81548152906001019060200180831161246657829003601f168201915b5050505050905090565b6000601f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060020154905092915050565b6000806124f6612c4d565b90506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050838110156125bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b390615410565b60405180910390fd5b6125c98286868403612c55565b60019250505092915050565b6000806125e0612c4d565b90506125ed818585612eaa565b600191505092915050565b612600612c4d565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480612694575061265e612c4d565b73ffffffffffffffffffffffffffffffffffffffff1661267c6123d1565b73ffffffffffffffffffffffffffffffffffffffff16145b6126d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ca90614e72565b60405180910390fd5b80601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b612736612c4d565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806127ca5750612794612c4d565b73ffffffffffffffffffffffffffffffffffffffff166127b26123d1565b73ffffffffffffffffffffffffffffffffffffffff16145b612809576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280090614e72565b60405180910390fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600a5481565b600c5481565b612861612c4d565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806128f557506128bf612c4d565b73ffffffffffffffffffffffffffffffffffffffff166128dd6123d1565b73ffffffffffffffffffffffffffffffffffffffff16145b612934576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292b90614e72565b60405180910390fd5b600060405180604001604052804281526020016000815250905060218190806001815401808255809150506001900390600052602060002090600202016000909190919091506000820151816000015560208201518160010155505050565b601a5481565b60065481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b612a2e612c4d565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480612ac25750612a8c612c4d565b73ffffffffffffffffffffffffffffffffffffffff16612aaa6123d1565b73ffffffffffffffffffffffffffffffffffffffff16145b612b01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af890614e72565b60405180910390fd5b612b12612b0d30611cf1565b613eb3565b565b612b1c612c4d565b73ffffffffffffffffffffffffffffffffffffffff16612b3a6123d1565b73ffffffffffffffffffffffffffffffffffffffff1614612b90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8790614d11565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612bff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf6906154a2565b60405180910390fd5b612c0881613c17565b50565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b5481565b60008183612c4591906150a6565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612cc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cbb90615534565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612d33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2a906155c6565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612e119190614883565b60405180910390a3505050565b6000612e2a848461299f565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114612ea45781811015612e96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e8d90615632565b60405180910390fd5b612ea38484848403612c55565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612f19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f10906156c4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612f88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f7f90615756565b60405180910390fd5b60008103612fa157612f9c838360006140f6565b613905565b600d60009054906101000a900460ff161561352457612fbe6123d1565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561302c5750612ffc6123d1565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015613066575061dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561307f5750600860149054906101000a900460ff16155b156135235761308c6123d1565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156131155750600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561316f5750600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b1561323a5743601e60003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054106131f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131ec9061580e565b60405180910390fd5b43601e60003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b601d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156132dd5750601c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561338457600a54811115613327576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161331e906158c6565b60405180910390fd5b600b5461333383611cf1565b8261333e9190614d60565b111561337f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161337690615932565b60405180910390fd5b613522565b601d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156134275750601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561347657600a54811115613471576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613468906159ea565b60405180910390fd5b613521565b601c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661352057600b546134d383611cf1565b826134de9190614d60565b111561351f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161351690615932565b60405180910390fd5b5b5b5b5b5b600061352f30611cf1565b90506000600c5482101590508080156135555750600860149054906101000a900460ff16155b80156135ab5750601d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156136015750601b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156136575750601b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561369b576001600860146101000a81548160ff02191690831515021790555061367f614375565b6000600860146101000a81548160ff0219169083151502179055505b6000600860149054906101000a900460ff16159050601b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806137515750601b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b806137fc5750601d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156137fb5750601d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b5b1561380657600090505b600081156138f5576138366064613828600e548861456390919063ffffffff16565b61457990919063ffffffff16565b9050600e546010548261384991906151d8565b6138539190615249565b601360008282546138649190614d60565b92505081905550600e546011548261387c91906151d8565b6138869190615249565b601460008282546138979190614d60565b92505081905550600e54600f54826138af91906151d8565b6138b99190615249565b601260008282546138ca9190614d60565b9250508190555060008111156138e6576138e58730836140f6565b5b80856138f291906150a6565b94505b6139008787876140f6565b505050505b505050565b600081836139189190614d60565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361398f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161398690615a56565b60405180910390fd5b61399b6000838361458f565b80600260008282546139ad9190614d60565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613a029190614d60565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051613a679190614883565b60405180910390a3613a7b60008383614594565b5050565b6000613a8b8383610cc2565b613aca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ac190615ac2565b60405180910390fd5b6000613ad6848461248d565b90506000613b416001601f60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000206001015461457990919063ffffffff16565b90506000613b5960014261457990919063ffffffff16565b90506000613b708383612c3790919063ffffffff16565b90506000613b9c6064613b8e6018548861456390919063ffffffff16565b61457990919063ffffffff16565b90506000613bee603c613be0603c613bd26018613bc461016d8961457990919063ffffffff16565b61457990919063ffffffff16565b61457990919063ffffffff16565b61457990919063ffffffff16565b90506000613c05848361456390919063ffffffff16565b90508097505050505050505092915050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613d4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d4390615b54565b60405180910390fd5b613d588260008361458f565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015613dde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613dd590615be6565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160026000828254613e3591906150a6565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051613e9a9190614883565b60405180910390a3613eae83600084614594565b505050565b6000600267ffffffffffffffff811115613ed057613ecf615c06565b5b604051908082528060200260200182016040528015613efe5781602001602082028036833780820191505090505b5090503081600081518110613f1657613f15615077565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613fbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fe19190614ea7565b81600181518110613ff557613ff4615077565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061405c30600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684612c55565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b81526004016140c0959493929190615cf3565b600060405180830381600087803b1580156140da57600080fd5b505af11580156140ee573d6000803e3d6000fd5b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603614165576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161415c906156c4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036141d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016141cb90615756565b60405180910390fd5b6141df83838361458f565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015614265576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161425c90615dbf565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546142f89190614d60565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161435c9190614883565b60405180910390a361436f848484614594565b50505050565b600061438030611cf1565b905060006014546012546013546143979190614d60565b6143a19190614d60565b905060008214806143b25750600081145b156143be575050614561565b600c548211156143ce57600c5491505b6000600282601354856143e191906151d8565b6143eb9190615249565b6143f59190615249565b9050600061440c8285612c3790919063ffffffff16565b9050600047905061441c82613eb3565b60006144318247612c3790919063ffffffff16565b9050600061445c8661444e6012548561456390919063ffffffff16565b61457990919063ffffffff16565b90506000614487876144796014548661456390919063ffffffff16565b61457990919063ffffffff16565b9050600081838561449891906150a6565b6144a291906150a6565b9050600060138190555060006012819055506000601481905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc61450b848661390a90919063ffffffff16565b9081150290604051600060405180830381858888f19350505050158015614536573d6000803e3d6000fd5b506000871180156145475750600081115b15614557576145568782614599565b5b5050505050505050505b565b6000818361457191906151d8565b905092915050565b600081836145879190615249565b905092915050565b505050565b505050565b6145c630600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684612c55565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518863ffffffff1660e01b815260040161464f96959493929190614f42565b60606040518083038185885af115801561466d573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906146929190614fb8565b5050505050565b604051806040016040528060608152602001606081525090565b600081519050919050565b600082825260208201905092915050565b60005b838110156146ed5780820151818401526020810190506146d2565b60008484015250505050565b6000601f19601f8301169050919050565b6000614715826146b3565b61471f81856146be565b935061472f8185602086016146cf565b614738816146f9565b840191505092915050565b6000602082019050818103600083015261475d818461470a565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006147958261476a565b9050919050565b6147a58161478a565b81146147b057600080fd5b50565b6000813590506147c28161479c565b92915050565b6000819050919050565b6147db816147c8565b81146147e657600080fd5b50565b6000813590506147f8816147d2565b92915050565b6000806040838503121561481557614814614765565b5b6000614823858286016147b3565b9250506020614834858286016147e9565b9150509250929050565b60008115159050919050565b6148538161483e565b82525050565b600060208201905061486e600083018461484a565b92915050565b61487d816147c8565b82525050565b60006020820190506148986000830184614874565b92915050565b6000806000606084860312156148b7576148b6614765565b5b60006148c5868287016147e9565b93505060206148d6868287016147e9565b92505060406148e7868287016147e9565b9150509250925092565b60008060006060848603121561490a57614909614765565b5b6000614918868287016147b3565b9350506020614929868287016147b3565b925050604061493a868287016147e9565b9150509250925092565b60006020828403121561495a57614959614765565b5b6000614968848285016147e9565b91505092915050565b600060ff82169050919050565b61498781614971565b82525050565b60006020820190506149a2600083018461497e565b92915050565b60006040820190506149bd6000830185614874565b6149ca6020830184614874565b9392505050565b6149da8161483e565b81146149e557600080fd5b50565b6000813590506149f7816149d1565b92915050565b600060208284031215614a1357614a12614765565b5b6000614a21848285016149e8565b91505092915050565b600060208284031215614a4057614a3f614765565b5b6000614a4e848285016147b3565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614a8c816147c8565b82525050565b6000614a9e8383614a83565b60208301905092915050565b6000602082019050919050565b6000614ac282614a57565b614acc8185614a62565b9350614ad783614a73565b8060005b83811015614b08578151614aef8882614a92565b9750614afa83614aaa565b925050600181019050614adb565b5085935050505092915050565b60006040830160008301518482036000860152614b328282614ab7565b91505060208301518482036020860152614b4c8282614ab7565b9150508091505092915050565b60006020820190508181036000830152614b738184614b15565b905092915050565b614b848161478a565b82525050565b6000602082019050614b9f6000830184614b7b565b92915050565b60008060408385031215614bbc57614bbb614765565b5b6000614bca858286016147e9565b9250506020614bdb858286016147e9565b9150509250929050565b60008060408385031215614bfc57614bfb614765565b5b6000614c0a858286016147b3565b9250506020614c1b858286016149e8565b9150509250929050565b60008060408385031215614c3c57614c3b614765565b5b6000614c4a858286016147b3565b9250506020614c5b858286016147b3565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614cac57607f821691505b602082108103614cbf57614cbe614c65565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614cfb6020836146be565b9150614d0682614cc5565b602082019050919050565b60006020820190508181036000830152614d2a81614cee565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614d6b826147c8565b9150614d76836147c8565b9250828201905080821115614d8e57614d8d614d31565b5b92915050565b7f4d757374206b6565702066656573206174203625206f72206c65737300000000600082015250565b6000614dca601c836146be565b9150614dd582614d94565b602082019050919050565b60006020820190508181036000830152614df981614dbd565b9050919050565b7f43616c6c6572206973206e6f7420746865205f7377617046656552656365697660008201527f65722061646472657373206e6f72206f776e65722e0000000000000000000000602082015250565b6000614e5c6035836146be565b9150614e6782614e00565b604082019050919050565b60006020820190508181036000830152614e8b81614e4f565b9050919050565b600081519050614ea18161479c565b92915050565b600060208284031215614ebd57614ebc614765565b5b6000614ecb84828501614e92565b91505092915050565b6000604082019050614ee96000830185614b7b565b614ef66020830184614b7b565b9392505050565b6000819050919050565b6000819050919050565b6000614f2c614f27614f2284614efd565b614f07565b6147c8565b9050919050565b614f3c81614f11565b82525050565b600060c082019050614f576000830189614b7b565b614f646020830188614874565b614f716040830187614f33565b614f7e6060830186614f33565b614f8b6080830185614b7b565b614f9860a0830184614874565b979650505050505050565b600081519050614fb2816147d2565b92915050565b600080600060608486031215614fd157614fd0614765565b5b6000614fdf86828701614fa3565b9350506020614ff086828701614fa3565b925050604061500186828701614fa3565b9150509250925092565b7f596f7520617265206e6f74207374616b696e67213f0000000000000000000000600082015250565b60006150416015836146be565b915061504c8261500b565b602082019050919050565b6000602082019050818103600083015261507081615034565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006150b1826147c8565b91506150bc836147c8565b92508282039050818111156150d4576150d3614d31565b5b92915050565b7f5374616b696e67206973206e6f7420656e61626c65642e000000000000000000600082015250565b60006151106017836146be565b915061511b826150da565b602082019050919050565b6000602082019050818103600083015261513f81615103565b9050919050565b7f546865726520617265206e6f206d6f72652072657761726473206c656674207460008201527f6f20626520636c61696d65642e00000000000000000000000000000000000000602082015250565b60006151a2602d836146be565b91506151ad82615146565b604082019050919050565b600060208201905081810360008301526151d181615195565b9050919050565b60006151e3826147c8565b91506151ee836147c8565b92508282026151fc816147c8565b9150828204841483151761521357615212614d31565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000615254826147c8565b915061525f836147c8565b92508261526f5761526e61521a565b5b828204905092915050565b7f53776170207468726573686f6c642063616e6e6f74206265206c6f776572207460008201527f68616e20302e3030312520746f74616c20737570706c792e0000000000000000602082015250565b60006152d66038836146be565b91506152e18261527a565b604082019050919050565b60006020820190508181036000830152615305816152c9565b9050919050565b7f53776170207468726573686f6c642063616e6e6f74206265206869676865722060008201527f7468616e20302e352520746f74616c20737570706c792e000000000000000000602082015250565b60006153686037836146be565b91506153738261530c565b604082019050919050565b600060208201905081810360008301526153978161535b565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006153fa6025836146be565b91506154058261539e565b604082019050919050565b60006020820190508181036000830152615429816153ed565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061548c6026836146be565b915061549782615430565b604082019050919050565b600060208201905081810360008301526154bb8161547f565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061551e6024836146be565b9150615529826154c2565b604082019050919050565b6000602082019050818103600083015261554d81615511565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006155b06022836146be565b91506155bb82615554565b604082019050919050565b600060208201905081810360008301526155df816155a3565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b600061561c601d836146be565b9150615627826155e6565b602082019050919050565b6000602082019050818103600083015261564b8161560f565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006156ae6025836146be565b91506156b982615652565b604082019050919050565b600060208201905081810360008301526156dd816156a1565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006157406023836146be565b915061574b826156e4565b604082019050919050565b6000602082019050818103600083015261576f81615733565b9050919050565b7f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60008201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b60208201527f20616c6c6f7765642e0000000000000000000000000000000000000000000000604082015250565b60006157f86049836146be565b915061580382615776565b606082019050919050565b60006020820190508181036000830152615827816157eb565b9050919050565b7f5f7472616e736665723a3a20427579207472616e7366657220616d6f756e742060008201527f6578636565647320746865206d61785472616e73616374696f6e416d6f756e7460208201527f2e00000000000000000000000000000000000000000000000000000000000000604082015250565b60006158b06041836146be565b91506158bb8261582e565b606082019050919050565b600060208201905081810360008301526158df816158a3565b9050919050565b7f5f7472616e736665723a3a204d61782077616c6c657420657863656564656400600082015250565b600061591c601f836146be565b9150615927826158e6565b602082019050919050565b6000602082019050818103600083015261594b8161590f565b9050919050565b7f5f7472616e736665723a3a2053656c6c207472616e7366657220616d6f756e7460008201527f206578636565647320746865206d61785472616e73616374696f6e416d6f756e60208201527f742e000000000000000000000000000000000000000000000000000000000000604082015250565b60006159d46042836146be565b91506159df82615952565b606082019050919050565b60006020820190508181036000830152615a03816159c7565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000615a40601f836146be565b9150615a4b82615a0a565b602082019050919050565b60006020820190508181036000830152615a6f81615a33565b9050919050565b7f55736572206973206e6f74207374616b696e672e000000000000000000000000600082015250565b6000615aac6014836146be565b9150615ab782615a76565b602082019050919050565b60006020820190508181036000830152615adb81615a9f565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000615b3e6021836146be565b9150615b4982615ae2565b604082019050919050565b60006020820190508181036000830152615b6d81615b31565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000615bd06022836146be565b9150615bdb82615b74565b604082019050919050565b60006020820190508181036000830152615bff81615bc3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b615c6a8161478a565b82525050565b6000615c7c8383615c61565b60208301905092915050565b6000602082019050919050565b6000615ca082615c35565b615caa8185615c40565b9350615cb583615c51565b8060005b83811015615ce6578151615ccd8882615c70565b9750615cd883615c88565b925050600181019050615cb9565b5085935050505092915050565b600060a082019050615d086000830188614874565b615d156020830187614f33565b8181036040830152615d278186615c95565b9050615d366060830185614b7b565b615d436080830184614874565b9695505050505050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000615da96026836146be565b9150615db482615d4d565b604082019050919050565b60006020820190508181036000830152615dd881615d9c565b905091905056fea2646970667358221220dd0227d0399c8206660b840c5d09b31a3e2cb1bbd7b6c953d25f19329cb9dd2a64736f6c63430008110033

Deployed Bytecode Sourcemap

18431:17273:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1907:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2839:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18929:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2228:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19354:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23520:368;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3048:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30963:163;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22430:638;;;;;;;;;;;;;:::i;:::-;;34298:818;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2127:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20413:29;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;33597:618;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3351:240;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35565:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30503:116;;;;;;;;;;;;;:::i;:::-;;31629:352;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18887:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24762:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19327:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35400:103;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31426:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2344:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15269:103;;;;;;;;;;;;;:::i;:::-;;19260:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23150:86;;;;;;;;;;;;;:::i;:::-;;32738:774;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19227:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24264:404;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15046:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2015:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31198:145;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3599:438;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2479:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23302:134;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23977:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18761:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18836:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35172:162;;;;;;;;;;;;;:::i;:::-;;19395:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18512:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2680:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30712:104;;;;;;;;;;;;;:::i;:::-;;15380:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19294:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18803:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1907:100;1961:13;1994:5;1987:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1907:100;:::o;2839:201::-;2922:4;2939:13;2955:12;:10;:12::i;:::-;2939:28;;2978:32;2987:5;2994:7;3003:6;2978:8;:32::i;:::-;3028:4;3021:11;;;2839:201;;;;:::o;18929:24::-;;;;:::o;2228:108::-;2289:7;2316:12;;2309:19;;2228:108;:::o;19354:34::-;;;;;;;;;;;;;:::o;23520:368::-;15192:12;:10;:12::i;:::-;15181:23;;:7;:5;:7::i;:::-;:23;;;15173:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;23652:12:::1;23636:13;:28;;;;23691:12;23675:13;:28;;;;23730:12;23714:13;:28;;;;23799:13;;23783;;23767;;:29;;;;:::i;:::-;:45;;;;:::i;:::-;23755:9;:57;;;;23846:1;23833:9;;:14;;23825:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;23520:368:::0;;;:::o;3048:295::-;3179:4;3196:15;3214:12;:10;:12::i;:::-;3196:30;;3237:38;3253:4;3259:7;3268:6;3237:15;:38::i;:::-;3286:27;3296:4;3302:2;3306:6;3286:9;:27::i;:::-;3331:4;3324:11;;;3048:295;;;;;:::o;30963:163::-;31042:4;31108:10;31066:52;;:8;:20;31075:10;31066:20;;;;;;;;;;;;;;;:31;31087:9;31066:31;;;;;;;;;;;:38;;;;;;;;;;;;:52;;;31059:59;;30963:163;;;;:::o;22430:638::-;20608:12;:10;:12::i;:::-;20588:32;;:16;;;;;;;;;;;:32;;;:59;;;;20635:12;:10;:12::i;:::-;20624:23;;:7;:5;:7::i;:::-;:23;;;20588:59;20580:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;22520:15:::1;;;;;;;;;;;:23;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22502:55;;;22566:4;22573:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22502:94;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22486:13;;:110;;;;;;;;;;;;;;;;;;22665:4;22607:31;:55;22647:13;;;;;;;;;;;22607:55;;;;;;;;;;;;;;;;:62;;;;;;;;;;;;;;;;;;22733:4;22680:26;:50;22715:13;;;;;;;;;;;22680:50;;;;;;;;;;;;;;;;:57;;;;;;;;;;;;;;;;;;22750:75;22767:4;22782:15;;;;;;;;;;;22800:24;22818:4;22800:9;:24::i;:::-;22750:8;:75::i;:::-;22836:15;;;;;;;;;;;:31;;;22875:21;22921:4;22941:24;22959:4;22941:9;:24::i;:::-;22980:1;22996::::0;23012:7:::1;:5;:7::i;:::-;23034:15;22836:224;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;22430:638::o:0;34298:818::-;34362:32;34372:10;34384:9;34362;:32::i;:::-;34354:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;34433:14;34450:33;34461:10;34473:9;34450:10;:33::i;:::-;34433:50;;34528:9;;34500:25;34518:6;34500:13;:11;:13::i;:::-;:17;;:25;;;;:::i;:::-;:37;:55;;;;;34541:14;;;;;;;;;;;34500:55;34496:415;;;34572:13;:25;34586:10;34572:25;;;;;;;;;;;;;;;:31;;34609:15;34572:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34640:13;:25;34654:10;34640:25;;;;;;;;;;;;;;;:33;;34679:6;34640:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34717:6;34701:12;;:22;;;;;;;:::i;:::-;;;;;;;;34740:69;34746:10;34758:50;34801:6;34758:8;:20;34767:10;34758:20;;;;;;;;;;;;;;;:31;34779:9;34758:31;;;;;;;;;;;:38;;;:42;;:50;;;;:::i;:::-;34740:5;:69::i;:::-;34496:415;;;34842:57;34848:10;34860:8;:20;34869:10;34860:20;;;;;;;;;;;;;;;:31;34881:9;34860:31;;;;;;;;;;;:38;;;34842:5;:57::i;:::-;34496:415;34955:8;:20;34964:10;34955:20;;;;;;;;;;;;;;;:31;34976:9;34955:31;;;;;;;;;;;:38;;;34923:10;34934:9;34923:21;;;;;;;;:::i;:::-;;;;;;;;;;;;:28;;;:70;;;;;;;:::i;:::-;;;;;;;;35019:8;:20;35028:10;35019:20;;;;;;;;;;;;;;;:31;35040:9;35019:31;;;;;;;;;;;:38;;;35004:11;;:53;;;;;;;:::i;:::-;;;;;;;;35077:8;:20;35086:10;35077:20;;;;;;;;;;;;;;;:31;35098:9;35077:31;;;;;;;;;;;;35070:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34343:773;34298:818;:::o;2127:93::-;2185:5;2210:2;2203:9;;2127:93;:::o;20413:29::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;33597:618::-;20780:14;;;;;;;;;;;20772:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;33676:32:::1;33686:10;33698:9;33676;:32::i;:::-;33668:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;33770:9;;33753:13;:11;:13::i;:::-;:26;;33745:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;33842:14;33859:33;33870:10;33882:9;33859:10;:33::i;:::-;33842:50;;33905:13;:25;33919:10;33905:25;;;;;;;;;;;;;;;:31;;33942:15;33905:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33969:13;:25;33983:10;33969:25;;;;;;;;;;;;;;;:33;;34008:6;33969:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34042:6;34026:12;;:22;;;;;;;:::i;:::-;;;;;;;;34061:25;34067:10;34079:6;34061:5;:25::i;:::-;34139:15;34099:8;:20;34108:10;34099:20;;;;;;;;;;;;;;;:31;34120:9;34099:31;;;;;;;;;;;:37;;:55;;;;34206:1;34165:8;:20;34174:10;34165:20;;;;;;;;;;;;;;;:31;34186:9;34165:31;;;;;;;;;;;:38;;:42;;;;33657:558;33597:618:::0;:::o;3351:240::-;3439:4;3456:13;3472:12;:10;:12::i;:::-;3456:28;;3495:66;3504:5;3511:7;3550:10;3520:11;:18;3532:5;3520:18;;;;;;;;;;;;;;;:27;3539:7;3520:27;;;;;;;;;;;;;;;;:40;;;;:::i;:::-;3495:8;:66::i;:::-;3579:4;3572:11;;;3351:240;;;;:::o;35565:99::-;20608:12;:10;:12::i;:::-;20588:32;;:16;;;;;;;;;;;:32;;;:59;;;;20635:12;:10;:12::i;:::-;20624:23;;:7;:5;:7::i;:::-;:23;;;20588:59;20580:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;35651:5:::1;35634:14;;:22;;;;;;;;;;;;;;;;;;35565:99:::0;:::o;30503:116::-;30562:16;;;;;;;;;;;30554:34;;:57;30589:21;30554:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30503:116::o;31629:352::-;31705:7;31725:23;31751:30;31763:6;31771:9;31751:11;:30::i;:::-;31725:56;;31792:24;31819:8;:20;31828:10;31819:20;;;;;;;;;;;;;;;:31;31840:9;31819:31;;;;;;;;;;;:38;;;31792:65;;31893:1;31874:16;:20;31870:70;;;31903:37;31923:16;31903:15;:19;;:37;;;;:::i;:::-;31896:44;;;;;;31870:70;31958:15;31951:22;;;;31629:352;;;;;:::o;18887:33::-;;;;;;;;;;;;;:::o;24762:127::-;24829:4;24853:19;:28;24873:7;24853:28;;;;;;;;;;;;;;;;;;;;;;;;;24846:35;;24762:127;;;:::o;19327:18::-;;;;:::o;35400:103::-;35451:7;35478:10;:17;;;;35471:24;;35400:103;:::o;31426:131::-;31489:19;;:::i;:::-;31528:13;:21;31542:6;31528:21;;;;;;;;;;;;;;;31521:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31426:131;;;:::o;2344:127::-;2418:7;2445:9;:18;2455:7;2445:18;;;;;;;;;;;;;;;;2438:25;;2344:127;;;:::o;15269:103::-;15192:12;:10;:12::i;:::-;15181:23;;:7;:5;:7::i;:::-;:23;;;15173:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15334:30:::1;15361:1;15334:18;:30::i;:::-;15269:103::o:0;19260:27::-;;;;;;;;;;;;;:::o;23150:86::-;20608:12;:10;:12::i;:::-;20588:32;;:16;;;;;;;;;;;:32;;;:59;;;;20635:12;:10;:12::i;:::-;20624:23;;:7;:5;:7::i;:::-;:23;;;20588:59;20580:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;23223:5:::1;23206:14;;:22;;;;;;;;;;;;;;;;;;23150:86::o:0;32738:774::-;20780:14;;;;;;;;;;;20772:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;32855:9:::1;;32838:13;:11;:13::i;:::-;:26;;32830:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;32978:32;32988:10;33000:9;32978;:32::i;:::-;32974:397;;;33069:11;33027:8;:20;33036:10;33027:20;;;;;;;;;;;;;;;:31;33048:9;33027:31;;;;;;;;;;;:38;;;:53;;;;;;;:::i;:::-;;;;;;;;33137:34;33149:10;33161:9;33137:11;:34::i;:::-;33095:8;:20;33104:10;33095:20;;;;;;;;;;;;;;;:31;33116:9;33095:31;;;;;;;;;;;:38;;;:76;;;;;;;:::i;:::-;;;;;;;;33226:15;33186:8;:20;33195:10;33186:20;;;;;;;;;;;;;;;:31;33207:9;33186:31;;;;;;;;;;;:37;;:55;;;;32974:397;;;33308:51;;;;;;;;33315:10;33308:51;;;;;;33327:15;33308:51;;;;33344:11;33308:51;;;;33357:1;33308:51;;::::0;33274:8:::1;:20;33283:10;33274:20;;;;;;;;;;;;;;;:31;33295:9;33274:31;;;;;;;;;;;:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32974:397;33415:11;33383:10;33394:9;33383:21;;;;;;;;:::i;:::-;;;;;;;;;;;;:28;;;:43;;;;;;;:::i;:::-;;;;;;;;33452:11;33437;;:26;;;;;;;:::i;:::-;;;;;;;;33474:30;33480:10;33492:11;33474:5;:30::i;:::-;32738:774:::0;;:::o;19227:26::-;;;;:::o;24264:404::-;24351:4;20608:12;:10;:12::i;:::-;20588:32;;:16;;;;;;;;;;;:32;;;:59;;;;20635:12;:10;:12::i;:::-;20624:23;;:7;:5;:7::i;:::-;:23;;;20588:59;20580:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;24411:6:::1;24407:1;24391:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:26;;;;:::i;:::-;24375:12;:42;;24367:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;24532:4;24528:1;24512:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:24;;;;:::i;:::-;24496:12;:40;;24488:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;24628:12;24606:19;:34;;;;24657:4;24650:11;;24264:404:::0;;;:::o;15046:87::-;15092:7;15119:6;;;;;;;;;;;15112:13;;15046:87;:::o;2015:104::-;2071:13;2104:7;2097:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2015:104;:::o;31198:145::-;31274:7;31301:8;:16;31310:6;31301:16;;;;;;;;;;;;;;;:27;31318:9;31301:27;;;;;;;;;;;:34;;;31294:41;;31198:145;;;;:::o;3599:438::-;3692:4;3709:13;3725:12;:10;:12::i;:::-;3709:28;;3748:24;3775:11;:18;3787:5;3775:18;;;;;;;;;;;;;;;:27;3794:7;3775:27;;;;;;;;;;;;;;;;3748:54;;3841:15;3821:16;:35;;3813:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;3934:60;3943:5;3950:7;3978:15;3959:16;:34;3934:8;:60::i;:::-;4025:4;4018:11;;;;3599:438;;;;:::o;2479:193::-;2558:4;2575:13;2591:12;:10;:12::i;:::-;2575:28;;2614;2624:5;2631:2;2635:6;2614:9;:28::i;:::-;2660:4;2653:11;;;2479:193;;;;:::o;23302:134::-;20608:12;:10;:12::i;:::-;20588:32;;:16;;;;;;;;;;;:32;;;:59;;;;20635:12;:10;:12::i;:::-;20624:23;;:7;:5;:7::i;:::-;:23;;;20588:59;20580:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;23420:8:::1;23389:19;:28;23409:7;23389:28;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;23302:134:::0;;:::o;23977:114::-;20608:12;:10;:12::i;:::-;20588:32;;:16;;;;;;;;;;;:32;;;:59;;;;20635:12;:10;:12::i;:::-;20624:23;;:7;:5;:7::i;:::-;:23;;;20588:59;20580:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;24074:9:::1;24055:16;;:28;;;;;;;;;;;;;;;;;;23977:114:::0;:::o;18761:35::-;;;;:::o;18836:34::-;;;;:::o;35172:162::-;20608:12;:10;:12::i;:::-;20588:32;;:16;;;;;;;;;;;:32;;;:59;;;;20635:12;:10;:12::i;:::-;20624:23;;:7;:5;:7::i;:::-;:23;;;20588:59;20580:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;35231:26:::1;35260:29;;;;;;;;35270:15;35260:29;;;;35287:1;35260:29;;::::0;35231:58:::1;;35300:10;35316:9;35300:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35220:114;35172:162::o:0;19395:27::-;;;;:::o;18512:24::-;;;;:::o;2680:151::-;2769:7;2796:11;:18;2808:5;2796:18;;;;;;;;;;;;;;;:27;2815:7;2796:27;;;;;;;;;;;;;;;;2789:34;;2680:151;;;;:::o;30712:104::-;20608:12;:10;:12::i;:::-;20588:32;;:16;;;;;;;;;;;:32;;;:59;;;;20635:12;:10;:12::i;:::-;20624:23;;:7;:5;:7::i;:::-;:23;;;20588:59;20580:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;30765:43:::1;30783:24;30801:4;30783:9;:24::i;:::-;30765:17;:43::i;:::-;30712:104::o:0;15380:201::-;15192:12;:10;:12::i;:::-;15181:23;;:7;:5;:7::i;:::-;:23;;;15173:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15489:1:::1;15469:22;;:8;:22;;::::0;15461:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;15545:28;15564:8;15545:18;:28::i;:::-;15380:201:::0;:::o;19294:26::-;;;;;;;;;;;;;:::o;18803:24::-;;;;:::o;17266:98::-;17324:7;17355:1;17351;:5;;;;:::i;:::-;17344:12;;17266:98;;;;:::o;369:::-;422:7;449:10;442:17;;369:98;:::o;5730:380::-;5883:1;5866:19;;:5;:19;;;5858:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5964:1;5945:21;;:7;:21;;;5937:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6048:6;6018:11;:18;6030:5;6018:18;;;;;;;;;;;;;;;:27;6037:7;6018:27;;;;;;;;;;;;;;;:36;;;;6086:7;6070:32;;6079:5;6070:32;;;6095:6;6070:32;;;;;;:::i;:::-;;;;;;;;5730:380;;;:::o;6118:453::-;6253:24;6280:25;6290:5;6297:7;6280:9;:25::i;:::-;6253:52;;6340:17;6320:16;:37;6316:248;;6402:6;6382:16;:26;;6374:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6486:51;6495:5;6502:7;6530:6;6511:16;:25;6486:8;:51::i;:::-;6316:248;6242:329;6118:453;;;:::o;24897:3205::-;25045:1;25029:18;;:4;:18;;;25021:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;25122:1;25108:16;;:2;:16;;;25100:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;25199:1;25189:6;:11;25185:93;;25217:28;25233:4;25239:2;25243:1;25217:15;:28::i;:::-;25260:7;;25185:93;25336:14;;;;;;;;;;;25332:1440;;;25397:7;:5;:7::i;:::-;25389:15;;:4;:15;;;;:49;;;;;25431:7;:5;:7::i;:::-;25425:13;;:2;:13;;;;25389:49;:91;;;;;25473:6;25459:21;;:2;:21;;;;25389:91;:122;;;;;25502:9;;;;;;;;;;;25501:10;25389:122;25367:1394;;;25556:7;:5;:7::i;:::-;25550:13;;:2;:13;;;;:47;;;;;25581:15;;;;;;;;;;;25567:30;;:2;:30;;;;25550:47;:79;;;;;25615:13;;;;;;;;;;;25601:28;;:2;:28;;;;25550:79;25546:336;;;25699:12;25661:24;:35;25686:9;25661:35;;;;;;;;;;;;;;;;:50;25653:136;;;;;;;;;;;;:::i;:::-;;;;;;;;;25850:12;25812:24;:35;25837:9;25812:35;;;;;;;;;;;;;;;:50;;;;25546:336;25933:26;:32;25960:4;25933:32;;;;;;;;;;;;;;;;;;;;;;;;;:72;;;;;25970:31;:35;26002:2;25970:35;;;;;;;;;;;;;;;;;;;;;;;;;25969:36;25933:72;25929:817;;;26048:20;;26038:6;:30;;26030:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;26195:9;;26178:13;26188:2;26178:9;:13::i;:::-;26169:6;:22;;;;:::i;:::-;:35;;26161:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;25929:817;;;26333:26;:30;26360:2;26333:30;;;;;;;;;;;;;;;;;;;;;;;;;:72;;;;;26368:31;:37;26400:4;26368:37;;;;;;;;;;;;;;;;;;;;;;;;;26367:38;26333:72;26329:417;;;26448:20;;26438:6;:30;;26430:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;26329:417;;;26587:31;:35;26619:2;26587:35;;;;;;;;;;;;;;;;;;;;;;;;;26582:164;;26681:9;;26664:13;26674:2;26664:9;:13::i;:::-;26655:6;:22;;;;:::i;:::-;:35;;26647:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;26582:164;26329:417;25929:817;25367:1394;25332:1440;26786:28;26817:24;26835:4;26817:9;:24::i;:::-;26786:55;;26852:12;26891:19;;26867:20;:43;;26852:58;;26939:7;:34;;;;;26964:9;;;;;;;;;;;26963:10;26939:34;:84;;;;;26991:26;:32;27018:4;26991:32;;;;;;;;;;;;;;;;;;;;;;;;;26990:33;26939:84;:127;;;;;27041:19;:25;27061:4;27041:25;;;;;;;;;;;;;;;;;;;;;;;;;27040:26;26939:127;:168;;;;;27084:19;:23;27104:2;27084:23;;;;;;;;;;;;;;;;;;;;;;;;;27083:24;26939:168;26921:298;;;27146:4;27134:9;;:16;;;;;;;;;;;;;;;;;;27165:10;:8;:10::i;:::-;27202:5;27190:9;;:17;;;;;;;;;;;;;;;;;;26921:298;27231:12;27247:9;;;;;;;;;;;27246:10;27231:25;;27377:19;:25;27397:4;27377:25;;;;;;;;;;;;;;;;;;;;;;;;;:66;;;;27420:19;:23;27440:2;27420:23;;;;;;;;;;;;;;;;;;;;;;;;;27377:66;:154;;;;27463:26;:32;27490:4;27463:32;;;;;;;;;;;;;;;;;;;;;;;;;27462:33;:68;;;;;27500:26;:30;27527:2;27500:30;;;;;;;;;;;;;;;;;;;;;;;;;27499:31;27462:68;27377:154;27359:199;;;27553:5;27543:15;;27359:199;27579:12;27610:7;27606:443;;;27641:30;27667:3;27641:21;27652:9;;27641:6;:10;;:21;;;;:::i;:::-;:25;;:30;;;;:::i;:::-;27634:37;;27732:9;;27716:13;;27709:4;:20;;;;:::i;:::-;:32;;;;:::i;:::-;27686:19;;:55;;;;;;;:::i;:::-;;;;;;;;27802:9;;27786:13;;27779:4;:20;;;;:::i;:::-;:32;;;;:::i;:::-;27756:19;;:55;;;;;;;:::i;:::-;;;;;;;;27872:9;;27856:13;;27849:4;:20;;;;:::i;:::-;:32;;;;:::i;:::-;27826:19;;:55;;;;;;;:::i;:::-;;;;;;;;27921:1;27914:4;:8;27910:91;;;27943:42;27959:4;27973;27980;27943:15;:42::i;:::-;27910:91;28033:4;28023:14;;;;;:::i;:::-;;;27606:443;28061:33;28077:4;28083:2;28087:6;28061:15;:33::i;:::-;25010:3092;;;;24897:3205;;;;:::o;17160:98::-;17218:7;17249:1;17245;:5;;;;:::i;:::-;17238:12;;17160:98;;;;:::o;4724:399::-;4827:1;4808:21;;:7;:21;;;4800:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;4878:49;4907:1;4911:7;4920:6;4878:20;:49::i;:::-;4956:6;4940:12;;:22;;;;;;;:::i;:::-;;;;;;;;4995:6;4973:9;:18;4983:7;4973:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;5038:7;5017:37;;5034:1;5017:37;;;5047:6;5017:37;;;;;;:::i;:::-;;;;;;;;5067:48;5095:1;5099:7;5108:6;5067:19;:48::i;:::-;4724:399;;:::o;31989:685::-;32067:7;32095:28;32105:6;32113:9;32095;:28::i;:::-;32087:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;32161:14;32178:29;32189:6;32197:9;32178:10;:29::i;:::-;32161:46;;32218:29;32250:48;32288:9;32250:8;:16;32259:6;32250:16;;;;;;;;;;;;;;;:27;32267:9;32250:27;;;;;;;;;;;:33;;;:37;;:48;;;;:::i;:::-;32218:80;;32309:31;32343:30;32363:9;32343:15;:19;;:30;;;;:::i;:::-;32309:64;;32384:21;32408:50;32436:21;32408:23;:27;;:50;;;;:::i;:::-;32384:74;;32471:12;32486:24;32506:3;32486:15;32497:3;;32486:6;:10;;:15;;;;:::i;:::-;:19;;:24;;;;:::i;:::-;32471:39;;32521:20;32544:37;32578:2;32544:29;32570:2;32544:21;32562:2;32544:13;32553:3;32544:4;:8;;:13;;;;:::i;:::-;:17;;:21;;;;:::i;:::-;:25;;:29;;;;:::i;:::-;:33;;:37;;;;:::i;:::-;32521:60;;32592:14;32609:31;32626:13;32609:12;:16;;:31;;;;:::i;:::-;32592:48;;32660:6;32653:13;;;;;;;;;31989:685;;;;:::o;15589:191::-;15663:16;15682:6;;;;;;;;;;;15663:25;;15708:8;15699:6;;:17;;;;;;;;;;;;;;;;;;15763:8;15732:40;;15753:8;15732:40;;;;;;;;;;;;15652:128;15589:191;:::o;5131:591::-;5234:1;5215:21;;:7;:21;;;5207:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;5287:49;5308:7;5325:1;5329:6;5287:20;:49::i;:::-;5349:22;5374:9;:18;5384:7;5374:18;;;;;;;;;;;;;;;;5349:43;;5429:6;5411:14;:24;;5403:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;5548:6;5531:14;:23;5510:9;:18;5520:7;5510:18;;;;;;;;;;;;;;;:44;;;;5592:6;5576:12;;:22;;;;;;;:::i;:::-;;;;;;;;5642:1;5616:37;;5625:7;5616:37;;;5646:6;5616:37;;;;;;:::i;:::-;;;;;;;;5666:48;5686:7;5703:1;5707:6;5666:19;:48::i;:::-;5196:526;5131:591;;:::o;28110:477::-;28178:21;28216:1;28202:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28178:40;;28247:4;28229;28234:1;28229:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;28273:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28263:4;28268:1;28263:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;;;28308:62;28325:4;28340:15;;;;;;;;;;;28358:11;28308:8;:62::i;:::-;28383:15;;;;;;;;;;;:66;;;28464:11;28490:1;28506:4;28533;28553:15;28383:196;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28167:420;28110:477;:::o;4045:671::-;4192:1;4176:18;;:4;:18;;;4168:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4269:1;4255:16;;:2;:16;;;4247:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;4324:38;4345:4;4351:2;4355:6;4324:20;:38::i;:::-;4375:19;4397:9;:15;4407:4;4397:15;;;;;;;;;;;;;;;;4375:37;;4446:6;4431:11;:21;;4423:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;4563:6;4549:11;:20;4531:9;:15;4541:4;4531:15;;;;;;;;;;;;;;;:38;;;;4608:6;4591:9;:13;4601:2;4591:13;;;;;;;;;;;;;;;;:23;;;;;;;:::i;:::-;;;;;;;;4647:2;4632:26;;4641:4;4632:26;;;4651:6;4632:26;;;;;;:::i;:::-;;;;;;;;4671:37;4691:4;4697:2;4701:6;4671:19;:37::i;:::-;4157:559;4045:671;;;:::o;28976:1439::-;29016:23;29042:24;29060:4;29042:9;:24::i;:::-;29016:50;;29077:25;29149:19;;29127;;29105;;:41;;;;:::i;:::-;:63;;;;:::i;:::-;29077:91;;29212:1;29193:15;:20;:46;;;;29238:1;29217:17;:22;29193:46;29189:59;;;29241:7;;;;29189:59;29280:19;;29262:15;:37;29258:80;;;29319:19;;29301:37;;29258:80;29418:23;29504:1;29484:17;29462:19;;29444:15;:37;;;;:::i;:::-;:57;;;;:::i;:::-;:61;;;;:::i;:::-;29418:87;;29516:26;29545:36;29565:15;29545;:19;;:36;;;;:::i;:::-;29516:65;;29602:25;29630:21;29602:49;;29664:37;29682:18;29664:17;:37::i;:::-;29722:18;29743:44;29769:17;29743:21;:25;;:44;;;;:::i;:::-;29722:65;;29798:23;29824:58;29864:17;29824:35;29839:19;;29824:10;:14;;:35;;;;:::i;:::-;:39;;:58;;;;:::i;:::-;29798:84;;29893:23;29919:58;29959:17;29919:35;29934:19;;29919:10;:14;;:35;;;;:::i;:::-;:39;;:58;;;;:::i;:::-;29893:84;;29988:23;30045:15;30027;30014:10;:28;;;;:::i;:::-;:46;;;;:::i;:::-;29988:72;;30103:1;30081:19;:23;;;;30137:1;30115:19;:23;;;;30171:1;30149:19;:23;;;;30193:16;;;;;;;;;;;30185:34;;:72;30220:36;30240:15;30220;:19;;:36;;;;:::i;:::-;30185:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30308:1;30290:15;:19;:42;;;;;30331:1;30313:15;:19;30290:42;30286:122;;;30349:47;30363:15;30380;30349:13;:47::i;:::-;30286:122;29005:1410;;;;;;;;;28976:1439;:::o;17372:98::-;17430:7;17461:1;17457;:5;;;;:::i;:::-;17450:12;;17372:98;;;;:::o;17478:::-;17536:7;17567:1;17563;:5;;;;:::i;:::-;17556:12;;17478:98;;;;:::o;6579:125::-;;;;:::o;6712:124::-;;;;:::o;28595:373::-;28678:62;28695:4;28710:15;;;;;;;;;;;28728:11;28678:8;:62::i;:::-;28753:15;;;;;;;;;;;:31;;;28792:9;28825:4;28845:11;28871:1;28887;28903:16;;;;;;;;;;;28934:15;28753:207;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;28595:373;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1430:117::-;1539:1;1536;1529:12;1676:126;1713:7;1753:42;1746:5;1742:54;1731:65;;1676:126;;;:::o;1808:96::-;1845:7;1874:24;1892:5;1874:24;:::i;:::-;1863:35;;1808:96;;;:::o;1910:122::-;1983:24;2001:5;1983:24;:::i;:::-;1976:5;1973:35;1963:63;;2022:1;2019;2012:12;1963:63;1910:122;:::o;2038:139::-;2084:5;2122:6;2109:20;2100:29;;2138:33;2165:5;2138:33;:::i;:::-;2038:139;;;;:::o;2183:77::-;2220:7;2249:5;2238:16;;2183:77;;;:::o;2266:122::-;2339:24;2357:5;2339:24;:::i;:::-;2332:5;2329:35;2319:63;;2378:1;2375;2368:12;2319:63;2266:122;:::o;2394:139::-;2440:5;2478:6;2465:20;2456:29;;2494:33;2521:5;2494:33;:::i;:::-;2394:139;;;;:::o;2539:474::-;2607:6;2615;2664:2;2652:9;2643:7;2639:23;2635:32;2632:119;;;2670:79;;:::i;:::-;2632:119;2790:1;2815:53;2860:7;2851:6;2840:9;2836:22;2815:53;:::i;:::-;2805:63;;2761:117;2917:2;2943:53;2988:7;2979:6;2968:9;2964:22;2943:53;:::i;:::-;2933:63;;2888:118;2539:474;;;;;:::o;3019:90::-;3053:7;3096:5;3089:13;3082:21;3071:32;;3019:90;;;:::o;3115:109::-;3196:21;3211:5;3196:21;:::i;:::-;3191:3;3184:34;3115:109;;:::o;3230:210::-;3317:4;3355:2;3344:9;3340:18;3332:26;;3368:65;3430:1;3419:9;3415:17;3406:6;3368:65;:::i;:::-;3230:210;;;;:::o;3446:118::-;3533:24;3551:5;3533:24;:::i;:::-;3528:3;3521:37;3446:118;;:::o;3570:222::-;3663:4;3701:2;3690:9;3686:18;3678:26;;3714:71;3782:1;3771:9;3767:17;3758:6;3714:71;:::i;:::-;3570:222;;;;:::o;3798:619::-;3875:6;3883;3891;3940:2;3928:9;3919:7;3915:23;3911:32;3908:119;;;3946:79;;:::i;:::-;3908:119;4066:1;4091:53;4136:7;4127:6;4116:9;4112:22;4091:53;:::i;:::-;4081:63;;4037:117;4193:2;4219:53;4264:7;4255:6;4244:9;4240:22;4219:53;:::i;:::-;4209:63;;4164:118;4321:2;4347:53;4392:7;4383:6;4372:9;4368:22;4347:53;:::i;:::-;4337:63;;4292:118;3798:619;;;;;:::o;4423:::-;4500:6;4508;4516;4565:2;4553:9;4544:7;4540:23;4536:32;4533:119;;;4571:79;;:::i;:::-;4533:119;4691:1;4716:53;4761:7;4752:6;4741:9;4737:22;4716:53;:::i;:::-;4706:63;;4662:117;4818:2;4844:53;4889:7;4880:6;4869:9;4865:22;4844:53;:::i;:::-;4834:63;;4789:118;4946:2;4972:53;5017:7;5008:6;4997:9;4993:22;4972:53;:::i;:::-;4962:63;;4917:118;4423:619;;;;;:::o;5048:329::-;5107:6;5156:2;5144:9;5135:7;5131:23;5127:32;5124:119;;;5162:79;;:::i;:::-;5124:119;5282:1;5307:53;5352:7;5343:6;5332:9;5328:22;5307:53;:::i;:::-;5297:63;;5253:117;5048:329;;;;:::o;5383:86::-;5418:7;5458:4;5451:5;5447:16;5436:27;;5383:86;;;:::o;5475:112::-;5558:22;5574:5;5558:22;:::i;:::-;5553:3;5546:35;5475:112;;:::o;5593:214::-;5682:4;5720:2;5709:9;5705:18;5697:26;;5733:67;5797:1;5786:9;5782:17;5773:6;5733:67;:::i;:::-;5593:214;;;;:::o;5813:332::-;5934:4;5972:2;5961:9;5957:18;5949:26;;5985:71;6053:1;6042:9;6038:17;6029:6;5985:71;:::i;:::-;6066:72;6134:2;6123:9;6119:18;6110:6;6066:72;:::i;:::-;5813:332;;;;;:::o;6151:116::-;6221:21;6236:5;6221:21;:::i;:::-;6214:5;6211:32;6201:60;;6257:1;6254;6247:12;6201:60;6151:116;:::o;6273:133::-;6316:5;6354:6;6341:20;6332:29;;6370:30;6394:5;6370:30;:::i;:::-;6273:133;;;;:::o;6412:323::-;6468:6;6517:2;6505:9;6496:7;6492:23;6488:32;6485:119;;;6523:79;;:::i;:::-;6485:119;6643:1;6668:50;6710:7;6701:6;6690:9;6686:22;6668:50;:::i;:::-;6658:60;;6614:114;6412:323;;;;:::o;6741:329::-;6800:6;6849:2;6837:9;6828:7;6824:23;6820:32;6817:119;;;6855:79;;:::i;:::-;6817:119;6975:1;7000:53;7045:7;7036:6;7025:9;7021:22;7000:53;:::i;:::-;6990:63;;6946:117;6741:329;;;;:::o;7076:114::-;7143:6;7177:5;7171:12;7161:22;;7076:114;;;:::o;7196:174::-;7285:11;7319:6;7314:3;7307:19;7359:4;7354:3;7350:14;7335:29;;7196:174;;;;:::o;7376:132::-;7443:4;7466:3;7458:11;;7496:4;7491:3;7487:14;7479:22;;7376:132;;;:::o;7514:108::-;7591:24;7609:5;7591:24;:::i;:::-;7586:3;7579:37;7514:108;;:::o;7628:179::-;7697:10;7718:46;7760:3;7752:6;7718:46;:::i;:::-;7796:4;7791:3;7787:14;7773:28;;7628:179;;;;:::o;7813:113::-;7883:4;7915;7910:3;7906:14;7898:22;;7813:113;;;:::o;7962:712::-;8071:3;8100:54;8148:5;8100:54;:::i;:::-;8170:76;8239:6;8234:3;8170:76;:::i;:::-;8163:83;;8270:56;8320:5;8270:56;:::i;:::-;8349:7;8380:1;8365:284;8390:6;8387:1;8384:13;8365:284;;;8466:6;8460:13;8493:63;8552:3;8537:13;8493:63;:::i;:::-;8486:70;;8579:60;8632:6;8579:60;:::i;:::-;8569:70;;8425:224;8412:1;8409;8405:9;8400:14;;8365:284;;;8369:14;8665:3;8658:10;;8076:598;;;7962:712;;;;:::o;8754:751::-;8883:3;8919:4;8914:3;8910:14;9007:4;9000:5;8996:16;8990:23;9060:3;9054:4;9050:14;9043:4;9038:3;9034:14;9027:38;9086:103;9184:4;9170:12;9086:103;:::i;:::-;9078:111;;8934:266;9285:4;9278:5;9274:16;9268:23;9338:3;9332:4;9328:14;9321:4;9316:3;9312:14;9305:38;9364:103;9462:4;9448:12;9364:103;:::i;:::-;9356:111;;9210:268;9495:4;9488:11;;8888:617;8754:751;;;;:::o;9511:393::-;9664:4;9702:2;9691:9;9687:18;9679:26;;9751:9;9745:4;9741:20;9737:1;9726:9;9722:17;9715:47;9779:118;9892:4;9883:6;9779:118;:::i;:::-;9771:126;;9511:393;;;;:::o;9910:118::-;9997:24;10015:5;9997:24;:::i;:::-;9992:3;9985:37;9910:118;;:::o;10034:222::-;10127:4;10165:2;10154:9;10150:18;10142:26;;10178:71;10246:1;10235:9;10231:17;10222:6;10178:71;:::i;:::-;10034:222;;;;:::o;10262:474::-;10330:6;10338;10387:2;10375:9;10366:7;10362:23;10358:32;10355:119;;;10393:79;;:::i;:::-;10355:119;10513:1;10538:53;10583:7;10574:6;10563:9;10559:22;10538:53;:::i;:::-;10528:63;;10484:117;10640:2;10666:53;10711:7;10702:6;10691:9;10687:22;10666:53;:::i;:::-;10656:63;;10611:118;10262:474;;;;;:::o;10742:468::-;10807:6;10815;10864:2;10852:9;10843:7;10839:23;10835:32;10832:119;;;10870:79;;:::i;:::-;10832:119;10990:1;11015:53;11060:7;11051:6;11040:9;11036:22;11015:53;:::i;:::-;11005:63;;10961:117;11117:2;11143:50;11185:7;11176:6;11165:9;11161:22;11143:50;:::i;:::-;11133:60;;11088:115;10742:468;;;;;:::o;11216:474::-;11284:6;11292;11341:2;11329:9;11320:7;11316:23;11312:32;11309:119;;;11347:79;;:::i;:::-;11309:119;11467:1;11492:53;11537:7;11528:6;11517:9;11513:22;11492:53;:::i;:::-;11482:63;;11438:117;11594:2;11620:53;11665:7;11656:6;11645:9;11641:22;11620:53;:::i;:::-;11610:63;;11565:118;11216:474;;;;;:::o;11696:180::-;11744:77;11741:1;11734:88;11841:4;11838:1;11831:15;11865:4;11862:1;11855:15;11882:320;11926:6;11963:1;11957:4;11953:12;11943:22;;12010:1;12004:4;12000:12;12031:18;12021:81;;12087:4;12079:6;12075:17;12065:27;;12021:81;12149:2;12141:6;12138:14;12118:18;12115:38;12112:84;;12168:18;;:::i;:::-;12112:84;11933:269;11882:320;;;:::o;12208:182::-;12348:34;12344:1;12336:6;12332:14;12325:58;12208:182;:::o;12396:366::-;12538:3;12559:67;12623:2;12618:3;12559:67;:::i;:::-;12552:74;;12635:93;12724:3;12635:93;:::i;:::-;12753:2;12748:3;12744:12;12737:19;;12396:366;;;:::o;12768:419::-;12934:4;12972:2;12961:9;12957:18;12949:26;;13021:9;13015:4;13011:20;13007:1;12996:9;12992:17;12985:47;13049:131;13175:4;13049:131;:::i;:::-;13041:139;;12768:419;;;:::o;13193:180::-;13241:77;13238:1;13231:88;13338:4;13335:1;13328:15;13362:4;13359:1;13352:15;13379:191;13419:3;13438:20;13456:1;13438:20;:::i;:::-;13433:25;;13472:20;13490:1;13472:20;:::i;:::-;13467:25;;13515:1;13512;13508:9;13501:16;;13536:3;13533:1;13530:10;13527:36;;;13543:18;;:::i;:::-;13527:36;13379:191;;;;:::o;13576:178::-;13716:30;13712:1;13704:6;13700:14;13693:54;13576:178;:::o;13760:366::-;13902:3;13923:67;13987:2;13982:3;13923:67;:::i;:::-;13916:74;;13999:93;14088:3;13999:93;:::i;:::-;14117:2;14112:3;14108:12;14101:19;;13760:366;;;:::o;14132:419::-;14298:4;14336:2;14325:9;14321:18;14313:26;;14385:9;14379:4;14375:20;14371:1;14360:9;14356:17;14349:47;14413:131;14539:4;14413:131;:::i;:::-;14405:139;;14132:419;;;:::o;14557:240::-;14697:34;14693:1;14685:6;14681:14;14674:58;14766:23;14761:2;14753:6;14749:15;14742:48;14557:240;:::o;14803:366::-;14945:3;14966:67;15030:2;15025:3;14966:67;:::i;:::-;14959:74;;15042:93;15131:3;15042:93;:::i;:::-;15160:2;15155:3;15151:12;15144:19;;14803:366;;;:::o;15175:419::-;15341:4;15379:2;15368:9;15364:18;15356:26;;15428:9;15422:4;15418:20;15414:1;15403:9;15399:17;15392:47;15456:131;15582:4;15456:131;:::i;:::-;15448:139;;15175:419;;;:::o;15600:143::-;15657:5;15688:6;15682:13;15673:22;;15704:33;15731:5;15704:33;:::i;:::-;15600:143;;;;:::o;15749:351::-;15819:6;15868:2;15856:9;15847:7;15843:23;15839:32;15836:119;;;15874:79;;:::i;:::-;15836:119;15994:1;16019:64;16075:7;16066:6;16055:9;16051:22;16019:64;:::i;:::-;16009:74;;15965:128;15749:351;;;;:::o;16106:332::-;16227:4;16265:2;16254:9;16250:18;16242:26;;16278:71;16346:1;16335:9;16331:17;16322:6;16278:71;:::i;:::-;16359:72;16427:2;16416:9;16412:18;16403:6;16359:72;:::i;:::-;16106:332;;;;;:::o;16444:85::-;16489:7;16518:5;16507:16;;16444:85;;;:::o;16535:60::-;16563:3;16584:5;16577:12;;16535:60;;;:::o;16601:158::-;16659:9;16692:61;16710:42;16719:32;16745:5;16719:32;:::i;:::-;16710:42;:::i;:::-;16692:61;:::i;:::-;16679:74;;16601:158;;;:::o;16765:147::-;16860:45;16899:5;16860:45;:::i;:::-;16855:3;16848:58;16765:147;;:::o;16918:807::-;17167:4;17205:3;17194:9;17190:19;17182:27;;17219:71;17287:1;17276:9;17272:17;17263:6;17219:71;:::i;:::-;17300:72;17368:2;17357:9;17353:18;17344:6;17300:72;:::i;:::-;17382:80;17458:2;17447:9;17443:18;17434:6;17382:80;:::i;:::-;17472;17548:2;17537:9;17533:18;17524:6;17472:80;:::i;:::-;17562:73;17630:3;17619:9;17615:19;17606:6;17562:73;:::i;:::-;17645;17713:3;17702:9;17698:19;17689:6;17645:73;:::i;:::-;16918:807;;;;;;;;;:::o;17731:143::-;17788:5;17819:6;17813:13;17804:22;;17835:33;17862:5;17835:33;:::i;:::-;17731:143;;;;:::o;17880:663::-;17968:6;17976;17984;18033:2;18021:9;18012:7;18008:23;18004:32;18001:119;;;18039:79;;:::i;:::-;18001:119;18159:1;18184:64;18240:7;18231:6;18220:9;18216:22;18184:64;:::i;:::-;18174:74;;18130:128;18297:2;18323:64;18379:7;18370:6;18359:9;18355:22;18323:64;:::i;:::-;18313:74;;18268:129;18436:2;18462:64;18518:7;18509:6;18498:9;18494:22;18462:64;:::i;:::-;18452:74;;18407:129;17880:663;;;;;:::o;18549:171::-;18689:23;18685:1;18677:6;18673:14;18666:47;18549:171;:::o;18726:366::-;18868:3;18889:67;18953:2;18948:3;18889:67;:::i;:::-;18882:74;;18965:93;19054:3;18965:93;:::i;:::-;19083:2;19078:3;19074:12;19067:19;;18726:366;;;:::o;19098:419::-;19264:4;19302:2;19291:9;19287:18;19279:26;;19351:9;19345:4;19341:20;19337:1;19326:9;19322:17;19315:47;19379:131;19505:4;19379:131;:::i;:::-;19371:139;;19098:419;;;:::o;19523:180::-;19571:77;19568:1;19561:88;19668:4;19665:1;19658:15;19692:4;19689:1;19682:15;19709:194;19749:4;19769:20;19787:1;19769:20;:::i;:::-;19764:25;;19803:20;19821:1;19803:20;:::i;:::-;19798:25;;19847:1;19844;19840:9;19832:17;;19871:1;19865:4;19862:11;19859:37;;;19876:18;;:::i;:::-;19859:37;19709:194;;;;:::o;19909:173::-;20049:25;20045:1;20037:6;20033:14;20026:49;19909:173;:::o;20088:366::-;20230:3;20251:67;20315:2;20310:3;20251:67;:::i;:::-;20244:74;;20327:93;20416:3;20327:93;:::i;:::-;20445:2;20440:3;20436:12;20429:19;;20088:366;;;:::o;20460:419::-;20626:4;20664:2;20653:9;20649:18;20641:26;;20713:9;20707:4;20703:20;20699:1;20688:9;20684:17;20677:47;20741:131;20867:4;20741:131;:::i;:::-;20733:139;;20460:419;;;:::o;20885:232::-;21025:34;21021:1;21013:6;21009:14;21002:58;21094:15;21089:2;21081:6;21077:15;21070:40;20885:232;:::o;21123:366::-;21265:3;21286:67;21350:2;21345:3;21286:67;:::i;:::-;21279:74;;21362:93;21451:3;21362:93;:::i;:::-;21480:2;21475:3;21471:12;21464:19;;21123:366;;;:::o;21495:419::-;21661:4;21699:2;21688:9;21684:18;21676:26;;21748:9;21742:4;21738:20;21734:1;21723:9;21719:17;21712:47;21776:131;21902:4;21776:131;:::i;:::-;21768:139;;21495:419;;;:::o;21920:410::-;21960:7;21983:20;22001:1;21983:20;:::i;:::-;21978:25;;22017:20;22035:1;22017:20;:::i;:::-;22012:25;;22072:1;22069;22065:9;22094:30;22112:11;22094:30;:::i;:::-;22083:41;;22273:1;22264:7;22260:15;22257:1;22254:22;22234:1;22227:9;22207:83;22184:139;;22303:18;;:::i;:::-;22184:139;21968:362;21920:410;;;;:::o;22336:180::-;22384:77;22381:1;22374:88;22481:4;22478:1;22471:15;22505:4;22502:1;22495:15;22522:185;22562:1;22579:20;22597:1;22579:20;:::i;:::-;22574:25;;22613:20;22631:1;22613:20;:::i;:::-;22608:25;;22652:1;22642:35;;22657:18;;:::i;:::-;22642:35;22699:1;22696;22692:9;22687:14;;22522:185;;;;:::o;22713:243::-;22853:34;22849:1;22841:6;22837:14;22830:58;22922:26;22917:2;22909:6;22905:15;22898:51;22713:243;:::o;22962:366::-;23104:3;23125:67;23189:2;23184:3;23125:67;:::i;:::-;23118:74;;23201:93;23290:3;23201:93;:::i;:::-;23319:2;23314:3;23310:12;23303:19;;22962:366;;;:::o;23334:419::-;23500:4;23538:2;23527:9;23523:18;23515:26;;23587:9;23581:4;23577:20;23573:1;23562:9;23558:17;23551:47;23615:131;23741:4;23615:131;:::i;:::-;23607:139;;23334:419;;;:::o;23759:242::-;23899:34;23895:1;23887:6;23883:14;23876:58;23968:25;23963:2;23955:6;23951:15;23944:50;23759:242;:::o;24007:366::-;24149:3;24170:67;24234:2;24229:3;24170:67;:::i;:::-;24163:74;;24246:93;24335:3;24246:93;:::i;:::-;24364:2;24359:3;24355:12;24348:19;;24007:366;;;:::o;24379:419::-;24545:4;24583:2;24572:9;24568:18;24560:26;;24632:9;24626:4;24622:20;24618:1;24607:9;24603:17;24596:47;24660:131;24786:4;24660:131;:::i;:::-;24652:139;;24379:419;;;:::o;24804:224::-;24944:34;24940:1;24932:6;24928:14;24921:58;25013:7;25008:2;25000:6;24996:15;24989:32;24804:224;:::o;25034:366::-;25176:3;25197:67;25261:2;25256:3;25197:67;:::i;:::-;25190:74;;25273:93;25362:3;25273:93;:::i;:::-;25391:2;25386:3;25382:12;25375:19;;25034:366;;;:::o;25406:419::-;25572:4;25610:2;25599:9;25595:18;25587:26;;25659:9;25653:4;25649:20;25645:1;25634:9;25630:17;25623:47;25687:131;25813:4;25687:131;:::i;:::-;25679:139;;25406:419;;;:::o;25831:225::-;25971:34;25967:1;25959:6;25955:14;25948:58;26040:8;26035:2;26027:6;26023:15;26016:33;25831:225;:::o;26062:366::-;26204:3;26225:67;26289:2;26284:3;26225:67;:::i;:::-;26218:74;;26301:93;26390:3;26301:93;:::i;:::-;26419:2;26414:3;26410:12;26403:19;;26062:366;;;:::o;26434:419::-;26600:4;26638:2;26627:9;26623:18;26615:26;;26687:9;26681:4;26677:20;26673:1;26662:9;26658:17;26651:47;26715:131;26841:4;26715:131;:::i;:::-;26707:139;;26434:419;;;:::o;26859:223::-;26999:34;26995:1;26987:6;26983:14;26976:58;27068:6;27063:2;27055:6;27051:15;27044:31;26859:223;:::o;27088:366::-;27230:3;27251:67;27315:2;27310:3;27251:67;:::i;:::-;27244:74;;27327:93;27416:3;27327:93;:::i;:::-;27445:2;27440:3;27436:12;27429:19;;27088:366;;;:::o;27460:419::-;27626:4;27664:2;27653:9;27649:18;27641:26;;27713:9;27707:4;27703:20;27699:1;27688:9;27684:17;27677:47;27741:131;27867:4;27741:131;:::i;:::-;27733:139;;27460:419;;;:::o;27885:221::-;28025:34;28021:1;28013:6;28009:14;28002:58;28094:4;28089:2;28081:6;28077:15;28070:29;27885:221;:::o;28112:366::-;28254:3;28275:67;28339:2;28334:3;28275:67;:::i;:::-;28268:74;;28351:93;28440:3;28351:93;:::i;:::-;28469:2;28464:3;28460:12;28453:19;;28112:366;;;:::o;28484:419::-;28650:4;28688:2;28677:9;28673:18;28665:26;;28737:9;28731:4;28727:20;28723:1;28712:9;28708:17;28701:47;28765:131;28891:4;28765:131;:::i;:::-;28757:139;;28484:419;;;:::o;28909:179::-;29049:31;29045:1;29037:6;29033:14;29026:55;28909:179;:::o;29094:366::-;29236:3;29257:67;29321:2;29316:3;29257:67;:::i;:::-;29250:74;;29333:93;29422:3;29333:93;:::i;:::-;29451:2;29446:3;29442:12;29435:19;;29094:366;;;:::o;29466:419::-;29632:4;29670:2;29659:9;29655:18;29647:26;;29719:9;29713:4;29709:20;29705:1;29694:9;29690:17;29683:47;29747:131;29873:4;29747:131;:::i;:::-;29739:139;;29466:419;;;:::o;29891:224::-;30031:34;30027:1;30019:6;30015:14;30008:58;30100:7;30095:2;30087:6;30083:15;30076:32;29891:224;:::o;30121:366::-;30263:3;30284:67;30348:2;30343:3;30284:67;:::i;:::-;30277:74;;30360:93;30449:3;30360:93;:::i;:::-;30478:2;30473:3;30469:12;30462:19;;30121:366;;;:::o;30493:419::-;30659:4;30697:2;30686:9;30682:18;30674:26;;30746:9;30740:4;30736:20;30732:1;30721:9;30717:17;30710:47;30774:131;30900:4;30774:131;:::i;:::-;30766:139;;30493:419;;;:::o;30918:222::-;31058:34;31054:1;31046:6;31042:14;31035:58;31127:5;31122:2;31114:6;31110:15;31103:30;30918:222;:::o;31146:366::-;31288:3;31309:67;31373:2;31368:3;31309:67;:::i;:::-;31302:74;;31385:93;31474:3;31385:93;:::i;:::-;31503:2;31498:3;31494:12;31487:19;;31146:366;;;:::o;31518:419::-;31684:4;31722:2;31711:9;31707:18;31699:26;;31771:9;31765:4;31761:20;31757:1;31746:9;31742:17;31735:47;31799:131;31925:4;31799:131;:::i;:::-;31791:139;;31518:419;;;:::o;31943:297::-;32083:34;32079:1;32071:6;32067:14;32060:58;32152:34;32147:2;32139:6;32135:15;32128:59;32221:11;32216:2;32208:6;32204:15;32197:36;31943:297;:::o;32246:366::-;32388:3;32409:67;32473:2;32468:3;32409:67;:::i;:::-;32402:74;;32485:93;32574:3;32485:93;:::i;:::-;32603:2;32598:3;32594:12;32587:19;;32246:366;;;:::o;32618:419::-;32784:4;32822:2;32811:9;32807:18;32799:26;;32871:9;32865:4;32861:20;32857:1;32846:9;32842:17;32835:47;32899:131;33025:4;32899:131;:::i;:::-;32891:139;;32618:419;;;:::o;33043:289::-;33183:34;33179:1;33171:6;33167:14;33160:58;33252:34;33247:2;33239:6;33235:15;33228:59;33321:3;33316:2;33308:6;33304:15;33297:28;33043:289;:::o;33338:366::-;33480:3;33501:67;33565:2;33560:3;33501:67;:::i;:::-;33494:74;;33577:93;33666:3;33577:93;:::i;:::-;33695:2;33690:3;33686:12;33679:19;;33338:366;;;:::o;33710:419::-;33876:4;33914:2;33903:9;33899:18;33891:26;;33963:9;33957:4;33953:20;33949:1;33938:9;33934:17;33927:47;33991:131;34117:4;33991:131;:::i;:::-;33983:139;;33710:419;;;:::o;34135:181::-;34275:33;34271:1;34263:6;34259:14;34252:57;34135:181;:::o;34322:366::-;34464:3;34485:67;34549:2;34544:3;34485:67;:::i;:::-;34478:74;;34561:93;34650:3;34561:93;:::i;:::-;34679:2;34674:3;34670:12;34663:19;;34322:366;;;:::o;34694:419::-;34860:4;34898:2;34887:9;34883:18;34875:26;;34947:9;34941:4;34937:20;34933:1;34922:9;34918:17;34911:47;34975:131;35101:4;34975:131;:::i;:::-;34967:139;;34694:419;;;:::o;35119:290::-;35259:34;35255:1;35247:6;35243:14;35236:58;35328:34;35323:2;35315:6;35311:15;35304:59;35397:4;35392:2;35384:6;35380:15;35373:29;35119:290;:::o;35415:366::-;35557:3;35578:67;35642:2;35637:3;35578:67;:::i;:::-;35571:74;;35654:93;35743:3;35654:93;:::i;:::-;35772:2;35767:3;35763:12;35756:19;;35415:366;;;:::o;35787:419::-;35953:4;35991:2;35980:9;35976:18;35968:26;;36040:9;36034:4;36030:20;36026:1;36015:9;36011:17;36004:47;36068:131;36194:4;36068:131;:::i;:::-;36060:139;;35787:419;;;:::o;36212:181::-;36352:33;36348:1;36340:6;36336:14;36329:57;36212:181;:::o;36399:366::-;36541:3;36562:67;36626:2;36621:3;36562:67;:::i;:::-;36555:74;;36638:93;36727:3;36638:93;:::i;:::-;36756:2;36751:3;36747:12;36740:19;;36399:366;;;:::o;36771:419::-;36937:4;36975:2;36964:9;36960:18;36952:26;;37024:9;37018:4;37014:20;37010:1;36999:9;36995:17;36988:47;37052:131;37178:4;37052:131;:::i;:::-;37044:139;;36771:419;;;:::o;37196:170::-;37336:22;37332:1;37324:6;37320:14;37313:46;37196:170;:::o;37372:366::-;37514:3;37535:67;37599:2;37594:3;37535:67;:::i;:::-;37528:74;;37611:93;37700:3;37611:93;:::i;:::-;37729:2;37724:3;37720:12;37713:19;;37372:366;;;:::o;37744:419::-;37910:4;37948:2;37937:9;37933:18;37925:26;;37997:9;37991:4;37987:20;37983:1;37972:9;37968:17;37961:47;38025:131;38151:4;38025:131;:::i;:::-;38017:139;;37744:419;;;:::o;38169:220::-;38309:34;38305:1;38297:6;38293:14;38286:58;38378:3;38373:2;38365:6;38361:15;38354:28;38169:220;:::o;38395:366::-;38537:3;38558:67;38622:2;38617:3;38558:67;:::i;:::-;38551:74;;38634:93;38723:3;38634:93;:::i;:::-;38752:2;38747:3;38743:12;38736:19;;38395:366;;;:::o;38767:419::-;38933:4;38971:2;38960:9;38956:18;38948:26;;39020:9;39014:4;39010:20;39006:1;38995:9;38991:17;38984:47;39048:131;39174:4;39048:131;:::i;:::-;39040:139;;38767:419;;;:::o;39192:221::-;39332:34;39328:1;39320:6;39316:14;39309:58;39401:4;39396:2;39388:6;39384:15;39377:29;39192:221;:::o;39419:366::-;39561:3;39582:67;39646:2;39641:3;39582:67;:::i;:::-;39575:74;;39658:93;39747:3;39658:93;:::i;:::-;39776:2;39771:3;39767:12;39760:19;;39419:366;;;:::o;39791:419::-;39957:4;39995:2;39984:9;39980:18;39972:26;;40044:9;40038:4;40034:20;40030:1;40019:9;40015:17;40008:47;40072:131;40198:4;40072:131;:::i;:::-;40064:139;;39791:419;;;:::o;40216:180::-;40264:77;40261:1;40254:88;40361:4;40358:1;40351:15;40385:4;40382:1;40375:15;40402:114;40469:6;40503:5;40497:12;40487:22;;40402:114;;;:::o;40522:184::-;40621:11;40655:6;40650:3;40643:19;40695:4;40690:3;40686:14;40671:29;;40522:184;;;;:::o;40712:132::-;40779:4;40802:3;40794:11;;40832:4;40827:3;40823:14;40815:22;;40712:132;;;:::o;40850:108::-;40927:24;40945:5;40927:24;:::i;:::-;40922:3;40915:37;40850:108;;:::o;40964:179::-;41033:10;41054:46;41096:3;41088:6;41054:46;:::i;:::-;41132:4;41127:3;41123:14;41109:28;;40964:179;;;;:::o;41149:113::-;41219:4;41251;41246:3;41242:14;41234:22;;41149:113;;;:::o;41298:732::-;41417:3;41446:54;41494:5;41446:54;:::i;:::-;41516:86;41595:6;41590:3;41516:86;:::i;:::-;41509:93;;41626:56;41676:5;41626:56;:::i;:::-;41705:7;41736:1;41721:284;41746:6;41743:1;41740:13;41721:284;;;41822:6;41816:13;41849:63;41908:3;41893:13;41849:63;:::i;:::-;41842:70;;41935:60;41988:6;41935:60;:::i;:::-;41925:70;;41781:224;41768:1;41765;41761:9;41756:14;;41721:284;;;41725:14;42021:3;42014:10;;41422:608;;;41298:732;;;;:::o;42036:831::-;42299:4;42337:3;42326:9;42322:19;42314:27;;42351:71;42419:1;42408:9;42404:17;42395:6;42351:71;:::i;:::-;42432:80;42508:2;42497:9;42493:18;42484:6;42432:80;:::i;:::-;42559:9;42553:4;42549:20;42544:2;42533:9;42529:18;42522:48;42587:108;42690:4;42681:6;42587:108;:::i;:::-;42579:116;;42705:72;42773:2;42762:9;42758:18;42749:6;42705:72;:::i;:::-;42787:73;42855:3;42844:9;42840:19;42831:6;42787:73;:::i;:::-;42036:831;;;;;;;;:::o;42873:225::-;43013:34;43009:1;43001:6;42997:14;42990:58;43082:8;43077:2;43069:6;43065:15;43058:33;42873:225;:::o;43104:366::-;43246:3;43267:67;43331:2;43326:3;43267:67;:::i;:::-;43260:74;;43343:93;43432:3;43343:93;:::i;:::-;43461:2;43456:3;43452:12;43445:19;;43104:366;;;:::o;43476:419::-;43642:4;43680:2;43669:9;43665:18;43657:26;;43729:9;43723:4;43719:20;43715:1;43704:9;43700:17;43693:47;43757:131;43883:4;43757:131;:::i;:::-;43749:139;;43476:419;;;:::o

Swarm Source

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