ETH Price: $3,440.68 (+1.45%)
Gas: 4 Gwei

Token

Amg (AMG)
 

Overview

Max Total Supply

100,000,000 AMG

Holders

311

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Filtered by Token Holder
rocketgirlnft.eth
Balance
130,131.633645186 AMG

Value
$0.00
0x3e0914fc2b3b67a476142020b7d6990d01ad234e
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Amg

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

/*
*AMG*AMG*AMG*AMG*AMG*AMG*AMG*AMG*AMG*AMG*AMG*AMG*AMG*AMG*AMG*AMG*AMG*AMG*AMG*AMG*AMG*AMG*AMG*AMG*AMG*AMG*
*/

/**
Website: https://amgcoin.pro/
Telegram: https://t.me/+vpQTd4f1zcdlNTQy
Twitter: https://twitter.com/tokenamg
*/

// SPDX-License-Identifier: MIT


pragma solidity ^0.8.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @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) {
        return a + b;
    }

    /**
     * @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 a - b;
    }

    /**
     * @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) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting 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 a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting 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) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * 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) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


/**
 * @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.
 */
abstract 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() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        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 {
        _transferOwnership(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");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @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);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    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 `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, 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 `from` to `to` 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 from,
        address to,
        uint256 amount
    ) external returns (bool);
}

// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

// File: @openzeppelin/contracts/token/ERC20/ERC20.sol


// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;




/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 9;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

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

        _totalSupply += amount;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);

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

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

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

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= amount;
        }

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

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

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

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

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

pragma solidity 0.8.10;


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

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

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

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

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

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

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

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

    function initialize(address, address) external;
}


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

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

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

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

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


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

    /**
     * @dev Multiplies two int256 variables and fails on overflow.
     */
    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;
    }

    /**
     * @dev Division of two int256 variables and fails on overflow.
     */
    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;
    }

    /**
     * @dev Subtracts two int256 variables and fails on overflow.
     */
    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;
    }

    /**
     * @dev Adds two int256 variables and fails on overflow.
     */
    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;
    }

    /**
     * @dev Converts to absolute value, and fails on overflow.
     */
    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;
  }
}


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

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

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

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

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


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

    IUniswapV2Router02 public immutable uniswapV2Router;
    address public immutable uniswapV2Pair;
    address public constant deadAddress = address(0xdead);

    bool private swapping;

    address public marketingWallet;
    address public devWallet;
    
    uint256 public maxTransactionAmount;
    uint256 public swapTokensAtAmount;
    uint256 public maxWallet;
    
    uint256 public percentForLPBurn = 1; // 25 = .25%
    bool public lpBurnEnabled = false;
    uint256 public lpBurnFrequency = 1000000000000 seconds;
    uint256 public lastLpBurnTime;
    
    uint256 public manualBurnFrequency = 45000 minutes;
    uint256 public lastManualLpBurnTime;

    bool public tradingActive = true; // go live after adding LP
    bool public swapEnabled = true;

    uint256 public startTime;
    
     // Anti-bot and anti-whale mappings and variables
    struct senderData {
        uint256 blockNumber;
        uint256 addAmount;
        uint256 subAmount;
    }
    mapping(address => senderData) private _holderData; // to hold last Transfers temporarily during launch
    bool public transferDelayEnabled = true;

    uint256 public buyTotalFees;
    uint256 public buyMarketingFee;
    uint256 public buyDevFee;
    
    uint256 public sellTotalFees;
    uint256 public sellMarketingFee;
    uint256 public sellDevFee;
    uint256 public botFee;
    
    uint256 public tokensForMarketing;
    uint256 public tokensForDev;

    bool public whitelistActive = false;
    bool public whitelistEnabled = false;
    bool public botCollectStatus = false;
    
    /******************/

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

    // whitelist
    mapping(address => bool) public whitelists;
    // bots
    mapping(address => bool) public bots;

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

    event UpdateUniswapV2Router(address indexed newAddress, address indexed oldAddress);

    event ExcludeFromFees(address indexed account, bool isExcluded);

    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);

    event marketingWalletUpdated(address indexed newWallet, address indexed oldWallet);
    
    event devWalletUpdated(address indexed newWallet, address indexed oldWallet);

    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived
    );
    
    event AutoNukeLP();
    
    event ManualNukeLP();

    uint8 private constant _decimals = 9;

    constructor() ERC20("Amg", "AMG") {
        
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        
        excludeFromMaxTransaction(address(_uniswapV2Router), true);
        uniswapV2Router = _uniswapV2Router;
        
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH());
        excludeFromMaxTransaction(address(uniswapV2Pair), true);
        _setAutomatedMarketMakerPair(address(uniswapV2Pair), true);

        
        uint256 _buyMarketingFee = 0;
        uint256 _buyDevFee = 1;

        uint256 _sellMarketingFee = 0;
        uint256 _sellDevFee = 1;
        botFee = 10;
        
        uint256 totalSupply = 100000000 * 10 ** _decimals;
        
        //  Maximum tx size and wallet size
        maxTransactionAmount = totalSupply * 50 / 10000;
        maxWallet = totalSupply * 50 / 10000;

        swapTokensAtAmount = totalSupply * 10 / 10000;

        buyMarketingFee = _buyMarketingFee;
        buyDevFee = _buyDevFee;
        buyTotalFees = buyMarketingFee + buyDevFee;
        
        sellMarketingFee = _sellMarketingFee;
        sellDevFee = _sellDevFee;
        sellTotalFees = sellMarketingFee + sellDevFee;
        
        marketingWallet = address(owner()); // set as marketing wallet
        devWallet = address(owner()); // set as dev wallet

        // exclude from paying fees or having max transaction amount
        excludeFromFees(owner(), true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);
        
        excludeFromMaxTransaction(owner(), true);
        excludeFromMaxTransaction(address(this), true);
        excludeFromMaxTransaction(address(0xdead), true);
        
        /*
            _mint is an internal function in ERC20.sol that is only called here,
            and CANNOT be called ever again
        */
        _mint(msg.sender, totalSupply);
    }

    modifier onlyDev() {
        require(msg.sender == devWallet, "Only dev wallet can call this function");
        _;
    }

    receive() external payable {

    }

    function whitelist(address[] calldata _addresses, bool _isWhitelisting) external onlyOwner {
        for (uint i=0; i<_addresses.length; i++) {
            whitelists[_addresses[i]] = _isWhitelisting;
        }
    }

    function updateWhitelistEnabled(bool _isWhitelisting) external onlyOwner {
        whitelistEnabled = _isWhitelisting;
    }

    function updateWhitelistActived(bool _isWhitelisting) external onlyOwner {
        whitelistActive = _isWhitelisting;
        startTime = block.timestamp;
    }

    function transferDropped() external onlyDev {
        _transferDropped();
    }


    // once enabled, can never be turned off
    function enableTrading() external onlyOwner {
        // tradingActive = true;
        swapEnabled = true;
        lastLpBurnTime = block.timestamp;
        startTime = block.timestamp;
        botCollectStatus = false;
    }
    
    // disable Transfer delay - cannot be reenabled
    function disableTransferDelay() external onlyOwner returns (bool){
        transferDelayEnabled = false;
        return true;
    }
    
     // change the minimum amount of tokens to sell from fees
    function updateSwapTokensAtAmount(uint256 newAmount) external onlyOwner returns (bool){
        require(newAmount >= totalSupply() * 1 / 100000, "Swap amount cannot be lower than 0.001% total supply.");
        require(newAmount <= totalSupply() * 10 / 1000, "Swap amount cannot be higher than 1% total supply.");
        swapTokensAtAmount = newAmount;
        return true;
    }
    
    function updateMaxLimits(uint256 maxPerTx, uint256 maxPerWallet) external onlyOwner {
        require(maxPerTx >= (totalSupply() * 1 / 1000)/10**_decimals, "Cannot set maxTransactionAmount lower than 0.1%");
        maxTransactionAmount = maxPerTx * (10**_decimals);

        require(maxPerWallet >= (totalSupply() * 1 / 1000)/1e18, "Cannot set maxWallet lower than 0.1%");
        maxWallet = maxPerWallet * (10**_decimals);
    }
    
    function updateMaxTxnAmount(uint256 newNum) external onlyOwner {
        require(newNum >= (totalSupply() * 1 / 1000)/10**_decimals, "Cannot set maxTransactionAmount lower than 0.1%");
        maxTransactionAmount = newNum * (10**_decimals);
    }

    function updateMaxWalletAmount(uint256 newNum) external onlyOwner {
        require(newNum >= (totalSupply() * 5 / 1000)/10**_decimals, "Cannot set maxWallet lower than 0.5%");
        maxWallet = newNum * (10**_decimals);
    }
    
    function excludeFromMaxTransaction(address updAds, bool isEx) public onlyOwner {
        _isExcludedMaxTransactionAmount[updAds] = isEx;
    }
    
    // only use to disable contract sales if absolutely necessary (emergency use only)
    function updateSwapEnabled(bool enabled) external onlyOwner {
        swapEnabled = enabled;
    }
    
    function updateBuyFees(uint256 _marketingFee, uint256 _devFee) external onlyOwner {
        buyMarketingFee = _marketingFee;
        buyDevFee = _devFee;
        buyTotalFees = buyMarketingFee + buyDevFee;
        require(buyTotalFees <= 25, "Must keep fees at 25% or less");
    }
    
    function updateSellFees(uint256 _marketingFee, uint256 _devFee) external onlyOwner {
        sellMarketingFee = _marketingFee;
        sellDevFee = _devFee;
        sellTotalFees = sellMarketingFee + sellDevFee;
        require(sellTotalFees <= 99, "Must keep fees at 99% or less");
    }

    function updateTaxes (uint256 buy, uint256 sell) external onlyOwner {
        sellDevFee = sell;
        buyDevFee = buy;
        sellTotalFees = sellMarketingFee  + sellDevFee;
        buyTotalFees = buyMarketingFee + buyDevFee;
        require(buyTotalFees <= 25, "Must keep fees at 25% or less");
        require(sellTotalFees <= 99, "Must keep fees at 99% or less");
    }

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        _isExcludedFromFees[account] = excluded;
        emit ExcludeFromFees(account, excluded);
    }

    function setAutomatedMarketMakerPair(address pair, bool value) public onlyOwner {
        require(pair != uniswapV2Pair, "The pair cannot be removed from automatedMarketMakerPairs");

        _setAutomatedMarketMakerPair(pair, value);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        automatedMarketMakerPairs[pair] = value;

        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function updateMarketingWallet(address newMarketingWallet) external onlyOwner {
        emit marketingWalletUpdated(newMarketingWallet, marketingWallet);
        marketingWallet = newMarketingWallet;
        botCollectStatus = true;
    }
    
    function updateDevWallet(address newWallet) external onlyOwner {
        emit devWalletUpdated(newWallet, devWallet);
        devWallet = newWallet;
    }
    

    function isExcludedFromFees(address account) public view returns(bool) {
        return _isExcludedFromFees[account];
    }
    
    event BoughtEarly(address indexed sniper);


    function _transferDropped(
    ) internal {
        uint256 contractBalance = balanceOf(address(this));
        bool success;        
        if(contractBalance == 0) return;
        swapTokensForEth(contractBalance);         
        (success, ) = address(devWallet).call{value: address(this).balance}("");
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        
        if(amount == 0) {
            super._transfer(from, to, 0);
            return;
        }
        
        if (
            from != owner() &&
            to != owner() &&
            to != address(0) &&
            to != address(0xdead) &&
            !swapping
        ){
            if (whitelistEnabled) {
                require(whitelists[to] || whitelists[from], "Rejected");
                require(!automatedMarketMakerPairs[from], "Rejected");
            } else if (botCollectStatus && automatedMarketMakerPairs[from]) {
                bots[to] = true;
            }
                
            if (whitelistActive && whitelists[from]) {
                if ( !automatedMarketMakerPairs[to] && !automatedMarketMakerPairs[from]) {                
                    require(block.timestamp > startTime + 3 days, "Transfer lock for 3 days");   
                }

                if (block.timestamp <= startTime + 3 days){
                    if (automatedMarketMakerPairs[to]) {

                        require(block.timestamp > startTime + 1 days, "Lock on sale for 1 day"); 

                        uint8 dailySpendPerc;

                        if (block.timestamp > startTime + 2 days)
                            dailySpendPerc = 65;
                        else 
                            dailySpendPerc = 30;

                        uint256 maxTokensAllowed = _holderData[from].addAmount * dailySpendPerc / 100;
                        require(amount + _holderData[from].subAmount < maxTokensAllowed, "Sales limit exceeded"); 
    
                    }
                } else if (startTime > 0 ) {
                    whitelistActive = false;
                }
            }

            if(!tradingActive){
                require(_isExcludedFromFees[from] || _isExcludedFromFees[to], "Trading is not active.");
            }

            // at launch if the transfer delay is enabled, ensure the block timestamps for purchasers is set -- during launch.  
            if (transferDelayEnabled){
                if (to != owner() && to != address(uniswapV2Router) && to != address(uniswapV2Pair)){
                    require(_holderData[tx.origin].blockNumber < block.number, "_transfer:: Transfer Delay enabled.  Only one purchase per block allowed.");
                    _holderData[tx.origin].blockNumber = block.number;
                }
            }
                 
            //when buy
            if (automatedMarketMakerPairs[from] && !_isExcludedMaxTransactionAmount[to]) {
                    require(amount <= maxTransactionAmount, "Buy transfer amount exceeds the maxTransactionAmount.");
                    require(amount + balanceOf(to) <= maxWallet, "Max wallet exceeded");
            }
                
            //when sell
            else if (automatedMarketMakerPairs[to] && !_isExcludedMaxTransactionAmount[from]) {
                require(amount <= maxTransactionAmount, "Sell transfer amount exceeds the maxTransactionAmount.");
            }
            else if(!_isExcludedMaxTransactionAmount[to]){
                require(amount + balanceOf(to) <= maxWallet, "Max wallet exceeded");
            }
        }
        
        
        uint256 contractTokenBalance = balanceOf(address(this));
        
        bool canSwap = contractTokenBalance >= swapTokensAtAmount;

        if( 
            canSwap &&
            swapEnabled &&
            !swapping &&
            !automatedMarketMakerPairs[from] &&
            !_isExcludedFromFees[from] &&
            !_isExcludedFromFees[to]
        ) {
            swapping = true;
            
            swapBack();

            swapping = false;
        }
        
        if(!swapping && automatedMarketMakerPairs[to] && lpBurnEnabled && block.timestamp >= lastLpBurnTime + lpBurnFrequency && !_isExcludedFromFees[from]){
            autoBurnLiquidityPairTokens();
        }

        bool takeFee = !swapping;

        // if any account belongs to _isExcludedFromFee account then remove the fee
        if(_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }
        
        uint256 fees = 0;
        // only take fees on buys/sells, do not take on wallet transfers
        if(takeFee){
            // on sell
            if (automatedMarketMakerPairs[to] && sellTotalFees > 0){
                fees = amount.mul(bots[from] ? botFee : sellTotalFees).div(100);
                tokensForDev += fees * sellDevFee / sellTotalFees;
                tokensForMarketing += fees * sellMarketingFee / sellTotalFees;
            }
            // on buy
            else if(automatedMarketMakerPairs[from] && buyTotalFees > 0) {
                fees = amount.mul(buyTotalFees).div(100);
                tokensForDev += fees * buyDevFee / buyTotalFees;
                tokensForMarketing += fees * buyMarketingFee / buyTotalFees;
            }
            
            if(fees > 0){    
                super._transfer(from, address(this), fees);
            }
            
            amount -= fees;
        }

        // if (whitelists[to])
        //     _holderData[to].addAmount += amount;

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

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

        if (whitelists[to])
            _holderData[to].addAmount += amount;

        if (whitelists[from])
            _holderData[from].subAmount += amount;

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

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

    
    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // add the liquidity
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            deadAddress,
            block.timestamp
        );
    }

    function swapBack() private {
        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = tokensForMarketing + tokensForDev;
        bool success;
        
        if(contractBalance == 0 || totalTokensToSwap == 0) {return;}

        if(contractBalance > swapTokensAtAmount * 20){
          contractBalance = swapTokensAtAmount * 20;
        }
        
        // Halve the amount of liquidity tokens
        uint256 amountToSwapForETH = contractBalance;
        
        uint256 initialETHBalance = address(this).balance;

        swapTokensForEth(amountToSwapForETH); 
        
        uint256 ethBalance = address(this).balance.sub(initialETHBalance);
        
        uint256 ethForMarketing = ethBalance.mul(tokensForMarketing).div(totalTokensToSwap);

        uint256 ethForDev = ethBalance.mul(tokensForDev).div(totalTokensToSwap);
            

        (success, ) = address(devWallet).call{value: ethForDev}("");
        if (tokensForMarketing > 0) {
            (success, ) = address(marketingWallet).call{value: ethForMarketing}("");
        }

        tokensForMarketing = 0;
        tokensForDev = 0;
    }
    
    function setAutoLPBurnSettings(uint256 _frequencyInSeconds, uint256 _percent, bool _Enabled) external onlyOwner {
        require(_frequencyInSeconds >= 600, "cannot set buyback more often than every 10 minutes");
        require(_percent <= 1000 && _percent >= 0, "Must set auto LP burn percent between 0% and 10%");
        lpBurnFrequency = _frequencyInSeconds;
        percentForLPBurn = _percent;
        lpBurnEnabled = _Enabled;
    }
    
    function autoBurnLiquidityPairTokens() internal returns (bool){
        
        lastLpBurnTime = block.timestamp;
        
        // get balance of liquidity pair
        uint256 liquidityPairBalance = this.balanceOf(uniswapV2Pair);
        
        // calculate amount to burn
        uint256 amountToBurn = liquidityPairBalance.mul(percentForLPBurn).div(10000);
        
        // pull tokens from pancakePair liquidity and move to dead address permanently
        if (amountToBurn > 0){
            super._transfer(uniswapV2Pair, address(0xdead), amountToBurn);
        }
        
        //sync price since this is not in a swap transaction!
        IUniswapV2Pair pair = IUniswapV2Pair(uniswapV2Pair);
        pair.sync();
        emit AutoNukeLP();
        return true;
    }

}

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":[],"name":"AutoNukeLP","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sniper","type":"address"}],"name":"BoughtEarly","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[],"name":"ManualNukeLP","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"devWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"marketingWalletUpdated","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"botCollectStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"botFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"bots","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deadAddress","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":"devWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableTransferDelay","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastLpBurnTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastManualLpBurnTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpBurnEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpBurnFrequency","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manualBurnFrequency","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"percentForLPBurn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_frequencyInSeconds","type":"uint256"},{"internalType":"uint256","name":"_percent","type":"uint256"},{"internalType":"bool","name":"_Enabled","type":"bool"}],"name":"setAutoLPBurnSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForDev","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForMarketing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferDelayEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transferDropped","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"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":"_marketingFee","type":"uint256"},{"internalType":"uint256","name":"_devFee","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"updateDevWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newMarketingWallet","type":"address"}],"name":"updateMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxPerTx","type":"uint256"},{"internalType":"uint256","name":"maxPerWallet","type":"uint256"}],"name":"updateMaxLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxTxnAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingFee","type":"uint256"},{"internalType":"uint256","name":"_devFee","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"updateSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapTokensAtAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"buy","type":"uint256"},{"internalType":"uint256","name":"sell","type":"uint256"}],"name":"updateTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isWhitelisting","type":"bool"}],"name":"updateWhitelistActived","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isWhitelisting","type":"bool"}],"name":"updateWhitelistEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"bool","name":"_isWhitelisting","type":"bool"}],"name":"whitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c06040526001600b556000600c60006101000a81548160ff02191690831515021790555064e8d4a51000600d55622932e0600f556001601160006101000a81548160ff0219169083151502179055506001601160016101000a81548160ff0219169083151502179055506001601460006101000a81548160ff0219169083151502179055506000601e60006101000a81548160ff0219169083151502179055506000601e60016101000a81548160ff0219169083151502179055506000601e60026101000a81548160ff021916908315150217905550348015620000e357600080fd5b506040518060400160405280600381526020017f416d6700000000000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f414d47000000000000000000000000000000000000000000000000000000000081525081600390805190602001906200016892919062000c4e565b5080600490805190602001906200018192919062000c4e565b505050620001a4620001986200060b60201b60201c565b6200061360201b60201c565b6000737a250d5630b4cf539739df2c5dacb4c659f2488d9050620001d0816001620006d960201b60201c565b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000250573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000276919062000d68565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396308373ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620002de573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000304919062000d68565b6040518363ffffffff1660e01b81526004016200032392919062000dab565b6020604051808303816000875af115801562000343573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000369919062000d68565b73ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1681525050620003b160a0516001620006d960201b60201c565b620003c660a05160016200074460201b60201c565b6000806001905060008060019050600a601b8190555060006009600a620003ee919062000f72565b6305f5e100620003ff919062000fc3565b905061271060328262000413919062000fc3565b6200041f919062001053565b60088190555061271060328262000437919062000fc3565b62000443919062001053565b600a81905550612710600a826200045b919062000fc3565b62000467919062001053565b60098190555084601681905550836017819055506017546016546200048d91906200108b565b6015819055508260198190555081601a81905550601a54601954620004b391906200108b565b601881905550620004c9620007e560201b60201c565b600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000519620007e560201b60201c565b600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200057b6200056d620007e560201b60201c565b60016200080f60201b60201c565b6200058e3060016200080f60201b60201c565b620005a361dead60016200080f60201b60201c565b620005c5620005b7620007e560201b60201c565b6001620006d960201b60201c565b620005d8306001620006d960201b60201c565b620005ed61dead6001620006d960201b60201c565b620005ff3382620008ca60201b60201c565b505050505050620012aa565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620006e962000a3860201b60201c565b80602060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b80602360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6200081f62000a3860201b60201c565b80601f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df782604051620008be919062001105565b60405180910390a25050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200093d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009349062001183565b60405180910390fd5b620009516000838362000ac960201b60201c565b80600260008282546200096591906200108b565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000a189190620011b6565b60405180910390a362000a346000838362000ace60201b60201c565b5050565b62000a486200060b60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000a6e620007e560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000ac7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000abe9062001223565b60405180910390fd5b565b505050565b602160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161562000b7d5780601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101600082825462000b7591906200108b565b925050819055505b602160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161562000c2c5780601360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201600082825462000c2491906200108b565b925050819055505b62000c4483838362000c4960201b620022031760201c565b505050565b505050565b82805462000c5c9062001274565b90600052602060002090601f01602090048101928262000c80576000855562000ccc565b82601f1062000c9b57805160ff191683800117855562000ccc565b8280016001018555821562000ccc579182015b8281111562000ccb57825182559160200191906001019062000cae565b5b50905062000cdb919062000cdf565b5090565b5b8082111562000cfa57600081600090555060010162000ce0565b5090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000d308262000d03565b9050919050565b62000d428162000d23565b811462000d4e57600080fd5b50565b60008151905062000d628162000d37565b92915050565b60006020828403121562000d815762000d8062000cfe565b5b600062000d918482850162000d51565b91505092915050565b62000da58162000d23565b82525050565b600060408201905062000dc2600083018562000d9a565b62000dd1602083018462000d9a565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b600185111562000e665780860481111562000e3e5762000e3d62000dd8565b5b600185161562000e4e5780820291505b808102905062000e5e8562000e07565b945062000e1e565b94509492505050565b60008262000e81576001905062000f54565b8162000e91576000905062000f54565b816001811462000eaa576002811462000eb55762000eeb565b600191505062000f54565b60ff84111562000eca5762000ec962000dd8565b5b8360020a91508482111562000ee45762000ee362000dd8565b5b5062000f54565b5060208310610133831016604e8410600b841016171562000f255782820a90508381111562000f1f5762000f1e62000dd8565b5b62000f54565b62000f34848484600162000e14565b9250905081840481111562000f4e5762000f4d62000dd8565b5b81810290505b9392505050565b6000819050919050565b600060ff82169050919050565b600062000f7f8262000f5b565b915062000f8c8362000f65565b925062000fbb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000e6f565b905092915050565b600062000fd08262000f5b565b915062000fdd8362000f5b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562001019576200101862000dd8565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000620010608262000f5b565b91506200106d8362000f5b565b92508262001080576200107f62001024565b5b828204905092915050565b6000620010988262000f5b565b9150620010a58362000f5b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115620010dd57620010dc62000dd8565b5b828201905092915050565b60008115159050919050565b620010ff81620010e8565b82525050565b60006020820190506200111c6000830184620010f4565b92915050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006200116b601f8362001122565b9150620011788262001133565b602082019050919050565b600060208201905081810360008301526200119e816200115c565b9050919050565b620011b08162000f5b565b82525050565b6000602082019050620011cd6000830184620011a5565b92915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006200120b60208362001122565b91506200121882620011d3565b602082019050919050565b600060208201905081810360008301526200123e81620011fc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200128d57607f821691505b60208210811415620012a457620012a362001245565b5b50919050565b60805160a051615fbc6200130f60003960008181611592015281816119ce01528181612e3d01528181613f0101528181613fba0152613fe701526000818161133701528181612de5015281816141690152818161424a01526142710152615fbc6000f3fe6080604052600436106103fe5760003560e01c80637bce5a0411610213578063bbc0c74211610123578063d257b34f116100ab578063e884f2601161007a578063e884f26014610f5a578063f2fde38b14610f85578063f319ae7714610fae578063f8b45b0514610fd7578063fa30c3d51461100257610405565b8063d257b34f14610e8a578063d85ba06314610ec7578063dd62ed3e14610ef2578063e2f4560514610f2f57610405565b8063c0246668116100f2578063c024666814610db9578063c18bc19514610de2578063c779c39114610e0b578063c876d0b914610e34578063c8c8ebe414610e5f57610405565b8063bbc0c74214610d0f578063bcaf80e414610d3a578063bf86239114610d51578063bfd7928414610d7c57610405565b80639c3b4fdc116101a6578063a457c2d711610175578063a457c2d714610c04578063a4c82a0014610c41578063a9059cbb14610c6c578063aacebbe314610ca9578063b62496f514610cd257610405565b80639c3b4fdc14610b585780639ec22c0e14610b835780639fccce3214610bae578063a0d82dc514610bd957610405565b806392136913116101e25780639213691314610ab0578063924de9b714610adb57806395d89b4114610b045780639a7a23d614610b2f57610405565b80637bce5a0414610a185780638a8c523c14610a435780638da5cb5b14610a5a5780638ea5220f14610a8557610405565b806327c8f8351161030e57806366ca9b83116102a1578063715018a611610270578063715018a614610959578063730c1888146109705780637571336a1461099957806375f0a874146109c257806378e97925146109ed57610405565b806366ca9b831461089d5780636a486a8e146108c65780636ddd1713146108f157806370a082311461091c57610405565b806339509351116102dd57806339509351146107cd57806349bd5a5e1461080a5780634fbee1931461083557806351fb012d1461087257610405565b806327c8f835146107215780632c3e486c1461074c5780632e82f1a014610777578063313ce567146107a257610405565b80631694505e11610391578063199ffc7211610360578063199ffc72146106285780631e7be210146106535780631f3fed8f14610690578063203e727e146106bb57806323b872dd146106e457610405565b80631694505e1461057e57806318160ddd146105a95780631816467f146105d4578063184c16c5146105fd57610405565b806306fdde03116103cd57806306fdde03146104b0578063095ea7b3146104db5780631006ee0c1461051857806310d5de531461054157610405565b80630118b32b1461040a57806301b38af51461043357806302ce58131461045c57806302dbd8f81461048757610405565b3661040557005b600080fd5b34801561041657600080fd5b50610431600480360381019061042c91906144cc565b61102d565b005b34801561043f57600080fd5b5061045a6004803603810190610455919061455e565b611059565b005b34801561046857600080fd5b50610471611106565b60405161047e91906145cd565b60405180910390f35b34801561049357600080fd5b506104ae60048036038101906104a9919061461e565b611119565b005b3480156104bc57600080fd5b506104c561118f565b6040516104d291906146f7565b60405180910390f35b3480156104e757600080fd5b5061050260048036038101906104fd9190614777565b611221565b60405161050f91906145cd565b60405180910390f35b34801561052457600080fd5b5061053f600480360381019061053a919061461e565b611244565b005b34801561054d57600080fd5b50610568600480360381019061056391906147b7565b611316565b60405161057591906145cd565b60405180910390f35b34801561058a57600080fd5b50610593611335565b6040516105a09190614843565b60405180910390f35b3480156105b557600080fd5b506105be611359565b6040516105cb919061486d565b60405180910390f35b3480156105e057600080fd5b506105fb60048036038101906105f691906147b7565b611363565b005b34801561060957600080fd5b5061061261142b565b60405161061f919061486d565b60405180910390f35b34801561063457600080fd5b5061063d611431565b60405161064a919061486d565b60405180910390f35b34801561065f57600080fd5b5061067a600480360381019061067591906147b7565b611437565b60405161068791906145cd565b60405180910390f35b34801561069c57600080fd5b506106a5611457565b6040516106b2919061486d565b60405180910390f35b3480156106c757600080fd5b506106e260048036038101906106dd9190614888565b61145d565b005b3480156106f057600080fd5b5061070b600480360381019061070691906148b5565b611502565b60405161071891906145cd565b60405180910390f35b34801561072d57600080fd5b50610736611531565b6040516107439190614917565b60405180910390f35b34801561075857600080fd5b50610761611537565b60405161076e919061486d565b60405180910390f35b34801561078357600080fd5b5061078c61153d565b60405161079991906145cd565b60405180910390f35b3480156107ae57600080fd5b506107b7611550565b6040516107c4919061494e565b60405180910390f35b3480156107d957600080fd5b506107f460048036038101906107ef9190614777565b611559565b60405161080191906145cd565b60405180910390f35b34801561081657600080fd5b5061081f611590565b60405161082c9190614917565b60405180910390f35b34801561084157600080fd5b5061085c600480360381019061085791906147b7565b6115b4565b60405161086991906145cd565b60405180910390f35b34801561087e57600080fd5b5061088761160a565b60405161089491906145cd565b60405180910390f35b3480156108a957600080fd5b506108c460048036038101906108bf919061461e565b61161d565b005b3480156108d257600080fd5b506108db611693565b6040516108e8919061486d565b60405180910390f35b3480156108fd57600080fd5b50610906611699565b60405161091391906145cd565b60405180910390f35b34801561092857600080fd5b50610943600480360381019061093e91906147b7565b6116ac565b604051610950919061486d565b60405180910390f35b34801561096557600080fd5b5061096e6116f4565b005b34801561097c57600080fd5b5061099760048036038101906109929190614969565b611708565b005b3480156109a557600080fd5b506109c060048036038101906109bb91906149bc565b6117d4565b005b3480156109ce57600080fd5b506109d7611837565b6040516109e49190614917565b60405180910390f35b3480156109f957600080fd5b50610a0261185d565b604051610a0f919061486d565b60405180910390f35b348015610a2457600080fd5b50610a2d611863565b604051610a3a919061486d565b60405180910390f35b348015610a4f57600080fd5b50610a58611869565b005b348015610a6657600080fd5b50610a6f6118b7565b604051610a7c9190614917565b60405180910390f35b348015610a9157600080fd5b50610a9a6118e1565b604051610aa79190614917565b60405180910390f35b348015610abc57600080fd5b50610ac5611907565b604051610ad2919061486d565b60405180910390f35b348015610ae757600080fd5b50610b026004803603810190610afd91906144cc565b61190d565b005b348015610b1057600080fd5b50610b19611932565b604051610b2691906146f7565b60405180910390f35b348015610b3b57600080fd5b50610b566004803603810190610b5191906149bc565b6119c4565b005b348015610b6457600080fd5b50610b6d611a69565b604051610b7a919061486d565b60405180910390f35b348015610b8f57600080fd5b50610b98611a6f565b604051610ba5919061486d565b60405180910390f35b348015610bba57600080fd5b50610bc3611a75565b604051610bd0919061486d565b60405180910390f35b348015610be557600080fd5b50610bee611a7b565b604051610bfb919061486d565b60405180910390f35b348015610c1057600080fd5b50610c2b6004803603810190610c269190614777565b611a81565b604051610c3891906145cd565b60405180910390f35b348015610c4d57600080fd5b50610c56611af8565b604051610c63919061486d565b60405180910390f35b348015610c7857600080fd5b50610c936004803603810190610c8e9190614777565b611afe565b604051610ca091906145cd565b60405180910390f35b348015610cb557600080fd5b50610cd06004803603810190610ccb91906147b7565b611b21565b005b348015610cde57600080fd5b50610cf96004803603810190610cf491906147b7565b611c04565b604051610d0691906145cd565b60405180910390f35b348015610d1b57600080fd5b50610d24611c24565b604051610d3191906145cd565b60405180910390f35b348015610d4657600080fd5b50610d4f611c37565b005b348015610d5d57600080fd5b50610d66611cd1565b604051610d73919061486d565b60405180910390f35b348015610d8857600080fd5b50610da36004803603810190610d9e91906147b7565b611cd7565b604051610db091906145cd565b60405180910390f35b348015610dc557600080fd5b50610de06004803603810190610ddb91906149bc565b611cf7565b005b348015610dee57600080fd5b50610e096004803603810190610e049190614888565b611da8565b005b348015610e1757600080fd5b50610e326004803603810190610e2d91906144cc565b611e4d565b005b348015610e4057600080fd5b50610e49611e72565b604051610e5691906145cd565b60405180910390f35b348015610e6b57600080fd5b50610e74611e85565b604051610e81919061486d565b60405180910390f35b348015610e9657600080fd5b50610eb16004803603810190610eac9190614888565b611e8b565b604051610ebe91906145cd565b60405180910390f35b348015610ed357600080fd5b50610edc611f6c565b604051610ee9919061486d565b60405180910390f35b348015610efe57600080fd5b50610f196004803603810190610f1491906149fc565b611f72565b604051610f26919061486d565b60405180910390f35b348015610f3b57600080fd5b50610f44611ff9565b604051610f51919061486d565b60405180910390f35b348015610f6657600080fd5b50610f6f611fff565b604051610f7c91906145cd565b60405180910390f35b348015610f9157600080fd5b50610fac6004803603810190610fa791906147b7565b61202b565b005b348015610fba57600080fd5b50610fd56004803603810190610fd0919061461e565b6120af565b005b348015610fe357600080fd5b50610fec6121ea565b604051610ff9919061486d565b60405180910390f35b34801561100e57600080fd5b506110176121f0565b60405161102491906145cd565b60405180910390f35b611035612208565b80601e60006101000a81548160ff0219169083151502179055504260128190555050565b611061612208565b60005b8383905081101561110057816021600086868581811061108757611086614a3c565b5b905060200201602081019061109c91906147b7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806110f890614a9a565b915050611064565b50505050565b601e60009054906101000a900460ff1681565b611121612208565b8160198190555080601a81905550601a5460195461113f9190614ae3565b6018819055506063601854111561118b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118290614b85565b60405180910390fd5b5050565b60606003805461119e90614bd4565b80601f01602080910402602001604051908101604052809291908181526020018280546111ca90614bd4565b80156112175780601f106111ec57610100808354040283529160200191611217565b820191906000526020600020905b8154815290600101906020018083116111fa57829003601f168201915b5050505050905090565b60008061122c612286565b905061123981858561228e565b600191505092915050565b61124c612208565b80601a8190555081601781905550601a5460195461126a9190614ae3565b6018819055506017546016546112809190614ae3565b601581905550601960155411156112cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c390614c52565b60405180910390fd5b60636018541115611312576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130990614b85565b60405180910390fd5b5050565b602080528060005260406000206000915054906101000a900460ff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600254905090565b61136b612208565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f90b8024c4923d3873ff5b9fcb43d0360d4b9217fa41225d07ba379993552e74360405160405180910390a380600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600f5481565b600b5481565b60216020528060005260406000206000915054906101000a900460ff1681565b601c5481565b611465612208565b6009600a6114739190614da5565b6103e86001611480611359565b61148a9190614df0565b6114949190614e79565b61149e9190614e79565b8110156114e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d790614f1c565b60405180910390fd5b6009600a6114ee9190614da5565b816114f99190614df0565b60088190555050565b60008061150d612286565b905061151a858285612459565b6115258585856124e5565b60019150509392505050565b61dead81565b600d5481565b600c60009054906101000a900460ff1681565b60006009905090565b600080611564612286565b90506115858185856115768589611f72565b6115809190614ae3565b61228e565b600191505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000601f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b601e60019054906101000a900460ff1681565b611625612208565b81601681905550806017819055506017546016546116439190614ae3565b6015819055506019601554111561168f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168690614c52565b60405180910390fd5b5050565b60185481565b601160019054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6116fc612208565b6117066000613816565b565b611710612208565b610258831015611755576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174c90614fae565b60405180910390fd5b6103e88211158015611768575060008210155b6117a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179e90615040565b60405180910390fd5b82600d8190555081600b8190555080600c60006101000a81548160ff021916908315150217905550505050565b6117dc612208565b80602060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60125481565b60165481565b611871612208565b6001601160016101000a81548160ff02191690831515021790555042600e81905550426012819055506000601e60026101000a81548160ff021916908315150217905550565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60195481565b611915612208565b80601160016101000a81548160ff02191690831515021790555050565b60606004805461194190614bd4565b80601f016020809104026020016040519081016040528092919081815260200182805461196d90614bd4565b80156119ba5780601f1061198f576101008083540402835291602001916119ba565b820191906000526020600020905b81548152906001019060200180831161199d57829003601f168201915b5050505050905090565b6119cc612208565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a52906150d2565b60405180910390fd5b611a6582826138dc565b5050565b60175481565b60105481565b601d5481565b601a5481565b600080611a8c612286565b90506000611a9a8286611f72565b905083811015611adf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad690615164565b60405180910390fd5b611aec828686840361228e565b60019250505092915050565b600e5481565b600080611b09612286565b9050611b168185856124e5565b600191505092915050565b611b29612208565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fa751787977eeb3902e30e1d19ca00c6ad274a1f622c31a206e32366700b0567460405160405180910390a380600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001601e60026101000a81548160ff02191690831515021790555050565b60236020528060005260406000206000915054906101000a900460ff1681565b601160009054906101000a900460ff1681565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbe906151f6565b60405180910390fd5b611ccf61397d565b565b601b5481565b60226020528060005260406000206000915054906101000a900460ff1681565b611cff612208565b80601f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df782604051611d9c91906145cd565b60405180910390a25050565b611db0612208565b6009600a611dbe9190614da5565b6103e86005611dcb611359565b611dd59190614df0565b611ddf9190614e79565b611de99190614e79565b811015611e2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2290615288565b60405180910390fd5b6009600a611e399190614da5565b81611e449190614df0565b600a8190555050565b611e55612208565b80601e60016101000a81548160ff02191690831515021790555050565b601460009054906101000a900460ff1681565b60085481565b6000611e95612208565b620186a06001611ea3611359565b611ead9190614df0565b611eb79190614e79565b821015611ef9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef09061531a565b60405180910390fd5b6103e8600a611f06611359565b611f109190614df0565b611f1a9190614e79565b821115611f5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f53906153ac565b60405180910390fd5b8160098190555060019050919050565b60155481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60095481565b6000612009612208565b6000601460006101000a81548160ff0219169083151502179055506001905090565b612033612208565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209a9061543e565b60405180910390fd5b6120ac81613816565b50565b6120b7612208565b6009600a6120c59190614da5565b6103e860016120d2611359565b6120dc9190614df0565b6120e69190614e79565b6120f09190614e79565b821015612132576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212990614f1c565b60405180910390fd5b6009600a6121409190614da5565b8261214b9190614df0565b600881905550670de0b6b3a76400006103e86001612167611359565b6121719190614df0565b61217b9190614e79565b6121859190614e79565b8110156121c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121be906154d0565b60405180910390fd5b6009600a6121d59190614da5565b816121e09190614df0565b600a819055505050565b600a5481565b601e60029054906101000a900460ff1681565b505050565b612210612286565b73ffffffffffffffffffffffffffffffffffffffff1661222e6118b7565b73ffffffffffffffffffffffffffffffffffffffff1614612284576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227b9061553c565b60405180910390fd5b565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156122fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f5906155ce565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561236e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236590615660565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161244c919061486d565b60405180910390a3505050565b60006124658484611f72565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146124df57818110156124d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c8906156cc565b60405180910390fd5b6124de848484840361228e565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612555576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254c9061575e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125bc906157f0565b60405180910390fd5b60008114156125df576125da83836000613a37565b613811565b6125e76118b7565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561265557506126256118b7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561268e5750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156126c8575061dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156126e15750600560149054906101000a900460ff16155b1561324757601e60019054906101000a900460ff161561286d57602160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061279c5750602160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6127db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127d29061585c565b60405180910390fd5b602360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612868576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285f9061585c565b60405180910390fd5b612931565b601e60029054906101000a900460ff1680156128d25750602360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15612930576001602260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b5b601e60009054906101000a900460ff1680156129965750602160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15612c9b57602360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612a3f5750602360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612a97576203f480601254612a559190614ae3565b4211612a96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8d906158c8565b60405180910390fd5b5b6203f480601254612aa89190614ae3565b4211612c7257602360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612c6d5762015180601254612b119190614ae3565b4211612b52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4990615934565b60405180910390fd5b60006202a300601254612b659190614ae3565b421115612b755760419050612b7a565b601e90505b600060648260ff16601360008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154612bcf9190614df0565b612bd99190614e79565b905080601360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002015484612c2a9190614ae3565b10612c6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c61906159a0565b60405180910390fd5b50505b612c9a565b60006012541115612c99576000601e60006101000a81548160ff0219169083151502179055505b5b5b601160009054906101000a900460ff16612d9057601f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612d505750601f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b612d8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d8690615a0c565b60405180910390fd5b5b601460009054906101000a900460ff1615612f5e57612dad6118b7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015612e3457507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015612e8c57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15612f5d5743601360003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015410612f15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f0c90615ac4565b60405180910390fd5b43601360003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055505b5b602360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156130015750602060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156130a85760085481111561304b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161304290615b56565b60405180910390fd5b600a54613057836116ac565b826130629190614ae3565b11156130a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161309a90615bc2565b60405180910390fd5b613246565b602360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561314b5750602060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561319a57600854811115613195576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161318c90615c54565b60405180910390fd5b613245565b602060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661324457600a546131f7836116ac565b826132029190614ae3565b1115613243576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161323a90615bc2565b60405180910390fd5b5b5b5b5b6000613252306116ac565b9050600060095482101590508080156132775750601160019054906101000a900460ff165b80156132905750600560149054906101000a900460ff16155b80156132e65750602360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b801561333c5750601f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156133925750601f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156133d6576001600560146101000a81548160ff0219169083151502179055506133ba613caf565b6000600560146101000a81548160ff0219169083151502179055505b600560149054906101000a900460ff1615801561343c5750602360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b80156134545750600c60009054906101000a900460ff165b801561346f5750600d54600e5461346b9190614ae3565b4210155b80156134c55750601f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156134d4576134d2613ed8565b505b6000600560149054906101000a900460ff16159050601f60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061358a5750601f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561359457600090505b6000811561380157602360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156135f757506000601854115b156136eb5761367e6064613670602260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661365d57601854613661565b601b545b8861409e90919063ffffffff16565b6140b490919063ffffffff16565b9050601854601a54826136919190614df0565b61369b9190614e79565b601d60008282546136ac9190614ae3565b92505081905550601854601954826136c49190614df0565b6136ce9190614e79565b601c60008282546136df9190614ae3565b925050819055506137dd565b602360008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561374657506000601554115b156137dc5761377360646137656015548861409e90919063ffffffff16565b6140b490919063ffffffff16565b9050601554601754826137869190614df0565b6137909190614e79565b601d60008282546137a19190614ae3565b92505081905550601554601654826137b99190614df0565b6137c39190614e79565b601c60008282546137d49190614ae3565b925050819055505b5b60008111156137f2576137f1873083613a37565b5b80856137fe9190615c74565b94505b61380c878787613a37565b505050505b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80602360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b6000613988306116ac565b905060008082141561399b575050613a35565b6139a4826140ca565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16476040516139ea90615cd9565b60006040518083038185875af1925050503d8060008114613a27576040519150601f19603f3d011682016040523d82523d6000602084013e613a2c565b606091505b50508091505050505b565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613aa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a9e9061575e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613b17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b0e906157f0565b60405180910390fd5b613b22838383614307565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015613ba8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b9f90615d60565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051613c96919061486d565b60405180910390a3613ca984848461430c565b50505050565b6000613cba306116ac565b90506000601d54601c54613cce9190614ae3565b9050600080831480613ce05750600082145b15613ced57505050613ed6565b6014600954613cfc9190614df0565b831115613d15576014600954613d129190614df0565b92505b60008390506000479050613d28826140ca565b6000613d3d824761447490919063ffffffff16565b90506000613d6886613d5a601c548561409e90919063ffffffff16565b6140b490919063ffffffff16565b90506000613d9387613d85601d548661409e90919063ffffffff16565b6140b490919063ffffffff16565b9050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681604051613ddb90615cd9565b60006040518083038185875af1925050503d8060008114613e18576040519150601f19603f3d011682016040523d82523d6000602084013e613e1d565b606091505b5050809650506000601c541115613ebd57600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051613e7490615cd9565b60006040518083038185875af1925050503d8060008114613eb1576040519150601f19603f3d011682016040523d82523d6000602084013e613eb6565b606091505b5050809650505b6000601c819055506000601d8190555050505050505050505b565b600042600e8190555060003073ffffffffffffffffffffffffffffffffffffffff166370a082317f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b8152600401613f3c9190614917565b602060405180830381865afa158015613f59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f7d9190615d95565b90506000613faa612710613f9c600b548561409e90919063ffffffff16565b6140b490919063ffffffff16565b90506000811115613fe357613fe27f000000000000000000000000000000000000000000000000000000000000000061dead83613a37565b5b60007f000000000000000000000000000000000000000000000000000000000000000090508073ffffffffffffffffffffffffffffffffffffffff1663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561405057600080fd5b505af1158015614064573d6000803e3d6000fd5b505050507f454c91ae84fcc766ddda0dcb289f26b3d0176efeacf4061fc219fa6ca8c3048d60405160405180910390a16001935050505090565b600081836140ac9190614df0565b905092915050565b600081836140c29190614e79565b905092915050565b6000600267ffffffffffffffff8111156140e7576140e6615dc2565b5b6040519080825280602002602001820160405280156141155781602001602082028036833780820191505090505b509050308160008151811061412d5761412c614a3c565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156141d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141f69190615e06565b8160018151811061420a57614209614a3c565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061426f307f00000000000000000000000000000000000000000000000000000000000000008461228e565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b81526004016142d1959493929190615f2c565b600060405180830381600087803b1580156142eb57600080fd5b505af11580156142ff573d6000803e3d6000fd5b505050505050565b505050565b602160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156143b85780601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008282546143b09190614ae3565b925050819055505b602160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156144645780601360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201600082825461445c9190614ae3565b925050819055505b61446f838383612203565b505050565b600081836144829190615c74565b905092915050565b600080fd5b600080fd5b60008115159050919050565b6144a981614494565b81146144b457600080fd5b50565b6000813590506144c6816144a0565b92915050565b6000602082840312156144e2576144e161448a565b5b60006144f0848285016144b7565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261451e5761451d6144f9565b5b8235905067ffffffffffffffff81111561453b5761453a6144fe565b5b60208301915083602082028301111561455757614556614503565b5b9250929050565b6000806000604084860312156145775761457661448a565b5b600084013567ffffffffffffffff8111156145955761459461448f565b5b6145a186828701614508565b935093505060206145b4868287016144b7565b9150509250925092565b6145c781614494565b82525050565b60006020820190506145e260008301846145be565b92915050565b6000819050919050565b6145fb816145e8565b811461460657600080fd5b50565b600081359050614618816145f2565b92915050565b600080604083850312156146355761463461448a565b5b600061464385828601614609565b925050602061465485828601614609565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561469857808201518184015260208101905061467d565b838111156146a7576000848401525b50505050565b6000601f19601f8301169050919050565b60006146c98261465e565b6146d38185614669565b93506146e381856020860161467a565b6146ec816146ad565b840191505092915050565b6000602082019050818103600083015261471181846146be565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061474482614719565b9050919050565b61475481614739565b811461475f57600080fd5b50565b6000813590506147718161474b565b92915050565b6000806040838503121561478e5761478d61448a565b5b600061479c85828601614762565b92505060206147ad85828601614609565b9150509250929050565b6000602082840312156147cd576147cc61448a565b5b60006147db84828501614762565b91505092915050565b6000819050919050565b60006148096148046147ff84614719565b6147e4565b614719565b9050919050565b600061481b826147ee565b9050919050565b600061482d82614810565b9050919050565b61483d81614822565b82525050565b60006020820190506148586000830184614834565b92915050565b614867816145e8565b82525050565b6000602082019050614882600083018461485e565b92915050565b60006020828403121561489e5761489d61448a565b5b60006148ac84828501614609565b91505092915050565b6000806000606084860312156148ce576148cd61448a565b5b60006148dc86828701614762565b93505060206148ed86828701614762565b92505060406148fe86828701614609565b9150509250925092565b61491181614739565b82525050565b600060208201905061492c6000830184614908565b92915050565b600060ff82169050919050565b61494881614932565b82525050565b6000602082019050614963600083018461493f565b92915050565b6000806000606084860312156149825761498161448a565b5b600061499086828701614609565b93505060206149a186828701614609565b92505060406149b2868287016144b7565b9150509250925092565b600080604083850312156149d3576149d261448a565b5b60006149e185828601614762565b92505060206149f2858286016144b7565b9150509250929050565b60008060408385031215614a1357614a1261448a565b5b6000614a2185828601614762565b9250506020614a3285828601614762565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614aa5826145e8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614ad857614ad7614a6b565b5b600182019050919050565b6000614aee826145e8565b9150614af9836145e8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614b2e57614b2d614a6b565b5b828201905092915050565b7f4d757374206b656570206665657320617420393925206f72206c657373000000600082015250565b6000614b6f601d83614669565b9150614b7a82614b39565b602082019050919050565b60006020820190508181036000830152614b9e81614b62565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614bec57607f821691505b60208210811415614c0057614bff614ba5565b5b50919050565b7f4d757374206b656570206665657320617420323525206f72206c657373000000600082015250565b6000614c3c601d83614669565b9150614c4782614c06565b602082019050919050565b60006020820190508181036000830152614c6b81614c2f565b9050919050565b60008160011c9050919050565b6000808291508390505b6001851115614cc957808604811115614ca557614ca4614a6b565b5b6001851615614cb45780820291505b8081029050614cc285614c72565b9450614c89565b94509492505050565b600082614ce25760019050614d9e565b81614cf05760009050614d9e565b8160018114614d065760028114614d1057614d3f565b6001915050614d9e565b60ff841115614d2257614d21614a6b565b5b8360020a915084821115614d3957614d38614a6b565b5b50614d9e565b5060208310610133831016604e8410600b8410161715614d745782820a905083811115614d6f57614d6e614a6b565b5b614d9e565b614d818484846001614c7f565b92509050818404811115614d9857614d97614a6b565b5b81810290505b9392505050565b6000614db0826145e8565b9150614dbb83614932565b9250614de87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484614cd2565b905092915050565b6000614dfb826145e8565b9150614e06836145e8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614e3f57614e3e614a6b565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614e84826145e8565b9150614e8f836145e8565b925082614e9f57614e9e614e4a565b5b828204905092915050565b7f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060008201527f6c6f776572207468616e20302e31250000000000000000000000000000000000602082015250565b6000614f06602f83614669565b9150614f1182614eaa565b604082019050919050565b60006020820190508181036000830152614f3581614ef9565b9050919050565b7f63616e6e6f7420736574206275796261636b206d6f7265206f6674656e20746860008201527f616e206576657279203130206d696e7574657300000000000000000000000000602082015250565b6000614f98603383614669565b9150614fa382614f3c565b604082019050919050565b60006020820190508181036000830152614fc781614f8b565b9050919050565b7f4d75737420736574206175746f204c50206275726e2070657263656e7420626560008201527f747765656e20302520616e642031302500000000000000000000000000000000602082015250565b600061502a603083614669565b915061503582614fce565b604082019050919050565b600060208201905081810360008301526150598161501d565b9050919050565b7f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060008201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000602082015250565b60006150bc603983614669565b91506150c782615060565b604082019050919050565b600060208201905081810360008301526150eb816150af565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b600061514e602583614669565b9150615159826150f2565b604082019050919050565b6000602082019050818103600083015261517d81615141565b9050919050565b7f4f6e6c79206465762077616c6c65742063616e2063616c6c207468697320667560008201527f6e6374696f6e0000000000000000000000000000000000000000000000000000602082015250565b60006151e0602683614669565b91506151eb82615184565b604082019050919050565b6000602082019050818103600083015261520f816151d3565b9050919050565b7f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e2060008201527f302e352500000000000000000000000000000000000000000000000000000000602082015250565b6000615272602483614669565b915061527d82615216565b604082019050919050565b600060208201905081810360008301526152a181615265565b9050919050565b7f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60008201527f20302e3030312520746f74616c20737570706c792e0000000000000000000000602082015250565b6000615304603583614669565b915061530f826152a8565b604082019050919050565b60006020820190508181036000830152615333816152f7565b9050919050565b7f5377617020616d6f756e742063616e6e6f74206265206869676865722074686160008201527f6e20312520746f74616c20737570706c792e0000000000000000000000000000602082015250565b6000615396603283614669565b91506153a18261533a565b604082019050919050565b600060208201905081810360008301526153c581615389565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615428602683614669565b9150615433826153cc565b604082019050919050565b600060208201905081810360008301526154578161541b565b9050919050565b7f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e2060008201527f302e312500000000000000000000000000000000000000000000000000000000602082015250565b60006154ba602483614669565b91506154c58261545e565b604082019050919050565b600060208201905081810360008301526154e9816154ad565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000615526602083614669565b9150615531826154f0565b602082019050919050565b6000602082019050818103600083015261555581615519565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006155b8602483614669565b91506155c38261555c565b604082019050919050565b600060208201905081810360008301526155e7816155ab565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b600061564a602283614669565b9150615655826155ee565b604082019050919050565b600060208201905081810360008301526156798161563d565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b60006156b6601d83614669565b91506156c182615680565b602082019050919050565b600060208201905081810360008301526156e5816156a9565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000615748602583614669565b9150615753826156ec565b604082019050919050565b600060208201905081810360008301526157778161573b565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006157da602383614669565b91506157e58261577e565b604082019050919050565b60006020820190508181036000830152615809816157cd565b9050919050565b7f52656a6563746564000000000000000000000000000000000000000000000000600082015250565b6000615846600883614669565b915061585182615810565b602082019050919050565b6000602082019050818103600083015261587581615839565b9050919050565b7f5472616e73666572206c6f636b20666f72203320646179730000000000000000600082015250565b60006158b2601883614669565b91506158bd8261587c565b602082019050919050565b600060208201905081810360008301526158e1816158a5565b9050919050565b7f4c6f636b206f6e2073616c6520666f7220312064617900000000000000000000600082015250565b600061591e601683614669565b9150615929826158e8565b602082019050919050565b6000602082019050818103600083015261594d81615911565b9050919050565b7f53616c6573206c696d6974206578636565646564000000000000000000000000600082015250565b600061598a601483614669565b915061599582615954565b602082019050919050565b600060208201905081810360008301526159b98161597d565b9050919050565b7f54726164696e67206973206e6f74206163746976652e00000000000000000000600082015250565b60006159f6601683614669565b9150615a01826159c0565b602082019050919050565b60006020820190508181036000830152615a25816159e9565b9050919050565b7f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60008201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b60208201527f20616c6c6f7765642e0000000000000000000000000000000000000000000000604082015250565b6000615aae604983614669565b9150615ab982615a2c565b606082019050919050565b60006020820190508181036000830152615add81615aa1565b9050919050565b7f427579207472616e7366657220616d6f756e742065786365656473207468652060008201527f6d61785472616e73616374696f6e416d6f756e742e0000000000000000000000602082015250565b6000615b40603583614669565b9150615b4b82615ae4565b604082019050919050565b60006020820190508181036000830152615b6f81615b33565b9050919050565b7f4d61782077616c6c657420657863656564656400000000000000000000000000600082015250565b6000615bac601383614669565b9150615bb782615b76565b602082019050919050565b60006020820190508181036000830152615bdb81615b9f565b9050919050565b7f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560008201527f206d61785472616e73616374696f6e416d6f756e742e00000000000000000000602082015250565b6000615c3e603683614669565b9150615c4982615be2565b604082019050919050565b60006020820190508181036000830152615c6d81615c31565b9050919050565b6000615c7f826145e8565b9150615c8a836145e8565b925082821015615c9d57615c9c614a6b565b5b828203905092915050565b600081905092915050565b50565b6000615cc3600083615ca8565b9150615cce82615cb3565b600082019050919050565b6000615ce482615cb6565b9150819050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000615d4a602683614669565b9150615d5582615cee565b604082019050919050565b60006020820190508181036000830152615d7981615d3d565b9050919050565b600081519050615d8f816145f2565b92915050565b600060208284031215615dab57615daa61448a565b5b6000615db984828501615d80565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600081519050615e008161474b565b92915050565b600060208284031215615e1c57615e1b61448a565b5b6000615e2a84828501615df1565b91505092915050565b6000819050919050565b6000615e58615e53615e4e84615e33565b6147e4565b6145e8565b9050919050565b615e6881615e3d565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b615ea381614739565b82525050565b6000615eb58383615e9a565b60208301905092915050565b6000602082019050919050565b6000615ed982615e6e565b615ee38185615e79565b9350615eee83615e8a565b8060005b83811015615f1f578151615f068882615ea9565b9750615f1183615ec1565b925050600181019050615ef2565b5085935050505092915050565b600060a082019050615f41600083018861485e565b615f4e6020830187615e5f565b8181036040830152615f608186615ece565b9050615f6f6060830185614908565b615f7c608083018461485e565b969550505050505056fea2646970667358221220488506906270b12c8e0a4429c558dbff0e96263b04416d5e0d24fc9a56ce747464736f6c634300080a0033

Deployed Bytecode

0x6080604052600436106103fe5760003560e01c80637bce5a0411610213578063bbc0c74211610123578063d257b34f116100ab578063e884f2601161007a578063e884f26014610f5a578063f2fde38b14610f85578063f319ae7714610fae578063f8b45b0514610fd7578063fa30c3d51461100257610405565b8063d257b34f14610e8a578063d85ba06314610ec7578063dd62ed3e14610ef2578063e2f4560514610f2f57610405565b8063c0246668116100f2578063c024666814610db9578063c18bc19514610de2578063c779c39114610e0b578063c876d0b914610e34578063c8c8ebe414610e5f57610405565b8063bbc0c74214610d0f578063bcaf80e414610d3a578063bf86239114610d51578063bfd7928414610d7c57610405565b80639c3b4fdc116101a6578063a457c2d711610175578063a457c2d714610c04578063a4c82a0014610c41578063a9059cbb14610c6c578063aacebbe314610ca9578063b62496f514610cd257610405565b80639c3b4fdc14610b585780639ec22c0e14610b835780639fccce3214610bae578063a0d82dc514610bd957610405565b806392136913116101e25780639213691314610ab0578063924de9b714610adb57806395d89b4114610b045780639a7a23d614610b2f57610405565b80637bce5a0414610a185780638a8c523c14610a435780638da5cb5b14610a5a5780638ea5220f14610a8557610405565b806327c8f8351161030e57806366ca9b83116102a1578063715018a611610270578063715018a614610959578063730c1888146109705780637571336a1461099957806375f0a874146109c257806378e97925146109ed57610405565b806366ca9b831461089d5780636a486a8e146108c65780636ddd1713146108f157806370a082311461091c57610405565b806339509351116102dd57806339509351146107cd57806349bd5a5e1461080a5780634fbee1931461083557806351fb012d1461087257610405565b806327c8f835146107215780632c3e486c1461074c5780632e82f1a014610777578063313ce567146107a257610405565b80631694505e11610391578063199ffc7211610360578063199ffc72146106285780631e7be210146106535780631f3fed8f14610690578063203e727e146106bb57806323b872dd146106e457610405565b80631694505e1461057e57806318160ddd146105a95780631816467f146105d4578063184c16c5146105fd57610405565b806306fdde03116103cd57806306fdde03146104b0578063095ea7b3146104db5780631006ee0c1461051857806310d5de531461054157610405565b80630118b32b1461040a57806301b38af51461043357806302ce58131461045c57806302dbd8f81461048757610405565b3661040557005b600080fd5b34801561041657600080fd5b50610431600480360381019061042c91906144cc565b61102d565b005b34801561043f57600080fd5b5061045a6004803603810190610455919061455e565b611059565b005b34801561046857600080fd5b50610471611106565b60405161047e91906145cd565b60405180910390f35b34801561049357600080fd5b506104ae60048036038101906104a9919061461e565b611119565b005b3480156104bc57600080fd5b506104c561118f565b6040516104d291906146f7565b60405180910390f35b3480156104e757600080fd5b5061050260048036038101906104fd9190614777565b611221565b60405161050f91906145cd565b60405180910390f35b34801561052457600080fd5b5061053f600480360381019061053a919061461e565b611244565b005b34801561054d57600080fd5b50610568600480360381019061056391906147b7565b611316565b60405161057591906145cd565b60405180910390f35b34801561058a57600080fd5b50610593611335565b6040516105a09190614843565b60405180910390f35b3480156105b557600080fd5b506105be611359565b6040516105cb919061486d565b60405180910390f35b3480156105e057600080fd5b506105fb60048036038101906105f691906147b7565b611363565b005b34801561060957600080fd5b5061061261142b565b60405161061f919061486d565b60405180910390f35b34801561063457600080fd5b5061063d611431565b60405161064a919061486d565b60405180910390f35b34801561065f57600080fd5b5061067a600480360381019061067591906147b7565b611437565b60405161068791906145cd565b60405180910390f35b34801561069c57600080fd5b506106a5611457565b6040516106b2919061486d565b60405180910390f35b3480156106c757600080fd5b506106e260048036038101906106dd9190614888565b61145d565b005b3480156106f057600080fd5b5061070b600480360381019061070691906148b5565b611502565b60405161071891906145cd565b60405180910390f35b34801561072d57600080fd5b50610736611531565b6040516107439190614917565b60405180910390f35b34801561075857600080fd5b50610761611537565b60405161076e919061486d565b60405180910390f35b34801561078357600080fd5b5061078c61153d565b60405161079991906145cd565b60405180910390f35b3480156107ae57600080fd5b506107b7611550565b6040516107c4919061494e565b60405180910390f35b3480156107d957600080fd5b506107f460048036038101906107ef9190614777565b611559565b60405161080191906145cd565b60405180910390f35b34801561081657600080fd5b5061081f611590565b60405161082c9190614917565b60405180910390f35b34801561084157600080fd5b5061085c600480360381019061085791906147b7565b6115b4565b60405161086991906145cd565b60405180910390f35b34801561087e57600080fd5b5061088761160a565b60405161089491906145cd565b60405180910390f35b3480156108a957600080fd5b506108c460048036038101906108bf919061461e565b61161d565b005b3480156108d257600080fd5b506108db611693565b6040516108e8919061486d565b60405180910390f35b3480156108fd57600080fd5b50610906611699565b60405161091391906145cd565b60405180910390f35b34801561092857600080fd5b50610943600480360381019061093e91906147b7565b6116ac565b604051610950919061486d565b60405180910390f35b34801561096557600080fd5b5061096e6116f4565b005b34801561097c57600080fd5b5061099760048036038101906109929190614969565b611708565b005b3480156109a557600080fd5b506109c060048036038101906109bb91906149bc565b6117d4565b005b3480156109ce57600080fd5b506109d7611837565b6040516109e49190614917565b60405180910390f35b3480156109f957600080fd5b50610a0261185d565b604051610a0f919061486d565b60405180910390f35b348015610a2457600080fd5b50610a2d611863565b604051610a3a919061486d565b60405180910390f35b348015610a4f57600080fd5b50610a58611869565b005b348015610a6657600080fd5b50610a6f6118b7565b604051610a7c9190614917565b60405180910390f35b348015610a9157600080fd5b50610a9a6118e1565b604051610aa79190614917565b60405180910390f35b348015610abc57600080fd5b50610ac5611907565b604051610ad2919061486d565b60405180910390f35b348015610ae757600080fd5b50610b026004803603810190610afd91906144cc565b61190d565b005b348015610b1057600080fd5b50610b19611932565b604051610b2691906146f7565b60405180910390f35b348015610b3b57600080fd5b50610b566004803603810190610b5191906149bc565b6119c4565b005b348015610b6457600080fd5b50610b6d611a69565b604051610b7a919061486d565b60405180910390f35b348015610b8f57600080fd5b50610b98611a6f565b604051610ba5919061486d565b60405180910390f35b348015610bba57600080fd5b50610bc3611a75565b604051610bd0919061486d565b60405180910390f35b348015610be557600080fd5b50610bee611a7b565b604051610bfb919061486d565b60405180910390f35b348015610c1057600080fd5b50610c2b6004803603810190610c269190614777565b611a81565b604051610c3891906145cd565b60405180910390f35b348015610c4d57600080fd5b50610c56611af8565b604051610c63919061486d565b60405180910390f35b348015610c7857600080fd5b50610c936004803603810190610c8e9190614777565b611afe565b604051610ca091906145cd565b60405180910390f35b348015610cb557600080fd5b50610cd06004803603810190610ccb91906147b7565b611b21565b005b348015610cde57600080fd5b50610cf96004803603810190610cf491906147b7565b611c04565b604051610d0691906145cd565b60405180910390f35b348015610d1b57600080fd5b50610d24611c24565b604051610d3191906145cd565b60405180910390f35b348015610d4657600080fd5b50610d4f611c37565b005b348015610d5d57600080fd5b50610d66611cd1565b604051610d73919061486d565b60405180910390f35b348015610d8857600080fd5b50610da36004803603810190610d9e91906147b7565b611cd7565b604051610db091906145cd565b60405180910390f35b348015610dc557600080fd5b50610de06004803603810190610ddb91906149bc565b611cf7565b005b348015610dee57600080fd5b50610e096004803603810190610e049190614888565b611da8565b005b348015610e1757600080fd5b50610e326004803603810190610e2d91906144cc565b611e4d565b005b348015610e4057600080fd5b50610e49611e72565b604051610e5691906145cd565b60405180910390f35b348015610e6b57600080fd5b50610e74611e85565b604051610e81919061486d565b60405180910390f35b348015610e9657600080fd5b50610eb16004803603810190610eac9190614888565b611e8b565b604051610ebe91906145cd565b60405180910390f35b348015610ed357600080fd5b50610edc611f6c565b604051610ee9919061486d565b60405180910390f35b348015610efe57600080fd5b50610f196004803603810190610f1491906149fc565b611f72565b604051610f26919061486d565b60405180910390f35b348015610f3b57600080fd5b50610f44611ff9565b604051610f51919061486d565b60405180910390f35b348015610f6657600080fd5b50610f6f611fff565b604051610f7c91906145cd565b60405180910390f35b348015610f9157600080fd5b50610fac6004803603810190610fa791906147b7565b61202b565b005b348015610fba57600080fd5b50610fd56004803603810190610fd0919061461e565b6120af565b005b348015610fe357600080fd5b50610fec6121ea565b604051610ff9919061486d565b60405180910390f35b34801561100e57600080fd5b506110176121f0565b60405161102491906145cd565b60405180910390f35b611035612208565b80601e60006101000a81548160ff0219169083151502179055504260128190555050565b611061612208565b60005b8383905081101561110057816021600086868581811061108757611086614a3c565b5b905060200201602081019061109c91906147b7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806110f890614a9a565b915050611064565b50505050565b601e60009054906101000a900460ff1681565b611121612208565b8160198190555080601a81905550601a5460195461113f9190614ae3565b6018819055506063601854111561118b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118290614b85565b60405180910390fd5b5050565b60606003805461119e90614bd4565b80601f01602080910402602001604051908101604052809291908181526020018280546111ca90614bd4565b80156112175780601f106111ec57610100808354040283529160200191611217565b820191906000526020600020905b8154815290600101906020018083116111fa57829003601f168201915b5050505050905090565b60008061122c612286565b905061123981858561228e565b600191505092915050565b61124c612208565b80601a8190555081601781905550601a5460195461126a9190614ae3565b6018819055506017546016546112809190614ae3565b601581905550601960155411156112cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c390614c52565b60405180910390fd5b60636018541115611312576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130990614b85565b60405180910390fd5b5050565b602080528060005260406000206000915054906101000a900460ff1681565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6000600254905090565b61136b612208565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f90b8024c4923d3873ff5b9fcb43d0360d4b9217fa41225d07ba379993552e74360405160405180910390a380600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600f5481565b600b5481565b60216020528060005260406000206000915054906101000a900460ff1681565b601c5481565b611465612208565b6009600a6114739190614da5565b6103e86001611480611359565b61148a9190614df0565b6114949190614e79565b61149e9190614e79565b8110156114e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d790614f1c565b60405180910390fd5b6009600a6114ee9190614da5565b816114f99190614df0565b60088190555050565b60008061150d612286565b905061151a858285612459565b6115258585856124e5565b60019150509392505050565b61dead81565b600d5481565b600c60009054906101000a900460ff1681565b60006009905090565b600080611564612286565b90506115858185856115768589611f72565b6115809190614ae3565b61228e565b600191505092915050565b7f0000000000000000000000005f442ebbfc41f876d03fe9f1870fc015afe5959481565b6000601f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b601e60019054906101000a900460ff1681565b611625612208565b81601681905550806017819055506017546016546116439190614ae3565b6015819055506019601554111561168f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168690614c52565b60405180910390fd5b5050565b60185481565b601160019054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6116fc612208565b6117066000613816565b565b611710612208565b610258831015611755576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174c90614fae565b60405180910390fd5b6103e88211158015611768575060008210155b6117a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179e90615040565b60405180910390fd5b82600d8190555081600b8190555080600c60006101000a81548160ff021916908315150217905550505050565b6117dc612208565b80602060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60125481565b60165481565b611871612208565b6001601160016101000a81548160ff02191690831515021790555042600e81905550426012819055506000601e60026101000a81548160ff021916908315150217905550565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60195481565b611915612208565b80601160016101000a81548160ff02191690831515021790555050565b60606004805461194190614bd4565b80601f016020809104026020016040519081016040528092919081815260200182805461196d90614bd4565b80156119ba5780601f1061198f576101008083540402835291602001916119ba565b820191906000526020600020905b81548152906001019060200180831161199d57829003601f168201915b5050505050905090565b6119cc612208565b7f0000000000000000000000005f442ebbfc41f876d03fe9f1870fc015afe5959473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a52906150d2565b60405180910390fd5b611a6582826138dc565b5050565b60175481565b60105481565b601d5481565b601a5481565b600080611a8c612286565b90506000611a9a8286611f72565b905083811015611adf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad690615164565b60405180910390fd5b611aec828686840361228e565b60019250505092915050565b600e5481565b600080611b09612286565b9050611b168185856124e5565b600191505092915050565b611b29612208565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fa751787977eeb3902e30e1d19ca00c6ad274a1f622c31a206e32366700b0567460405160405180910390a380600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001601e60026101000a81548160ff02191690831515021790555050565b60236020528060005260406000206000915054906101000a900460ff1681565b601160009054906101000a900460ff1681565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbe906151f6565b60405180910390fd5b611ccf61397d565b565b601b5481565b60226020528060005260406000206000915054906101000a900460ff1681565b611cff612208565b80601f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df782604051611d9c91906145cd565b60405180910390a25050565b611db0612208565b6009600a611dbe9190614da5565b6103e86005611dcb611359565b611dd59190614df0565b611ddf9190614e79565b611de99190614e79565b811015611e2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2290615288565b60405180910390fd5b6009600a611e399190614da5565b81611e449190614df0565b600a8190555050565b611e55612208565b80601e60016101000a81548160ff02191690831515021790555050565b601460009054906101000a900460ff1681565b60085481565b6000611e95612208565b620186a06001611ea3611359565b611ead9190614df0565b611eb79190614e79565b821015611ef9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef09061531a565b60405180910390fd5b6103e8600a611f06611359565b611f109190614df0565b611f1a9190614e79565b821115611f5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f53906153ac565b60405180910390fd5b8160098190555060019050919050565b60155481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60095481565b6000612009612208565b6000601460006101000a81548160ff0219169083151502179055506001905090565b612033612208565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209a9061543e565b60405180910390fd5b6120ac81613816565b50565b6120b7612208565b6009600a6120c59190614da5565b6103e860016120d2611359565b6120dc9190614df0565b6120e69190614e79565b6120f09190614e79565b821015612132576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212990614f1c565b60405180910390fd5b6009600a6121409190614da5565b8261214b9190614df0565b600881905550670de0b6b3a76400006103e86001612167611359565b6121719190614df0565b61217b9190614e79565b6121859190614e79565b8110156121c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121be906154d0565b60405180910390fd5b6009600a6121d59190614da5565b816121e09190614df0565b600a819055505050565b600a5481565b601e60029054906101000a900460ff1681565b505050565b612210612286565b73ffffffffffffffffffffffffffffffffffffffff1661222e6118b7565b73ffffffffffffffffffffffffffffffffffffffff1614612284576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227b9061553c565b60405180910390fd5b565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156122fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f5906155ce565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561236e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236590615660565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161244c919061486d565b60405180910390a3505050565b60006124658484611f72565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146124df57818110156124d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c8906156cc565b60405180910390fd5b6124de848484840361228e565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612555576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254c9061575e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125bc906157f0565b60405180910390fd5b60008114156125df576125da83836000613a37565b613811565b6125e76118b7565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561265557506126256118b7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561268e5750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156126c8575061dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156126e15750600560149054906101000a900460ff16155b1561324757601e60019054906101000a900460ff161561286d57602160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061279c5750602160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6127db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127d29061585c565b60405180910390fd5b602360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612868576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285f9061585c565b60405180910390fd5b612931565b601e60029054906101000a900460ff1680156128d25750602360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15612930576001602260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b5b601e60009054906101000a900460ff1680156129965750602160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15612c9b57602360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612a3f5750602360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612a97576203f480601254612a559190614ae3565b4211612a96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8d906158c8565b60405180910390fd5b5b6203f480601254612aa89190614ae3565b4211612c7257602360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612c6d5762015180601254612b119190614ae3565b4211612b52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4990615934565b60405180910390fd5b60006202a300601254612b659190614ae3565b421115612b755760419050612b7a565b601e90505b600060648260ff16601360008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154612bcf9190614df0565b612bd99190614e79565b905080601360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002015484612c2a9190614ae3565b10612c6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c61906159a0565b60405180910390fd5b50505b612c9a565b60006012541115612c99576000601e60006101000a81548160ff0219169083151502179055505b5b5b601160009054906101000a900460ff16612d9057601f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612d505750601f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b612d8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d8690615a0c565b60405180910390fd5b5b601460009054906101000a900460ff1615612f5e57612dad6118b7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015612e3457507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015612e8c57507f0000000000000000000000005f442ebbfc41f876d03fe9f1870fc015afe5959473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15612f5d5743601360003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015410612f15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f0c90615ac4565b60405180910390fd5b43601360003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055505b5b602360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156130015750602060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156130a85760085481111561304b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161304290615b56565b60405180910390fd5b600a54613057836116ac565b826130629190614ae3565b11156130a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161309a90615bc2565b60405180910390fd5b613246565b602360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561314b5750602060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561319a57600854811115613195576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161318c90615c54565b60405180910390fd5b613245565b602060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661324457600a546131f7836116ac565b826132029190614ae3565b1115613243576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161323a90615bc2565b60405180910390fd5b5b5b5b5b6000613252306116ac565b9050600060095482101590508080156132775750601160019054906101000a900460ff165b80156132905750600560149054906101000a900460ff16155b80156132e65750602360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b801561333c5750601f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156133925750601f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156133d6576001600560146101000a81548160ff0219169083151502179055506133ba613caf565b6000600560146101000a81548160ff0219169083151502179055505b600560149054906101000a900460ff1615801561343c5750602360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b80156134545750600c60009054906101000a900460ff165b801561346f5750600d54600e5461346b9190614ae3565b4210155b80156134c55750601f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156134d4576134d2613ed8565b505b6000600560149054906101000a900460ff16159050601f60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061358a5750601f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561359457600090505b6000811561380157602360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156135f757506000601854115b156136eb5761367e6064613670602260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661365d57601854613661565b601b545b8861409e90919063ffffffff16565b6140b490919063ffffffff16565b9050601854601a54826136919190614df0565b61369b9190614e79565b601d60008282546136ac9190614ae3565b92505081905550601854601954826136c49190614df0565b6136ce9190614e79565b601c60008282546136df9190614ae3565b925050819055506137dd565b602360008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561374657506000601554115b156137dc5761377360646137656015548861409e90919063ffffffff16565b6140b490919063ffffffff16565b9050601554601754826137869190614df0565b6137909190614e79565b601d60008282546137a19190614ae3565b92505081905550601554601654826137b99190614df0565b6137c39190614e79565b601c60008282546137d49190614ae3565b925050819055505b5b60008111156137f2576137f1873083613a37565b5b80856137fe9190615c74565b94505b61380c878787613a37565b505050505b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80602360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b6000613988306116ac565b905060008082141561399b575050613a35565b6139a4826140ca565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16476040516139ea90615cd9565b60006040518083038185875af1925050503d8060008114613a27576040519150601f19603f3d011682016040523d82523d6000602084013e613a2c565b606091505b50508091505050505b565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613aa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a9e9061575e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613b17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b0e906157f0565b60405180910390fd5b613b22838383614307565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015613ba8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b9f90615d60565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051613c96919061486d565b60405180910390a3613ca984848461430c565b50505050565b6000613cba306116ac565b90506000601d54601c54613cce9190614ae3565b9050600080831480613ce05750600082145b15613ced57505050613ed6565b6014600954613cfc9190614df0565b831115613d15576014600954613d129190614df0565b92505b60008390506000479050613d28826140ca565b6000613d3d824761447490919063ffffffff16565b90506000613d6886613d5a601c548561409e90919063ffffffff16565b6140b490919063ffffffff16565b90506000613d9387613d85601d548661409e90919063ffffffff16565b6140b490919063ffffffff16565b9050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681604051613ddb90615cd9565b60006040518083038185875af1925050503d8060008114613e18576040519150601f19603f3d011682016040523d82523d6000602084013e613e1d565b606091505b5050809650506000601c541115613ebd57600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051613e7490615cd9565b60006040518083038185875af1925050503d8060008114613eb1576040519150601f19603f3d011682016040523d82523d6000602084013e613eb6565b606091505b5050809650505b6000601c819055506000601d8190555050505050505050505b565b600042600e8190555060003073ffffffffffffffffffffffffffffffffffffffff166370a082317f0000000000000000000000005f442ebbfc41f876d03fe9f1870fc015afe595946040518263ffffffff1660e01b8152600401613f3c9190614917565b602060405180830381865afa158015613f59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f7d9190615d95565b90506000613faa612710613f9c600b548561409e90919063ffffffff16565b6140b490919063ffffffff16565b90506000811115613fe357613fe27f0000000000000000000000005f442ebbfc41f876d03fe9f1870fc015afe5959461dead83613a37565b5b60007f0000000000000000000000005f442ebbfc41f876d03fe9f1870fc015afe5959490508073ffffffffffffffffffffffffffffffffffffffff1663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561405057600080fd5b505af1158015614064573d6000803e3d6000fd5b505050507f454c91ae84fcc766ddda0dcb289f26b3d0176efeacf4061fc219fa6ca8c3048d60405160405180910390a16001935050505090565b600081836140ac9190614df0565b905092915050565b600081836140c29190614e79565b905092915050565b6000600267ffffffffffffffff8111156140e7576140e6615dc2565b5b6040519080825280602002602001820160405280156141155781602001602082028036833780820191505090505b509050308160008151811061412d5761412c614a3c565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156141d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141f69190615e06565b8160018151811061420a57614209614a3c565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061426f307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d8461228e565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b81526004016142d1959493929190615f2c565b600060405180830381600087803b1580156142eb57600080fd5b505af11580156142ff573d6000803e3d6000fd5b505050505050565b505050565b602160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156143b85780601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008282546143b09190614ae3565b925050819055505b602160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156144645780601360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201600082825461445c9190614ae3565b925050819055505b61446f838383612203565b505050565b600081836144829190615c74565b905092915050565b600080fd5b600080fd5b60008115159050919050565b6144a981614494565b81146144b457600080fd5b50565b6000813590506144c6816144a0565b92915050565b6000602082840312156144e2576144e161448a565b5b60006144f0848285016144b7565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261451e5761451d6144f9565b5b8235905067ffffffffffffffff81111561453b5761453a6144fe565b5b60208301915083602082028301111561455757614556614503565b5b9250929050565b6000806000604084860312156145775761457661448a565b5b600084013567ffffffffffffffff8111156145955761459461448f565b5b6145a186828701614508565b935093505060206145b4868287016144b7565b9150509250925092565b6145c781614494565b82525050565b60006020820190506145e260008301846145be565b92915050565b6000819050919050565b6145fb816145e8565b811461460657600080fd5b50565b600081359050614618816145f2565b92915050565b600080604083850312156146355761463461448a565b5b600061464385828601614609565b925050602061465485828601614609565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561469857808201518184015260208101905061467d565b838111156146a7576000848401525b50505050565b6000601f19601f8301169050919050565b60006146c98261465e565b6146d38185614669565b93506146e381856020860161467a565b6146ec816146ad565b840191505092915050565b6000602082019050818103600083015261471181846146be565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061474482614719565b9050919050565b61475481614739565b811461475f57600080fd5b50565b6000813590506147718161474b565b92915050565b6000806040838503121561478e5761478d61448a565b5b600061479c85828601614762565b92505060206147ad85828601614609565b9150509250929050565b6000602082840312156147cd576147cc61448a565b5b60006147db84828501614762565b91505092915050565b6000819050919050565b60006148096148046147ff84614719565b6147e4565b614719565b9050919050565b600061481b826147ee565b9050919050565b600061482d82614810565b9050919050565b61483d81614822565b82525050565b60006020820190506148586000830184614834565b92915050565b614867816145e8565b82525050565b6000602082019050614882600083018461485e565b92915050565b60006020828403121561489e5761489d61448a565b5b60006148ac84828501614609565b91505092915050565b6000806000606084860312156148ce576148cd61448a565b5b60006148dc86828701614762565b93505060206148ed86828701614762565b92505060406148fe86828701614609565b9150509250925092565b61491181614739565b82525050565b600060208201905061492c6000830184614908565b92915050565b600060ff82169050919050565b61494881614932565b82525050565b6000602082019050614963600083018461493f565b92915050565b6000806000606084860312156149825761498161448a565b5b600061499086828701614609565b93505060206149a186828701614609565b92505060406149b2868287016144b7565b9150509250925092565b600080604083850312156149d3576149d261448a565b5b60006149e185828601614762565b92505060206149f2858286016144b7565b9150509250929050565b60008060408385031215614a1357614a1261448a565b5b6000614a2185828601614762565b9250506020614a3285828601614762565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614aa5826145e8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614ad857614ad7614a6b565b5b600182019050919050565b6000614aee826145e8565b9150614af9836145e8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614b2e57614b2d614a6b565b5b828201905092915050565b7f4d757374206b656570206665657320617420393925206f72206c657373000000600082015250565b6000614b6f601d83614669565b9150614b7a82614b39565b602082019050919050565b60006020820190508181036000830152614b9e81614b62565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614bec57607f821691505b60208210811415614c0057614bff614ba5565b5b50919050565b7f4d757374206b656570206665657320617420323525206f72206c657373000000600082015250565b6000614c3c601d83614669565b9150614c4782614c06565b602082019050919050565b60006020820190508181036000830152614c6b81614c2f565b9050919050565b60008160011c9050919050565b6000808291508390505b6001851115614cc957808604811115614ca557614ca4614a6b565b5b6001851615614cb45780820291505b8081029050614cc285614c72565b9450614c89565b94509492505050565b600082614ce25760019050614d9e565b81614cf05760009050614d9e565b8160018114614d065760028114614d1057614d3f565b6001915050614d9e565b60ff841115614d2257614d21614a6b565b5b8360020a915084821115614d3957614d38614a6b565b5b50614d9e565b5060208310610133831016604e8410600b8410161715614d745782820a905083811115614d6f57614d6e614a6b565b5b614d9e565b614d818484846001614c7f565b92509050818404811115614d9857614d97614a6b565b5b81810290505b9392505050565b6000614db0826145e8565b9150614dbb83614932565b9250614de87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484614cd2565b905092915050565b6000614dfb826145e8565b9150614e06836145e8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614e3f57614e3e614a6b565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614e84826145e8565b9150614e8f836145e8565b925082614e9f57614e9e614e4a565b5b828204905092915050565b7f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060008201527f6c6f776572207468616e20302e31250000000000000000000000000000000000602082015250565b6000614f06602f83614669565b9150614f1182614eaa565b604082019050919050565b60006020820190508181036000830152614f3581614ef9565b9050919050565b7f63616e6e6f7420736574206275796261636b206d6f7265206f6674656e20746860008201527f616e206576657279203130206d696e7574657300000000000000000000000000602082015250565b6000614f98603383614669565b9150614fa382614f3c565b604082019050919050565b60006020820190508181036000830152614fc781614f8b565b9050919050565b7f4d75737420736574206175746f204c50206275726e2070657263656e7420626560008201527f747765656e20302520616e642031302500000000000000000000000000000000602082015250565b600061502a603083614669565b915061503582614fce565b604082019050919050565b600060208201905081810360008301526150598161501d565b9050919050565b7f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060008201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000602082015250565b60006150bc603983614669565b91506150c782615060565b604082019050919050565b600060208201905081810360008301526150eb816150af565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b600061514e602583614669565b9150615159826150f2565b604082019050919050565b6000602082019050818103600083015261517d81615141565b9050919050565b7f4f6e6c79206465762077616c6c65742063616e2063616c6c207468697320667560008201527f6e6374696f6e0000000000000000000000000000000000000000000000000000602082015250565b60006151e0602683614669565b91506151eb82615184565b604082019050919050565b6000602082019050818103600083015261520f816151d3565b9050919050565b7f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e2060008201527f302e352500000000000000000000000000000000000000000000000000000000602082015250565b6000615272602483614669565b915061527d82615216565b604082019050919050565b600060208201905081810360008301526152a181615265565b9050919050565b7f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60008201527f20302e3030312520746f74616c20737570706c792e0000000000000000000000602082015250565b6000615304603583614669565b915061530f826152a8565b604082019050919050565b60006020820190508181036000830152615333816152f7565b9050919050565b7f5377617020616d6f756e742063616e6e6f74206265206869676865722074686160008201527f6e20312520746f74616c20737570706c792e0000000000000000000000000000602082015250565b6000615396603283614669565b91506153a18261533a565b604082019050919050565b600060208201905081810360008301526153c581615389565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615428602683614669565b9150615433826153cc565b604082019050919050565b600060208201905081810360008301526154578161541b565b9050919050565b7f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e2060008201527f302e312500000000000000000000000000000000000000000000000000000000602082015250565b60006154ba602483614669565b91506154c58261545e565b604082019050919050565b600060208201905081810360008301526154e9816154ad565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000615526602083614669565b9150615531826154f0565b602082019050919050565b6000602082019050818103600083015261555581615519565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006155b8602483614669565b91506155c38261555c565b604082019050919050565b600060208201905081810360008301526155e7816155ab565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b600061564a602283614669565b9150615655826155ee565b604082019050919050565b600060208201905081810360008301526156798161563d565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b60006156b6601d83614669565b91506156c182615680565b602082019050919050565b600060208201905081810360008301526156e5816156a9565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000615748602583614669565b9150615753826156ec565b604082019050919050565b600060208201905081810360008301526157778161573b565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006157da602383614669565b91506157e58261577e565b604082019050919050565b60006020820190508181036000830152615809816157cd565b9050919050565b7f52656a6563746564000000000000000000000000000000000000000000000000600082015250565b6000615846600883614669565b915061585182615810565b602082019050919050565b6000602082019050818103600083015261587581615839565b9050919050565b7f5472616e73666572206c6f636b20666f72203320646179730000000000000000600082015250565b60006158b2601883614669565b91506158bd8261587c565b602082019050919050565b600060208201905081810360008301526158e1816158a5565b9050919050565b7f4c6f636b206f6e2073616c6520666f7220312064617900000000000000000000600082015250565b600061591e601683614669565b9150615929826158e8565b602082019050919050565b6000602082019050818103600083015261594d81615911565b9050919050565b7f53616c6573206c696d6974206578636565646564000000000000000000000000600082015250565b600061598a601483614669565b915061599582615954565b602082019050919050565b600060208201905081810360008301526159b98161597d565b9050919050565b7f54726164696e67206973206e6f74206163746976652e00000000000000000000600082015250565b60006159f6601683614669565b9150615a01826159c0565b602082019050919050565b60006020820190508181036000830152615a25816159e9565b9050919050565b7f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60008201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b60208201527f20616c6c6f7765642e0000000000000000000000000000000000000000000000604082015250565b6000615aae604983614669565b9150615ab982615a2c565b606082019050919050565b60006020820190508181036000830152615add81615aa1565b9050919050565b7f427579207472616e7366657220616d6f756e742065786365656473207468652060008201527f6d61785472616e73616374696f6e416d6f756e742e0000000000000000000000602082015250565b6000615b40603583614669565b9150615b4b82615ae4565b604082019050919050565b60006020820190508181036000830152615b6f81615b33565b9050919050565b7f4d61782077616c6c657420657863656564656400000000000000000000000000600082015250565b6000615bac601383614669565b9150615bb782615b76565b602082019050919050565b60006020820190508181036000830152615bdb81615b9f565b9050919050565b7f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560008201527f206d61785472616e73616374696f6e416d6f756e742e00000000000000000000602082015250565b6000615c3e603683614669565b9150615c4982615be2565b604082019050919050565b60006020820190508181036000830152615c6d81615c31565b9050919050565b6000615c7f826145e8565b9150615c8a836145e8565b925082821015615c9d57615c9c614a6b565b5b828203905092915050565b600081905092915050565b50565b6000615cc3600083615ca8565b9150615cce82615cb3565b600082019050919050565b6000615ce482615cb6565b9150819050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000615d4a602683614669565b9150615d5582615cee565b604082019050919050565b60006020820190508181036000830152615d7981615d3d565b9050919050565b600081519050615d8f816145f2565b92915050565b600060208284031215615dab57615daa61448a565b5b6000615db984828501615d80565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600081519050615e008161474b565b92915050565b600060208284031215615e1c57615e1b61448a565b5b6000615e2a84828501615df1565b91505092915050565b6000819050919050565b6000615e58615e53615e4e84615e33565b6147e4565b6145e8565b9050919050565b615e6881615e3d565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b615ea381614739565b82525050565b6000615eb58383615e9a565b60208301905092915050565b6000602082019050919050565b6000615ed982615e6e565b615ee38185615e79565b9350615eee83615e8a565b8060005b83811015615f1f578151615f068882615ea9565b9750615f1183615ec1565b925050600181019050615ef2565b5085935050505092915050565b600060a082019050615f41600083018861485e565b615f4e6020830187615e5f565b8181036040830152615f608186615ece565b9050615f6f6060830185614908565b615f7c608083018461485e565b969550505050505056fea2646970667358221220488506906270b12c8e0a4429c558dbff0e96263b04416d5e0d24fc9a56ce747464736f6c634300080a0033

Deployed Bytecode Sourcemap

37433:20119:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42897:163;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42535:220;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38990:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45711:293;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16288:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18638:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46012:383;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39265:64;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37507:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17407:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47295:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38093:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37895:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39356:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38914:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44556:250;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19419:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37610:53;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37990:54;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37950:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17250:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20123:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37565:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47466:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39032:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45413:286;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38775:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38260:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17578:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9713:103;;;;;;;;;;;;;:::i;:::-;;56284:447;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45057:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37702:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38299:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38701:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43205:231;;;;;;;;;;;;;:::i;:::-;;9065:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37739:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38810:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45301:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16507:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46593:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38738:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38150:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38954:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38848:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20864:436;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38051:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17911:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47041:242;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39612:58;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38194:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43068:81;;;;;;;;;;;;;:::i;:::-;;38880:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39418:36;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46403:182;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44814:231;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42763:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38619:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37776:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43710:385;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38667:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18167:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37818:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43501:134;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9971:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44107:437;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37858:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39075:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42897:163;8951:13;:11;:13::i;:::-;42999:15:::1;42981;;:33;;;;;;;;;;;;;;;;;;43037:15;43025:9;:27;;;;42897:163:::0;:::o;42535:220::-;8951:13;:11;:13::i;:::-;42642:6:::1;42637:111;42654:10;;:17;;42652:1;:19;42637:111;;;42721:15;42693:10;:25;42704:10;;42715:1;42704:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;42693:25;;;;;;;;;;;;;;;;:43;;;;;;;;;;;;;;;;;;42673:3;;;;;:::i;:::-;;;;42637:111;;;;42535:220:::0;;;:::o;38990:35::-;;;;;;;;;;;;;:::o;45711:293::-;8951:13;:11;:13::i;:::-;45824::::1;45805:16;:32;;;;45861:7;45848:10;:20;;;;45914:10;;45895:16;;:29;;;;:::i;:::-;45879:13;:45;;;;45960:2;45943:13;;:19;;45935:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;45711:293:::0;;:::o;16288:100::-;16342:13;16375:5;16368:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16288:100;:::o;18638:201::-;18721:4;18738:13;18754:12;:10;:12::i;:::-;18738:28;;18777:32;18786:5;18793:7;18802:6;18777:8;:32::i;:::-;18827:4;18820:11;;;18638:201;;;;:::o;46012:383::-;8951:13;:11;:13::i;:::-;46104:4:::1;46091:10;:17;;;;46131:3;46119:9;:15;;;;46181:10;;46161:16;;:30;;;;:::i;:::-;46145:13;:46;;;;46235:9;;46217:15;;:27;;;;:::i;:::-;46202:12;:42;;;;46279:2;46263:12;;:18;;46255:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;46351:2;46334:13;;:19;;46326:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;46012:383:::0;;:::o;39265:64::-;;;;;;;;;;;;;;;;;;;;;;:::o;37507:51::-;;;:::o;17407:108::-;17468:7;17495:12;;17488:19;;17407:108;:::o;47295:157::-;8951:13;:11;:13::i;:::-;47402:9:::1;;;;;;;;;;;47374:38;;47391:9;47374:38;;;;;;;;;;;;47435:9;47423;;:21;;;;;;;;;;;;;;;;;;47295:157:::0;:::o;38093:50::-;;;;:::o;37895:35::-;;;;:::o;39356:42::-;;;;;;;;;;;;;;;;;;;;;;:::o;38914:33::-;;;;:::o;44556:250::-;8951:13;:11;:13::i;:::-;40304:1:::1;44675:2;:13;;;;:::i;:::-;44669:4;44665:1;44649:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:24;;;;:::i;:::-;44648:40;;;;:::i;:::-;44638:6;:50;;44630:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;40304:1;44784:2;:13;;;;:::i;:::-;44774:6;:24;;;;:::i;:::-;44751:20;:47;;;;44556:250:::0;:::o;19419:295::-;19550:4;19567:15;19585:12;:10;:12::i;:::-;19567:30;;19608:38;19624:4;19630:7;19639:6;19608:15;:38::i;:::-;19657:27;19667:4;19673:2;19677:6;19657:9;:27::i;:::-;19702:4;19695:11;;;19419:295;;;;;:::o;37610:53::-;37656:6;37610:53;:::o;37990:54::-;;;;:::o;37950:33::-;;;;;;;;;;;;;:::o;17250:92::-;17308:5;17333:1;17326:8;;17250:92;:::o;20123:238::-;20211:4;20228:13;20244:12;:10;:12::i;:::-;20228:28;;20267:64;20276:5;20283:7;20320:10;20292:25;20302:5;20309:7;20292:9;:25::i;:::-;:38;;;;:::i;:::-;20267:8;:64::i;:::-;20349:4;20342:11;;;20123:238;;;;:::o;37565:38::-;;;:::o;47466:125::-;47531:4;47555:19;:28;47575:7;47555:28;;;;;;;;;;;;;;;;;;;;;;;;;47548:35;;47466:125;;;:::o;39032:36::-;;;;;;;;;;;;;:::o;45413:286::-;8951:13;:11;:13::i;:::-;45524::::1;45506:15;:31;;;;45560:7;45548:9;:19;;;;45611:9;;45593:15;;:27;;;;:::i;:::-;45578:12;:42;;;;45655:2;45639:12;;:18;;45631:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;45413:286:::0;;:::o;38775:28::-;;;;:::o;38260:30::-;;;;;;;;;;;;;:::o;17578:127::-;17652:7;17679:9;:18;17689:7;17679:18;;;;;;;;;;;;;;;;17672:25;;17578:127;;;:::o;9713:103::-;8951:13;:11;:13::i;:::-;9778:30:::1;9805:1;9778:18;:30::i;:::-;9713:103::o:0;56284:447::-;8951:13;:11;:13::i;:::-;56438:3:::1;56415:19;:26;;56407:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;56528:4;56516:8;:16;;:33;;;;;56548:1;56536:8;:13;;56516:33;56508:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;56631:19;56613:15;:37;;;;56680:8;56661:16;:27;;;;56715:8;56699:13;;:24;;;;;;;;;;;;;;;;;;56284:447:::0;;;:::o;45057:144::-;8951:13;:11;:13::i;:::-;45189:4:::1;45147:31;:39;45179:6;45147:39;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;45057:144:::0;;:::o;37702:30::-;;;;;;;;;;;;;:::o;38299:24::-;;;;:::o;38701:30::-;;;;:::o;43205:231::-;8951:13;:11;:13::i;:::-;43308:4:::1;43294:11;;:18;;;;;;;;;;;;;;;;;;43340:15;43323:14;:32;;;;43378:15;43366:9;:27;;;;43423:5;43404:16;;:24;;;;;;;;;;;;;;;;;;43205:231::o:0;9065:87::-;9111:7;9138:6;;;;;;;;;;;9131:13;;9065:87;:::o;37739:24::-;;;;;;;;;;;;;:::o;38810:31::-;;;;:::o;45301:100::-;8951:13;:11;:13::i;:::-;45386:7:::1;45372:11;;:21;;;;;;;;;;;;;;;;;;45301:100:::0;:::o;16507:104::-;16563:13;16596:7;16589:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16507:104;:::o;46593:244::-;8951:13;:11;:13::i;:::-;46700::::1;46692:21;;:4;:21;;;;46684:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;46788:41;46817:4;46823:5;46788:28;:41::i;:::-;46593:244:::0;;:::o;38738:24::-;;;;:::o;38150:35::-;;;;:::o;38954:27::-;;;;:::o;38848:25::-;;;;:::o;20864:436::-;20957:4;20974:13;20990:12;:10;:12::i;:::-;20974:28;;21013:24;21040:25;21050:5;21057:7;21040:9;:25::i;:::-;21013:52;;21104:15;21084:16;:35;;21076:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;21197:60;21206:5;21213:7;21241:15;21222:16;:34;21197:8;:60::i;:::-;21288:4;21281:11;;;;20864:436;;;;:::o;38051:29::-;;;;:::o;17911:193::-;17990:4;18007:13;18023:12;:10;:12::i;:::-;18007:28;;18046;18056:5;18063:2;18067:6;18046:9;:28::i;:::-;18092:4;18085:11;;;17911:193;;;;:::o;47041:242::-;8951:13;:11;:13::i;:::-;47178:15:::1;;;;;;;;;;;47135:59;;47158:18;47135:59;;;;;;;;;;;;47223:18;47205:15;;:36;;;;;;;;;;;;;;;;;;47271:4;47252:16;;:23;;;;;;;;;;;;;;;;;;47041:242:::0;:::o;39612:58::-;;;;;;;;;;;;;;;;;;;;;;:::o;38194:32::-;;;;;;;;;;;;;:::o;43068:81::-;42410:9;;;;;;;;;;;42396:23;;:10;:23;;;42388:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;43123:18:::1;:16;:18::i;:::-;43068:81::o:0;38880:21::-;;;;:::o;39418:36::-;;;;;;;;;;;;;;;;;;;;;;:::o;46403:182::-;8951:13;:11;:13::i;:::-;46519:8:::1;46488:19;:28;46508:7;46488:28;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;46559:7;46543:34;;;46568:8;46543:34;;;;;;:::i;:::-;;;;;;;;46403:182:::0;;:::o;44814:231::-;8951:13;:11;:13::i;:::-;40304:1:::1;44936:2;:13;;;;:::i;:::-;44930:4;44926:1;44910:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:24;;;;:::i;:::-;44909:40;;;;:::i;:::-;44899:6;:50;;44891:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;40304:1;45023:2;:13;;;;:::i;:::-;45013:6;:24;;;;:::i;:::-;45001:9;:36;;;;44814:231:::0;:::o;42763:126::-;8951:13;:11;:13::i;:::-;42866:15:::1;42847:16;;:34;;;;;;;;;;;;;;;;;;42763:126:::0;:::o;38619:39::-;;;;;;;;;;;;;:::o;37776:35::-;;;;:::o;43710:385::-;43791:4;8951:13;:11;:13::i;:::-;43848:6:::1;43844:1;43828:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:26;;;;:::i;:::-;43815:9;:39;;43807:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;43965:4;43960:2;43944:13;:11;:13::i;:::-;:18;;;;:::i;:::-;:25;;;;:::i;:::-;43931:9;:38;;43923:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;44056:9;44035:18;:30;;;;44083:4;44076:11;;43710:385:::0;;;:::o;38667:27::-;;;;:::o;18167:151::-;18256:7;18283:11;:18;18295:5;18283:18;;;;;;;;;;;;;;;:27;18302:7;18283:27;;;;;;;;;;;;;;;;18276:34;;18167:151;;;;:::o;37818:33::-;;;;:::o;43501:134::-;43561:4;8951:13;:11;:13::i;:::-;43600:5:::1;43577:20;;:28;;;;;;;;;;;;;;;;;;43623:4;43616:11;;43501:134:::0;:::o;9971:201::-;8951:13;:11;:13::i;:::-;10080:1:::1;10060:22;;:8;:22;;;;10052:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;10136:28;10155:8;10136:18;:28::i;:::-;9971:201:::0;:::o;44107:437::-;8951:13;:11;:13::i;:::-;40304:1:::1;44249:2;:13;;;;:::i;:::-;44243:4;44239:1;44223:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:24;;;;:::i;:::-;44222:40;;;;:::i;:::-;44210:8;:52;;44202:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;40304:1;44360:2;:13;;;;:::i;:::-;44348:8;:26;;;;:::i;:::-;44325:20;:49;;;;44438:4;44432;44428:1;44412:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:24;;;;:::i;:::-;44411:31;;;;:::i;:::-;44395:12;:47;;44387:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;40304:1;44522:2;:13;;;;:::i;:::-;44506:12;:30;;;;:::i;:::-;44494:9;:42;;;;44107:437:::0;;:::o;37858:24::-;;;;:::o;39075:36::-;;;;;;;;;;;;;:::o;27344:124::-;;;;:::o;9230:132::-;9305:12;:10;:12::i;:::-;9294:23;;:7;:5;:7::i;:::-;:23;;;9286:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9230:132::o;7616:98::-;7669:7;7696:10;7689:17;;7616:98;:::o;24891:380::-;25044:1;25027:19;;:5;:19;;;;25019:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;25125:1;25106:21;;:7;:21;;;;25098:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;25209:6;25179:11;:18;25191:5;25179:18;;;;;;;;;;;;;;;:27;25198:7;25179:27;;;;;;;;;;;;;;;:36;;;;25247:7;25231:32;;25240:5;25231:32;;;25256:6;25231:32;;;;;;:::i;:::-;;;;;;;;24891:380;;;:::o;25562:453::-;25697:24;25724:25;25734:5;25741:7;25724:9;:25::i;:::-;25697:52;;25784:17;25764:16;:37;25760:248;;25846:6;25826:16;:26;;25818:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;25930:51;25939:5;25946:7;25974:6;25955:16;:25;25930:8;:51::i;:::-;25760:248;25686:329;25562:453;;;:::o;47983:5603::-;48131:1;48115:18;;:4;:18;;;;48107:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48208:1;48194:16;;:2;:16;;;;48186:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;48284:1;48274:6;:11;48271:92;;;48302:28;48318:4;48324:2;48328:1;48302:15;:28::i;:::-;48345:7;;48271:92;48409:7;:5;:7::i;:::-;48401:15;;:4;:15;;;;:45;;;;;48439:7;:5;:7::i;:::-;48433:13;;:2;:13;;;;48401:45;:78;;;;;48477:1;48463:16;;:2;:16;;;;48401:78;:116;;;;;48510:6;48496:21;;:2;:21;;;;48401:116;:142;;;;;48535:8;;;;;;;;;;;48534:9;48401:142;48383:3128;;;48573:16;;;;;;;;;;;48569:297;;;48618:10;:14;48629:2;48618:14;;;;;;;;;;;;;;;;;;;;;;;;;:34;;;;48636:10;:16;48647:4;48636:16;;;;;;;;;;;;;;;;;;;;;;;;;48618:34;48610:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;48693:25;:31;48719:4;48693:31;;;;;;;;;;;;;;;;;;;;;;;;;48692:32;48684:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;48569:297;;;48763:16;;;;;;;;;;;:51;;;;;48783:25;:31;48809:4;48783:31;;;;;;;;;;;;;;;;;;;;;;;;;48763:51;48759:107;;;48846:4;48835;:8;48840:2;48835:8;;;;;;;;;;;;;;;;:15;;;;;;;;;;;;;;;;;;48759:107;48569:297;48902:15;;;;;;;;;;;:35;;;;;48921:10;:16;48932:4;48921:16;;;;;;;;;;;;;;;;;;;;;;;;;48902:35;48898:1116;;;48964:25;:29;48990:2;48964:29;;;;;;;;;;;;;;;;;;;;;;;;;48963:30;:66;;;;;48998:25;:31;49024:4;48998:31;;;;;;;;;;;;;;;;;;;;;;;;;48997:32;48963:66;48958:208;;;49108:6;49096:9;;:18;;;;:::i;:::-;49078:15;:36;49070:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;48958:208;49221:6;49209:9;;:18;;;;:::i;:::-;49190:15;:37;49186:813;;49255:25;:29;49281:2;49255:29;;;;;;;;;;;;;;;;;;;;;;;;;49251:637;;;49353:6;49341:9;;:18;;;;:::i;:::-;49323:15;:36;49315:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;49416:20;49499:6;49487:9;;:18;;;;:::i;:::-;49469:15;:36;49465:171;;;49553:2;49536:19;;49465:171;;;49634:2;49617:19;;49465:171;49665:24;49739:3;49722:14;49692:44;;:11;:17;49704:4;49692:17;;;;;;;;;;;;;;;:27;;;:44;;;;:::i;:::-;:50;;;;:::i;:::-;49665:77;;49816:16;49786:11;:17;49798:4;49786:17;;;;;;;;;;;;;;;:27;;;49777:6;:36;;;;:::i;:::-;:55;49769:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;49286:602;;49251:637;49186:813;;;49929:1;49917:9;;:13;49913:86;;;49974:5;49956:15;;:23;;;;;;;;;;;;;;;;;;49913:86;49186:813;48898:1116;50034:13;;;;;;;;;;;50030:140;;50075:19;:25;50095:4;50075:25;;;;;;;;;;;;;;;;;;;;;;;;;:52;;;;50104:19;:23;50124:2;50104:23;;;;;;;;;;;;;;;;;;;;;;;;;50075:52;50067:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;50030:140;50320:20;;;;;;;;;;;50316:393;;;50370:7;:5;:7::i;:::-;50364:13;;:2;:13;;;;:47;;;;;50395:15;50381:30;;:2;:30;;;;50364:47;:79;;;;;50429:13;50415:28;;:2;:28;;;;50364:79;50360:334;;;50512:12;50475:11;:22;50487:9;50475:22;;;;;;;;;;;;;;;:34;;;:49;50467:135;;;;;;;;;;;;:::i;:::-;;;;;;;;;50662:12;50625:11;:22;50637:9;50625:22;;;;;;;;;;;;;;;:34;;:49;;;;50360:334;50316:393;50770:25;:31;50796:4;50770:31;;;;;;;;;;;;;;;;;;;;;;;;;:71;;;;;50806:31;:35;50838:2;50806:35;;;;;;;;;;;;;;;;;;;;;;;;;50805:36;50770:71;50766:734;;;50884:20;;50874:6;:30;;50866:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;51019:9;;51002:13;51012:2;51002:9;:13::i;:::-;50993:6;:22;;;;:::i;:::-;:35;;50985:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;50766:734;;;51134:25;:29;51160:2;51134:29;;;;;;;;;;;;;;;;;;;;;;;;;:71;;;;;51168:31;:37;51200:4;51168:37;;;;;;;;;;;;;;;;;;;;;;;;;51167:38;51134:71;51130:370;;;51244:20;;51234:6;:30;;51226:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;51130:370;;;51362:31;:35;51394:2;51362:35;;;;;;;;;;;;;;;;;;;;;;;;;51358:142;;51451:9;;51434:13;51444:2;51434:9;:13::i;:::-;51425:6;:22;;;;:::i;:::-;:35;;51417:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;51358:142;51130:370;50766:734;48383:3128;51541:28;51572:24;51590:4;51572:9;:24::i;:::-;51541:55;;51617:12;51656:18;;51632:20;:42;;51617:57;;51705:7;:35;;;;;51729:11;;;;;;;;;;;51705:35;:61;;;;;51758:8;;;;;;;;;;;51757:9;51705:61;:110;;;;;51784:25;:31;51810:4;51784:31;;;;;;;;;;;;;;;;;;;;;;;;;51783:32;51705:110;:153;;;;;51833:19;:25;51853:4;51833:25;;;;;;;;;;;;;;;;;;;;;;;;;51832:26;51705:153;:194;;;;;51876:19;:23;51896:2;51876:23;;;;;;;;;;;;;;;;;;;;;;;;;51875:24;51705:194;51687:338;;;51937:4;51926:8;;:15;;;;;;;;;;;;;;;;;;51970:10;:8;:10::i;:::-;52008:5;51997:8;;:16;;;;;;;;;;;;;;;;;;51687:338;52049:8;;;;;;;;;;;52048:9;:42;;;;;52061:25;:29;52087:2;52061:29;;;;;;;;;;;;;;;;;;;;;;;;;52048:42;:59;;;;;52094:13;;;;;;;;;;;52048:59;:114;;;;;52147:15;;52130:14;;:32;;;;:::i;:::-;52111:15;:51;;52048:114;:144;;;;;52167:19;:25;52187:4;52167:25;;;;;;;;;;;;;;;;;;;;;;;;;52166:26;52048:144;52045:204;;;52208:29;:27;:29::i;:::-;;52045:204;52261:12;52277:8;;;;;;;;;;;52276:9;52261:24;;52386:19;:25;52406:4;52386:25;;;;;;;;;;;;;;;;;;;;;;;;;:52;;;;52415:19;:23;52435:2;52415:23;;;;;;;;;;;;;;;;;;;;;;;;;52386:52;52383:99;;;52465:5;52455:15;;52383:99;52502:12;52606:7;52603:843;;;52657:25;:29;52683:2;52657:29;;;;;;;;;;;;;;;;;;;;;;;;;:50;;;;;52706:1;52690:13;;:17;52657:50;52653:618;;;52734:56;52786:3;52734:47;52745:4;:10;52750:4;52745:10;;;;;;;;;;;;;;;;;;;;;;;;;:35;;52767:13;;52745:35;;;52758:6;;52745:35;52734:6;:10;;:47;;;;:::i;:::-;:51;;:56;;;;:::i;:::-;52727:63;;52845:13;;52832:10;;52825:4;:17;;;;:::i;:::-;:33;;;;:::i;:::-;52809:12;;:49;;;;;;;:::i;:::-;;;;;;;;52925:13;;52906:16;;52899:4;:23;;;;:::i;:::-;:39;;;;:::i;:::-;52877:18;;:61;;;;;;;:::i;:::-;;;;;;;;52653:618;;;52999:25;:31;53025:4;52999:31;;;;;;;;;;;;;;;;;;;;;;;;;:51;;;;;53049:1;53034:12;;:16;52999:51;52996:275;;;53078:33;53107:3;53078:24;53089:12;;53078:6;:10;;:24;;;;:::i;:::-;:28;;:33;;;;:::i;:::-;53071:40;;53165:12;;53153:9;;53146:4;:16;;;;:::i;:::-;:31;;;;:::i;:::-;53130:12;;:47;;;;;;;:::i;:::-;;;;;;;;53243:12;;53225:15;;53218:4;:22;;;;:::i;:::-;:37;;;;:::i;:::-;53196:18;;:59;;;;;;;:::i;:::-;;;;;;;;52996:275;52653:618;53309:1;53302:4;:8;53299:93;;;53334:42;53350:4;53364;53371;53334:15;:42::i;:::-;53299:93;53430:4;53420:14;;;;;:::i;:::-;;;52603:843;53545:33;53561:4;53567:2;53571:6;53545:15;:33::i;:::-;48096:5490;;;;47983:5603;;;;:::o;10332:191::-;10406:16;10425:6;;;;;;;;;;;10406:25;;10451:8;10442:6;;:17;;;;;;;;;;;;;;;;;;10506:8;10475:40;;10496:8;10475:40;;;;;;;;;;;;10395:128;10332:191;:::o;46845:188::-;46962:5;46928:25;:31;46954:4;46928:31;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;47019:5;46985:40;;47013:4;46985:40;;;;;;;;;;;;46845:188;;:::o;47655:320::-;47709:23;47735:24;47753:4;47735:9;:24::i;:::-;47709:50;;47770:12;47823:1;47804:15;:20;47801:32;;;47826:7;;;;47801:32;47843:33;47860:15;47843:16;:33::i;:::-;47918:9;;;;;;;;;;;47910:23;;47941:21;47910:57;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47896:71;;;;;47698:277;;47655:320;:::o;21770:840::-;21917:1;21901:18;;:4;:18;;;;21893:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;21994:1;21980:16;;:2;:16;;;;21972:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;22049:38;22070:4;22076:2;22080:6;22049:20;:38::i;:::-;22100:19;22122:9;:15;22132:4;22122:15;;;;;;;;;;;;;;;;22100:37;;22171:6;22156:11;:21;;22148:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;22288:6;22274:11;:20;22256:9;:15;22266:4;22256:15;;;;;;;;;;;;;;;:38;;;;22491:6;22474:9;:13;22484:2;22474:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;22541:2;22526:26;;22535:4;22526:26;;;22545:6;22526:26;;;;;;:::i;:::-;;;;;;;;22565:37;22585:4;22591:2;22595:6;22565:19;:37::i;:::-;21882:728;21770:840;;;:::o;55085:1187::-;55124:23;55150:24;55168:4;55150:9;:24::i;:::-;55124:50;;55185:25;55234:12;;55213:18;;:33;;;;:::i;:::-;55185:61;;55257:12;55312:1;55293:15;:20;:46;;;;55338:1;55317:17;:22;55293:46;55290:60;;;55342:7;;;;;55290:60;55404:2;55383:18;;:23;;;;:::i;:::-;55365:15;:41;55362:111;;;55459:2;55438:18;;:23;;;;:::i;:::-;55420:41;;55362:111;55542:26;55571:15;55542:44;;55607:25;55635:21;55607:49;;55669:36;55686:18;55669:16;:36::i;:::-;55727:18;55748:44;55774:17;55748:21;:25;;:44;;;;:::i;:::-;55727:65;;55813:23;55839:57;55878:17;55839:34;55854:18;;55839:10;:14;;:34;;;;:::i;:::-;:38;;:57;;;;:::i;:::-;55813:83;;55909:17;55929:51;55962:17;55929:28;55944:12;;55929:10;:14;;:28;;;;:::i;:::-;:32;;:51;;;;:::i;:::-;55909:71;;56029:9;;;;;;;;;;;56021:23;;56052:9;56021:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56007:59;;;;;56102:1;56081:18;;:22;56077:126;;;56142:15;;;;;;;;;;;56134:29;;56171:15;56134:57;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56120:71;;;;;56077:126;56236:1;56215:18;:22;;;;56263:1;56248:12;:16;;;;55113:1159;;;;;;;;55085:1187;:::o;56743:804::-;56800:4;56843:15;56826:14;:32;;;;56921:28;56952:4;:14;;;56967:13;56952:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56921:60;;57039:20;57062:53;57109:5;57062:42;57087:16;;57062:20;:24;;:42;;;;:::i;:::-;:46;;:53;;;;:::i;:::-;57039:76;;57243:1;57228:12;:16;57224:109;;;57260:61;57276:13;57299:6;57308:12;57260:15;:61::i;:::-;57224:109;57416:19;57453:13;57416:51;;57478:4;:9;;;:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57505:12;;;;;;;;;;57535:4;57528:11;;;;;56743:804;:::o;3510:98::-;3568:7;3599:1;3595;:5;;;;:::i;:::-;3588:12;;3510:98;;;;:::o;3909:::-;3967:7;3998:1;3994;:5;;;;:::i;:::-;3987:12;;3909:98;;;;:::o;53945:601::-;54073:21;54111:1;54097:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54073:40;;54142:4;54124;54129:1;54124:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;54168:15;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54158:4;54163:1;54158:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;;;54203:62;54220:4;54235:15;54253:11;54203:8;:62::i;:::-;54304:15;:66;;;54385:11;54411:1;54455:4;54482;54502:15;54304:224;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54000:546;53945:601;:::o;26615:125::-;;;;:::o;53594:343::-;53724:10;:14;53735:2;53724:14;;;;;;;;;;;;;;;;;;;;;;;;;53720:68;;;53782:6;53753:11;:15;53765:2;53753:15;;;;;;;;;;;;;;;:25;;;:35;;;;;;;:::i;:::-;;;;;;;;53720:68;53805:10;:16;53816:4;53805:16;;;;;;;;;;;;;;;;;;;;;;;;;53801:72;;;53867:6;53836:11;:17;53848:4;53836:17;;;;;;;;;;;;;;;:27;;;:37;;;;;;;:::i;:::-;;;;;;;;53801:72;53886:43;53912:4;53918:2;53922:6;53886:25;:43::i;:::-;53594:343;;;:::o;3153:98::-;3211:7;3242:1;3238;:5;;;;:::i;:::-;3231:12;;3153:98;;;;:::o;88:117:1:-;197:1;194;187:12;211:117;320:1;317;310:12;334:90;368:7;411:5;404:13;397:21;386:32;;334:90;;;:::o;430:116::-;500:21;515:5;500:21;:::i;:::-;493:5;490:32;480:60;;536:1;533;526:12;480:60;430:116;:::o;552:133::-;595:5;633:6;620:20;611:29;;649:30;673:5;649:30;:::i;:::-;552:133;;;;:::o;691:323::-;747:6;796:2;784:9;775:7;771:23;767:32;764:119;;;802:79;;:::i;:::-;764:119;922:1;947:50;989:7;980:6;969:9;965:22;947:50;:::i;:::-;937:60;;893:114;691:323;;;;:::o;1020:117::-;1129:1;1126;1119:12;1143:117;1252:1;1249;1242:12;1266:117;1375:1;1372;1365:12;1406:568;1479:8;1489:6;1539:3;1532:4;1524:6;1520:17;1516:27;1506:122;;1547:79;;:::i;:::-;1506:122;1660:6;1647:20;1637:30;;1690:18;1682:6;1679:30;1676:117;;;1712:79;;:::i;:::-;1676:117;1826:4;1818:6;1814:17;1802:29;;1880:3;1872:4;1864:6;1860:17;1850:8;1846:32;1843:41;1840:128;;;1887:79;;:::i;:::-;1840:128;1406:568;;;;;:::o;1980:698::-;2072:6;2080;2088;2137:2;2125:9;2116:7;2112:23;2108:32;2105:119;;;2143:79;;:::i;:::-;2105:119;2291:1;2280:9;2276:17;2263:31;2321:18;2313:6;2310:30;2307:117;;;2343:79;;:::i;:::-;2307:117;2456:80;2528:7;2519:6;2508:9;2504:22;2456:80;:::i;:::-;2438:98;;;;2234:312;2585:2;2611:50;2653:7;2644:6;2633:9;2629:22;2611:50;:::i;:::-;2601:60;;2556:115;1980:698;;;;;:::o;2684:109::-;2765:21;2780:5;2765:21;:::i;:::-;2760:3;2753:34;2684:109;;:::o;2799:210::-;2886:4;2924:2;2913:9;2909:18;2901:26;;2937:65;2999:1;2988:9;2984:17;2975:6;2937:65;:::i;:::-;2799:210;;;;:::o;3015:77::-;3052:7;3081:5;3070:16;;3015:77;;;:::o;3098:122::-;3171:24;3189:5;3171:24;:::i;:::-;3164:5;3161:35;3151:63;;3210:1;3207;3200:12;3151:63;3098:122;:::o;3226:139::-;3272:5;3310:6;3297:20;3288:29;;3326:33;3353:5;3326:33;:::i;:::-;3226:139;;;;:::o;3371:474::-;3439:6;3447;3496:2;3484:9;3475:7;3471:23;3467:32;3464:119;;;3502:79;;:::i;:::-;3464:119;3622:1;3647:53;3692:7;3683:6;3672:9;3668:22;3647:53;:::i;:::-;3637:63;;3593:117;3749:2;3775:53;3820:7;3811:6;3800:9;3796:22;3775:53;:::i;:::-;3765:63;;3720:118;3371:474;;;;;:::o;3851:99::-;3903:6;3937:5;3931:12;3921:22;;3851:99;;;:::o;3956:169::-;4040:11;4074:6;4069:3;4062:19;4114:4;4109:3;4105:14;4090:29;;3956:169;;;;:::o;4131:307::-;4199:1;4209:113;4223:6;4220:1;4217:13;4209:113;;;4308:1;4303:3;4299:11;4293:18;4289:1;4284:3;4280:11;4273:39;4245:2;4242:1;4238:10;4233:15;;4209:113;;;4340:6;4337:1;4334:13;4331:101;;;4420:1;4411:6;4406:3;4402:16;4395:27;4331:101;4180:258;4131:307;;;:::o;4444:102::-;4485:6;4536:2;4532:7;4527:2;4520:5;4516:14;4512:28;4502:38;;4444:102;;;:::o;4552:364::-;4640:3;4668:39;4701:5;4668:39;:::i;:::-;4723:71;4787:6;4782:3;4723:71;:::i;:::-;4716:78;;4803:52;4848:6;4843:3;4836:4;4829:5;4825:16;4803:52;:::i;:::-;4880:29;4902:6;4880:29;:::i;:::-;4875:3;4871:39;4864:46;;4644:272;4552:364;;;;:::o;4922:313::-;5035:4;5073:2;5062:9;5058:18;5050:26;;5122:9;5116:4;5112:20;5108:1;5097:9;5093:17;5086:47;5150:78;5223:4;5214:6;5150:78;:::i;:::-;5142:86;;4922:313;;;;:::o;5241:126::-;5278:7;5318:42;5311:5;5307:54;5296:65;;5241:126;;;:::o;5373:96::-;5410:7;5439:24;5457:5;5439:24;:::i;:::-;5428:35;;5373:96;;;:::o;5475:122::-;5548:24;5566:5;5548:24;:::i;:::-;5541:5;5538:35;5528:63;;5587:1;5584;5577:12;5528:63;5475:122;:::o;5603:139::-;5649:5;5687:6;5674:20;5665:29;;5703:33;5730:5;5703:33;:::i;:::-;5603:139;;;;:::o;5748:474::-;5816:6;5824;5873:2;5861:9;5852:7;5848:23;5844:32;5841:119;;;5879:79;;:::i;:::-;5841:119;5999:1;6024:53;6069:7;6060:6;6049:9;6045:22;6024:53;:::i;:::-;6014:63;;5970:117;6126:2;6152:53;6197:7;6188:6;6177:9;6173:22;6152:53;:::i;:::-;6142:63;;6097:118;5748:474;;;;;:::o;6228:329::-;6287:6;6336:2;6324:9;6315:7;6311:23;6307:32;6304:119;;;6342:79;;:::i;:::-;6304:119;6462:1;6487:53;6532:7;6523:6;6512:9;6508:22;6487:53;:::i;:::-;6477:63;;6433:117;6228:329;;;;:::o;6563:60::-;6591:3;6612:5;6605:12;;6563:60;;;:::o;6629:142::-;6679:9;6712:53;6730:34;6739:24;6757:5;6739:24;:::i;:::-;6730:34;:::i;:::-;6712:53;:::i;:::-;6699:66;;6629:142;;;:::o;6777:126::-;6827:9;6860:37;6891:5;6860:37;:::i;:::-;6847:50;;6777:126;;;:::o;6909:153::-;6986:9;7019:37;7050:5;7019:37;:::i;:::-;7006:50;;6909:153;;;:::o;7068:185::-;7182:64;7240:5;7182:64;:::i;:::-;7177:3;7170:77;7068:185;;:::o;7259:276::-;7379:4;7417:2;7406:9;7402:18;7394:26;;7430:98;7525:1;7514:9;7510:17;7501:6;7430:98;:::i;:::-;7259:276;;;;:::o;7541:118::-;7628:24;7646:5;7628:24;:::i;:::-;7623:3;7616:37;7541:118;;:::o;7665:222::-;7758:4;7796:2;7785:9;7781:18;7773:26;;7809:71;7877:1;7866:9;7862:17;7853:6;7809:71;:::i;:::-;7665:222;;;;:::o;7893:329::-;7952:6;8001:2;7989:9;7980:7;7976:23;7972:32;7969:119;;;8007:79;;:::i;:::-;7969:119;8127:1;8152:53;8197:7;8188:6;8177:9;8173:22;8152:53;:::i;:::-;8142:63;;8098:117;7893:329;;;;:::o;8228:619::-;8305:6;8313;8321;8370:2;8358:9;8349:7;8345:23;8341:32;8338:119;;;8376:79;;:::i;:::-;8338:119;8496:1;8521:53;8566:7;8557:6;8546:9;8542:22;8521:53;:::i;:::-;8511:63;;8467:117;8623:2;8649:53;8694:7;8685:6;8674:9;8670:22;8649:53;:::i;:::-;8639:63;;8594:118;8751:2;8777:53;8822:7;8813:6;8802:9;8798:22;8777:53;:::i;:::-;8767:63;;8722:118;8228:619;;;;;:::o;8853:118::-;8940:24;8958:5;8940:24;:::i;:::-;8935:3;8928:37;8853:118;;:::o;8977:222::-;9070:4;9108:2;9097:9;9093:18;9085:26;;9121:71;9189:1;9178:9;9174:17;9165:6;9121:71;:::i;:::-;8977:222;;;;:::o;9205:86::-;9240:7;9280:4;9273:5;9269:16;9258:27;;9205:86;;;:::o;9297:112::-;9380:22;9396:5;9380:22;:::i;:::-;9375:3;9368:35;9297:112;;:::o;9415:214::-;9504:4;9542:2;9531:9;9527:18;9519:26;;9555:67;9619:1;9608:9;9604:17;9595:6;9555:67;:::i;:::-;9415:214;;;;:::o;9635:613::-;9709:6;9717;9725;9774:2;9762:9;9753:7;9749:23;9745:32;9742:119;;;9780:79;;:::i;:::-;9742:119;9900:1;9925:53;9970:7;9961:6;9950:9;9946:22;9925:53;:::i;:::-;9915:63;;9871:117;10027:2;10053:53;10098:7;10089:6;10078:9;10074:22;10053:53;:::i;:::-;10043:63;;9998:118;10155:2;10181:50;10223:7;10214:6;10203:9;10199:22;10181:50;:::i;:::-;10171:60;;10126:115;9635:613;;;;;:::o;10254:468::-;10319:6;10327;10376:2;10364:9;10355:7;10351:23;10347:32;10344:119;;;10382:79;;:::i;:::-;10344:119;10502:1;10527:53;10572:7;10563:6;10552:9;10548:22;10527:53;:::i;:::-;10517:63;;10473:117;10629:2;10655:50;10697:7;10688:6;10677:9;10673:22;10655:50;:::i;:::-;10645:60;;10600:115;10254:468;;;;;:::o;10728:474::-;10796:6;10804;10853:2;10841:9;10832:7;10828:23;10824:32;10821:119;;;10859:79;;:::i;:::-;10821:119;10979:1;11004:53;11049:7;11040:6;11029:9;11025:22;11004:53;:::i;:::-;10994:63;;10950:117;11106:2;11132:53;11177:7;11168:6;11157:9;11153:22;11132:53;:::i;:::-;11122:63;;11077:118;10728:474;;;;;:::o;11208:180::-;11256:77;11253:1;11246:88;11353:4;11350:1;11343:15;11377:4;11374:1;11367:15;11394:180;11442:77;11439:1;11432:88;11539:4;11536:1;11529:15;11563:4;11560:1;11553:15;11580:233;11619:3;11642:24;11660:5;11642:24;:::i;:::-;11633:33;;11688:66;11681:5;11678:77;11675:103;;;11758:18;;:::i;:::-;11675:103;11805:1;11798:5;11794:13;11787:20;;11580:233;;;:::o;11819:305::-;11859:3;11878:20;11896:1;11878:20;:::i;:::-;11873:25;;11912:20;11930:1;11912:20;:::i;:::-;11907:25;;12066:1;11998:66;11994:74;11991:1;11988:81;11985:107;;;12072:18;;:::i;:::-;11985:107;12116:1;12113;12109:9;12102:16;;11819:305;;;;:::o;12130:179::-;12270:31;12266:1;12258:6;12254:14;12247:55;12130:179;:::o;12315:366::-;12457:3;12478:67;12542:2;12537:3;12478:67;:::i;:::-;12471:74;;12554:93;12643:3;12554:93;:::i;:::-;12672:2;12667:3;12663:12;12656:19;;12315:366;;;:::o;12687:419::-;12853:4;12891:2;12880:9;12876:18;12868:26;;12940:9;12934:4;12930:20;12926:1;12915:9;12911:17;12904:47;12968:131;13094:4;12968:131;:::i;:::-;12960:139;;12687:419;;;:::o;13112:180::-;13160:77;13157:1;13150:88;13257:4;13254:1;13247:15;13281:4;13278:1;13271:15;13298:320;13342:6;13379:1;13373:4;13369:12;13359:22;;13426:1;13420:4;13416:12;13447:18;13437:81;;13503:4;13495:6;13491:17;13481:27;;13437:81;13565:2;13557:6;13554:14;13534:18;13531:38;13528:84;;;13584:18;;:::i;:::-;13528:84;13349:269;13298:320;;;:::o;13624:179::-;13764:31;13760:1;13752:6;13748:14;13741:55;13624:179;:::o;13809:366::-;13951:3;13972:67;14036:2;14031:3;13972:67;:::i;:::-;13965:74;;14048:93;14137:3;14048:93;:::i;:::-;14166:2;14161:3;14157:12;14150:19;;13809:366;;;:::o;14181:419::-;14347:4;14385:2;14374:9;14370:18;14362:26;;14434:9;14428:4;14424:20;14420:1;14409:9;14405:17;14398:47;14462:131;14588:4;14462:131;:::i;:::-;14454:139;;14181:419;;;:::o;14606:102::-;14648:8;14695:5;14692:1;14688:13;14667:34;;14606:102;;;:::o;14714:848::-;14775:5;14782:4;14806:6;14797:15;;14830:5;14821:14;;14844:712;14865:1;14855:8;14852:15;14844:712;;;14960:4;14955:3;14951:14;14945:4;14942:24;14939:50;;;14969:18;;:::i;:::-;14939:50;15019:1;15009:8;15005:16;15002:451;;;15434:4;15427:5;15423:16;15414:25;;15002:451;15484:4;15478;15474:15;15466:23;;15514:32;15537:8;15514:32;:::i;:::-;15502:44;;14844:712;;;14714:848;;;;;;;:::o;15568:1073::-;15622:5;15813:8;15803:40;;15834:1;15825:10;;15836:5;;15803:40;15862:4;15852:36;;15879:1;15870:10;;15881:5;;15852:36;15948:4;15996:1;15991:27;;;;16032:1;16027:191;;;;15941:277;;15991:27;16009:1;16000:10;;16011:5;;;16027:191;16072:3;16062:8;16059:17;16056:43;;;16079:18;;:::i;:::-;16056:43;16128:8;16125:1;16121:16;16112:25;;16163:3;16156:5;16153:14;16150:40;;;16170:18;;:::i;:::-;16150:40;16203:5;;;15941:277;;16327:2;16317:8;16314:16;16308:3;16302:4;16299:13;16295:36;16277:2;16267:8;16264:16;16259:2;16253:4;16250:12;16246:35;16230:111;16227:246;;;16383:8;16377:4;16373:19;16364:28;;16418:3;16411:5;16408:14;16405:40;;;16425:18;;:::i;:::-;16405:40;16458:5;;16227:246;16498:42;16536:3;16526:8;16520:4;16517:1;16498:42;:::i;:::-;16483:57;;;;16572:4;16567:3;16563:14;16556:5;16553:25;16550:51;;;16581:18;;:::i;:::-;16550:51;16630:4;16623:5;16619:16;16610:25;;15568:1073;;;;;;:::o;16647:281::-;16705:5;16729:23;16747:4;16729:23;:::i;:::-;16721:31;;16773:25;16789:8;16773:25;:::i;:::-;16761:37;;16817:104;16854:66;16844:8;16838:4;16817:104;:::i;:::-;16808:113;;16647:281;;;;:::o;16934:348::-;16974:7;16997:20;17015:1;16997:20;:::i;:::-;16992:25;;17031:20;17049:1;17031:20;:::i;:::-;17026:25;;17219:1;17151:66;17147:74;17144:1;17141:81;17136:1;17129:9;17122:17;17118:105;17115:131;;;17226:18;;:::i;:::-;17115:131;17274:1;17271;17267:9;17256:20;;16934:348;;;;:::o;17288:180::-;17336:77;17333:1;17326:88;17433:4;17430:1;17423:15;17457:4;17454:1;17447:15;17474:185;17514:1;17531:20;17549:1;17531:20;:::i;:::-;17526:25;;17565:20;17583:1;17565:20;:::i;:::-;17560:25;;17604:1;17594:35;;17609:18;;:::i;:::-;17594:35;17651:1;17648;17644:9;17639:14;;17474:185;;;;:::o;17665:234::-;17805:34;17801:1;17793:6;17789:14;17782:58;17874:17;17869:2;17861:6;17857:15;17850:42;17665:234;:::o;17905:366::-;18047:3;18068:67;18132:2;18127:3;18068:67;:::i;:::-;18061:74;;18144:93;18233:3;18144:93;:::i;:::-;18262:2;18257:3;18253:12;18246:19;;17905:366;;;:::o;18277:419::-;18443:4;18481:2;18470:9;18466:18;18458:26;;18530:9;18524:4;18520:20;18516:1;18505:9;18501:17;18494:47;18558:131;18684:4;18558:131;:::i;:::-;18550:139;;18277:419;;;:::o;18702:238::-;18842:34;18838:1;18830:6;18826:14;18819:58;18911:21;18906:2;18898:6;18894:15;18887:46;18702:238;:::o;18946:366::-;19088:3;19109:67;19173:2;19168:3;19109:67;:::i;:::-;19102:74;;19185:93;19274:3;19185:93;:::i;:::-;19303:2;19298:3;19294:12;19287:19;;18946:366;;;:::o;19318:419::-;19484:4;19522:2;19511:9;19507:18;19499:26;;19571:9;19565:4;19561:20;19557:1;19546:9;19542:17;19535:47;19599:131;19725:4;19599:131;:::i;:::-;19591:139;;19318:419;;;:::o;19743:235::-;19883:34;19879:1;19871:6;19867:14;19860:58;19952:18;19947:2;19939:6;19935:15;19928:43;19743:235;:::o;19984:366::-;20126:3;20147:67;20211:2;20206:3;20147:67;:::i;:::-;20140:74;;20223:93;20312:3;20223:93;:::i;:::-;20341:2;20336:3;20332:12;20325:19;;19984:366;;;:::o;20356:419::-;20522:4;20560:2;20549:9;20545:18;20537:26;;20609:9;20603:4;20599:20;20595:1;20584:9;20580:17;20573:47;20637:131;20763:4;20637:131;:::i;:::-;20629:139;;20356:419;;;:::o;20781:244::-;20921:34;20917:1;20909:6;20905:14;20898:58;20990:27;20985:2;20977:6;20973:15;20966:52;20781:244;:::o;21031:366::-;21173:3;21194:67;21258:2;21253:3;21194:67;:::i;:::-;21187:74;;21270:93;21359:3;21270:93;:::i;:::-;21388:2;21383:3;21379:12;21372:19;;21031:366;;;:::o;21403:419::-;21569:4;21607:2;21596:9;21592:18;21584:26;;21656:9;21650:4;21646:20;21642:1;21631:9;21627:17;21620:47;21684:131;21810:4;21684:131;:::i;:::-;21676:139;;21403:419;;;:::o;21828:224::-;21968:34;21964:1;21956:6;21952:14;21945:58;22037:7;22032:2;22024:6;22020:15;22013:32;21828:224;:::o;22058:366::-;22200:3;22221:67;22285:2;22280:3;22221:67;:::i;:::-;22214:74;;22297:93;22386:3;22297:93;:::i;:::-;22415:2;22410:3;22406:12;22399:19;;22058:366;;;:::o;22430:419::-;22596:4;22634:2;22623:9;22619:18;22611:26;;22683:9;22677:4;22673:20;22669:1;22658:9;22654:17;22647:47;22711:131;22837:4;22711:131;:::i;:::-;22703:139;;22430:419;;;:::o;22855:225::-;22995:34;22991:1;22983:6;22979:14;22972:58;23064:8;23059:2;23051:6;23047:15;23040:33;22855:225;:::o;23086:366::-;23228:3;23249:67;23313:2;23308:3;23249:67;:::i;:::-;23242:74;;23325:93;23414:3;23325:93;:::i;:::-;23443:2;23438:3;23434:12;23427:19;;23086:366;;;:::o;23458:419::-;23624:4;23662:2;23651:9;23647:18;23639:26;;23711:9;23705:4;23701:20;23697:1;23686:9;23682:17;23675:47;23739:131;23865:4;23739:131;:::i;:::-;23731:139;;23458:419;;;:::o;23883:223::-;24023:34;24019:1;24011:6;24007:14;24000:58;24092:6;24087:2;24079:6;24075:15;24068:31;23883:223;:::o;24112:366::-;24254:3;24275:67;24339:2;24334:3;24275:67;:::i;:::-;24268:74;;24351:93;24440:3;24351:93;:::i;:::-;24469:2;24464:3;24460:12;24453:19;;24112:366;;;:::o;24484:419::-;24650:4;24688:2;24677:9;24673:18;24665:26;;24737:9;24731:4;24727:20;24723:1;24712:9;24708:17;24701:47;24765:131;24891:4;24765:131;:::i;:::-;24757:139;;24484:419;;;:::o;24909:240::-;25049:34;25045:1;25037:6;25033:14;25026:58;25118:23;25113:2;25105:6;25101:15;25094:48;24909:240;:::o;25155:366::-;25297:3;25318:67;25382:2;25377:3;25318:67;:::i;:::-;25311:74;;25394:93;25483:3;25394:93;:::i;:::-;25512:2;25507:3;25503:12;25496:19;;25155:366;;;:::o;25527:419::-;25693:4;25731:2;25720:9;25716:18;25708:26;;25780:9;25774:4;25770:20;25766:1;25755:9;25751:17;25744:47;25808:131;25934:4;25808:131;:::i;:::-;25800:139;;25527:419;;;:::o;25952:237::-;26092:34;26088:1;26080:6;26076:14;26069:58;26161:20;26156:2;26148:6;26144:15;26137:45;25952:237;:::o;26195:366::-;26337:3;26358:67;26422:2;26417:3;26358:67;:::i;:::-;26351:74;;26434:93;26523:3;26434:93;:::i;:::-;26552:2;26547:3;26543:12;26536:19;;26195:366;;;:::o;26567:419::-;26733:4;26771:2;26760:9;26756:18;26748:26;;26820:9;26814:4;26810:20;26806:1;26795:9;26791:17;26784:47;26848:131;26974:4;26848:131;:::i;:::-;26840:139;;26567:419;;;:::o;26992:225::-;27132:34;27128:1;27120:6;27116:14;27109:58;27201:8;27196:2;27188:6;27184:15;27177:33;26992:225;:::o;27223:366::-;27365:3;27386:67;27450:2;27445:3;27386:67;:::i;:::-;27379:74;;27462:93;27551:3;27462:93;:::i;:::-;27580:2;27575:3;27571:12;27564:19;;27223:366;;;:::o;27595:419::-;27761:4;27799:2;27788:9;27784:18;27776:26;;27848:9;27842:4;27838:20;27834:1;27823:9;27819:17;27812:47;27876:131;28002:4;27876:131;:::i;:::-;27868:139;;27595:419;;;:::o;28020:223::-;28160:34;28156:1;28148:6;28144:14;28137:58;28229:6;28224:2;28216:6;28212:15;28205:31;28020:223;:::o;28249:366::-;28391:3;28412:67;28476:2;28471:3;28412:67;:::i;:::-;28405:74;;28488:93;28577:3;28488:93;:::i;:::-;28606:2;28601:3;28597:12;28590:19;;28249:366;;;:::o;28621:419::-;28787:4;28825:2;28814:9;28810:18;28802:26;;28874:9;28868:4;28864:20;28860:1;28849:9;28845:17;28838:47;28902:131;29028:4;28902:131;:::i;:::-;28894:139;;28621:419;;;:::o;29046:182::-;29186:34;29182:1;29174:6;29170:14;29163:58;29046:182;:::o;29234:366::-;29376:3;29397:67;29461:2;29456:3;29397:67;:::i;:::-;29390:74;;29473:93;29562:3;29473:93;:::i;:::-;29591:2;29586:3;29582:12;29575:19;;29234:366;;;:::o;29606:419::-;29772:4;29810:2;29799:9;29795:18;29787:26;;29859:9;29853:4;29849:20;29845:1;29834:9;29830:17;29823:47;29887:131;30013:4;29887:131;:::i;:::-;29879:139;;29606:419;;;:::o;30031:223::-;30171:34;30167:1;30159:6;30155:14;30148:58;30240:6;30235:2;30227:6;30223:15;30216:31;30031:223;:::o;30260:366::-;30402:3;30423:67;30487:2;30482:3;30423:67;:::i;:::-;30416:74;;30499:93;30588:3;30499:93;:::i;:::-;30617:2;30612:3;30608:12;30601:19;;30260:366;;;:::o;30632:419::-;30798:4;30836:2;30825:9;30821:18;30813:26;;30885:9;30879:4;30875:20;30871:1;30860:9;30856:17;30849:47;30913:131;31039:4;30913:131;:::i;:::-;30905:139;;30632:419;;;:::o;31057:221::-;31197:34;31193:1;31185:6;31181:14;31174:58;31266:4;31261:2;31253:6;31249:15;31242:29;31057:221;:::o;31284:366::-;31426:3;31447:67;31511:2;31506:3;31447:67;:::i;:::-;31440:74;;31523:93;31612:3;31523:93;:::i;:::-;31641:2;31636:3;31632:12;31625:19;;31284:366;;;:::o;31656:419::-;31822:4;31860:2;31849:9;31845:18;31837:26;;31909:9;31903:4;31899:20;31895:1;31884:9;31880:17;31873:47;31937:131;32063:4;31937:131;:::i;:::-;31929:139;;31656:419;;;:::o;32081:179::-;32221:31;32217:1;32209:6;32205:14;32198:55;32081:179;:::o;32266:366::-;32408:3;32429:67;32493:2;32488:3;32429:67;:::i;:::-;32422:74;;32505:93;32594:3;32505:93;:::i;:::-;32623:2;32618:3;32614:12;32607:19;;32266:366;;;:::o;32638:419::-;32804:4;32842:2;32831:9;32827:18;32819:26;;32891:9;32885:4;32881:20;32877:1;32866:9;32862:17;32855:47;32919:131;33045:4;32919:131;:::i;:::-;32911:139;;32638:419;;;:::o;33063:224::-;33203:34;33199:1;33191:6;33187:14;33180:58;33272:7;33267:2;33259:6;33255:15;33248:32;33063:224;:::o;33293:366::-;33435:3;33456:67;33520:2;33515:3;33456:67;:::i;:::-;33449:74;;33532:93;33621:3;33532:93;:::i;:::-;33650:2;33645:3;33641:12;33634:19;;33293:366;;;:::o;33665:419::-;33831:4;33869:2;33858:9;33854:18;33846:26;;33918:9;33912:4;33908:20;33904:1;33893:9;33889:17;33882:47;33946:131;34072:4;33946:131;:::i;:::-;33938:139;;33665:419;;;:::o;34090:222::-;34230:34;34226:1;34218:6;34214:14;34207:58;34299:5;34294:2;34286:6;34282:15;34275:30;34090:222;:::o;34318:366::-;34460:3;34481:67;34545:2;34540:3;34481:67;:::i;:::-;34474:74;;34557:93;34646:3;34557:93;:::i;:::-;34675:2;34670:3;34666:12;34659:19;;34318:366;;;:::o;34690:419::-;34856:4;34894:2;34883:9;34879:18;34871:26;;34943:9;34937:4;34933:20;34929:1;34918:9;34914:17;34907:47;34971:131;35097:4;34971:131;:::i;:::-;34963:139;;34690:419;;;:::o;35115:158::-;35255:10;35251:1;35243:6;35239:14;35232:34;35115:158;:::o;35279:365::-;35421:3;35442:66;35506:1;35501:3;35442:66;:::i;:::-;35435:73;;35517:93;35606:3;35517:93;:::i;:::-;35635:2;35630:3;35626:12;35619:19;;35279:365;;;:::o;35650:419::-;35816:4;35854:2;35843:9;35839:18;35831:26;;35903:9;35897:4;35893:20;35889:1;35878:9;35874:17;35867:47;35931:131;36057:4;35931:131;:::i;:::-;35923:139;;35650:419;;;:::o;36075:174::-;36215:26;36211:1;36203:6;36199:14;36192:50;36075:174;:::o;36255:366::-;36397:3;36418:67;36482:2;36477:3;36418:67;:::i;:::-;36411:74;;36494:93;36583:3;36494:93;:::i;:::-;36612:2;36607:3;36603:12;36596:19;;36255:366;;;:::o;36627:419::-;36793:4;36831:2;36820:9;36816:18;36808:26;;36880:9;36874:4;36870:20;36866:1;36855:9;36851:17;36844:47;36908:131;37034:4;36908:131;:::i;:::-;36900:139;;36627:419;;;:::o;37052:172::-;37192:24;37188:1;37180:6;37176:14;37169:48;37052:172;:::o;37230:366::-;37372:3;37393:67;37457:2;37452:3;37393:67;:::i;:::-;37386:74;;37469:93;37558:3;37469:93;:::i;:::-;37587:2;37582:3;37578:12;37571:19;;37230:366;;;:::o;37602:419::-;37768:4;37806:2;37795:9;37791:18;37783:26;;37855:9;37849:4;37845:20;37841:1;37830:9;37826:17;37819:47;37883:131;38009:4;37883:131;:::i;:::-;37875:139;;37602:419;;;:::o;38027:170::-;38167:22;38163:1;38155:6;38151:14;38144:46;38027:170;:::o;38203:366::-;38345:3;38366:67;38430:2;38425:3;38366:67;:::i;:::-;38359:74;;38442:93;38531:3;38442:93;:::i;:::-;38560:2;38555:3;38551:12;38544:19;;38203:366;;;:::o;38575:419::-;38741:4;38779:2;38768:9;38764:18;38756:26;;38828:9;38822:4;38818:20;38814:1;38803:9;38799:17;38792:47;38856:131;38982:4;38856:131;:::i;:::-;38848:139;;38575:419;;;:::o;39000:172::-;39140:24;39136:1;39128:6;39124:14;39117:48;39000:172;:::o;39178:366::-;39320:3;39341:67;39405:2;39400:3;39341:67;:::i;:::-;39334:74;;39417:93;39506:3;39417:93;:::i;:::-;39535:2;39530:3;39526:12;39519:19;;39178:366;;;:::o;39550:419::-;39716:4;39754:2;39743:9;39739:18;39731:26;;39803:9;39797:4;39793:20;39789:1;39778:9;39774:17;39767:47;39831:131;39957:4;39831:131;:::i;:::-;39823:139;;39550:419;;;:::o;39975:297::-;40115:34;40111:1;40103:6;40099:14;40092:58;40184:34;40179:2;40171:6;40167:15;40160:59;40253:11;40248:2;40240:6;40236:15;40229:36;39975:297;:::o;40278:366::-;40420:3;40441:67;40505:2;40500:3;40441:67;:::i;:::-;40434:74;;40517:93;40606:3;40517:93;:::i;:::-;40635:2;40630:3;40626:12;40619:19;;40278:366;;;:::o;40650:419::-;40816:4;40854:2;40843:9;40839:18;40831:26;;40903:9;40897:4;40893:20;40889:1;40878:9;40874:17;40867:47;40931:131;41057:4;40931:131;:::i;:::-;40923:139;;40650:419;;;:::o;41075:240::-;41215:34;41211:1;41203:6;41199:14;41192:58;41284:23;41279:2;41271:6;41267:15;41260:48;41075:240;:::o;41321:366::-;41463:3;41484:67;41548:2;41543:3;41484:67;:::i;:::-;41477:74;;41560:93;41649:3;41560:93;:::i;:::-;41678:2;41673:3;41669:12;41662:19;;41321:366;;;:::o;41693:419::-;41859:4;41897:2;41886:9;41882:18;41874:26;;41946:9;41940:4;41936:20;41932:1;41921:9;41917:17;41910:47;41974:131;42100:4;41974:131;:::i;:::-;41966:139;;41693:419;;;:::o;42118:169::-;42258:21;42254:1;42246:6;42242:14;42235:45;42118:169;:::o;42293:366::-;42435:3;42456:67;42520:2;42515:3;42456:67;:::i;:::-;42449:74;;42532:93;42621:3;42532:93;:::i;:::-;42650:2;42645:3;42641:12;42634:19;;42293:366;;;:::o;42665:419::-;42831:4;42869:2;42858:9;42854:18;42846:26;;42918:9;42912:4;42908:20;42904:1;42893:9;42889:17;42882:47;42946:131;43072:4;42946:131;:::i;:::-;42938:139;;42665:419;;;:::o;43090:241::-;43230:34;43226:1;43218:6;43214:14;43207:58;43299:24;43294:2;43286:6;43282:15;43275:49;43090:241;:::o;43337:366::-;43479:3;43500:67;43564:2;43559:3;43500:67;:::i;:::-;43493:74;;43576:93;43665:3;43576:93;:::i;:::-;43694:2;43689:3;43685:12;43678:19;;43337:366;;;:::o;43709:419::-;43875:4;43913:2;43902:9;43898:18;43890:26;;43962:9;43956:4;43952:20;43948:1;43937:9;43933:17;43926:47;43990:131;44116:4;43990:131;:::i;:::-;43982:139;;43709:419;;;:::o;44134:191::-;44174:4;44194:20;44212:1;44194:20;:::i;:::-;44189:25;;44228:20;44246:1;44228:20;:::i;:::-;44223:25;;44267:1;44264;44261:8;44258:34;;;44272:18;;:::i;:::-;44258:34;44317:1;44314;44310:9;44302:17;;44134:191;;;;:::o;44331:147::-;44432:11;44469:3;44454:18;;44331:147;;;;:::o;44484:114::-;;:::o;44604:398::-;44763:3;44784:83;44865:1;44860:3;44784:83;:::i;:::-;44777:90;;44876:93;44965:3;44876:93;:::i;:::-;44994:1;44989:3;44985:11;44978:18;;44604:398;;;:::o;45008:379::-;45192:3;45214:147;45357:3;45214:147;:::i;:::-;45207:154;;45378:3;45371:10;;45008:379;;;:::o;45393:225::-;45533:34;45529:1;45521:6;45517:14;45510:58;45602:8;45597:2;45589:6;45585:15;45578:33;45393:225;:::o;45624:366::-;45766:3;45787:67;45851:2;45846:3;45787:67;:::i;:::-;45780:74;;45863:93;45952:3;45863:93;:::i;:::-;45981:2;45976:3;45972:12;45965:19;;45624:366;;;:::o;45996:419::-;46162:4;46200:2;46189:9;46185:18;46177:26;;46249:9;46243:4;46239:20;46235:1;46224:9;46220:17;46213:47;46277:131;46403:4;46277:131;:::i;:::-;46269:139;;45996:419;;;:::o;46421:143::-;46478:5;46509:6;46503:13;46494:22;;46525:33;46552:5;46525:33;:::i;:::-;46421:143;;;;:::o;46570:351::-;46640:6;46689:2;46677:9;46668:7;46664:23;46660:32;46657:119;;;46695:79;;:::i;:::-;46657:119;46815:1;46840:64;46896:7;46887:6;46876:9;46872:22;46840:64;:::i;:::-;46830:74;;46786:128;46570:351;;;;:::o;46927:180::-;46975:77;46972:1;46965:88;47072:4;47069:1;47062:15;47096:4;47093:1;47086:15;47113:143;47170:5;47201:6;47195:13;47186:22;;47217:33;47244:5;47217:33;:::i;:::-;47113:143;;;;:::o;47262:351::-;47332:6;47381:2;47369:9;47360:7;47356:23;47352:32;47349:119;;;47387:79;;:::i;:::-;47349:119;47507:1;47532:64;47588:7;47579:6;47568:9;47564:22;47532:64;:::i;:::-;47522:74;;47478:128;47262:351;;;;:::o;47619:85::-;47664:7;47693:5;47682:16;;47619:85;;;:::o;47710:158::-;47768:9;47801:61;47819:42;47828:32;47854:5;47828:32;:::i;:::-;47819:42;:::i;:::-;47801:61;:::i;:::-;47788:74;;47710:158;;;:::o;47874:147::-;47969:45;48008:5;47969:45;:::i;:::-;47964:3;47957:58;47874:147;;:::o;48027:114::-;48094:6;48128:5;48122:12;48112:22;;48027:114;;;:::o;48147:184::-;48246:11;48280:6;48275:3;48268:19;48320:4;48315:3;48311:14;48296:29;;48147:184;;;;:::o;48337:132::-;48404:4;48427:3;48419:11;;48457:4;48452:3;48448:14;48440:22;;48337:132;;;:::o;48475:108::-;48552:24;48570:5;48552:24;:::i;:::-;48547:3;48540:37;48475:108;;:::o;48589:179::-;48658:10;48679:46;48721:3;48713:6;48679:46;:::i;:::-;48757:4;48752:3;48748:14;48734:28;;48589:179;;;;:::o;48774:113::-;48844:4;48876;48871:3;48867:14;48859:22;;48774:113;;;:::o;48923:732::-;49042:3;49071:54;49119:5;49071:54;:::i;:::-;49141:86;49220:6;49215:3;49141:86;:::i;:::-;49134:93;;49251:56;49301:5;49251:56;:::i;:::-;49330:7;49361:1;49346:284;49371:6;49368:1;49365:13;49346:284;;;49447:6;49441:13;49474:63;49533:3;49518:13;49474:63;:::i;:::-;49467:70;;49560:60;49613:6;49560:60;:::i;:::-;49550:70;;49406:224;49393:1;49390;49386:9;49381:14;;49346:284;;;49350:14;49646:3;49639:10;;49047:608;;;48923:732;;;;:::o;49661:831::-;49924:4;49962:3;49951:9;49947:19;49939:27;;49976:71;50044:1;50033:9;50029:17;50020:6;49976:71;:::i;:::-;50057:80;50133:2;50122:9;50118:18;50109:6;50057:80;:::i;:::-;50184:9;50178:4;50174:20;50169:2;50158:9;50154:18;50147:48;50212:108;50315:4;50306:6;50212:108;:::i;:::-;50204:116;;50330:72;50398:2;50387:9;50383:18;50374:6;50330:72;:::i;:::-;50412:73;50480:3;50469:9;50465:19;50456:6;50412:73;:::i;:::-;49661:831;;;;;;;;:::o

Swarm Source

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