ETH Price: $3,334.77 (-1.19%)

Token

GOLD AI NETWORK TOKEN (GAIN)
 

Overview

Max Total Supply

24,000 GAIN

Holders

318 (0.00%)

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
27.918 GAIN

Value
$0.00
0xe31c181d7927e194563435aa3777c9c7da3627Ca
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

PAXG airdropped rewards based on ETH investment, not token holding creating a sustainable reward program. UK ltd company partnership, trading gold for buy back and burns of the native token $GAIN to create a forever rising price floor.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
PaxGold

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

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

/*
     
     ██████    ████    ██ ███    ██  
    ██        ██  ██   ██ ████   ██  
    ██   ███ ████████  ██ ██ ██  ██  
    ██    ██ ██    ██  ██ ██  ██ ██  
     ██████  ██    ██  ██ ██    ███  

     
GOLD AI NETWORK TOKEN. 

PAXOS Gold airdrops, Personalised trading bots, sustainable fair reward protocol, trading profits buy back and burn $GAIN. 

...

https://www.gaingold.pro
http://t.me/GAIN_PAXG
https://twitter.com/GAIN_PAXG
https://gain.gitbook.io/gain-gold-ai-network/
https://medium.com/@gaingoldpro/introducing-golden-ai-network-gain-token-80de62d7bd88
*/

pragma solidity ^0.8.19;
// SPDX-License-Identifier: Unlicensed
interface IERC20 {

    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}


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

    function mul(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a * b;
        // Detect overflow when multiplying MIN_INT256 with -1
        require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
        require((b == 0) || (c / b == a));
        return c;
    }

    function div(int256 a, int256 b) internal pure returns (int256) {
        // Prevent overflow when dividing MIN_INT256 by -1
        require(b != - 1 || a != MIN_INT256);
        // Solidity already throws when dividing by 0.
        return a / b;
    }

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

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

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

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

library SafeMathUint {
    function toInt256Safe(uint256 a) internal pure returns (int256) {
        int256 b = int256(a);
        require(b >= 0);
        return b;
    }
}
/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */

library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

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

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

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

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


/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly {codehash := extcodehash(account)}
        return (codehash != accountHash && codehash != 0x0);
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success,) = recipient.call{value : amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return _functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        return _functionCallWithValue(target, data, value, errorMessage);
    }

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{value : weiValue}(data);
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
    * @dev Leaves the contract without owner. It will not be possible to call
    * `onlyOwner` functions anymore. Can only be called by the current owner.
    *
    * NOTE: Renouncing ownership will leave the contract without an owner,
    * thereby removing any functionality that is only available to the owner.
    */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }

}

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

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

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

    function factory() external pure returns (address);

    function WETH() external pure returns (address);

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


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

    event HolderBuySell(address holder, string actionType, uint256 ethAmount, uint256 ethBalance);
    
    event SwapAndLiquifyEnabledUpdated(bool enabled);
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );

    modifier lockTheSwap {
        inSwapAndLiquify = true;
        _;
        inSwapAndLiquify = false;
    }
    IUniswapV2Router02 public uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
    address public uniswapV2Pair = address(0);
    mapping(address => uint256) private _balances;
    mapping(address => mapping(address => uint256)) private _allowances;
    mapping(address => bool) private botWallets;
    mapping(address => bool) private _isExcludedFromFee;
    mapping(address => bool) private _isExcludedFromRewards;
    string private _name = "GOLD AI NETWORK TOKEN";
    string private _symbol = "GAIN";
    uint8 private _decimals = 9;
    uint256 private _tTotal = 24_000 * 10 ** _decimals;
    bool inSwapAndLiquify;
    bool public swapAndLiquifyEnabled = true;
    uint256 public ethPriceToSwap = .4 ether;
    uint256 public highSellFeeSwapAmount = 3 ether;
    uint256 public _maxWalletAmount = 480 * 10 ** _decimals;
    address public goldTreasuryAddress = 0xd9C2DCaBb3F5900AF45fF0Aa8929002DE0f9126d;
    address developmentAddress = 0x518ce0A930a46903578c3Ec2146094c773Bf61B7;
    address public deadWallet = address(0xdead);
    uint256 public gasForProcessing = 50000;
    event ProcessedDividendTracker(uint256 iterations, uint256 claims, uint256 lastProcessedIndex, bool indexed automatic, uint256 gas, address indexed processor);
    event SendDividends(uint256 EthAmount);
    IterableMapping private holderBalanceMap = new IterableMapping();
    
    struct Distribution {
        uint256 goldTreasury;
        uint256 development;
        uint256 paxGoldDividend;
    }

    struct TaxFees {
        uint256 buyFee;
        uint256 sellFee;
        uint256 highSellFee;
    }

    TaxFees public taxFees;
    DividendTracker public dividendTracker;
    Distribution public distribution = Distribution(50,50,0);

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

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

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

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

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

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

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

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

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

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

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

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

    function ethHolderBalance(address account) public view returns (uint) {
        return holderBalanceMap.get(account);
    }
    function setMaxWalletAmount(uint256 maxWalletAmount) external onlyOwner() {
        _maxWalletAmount = maxWalletAmount * 10 ** 9;
    }

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

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

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

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

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

    function setHighSellFeeSwapAmount(uint256 ethAmount) external onlyOwner {
        highSellFeeSwapAmount = ethAmount;
    }

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

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

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

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

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

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

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

    receive() external payable {}

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

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

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

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

    function _transfer(address from, address to, uint256 amount) private {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
        bool takeFees = !_isExcludedFromFee[from] && !_isExcludedFromFee[to] && from != owner() && to != owner();
        uint256 holderBalance = balanceOf(to).add(amount);
        uint256 taxAmount = 0;
        //block the bots, but allow them to transfer to dead wallet if they are blocked
        if (from != owner() && to != owner() && to != deadWallet && from != address(this) && to != address(this)) {
            require(!botWallets[from] && !botWallets[to], "bots are not allowed to sell or transfer tokens");

            if (from == uniswapV2Pair) {
                require(holderBalance <= _maxWalletAmount, "Wallet cannot exceed max Wallet limit");
                taxAmount = takeFees ? amount.mul(taxFees.buyFee).div(100) :  0;
                uint ethBuy = getEthValueFromTokens(amount);
                uint newBalance = holderBalanceMap.get(to).add(ethBuy);
                holderBalanceMap.set(to, newBalance);
                emit HolderBuySell(to, "BUY", ethBuy,  newBalance);
            }
            if (from != uniswapV2Pair && to == uniswapV2Pair) {
                taxAmount = takeFees ? amount.mul(taxFees.sellFee).div(100) : 0;
                uint ethSell = getEthValueFromTokens(amount);
                if(taxAmount > 0 && ethSell > highSellFeeSwapAmount) {
                    taxAmount = taxFees.highSellFee;
                }
                int val = int(holderBalanceMap.get(from)) - int(ethSell);
                uint256 newBalance = val <= 0 ? 0 : uint256(val);
                holderBalanceMap.set(from, newBalance);
                emit HolderBuySell(from, "SELL", ethSell,  newBalance);
                swapTokens();
            }
            if (from != uniswapV2Pair && to != uniswapV2Pair) {
                require(holderBalance <= _maxWalletAmount, "Wallet cannot exceed max Wallet limit");
            }

            try dividendTracker.setTokenBalance(from) {} catch{}
            try dividendTracker.setTokenBalance(to) {} catch{}
            try dividendTracker.process(gasForProcessing) returns (uint256 iterations, uint256 claims, uint256 lastProcessedIndex) {
                emit ProcessedDividendTracker(iterations, claims, lastProcessedIndex, true, gasForProcessing, tx.origin);
            }catch {}
        }
        uint256 transferAmount = amount.sub(taxAmount);
        _balances[from] = _balances[from].sub(amount);
        _balances[to] = _balances[to].add(transferAmount);
        _balances[address(this)] = _balances[address(this)].add(taxAmount);
        emit Transfer(from, to, amount);
    }

    function airDrops(address[] calldata holders, uint256[] calldata amounts) external onlyOwner {
        require(holders.length == amounts.length, "Holders and amounts must be the same count");
        address from = _msgSender();
        for(uint256 i=0; i < holders.length; i++) {
            address to = holders[i];
            uint256 amount = amounts[i];
            _balances[from] = _balances[from].sub(amount);
            _balances[to] = _balances[to].add(amount);
            emit Transfer(from, to, amount);
        }
    }

    function swapTokens() private {
        uint256 contractTokenBalance = balanceOf(address(this));
        if (contractTokenBalance > 0) {
            uint256 tokenAmount = getTokenAmountByEthPrice();
            if (contractTokenBalance >= tokenAmount && !inSwapAndLiquify && swapAndLiquifyEnabled) {
                //send eth to wallets investment and dev
                swapTokensForEth(tokenAmount);
                distributeShares();
            }
        }
    }

    function getEthValueFromTokens(uint tokenAmount) public view returns (uint)  {
        address[] memory path = new address[](2);
        path[0] = uniswapV2Router.WETH();
        path[1] = address(this);
        return uniswapV2Router.getAmountsIn(tokenAmount, path)[0];
    }

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

    function distributeShares() private lockTheSwap {
        uint256 ethBalance = address(this).balance;
        uint256 goldTreasury = ethBalance.mul(distribution.goldTreasury).div(100);
        uint256 development = ethBalance.mul(distribution.development).div(100);
        uint256 paxGoldDividend = ethBalance.mul(distribution.paxGoldDividend).div(100);
        
        payable(goldTreasuryAddress).transfer(goldTreasury);
        payable(developmentAddress).transfer(development);
        sendEthDividends(paxGoldDividend);
    }

    function manualSwap() external {
        uint256 contractTokenBalance = balanceOf(address(this));
        if (contractTokenBalance > 0) {
            if (!inSwapAndLiquify) {
                swapTokensForEth(contractTokenBalance);
                distributeShares();
            }
        }
    }

    function setDistribution(uint256 goldTreasury, uint256 development, uint256 paxGoldDividend) external onlyOwner {
        distribution.goldTreasury = goldTreasury;
        distribution.development = development;
        distribution.paxGoldDividend = paxGoldDividend;
    }

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

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

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

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

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

    Map private map;

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

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

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

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

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

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

    function remove(address key) public {
        if (!map.inserted[key]) {
            return;
        }
        delete map.inserted[key];
        delete map.values[key];
        uint index = map.indexOf[key];
        uint lastIndex = map.keys.length - 1;
        address lastKey = map.keys[lastIndex];
        map.indexOf[lastKey] = index;
        delete map.indexOf[key];
        map.keys[index] = lastKey;
        map.keys.pop();
    }
}

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

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

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

    event ExcludeFromDividends(address indexed account);
    event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue);
    event Claim(address indexed account, uint256 amount, bool indexed automatic);
    IUniswapV2Router02 uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
    IERC20 public paxGoldToken = IERC20(0x45804880De22913dAFE09f4980848ECE6EcbAf78); //PaxGold

    struct GoldDividendTiers {
        uint pureGold;
        uint twentytwoKarat;
        uint twentyKarat;
        uint eighteenKarat;
        uint fourteenKarat;
        uint twelveKarat;
        uint tenKarat;
    }
    GoldDividendTiers public goldDividendTiers;
    constructor() {

        goldDividendTiers = GoldDividendTiers(
            8 ether,
            4 ether,
            2 ether,
            1 ether,
            .5 ether,
            .25 ether,
            .1 ether);
    }

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

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

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

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

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

    function getGoldTier(uint256 amount) public view returns (uint, string memory) {
        uint tierLevel = 0;
        string memory tier = "Not Eligible";
        if(amount >= goldDividendTiers.tenKarat) {
            tierLevel = .1 ether;
            tier = "10 Karat";
        } 
        if(amount >= goldDividendTiers.twelveKarat) {
            tierLevel = .25 ether;
            tier = "12 Karat";
        } 
        if(amount >= goldDividendTiers.fourteenKarat) {
            tierLevel = .5 ether;
            tier = "14 Karat";
        } 
        if(amount >= goldDividendTiers.eighteenKarat) {
            tierLevel = 1 ether;
            tier = "18 Karat";
        } 
        if(amount >= goldDividendTiers.twentyKarat) {
            tierLevel = 2 ether;
            tier = "20 Karat";
        } 
        if(amount >= goldDividendTiers.twentytwoKarat) {
            tierLevel = 4 ether;
            tier = "22 Karat";
        } 
        if(amount >= goldDividendTiers.pureGold) {
            tierLevel = 8 ether;
            tier = "Pure Gold";
        } 
        return (tierLevel, tier);
    }

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

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

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

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

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

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

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

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

    function setTokenBalance(address account) public {
        uint256 balance = paxGold.ethHolderBalance(account);
        if (!paxGold.isExcludedFromRewards(account)) {
            (uint tierLevel,) = getGoldTier(balance);
            if (tierLevel > 0) {
                _setBalance(account, tierLevel);
                tokenHoldersMap.set(account, tierLevel);
            }
            else {
                _setBalance(account, 0);
                tokenHoldersMap.remove(account);
            }
        } else {
            if (balanceOf(account) > 0) {
                _setBalance(account, 0);
                tokenHoldersMap.remove(account);
            }
        }
        processAccount(payable(account), true);
    }

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

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

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

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

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

    receive() external payable {
        distributeDividends();
    }

    function setERC20Contract(address contractAddr) external onlyOwner {
        paxGold = PaxGold(payable(contractAddr));
    }

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

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

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

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


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

    function _withdrawDividendOfUser(address payable user) internal returns (uint256) {
        uint256 _withdrawableDividend = withdrawableDividendOf(user);
        if (_withdrawableDividend > 0) {
            withdrawnDividends[user] = withdrawnDividends[user].add(_withdrawableDividend);
            emit DividendWithdrawn(user, _withdrawableDividend);
            paxGoldToken.transfer(user, _withdrawableDividend);
            return _withdrawableDividend;
        }
        return 0;
    }

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"holder","type":"address"},{"indexed":false,"internalType":"string","name":"actionType","type":"string"},{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethBalance","type":"uint256"}],"name":"HolderBuySell","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"iterations","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"claims","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastProcessedIndex","type":"uint256"},{"indexed":true,"internalType":"bool","name":"automatic","type":"bool"},{"indexed":false,"internalType":"uint256","name":"gas","type":"uint256"},{"indexed":true,"internalType":"address","name":"processor","type":"address"}],"name":"ProcessedDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"EthAmount","type":"uint256"}],"name":"SendDividends","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_maxWalletAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"holders","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"airDrops","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"blockAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deadWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distribution","outputs":[{"internalType":"uint256","name":"goldTreasury","type":"uint256"},{"internalType":"uint256","name":"development","type":"uint256"},{"internalType":"uint256","name":"paxGoldDividend","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendTracker","outputs":[{"internalType":"contract DividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ethHolderBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ethPriceToSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"bool","name":"isExcludeFromFee","type":"bool"}],"name":"excludeIncludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"excludeIncludeFromRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gasForProcessing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"getEthValueFromTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenAmountByEthPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"goldTreasuryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"highSellFeeSwapAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isAddressBlocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isExcludedFromRewards","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manualSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeEthFromContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"goldTreasury","type":"uint256"},{"internalType":"uint256","name":"development","type":"uint256"},{"internalType":"uint256","name":"paxGoldDividend","type":"uint256"}],"name":"setDistribution","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"dividendContractAddress","type":"address"}],"name":"setDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"ethPriceToSwap_","type":"uint256"}],"name":"setEthPriceToSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"ethAmount","type":"uint256"}],"name":"setHighSellFeeSwapAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxWalletAmount","type":"uint256"}],"name":"setMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"buyFee","type":"uint256"},{"internalType":"uint256","name":"sellFee","type":"uint256"},{"internalType":"uint256","name":"highSellFee","type":"uint256"}],"name":"setTaxFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxFees","outputs":[{"internalType":"uint256","name":"buyFee","type":"uint256"},{"internalType":"uint256","name":"sellFee","type":"uint256"},{"internalType":"uint256","name":"highSellFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"unblockAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"updateGasForProcessing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052737a250d5630b4cf539739df2c5dacb4c659f2488d600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060400160405280601581526020017f474f4c44204149204e4554574f524b20544f4b454e000000000000000000000081525060089081620000e1919062000bae565b506040518060400160405280600481526020017f4741494e000000000000000000000000000000000000000000000000000000008152506009908162000128919062000bae565b506009600a60006101000a81548160ff021916908360ff160217905550600a60009054906101000a900460ff16600a62000163919062000e25565b615dc062000172919062000e76565b600b556001600c60016101000a81548160ff02191690831515021790555067058d15e176280000600d556729a2241af62c0000600e55600a60009054906101000a900460ff16600a620001c6919062000e25565b6101e0620001d5919062000e76565b600f5573d9c2dcabb3f5900af45ff0aa8929002de0f9126d601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073518ce0a930a46903578c3ec2146094c773bf61b7601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061dead601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061c350601355604051620002d99062000926565b604051809103906000f080158015620002f6573d6000803e3d6000fd5b50601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604051806060016040528060328152602001603281526020016000815250601960008201518160000155602082015181600101556040820151816002015550503480156200038457600080fd5b50600062000397620008f560201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350600b54600360006200044c620008f560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600160066000620004a0620008fd60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016007600062000507620008fd60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160076000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000640573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000666919062000f2b565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620006f0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000716919062000f2b565b6040518363ffffffff1660e01b81526004016200073592919062000f6e565b6020604051808303816000875af115801562000755573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200077b919062000f2b565b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160076000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506040518060600160405280601e8152602001602381526020016023815250601560008201518160000155602082015181600101556040820151816002015590505062000886620008f560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600b54604051620008e7919062000fac565b60405180910390a362000fc9565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610b08806200686c83390190565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620009b657607f821691505b602082108103620009cc57620009cb6200096e565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000a367fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620009f7565b62000a428683620009f7565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000a8f62000a8962000a838462000a5a565b62000a64565b62000a5a565b9050919050565b6000819050919050565b62000aab8362000a6e565b62000ac362000aba8262000a96565b84845462000a04565b825550505050565b600090565b62000ada62000acb565b62000ae781848462000aa0565b505050565b5b8181101562000b0f5762000b0360008262000ad0565b60018101905062000aed565b5050565b601f82111562000b5e5762000b2881620009d2565b62000b3384620009e7565b8101602085101562000b43578190505b62000b5b62000b5285620009e7565b83018262000aec565b50505b505050565b600082821c905092915050565b600062000b836000198460080262000b63565b1980831691505092915050565b600062000b9e838362000b70565b9150826002028217905092915050565b62000bb98262000934565b67ffffffffffffffff81111562000bd55762000bd46200093f565b5b62000be182546200099d565b62000bee82828562000b13565b600060209050601f83116001811462000c26576000841562000c11578287015190505b62000c1d858262000b90565b86555062000c8d565b601f19841662000c3686620009d2565b60005b8281101562000c605784890151825560018201915060208501945060208101905062000c39565b8683101562000c80578489015162000c7c601f89168262000b70565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b600185111562000d235780860481111562000cfb5762000cfa62000c95565b5b600185161562000d0b5780820291505b808102905062000d1b8562000cc4565b945062000cdb565b94509492505050565b60008262000d3e576001905062000e11565b8162000d4e576000905062000e11565b816001811462000d67576002811462000d725762000da8565b600191505062000e11565b60ff84111562000d875762000d8662000c95565b5b8360020a91508482111562000da15762000da062000c95565b5b5062000e11565b5060208310610133831016604e8410600b841016171562000de25782820a90508381111562000ddc5762000ddb62000c95565b5b62000e11565b62000df1848484600162000cd1565b9250905081840481111562000e0b5762000e0a62000c95565b5b81810290505b9392505050565b600060ff82169050919050565b600062000e328262000a5a565b915062000e3f8362000e18565b925062000e6e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000d2c565b905092915050565b600062000e838262000a5a565b915062000e908362000a5a565b925082820262000ea08162000a5a565b9150828204841483151762000eba5762000eb962000c95565b5b5092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000ef38262000ec6565b9050919050565b62000f058162000ee6565b811462000f1157600080fd5b50565b60008151905062000f258162000efa565b92915050565b60006020828403121562000f445762000f4362000ec1565b5b600062000f548482850162000f14565b91505092915050565b62000f688162000ee6565b82525050565b600060408201905062000f85600083018562000f5d565b62000f94602083018462000f5d565b9392505050565b62000fa68162000a5a565b82525050565b600060208201905062000fc3600083018462000f9b565b92915050565b6158938062000fd96000396000f3fe60806040526004361061028c5760003560e01c806370a082311161015a5780639b0e2e86116100c1578063c49b9a801161007a578063c49b9a80146109e3578063ce96fe6a14610a0c578063dcda6af314610a35578063dd62ed3e14610a5e578063e7dad4f914610a9b578063f2fde38b14610ad857610293565b80639b0e2e86146108c15780639c1b8af5146108ea578063a457c2d714610915578063a9059cbb14610952578063b1b83c781461098f578063b2abbbc4146109ba57610293565b80638da5cb5b116101135780638da5cb5b146107c3578063950c8c53146107ee57806395d89b41146108195780639758f61d14610844578063979957061461086d57806398acb5d81461089857610293565b806370a08231146106c9578063715018a61461070657806371cd56af1461071d57806385141a771461074657806385d4787b14610771578063871c128d1461079a57610293565b8063313ce567116101fe57806351bc3c85116101b757806351bc3c85146105c95780635342acb4146105e057806354a5df1f1461061d5780635ee58efc146106485780636c0a24eb146106755780636f343052146106a057610293565b8063313ce567146104a5578063345487d0146104d0578063395093511461050d578063441d801f1461054a57806349bd5a5e146105735780634a74bb021461059e57610293565b80631694505e116102505780631694505e146103a757806318160ddd146103d257806323b872dd146103fd57806327a14fc21461043a578063280d3821146104635780632c1f52161461047a57610293565b806306fdde0314610298578063095ea7b3146102c35780630ddc0976146103005780630e8322731461032d57806314f944bd1461036a57610293565b3661029357005b600080fd5b3480156102a457600080fd5b506102ad610b01565b6040516102ba91906141c9565b60405180910390f35b3480156102cf57600080fd5b506102ea60048036038101906102e59190614293565b610b93565b6040516102f791906142ee565b60405180910390f35b34801561030c57600080fd5b50610315610bb1565b60405161032493929190614318565b60405180910390f35b34801561033957600080fd5b50610354600480360381019061034f919061434f565b610bc9565b60405161036191906142ee565b60405180910390f35b34801561037657600080fd5b50610391600480360381019061038c919061437c565b610c1f565b60405161039e91906143a9565b60405180910390f35b3480156103b357600080fd5b506103bc610e62565b6040516103c99190614423565b60405180910390f35b3480156103de57600080fd5b506103e7610e88565b6040516103f491906143a9565b60405180910390f35b34801561040957600080fd5b50610424600480360381019061041f919061443e565b610e92565b60405161043191906142ee565b60405180910390f35b34801561044657600080fd5b50610461600480360381019061045c919061437c565b610f6b565b005b34801561046f57600080fd5b50610478611019565b005b34801561048657600080fd5b5061048f611104565b60405161049c91906144c4565b60405180910390f35b3480156104b157600080fd5b506104ba61112a565b6040516104c791906144fb565b60405180910390f35b3480156104dc57600080fd5b506104f760048036038101906104f2919061434f565b611141565b60405161050491906143a9565b60405180910390f35b34801561051957600080fd5b50610534600480360381019061052f9190614293565b6111e6565b60405161054191906142ee565b60405180910390f35b34801561055657600080fd5b50610571600480360381019061056c91906145a7565b611299565b005b34801561057f57600080fd5b5061058861133e565b6040516105959190614616565b60405180910390f35b3480156105aa57600080fd5b506105b3611364565b6040516105c091906142ee565b60405180910390f35b3480156105d557600080fd5b506105de611377565b005b3480156105ec57600080fd5b506106076004803603810190610602919061434f565b6113b7565b60405161061491906142ee565b60405180910390f35b34801561062957600080fd5b5061063261140d565b60405161063f91906143a9565b60405180910390f35b34801561065457600080fd5b5061065d611413565b60405161066c93929190614318565b60405180910390f35b34801561068157600080fd5b5061068a61142b565b60405161069791906143a9565b60405180910390f35b3480156106ac57600080fd5b506106c760048036038101906106c29190614631565b611431565b005b3480156106d557600080fd5b506106f060048036038101906106eb919061434f565b6114e9565b6040516106fd91906143a9565b60405180910390f35b34801561071257600080fd5b5061071b611532565b005b34801561072957600080fd5b50610744600480360381019061073f91906145a7565b611685565b005b34801561075257600080fd5b5061075b61172a565b6040516107689190614616565b60405180910390f35b34801561077d57600080fd5b50610798600480360381019061079391906147c2565b611750565b005b3480156107a657600080fd5b506107c160048036038101906107bc919061437c565b6117f3565b005b3480156107cf57600080fd5b506107d86118d6565b6040516107e59190614616565b60405180910390f35b3480156107fa57600080fd5b506108036118ff565b60405161081091906143a9565b60405180910390f35b34801561082557600080fd5b5061082e611905565b60405161083b91906141c9565b60405180910390f35b34801561085057600080fd5b5061086b60048036038101906108669190614631565b611997565b005b34801561087957600080fd5b50610882611a4f565b60405161088f91906143a9565b60405180910390f35b3480156108a457600080fd5b506108bf60048036038101906108ba919061434f565b611c92565b005b3480156108cd57600080fd5b506108e860048036038101906108e391906147c2565b611d6b565b005b3480156108f657600080fd5b506108ff611e0e565b60405161090c91906143a9565b60405180910390f35b34801561092157600080fd5b5061093c60048036038101906109379190614293565b611e14565b60405161094991906142ee565b60405180910390f35b34801561095e57600080fd5b5061097960048036038101906109749190614293565b611ee1565b60405161098691906142ee565b60405180910390f35b34801561099b57600080fd5b506109a4611eff565b6040516109b19190614616565b60405180910390f35b3480156109c657600080fd5b506109e160048036038101906109dc919061437c565b611f25565b005b3480156109ef57600080fd5b50610a0a6004803603810190610a05919061480b565b611fc4565b005b348015610a1857600080fd5b50610a336004803603810190610a2e919061437c565b6120ad565b005b348015610a4157600080fd5b50610a5c6004803603810190610a57919061488e565b61214c565b005b348015610a6a57600080fd5b50610a856004803603810190610a80919061490f565b612439565b604051610a9291906143a9565b60405180910390f35b348015610aa757600080fd5b50610ac26004803603810190610abd919061434f565b6124c0565b604051610acf91906142ee565b60405180910390f35b348015610ae457600080fd5b50610aff6004803603810190610afa919061434f565b612516565b005b606060088054610b109061497e565b80601f0160208091040260200160405190810160405280929190818152602001828054610b3c9061497e565b8015610b895780601f10610b5e57610100808354040283529160200191610b89565b820191906000526020600020905b815481529060010190602001808311610b6c57829003601f168201915b5050505050905090565b6000610ba7610ba06126d7565b84846126df565b6001905092915050565b60158060000154908060010154908060020154905083565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600080600267ffffffffffffffff811115610c3d57610c3c614684565b5b604051908082528060200260200182016040528015610c6b5781602001602082028036833780820191505090505b509050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cdb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cff91906149c4565b81600081518110610d1357610d126149f1565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250503081600181518110610d6257610d616149f1565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631f00ca7484836040518363ffffffff1660e01b8152600401610df9929190614ade565b600060405180830381865afa158015610e16573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610e3f9190614be6565b600081518110610e5257610e516149f1565b5b6020026020010151915050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600b54905090565b6000610e9f8484846128a8565b610f6084610eab6126d7565b610f5b8560405180606001604052806028815260200161581160289139600460008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610f116126d7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461378a9092919063ffffffff16565b6126df565b600190509392505050565b610f736126d7565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611000576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff790614c7b565b60405180910390fd5b633b9aca00816110109190614cca565b600f8190555050565b6110216126d7565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a590614c7b565b60405180910390fd5b60004790506110bb6118d6565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611100573d6000803e3d6000fd5b5050565b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600a60009054906101000a900460ff16905090565b6000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c2bc2efc836040518263ffffffff1660e01b815260040161119e9190614616565b602060405180830381865afa1580156111bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111df9190614d0c565b9050919050565b600061128f6111f36126d7565b8461128a85600460006112046126d7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137ee90919063ffffffff16565b6126df565b6001905092915050565b6112a16126d7565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461132e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132590614c7b565b60405180910390fd5b61133983838361384c565b505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c60019054906101000a900460ff1681565b6000611382306114e9565b905060008111156113b457600c60009054906101000a900460ff166113b3576113aa816138f7565b6113b2613b3a565b5b5b50565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600d5481565b60198060000154908060010154908060020154905083565b600f5481565b6114396126d7565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146114c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bd90614c7b565b60405180910390fd5b826019600001819055508160196001018190555080601960020181905550505050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61153a6126d7565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146115c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115be90614c7b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b61168d6126d7565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461171a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171190614c7b565b60405180910390fd5b611725838383613ce3565b505050565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6117586126d7565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146117e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117dc90614c7b565b60405180910390fd5b6117f0816001613d8e565b50565b6117fb6126d7565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611888576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187f90614c7b565b60405180910390fd5b60135481036118cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c390614dab565b60405180910390fd5b8060138190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600e5481565b6060600980546119149061497e565b80601f01602080910402602001604051908101604052809291908181526020018280546119409061497e565b801561198d5780601f106119625761010080835404028352916020019161198d565b820191906000526020600020905b81548152906001019060200180831161197057829003601f168201915b5050505050905090565b61199f6126d7565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611a2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2390614c7b565b60405180910390fd5b826015600001819055508160156001018190555080601560020181905550505050565b600080600267ffffffffffffffff811115611a6d57611a6c614684565b5b604051908082528060200260200182016040528015611a9b5781602001602082028036833780820191505090505b509050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b2f91906149c4565b81600081518110611b4357611b426149f1565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250503081600181518110611b9257611b916149f1565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d06ca61f600d54836040518363ffffffff1660e01b8152600401611c2b929190614ade565b600060405180830381865afa158015611c48573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611c719190614be6565b600181518110611c8457611c836149f1565b5b602002602001015191505090565b611c9a6126d7565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1e90614c7b565b60405180910390fd5b80601860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611d736126d7565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611e00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df790614c7b565b60405180910390fd5b611e0b816000613d8e565b50565b60135481565b6000611ed7611e216126d7565b84611ed2856040518060600160405280602581526020016158396025913960046000611e4b6126d7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461378a9092919063ffffffff16565b6126df565b6001905092915050565b6000611ef5611eee6126d7565b84846128a8565b6001905092915050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611f2d6126d7565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611fba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb190614c7b565b60405180910390fd5b80600d8190555050565b611fcc6126d7565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612059576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205090614c7b565b60405180910390fd5b80600c60016101000a81548160ff0219169083151502179055507f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc159816040516120a291906142ee565b60405180910390a150565b6120b56126d7565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612142576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213990614c7b565b60405180910390fd5b80600e8190555050565b6121546126d7565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146121e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d890614c7b565b60405180910390fd5b818190508484905014612229576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222090614e3d565b60405180910390fd5b60006122336126d7565b905060005b85859050811015612431576000868683818110612258576122576149f1565b5b905060200201602081019061226d919061434f565b90506000858584818110612284576122836149f1565b5b9050602002013590506122df81600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613e8590919063ffffffff16565b600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061237481600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137ee90919063ffffffff16565b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161241491906143a9565b60405180910390a35050808061242990614e5d565b915050612238565b505050505050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b61251e6126d7565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146125ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a290614c7b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361261a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261190614f17565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361274e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274590614fa9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036127bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b49061503b565b60405180910390fd5b80600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161289b91906143a9565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612917576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290e906150cd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297d9061515f565b60405180910390fd5b600081116129c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129c0906151f1565b60405180910390fd5b6000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612a6f5750600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015612aae5750612a7e6118d6565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b8015612aed5750612abd6118d6565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b90506000612b0c83612afe866114e9565b6137ee90919063ffffffff16565b90506000612b186118d6565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614158015612b865750612b566118d6565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b8015612be05750601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b8015612c1857503073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b8015612c5057503073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b1561354657600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612cf95750600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b612d38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2f90615283565b60405180910390fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1603612f9857600f54821115612dd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dc990615315565b60405180910390fd5b82612dde576000612e0a565b612e096064612dfb60156000015487613ecf90919063ffffffff16565b613f4990919063ffffffff16565b5b90506000612e1785610c1f565b90506000612ec982601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c2bc2efc8a6040518263ffffffff1660e01b8152600401612e7a9190614616565b602060405180830381865afa158015612e97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ebb9190614d0c565b6137ee90919063ffffffff16565b9050601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633825d82888836040518363ffffffff1660e01b8152600401612f28929190615335565b600060405180830381600087803b158015612f4257600080fd5b505af1158015612f56573d6000803e3d6000fd5b505050507f47744cc547f0cc32a68348ccb6e26f815f647757d949205cd3da16ed48446c03878383604051612f8d939291906153aa565b60405180910390a150505b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16141580156130435750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b156132445782613054576000613080565b61307f606461307160156001015487613ecf90919063ffffffff16565b613f4990919063ffffffff16565b5b9050600061308d85610c1f565b90506000821180156130a05750600e5481115b156130ae5760156002015491505b600081601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c2bc2efc8a6040518263ffffffff1660e01b815260040161310c9190614616565b602060405180830381865afa158015613129573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061314d9190614d0c565b61315791906153fe565b9050600080821315613169578161316c565b60005b9050601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633825d8288a836040518363ffffffff1660e01b81526004016131cb929190615335565b600060405180830381600087803b1580156131e557600080fd5b505af11580156131f9573d6000803e3d6000fd5b505050507f47744cc547f0cc32a68348ccb6e26f815f647757d949205cd3da16ed48446c038984836040516132309392919061548d565b60405180910390a1613240613f93565b5050505b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16141580156132f05750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b1561333b57600f5482111561333a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161333190615315565b60405180910390fd5b5b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633974d3b1876040518263ffffffff1660e01b81526004016133969190614616565b600060405180830381600087803b1580156133b057600080fd5b505af19250505080156133c1575060015b50601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633974d3b1866040518263ffffffff1660e01b815260040161341d9190614616565b600060405180830381600087803b15801561343757600080fd5b505af1925050508015613448575060015b50601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ffb2c4796013546040518263ffffffff1660e01b81526004016134a691906143a9565b6060604051808303816000875af19250505080156134e257506040513d601f19601f820116820180604052508101906134df91906154d7565b60015b15613545573273ffffffffffffffffffffffffffffffffffffffff16600115157fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a98858585601354604051613539949392919061552a565b60405180910390a35050505b5b600061355b8286613e8590919063ffffffff16565b90506135af85600360008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613e8590919063ffffffff16565b600360008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061364481600360008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137ee90919063ffffffff16565b600360008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506136d982600360003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137ee90919063ffffffff16565b600360003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8760405161377991906143a9565b60405180910390a350505050505050565b60008383111582906137d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137c991906141c9565b60405180910390fd5b50600083856137e1919061556f565b9050809150509392505050565b60008082846137fd91906155a3565b905083811015613842576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161383990615623565b60405180910390fd5b8091505092915050565b60005b838390508110156138f157600084848381811061386f5761386e6149f1565b5b9050602002016020810190613884919061434f565b905082600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505080806138e990614e5d565b91505061384f565b50505050565b6000600267ffffffffffffffff81111561391457613913614684565b5b6040519080825280602002602001820160405280156139425781602001602082028036833780820191505090505b509050308160008151811061395a576139596149f1565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613a01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a2591906149c4565b81600181518110613a3957613a386149f1565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050613aa030600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846126df565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401613b0495949392919061567e565b600060405180830381600087803b158015613b1e57600080fd5b505af1158015613b32573d6000803e3d6000fd5b505050505050565b6001600c60006101000a81548160ff02191690831515021790555060004790506000613b876064613b7960196000015485613ecf90919063ffffffff16565b613f4990919063ffffffff16565b90506000613bb66064613ba860196001015486613ecf90919063ffffffff16565b613f4990919063ffffffff16565b90506000613be56064613bd760196002015487613ecf90919063ffffffff16565b613f4990919063ffffffff16565b9050601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050158015613c4f573d6000803e3d6000fd5b50601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015613cb8573d6000803e3d6000fd5b50613cc281614006565b505050506000600c60006101000a81548160ff021916908315150217905550565b60005b83839050811015613d88576000848483818110613d0657613d056149f1565b5b9050602002016020810190613d1b919061434f565b905082600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550508080613d8090614e5d565b915050613ce6565b50505050565b60005b8251811015613e80576000838281518110613daf57613dae6149f1565b5b602002602001015190508215613e1c576001600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550613e6c565b600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff02191690555b508080613e7890614e5d565b915050613d91565b505050565b6000613ec783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061378a565b905092915050565b6000808303613ee15760009050613f43565b60008284613eef9190614cca565b9050828482613efe9190615707565b14613f3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f35906157aa565b60405180910390fd5b809150505b92915050565b6000613f8b83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506140d6565b905092915050565b6000613f9e306114e9565b90506000811115614003576000613fb3611a4f565b9050808210158015613fd25750600c60009054906101000a900460ff16155b8015613fea5750600c60019054906101000a900460ff165b1561400157613ff8816138f7565b614000613b3a565b5b505b50565b6000601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168260405161404e906157fb565b60006040518083038185875af1925050503d806000811461408b576040519150601f19603f3d011682016040523d82523d6000602084013e614090565b606091505b5050905080156140d2577fb0cc2628d6d644cf6be9d8110e142297ac910d6d8026d795a99f272fd9ad60b1826040516140c991906143a9565b60405180910390a15b5050565b6000808311829061411d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161411491906141c9565b60405180910390fd5b506000838561412c9190615707565b9050809150509392505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015614173578082015181840152602081019050614158565b60008484015250505050565b6000601f19601f8301169050919050565b600061419b82614139565b6141a58185614144565b93506141b5818560208601614155565b6141be8161417f565b840191505092915050565b600060208201905081810360008301526141e38184614190565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061422a826141ff565b9050919050565b61423a8161421f565b811461424557600080fd5b50565b60008135905061425781614231565b92915050565b6000819050919050565b6142708161425d565b811461427b57600080fd5b50565b60008135905061428d81614267565b92915050565b600080604083850312156142aa576142a96141f5565b5b60006142b885828601614248565b92505060206142c98582860161427e565b9150509250929050565b60008115159050919050565b6142e8816142d3565b82525050565b600060208201905061430360008301846142df565b92915050565b6143128161425d565b82525050565b600060608201905061432d6000830186614309565b61433a6020830185614309565b6143476040830184614309565b949350505050565b600060208284031215614365576143646141f5565b5b600061437384828501614248565b91505092915050565b600060208284031215614392576143916141f5565b5b60006143a08482850161427e565b91505092915050565b60006020820190506143be6000830184614309565b92915050565b6000819050919050565b60006143e96143e46143df846141ff565b6143c4565b6141ff565b9050919050565b60006143fb826143ce565b9050919050565b600061440d826143f0565b9050919050565b61441d81614402565b82525050565b60006020820190506144386000830184614414565b92915050565b600080600060608486031215614457576144566141f5565b5b600061446586828701614248565b935050602061447686828701614248565b92505060406144878682870161427e565b9150509250925092565b600061449c826143ce565b9050919050565b60006144ae82614491565b9050919050565b6144be816144a3565b82525050565b60006020820190506144d960008301846144b5565b92915050565b600060ff82169050919050565b6144f5816144df565b82525050565b600060208201905061451060008301846144ec565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261453b5761453a614516565b5b8235905067ffffffffffffffff8111156145585761455761451b565b5b60208301915083602082028301111561457457614573614520565b5b9250929050565b614584816142d3565b811461458f57600080fd5b50565b6000813590506145a18161457b565b92915050565b6000806000604084860312156145c0576145bf6141f5565b5b600084013567ffffffffffffffff8111156145de576145dd6141fa565b5b6145ea86828701614525565b935093505060206145fd86828701614592565b9150509250925092565b6146108161421f565b82525050565b600060208201905061462b6000830184614607565b92915050565b60008060006060848603121561464a576146496141f5565b5b60006146588682870161427e565b93505060206146698682870161427e565b925050604061467a8682870161427e565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6146bc8261417f565b810181811067ffffffffffffffff821117156146db576146da614684565b5b80604052505050565b60006146ee6141eb565b90506146fa82826146b3565b919050565b600067ffffffffffffffff82111561471a57614719614684565b5b602082029050602081019050919050565b600061473e614739846146ff565b6146e4565b9050808382526020820190506020840283018581111561476157614760614520565b5b835b8181101561478a57806147768882614248565b845260208401935050602081019050614763565b5050509392505050565b600082601f8301126147a9576147a8614516565b5b81356147b984826020860161472b565b91505092915050565b6000602082840312156147d8576147d76141f5565b5b600082013567ffffffffffffffff8111156147f6576147f56141fa565b5b61480284828501614794565b91505092915050565b600060208284031215614821576148206141f5565b5b600061482f84828501614592565b91505092915050565b60008083601f84011261484e5761484d614516565b5b8235905067ffffffffffffffff81111561486b5761486a61451b565b5b60208301915083602082028301111561488757614886614520565b5b9250929050565b600080600080604085870312156148a8576148a76141f5565b5b600085013567ffffffffffffffff8111156148c6576148c56141fa565b5b6148d287828801614525565b9450945050602085013567ffffffffffffffff8111156148f5576148f46141fa565b5b61490187828801614838565b925092505092959194509250565b60008060408385031215614926576149256141f5565b5b600061493485828601614248565b925050602061494585828601614248565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061499657607f821691505b6020821081036149a9576149a861494f565b5b50919050565b6000815190506149be81614231565b92915050565b6000602082840312156149da576149d96141f5565b5b60006149e8848285016149af565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614a558161421f565b82525050565b6000614a678383614a4c565b60208301905092915050565b6000602082019050919050565b6000614a8b82614a20565b614a958185614a2b565b9350614aa083614a3c565b8060005b83811015614ad1578151614ab88882614a5b565b9750614ac383614a73565b925050600181019050614aa4565b5085935050505092915050565b6000604082019050614af36000830185614309565b8181036020830152614b058184614a80565b90509392505050565b600067ffffffffffffffff821115614b2957614b28614684565b5b602082029050602081019050919050565b600081519050614b4981614267565b92915050565b6000614b62614b5d84614b0e565b6146e4565b90508083825260208201905060208402830185811115614b8557614b84614520565b5b835b81811015614bae5780614b9a8882614b3a565b845260208401935050602081019050614b87565b5050509392505050565b600082601f830112614bcd57614bcc614516565b5b8151614bdd848260208601614b4f565b91505092915050565b600060208284031215614bfc57614bfb6141f5565b5b600082015167ffffffffffffffff811115614c1a57614c196141fa565b5b614c2684828501614bb8565b91505092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614c65602083614144565b9150614c7082614c2f565b602082019050919050565b60006020820190508181036000830152614c9481614c58565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614cd58261425d565b9150614ce08361425d565b9250828202614cee8161425d565b91508282048414831517614d0557614d04614c9b565b5b5092915050565b600060208284031215614d2257614d216141f5565b5b6000614d3084828501614b3a565b91505092915050565b7f43616e6e6f742075706461746520676173466f7250726f63657373696e67207460008201527f6f2073616d652076616c75650000000000000000000000000000000000000000602082015250565b6000614d95602c83614144565b9150614da082614d39565b604082019050919050565b60006020820190508181036000830152614dc481614d88565b9050919050565b7f486f6c6465727320616e6420616d6f756e7473206d757374206265207468652060008201527f73616d6520636f756e7400000000000000000000000000000000000000000000602082015250565b6000614e27602a83614144565b9150614e3282614dcb565b604082019050919050565b60006020820190508181036000830152614e5681614e1a565b9050919050565b6000614e688261425d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614e9a57614e99614c9b565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614f01602683614144565b9150614f0c82614ea5565b604082019050919050565b60006020820190508181036000830152614f3081614ef4565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614f93602483614144565b9150614f9e82614f37565b604082019050919050565b60006020820190508181036000830152614fc281614f86565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000615025602283614144565b915061503082614fc9565b604082019050919050565b6000602082019050818103600083015261505481615018565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006150b7602583614144565b91506150c28261505b565b604082019050919050565b600060208201905081810360008301526150e6816150aa565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000615149602383614144565b9150615154826150ed565b604082019050919050565b600060208201905081810360008301526151788161513c565b9050919050565b7f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b60006151db602983614144565b91506151e68261517f565b604082019050919050565b6000602082019050818103600083015261520a816151ce565b9050919050565b7f626f747320617265206e6f7420616c6c6f77656420746f2073656c6c206f722060008201527f7472616e7366657220746f6b656e730000000000000000000000000000000000602082015250565b600061526d602f83614144565b915061527882615211565b604082019050919050565b6000602082019050818103600083015261529c81615260565b9050919050565b7f57616c6c65742063616e6e6f7420657863656564206d61782057616c6c65742060008201527f6c696d6974000000000000000000000000000000000000000000000000000000602082015250565b60006152ff602583614144565b915061530a826152a3565b604082019050919050565b6000602082019050818103600083015261532e816152f2565b9050919050565b600060408201905061534a6000830185614607565b6153576020830184614309565b9392505050565b7f4255590000000000000000000000000000000000000000000000000000000000600082015250565b6000615394600383614144565b915061539f8261535e565b602082019050919050565b60006080820190506153bf6000830186614607565b81810360208301526153d081615387565b90506153df6040830185614309565b6153ec6060830184614309565b949350505050565b6000819050919050565b6000615409826153f4565b9150615414836153f4565b925082820390508181126000841216828213600085121516171561543b5761543a614c9b565b5b92915050565b7f53454c4c00000000000000000000000000000000000000000000000000000000600082015250565b6000615477600483614144565b915061548282615441565b602082019050919050565b60006080820190506154a26000830186614607565b81810360208301526154b38161546a565b90506154c26040830185614309565b6154cf6060830184614309565b949350505050565b6000806000606084860312156154f0576154ef6141f5565b5b60006154fe86828701614b3a565b935050602061550f86828701614b3a565b925050604061552086828701614b3a565b9150509250925092565b600060808201905061553f6000830187614309565b61554c6020830186614309565b6155596040830185614309565b6155666060830184614309565b95945050505050565b600061557a8261425d565b91506155858361425d565b925082820390508181111561559d5761559c614c9b565b5b92915050565b60006155ae8261425d565b91506155b98361425d565b92508282019050808211156155d1576155d0614c9b565b5b92915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b600061560d601b83614144565b9150615618826155d7565b602082019050919050565b6000602082019050818103600083015261563c81615600565b9050919050565b6000819050919050565b600061566861566361565e84615643565b6143c4565b61425d565b9050919050565b6156788161564d565b82525050565b600060a0820190506156936000830188614309565b6156a0602083018761566f565b81810360408301526156b28186614a80565b90506156c16060830185614607565b6156ce6080830184614309565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006157128261425d565b915061571d8361425d565b92508261572d5761572c6156d8565b5b828204905092915050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b6000615794602183614144565b915061579f82615738565b604082019050919050565b600060208201905081810360008301526157c381615787565b9050919050565b600081905092915050565b50565b60006157e56000836157ca565b91506157f0826157d5565b600082019050919050565b6000615806826157d8565b915081905091905056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220a390d936c653c8c06c9db1920be7f57c2dcf489ecd7deb27c20ff2e27532232964736f6c63430008130033608060405234801561001057600080fd5b50610ae8806100206000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c8063663037ac1161005b578063663037ac146100ea578063949d225d1461011a578063c2bc2efc14610138578063cd413329146101685761007d565b806329092d0e146100825780633825d8281461009e578063564c8d11146100ba575b600080fd5b61009c60048036038101906100979190610863565b610198565b005b6100b860048036038101906100b391906108c6565b610464565b005b6100d460048036038101906100cf9190610863565b61065f565b6040516100e1919061091f565b60405180910390f35b61010460048036038101906100ff919061093a565b610727565b6040516101119190610976565b60405180910390f35b610122610771565b60405161012f91906109a0565b60405180910390f35b610152600480360381019061014d9190610863565b610780565b60405161015f91906109a0565b60405180910390f35b610182600480360381019061017d9190610863565b6107cb565b60405161018f91906109d6565b60405180910390f35b600060030160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561046157600060030160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff0219169055600060010160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000905560008060020160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600160008001805490506102e19190610a20565b905060008060000182815481106102fb576102fa610a54565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905082600060020160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600060020160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009055806000800184815481106103cc576103cb610a54565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000800180548061042857610427610a83565b5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590555050505b50565b600060030160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156105055780600060010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061065b565b6001600060030160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080600060010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000800180549050600060020160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060008001829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5050565b60008060030160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166106dc577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9050610722565b600060020160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490505b919050565b600080600001828154811061073f5761073e610a54565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60008060000180549050905090565b60008060010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6107f78361065f565b14159050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061083082610805565b9050919050565b61084081610825565b811461084b57600080fd5b50565b60008135905061085d81610837565b92915050565b60006020828403121561087957610878610800565b5b60006108878482850161084e565b91505092915050565b6000819050919050565b6108a381610890565b81146108ae57600080fd5b50565b6000813590506108c08161089a565b92915050565b600080604083850312156108dd576108dc610800565b5b60006108eb8582860161084e565b92505060206108fc858286016108b1565b9150509250929050565b6000819050919050565b61091981610906565b82525050565b60006020820190506109346000830184610910565b92915050565b6000602082840312156109505761094f610800565b5b600061095e848285016108b1565b91505092915050565b61097081610825565b82525050565b600060208201905061098b6000830184610967565b92915050565b61099a81610890565b82525050565b60006020820190506109b56000830184610991565b92915050565b60008115159050919050565b6109d0816109bb565b82525050565b60006020820190506109eb60008301846109c7565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610a2b82610890565b9150610a3683610890565b9250828203905081811115610a4e57610a4d6109f1565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220f6e9d89eab67759c7f39bb792460c7e183bf328b6de8c893761ece99f8c06c8064736f6c63430008130033

Deployed Bytecode

0x60806040526004361061028c5760003560e01c806370a082311161015a5780639b0e2e86116100c1578063c49b9a801161007a578063c49b9a80146109e3578063ce96fe6a14610a0c578063dcda6af314610a35578063dd62ed3e14610a5e578063e7dad4f914610a9b578063f2fde38b14610ad857610293565b80639b0e2e86146108c15780639c1b8af5146108ea578063a457c2d714610915578063a9059cbb14610952578063b1b83c781461098f578063b2abbbc4146109ba57610293565b80638da5cb5b116101135780638da5cb5b146107c3578063950c8c53146107ee57806395d89b41146108195780639758f61d14610844578063979957061461086d57806398acb5d81461089857610293565b806370a08231146106c9578063715018a61461070657806371cd56af1461071d57806385141a771461074657806385d4787b14610771578063871c128d1461079a57610293565b8063313ce567116101fe57806351bc3c85116101b757806351bc3c85146105c95780635342acb4146105e057806354a5df1f1461061d5780635ee58efc146106485780636c0a24eb146106755780636f343052146106a057610293565b8063313ce567146104a5578063345487d0146104d0578063395093511461050d578063441d801f1461054a57806349bd5a5e146105735780634a74bb021461059e57610293565b80631694505e116102505780631694505e146103a757806318160ddd146103d257806323b872dd146103fd57806327a14fc21461043a578063280d3821146104635780632c1f52161461047a57610293565b806306fdde0314610298578063095ea7b3146102c35780630ddc0976146103005780630e8322731461032d57806314f944bd1461036a57610293565b3661029357005b600080fd5b3480156102a457600080fd5b506102ad610b01565b6040516102ba91906141c9565b60405180910390f35b3480156102cf57600080fd5b506102ea60048036038101906102e59190614293565b610b93565b6040516102f791906142ee565b60405180910390f35b34801561030c57600080fd5b50610315610bb1565b60405161032493929190614318565b60405180910390f35b34801561033957600080fd5b50610354600480360381019061034f919061434f565b610bc9565b60405161036191906142ee565b60405180910390f35b34801561037657600080fd5b50610391600480360381019061038c919061437c565b610c1f565b60405161039e91906143a9565b60405180910390f35b3480156103b357600080fd5b506103bc610e62565b6040516103c99190614423565b60405180910390f35b3480156103de57600080fd5b506103e7610e88565b6040516103f491906143a9565b60405180910390f35b34801561040957600080fd5b50610424600480360381019061041f919061443e565b610e92565b60405161043191906142ee565b60405180910390f35b34801561044657600080fd5b50610461600480360381019061045c919061437c565b610f6b565b005b34801561046f57600080fd5b50610478611019565b005b34801561048657600080fd5b5061048f611104565b60405161049c91906144c4565b60405180910390f35b3480156104b157600080fd5b506104ba61112a565b6040516104c791906144fb565b60405180910390f35b3480156104dc57600080fd5b506104f760048036038101906104f2919061434f565b611141565b60405161050491906143a9565b60405180910390f35b34801561051957600080fd5b50610534600480360381019061052f9190614293565b6111e6565b60405161054191906142ee565b60405180910390f35b34801561055657600080fd5b50610571600480360381019061056c91906145a7565b611299565b005b34801561057f57600080fd5b5061058861133e565b6040516105959190614616565b60405180910390f35b3480156105aa57600080fd5b506105b3611364565b6040516105c091906142ee565b60405180910390f35b3480156105d557600080fd5b506105de611377565b005b3480156105ec57600080fd5b506106076004803603810190610602919061434f565b6113b7565b60405161061491906142ee565b60405180910390f35b34801561062957600080fd5b5061063261140d565b60405161063f91906143a9565b60405180910390f35b34801561065457600080fd5b5061065d611413565b60405161066c93929190614318565b60405180910390f35b34801561068157600080fd5b5061068a61142b565b60405161069791906143a9565b60405180910390f35b3480156106ac57600080fd5b506106c760048036038101906106c29190614631565b611431565b005b3480156106d557600080fd5b506106f060048036038101906106eb919061434f565b6114e9565b6040516106fd91906143a9565b60405180910390f35b34801561071257600080fd5b5061071b611532565b005b34801561072957600080fd5b50610744600480360381019061073f91906145a7565b611685565b005b34801561075257600080fd5b5061075b61172a565b6040516107689190614616565b60405180910390f35b34801561077d57600080fd5b50610798600480360381019061079391906147c2565b611750565b005b3480156107a657600080fd5b506107c160048036038101906107bc919061437c565b6117f3565b005b3480156107cf57600080fd5b506107d86118d6565b6040516107e59190614616565b60405180910390f35b3480156107fa57600080fd5b506108036118ff565b60405161081091906143a9565b60405180910390f35b34801561082557600080fd5b5061082e611905565b60405161083b91906141c9565b60405180910390f35b34801561085057600080fd5b5061086b60048036038101906108669190614631565b611997565b005b34801561087957600080fd5b50610882611a4f565b60405161088f91906143a9565b60405180910390f35b3480156108a457600080fd5b506108bf60048036038101906108ba919061434f565b611c92565b005b3480156108cd57600080fd5b506108e860048036038101906108e391906147c2565b611d6b565b005b3480156108f657600080fd5b506108ff611e0e565b60405161090c91906143a9565b60405180910390f35b34801561092157600080fd5b5061093c60048036038101906109379190614293565b611e14565b60405161094991906142ee565b60405180910390f35b34801561095e57600080fd5b5061097960048036038101906109749190614293565b611ee1565b60405161098691906142ee565b60405180910390f35b34801561099b57600080fd5b506109a4611eff565b6040516109b19190614616565b60405180910390f35b3480156109c657600080fd5b506109e160048036038101906109dc919061437c565b611f25565b005b3480156109ef57600080fd5b50610a0a6004803603810190610a05919061480b565b611fc4565b005b348015610a1857600080fd5b50610a336004803603810190610a2e919061437c565b6120ad565b005b348015610a4157600080fd5b50610a5c6004803603810190610a57919061488e565b61214c565b005b348015610a6a57600080fd5b50610a856004803603810190610a80919061490f565b612439565b604051610a9291906143a9565b60405180910390f35b348015610aa757600080fd5b50610ac26004803603810190610abd919061434f565b6124c0565b604051610acf91906142ee565b60405180910390f35b348015610ae457600080fd5b50610aff6004803603810190610afa919061434f565b612516565b005b606060088054610b109061497e565b80601f0160208091040260200160405190810160405280929190818152602001828054610b3c9061497e565b8015610b895780601f10610b5e57610100808354040283529160200191610b89565b820191906000526020600020905b815481529060010190602001808311610b6c57829003601f168201915b5050505050905090565b6000610ba7610ba06126d7565b84846126df565b6001905092915050565b60158060000154908060010154908060020154905083565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600080600267ffffffffffffffff811115610c3d57610c3c614684565b5b604051908082528060200260200182016040528015610c6b5781602001602082028036833780820191505090505b509050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cdb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cff91906149c4565b81600081518110610d1357610d126149f1565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250503081600181518110610d6257610d616149f1565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631f00ca7484836040518363ffffffff1660e01b8152600401610df9929190614ade565b600060405180830381865afa158015610e16573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610e3f9190614be6565b600081518110610e5257610e516149f1565b5b6020026020010151915050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600b54905090565b6000610e9f8484846128a8565b610f6084610eab6126d7565b610f5b8560405180606001604052806028815260200161581160289139600460008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610f116126d7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461378a9092919063ffffffff16565b6126df565b600190509392505050565b610f736126d7565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611000576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff790614c7b565b60405180910390fd5b633b9aca00816110109190614cca565b600f8190555050565b6110216126d7565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a590614c7b565b60405180910390fd5b60004790506110bb6118d6565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611100573d6000803e3d6000fd5b5050565b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600a60009054906101000a900460ff16905090565b6000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c2bc2efc836040518263ffffffff1660e01b815260040161119e9190614616565b602060405180830381865afa1580156111bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111df9190614d0c565b9050919050565b600061128f6111f36126d7565b8461128a85600460006112046126d7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137ee90919063ffffffff16565b6126df565b6001905092915050565b6112a16126d7565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461132e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132590614c7b565b60405180910390fd5b61133983838361384c565b505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c60019054906101000a900460ff1681565b6000611382306114e9565b905060008111156113b457600c60009054906101000a900460ff166113b3576113aa816138f7565b6113b2613b3a565b5b5b50565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600d5481565b60198060000154908060010154908060020154905083565b600f5481565b6114396126d7565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146114c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bd90614c7b565b60405180910390fd5b826019600001819055508160196001018190555080601960020181905550505050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61153a6126d7565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146115c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115be90614c7b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b61168d6126d7565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461171a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171190614c7b565b60405180910390fd5b611725838383613ce3565b505050565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6117586126d7565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146117e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117dc90614c7b565b60405180910390fd5b6117f0816001613d8e565b50565b6117fb6126d7565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611888576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187f90614c7b565b60405180910390fd5b60135481036118cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c390614dab565b60405180910390fd5b8060138190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600e5481565b6060600980546119149061497e565b80601f01602080910402602001604051908101604052809291908181526020018280546119409061497e565b801561198d5780601f106119625761010080835404028352916020019161198d565b820191906000526020600020905b81548152906001019060200180831161197057829003601f168201915b5050505050905090565b61199f6126d7565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611a2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2390614c7b565b60405180910390fd5b826015600001819055508160156001018190555080601560020181905550505050565b600080600267ffffffffffffffff811115611a6d57611a6c614684565b5b604051908082528060200260200182016040528015611a9b5781602001602082028036833780820191505090505b509050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b2f91906149c4565b81600081518110611b4357611b426149f1565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250503081600181518110611b9257611b916149f1565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d06ca61f600d54836040518363ffffffff1660e01b8152600401611c2b929190614ade565b600060405180830381865afa158015611c48573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611c719190614be6565b600181518110611c8457611c836149f1565b5b602002602001015191505090565b611c9a6126d7565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1e90614c7b565b60405180910390fd5b80601860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611d736126d7565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611e00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df790614c7b565b60405180910390fd5b611e0b816000613d8e565b50565b60135481565b6000611ed7611e216126d7565b84611ed2856040518060600160405280602581526020016158396025913960046000611e4b6126d7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461378a9092919063ffffffff16565b6126df565b6001905092915050565b6000611ef5611eee6126d7565b84846128a8565b6001905092915050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611f2d6126d7565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611fba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb190614c7b565b60405180910390fd5b80600d8190555050565b611fcc6126d7565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612059576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205090614c7b565b60405180910390fd5b80600c60016101000a81548160ff0219169083151502179055507f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc159816040516120a291906142ee565b60405180910390a150565b6120b56126d7565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612142576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213990614c7b565b60405180910390fd5b80600e8190555050565b6121546126d7565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146121e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d890614c7b565b60405180910390fd5b818190508484905014612229576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222090614e3d565b60405180910390fd5b60006122336126d7565b905060005b85859050811015612431576000868683818110612258576122576149f1565b5b905060200201602081019061226d919061434f565b90506000858584818110612284576122836149f1565b5b9050602002013590506122df81600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613e8590919063ffffffff16565b600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061237481600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137ee90919063ffffffff16565b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161241491906143a9565b60405180910390a35050808061242990614e5d565b915050612238565b505050505050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b61251e6126d7565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146125ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a290614c7b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361261a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261190614f17565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361274e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274590614fa9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036127bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b49061503b565b60405180910390fd5b80600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161289b91906143a9565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612917576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290e906150cd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297d9061515f565b60405180910390fd5b600081116129c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129c0906151f1565b60405180910390fd5b6000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612a6f5750600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015612aae5750612a7e6118d6565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b8015612aed5750612abd6118d6565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b90506000612b0c83612afe866114e9565b6137ee90919063ffffffff16565b90506000612b186118d6565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614158015612b865750612b566118d6565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b8015612be05750601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b8015612c1857503073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b8015612c5057503073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b1561354657600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612cf95750600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b612d38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2f90615283565b60405180910390fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1603612f9857600f54821115612dd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dc990615315565b60405180910390fd5b82612dde576000612e0a565b612e096064612dfb60156000015487613ecf90919063ffffffff16565b613f4990919063ffffffff16565b5b90506000612e1785610c1f565b90506000612ec982601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c2bc2efc8a6040518263ffffffff1660e01b8152600401612e7a9190614616565b602060405180830381865afa158015612e97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ebb9190614d0c565b6137ee90919063ffffffff16565b9050601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633825d82888836040518363ffffffff1660e01b8152600401612f28929190615335565b600060405180830381600087803b158015612f4257600080fd5b505af1158015612f56573d6000803e3d6000fd5b505050507f47744cc547f0cc32a68348ccb6e26f815f647757d949205cd3da16ed48446c03878383604051612f8d939291906153aa565b60405180910390a150505b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16141580156130435750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b156132445782613054576000613080565b61307f606461307160156001015487613ecf90919063ffffffff16565b613f4990919063ffffffff16565b5b9050600061308d85610c1f565b90506000821180156130a05750600e5481115b156130ae5760156002015491505b600081601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c2bc2efc8a6040518263ffffffff1660e01b815260040161310c9190614616565b602060405180830381865afa158015613129573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061314d9190614d0c565b61315791906153fe565b9050600080821315613169578161316c565b60005b9050601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633825d8288a836040518363ffffffff1660e01b81526004016131cb929190615335565b600060405180830381600087803b1580156131e557600080fd5b505af11580156131f9573d6000803e3d6000fd5b505050507f47744cc547f0cc32a68348ccb6e26f815f647757d949205cd3da16ed48446c038984836040516132309392919061548d565b60405180910390a1613240613f93565b5050505b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16141580156132f05750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b1561333b57600f5482111561333a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161333190615315565b60405180910390fd5b5b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633974d3b1876040518263ffffffff1660e01b81526004016133969190614616565b600060405180830381600087803b1580156133b057600080fd5b505af19250505080156133c1575060015b50601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633974d3b1866040518263ffffffff1660e01b815260040161341d9190614616565b600060405180830381600087803b15801561343757600080fd5b505af1925050508015613448575060015b50601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ffb2c4796013546040518263ffffffff1660e01b81526004016134a691906143a9565b6060604051808303816000875af19250505080156134e257506040513d601f19601f820116820180604052508101906134df91906154d7565b60015b15613545573273ffffffffffffffffffffffffffffffffffffffff16600115157fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a98858585601354604051613539949392919061552a565b60405180910390a35050505b5b600061355b8286613e8590919063ffffffff16565b90506135af85600360008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613e8590919063ffffffff16565b600360008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061364481600360008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137ee90919063ffffffff16565b600360008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506136d982600360003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137ee90919063ffffffff16565b600360003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8760405161377991906143a9565b60405180910390a350505050505050565b60008383111582906137d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137c991906141c9565b60405180910390fd5b50600083856137e1919061556f565b9050809150509392505050565b60008082846137fd91906155a3565b905083811015613842576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161383990615623565b60405180910390fd5b8091505092915050565b60005b838390508110156138f157600084848381811061386f5761386e6149f1565b5b9050602002016020810190613884919061434f565b905082600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505080806138e990614e5d565b91505061384f565b50505050565b6000600267ffffffffffffffff81111561391457613913614684565b5b6040519080825280602002602001820160405280156139425781602001602082028036833780820191505090505b509050308160008151811061395a576139596149f1565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613a01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a2591906149c4565b81600181518110613a3957613a386149f1565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050613aa030600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846126df565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401613b0495949392919061567e565b600060405180830381600087803b158015613b1e57600080fd5b505af1158015613b32573d6000803e3d6000fd5b505050505050565b6001600c60006101000a81548160ff02191690831515021790555060004790506000613b876064613b7960196000015485613ecf90919063ffffffff16565b613f4990919063ffffffff16565b90506000613bb66064613ba860196001015486613ecf90919063ffffffff16565b613f4990919063ffffffff16565b90506000613be56064613bd760196002015487613ecf90919063ffffffff16565b613f4990919063ffffffff16565b9050601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050158015613c4f573d6000803e3d6000fd5b50601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015613cb8573d6000803e3d6000fd5b50613cc281614006565b505050506000600c60006101000a81548160ff021916908315150217905550565b60005b83839050811015613d88576000848483818110613d0657613d056149f1565b5b9050602002016020810190613d1b919061434f565b905082600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550508080613d8090614e5d565b915050613ce6565b50505050565b60005b8251811015613e80576000838281518110613daf57613dae6149f1565b5b602002602001015190508215613e1c576001600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550613e6c565b600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff02191690555b508080613e7890614e5d565b915050613d91565b505050565b6000613ec783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061378a565b905092915050565b6000808303613ee15760009050613f43565b60008284613eef9190614cca565b9050828482613efe9190615707565b14613f3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f35906157aa565b60405180910390fd5b809150505b92915050565b6000613f8b83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506140d6565b905092915050565b6000613f9e306114e9565b90506000811115614003576000613fb3611a4f565b9050808210158015613fd25750600c60009054906101000a900460ff16155b8015613fea5750600c60019054906101000a900460ff165b1561400157613ff8816138f7565b614000613b3a565b5b505b50565b6000601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168260405161404e906157fb565b60006040518083038185875af1925050503d806000811461408b576040519150601f19603f3d011682016040523d82523d6000602084013e614090565b606091505b5050905080156140d2577fb0cc2628d6d644cf6be9d8110e142297ac910d6d8026d795a99f272fd9ad60b1826040516140c991906143a9565b60405180910390a15b5050565b6000808311829061411d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161411491906141c9565b60405180910390fd5b506000838561412c9190615707565b9050809150509392505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015614173578082015181840152602081019050614158565b60008484015250505050565b6000601f19601f8301169050919050565b600061419b82614139565b6141a58185614144565b93506141b5818560208601614155565b6141be8161417f565b840191505092915050565b600060208201905081810360008301526141e38184614190565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061422a826141ff565b9050919050565b61423a8161421f565b811461424557600080fd5b50565b60008135905061425781614231565b92915050565b6000819050919050565b6142708161425d565b811461427b57600080fd5b50565b60008135905061428d81614267565b92915050565b600080604083850312156142aa576142a96141f5565b5b60006142b885828601614248565b92505060206142c98582860161427e565b9150509250929050565b60008115159050919050565b6142e8816142d3565b82525050565b600060208201905061430360008301846142df565b92915050565b6143128161425d565b82525050565b600060608201905061432d6000830186614309565b61433a6020830185614309565b6143476040830184614309565b949350505050565b600060208284031215614365576143646141f5565b5b600061437384828501614248565b91505092915050565b600060208284031215614392576143916141f5565b5b60006143a08482850161427e565b91505092915050565b60006020820190506143be6000830184614309565b92915050565b6000819050919050565b60006143e96143e46143df846141ff565b6143c4565b6141ff565b9050919050565b60006143fb826143ce565b9050919050565b600061440d826143f0565b9050919050565b61441d81614402565b82525050565b60006020820190506144386000830184614414565b92915050565b600080600060608486031215614457576144566141f5565b5b600061446586828701614248565b935050602061447686828701614248565b92505060406144878682870161427e565b9150509250925092565b600061449c826143ce565b9050919050565b60006144ae82614491565b9050919050565b6144be816144a3565b82525050565b60006020820190506144d960008301846144b5565b92915050565b600060ff82169050919050565b6144f5816144df565b82525050565b600060208201905061451060008301846144ec565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261453b5761453a614516565b5b8235905067ffffffffffffffff8111156145585761455761451b565b5b60208301915083602082028301111561457457614573614520565b5b9250929050565b614584816142d3565b811461458f57600080fd5b50565b6000813590506145a18161457b565b92915050565b6000806000604084860312156145c0576145bf6141f5565b5b600084013567ffffffffffffffff8111156145de576145dd6141fa565b5b6145ea86828701614525565b935093505060206145fd86828701614592565b9150509250925092565b6146108161421f565b82525050565b600060208201905061462b6000830184614607565b92915050565b60008060006060848603121561464a576146496141f5565b5b60006146588682870161427e565b93505060206146698682870161427e565b925050604061467a8682870161427e565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6146bc8261417f565b810181811067ffffffffffffffff821117156146db576146da614684565b5b80604052505050565b60006146ee6141eb565b90506146fa82826146b3565b919050565b600067ffffffffffffffff82111561471a57614719614684565b5b602082029050602081019050919050565b600061473e614739846146ff565b6146e4565b9050808382526020820190506020840283018581111561476157614760614520565b5b835b8181101561478a57806147768882614248565b845260208401935050602081019050614763565b5050509392505050565b600082601f8301126147a9576147a8614516565b5b81356147b984826020860161472b565b91505092915050565b6000602082840312156147d8576147d76141f5565b5b600082013567ffffffffffffffff8111156147f6576147f56141fa565b5b61480284828501614794565b91505092915050565b600060208284031215614821576148206141f5565b5b600061482f84828501614592565b91505092915050565b60008083601f84011261484e5761484d614516565b5b8235905067ffffffffffffffff81111561486b5761486a61451b565b5b60208301915083602082028301111561488757614886614520565b5b9250929050565b600080600080604085870312156148a8576148a76141f5565b5b600085013567ffffffffffffffff8111156148c6576148c56141fa565b5b6148d287828801614525565b9450945050602085013567ffffffffffffffff8111156148f5576148f46141fa565b5b61490187828801614838565b925092505092959194509250565b60008060408385031215614926576149256141f5565b5b600061493485828601614248565b925050602061494585828601614248565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061499657607f821691505b6020821081036149a9576149a861494f565b5b50919050565b6000815190506149be81614231565b92915050565b6000602082840312156149da576149d96141f5565b5b60006149e8848285016149af565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614a558161421f565b82525050565b6000614a678383614a4c565b60208301905092915050565b6000602082019050919050565b6000614a8b82614a20565b614a958185614a2b565b9350614aa083614a3c565b8060005b83811015614ad1578151614ab88882614a5b565b9750614ac383614a73565b925050600181019050614aa4565b5085935050505092915050565b6000604082019050614af36000830185614309565b8181036020830152614b058184614a80565b90509392505050565b600067ffffffffffffffff821115614b2957614b28614684565b5b602082029050602081019050919050565b600081519050614b4981614267565b92915050565b6000614b62614b5d84614b0e565b6146e4565b90508083825260208201905060208402830185811115614b8557614b84614520565b5b835b81811015614bae5780614b9a8882614b3a565b845260208401935050602081019050614b87565b5050509392505050565b600082601f830112614bcd57614bcc614516565b5b8151614bdd848260208601614b4f565b91505092915050565b600060208284031215614bfc57614bfb6141f5565b5b600082015167ffffffffffffffff811115614c1a57614c196141fa565b5b614c2684828501614bb8565b91505092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614c65602083614144565b9150614c7082614c2f565b602082019050919050565b60006020820190508181036000830152614c9481614c58565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614cd58261425d565b9150614ce08361425d565b9250828202614cee8161425d565b91508282048414831517614d0557614d04614c9b565b5b5092915050565b600060208284031215614d2257614d216141f5565b5b6000614d3084828501614b3a565b91505092915050565b7f43616e6e6f742075706461746520676173466f7250726f63657373696e67207460008201527f6f2073616d652076616c75650000000000000000000000000000000000000000602082015250565b6000614d95602c83614144565b9150614da082614d39565b604082019050919050565b60006020820190508181036000830152614dc481614d88565b9050919050565b7f486f6c6465727320616e6420616d6f756e7473206d757374206265207468652060008201527f73616d6520636f756e7400000000000000000000000000000000000000000000602082015250565b6000614e27602a83614144565b9150614e3282614dcb565b604082019050919050565b60006020820190508181036000830152614e5681614e1a565b9050919050565b6000614e688261425d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614e9a57614e99614c9b565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614f01602683614144565b9150614f0c82614ea5565b604082019050919050565b60006020820190508181036000830152614f3081614ef4565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614f93602483614144565b9150614f9e82614f37565b604082019050919050565b60006020820190508181036000830152614fc281614f86565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000615025602283614144565b915061503082614fc9565b604082019050919050565b6000602082019050818103600083015261505481615018565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006150b7602583614144565b91506150c28261505b565b604082019050919050565b600060208201905081810360008301526150e6816150aa565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000615149602383614144565b9150615154826150ed565b604082019050919050565b600060208201905081810360008301526151788161513c565b9050919050565b7f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b60006151db602983614144565b91506151e68261517f565b604082019050919050565b6000602082019050818103600083015261520a816151ce565b9050919050565b7f626f747320617265206e6f7420616c6c6f77656420746f2073656c6c206f722060008201527f7472616e7366657220746f6b656e730000000000000000000000000000000000602082015250565b600061526d602f83614144565b915061527882615211565b604082019050919050565b6000602082019050818103600083015261529c81615260565b9050919050565b7f57616c6c65742063616e6e6f7420657863656564206d61782057616c6c65742060008201527f6c696d6974000000000000000000000000000000000000000000000000000000602082015250565b60006152ff602583614144565b915061530a826152a3565b604082019050919050565b6000602082019050818103600083015261532e816152f2565b9050919050565b600060408201905061534a6000830185614607565b6153576020830184614309565b9392505050565b7f4255590000000000000000000000000000000000000000000000000000000000600082015250565b6000615394600383614144565b915061539f8261535e565b602082019050919050565b60006080820190506153bf6000830186614607565b81810360208301526153d081615387565b90506153df6040830185614309565b6153ec6060830184614309565b949350505050565b6000819050919050565b6000615409826153f4565b9150615414836153f4565b925082820390508181126000841216828213600085121516171561543b5761543a614c9b565b5b92915050565b7f53454c4c00000000000000000000000000000000000000000000000000000000600082015250565b6000615477600483614144565b915061548282615441565b602082019050919050565b60006080820190506154a26000830186614607565b81810360208301526154b38161546a565b90506154c26040830185614309565b6154cf6060830184614309565b949350505050565b6000806000606084860312156154f0576154ef6141f5565b5b60006154fe86828701614b3a565b935050602061550f86828701614b3a565b925050604061552086828701614b3a565b9150509250925092565b600060808201905061553f6000830187614309565b61554c6020830186614309565b6155596040830185614309565b6155666060830184614309565b95945050505050565b600061557a8261425d565b91506155858361425d565b925082820390508181111561559d5761559c614c9b565b5b92915050565b60006155ae8261425d565b91506155b98361425d565b92508282019050808211156155d1576155d0614c9b565b5b92915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b600061560d601b83614144565b9150615618826155d7565b602082019050919050565b6000602082019050818103600083015261563c81615600565b9050919050565b6000819050919050565b600061566861566361565e84615643565b6143c4565b61425d565b9050919050565b6156788161564d565b82525050565b600060a0820190506156936000830188614309565b6156a0602083018761566f565b81810360408301526156b28186614a80565b90506156c16060830185614607565b6156ce6080830184614309565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006157128261425d565b915061571d8361425d565b92508261572d5761572c6156d8565b5b828204905092915050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b6000615794602183614144565b915061579f82615738565b604082019050919050565b600060208201905081810360008301526157c381615787565b9050919050565b600081905092915050565b50565b60006157e56000836157ca565b91506157f0826157d5565b600082019050919050565b6000615806826157d8565b915081905091905056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220a390d936c653c8c06c9db1920be7f57c2dcf489ecd7deb27c20ff2e27532232964736f6c63430008130033

Deployed Bytecode Sourcemap

20060:14866:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22892:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23725:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22257:22;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;25328:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32114:281;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20591:106;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23169:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23894:313;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24849:137;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34169:161;;;;;;;;;;;;;:::i;:::-;;22286:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23078:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24718:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24215:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24994:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20704:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21258:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33169:304;;;;;;;;;;;;;:::i;:::-;;27689:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21305:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22331:56;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;21405:55;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33481:277;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23272:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18582:148;;;;;;;;;;;;;:::i;:::-;;25163:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21631:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26560:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32403:209;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17946:79;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21352:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22983:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26220:215;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27406:275;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33766:166;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26696:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21681:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24441:269;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23399:167;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21467:79;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25714:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27190:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25844:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31076:543;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23574:143;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26443:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18885:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22892:83;22929:13;22962:5;22955:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22892:83;:::o;23725:161::-;23800:4;23817:39;23826:12;:10;:12::i;:::-;23840:7;23849:6;23817:8;:39::i;:::-;23874:4;23867:11;;23725:161;;;;:::o;22257:22::-;;;;;;;;;;;;;;;;;;;:::o;25328:126::-;25394:4;25418:22;:28;25441:4;25418:28;;;;;;;;;;;;;;;;;;;;;;;;;25411:35;;25328:126;;;:::o;32114:281::-;32184:4;32202:21;32240:1;32226:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32202:40;;32263:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32253:4;32258:1;32253:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;;;32314:4;32296;32301:1;32296:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;32337:15;;;;;;;;;;;:28;;;32366:11;32379:4;32337:47;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32385:1;32337:50;;;;;;;;:::i;:::-;;;;;;;;32330:57;;;32114:281;;;:::o;20591:106::-;;;;;;;;;;;;;:::o;23169:95::-;23222:7;23249;;23242:14;;23169:95;:::o;23894:313::-;23992:4;24009:36;24019:6;24027:9;24038:6;24009:9;:36::i;:::-;24056:121;24065:6;24073:12;:10;:12::i;:::-;24087:89;24125:6;24087:89;;;;;;;;;;;;;;;;;:11;:19;24099:6;24087:19;;;;;;;;;;;;;;;:33;24107:12;:10;:12::i;:::-;24087:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;24056:8;:121::i;:::-;24195:4;24188:11;;23894:313;;;;;:::o;24849:137::-;18168:12;:10;:12::i;:::-;18158:22;;:6;;;;;;;;;;:22;;;18150:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;24971:7:::1;24953:15;:25;;;;:::i;:::-;24934:16;:44;;;;24849:137:::0;:::o;34169:161::-;18168:12;:10;:12::i;:::-;18158:22;;:6;;;;;;;;;;:22;;;18150:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;34232:18:::1;34253:21;34232:42;;34293:7;:5;:7::i;:::-;34285:25;;:37;34311:10;34285:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;34221:109;34169:161::o:0;22286:38::-;;;;;;;;;;;;;:::o;23078:83::-;23119:5;23144:9;;;;;;;;;;;23137:16;;23078:83;:::o;24718:125::-;24782:4;24806:16;;;;;;;;;;;:20;;;24827:7;24806:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24799:36;;24718:125;;;:::o;24215:218::-;24303:4;24320:83;24329:12;:10;:12::i;:::-;24343:7;24352:50;24391:10;24352:11;:25;24364:12;:10;:12::i;:::-;24352:25;;;;;;;;;;;;;;;:34;24378:7;24352:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;24320:8;:83::i;:::-;24421:4;24414:11;;24215:218;;;;:::o;24994:161::-;18168:12;:10;:12::i;:::-;18158:22;;:6;;;;;;;;;;:22;;;18150:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;25106:41:::1;25119:9;;25130:16;25106:12;:41::i;:::-;24994:161:::0;;;:::o;20704:41::-;;;;;;;;;;;;;:::o;21258:40::-;;;;;;;;;;;;;:::o;33169:304::-;33211:28;33242:24;33260:4;33242:9;:24::i;:::-;33211:55;;33304:1;33281:20;:24;33277:189;;;33327:16;;;;;;;;;;;33322:133;;33364:38;33381:20;33364:16;:38::i;:::-;33421:18;:16;:18::i;:::-;33322:133;33277:189;33200:273;33169:304::o;27689:124::-;27754:4;27778:18;:27;27797:7;27778:27;;;;;;;;;;;;;;;;;;;;;;;;;27771:34;;27689:124;;;:::o;21305:40::-;;;;:::o;22331:56::-;;;;;;;;;;;;;;;;;;;:::o;21405:55::-;;;;:::o;33481:277::-;18168:12;:10;:12::i;:::-;18158:22;;:6;;;;;;;;;;:22;;;18150:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;33632:12:::1;33604;:25;;:40;;;;33682:11;33655:12;:24;;:38;;;;33735:15;33704:12;:28;;:46;;;;33481:277:::0;;;:::o;23272:119::-;23338:7;23365:9;:18;23375:7;23365:18;;;;;;;;;;;;;;;;23358:25;;23272:119;;;:::o;18582:148::-;18168:12;:10;:12::i;:::-;18158:22;;:6;;;;;;;;;;:22;;;18150:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;18689:1:::1;18652:40;;18673:6;::::0;::::1;;;;;;;;18652:40;;;;;;;;;;;;18720:1;18703:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;18582:148::o:0;25163:157::-;18168:12;:10;:12::i;:::-;18158:22;;:6;;;;;;;;;;:22;;;18150:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;25273:39:::1;25290:9;;25301:10;25273:16;:39::i;:::-;25163:157:::0;;;:::o;21631:43::-;;;;;;;;;;;;;:::o;26560:128::-;18168:12;:10;:12::i;:::-;18158:22;;:6;;;;;;;;;;:22;;;18150:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;26644:36:::1;26664:9;26675:4;26644:19;:36::i;:::-;26560:128:::0;:::o;32403:209::-;18168:12;:10;:12::i;:::-;18158:22;;:6;;;;;;;;;;:22;;;18150:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;32501:16:::1;;32489:8;:28:::0;32481:85:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;32596:8;32577:16;:27;;;;32403:209:::0;:::o;17946:79::-;17984:7;18011:6;;;;;;;;;;;18004:13;;17946:79;:::o;21352:46::-;;;;:::o;22983:87::-;23022:13;23055:7;23048:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22983:87;:::o;26220:215::-;18168:12;:10;:12::i;:::-;18158:22;;:6;;;;;;;;;;:22;;;18150:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;26341:6:::1;26324:7;:14;;:23;;;;26376:7;26358;:15;;:25;;;;26416:11;26394:7;:19;;:33;;;;26220:215:::0;;;:::o;27406:275::-;27463:7;27484:21;27522:1;27508:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27484:40;;27545:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27535:4;27540:1;27535:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;;;27596:4;27578;27583:1;27578:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;27619:15;;;;;;;;;;;:29;;;27649:14;;27665:4;27619:51;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27671:1;27619:54;;;;;;;;:::i;:::-;;;;;;;;27612:61;;;27406:275;:::o;33766:166::-;18168:12;:10;:12::i;:::-;18158:22;;:6;;;;;;;;;;:22;;;18150:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;33899:23:::1;33857:15;;:67;;;;;;;;;;;;;;;;;;33766:166:::0;:::o;26696:131::-;18168:12;:10;:12::i;:::-;18158:22;;:6;;;;;;;;;;:22;;;18150:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;26782:37:::1;26802:9;26813:5;26782:19;:37::i;:::-;26696:131:::0;:::o;21681:39::-;;;;:::o;24441:269::-;24534:4;24551:129;24560:12;:10;:12::i;:::-;24574:7;24583:96;24622:15;24583:96;;;;;;;;;;;;;;;;;:11;:25;24595:12;:10;:12::i;:::-;24583:25;;;;;;;;;;;;;;;:34;24609:7;24583:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;24551:8;:129::i;:::-;24698:4;24691:11;;24441:269;;;;:::o;23399:167::-;23477:4;23494:42;23504:12;:10;:12::i;:::-;23518:9;23529:6;23494:9;:42::i;:::-;23554:4;23547:11;;23399:167;;;;:::o;21467:79::-;;;;;;;;;;;;;:::o;25714:122::-;18168:12;:10;:12::i;:::-;18158:22;;:6;;;;;;;;;;:22;;;18150:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;25813:15:::1;25796:14;:32;;;;25714:122:::0;:::o;27190:171::-;18168:12;:10;:12::i;:::-;18158:22;;:6;;;;;;;;;;:22;;;18150:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;27291:8:::1;27267:21;;:32;;;;;;;;;;;;;;;;;;27315:38;27344:8;27315:38;;;;;;:::i;:::-;;;;;;;;27190:171:::0;:::o;25844:124::-;18168:12;:10;:12::i;:::-;18158:22;;:6;;;;;;;;;;:22;;;18150:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;25951:9:::1;25927:21;:33;;;;25844:124:::0;:::o;31076:543::-;18168:12;:10;:12::i;:::-;18158:22;;:6;;;;;;;;;;:22;;;18150:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;31206:7:::1;;:14;;31188:7;;:14;;:32;31180:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;31278:12;31293;:10;:12::i;:::-;31278:27;;31320:9;31316:296;31337:7;;:14;;31333:1;:18;31316:296;;;31373:10;31386:7;;31394:1;31386:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;31373:23;;31411:14;31428:7;;31436:1;31428:10;;;;;;;:::i;:::-;;;;;;;;31411:27;;31471;31491:6;31471:9;:15;31481:4;31471:15;;;;;;;;;;;;;;;;:19;;:27;;;;:::i;:::-;31453:9;:15;31463:4;31453:15;;;;;;;;;;;;;;;:45;;;;31529:25;31547:6;31529:9;:13;31539:2;31529:13;;;;;;;;;;;;;;;;:17;;:25;;;;:::i;:::-;31513:9;:13;31523:2;31513:13;;;;;;;;;;;;;;;:41;;;;31589:2;31574:26;;31583:4;31574:26;;;31593:6;31574:26;;;;;;:::i;:::-;;;;;;;;31358:254;;31353:3;;;;;:::i;:::-;;;;31316:296;;;;31169:450;31076:543:::0;;;;:::o;23574:143::-;23655:7;23682:11;:18;23694:5;23682:18;;;;;;;;;;;;;;;:27;23701:7;23682:27;;;;;;;;;;;;;;;;23675:34;;23574:143;;;;:::o;26443:109::-;26504:4;26528:10;:16;26539:4;26528:16;;;;;;;;;;;;;;;;;;;;;;;;;26521:23;;26443:109;;;:::o;18885:244::-;18168:12;:10;:12::i;:::-;18158:22;;:6;;;;;;;;;;:22;;;18150:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;18994:1:::1;18974:22;;:8;:22;;::::0;18966:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;19084:8;19055:38;;19076:6;::::0;::::1;;;;;;;;19055:38;;;;;;;;;;;;19113:8;19104:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;18885:244:::0;:::o;10434:98::-;10487:7;10514:10;10507:17;;10434:98;:::o;27821:337::-;27931:1;27914:19;;:5;:19;;;27906:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28012:1;27993:21;;:7;:21;;;27985:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28096:6;28066:11;:18;28078:5;28066:18;;;;;;;;;;;;;;;:27;28085:7;28066:27;;;;;;;;;;;;;;;:36;;;;28134:7;28118:32;;28127:5;28118:32;;;28143:6;28118:32;;;;;;:::i;:::-;;;;;;;;27821:337;;;:::o;28166:2902::-;28270:1;28254:18;;:4;:18;;;28246:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28347:1;28333:16;;:2;:16;;;28325:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;28417:1;28408:6;:10;28400:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;28475:13;28492:18;:24;28511:4;28492:24;;;;;;;;;;;;;;;;;;;;;;;;;28491:25;:52;;;;;28521:18;:22;28540:2;28521:22;;;;;;;;;;;;;;;;;;;;;;;;;28520:23;28491:52;:71;;;;;28555:7;:5;:7::i;:::-;28547:15;;:4;:15;;;;28491:71;:88;;;;;28572:7;:5;:7::i;:::-;28566:13;;:2;:13;;;;28491:88;28475:104;;28590:21;28614:25;28632:6;28614:13;28624:2;28614:9;:13::i;:::-;:17;;:25;;;;:::i;:::-;28590:49;;28650:17;28783:7;:5;:7::i;:::-;28775:15;;:4;:15;;;;:32;;;;;28800:7;:5;:7::i;:::-;28794:13;;:2;:13;;;;28775:32;:52;;;;;28817:10;;;;;;;;;;;28811:16;;:2;:16;;;;28775:52;:77;;;;;28847:4;28831:21;;:4;:21;;;;28775:77;:100;;;;;28870:4;28856:19;;:2;:19;;;;28775:100;28771:1998;;;28901:10;:16;28912:4;28901:16;;;;;;;;;;;;;;;;;;;;;;;;;28900:17;:36;;;;;28922:10;:14;28933:2;28922:14;;;;;;;;;;;;;;;;;;;;;;;;;28921:15;28900:36;28892:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;29017:13;;;;;;;;;;;29009:21;;:4;:21;;;29005:486;;29076:16;;29059:13;:33;;29051:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;29165:8;:51;;29215:1;29165:51;;;29176:35;29207:3;29176:26;29187:7;:14;;;29176:6;:10;;:26;;;;:::i;:::-;:30;;:35;;;;:::i;:::-;29165:51;29153:63;;29235:11;29249:29;29271:6;29249:21;:29::i;:::-;29235:43;;29297:15;29315:36;29344:6;29315:16;;;;;;;;;;;:20;;;29336:2;29315:24;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:28;;:36;;;;:::i;:::-;29297:54;;29370:16;;;;;;;;;;;:20;;;29391:2;29395:10;29370:36;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29430:45;29444:2;29455:6;29464:10;29430:45;;;;;;;;:::i;:::-;;;;;;;;29032:459;;29005:486;29517:13;;;;;;;;;;;29509:21;;:4;:21;;;;:44;;;;;29540:13;;;;;;;;;;;29534:19;;:2;:19;;;29509:44;29505:659;;;29586:8;:51;;29636:1;29586:51;;;29597:36;29629:3;29597:27;29608:7;:15;;;29597:6;:10;;:27;;;;:::i;:::-;:31;;:36;;;;:::i;:::-;29586:51;29574:63;;29656:12;29671:29;29693:6;29671:21;:29::i;:::-;29656:44;;29734:1;29722:9;:13;:48;;;;;29749:21;;29739:7;:31;29722:48;29719:127;;;29807:7;:19;;;29795:31;;29719:127;29864:7;29912;29878:16;;;;;;;;;;;:20;;;29899:4;29878:26;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29874:46;;;;:::i;:::-;29864:56;;29939:18;29967:1;29960:3;:8;;:27;;29983:3;29960:27;;;29971:1;29960:27;29939:48;;30006:16;;;;;;;;;;;:20;;;30027:4;30033:10;30006:38;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30068:49;30082:4;30096:7;30106:10;30068:49;;;;;;;;:::i;:::-;;;;;;;;30136:12;:10;:12::i;:::-;29555:609;;;29505:659;30190:13;;;;;;;;;;;30182:21;;:4;:21;;;;:44;;;;;30213:13;;;;;;;;;;;30207:19;;:2;:19;;;;30182:44;30178:168;;;30272:16;;30255:13;:33;;30247:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;30178:168;30366:15;;;;;;;;;;;:31;;;30398:4;30366:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30362:52;30432:15;;;;;;;;;;;:31;;;30464:2;30432:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30428:50;30496:15;;;;;;;;;;;:23;;;30520:16;;30496:41;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;30492:266;;;30724:9;30635:99;;30700:4;30635:99;;;30660:10;30672:6;30680:18;30706:16;;30635:99;;;;;;;;;:::i;:::-;;;;;;;;30538:212;;;30492:266;28771:1998;30779:22;30804:21;30815:9;30804:6;:10;;:21;;;;:::i;:::-;30779:46;;30854:27;30874:6;30854:9;:15;30864:4;30854:15;;;;;;;;;;;;;;;;:19;;:27;;;;:::i;:::-;30836:9;:15;30846:4;30836:15;;;;;;;;;;;;;;;:45;;;;30908:33;30926:14;30908:9;:13;30918:2;30908:13;;;;;;;;;;;;;;;;:17;;:33;;;;:::i;:::-;30892:9;:13;30902:2;30892:13;;;;;;;;;;;;;;;:49;;;;30979:39;31008:9;30979;:24;30997:4;30979:24;;;;;;;;;;;;;;;;:28;;:39;;;;:::i;:::-;30952:9;:24;30970:4;30952:24;;;;;;;;;;;;;;;:66;;;;31049:2;31034:26;;31043:4;31034:26;;;31053:6;31034:26;;;;;;:::i;:::-;;;;;;;;28235:2833;;;;28166:2902;;;:::o;6765:192::-;6851:7;6884:1;6879;:6;;6887:12;6871:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;6911:9;6927:1;6923;:5;;;;:::i;:::-;6911:17;;6948:1;6941:8;;;6765:192;;;;;:::o;5862:181::-;5920:7;5940:9;5956:1;5952;:5;;;;:::i;:::-;5940:17;;5981:1;5976;:6;;5968:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;6034:1;6027:8;;;5862:181;;;;:::o;25976:236::-;26063:9;26058:147;26082:9;;:16;;26078:1;:20;26058:147;;;26120:12;26135:9;;26145:1;26135:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;26120:27;;26189:4;26162:18;:24;26181:4;26162:24;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;26105:100;26100:3;;;;;:::i;:::-;;;;26058:147;;;;25976:236;;;:::o;34338:585::-;34464:21;34502:1;34488:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34464:40;;34533:4;34515;34520:1;34515:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;34559:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34549:4;34554:1;34549:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;;;34592:62;34609:4;34624:15;;;;;;;;;;;34642:11;34592:8;:62::i;:::-;34691:15;;;;;;;;;;;:66;;;34772:11;34798:1;34842:4;34869;34889:15;34691:224;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34393:530;34338:585;:::o;32620:541::-;20526:4;20507:16;;:23;;;;;;;;;;;;;;;;;;32679:18:::1;32700:21;32679:42;;32732:20;32755:50;32801:3;32755:41;32770:12;:25;;;32755:10;:14;;:41;;;;:::i;:::-;:45;;:50;;;;:::i;:::-;32732:73;;32816:19;32838:49;32883:3;32838:40;32853:12;:24;;;32838:10;:14;;:40;;;;:::i;:::-;:44;;:49;;;;:::i;:::-;32816:71;;32898:23;32924:53;32973:3;32924:44;32939:12;:28;;;32924:10;:14;;:44;;;;:::i;:::-;:48;;:53;;;;:::i;:::-;32898:79;;33006:19;;;;;;;;;;;32998:37;;:51;33036:12;32998:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;33068:18;;;;;;;;;;;33060:36;;:49;33097:11;33060:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;33120:33;33137:15;33120:16;:33::i;:::-;32668:493;;;;20572:5:::0;20553:16;;:24;;;;;;;;;;;;;;;;;;32620:541::o;25462:244::-;25553:9;25548:151;25572:9;;:16;;25568:1;:20;25548:151;;;25610:12;25625:9;;25635:1;25625:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;25610:27;;25683:4;25652:22;:28;25675:4;25652:28;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;25595:104;25590:3;;;;;:::i;:::-;;;;25548:151;;;;25462:244;;;:::o;26835:347::-;26930:9;26925:250;26949:9;:16;26945:1;:20;26925:250;;;26987:12;27002:9;27012:1;27002:12;;;;;;;;:::i;:::-;;;;;;;;26987:27;;27033:7;27029:135;;;27080:4;27061:10;:16;27072:4;27061:16;;;;;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;27029:135;;;27132:10;:16;27143:4;27132:16;;;;;;;;;;;;;;;;27125:23;;;;;;;;;;;27029:135;26972:203;26967:3;;;;;:::i;:::-;;;;26925:250;;;;26835:347;;:::o;6326:136::-;6384:7;6411:43;6415:1;6418;6411:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;6404:50;;6326:136;;;;:::o;7216:471::-;7274:7;7524:1;7519;:6;7515:47;;7549:1;7542:8;;;;7515:47;7574:9;7590:1;7586;:5;;;;:::i;:::-;7574:17;;7619:1;7614;7610;:5;;;;:::i;:::-;:10;7602:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;7678:1;7671:8;;;7216:471;;;;;:::o;8163:132::-;8221:7;8248:39;8252:1;8255;8248:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;8241:46;;8163:132;;;;:::o;31627:479::-;31668:28;31699:24;31717:4;31699:9;:24::i;:::-;31668:55;;31761:1;31738:20;:24;31734:365;;;31779:19;31801:26;:24;:26::i;:::-;31779:48;;31870:11;31846:20;:35;;:56;;;;;31886:16;;;;;;;;;;;31885:17;31846:56;:81;;;;;31906:21;;;;;;;;;;;31846:81;31842:246;;;32006:29;32023:11;32006:16;:29::i;:::-;32054:18;:16;:18::i;:::-;31842:246;31764:335;31734:365;31657:449;31627:479::o;33940:221::-;34005:12;34030:15;;;;;;;;;;;34022:29;;34060:9;34022:52;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34004:70;;;34089:7;34085:69;;;34118:24;34132:9;34118:24;;;;;;:::i;:::-;;;;;;;;34085:69;33993:168;33940:221;:::o;8791:278::-;8877:7;8909:1;8905;:5;8912:12;8897:28;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;8936:9;8952:1;8948;:5;;;;:::i;:::-;8936:17;;9060:1;9053:8;;;8791:278;;;;;:::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;1349:75::-;1382:6;1415:2;1409:9;1399:19;;1349:75;:::o;1430:117::-;1539:1;1536;1529:12;1553:117;1662:1;1659;1652: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:442::-;3719:4;3757:2;3746:9;3742:18;3734:26;;3770:71;3838:1;3827:9;3823:17;3814:6;3770:71;:::i;:::-;3851:72;3919:2;3908:9;3904:18;3895:6;3851:72;:::i;:::-;3933;4001:2;3990:9;3986:18;3977:6;3933:72;:::i;:::-;3570:442;;;;;;:::o;4018:329::-;4077:6;4126:2;4114:9;4105:7;4101:23;4097:32;4094:119;;;4132:79;;:::i;:::-;4094:119;4252:1;4277:53;4322:7;4313:6;4302:9;4298:22;4277:53;:::i;:::-;4267:63;;4223:117;4018:329;;;;:::o;4353:::-;4412:6;4461:2;4449:9;4440:7;4436:23;4432:32;4429:119;;;4467:79;;:::i;:::-;4429:119;4587:1;4612:53;4657:7;4648:6;4637:9;4633:22;4612:53;:::i;:::-;4602:63;;4558:117;4353:329;;;;:::o;4688:222::-;4781:4;4819:2;4808:9;4804:18;4796:26;;4832:71;4900:1;4889:9;4885:17;4876:6;4832:71;:::i;:::-;4688:222;;;;:::o;4916:60::-;4944:3;4965:5;4958:12;;4916:60;;;:::o;4982:142::-;5032:9;5065:53;5083:34;5092:24;5110:5;5092:24;:::i;:::-;5083:34;:::i;:::-;5065:53;:::i;:::-;5052:66;;4982:142;;;:::o;5130:126::-;5180:9;5213:37;5244:5;5213:37;:::i;:::-;5200:50;;5130:126;;;:::o;5262:152::-;5338:9;5371:37;5402:5;5371:37;:::i;:::-;5358:50;;5262:152;;;:::o;5420:183::-;5533:63;5590:5;5533:63;:::i;:::-;5528:3;5521:76;5420:183;;:::o;5609:274::-;5728:4;5766:2;5755:9;5751:18;5743:26;;5779:97;5873:1;5862:9;5858:17;5849:6;5779:97;:::i;:::-;5609:274;;;;:::o;5889:619::-;5966:6;5974;5982;6031:2;6019:9;6010:7;6006:23;6002:32;5999:119;;;6037:79;;:::i;:::-;5999:119;6157:1;6182:53;6227:7;6218:6;6207:9;6203:22;6182:53;:::i;:::-;6172:63;;6128:117;6284:2;6310:53;6355:7;6346:6;6335:9;6331:22;6310:53;:::i;:::-;6300:63;;6255:118;6412:2;6438:53;6483:7;6474:6;6463:9;6459:22;6438:53;:::i;:::-;6428:63;;6383:118;5889:619;;;;;:::o;6514:134::-;6572:9;6605:37;6636:5;6605:37;:::i;:::-;6592:50;;6514:134;;;:::o;6654:166::-;6736:9;6769:45;6808:5;6769:45;:::i;:::-;6756:58;;6654:166;;;:::o;6826:195::-;6945:69;7008:5;6945:69;:::i;:::-;6940:3;6933:82;6826:195;;:::o;7027:286::-;7152:4;7190:2;7179:9;7175:18;7167:26;;7203:103;7303:1;7292:9;7288:17;7279:6;7203:103;:::i;:::-;7027:286;;;;:::o;7319:86::-;7354:7;7394:4;7387:5;7383:16;7372:27;;7319:86;;;:::o;7411:112::-;7494:22;7510:5;7494:22;:::i;:::-;7489:3;7482:35;7411:112;;:::o;7529:214::-;7618:4;7656:2;7645:9;7641:18;7633:26;;7669:67;7733:1;7722:9;7718:17;7709:6;7669:67;:::i;:::-;7529:214;;;;:::o;7749:117::-;7858:1;7855;7848:12;7872:117;7981:1;7978;7971:12;7995:117;8104:1;8101;8094:12;8135:568;8208:8;8218:6;8268:3;8261:4;8253:6;8249:17;8245:27;8235:122;;8276:79;;:::i;:::-;8235:122;8389:6;8376:20;8366:30;;8419:18;8411:6;8408:30;8405:117;;;8441:79;;:::i;:::-;8405:117;8555:4;8547:6;8543:17;8531:29;;8609:3;8601:4;8593:6;8589:17;8579:8;8575:32;8572:41;8569:128;;;8616:79;;:::i;:::-;8569:128;8135:568;;;;;:::o;8709:116::-;8779:21;8794:5;8779:21;:::i;:::-;8772:5;8769:32;8759:60;;8815:1;8812;8805:12;8759:60;8709:116;:::o;8831:133::-;8874:5;8912:6;8899:20;8890:29;;8928:30;8952:5;8928:30;:::i;:::-;8831:133;;;;:::o;8970:698::-;9062:6;9070;9078;9127:2;9115:9;9106:7;9102:23;9098:32;9095:119;;;9133:79;;:::i;:::-;9095:119;9281:1;9270:9;9266:17;9253:31;9311:18;9303:6;9300:30;9297:117;;;9333:79;;:::i;:::-;9297:117;9446:80;9518:7;9509:6;9498:9;9494:22;9446:80;:::i;:::-;9428:98;;;;9224:312;9575:2;9601:50;9643:7;9634:6;9623:9;9619:22;9601:50;:::i;:::-;9591:60;;9546:115;8970:698;;;;;:::o;9674:118::-;9761:24;9779:5;9761:24;:::i;:::-;9756:3;9749:37;9674:118;;:::o;9798:222::-;9891:4;9929:2;9918:9;9914:18;9906:26;;9942:71;10010:1;9999:9;9995:17;9986:6;9942:71;:::i;:::-;9798:222;;;;:::o;10026:619::-;10103:6;10111;10119;10168:2;10156:9;10147:7;10143:23;10139:32;10136:119;;;10174:79;;:::i;:::-;10136:119;10294:1;10319:53;10364:7;10355:6;10344:9;10340:22;10319:53;:::i;:::-;10309:63;;10265:117;10421:2;10447:53;10492:7;10483:6;10472:9;10468:22;10447:53;:::i;:::-;10437:63;;10392:118;10549:2;10575:53;10620:7;10611:6;10600:9;10596:22;10575:53;:::i;:::-;10565:63;;10520:118;10026:619;;;;;:::o;10651:180::-;10699:77;10696:1;10689:88;10796:4;10793:1;10786:15;10820:4;10817:1;10810:15;10837:281;10920:27;10942:4;10920:27;:::i;:::-;10912:6;10908:40;11050:6;11038:10;11035:22;11014:18;11002:10;10999:34;10996:62;10993:88;;;11061:18;;:::i;:::-;10993:88;11101:10;11097:2;11090:22;10880:238;10837:281;;:::o;11124:129::-;11158:6;11185:20;;:::i;:::-;11175:30;;11214:33;11242:4;11234:6;11214:33;:::i;:::-;11124:129;;;:::o;11259:311::-;11336:4;11426:18;11418:6;11415:30;11412:56;;;11448:18;;:::i;:::-;11412:56;11498:4;11490:6;11486:17;11478:25;;11558:4;11552;11548:15;11540:23;;11259:311;;;:::o;11593:710::-;11689:5;11714:81;11730:64;11787:6;11730:64;:::i;:::-;11714:81;:::i;:::-;11705:90;;11815:5;11844:6;11837:5;11830:21;11878:4;11871:5;11867:16;11860:23;;11931:4;11923:6;11919:17;11911:6;11907:30;11960:3;11952:6;11949:15;11946:122;;;11979:79;;:::i;:::-;11946:122;12094:6;12077:220;12111:6;12106:3;12103:15;12077:220;;;12186:3;12215:37;12248:3;12236:10;12215:37;:::i;:::-;12210:3;12203:50;12282:4;12277:3;12273:14;12266:21;;12153:144;12137:4;12132:3;12128:14;12121:21;;12077:220;;;12081:21;11695:608;;11593:710;;;;;:::o;12326:370::-;12397:5;12446:3;12439:4;12431:6;12427:17;12423:27;12413:122;;12454:79;;:::i;:::-;12413:122;12571:6;12558:20;12596:94;12686:3;12678:6;12671:4;12663:6;12659:17;12596:94;:::i;:::-;12587:103;;12403:293;12326:370;;;;:::o;12702:539::-;12786:6;12835:2;12823:9;12814:7;12810:23;12806:32;12803:119;;;12841:79;;:::i;:::-;12803:119;12989:1;12978:9;12974:17;12961:31;13019:18;13011:6;13008:30;13005:117;;;13041:79;;:::i;:::-;13005:117;13146:78;13216:7;13207:6;13196:9;13192:22;13146:78;:::i;:::-;13136:88;;12932:302;12702:539;;;;:::o;13247:323::-;13303:6;13352:2;13340:9;13331:7;13327:23;13323:32;13320:119;;;13358:79;;:::i;:::-;13320:119;13478:1;13503:50;13545:7;13536:6;13525:9;13521:22;13503:50;:::i;:::-;13493:60;;13449:114;13247:323;;;;:::o;13593:568::-;13666:8;13676:6;13726:3;13719:4;13711:6;13707:17;13703:27;13693:122;;13734:79;;:::i;:::-;13693:122;13847:6;13834:20;13824:30;;13877:18;13869:6;13866:30;13863:117;;;13899:79;;:::i;:::-;13863:117;14013:4;14005:6;14001:17;13989:29;;14067:3;14059:4;14051:6;14047:17;14037:8;14033:32;14030:41;14027:128;;;14074:79;;:::i;:::-;14027:128;13593:568;;;;;:::o;14167:934::-;14289:6;14297;14305;14313;14362:2;14350:9;14341:7;14337:23;14333:32;14330:119;;;14368:79;;:::i;:::-;14330:119;14516:1;14505:9;14501:17;14488:31;14546:18;14538:6;14535:30;14532:117;;;14568:79;;:::i;:::-;14532:117;14681:80;14753:7;14744:6;14733:9;14729:22;14681:80;:::i;:::-;14663:98;;;;14459:312;14838:2;14827:9;14823:18;14810:32;14869:18;14861:6;14858:30;14855:117;;;14891:79;;:::i;:::-;14855:117;15004:80;15076:7;15067:6;15056:9;15052:22;15004:80;:::i;:::-;14986:98;;;;14781:313;14167:934;;;;;;;:::o;15107:474::-;15175:6;15183;15232:2;15220:9;15211:7;15207:23;15203:32;15200:119;;;15238:79;;:::i;:::-;15200:119;15358:1;15383:53;15428:7;15419:6;15408:9;15404:22;15383:53;:::i;:::-;15373:63;;15329:117;15485:2;15511:53;15556:7;15547:6;15536:9;15532:22;15511:53;:::i;:::-;15501:63;;15456:118;15107:474;;;;;:::o;15587:180::-;15635:77;15632:1;15625:88;15732:4;15729:1;15722:15;15756:4;15753:1;15746:15;15773:320;15817:6;15854:1;15848:4;15844:12;15834:22;;15901:1;15895:4;15891:12;15922:18;15912:81;;15978:4;15970:6;15966:17;15956:27;;15912:81;16040:2;16032:6;16029:14;16009:18;16006:38;16003:84;;16059:18;;:::i;:::-;16003:84;15824:269;15773:320;;;:::o;16099:143::-;16156:5;16187:6;16181:13;16172:22;;16203:33;16230:5;16203:33;:::i;:::-;16099:143;;;;:::o;16248:351::-;16318:6;16367:2;16355:9;16346:7;16342:23;16338:32;16335:119;;;16373:79;;:::i;:::-;16335:119;16493:1;16518:64;16574:7;16565:6;16554:9;16550:22;16518:64;:::i;:::-;16508:74;;16464:128;16248:351;;;;:::o;16605:180::-;16653:77;16650:1;16643:88;16750:4;16747:1;16740:15;16774:4;16771:1;16764:15;16791:114;16858:6;16892:5;16886:12;16876:22;;16791:114;;;:::o;16911:184::-;17010:11;17044:6;17039:3;17032:19;17084:4;17079:3;17075:14;17060:29;;16911:184;;;;:::o;17101:132::-;17168:4;17191:3;17183:11;;17221:4;17216:3;17212:14;17204:22;;17101:132;;;:::o;17239:108::-;17316:24;17334:5;17316:24;:::i;:::-;17311:3;17304:37;17239:108;;:::o;17353:179::-;17422:10;17443:46;17485:3;17477:6;17443:46;:::i;:::-;17521:4;17516:3;17512:14;17498:28;;17353:179;;;;:::o;17538:113::-;17608:4;17640;17635:3;17631:14;17623:22;;17538:113;;;:::o;17687:732::-;17806:3;17835:54;17883:5;17835:54;:::i;:::-;17905:86;17984:6;17979:3;17905:86;:::i;:::-;17898:93;;18015:56;18065:5;18015:56;:::i;:::-;18094:7;18125:1;18110:284;18135:6;18132:1;18129:13;18110:284;;;18211:6;18205:13;18238:63;18297:3;18282:13;18238:63;:::i;:::-;18231:70;;18324:60;18377:6;18324:60;:::i;:::-;18314:70;;18170:224;18157:1;18154;18150:9;18145:14;;18110:284;;;18114:14;18410:3;18403:10;;17811:608;;;17687:732;;;;:::o;18425:483::-;18596:4;18634:2;18623:9;18619:18;18611:26;;18647:71;18715:1;18704:9;18700:17;18691:6;18647:71;:::i;:::-;18765:9;18759:4;18755:20;18750:2;18739:9;18735:18;18728:48;18793:108;18896:4;18887:6;18793:108;:::i;:::-;18785:116;;18425:483;;;;;:::o;18914:311::-;18991:4;19081:18;19073:6;19070:30;19067:56;;;19103:18;;:::i;:::-;19067:56;19153:4;19145:6;19141:17;19133:25;;19213:4;19207;19203:15;19195:23;;18914:311;;;:::o;19231:143::-;19288:5;19319:6;19313:13;19304:22;;19335:33;19362:5;19335:33;:::i;:::-;19231:143;;;;:::o;19397:732::-;19504:5;19529:81;19545:64;19602:6;19545:64;:::i;:::-;19529:81;:::i;:::-;19520:90;;19630:5;19659:6;19652:5;19645:21;19693:4;19686:5;19682:16;19675:23;;19746:4;19738:6;19734:17;19726:6;19722:30;19775:3;19767:6;19764:15;19761:122;;;19794:79;;:::i;:::-;19761:122;19909:6;19892:231;19926:6;19921:3;19918:15;19892:231;;;20001:3;20030:48;20074:3;20062:10;20030:48;:::i;:::-;20025:3;20018:61;20108:4;20103:3;20099:14;20092:21;;19968:155;19952:4;19947:3;19943:14;19936:21;;19892:231;;;19896:21;19510:619;;19397:732;;;;;:::o;20152:385::-;20234:5;20283:3;20276:4;20268:6;20264:17;20260:27;20250:122;;20291:79;;:::i;:::-;20250:122;20401:6;20395:13;20426:105;20527:3;20519:6;20512:4;20504:6;20500:17;20426:105;:::i;:::-;20417:114;;20240:297;20152:385;;;;:::o;20543:554::-;20638:6;20687:2;20675:9;20666:7;20662:23;20658:32;20655:119;;;20693:79;;:::i;:::-;20655:119;20834:1;20823:9;20819:17;20813:24;20864:18;20856:6;20853:30;20850:117;;;20886:79;;:::i;:::-;20850:117;20991:89;21072:7;21063:6;21052:9;21048:22;20991:89;:::i;:::-;20981:99;;20784:306;20543:554;;;;:::o;21103:182::-;21243:34;21239:1;21231:6;21227:14;21220:58;21103:182;:::o;21291:366::-;21433:3;21454:67;21518:2;21513:3;21454:67;:::i;:::-;21447:74;;21530:93;21619:3;21530:93;:::i;:::-;21648:2;21643:3;21639:12;21632:19;;21291:366;;;:::o;21663:419::-;21829:4;21867:2;21856:9;21852:18;21844:26;;21916:9;21910:4;21906:20;21902:1;21891:9;21887:17;21880:47;21944:131;22070:4;21944:131;:::i;:::-;21936:139;;21663:419;;;:::o;22088:180::-;22136:77;22133:1;22126:88;22233:4;22230:1;22223:15;22257:4;22254:1;22247:15;22274:410;22314:7;22337:20;22355:1;22337:20;:::i;:::-;22332:25;;22371:20;22389:1;22371:20;:::i;:::-;22366:25;;22426:1;22423;22419:9;22448:30;22466:11;22448:30;:::i;:::-;22437:41;;22627:1;22618:7;22614:15;22611:1;22608:22;22588:1;22581:9;22561:83;22538:139;;22657:18;;:::i;:::-;22538:139;22322:362;22274:410;;;;:::o;22690:351::-;22760:6;22809:2;22797:9;22788:7;22784:23;22780:32;22777:119;;;22815:79;;:::i;:::-;22777:119;22935:1;22960:64;23016:7;23007:6;22996:9;22992:22;22960:64;:::i;:::-;22950:74;;22906:128;22690:351;;;;:::o;23047:231::-;23187:34;23183:1;23175:6;23171:14;23164:58;23256:14;23251:2;23243:6;23239:15;23232:39;23047:231;:::o;23284:366::-;23426:3;23447:67;23511:2;23506:3;23447:67;:::i;:::-;23440:74;;23523:93;23612:3;23523:93;:::i;:::-;23641:2;23636:3;23632:12;23625:19;;23284:366;;;:::o;23656:419::-;23822:4;23860:2;23849:9;23845:18;23837:26;;23909:9;23903:4;23899:20;23895:1;23884:9;23880:17;23873:47;23937:131;24063:4;23937:131;:::i;:::-;23929:139;;23656:419;;;:::o;24081:229::-;24221:34;24217:1;24209:6;24205:14;24198:58;24290:12;24285:2;24277:6;24273:15;24266:37;24081:229;:::o;24316:366::-;24458:3;24479:67;24543:2;24538:3;24479:67;:::i;:::-;24472:74;;24555:93;24644:3;24555:93;:::i;:::-;24673:2;24668:3;24664:12;24657:19;;24316:366;;;:::o;24688:419::-;24854:4;24892:2;24881:9;24877:18;24869:26;;24941:9;24935:4;24931:20;24927:1;24916:9;24912:17;24905:47;24969:131;25095:4;24969:131;:::i;:::-;24961:139;;24688:419;;;:::o;25113:233::-;25152:3;25175:24;25193:5;25175:24;:::i;:::-;25166:33;;25221:66;25214:5;25211:77;25208:103;;25291:18;;:::i;:::-;25208:103;25338:1;25331:5;25327:13;25320:20;;25113:233;;;:::o;25352:225::-;25492:34;25488:1;25480:6;25476:14;25469:58;25561:8;25556:2;25548:6;25544:15;25537:33;25352:225;:::o;25583:366::-;25725:3;25746:67;25810:2;25805:3;25746:67;:::i;:::-;25739:74;;25822:93;25911:3;25822:93;:::i;:::-;25940:2;25935:3;25931:12;25924:19;;25583:366;;;:::o;25955:419::-;26121:4;26159:2;26148:9;26144:18;26136:26;;26208:9;26202:4;26198:20;26194:1;26183:9;26179:17;26172:47;26236:131;26362:4;26236:131;:::i;:::-;26228:139;;25955:419;;;:::o;26380:223::-;26520:34;26516:1;26508:6;26504:14;26497:58;26589:6;26584:2;26576:6;26572:15;26565:31;26380:223;:::o;26609:366::-;26751:3;26772:67;26836:2;26831:3;26772:67;:::i;:::-;26765:74;;26848:93;26937:3;26848:93;:::i;:::-;26966:2;26961:3;26957:12;26950:19;;26609:366;;;:::o;26981:419::-;27147:4;27185:2;27174:9;27170:18;27162:26;;27234:9;27228:4;27224:20;27220:1;27209:9;27205:17;27198:47;27262:131;27388:4;27262:131;:::i;:::-;27254:139;;26981:419;;;:::o;27406:221::-;27546:34;27542:1;27534:6;27530:14;27523:58;27615:4;27610:2;27602:6;27598:15;27591:29;27406:221;:::o;27633:366::-;27775:3;27796:67;27860:2;27855:3;27796:67;:::i;:::-;27789:74;;27872:93;27961:3;27872:93;:::i;:::-;27990:2;27985:3;27981:12;27974:19;;27633:366;;;:::o;28005:419::-;28171:4;28209:2;28198:9;28194:18;28186:26;;28258:9;28252:4;28248:20;28244:1;28233:9;28229:17;28222:47;28286:131;28412:4;28286:131;:::i;:::-;28278:139;;28005:419;;;:::o;28430:224::-;28570:34;28566:1;28558:6;28554:14;28547:58;28639:7;28634:2;28626:6;28622:15;28615:32;28430:224;:::o;28660:366::-;28802:3;28823:67;28887:2;28882:3;28823:67;:::i;:::-;28816:74;;28899:93;28988:3;28899:93;:::i;:::-;29017:2;29012:3;29008:12;29001:19;;28660:366;;;:::o;29032:419::-;29198:4;29236:2;29225:9;29221:18;29213:26;;29285:9;29279:4;29275:20;29271:1;29260:9;29256:17;29249:47;29313:131;29439:4;29313:131;:::i;:::-;29305:139;;29032:419;;;:::o;29457:222::-;29597:34;29593:1;29585:6;29581:14;29574:58;29666:5;29661:2;29653:6;29649:15;29642:30;29457:222;:::o;29685:366::-;29827:3;29848:67;29912:2;29907:3;29848:67;:::i;:::-;29841:74;;29924:93;30013:3;29924:93;:::i;:::-;30042:2;30037:3;30033:12;30026:19;;29685:366;;;:::o;30057:419::-;30223:4;30261:2;30250:9;30246:18;30238:26;;30310:9;30304:4;30300:20;30296:1;30285:9;30281:17;30274:47;30338:131;30464:4;30338:131;:::i;:::-;30330:139;;30057:419;;;:::o;30482:228::-;30622:34;30618:1;30610:6;30606:14;30599:58;30691:11;30686:2;30678:6;30674:15;30667:36;30482:228;:::o;30716:366::-;30858:3;30879:67;30943:2;30938:3;30879:67;:::i;:::-;30872:74;;30955:93;31044:3;30955:93;:::i;:::-;31073:2;31068:3;31064:12;31057:19;;30716:366;;;:::o;31088:419::-;31254:4;31292:2;31281:9;31277:18;31269:26;;31341:9;31335:4;31331:20;31327:1;31316:9;31312:17;31305:47;31369:131;31495:4;31369:131;:::i;:::-;31361:139;;31088:419;;;:::o;31513:234::-;31653:34;31649:1;31641:6;31637:14;31630:58;31722:17;31717:2;31709:6;31705:15;31698:42;31513:234;:::o;31753:366::-;31895:3;31916:67;31980:2;31975:3;31916:67;:::i;:::-;31909:74;;31992:93;32081:3;31992:93;:::i;:::-;32110:2;32105:3;32101:12;32094:19;;31753:366;;;:::o;32125:419::-;32291:4;32329:2;32318:9;32314:18;32306:26;;32378:9;32372:4;32368:20;32364:1;32353:9;32349:17;32342:47;32406:131;32532:4;32406:131;:::i;:::-;32398:139;;32125:419;;;:::o;32550:224::-;32690:34;32686:1;32678:6;32674:14;32667:58;32759:7;32754:2;32746:6;32742:15;32735:32;32550:224;:::o;32780:366::-;32922:3;32943:67;33007:2;33002:3;32943:67;:::i;:::-;32936:74;;33019:93;33108:3;33019:93;:::i;:::-;33137:2;33132:3;33128:12;33121:19;;32780:366;;;:::o;33152:419::-;33318:4;33356:2;33345:9;33341:18;33333:26;;33405:9;33399:4;33395:20;33391:1;33380:9;33376:17;33369:47;33433:131;33559:4;33433:131;:::i;:::-;33425:139;;33152:419;;;:::o;33577:332::-;33698:4;33736:2;33725:9;33721:18;33713:26;;33749:71;33817:1;33806:9;33802:17;33793:6;33749:71;:::i;:::-;33830:72;33898:2;33887:9;33883:18;33874:6;33830:72;:::i;:::-;33577:332;;;;;:::o;33915:153::-;34055:5;34051:1;34043:6;34039:14;34032:29;33915:153;:::o;34074:365::-;34216:3;34237:66;34301:1;34296:3;34237:66;:::i;:::-;34230:73;;34312:93;34401:3;34312:93;:::i;:::-;34430:2;34425:3;34421:12;34414:19;;34074:365;;;:::o;34445:750::-;34695:4;34733:3;34722:9;34718:19;34710:27;;34747:71;34815:1;34804:9;34800:17;34791:6;34747:71;:::i;:::-;34865:9;34859:4;34855:20;34850:2;34839:9;34835:18;34828:48;34893:131;35019:4;34893:131;:::i;:::-;34885:139;;35034:72;35102:2;35091:9;35087:18;35078:6;35034:72;:::i;:::-;35116;35184:2;35173:9;35169:18;35160:6;35116:72;:::i;:::-;34445:750;;;;;;:::o;35201:76::-;35237:7;35266:5;35255:16;;35201:76;;;:::o;35283:372::-;35322:4;35342:19;35359:1;35342:19;:::i;:::-;35337:24;;35375:19;35392:1;35375:19;:::i;:::-;35370:24;;35418:1;35415;35411:9;35403:17;;35612:1;35606:4;35602:12;35598:1;35595;35591:9;35587:28;35570:1;35564:4;35560:12;35555:1;35552;35548:9;35541:17;35537:36;35521:104;35518:130;;;35628:18;;:::i;:::-;35518:130;35283:372;;;;:::o;35661:154::-;35801:6;35797:1;35789:6;35785:14;35778:30;35661:154;:::o;35821:365::-;35963:3;35984:66;36048:1;36043:3;35984:66;:::i;:::-;35977:73;;36059:93;36148:3;36059:93;:::i;:::-;36177:2;36172:3;36168:12;36161:19;;35821:365;;;:::o;36192:750::-;36442:4;36480:3;36469:9;36465:19;36457:27;;36494:71;36562:1;36551:9;36547:17;36538:6;36494:71;:::i;:::-;36612:9;36606:4;36602:20;36597:2;36586:9;36582:18;36575:48;36640:131;36766:4;36640:131;:::i;:::-;36632:139;;36781:72;36849:2;36838:9;36834:18;36825:6;36781:72;:::i;:::-;36863;36931:2;36920:9;36916:18;36907:6;36863:72;:::i;:::-;36192:750;;;;;;:::o;36948:663::-;37036:6;37044;37052;37101:2;37089:9;37080:7;37076:23;37072:32;37069:119;;;37107:79;;:::i;:::-;37069:119;37227:1;37252:64;37308:7;37299:6;37288:9;37284:22;37252:64;:::i;:::-;37242:74;;37198:128;37365:2;37391:64;37447:7;37438:6;37427:9;37423:22;37391:64;:::i;:::-;37381:74;;37336:129;37504:2;37530:64;37586:7;37577:6;37566:9;37562:22;37530:64;:::i;:::-;37520:74;;37475:129;36948:663;;;;;:::o;37617:553::-;37794:4;37832:3;37821:9;37817:19;37809:27;;37846:71;37914:1;37903:9;37899:17;37890:6;37846:71;:::i;:::-;37927:72;37995:2;37984:9;37980:18;37971:6;37927:72;:::i;:::-;38009;38077:2;38066:9;38062:18;38053:6;38009:72;:::i;:::-;38091;38159:2;38148:9;38144:18;38135:6;38091:72;:::i;:::-;37617:553;;;;;;;:::o;38176:194::-;38216:4;38236:20;38254:1;38236:20;:::i;:::-;38231:25;;38270:20;38288:1;38270:20;:::i;:::-;38265:25;;38314:1;38311;38307:9;38299:17;;38338:1;38332:4;38329:11;38326:37;;;38343:18;;:::i;:::-;38326:37;38176:194;;;;:::o;38376:191::-;38416:3;38435:20;38453:1;38435:20;:::i;:::-;38430:25;;38469:20;38487:1;38469:20;:::i;:::-;38464:25;;38512:1;38509;38505:9;38498:16;;38533:3;38530:1;38527:10;38524:36;;;38540:18;;:::i;:::-;38524:36;38376:191;;;;:::o;38573:177::-;38713:29;38709:1;38701:6;38697:14;38690:53;38573:177;:::o;38756:366::-;38898:3;38919:67;38983:2;38978:3;38919:67;:::i;:::-;38912:74;;38995:93;39084:3;38995:93;:::i;:::-;39113:2;39108:3;39104:12;39097:19;;38756:366;;;:::o;39128:419::-;39294:4;39332:2;39321:9;39317:18;39309:26;;39381:9;39375:4;39371:20;39367:1;39356:9;39352:17;39345:47;39409:131;39535:4;39409:131;:::i;:::-;39401:139;;39128:419;;;:::o;39553:85::-;39598:7;39627:5;39616:16;;39553:85;;;:::o;39644:158::-;39702:9;39735:61;39753:42;39762:32;39788:5;39762:32;:::i;:::-;39753:42;:::i;:::-;39735:61;:::i;:::-;39722:74;;39644:158;;;:::o;39808:147::-;39903:45;39942:5;39903:45;:::i;:::-;39898:3;39891:58;39808:147;;:::o;39961:831::-;40224:4;40262:3;40251:9;40247:19;40239:27;;40276:71;40344:1;40333:9;40329:17;40320:6;40276:71;:::i;:::-;40357:80;40433:2;40422:9;40418:18;40409:6;40357:80;:::i;:::-;40484:9;40478:4;40474:20;40469:2;40458:9;40454:18;40447:48;40512:108;40615:4;40606:6;40512:108;:::i;:::-;40504:116;;40630:72;40698:2;40687:9;40683:18;40674:6;40630:72;:::i;:::-;40712:73;40780:3;40769:9;40765:19;40756:6;40712:73;:::i;:::-;39961:831;;;;;;;;:::o;40798:180::-;40846:77;40843:1;40836:88;40943:4;40940:1;40933:15;40967:4;40964:1;40957:15;40984:185;41024:1;41041:20;41059:1;41041:20;:::i;:::-;41036:25;;41075:20;41093:1;41075:20;:::i;:::-;41070:25;;41114:1;41104:35;;41119:18;;:::i;:::-;41104:35;41161:1;41158;41154:9;41149:14;;40984:185;;;;:::o;41175:220::-;41315:34;41311:1;41303:6;41299:14;41292:58;41384:3;41379:2;41371:6;41367:15;41360:28;41175:220;:::o;41401:366::-;41543:3;41564:67;41628:2;41623:3;41564:67;:::i;:::-;41557:74;;41640:93;41729:3;41640:93;:::i;:::-;41758:2;41753:3;41749:12;41742:19;;41401:366;;;:::o;41773:419::-;41939:4;41977:2;41966:9;41962:18;41954:26;;42026:9;42020:4;42016:20;42012:1;42001:9;41997:17;41990:47;42054:131;42180:4;42054:131;:::i;:::-;42046:139;;41773:419;;;:::o;42198:147::-;42299:11;42336:3;42321:18;;42198:147;;;;:::o;42351:114::-;;:::o;42471:398::-;42630:3;42651:83;42732:1;42727:3;42651:83;:::i;:::-;42644:90;;42743:93;42832:3;42743:93;:::i;:::-;42861:1;42856:3;42852:11;42845:18;;42471:398;;;:::o;42875:379::-;43059:3;43081:147;43224:3;43081:147;:::i;:::-;43074:154;;43245:3;43238:10;;42875:379;;;:::o

Swarm Source

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