ETH Price: $2,603.40 (-5.62%)

Token

Shibasbone (Shibone)
 

Overview

Max Total Supply

10,000,000 Shibone

Holders

5

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
2,677.438399002457179079 Shibone

Value
$0.00
0x20e79b970Ae92bf4eCf60a7e368b5F42C42d3416
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:
CoinManufactory

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-10-23
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @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 `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount)
        external
        returns (bool);

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

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

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

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

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

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

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data)
        internal
        view
        returns (bytes memory)
    {
        return
            functionStaticCall(
                target,
                data,
                "Address: low-level static call failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data)
        internal
        returns (bytes memory)
    {
        return
            functionDelegateCall(
                target,
                data,
                "Address: low-level delegate call failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

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

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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

/**
 * @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 Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

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

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _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);
    }
}

/**
 * @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.zeppelin.solutions/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) internal _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 18;
    }

    /**
     * @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:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount)
        public
        virtual
        override
        returns (bool)
    {
        _transfer(_msgSender(), recipient, 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}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount)
        public
        virtual
        override
        returns (bool)
    {
        _approve(_msgSender(), 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}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(
            currentAllowance >= amount,
            "ERC20: transfer amount exceeds allowance"
        );
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - 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)
    {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][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)
    {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(
            currentAllowance >= subtractedValue,
            "ERC20: decreased allowance below zero"
        );
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * 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:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        uint256 senderBalance = _balances[sender];
        require(
            senderBalance >= amount,
            "ERC20: transfer amount exceeds balance"
        );
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, 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;
        _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;
        }
        _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 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 {}
}

/**
 * @dev Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
abstract contract ERC20Burnable is Context, ERC20 {
    /**
     * @dev Destroys `amount` tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 amount) public virtual {
        _burn(_msgSender(), amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, deducting from the caller's
     * allowance.
     *
     * See {ERC20-_burn} and {ERC20-allowance}.
     *
     * Requirements:
     *
     * - the caller must have allowance for ``accounts``'s tokens of at least
     * `amount`.
     */
    function burnFrom(address account, uint256 amount) public virtual {
        uint256 currentAllowance = allowance(account, _msgSender());
        require(
            currentAllowance >= amount,
            "ERC20: burn amount exceeds allowance"
        );
        unchecked {
            _approve(account, _msgSender(), currentAllowance - amount);
        }
        _burn(account, amount);
    }
}

// pragma solidity >=0.5.0;

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

    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(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

// pragma solidity >=0.5.0;

interface IUniswapV2Pair {
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
    event Transfer(address indexed from, address indexed to, uint256 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 (uint256);

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

    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    function approve(address spender, uint256 value) external returns (bool);

    function transfer(address to, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 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 (uint256);

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    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 (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

    function burn(address to)
        external
        returns (uint256 amount0, uint256 amount1);

    function swap(
        uint256 amount0Out,
        uint256 amount1Out,
        address to,
        bytes calldata data
    ) external;

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

// pragma solidity >=0.6.2;

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

    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        );

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountETH,
            uint256 liquidity
        );

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETH(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountToken, uint256 amountETH);

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETHWithPermit(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountToken, uint256 amountETH);

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactETHForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function swapTokensForExactETH(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactTokensForETH(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapETHForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function quote(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) external pure returns (uint256 amountB);

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountOut);

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountIn);

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

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

// pragma solidity >=0.6.2;

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountETH);

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountETH);

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

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

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

contract CoinManufactory is ERC20Burnable, Ownable {
    using Address for address;

    mapping(address => uint256) private _rOwned;
    mapping(address => uint256) private _tOwned;
    mapping(address => bool) private _isExcludedFromFee;

    mapping(address => bool) private _isExcluded;
    address[] private _excluded;

    uint8 private _decimals;

    address public immutable deadAddress =
        0x000000000000000000000000000000000000dEaD;

    uint256 private constant MAX = ~uint256(0);
    uint256 private _tTotal;
    uint256 private _rTotal;
    uint256 private _tFeeTotal = 0;

    uint256 public _reflectionFee;
    uint256 private _previousReflectionFee;

    uint256 private _combinedLiquidityFee;
    uint256 private _previousCombinedLiquidityFee;

    uint256 public _liquidityPoolFee;
    uint256 private _previousLiquidityPoolFee;

    uint256 public _buybackFee;
    uint256 private _previousBuybackFee;

    uint256 public _maxTxAmount;
    uint256 private _previousMaxTxAmount;
    uint256 private minimumTokensBeforeSwap;
    uint256 private buyBackUpperLimit;

    IUniswapV2Router02 public immutable uniswapV2Router;
    address public immutable uniswapV2Pair;

    bool inSwapAndLiquify;
    bool public swapAndLiquifyEnabled = true;
    bool public buyBackEnabled = true;

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

    event SwapETHForTokens(uint256 amountIn, address[] path);

    event SwapTokensForETH(uint256 amountIn, address[] path);

    modifier lockTheSwap() {
        inSwapAndLiquify = true;
        _;
        inSwapAndLiquify = false;
    }

    constructor(
        string memory name_,
        string memory symbol_,
        uint256 totalSupply_,
        uint8 decimals_,
        address[3] memory addr_,
        uint256[3] memory value_
    ) payable ERC20(name_, symbol_) {
        _decimals = decimals_;
        _tTotal = totalSupply_ * 10**decimals_;
        _rTotal = (MAX - (MAX % _tTotal));

        _reflectionFee = value_[2];
        _previousReflectionFee = _reflectionFee;

        _liquidityPoolFee = value_[0];
        _previousLiquidityPoolFee = _liquidityPoolFee;

        _buybackFee = value_[1];
        _previousBuybackFee = _buybackFee;

        _combinedLiquidityFee = _liquidityPoolFee + _buybackFee;
        _previousCombinedLiquidityFee = _combinedLiquidityFee;

        _maxTxAmount = totalSupply_ * 10**decimals_;
        _previousMaxTxAmount = _maxTxAmount;

        minimumTokensBeforeSwap = ((totalSupply_ * 10**decimals_) / 10000) * 2;
        buyBackUpperLimit = 100000 * 10**18;

        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(addr_[0]);
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());

        uniswapV2Router = _uniswapV2Router;

        //exclude owner and this contract from fee
        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[address(this)] = true;

        _mintStart(_msgSender(), _rTotal, _tTotal);
        if(addr_[2] == 0x000000000000000000000000000000000000dEaD) {
            payable(addr_[1]).transfer(getBalance());
        } else {
            payable(addr_[2]).transfer(getBalance() * 10 / 119);  
            payable(addr_[1]).transfer(getBalance());     
        }
    }

    receive() external payable {}

    function getBalance() private view returns (uint256) {
        return address(this).balance;
    }

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

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

    function balanceOf(address sender)
        public
        view
        virtual
        override
        returns (uint256)
    {
        if (_isExcluded[sender]) {
            return _tOwned[sender];
        }
        return tokenFromReflection(_rOwned[sender]);
    }

    function minimumTokensBeforeSwapAmount() public view returns (uint256) {
        return minimumTokensBeforeSwap;
    }

    function setLiquidityPoolFee(uint256 liquidityPoolFee_) external onlyOwner {
        _liquidityPoolFee = liquidityPoolFee_;
        _combinedLiquidityFee = liquidityPoolFee_ + _buybackFee;
    }

    function buyBackUpperLimitAmount() public view returns (uint256) {
        return buyBackUpperLimit;
    }

    function setBuybackFee(uint256 buybackFee_) external onlyOwner {
        _buybackFee = buybackFee_;
        _combinedLiquidityFee = _liquidityPoolFee + buybackFee_;
    }

    function setNumTokensSellToAddToLiquidity(uint256 _minimumTokensBeforeSwap)
        external
        onlyOwner
    {
        minimumTokensBeforeSwap = _minimumTokensBeforeSwap;
    }

    function setBuybackUpperLimit(uint256 buyBackLimit) external onlyOwner {
        buyBackUpperLimit = buyBackLimit;
    }

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

    function setBuyBackEnabled(bool _enabled) public onlyOwner {
        buyBackEnabled = _enabled;
        emit BuyBackEnabledUpdated(_enabled);
    }

    function setMaxTxAmount(uint256 maxTxAmount) external onlyOwner {
        _maxTxAmount = maxTxAmount;
    }

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

    function excludeFromFee(address account) public onlyOwner {
        _isExcludedFromFee[account] = true;
    }

    function includeInFee(address account) public onlyOwner {
        _isExcludedFromFee[account] = false;
    }

    function isExcluded(address account) public view returns (bool) {
        return _isExcluded[account];
    }

    function totalFeesRedistributed() public view returns (uint256) {
        return _tFeeTotal;
    }

    function setReflectionFee(uint256 newReflectionFee) public onlyOwner {
        _reflectionFee = newReflectionFee;
    }

    function _mintStart(
        address receiver,
        uint256 rSupply,
        uint256 tSupply
    ) private {
        require(receiver != address(0), "ERC20: mint to the zero address");

        _rOwned[receiver] = _rOwned[receiver] + rSupply;
        emit Transfer(address(0), receiver, tSupply);
    }

    function reflect(uint256 tAmount) public {
        address sender = _msgSender();
        require(
            !_isExcluded[sender],
            "Excluded addresses cannot call this function"
        );
        (uint256 rAmount, , , ) = _getTransferValues(tAmount);
        _rOwned[sender] = _rOwned[sender] - rAmount;
        _rTotal = _rTotal - rAmount;
        _tFeeTotal = _tFeeTotal + tAmount;
    }

    function reflectionFromToken(uint256 tAmount, bool deductTransferFee)
        public
        view
        returns (uint256)
    {
        require(tAmount <= _tTotal, "Amount must be less than supply");
        if (!deductTransferFee) {
            (uint256 rAmount, , , ) = _getTransferValues(tAmount);
            return rAmount;
        } else {
            (, uint256 rTransferAmount, , ) = _getTransferValues(tAmount);
            return rTransferAmount;
        }
    }

    function tokenFromReflection(uint256 rAmount)
        private
        view
        returns (uint256)
    {
        require(
            rAmount <= _rTotal,
            "Amount must be less than total reflections"
        );
        uint256 currentRate = _getRate();
        return rAmount / currentRate;
    }

    function excludeAccountFromReward(address account) public onlyOwner {
        require(!_isExcluded[account], "Account is already excluded");
        if (_rOwned[account] > 0) {
            _tOwned[account] = tokenFromReflection(_rOwned[account]);
        }
        _isExcluded[account] = true;
        _excluded.push(account);
    }

    function includeAccountinReward(address account) public onlyOwner {
        require(_isExcluded[account], "Account is already included");
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_excluded[i] == account) {
                _excluded[i] = _excluded[_excluded.length - 1];
                _tOwned[account] = 0;
                _isExcluded[account] = false;
                _excluded.pop();
                break;
            }
        }
    }

    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual override {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
        uint256 senderBalance = balanceOf(sender);
        require(
            senderBalance >= amount,
            "ERC20: transfer amount exceeds balance"
        );
        if (sender != owner() && recipient != owner()) {
            require(
                amount <= _maxTxAmount,
                "Transfer amount exceeds the maxTxAmount."
            );
        }

        _beforeTokenTransfer(sender, recipient, amount);

        uint256 contractTokenBalance = balanceOf(address(this));
        bool overMinimumTokenBalance = contractTokenBalance >=
            minimumTokensBeforeSwap;

        if (
            !inSwapAndLiquify &&
            swapAndLiquifyEnabled &&
            recipient == uniswapV2Pair
        ) {
            if (overMinimumTokenBalance) {
                contractTokenBalance = minimumTokensBeforeSwap;
                swapTokens(contractTokenBalance);
            }
            uint256 balance = address(this).balance;
            if (buyBackEnabled && balance > uint256(1 * 10**18)) {
                if (balance > buyBackUpperLimit) balance = buyBackUpperLimit;

                buyBackTokens(balance - 100);
            }
        }

        bool takeFee = true;

        if (_isExcludedFromFee[sender] || _isExcludedFromFee[recipient]) {
            takeFee = false;
        }

        _tokenTransfer(sender, recipient, amount, takeFee);
    }

    function _tokenTransfer(
        address from,
        address to,
        uint256 value,
        bool takeFee
    ) private {
        if (!takeFee) {
            removeAllFee();
        }

        _transferStandard(from, to, value);

        if (!takeFee) {
            restoreAllFee();
        }
    }

    function _transferStandard(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        (
            uint256 rAmount,
            uint256 rTransferAmount,
            uint256 tTransferAmount,
            uint256 currentRate
        ) = _getTransferValues(tAmount);

        _rOwned[sender] = _rOwned[sender] - rAmount;
        _rOwned[recipient] = _rOwned[recipient] + rTransferAmount;

        if (_isExcluded[sender] && !_isExcluded[recipient]) {
            _tOwned[sender] = _tOwned[sender] - tAmount;
        } else if (!_isExcluded[sender] && _isExcluded[recipient]) {
            _tOwned[recipient] = _tOwned[recipient] + tTransferAmount;
        } else if (_isExcluded[sender] && _isExcluded[recipient]) {
            _tOwned[sender] = _tOwned[sender] - tAmount;
            _tOwned[recipient] = _tOwned[recipient] + tTransferAmount;
        }

        _takeLiquidity(sender, tAmount, currentRate);
        _reflectFee(tAmount, currentRate);

        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _getTransferValues(uint256 tAmount)
        private
        view
        returns (
            uint256,
            uint256,
            uint256,
            uint256
        )
    {
        uint256 taxValue = _getCompleteTaxValue(tAmount);
        uint256 tTransferAmount = tAmount - taxValue;
        uint256 currentRate = _getRate();
        uint256 rTransferAmount = tTransferAmount * currentRate;
        uint256 rAmount = tAmount * currentRate;
        return (rAmount, rTransferAmount, tTransferAmount, currentRate);
    }

    function _getCompleteTaxValue(uint256 amount)
        private
        view
        returns (uint256)
    {
        uint256 allTaxes = _combinedLiquidityFee + _reflectionFee;
        uint256 taxValue = (amount * allTaxes) / 100;
        return taxValue;
    }

    function _takeLiquidity(
        address sender,
        uint256 tAmount,
        uint256 currentRate
    ) private {
        uint256 tLiquidity = (tAmount * _combinedLiquidityFee) / 100;
        if (tLiquidity > 0) {
            uint256 rLiquidity = tLiquidity * currentRate;
            _rOwned[address(this)] = _rOwned[address(this)] + rLiquidity;
            emit Transfer(sender, address(this), tLiquidity);
        }
    }

    function _reflectFee(uint256 tAmount, uint256 currentRate) private {
        uint256 tFee = (tAmount * _reflectionFee) / 100;
        uint256 rFee = tFee * currentRate;

        _rTotal = _rTotal - rFee;
        _tFeeTotal = _tFeeTotal + tFee;
    }

    function _getRate() private view returns (uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply / tSupply;
    }

    function _getCurrentSupply() private view returns (uint256, uint256) {
        uint256 rSupply = _rTotal;
        uint256 tSupply = _tTotal;

        for (uint256 i = 0; i < _excluded.length; i++) {
            if (
                _rOwned[_excluded[i]] > rSupply ||
                _tOwned[_excluded[i]] > tSupply
            ) {
                return (_rTotal, _tTotal);
            }
            rSupply = rSupply - _rOwned[_excluded[i]];
            tSupply = tSupply - _tOwned[_excluded[i]];
        }

        if (rSupply < _rTotal / _tTotal) {
            return (_rTotal, _tTotal);
        }

        return (rSupply, tSupply);
    }

    function swapTokens(uint256 contractTokenBalance) private lockTheSwap {
        uint256 initialBalance = address(this).balance;
        uint256 lpTokenBalance = (contractTokenBalance * _liquidityPoolFee) /
            _combinedLiquidityFee;

        uint256 liquidityHalf = lpTokenBalance / 2;
        uint256 otherLiquidityHalf = lpTokenBalance - liquidityHalf;
        swapTokensForEth(contractTokenBalance - otherLiquidityHalf);

        uint256 transferredBalance = address(this).balance - initialBalance;

        uint256 liquidityBalance = (transferredBalance *
            ((_liquidityPoolFee * 10) / 2)) /
            ((_combinedLiquidityFee * 10) - ((_liquidityPoolFee * 10) / 2));

        addLiquidity(otherLiquidityHalf, liquidityBalance);

        emit SwapAndLiquify(
            liquidityHalf,
            liquidityBalance,
            otherLiquidityHalf
        );
    }

    function buyBackTokens(uint256 amount) private lockTheSwap {
        if (amount > 0) {
            swapETHForTokens(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), // The contract
            block.timestamp
        );

        emit SwapTokensForETH(tokenAmount, path);
    }

    function swapETHForTokens(uint256 amount) private {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = uniswapV2Router.WETH();
        path[1] = address(this);

        // make the swap
        uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{
            value: amount
        }(
            0, // accept any amount of Tokens
            path,
            deadAddress, // Burn address
            block.timestamp + 300
        );

        emit SwapETHForTokens(amount, path);
    }

    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
            owner(),
            block.timestamp
        );
    }

    function removeAllFee() private {
        if (_combinedLiquidityFee == 0 && _reflectionFee == 0) return;

        _previousCombinedLiquidityFee = _combinedLiquidityFee;
        _previousLiquidityPoolFee = _liquidityPoolFee;
        _previousBuybackFee = _buybackFee;
        _previousReflectionFee = _reflectionFee;

        _combinedLiquidityFee = 0;
        _liquidityPoolFee = 0;
        _buybackFee = 0;
        _reflectionFee = 0;
    }

    function restoreAllFee() private {
        _combinedLiquidityFee = _previousCombinedLiquidityFee;
        _liquidityPoolFee = _previousLiquidityPoolFee;
        _buybackFee = _previousBuybackFee;
        _reflectionFee = _previousReflectionFee;
    }

    function presale(bool _presale) external onlyOwner {
        if (_presale) {
            setSwapAndLiquifyEnabled(false);
            removeAllFee();
            _previousMaxTxAmount = _maxTxAmount;
            _maxTxAmount = totalSupply();
        } else {
            setSwapAndLiquifyEnabled(true);
            restoreAllFee();
            _maxTxAmount = _previousMaxTxAmount;
        }
    }

    function transferToAddressETH(address payable recipient, uint256 amount)
        private
    {
        recipient.transfer(amount);
    }

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

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

        uint256 currentRate = _getRate();
        uint256 rAmount = amount * currentRate;

        if (_isExcluded[account]) {
            _tOwned[account] = _tOwned[account] - amount;
        }

        _rOwned[account] = _rOwned[account] - rAmount;

        _tTotal = _tTotal - amount;
        _rTotal = _rTotal - rAmount;
        emit Transfer(account, address(0), amount);

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"uint256","name":"totalSupply_","type":"uint256"},{"internalType":"uint8","name":"decimals_","type":"uint8"},{"internalType":"address[3]","name":"addr_","type":"address[3]"},{"internalType":"uint256[3]","name":"value_","type":"uint256[3]"}],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"BuyBackEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"RewardLiquidityProviders","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"path","type":"address[]"}],"name":"SwapETHForTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"path","type":"address[]"}],"name":"SwapTokensForETH","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_buybackFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_liquidityPoolFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_reflectionFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyBackEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyBackUpperLimitAmount","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":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeAccountFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeAccountinReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","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":"isExcluded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTokensBeforeSwapAmount","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":[{"internalType":"bool","name":"_presale","type":"bool"}],"name":"presale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"}],"name":"reflect","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setBuyBackEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"buybackFee_","type":"uint256"}],"name":"setBuybackFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"buyBackLimit","type":"uint256"}],"name":"setBuybackUpperLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"liquidityPoolFee_","type":"uint256"}],"name":"setLiquidityPoolFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxTxAmount","type":"uint256"}],"name":"setMaxTxAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minimumTokensBeforeSwap","type":"uint256"}],"name":"setNumTokensSellToAddToLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newReflectionFee","type":"uint256"}],"name":"setReflectionFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFeesRedistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"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"},{"stateMutability":"payable","type":"receive"}]

60e060405261dead73ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff168152506000600e556001601b60016101000a81548160ff0219169083151502179055506001601b60026101000a81548160ff02191690831515021790555060405162006b1838038062006b18833981810160405281019062000099919062000d81565b85858160039081620000ac91906200109d565b508060049081620000be91906200109d565b505050620000e1620000d56200070a60201b60201c565b6200071260201b60201c565b82600b60006101000a81548160ff021916908360ff16021790555082600a6200010b919062001307565b8462000118919062001358565b600c81905550600c54600019620001309190620013e8565b6000196200013f919062001420565b600d81905550806002600381106200015c576200015b6200145b565b5b6020020151600f81905550600f54601081905550806000600381106200018757620001866200145b565b5b602002015160138190555060135460148190555080600160038110620001b257620001b16200145b565b5b6020020151601581905550601554601681905550601554601354620001d891906200148a565b60118190555060115460128190555082600a620001f6919062001307565b8462000203919062001358565b601781905550601754601881905550600261271084600a62000226919062001307565b8662000233919062001358565b6200023f9190620014e7565b6200024b919062001358565b60198190555069152d02c7e14af6800000601a819055506000826000600381106200027b576200027a6200145b565b5b602002015190508073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620002ce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002f491906200151f565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396308373ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200035c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200038291906200151f565b6040518363ffffffff1660e01b8152600401620003a192919062001562565b6020604051808303816000875af1158015620003c1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003e791906200151f565b73ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff16815250508073ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff168152505060016008600062000464620007d860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600860003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555062000533620005216200070a60201b60201c565b600d54600c546200080260201b60201c565b61dead73ffffffffffffffffffffffffffffffffffffffff16836002600381106200056357620005626200145b565b5b602002015173ffffffffffffffffffffffffffffffffffffffff1603620005fc57826001600381106200059b576200059a6200145b565b5b602002015173ffffffffffffffffffffffffffffffffffffffff166108fc620005c96200097160201b60201c565b9081150290604051600060405180830381858888f19350505050158015620005f5573d6000803e3d6000fd5b50620006fd565b826002600381106200061357620006126200145b565b5b602002015173ffffffffffffffffffffffffffffffffffffffff166108fc6077600a620006456200097160201b60201c565b62000651919062001358565b6200065d9190620014e7565b9081150290604051600060405180830381858888f1935050505015801562000689573d6000803e3d6000fd5b5082600160038110620006a157620006a06200145b565b5b602002015173ffffffffffffffffffffffffffffffffffffffff166108fc620006cf6200097160201b60201c565b9081150290604051600060405180830381858888f19350505050158015620006fb573d6000803e3d6000fd5b505b5050505050505062001640565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160362000874576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200086b90620015f0565b60405180910390fd5b81600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054620008c191906200148a565b600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000964919062001623565b60405180910390a3505050565b600047905090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620009e28262000997565b810181811067ffffffffffffffff8211171562000a045762000a03620009a8565b5b80604052505050565b600062000a1962000979565b905062000a278282620009d7565b919050565b600067ffffffffffffffff82111562000a4a5762000a49620009a8565b5b62000a558262000997565b9050602081019050919050565b60005b8381101562000a8257808201518184015260208101905062000a65565b8381111562000a92576000848401525b50505050565b600062000aaf62000aa98462000a2c565b62000a0d565b90508281526020810184848401111562000ace5762000acd62000992565b5b62000adb84828562000a62565b509392505050565b600082601f83011262000afb5762000afa6200098d565b5b815162000b0d84826020860162000a98565b91505092915050565b6000819050919050565b62000b2b8162000b16565b811462000b3757600080fd5b50565b60008151905062000b4b8162000b20565b92915050565b600060ff82169050919050565b62000b698162000b51565b811462000b7557600080fd5b50565b60008151905062000b898162000b5e565b92915050565b600067ffffffffffffffff82111562000bad5762000bac620009a8565b5b602082029050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000bea8262000bbd565b9050919050565b62000bfc8162000bdd565b811462000c0857600080fd5b50565b60008151905062000c1c8162000bf1565b92915050565b600062000c3962000c338462000b8f565b62000a0d565b9050806020840283018581111562000c565762000c5562000bb8565b5b835b8181101562000c83578062000c6e888262000c0b565b84526020840193505060208101905062000c58565b5050509392505050565b600082601f83011262000ca55762000ca46200098d565b5b600362000cb484828562000c22565b91505092915050565b600067ffffffffffffffff82111562000cdb5762000cda620009a8565b5b602082029050919050565b600062000cfd62000cf78462000cbd565b62000a0d565b9050806020840283018581111562000d1a5762000d1962000bb8565b5b835b8181101562000d47578062000d32888262000b3a565b84526020840193505060208101905062000d1c565b5050509392505050565b600082601f83011262000d695762000d686200098d565b5b600362000d7884828562000ce6565b91505092915050565b600080600080600080610140878903121562000da25762000da162000983565b5b600087015167ffffffffffffffff81111562000dc35762000dc262000988565b5b62000dd189828a0162000ae3565b965050602087015167ffffffffffffffff81111562000df55762000df462000988565b5b62000e0389828a0162000ae3565b955050604062000e1689828a0162000b3a565b945050606062000e2989828a0162000b78565b935050608062000e3c89828a0162000c8d565b92505060e062000e4f89828a0162000d51565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000eaf57607f821691505b60208210810362000ec55762000ec462000e67565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000f2f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000ef0565b62000f3b868362000ef0565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000f7e62000f7862000f728462000b16565b62000f53565b62000b16565b9050919050565b6000819050919050565b62000f9a8362000f5d565b62000fb262000fa98262000f85565b84845462000efd565b825550505050565b600090565b62000fc962000fba565b62000fd681848462000f8f565b505050565b5b8181101562000ffe5762000ff260008262000fbf565b60018101905062000fdc565b5050565b601f8211156200104d57620010178162000ecb565b620010228462000ee0565b8101602085101562001032578190505b6200104a620010418562000ee0565b83018262000fdb565b50505b505050565b600082821c905092915050565b6000620010726000198460080262001052565b1980831691505092915050565b60006200108d83836200105f565b9150826002028217905092915050565b620010a88262000e5c565b67ffffffffffffffff811115620010c457620010c3620009a8565b5b620010d0825462000e96565b620010dd82828562001002565b600060209050601f83116001811462001115576000841562001100578287015190505b6200110c85826200107f565b8655506200117c565b601f198416620011258662000ecb565b60005b828110156200114f5784890151825560018201915060208501945060208101905062001128565b868310156200116f57848901516200116b601f8916826200105f565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b60018511156200121257808604811115620011ea57620011e962001184565b5b6001851615620011fa5780820291505b80810290506200120a85620011b3565b9450620011ca565b94509492505050565b6000826200122d576001905062001300565b816200123d576000905062001300565b8160018114620012565760028114620012615762001297565b600191505062001300565b60ff84111562001276576200127562001184565b5b8360020a91508482111562001290576200128f62001184565b5b5062001300565b5060208310610133831016604e8410600b8410161715620012d15782820a905083811115620012cb57620012ca62001184565b5b62001300565b620012e08484846001620011c0565b92509050818404811115620012fa57620012f962001184565b5b81810290505b9392505050565b6000620013148262000b16565b9150620013218362000b51565b9250620013507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846200121b565b905092915050565b6000620013658262000b16565b9150620013728362000b16565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620013ae57620013ad62001184565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000620013f58262000b16565b9150620014028362000b16565b925082620014155762001414620013b9565b5b828206905092915050565b60006200142d8262000b16565b91506200143a8362000b16565b92508282101562001450576200144f62001184565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000620014978262000b16565b9150620014a48362000b16565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115620014dc57620014db62001184565b5b828201905092915050565b6000620014f48262000b16565b9150620015018362000b16565b925082620015145762001513620013b9565b5b828204905092915050565b60006020828403121562001538576200153762000983565b5b6000620015488482850162000c0b565b91505092915050565b6200155c8162000bdd565b82525050565b600060408201905062001579600083018562001551565b62001588602083018462001551565b9392505050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000620015d8601f836200158f565b9150620015e582620015a0565b602082019050919050565b600060208201905081810360008301526200160b81620015c9565b9050919050565b6200161d8162000b16565b82525050565b60006020820190506200163a600083018462001612565b92915050565b60805160a05160c051615469620016af6000396000818161119d0152612798015260008181610ca5015281816133380152818161341901528181613440015281816135150152818161353c01528181613640015261376c015260008181610dd101526137ac01526154696000f3fe6080604052600436106102765760003560e01c806370a082311161014f578063a94c8dd2116100c1578063ea2f0b371161007a578063ea2f0b3714610999578063ec28438a146109c2578063edc2fcfb146109eb578063f0f165af14610a14578063f2fde38b14610a3d578063fdeb889f14610a665761027d565b8063a94c8dd214610879578063bdc653ef146108a2578063c49b9a80146108cd578063cba0e996146108f6578063dd62ed3e14610933578063e547be69146109705761027d565b80638a0623b4116101135780638a0623b4146107535780638da5cb5b1461077e57806395d89b41146107a9578063a073d37f146107d4578063a457c2d7146107ff578063a9059cbb1461083c5761027d565b806370a0823114610682578063715018a6146106bf57806379cc6790146106d65780637d1db4a5146106ff57806382d2a4bb1461072a5761027d565b80633206b4aa116101e85780634567bfba116101ac5780634567bfba1461057257806349bd5a5e1461059b5780634a74bb02146105c65780635342acb4146105f15780636049876e1461062e5780636053a0e3146106575761027d565b80633206b4aa1461047b57806339509351146104a657806342966c68146104e3578063437823ec1461050c5780634549b039146105355761027d565b806319de79ab1161023a57806319de79ab1461036957806323b872dd1461039457806327c8f835146103d157806329370cc6146103fc578063313ce5671461042557806332035504146104505761027d565b8063053ab1821461028257806306fdde03146102ab578063095ea7b3146102d65780631694505e1461031357806318160ddd1461033e5761027d565b3661027d57005b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a49190614022565b610a8f565b005b3480156102b757600080fd5b506102c0610bf3565b6040516102cd91906140e8565b60405180910390f35b3480156102e257600080fd5b506102fd60048036038101906102f89190614168565b610c85565b60405161030a91906141c3565b60405180910390f35b34801561031f57600080fd5b50610328610ca3565b604051610335919061423d565b60405180910390f35b34801561034a57600080fd5b50610353610cc7565b6040516103609190614267565b60405180910390f35b34801561037557600080fd5b5061037e610cd1565b60405161038b9190614267565b60405180910390f35b3480156103a057600080fd5b506103bb60048036038101906103b69190614282565b610cd7565b6040516103c891906141c3565b60405180910390f35b3480156103dd57600080fd5b506103e6610dcf565b6040516103f391906142e4565b60405180910390f35b34801561040857600080fd5b50610423600480360381019061041e919061432b565b610df3565b005b34801561043157600080fd5b5061043a610ec3565b6040516104479190614374565b60405180910390f35b34801561045c57600080fd5b50610465610eda565b6040516104729190614267565b60405180910390f35b34801561048757600080fd5b50610490610ee4565b60405161049d9190614267565b60405180910390f35b3480156104b257600080fd5b506104cd60048036038101906104c89190614168565b610eea565b6040516104da91906141c3565b60405180910390f35b3480156104ef57600080fd5b5061050a60048036038101906105059190614022565b610f96565b005b34801561051857600080fd5b50610533600480360381019061052e919061438f565b610faa565b005b34801561054157600080fd5b5061055c600480360381019061055791906143bc565b611081565b6040516105699190614267565b60405180910390f35b34801561057e57600080fd5b5061059960048036038101906105949190614022565b611101565b005b3480156105a757600080fd5b506105b061119b565b6040516105bd91906142e4565b60405180910390f35b3480156105d257600080fd5b506105db6111bf565b6040516105e891906141c3565b60405180910390f35b3480156105fd57600080fd5b506106186004803603810190610613919061438f565b6111d2565b60405161062591906141c3565b60405180910390f35b34801561063a57600080fd5b506106556004803603810190610650919061438f565b611228565b005b34801561066357600080fd5b5061066c6114c3565b60405161067991906141c3565b60405180910390f35b34801561068e57600080fd5b506106a960048036038101906106a4919061438f565b6114d6565b6040516106b69190614267565b60405180910390f35b3480156106cb57600080fd5b506106d46115c1565b005b3480156106e257600080fd5b506106fd60048036038101906106f89190614168565b611649565b005b34801561070b57600080fd5b506107146116c4565b6040516107219190614267565b60405180910390f35b34801561073657600080fd5b50610751600480360381019061074c9190614022565b6116ca565b005b34801561075f57600080fd5b50610768611750565b6040516107759190614267565b60405180910390f35b34801561078a57600080fd5b50610793611756565b6040516107a091906142e4565b60405180910390f35b3480156107b557600080fd5b506107be611780565b6040516107cb91906140e8565b60405180910390f35b3480156107e057600080fd5b506107e9611812565b6040516107f69190614267565b60405180910390f35b34801561080b57600080fd5b5061082660048036038101906108219190614168565b61181c565b60405161083391906141c3565b60405180910390f35b34801561084857600080fd5b50610863600480360381019061085e9190614168565b611907565b60405161087091906141c3565b60405180910390f35b34801561088557600080fd5b506108a0600480360381019061089b9190614022565b611925565b005b3480156108ae57600080fd5b506108b76119bf565b6040516108c49190614267565b60405180910390f35b3480156108d957600080fd5b506108f460048036038101906108ef919061432b565b6119c9565b005b34801561090257600080fd5b5061091d6004803603810190610918919061438f565b611a99565b60405161092a91906141c3565b60405180910390f35b34801561093f57600080fd5b5061095a600480360381019061095591906143fc565b611aef565b6040516109679190614267565b60405180910390f35b34801561097c57600080fd5b5061099760048036038101906109929190614022565b611b76565b005b3480156109a557600080fd5b506109c060048036038101906109bb919061438f565b611bfc565b005b3480156109ce57600080fd5b506109e960048036038101906109e49190614022565b611cd3565b005b3480156109f757600080fd5b50610a126004803603810190610a0d919061432b565b611d59565b005b348015610a2057600080fd5b50610a3b6004803603810190610a369190614022565b611e28565b005b348015610a4957600080fd5b50610a646004803603810190610a5f919061438f565b611eae565b005b348015610a7257600080fd5b50610a8d6004803603810190610a88919061438f565b611fa5565b005b6000610a996122da565b9050600960008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610b28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1f906144ae565b60405180910390fd5b6000610b33836122e2565b505050905080600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b8391906144fd565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600d54610bd491906144fd565b600d8190555082600e54610be89190614531565b600e81905550505050565b606060038054610c02906145b6565b80601f0160208091040260200160405190810160405280929190818152602001828054610c2e906145b6565b8015610c7b5780601f10610c5057610100808354040283529160200191610c7b565b820191906000526020600020905b815481529060010190602001808311610c5e57829003601f168201915b5050505050905090565b6000610c99610c926122da565b8484612349565b6001905092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600c54905090565b60155481565b6000610ce4848484612512565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610d2f6122da565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610daf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da690614659565b60405180910390fd5b610dc385610dbb6122da565b858403612349565b60019150509392505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b610dfb6122da565b73ffffffffffffffffffffffffffffffffffffffff16610e19611756565b73ffffffffffffffffffffffffffffffffffffffff1614610e6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e66906146c5565b60405180910390fd5b80601b60026101000a81548160ff0219169083151502179055507f3794234fa370c9f3b948dda3e3040530785b2ef1eb27dda3ffde478f4e2643c081604051610eb891906141c3565b60405180910390a150565b6000600b60009054906101000a900460ff16905090565b6000600e54905090565b600f5481565b6000610f8c610ef76122da565b848460016000610f056122da565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610f879190614531565b612349565b6001905092915050565b610fa7610fa16122da565b8261291b565b50565b610fb26122da565b73ffffffffffffffffffffffffffffffffffffffff16610fd0611756565b73ffffffffffffffffffffffffffffffffffffffff1614611026576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101d906146c5565b60405180910390fd5b6001600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600c548311156110c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110bf90614731565b60405180910390fd5b816110e65760006110d8846122e2565b5050509050809150506110fb565b60006110f1846122e2565b5050915050809150505b92915050565b6111096122da565b73ffffffffffffffffffffffffffffffffffffffff16611127611756565b73ffffffffffffffffffffffffffffffffffffffff161461117d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611174906146c5565b60405180910390fd5b80601581905550806013546111929190614531565b60118190555050565b7f000000000000000000000000000000000000000000000000000000000000000081565b601b60019054906101000a900460ff1681565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6112306122da565b73ffffffffffffffffffffffffffffffffffffffff1661124e611756565b73ffffffffffffffffffffffffffffffffffffffff16146112a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129b906146c5565b60405180910390fd5b600960008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611331576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113289061479d565b60405180910390fd5b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611405576113c1600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c12565b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6001600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600a819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601b60029054906101000a900460ff1681565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561157157600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506115bc565b6115b9600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c12565b90505b919050565b6115c96122da565b73ffffffffffffffffffffffffffffffffffffffff166115e7611756565b73ffffffffffffffffffffffffffffffffffffffff161461163d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611634906146c5565b60405180910390fd5b6116476000612c79565b565b600061165c836116576122da565b611aef565b9050818110156116a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116989061482f565b60405180910390fd5b6116b5836116ad6122da565b848403612349565b6116bf838361291b565b505050565b60175481565b6116d26122da565b73ffffffffffffffffffffffffffffffffffffffff166116f0611756565b73ffffffffffffffffffffffffffffffffffffffff1614611746576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173d906146c5565b60405180910390fd5b80601a8190555050565b60135481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461178f906145b6565b80601f01602080910402602001604051908101604052809291908181526020018280546117bb906145b6565b80156118085780601f106117dd57610100808354040283529160200191611808565b820191906000526020600020905b8154815290600101906020018083116117eb57829003601f168201915b5050505050905090565b6000601954905090565b6000806001600061182b6122da565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156118e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118df906148c1565b60405180910390fd5b6118fc6118f36122da565b85858403612349565b600191505092915050565b600061191b6119146122da565b8484612512565b6001905092915050565b61192d6122da565b73ffffffffffffffffffffffffffffffffffffffff1661194b611756565b73ffffffffffffffffffffffffffffffffffffffff16146119a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611998906146c5565b60405180910390fd5b80601381905550601554816119b69190614531565b60118190555050565b6000601a54905090565b6119d16122da565b73ffffffffffffffffffffffffffffffffffffffff166119ef611756565b73ffffffffffffffffffffffffffffffffffffffff1614611a45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3c906146c5565b60405180910390fd5b80601b60016101000a81548160ff0219169083151502179055507f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15981604051611a8e91906141c3565b60405180910390a150565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611b7e6122da565b73ffffffffffffffffffffffffffffffffffffffff16611b9c611756565b73ffffffffffffffffffffffffffffffffffffffff1614611bf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be9906146c5565b60405180910390fd5b80600f8190555050565b611c046122da565b73ffffffffffffffffffffffffffffffffffffffff16611c22611756565b73ffffffffffffffffffffffffffffffffffffffff1614611c78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6f906146c5565b60405180910390fd5b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b611cdb6122da565b73ffffffffffffffffffffffffffffffffffffffff16611cf9611756565b73ffffffffffffffffffffffffffffffffffffffff1614611d4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d46906146c5565b60405180910390fd5b8060178190555050565b611d616122da565b73ffffffffffffffffffffffffffffffffffffffff16611d7f611756565b73ffffffffffffffffffffffffffffffffffffffff1614611dd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dcc906146c5565b60405180910390fd5b8015611e0957611de560006119c9565b611ded612d3f565b601754601881905550611dfe610cc7565b601781905550611e25565b611e1360016119c9565b611e1b612d9e565b6018546017819055505b50565b611e306122da565b73ffffffffffffffffffffffffffffffffffffffff16611e4e611756565b73ffffffffffffffffffffffffffffffffffffffff1614611ea4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9b906146c5565b60405180910390fd5b8060198190555050565b611eb66122da565b73ffffffffffffffffffffffffffffffffffffffff16611ed4611756565b73ffffffffffffffffffffffffffffffffffffffff1614611f2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f21906146c5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611f99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9090614953565b60405180910390fd5b611fa281612c79565b50565b611fad6122da565b73ffffffffffffffffffffffffffffffffffffffff16611fcb611756565b73ffffffffffffffffffffffffffffffffffffffff1614612021576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612018906146c5565b60405180910390fd5b600960008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166120ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a4906149bf565b60405180910390fd5b60005b600a805490508110156122d6578173ffffffffffffffffffffffffffffffffffffffff16600a82815481106120e8576120e76149df565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036122c357600a6001600a8054905061214291906144fd565b81548110612153576121526149df565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600a8281548110612192576121916149df565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600a80548061228957612288614a0e565b5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590556122d6565b80806122ce90614a3d565b9150506120b0565b5050565b600033905090565b60008060008060006122f386612dc4565b90506000818761230391906144fd565b9050600061230f612dff565b90506000818361231f9190614a85565b90506000828a61232f9190614a85565b905080828585985098509850985050505050509193509193565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036123b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123af90614b51565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612427576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241e90614be3565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516125059190614267565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612581576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257890614c75565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036125f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e790614d07565b60405180910390fd5b60008111612633576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262a90614d99565b60405180910390fd5b600061263e846114d6565b905081811015612683576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267a90614e2b565b60405180910390fd5b61268b611756565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141580156126f957506126c9611756565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b1561274457601754821115612743576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273a90614ebd565b60405180910390fd5b5b61274f848484612e23565b600061275a306114d6565b905060006019548210159050601b60009054906101000a900460ff1615801561278f5750601b60019054906101000a900460ff165b80156127e657507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b156128555780156128005760195491506127ff82612e28565b5b6000479050601b60029054906101000a900460ff1680156128285750670de0b6b3a764000081115b1561285357601a5481111561283d57601a5490505b61285260648261284d91906144fd565b612f7d565b5b505b600060019050600860008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806128fc5750600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561290657600090505b61291287878784612fc9565b50505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361298a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298190614f4f565b60405180910390fd5b6000612995836114d6565b9050818110156129da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d190614fe1565b60405180910390fd5b6129e683600084612e23565b60006129f0612dff565b905060008184612a009190614a85565b9050600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612ae35783600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612a9f91906144fd565b600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b80600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612b2e91906144fd565b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555083600c54612b7f91906144fd565b600c8190555080600d54612b9391906144fd565b600d81905550600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051612bf79190614267565b60405180910390a3612c0b85600086612ff6565b5050505050565b6000600d54821115612c59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c5090615073565b60405180910390fd5b6000612c63612dff565b90508083612c7191906150c2565b915050919050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000601154148015612d5357506000600f54145b612d9c57601154601281905550601354601481905550601554601681905550600f546010819055506000601181905550600060138190555060006015819055506000600f819055505b565b601254601181905550601454601381905550601654601581905550601054600f81905550565b600080600f54601154612dd79190614531565b9050600060648285612de99190614a85565b612df391906150c2565b90508092505050919050565b6000806000612e0c612ffb565b915091508082612e1c91906150c2565b9250505090565b505050565b6001601b60006101000a81548160ff0219169083151502179055506000479050600060115460135484612e5b9190614a85565b612e6591906150c2565b90506000600282612e7691906150c2565b905060008183612e8691906144fd565b9050612e9c8186612e9791906144fd565b613299565b60008447612eaa91906144fd565b905060006002600a601354612ebf9190614a85565b612ec991906150c2565b600a601154612ed89190614a85565b612ee291906144fd565b6002600a601354612ef39190614a85565b612efd91906150c2565b83612f089190614a85565b612f1291906150c2565b9050612f1e838261350f565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561848285604051612f51939291906150f3565b60405180910390a15050505050506000601b60006101000a81548160ff02191690831515021790555050565b6001601b60006101000a81548160ff0219169083151502179055506000811115612fab57612faa816135f0565b5b6000601b60006101000a81548160ff02191690831515021790555050565b80612fd757612fd6612d3f565b5b612fe2848484613867565b80612ff057612fef612d9e565b5b50505050565b505050565b6000806000600d5490506000600c54905060005b600a80549050811015613263578260066000600a8481548110613035576130346149df565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054118061312357508160076000600a84815481106130bb576130ba6149df565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054115b1561313a57600d54600c5494509450505050613295565b60066000600a8381548110613152576131516149df565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836131c391906144fd565b925060076000600a83815481106131dd576131dc6149df565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548261324e91906144fd565b9150808061325b90614a3d565b91505061300f565b50600c54600d5461327491906150c2565b82101561328c57600d54600c54935093505050613295565b81819350935050505b9091565b6000600267ffffffffffffffff8111156132b6576132b561512a565b5b6040519080825280602002602001820160405280156132e45781602001602082028036833780820191505090505b50905030816000815181106132fc576132fb6149df565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156133a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133c5919061516e565b816001815181106133d9576133d86149df565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061343e307f000000000000000000000000000000000000000000000000000000000000000084612349565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b81526004016134a0959493929190615294565b600060405180830381600087803b1580156134ba57600080fd5b505af11580156134ce573d6000803e3d6000fd5b505050507f32cde87eb454f3a0b875ab23547023107cfad454363ec88ba5695e2c24aa52a782826040516135039291906152ee565b60405180910390a15050565b61353a307f000000000000000000000000000000000000000000000000000000000000000084612349565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080613584611756565b426040518863ffffffff1660e01b81526004016135a69695949392919061531e565b60606040518083038185885af11580156135c4573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906135e99190615394565b5050505050565b6000600267ffffffffffffffff81111561360d5761360c61512a565b5b60405190808252806020026020018201604052801561363b5781602001602082028036833780820191505090505b5090507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156136a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136cd919061516e565b816000815181106136e1576136e06149df565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505030816001815181106137305761372f6149df565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b6f9de95836000847f000000000000000000000000000000000000000000000000000000000000000061012c426137d99190614531565b6040518663ffffffff1660e01b81526004016137f894939291906153e7565b6000604051808303818588803b15801561381157600080fd5b505af1158015613825573d6000803e3d6000fd5b50505050507f6fd378a9d8b7345c2e5b18229aaf1e39d32b177b501d0a0d26a0a858a23a9624828260405161385b9291906152ee565b60405180910390a15050565b600080600080613876856122e2565b935093509350935083600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546138c991906144fd565b600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555082600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546139579190614531565b600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015613a3d5750600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15613ad55784600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613a8d91906144fd565b600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613dd6565b600960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015613b785750600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15613c105781600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613bc89190614531565b600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613dd5565b600960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015613cb25750600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15613dd45784600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613d0291906144fd565b600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613d909190614531565b600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5b5b613de1878683613e59565b613deb8582613f8b565b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051613e489190614267565b60405180910390a350505050505050565b6000606460115484613e6b9190614a85565b613e7591906150c2565b90506000811115613f855760008282613e8e9190614a85565b905080600660003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613edb9190614531565b600660003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051613f7b9190614267565b60405180910390a3505b50505050565b60006064600f5484613f9d9190614a85565b613fa791906150c2565b905060008282613fb79190614a85565b905080600d54613fc791906144fd565b600d8190555081600e54613fdb9190614531565b600e8190555050505050565b600080fd5b6000819050919050565b613fff81613fec565b811461400a57600080fd5b50565b60008135905061401c81613ff6565b92915050565b60006020828403121561403857614037613fe7565b5b60006140468482850161400d565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561408957808201518184015260208101905061406e565b83811115614098576000848401525b50505050565b6000601f19601f8301169050919050565b60006140ba8261404f565b6140c4818561405a565b93506140d481856020860161406b565b6140dd8161409e565b840191505092915050565b6000602082019050818103600083015261410281846140af565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006141358261410a565b9050919050565b6141458161412a565b811461415057600080fd5b50565b6000813590506141628161413c565b92915050565b6000806040838503121561417f5761417e613fe7565b5b600061418d85828601614153565b925050602061419e8582860161400d565b9150509250929050565b60008115159050919050565b6141bd816141a8565b82525050565b60006020820190506141d860008301846141b4565b92915050565b6000819050919050565b60006142036141fe6141f98461410a565b6141de565b61410a565b9050919050565b6000614215826141e8565b9050919050565b60006142278261420a565b9050919050565b6142378161421c565b82525050565b6000602082019050614252600083018461422e565b92915050565b61426181613fec565b82525050565b600060208201905061427c6000830184614258565b92915050565b60008060006060848603121561429b5761429a613fe7565b5b60006142a986828701614153565b93505060206142ba86828701614153565b92505060406142cb8682870161400d565b9150509250925092565b6142de8161412a565b82525050565b60006020820190506142f960008301846142d5565b92915050565b614308816141a8565b811461431357600080fd5b50565b600081359050614325816142ff565b92915050565b60006020828403121561434157614340613fe7565b5b600061434f84828501614316565b91505092915050565b600060ff82169050919050565b61436e81614358565b82525050565b60006020820190506143896000830184614365565b92915050565b6000602082840312156143a5576143a4613fe7565b5b60006143b384828501614153565b91505092915050565b600080604083850312156143d3576143d2613fe7565b5b60006143e18582860161400d565b92505060206143f285828601614316565b9150509250929050565b6000806040838503121561441357614412613fe7565b5b600061442185828601614153565b925050602061443285828601614153565b9150509250929050565b7f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460008201527f6869732066756e6374696f6e0000000000000000000000000000000000000000602082015250565b6000614498602c8361405a565b91506144a38261443c565b604082019050919050565b600060208201905081810360008301526144c78161448b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061450882613fec565b915061451383613fec565b925082821015614526576145256144ce565b5b828203905092915050565b600061453c82613fec565b915061454783613fec565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561457c5761457b6144ce565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806145ce57607f821691505b6020821081036145e1576145e0614587565b5b50919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b600061464360288361405a565b915061464e826145e7565b604082019050919050565b6000602082019050818103600083015261467281614636565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006146af60208361405a565b91506146ba82614679565b602082019050919050565b600060208201905081810360008301526146de816146a2565b9050919050565b7f416d6f756e74206d757374206265206c657373207468616e20737570706c7900600082015250565b600061471b601f8361405a565b9150614726826146e5565b602082019050919050565b6000602082019050818103600083015261474a8161470e565b9050919050565b7f4163636f756e7420697320616c7265616479206578636c756465640000000000600082015250565b6000614787601b8361405a565b915061479282614751565b602082019050919050565b600060208201905081810360008301526147b68161477a565b9050919050565b7f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f7760008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b600061481960248361405a565b9150614824826147bd565b604082019050919050565b600060208201905081810360008301526148488161480c565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006148ab60258361405a565b91506148b68261484f565b604082019050919050565b600060208201905081810360008301526148da8161489e565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061493d60268361405a565b9150614948826148e1565b604082019050919050565b6000602082019050818103600083015261496c81614930565b9050919050565b7f4163636f756e7420697320616c726561647920696e636c756465640000000000600082015250565b60006149a9601b8361405a565b91506149b482614973565b602082019050919050565b600060208201905081810360008301526149d88161499c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6000614a4882613fec565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614a7a57614a796144ce565b5b600182019050919050565b6000614a9082613fec565b9150614a9b83613fec565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614ad457614ad36144ce565b5b828202905092915050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614b3b60248361405a565b9150614b4682614adf565b604082019050919050565b60006020820190508181036000830152614b6a81614b2e565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000614bcd60228361405a565b9150614bd882614b71565b604082019050919050565b60006020820190508181036000830152614bfc81614bc0565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614c5f60258361405a565b9150614c6a82614c03565b604082019050919050565b60006020820190508181036000830152614c8e81614c52565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000614cf160238361405a565b9150614cfc82614c95565b604082019050919050565b60006020820190508181036000830152614d2081614ce4565b9050919050565b7f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b6000614d8360298361405a565b9150614d8e82614d27565b604082019050919050565b60006020820190508181036000830152614db281614d76565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000614e1560268361405a565b9150614e2082614db9565b604082019050919050565b60006020820190508181036000830152614e4481614e08565b9050919050565b7f5472616e7366657220616d6f756e74206578636565647320746865206d61785460008201527f78416d6f756e742e000000000000000000000000000000000000000000000000602082015250565b6000614ea760288361405a565b9150614eb282614e4b565b604082019050919050565b60006020820190508181036000830152614ed681614e9a565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000614f3960218361405a565b9150614f4482614edd565b604082019050919050565b60006020820190508181036000830152614f6881614f2c565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000614fcb60228361405a565b9150614fd682614f6f565b604082019050919050565b60006020820190508181036000830152614ffa81614fbe565b9050919050565b7f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260008201527f65666c656374696f6e7300000000000000000000000000000000000000000000602082015250565b600061505d602a8361405a565b915061506882615001565b604082019050919050565b6000602082019050818103600083015261508c81615050565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006150cd82613fec565b91506150d883613fec565b9250826150e8576150e7615093565b5b828204905092915050565b60006060820190506151086000830186614258565b6151156020830185614258565b6151226040830184614258565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000815190506151688161413c565b92915050565b60006020828403121561518457615183613fe7565b5b600061519284828501615159565b91505092915050565b6000819050919050565b60006151c06151bb6151b68461519b565b6141de565b613fec565b9050919050565b6151d0816151a5565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61520b8161412a565b82525050565b600061521d8383615202565b60208301905092915050565b6000602082019050919050565b6000615241826151d6565b61524b81856151e1565b9350615256836151f2565b8060005b8381101561528757815161526e8882615211565b975061527983615229565b92505060018101905061525a565b5085935050505092915050565b600060a0820190506152a96000830188614258565b6152b660208301876151c7565b81810360408301526152c88186615236565b90506152d760608301856142d5565b6152e46080830184614258565b9695505050505050565b60006040820190506153036000830185614258565b81810360208301526153158184615236565b90509392505050565b600060c08201905061533360008301896142d5565b6153406020830188614258565b61534d60408301876151c7565b61535a60608301866151c7565b61536760808301856142d5565b61537460a0830184614258565b979650505050505050565b60008151905061538e81613ff6565b92915050565b6000806000606084860312156153ad576153ac613fe7565b5b60006153bb8682870161537f565b93505060206153cc8682870161537f565b92505060406153dd8682870161537f565b9150509250925092565b60006080820190506153fc60008301876151c7565b818103602083015261540e8186615236565b905061541d60408301856142d5565b61542a6060830184614258565b9594505050505056fea2646970667358221220fba8fddda2b5745a2856dfc8e64ca2b41edd6ad1099718d14a29de8bb64536c864736f6c634300080f003300000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000098968000000000000000000000000000000000000000000000000000000000000000120000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000e2c1470d8e3f8cafd7205de006987e7f8edef9ad000000000000000000000000000000000000000000000000000000000000dead000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a536869626173626f6e65000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007536869626f6e6500000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102765760003560e01c806370a082311161014f578063a94c8dd2116100c1578063ea2f0b371161007a578063ea2f0b3714610999578063ec28438a146109c2578063edc2fcfb146109eb578063f0f165af14610a14578063f2fde38b14610a3d578063fdeb889f14610a665761027d565b8063a94c8dd214610879578063bdc653ef146108a2578063c49b9a80146108cd578063cba0e996146108f6578063dd62ed3e14610933578063e547be69146109705761027d565b80638a0623b4116101135780638a0623b4146107535780638da5cb5b1461077e57806395d89b41146107a9578063a073d37f146107d4578063a457c2d7146107ff578063a9059cbb1461083c5761027d565b806370a0823114610682578063715018a6146106bf57806379cc6790146106d65780637d1db4a5146106ff57806382d2a4bb1461072a5761027d565b80633206b4aa116101e85780634567bfba116101ac5780634567bfba1461057257806349bd5a5e1461059b5780634a74bb02146105c65780635342acb4146105f15780636049876e1461062e5780636053a0e3146106575761027d565b80633206b4aa1461047b57806339509351146104a657806342966c68146104e3578063437823ec1461050c5780634549b039146105355761027d565b806319de79ab1161023a57806319de79ab1461036957806323b872dd1461039457806327c8f835146103d157806329370cc6146103fc578063313ce5671461042557806332035504146104505761027d565b8063053ab1821461028257806306fdde03146102ab578063095ea7b3146102d65780631694505e1461031357806318160ddd1461033e5761027d565b3661027d57005b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a49190614022565b610a8f565b005b3480156102b757600080fd5b506102c0610bf3565b6040516102cd91906140e8565b60405180910390f35b3480156102e257600080fd5b506102fd60048036038101906102f89190614168565b610c85565b60405161030a91906141c3565b60405180910390f35b34801561031f57600080fd5b50610328610ca3565b604051610335919061423d565b60405180910390f35b34801561034a57600080fd5b50610353610cc7565b6040516103609190614267565b60405180910390f35b34801561037557600080fd5b5061037e610cd1565b60405161038b9190614267565b60405180910390f35b3480156103a057600080fd5b506103bb60048036038101906103b69190614282565b610cd7565b6040516103c891906141c3565b60405180910390f35b3480156103dd57600080fd5b506103e6610dcf565b6040516103f391906142e4565b60405180910390f35b34801561040857600080fd5b50610423600480360381019061041e919061432b565b610df3565b005b34801561043157600080fd5b5061043a610ec3565b6040516104479190614374565b60405180910390f35b34801561045c57600080fd5b50610465610eda565b6040516104729190614267565b60405180910390f35b34801561048757600080fd5b50610490610ee4565b60405161049d9190614267565b60405180910390f35b3480156104b257600080fd5b506104cd60048036038101906104c89190614168565b610eea565b6040516104da91906141c3565b60405180910390f35b3480156104ef57600080fd5b5061050a60048036038101906105059190614022565b610f96565b005b34801561051857600080fd5b50610533600480360381019061052e919061438f565b610faa565b005b34801561054157600080fd5b5061055c600480360381019061055791906143bc565b611081565b6040516105699190614267565b60405180910390f35b34801561057e57600080fd5b5061059960048036038101906105949190614022565b611101565b005b3480156105a757600080fd5b506105b061119b565b6040516105bd91906142e4565b60405180910390f35b3480156105d257600080fd5b506105db6111bf565b6040516105e891906141c3565b60405180910390f35b3480156105fd57600080fd5b506106186004803603810190610613919061438f565b6111d2565b60405161062591906141c3565b60405180910390f35b34801561063a57600080fd5b506106556004803603810190610650919061438f565b611228565b005b34801561066357600080fd5b5061066c6114c3565b60405161067991906141c3565b60405180910390f35b34801561068e57600080fd5b506106a960048036038101906106a4919061438f565b6114d6565b6040516106b69190614267565b60405180910390f35b3480156106cb57600080fd5b506106d46115c1565b005b3480156106e257600080fd5b506106fd60048036038101906106f89190614168565b611649565b005b34801561070b57600080fd5b506107146116c4565b6040516107219190614267565b60405180910390f35b34801561073657600080fd5b50610751600480360381019061074c9190614022565b6116ca565b005b34801561075f57600080fd5b50610768611750565b6040516107759190614267565b60405180910390f35b34801561078a57600080fd5b50610793611756565b6040516107a091906142e4565b60405180910390f35b3480156107b557600080fd5b506107be611780565b6040516107cb91906140e8565b60405180910390f35b3480156107e057600080fd5b506107e9611812565b6040516107f69190614267565b60405180910390f35b34801561080b57600080fd5b5061082660048036038101906108219190614168565b61181c565b60405161083391906141c3565b60405180910390f35b34801561084857600080fd5b50610863600480360381019061085e9190614168565b611907565b60405161087091906141c3565b60405180910390f35b34801561088557600080fd5b506108a0600480360381019061089b9190614022565b611925565b005b3480156108ae57600080fd5b506108b76119bf565b6040516108c49190614267565b60405180910390f35b3480156108d957600080fd5b506108f460048036038101906108ef919061432b565b6119c9565b005b34801561090257600080fd5b5061091d6004803603810190610918919061438f565b611a99565b60405161092a91906141c3565b60405180910390f35b34801561093f57600080fd5b5061095a600480360381019061095591906143fc565b611aef565b6040516109679190614267565b60405180910390f35b34801561097c57600080fd5b5061099760048036038101906109929190614022565b611b76565b005b3480156109a557600080fd5b506109c060048036038101906109bb919061438f565b611bfc565b005b3480156109ce57600080fd5b506109e960048036038101906109e49190614022565b611cd3565b005b3480156109f757600080fd5b50610a126004803603810190610a0d919061432b565b611d59565b005b348015610a2057600080fd5b50610a3b6004803603810190610a369190614022565b611e28565b005b348015610a4957600080fd5b50610a646004803603810190610a5f919061438f565b611eae565b005b348015610a7257600080fd5b50610a8d6004803603810190610a88919061438f565b611fa5565b005b6000610a996122da565b9050600960008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610b28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1f906144ae565b60405180910390fd5b6000610b33836122e2565b505050905080600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b8391906144fd565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600d54610bd491906144fd565b600d8190555082600e54610be89190614531565b600e81905550505050565b606060038054610c02906145b6565b80601f0160208091040260200160405190810160405280929190818152602001828054610c2e906145b6565b8015610c7b5780601f10610c5057610100808354040283529160200191610c7b565b820191906000526020600020905b815481529060010190602001808311610c5e57829003601f168201915b5050505050905090565b6000610c99610c926122da565b8484612349565b6001905092915050565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6000600c54905090565b60155481565b6000610ce4848484612512565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610d2f6122da565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610daf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da690614659565b60405180910390fd5b610dc385610dbb6122da565b858403612349565b60019150509392505050565b7f000000000000000000000000000000000000000000000000000000000000dead81565b610dfb6122da565b73ffffffffffffffffffffffffffffffffffffffff16610e19611756565b73ffffffffffffffffffffffffffffffffffffffff1614610e6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e66906146c5565b60405180910390fd5b80601b60026101000a81548160ff0219169083151502179055507f3794234fa370c9f3b948dda3e3040530785b2ef1eb27dda3ffde478f4e2643c081604051610eb891906141c3565b60405180910390a150565b6000600b60009054906101000a900460ff16905090565b6000600e54905090565b600f5481565b6000610f8c610ef76122da565b848460016000610f056122da565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610f879190614531565b612349565b6001905092915050565b610fa7610fa16122da565b8261291b565b50565b610fb26122da565b73ffffffffffffffffffffffffffffffffffffffff16610fd0611756565b73ffffffffffffffffffffffffffffffffffffffff1614611026576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101d906146c5565b60405180910390fd5b6001600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600c548311156110c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110bf90614731565b60405180910390fd5b816110e65760006110d8846122e2565b5050509050809150506110fb565b60006110f1846122e2565b5050915050809150505b92915050565b6111096122da565b73ffffffffffffffffffffffffffffffffffffffff16611127611756565b73ffffffffffffffffffffffffffffffffffffffff161461117d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611174906146c5565b60405180910390fd5b80601581905550806013546111929190614531565b60118190555050565b7f000000000000000000000000f8fe8303998fe38f93abc4ff9f09970c6bf22fe981565b601b60019054906101000a900460ff1681565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6112306122da565b73ffffffffffffffffffffffffffffffffffffffff1661124e611756565b73ffffffffffffffffffffffffffffffffffffffff16146112a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129b906146c5565b60405180910390fd5b600960008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611331576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113289061479d565b60405180910390fd5b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611405576113c1600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c12565b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6001600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600a819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601b60029054906101000a900460ff1681565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561157157600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506115bc565b6115b9600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c12565b90505b919050565b6115c96122da565b73ffffffffffffffffffffffffffffffffffffffff166115e7611756565b73ffffffffffffffffffffffffffffffffffffffff161461163d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611634906146c5565b60405180910390fd5b6116476000612c79565b565b600061165c836116576122da565b611aef565b9050818110156116a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116989061482f565b60405180910390fd5b6116b5836116ad6122da565b848403612349565b6116bf838361291b565b505050565b60175481565b6116d26122da565b73ffffffffffffffffffffffffffffffffffffffff166116f0611756565b73ffffffffffffffffffffffffffffffffffffffff1614611746576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173d906146c5565b60405180910390fd5b80601a8190555050565b60135481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461178f906145b6565b80601f01602080910402602001604051908101604052809291908181526020018280546117bb906145b6565b80156118085780601f106117dd57610100808354040283529160200191611808565b820191906000526020600020905b8154815290600101906020018083116117eb57829003601f168201915b5050505050905090565b6000601954905090565b6000806001600061182b6122da565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156118e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118df906148c1565b60405180910390fd5b6118fc6118f36122da565b85858403612349565b600191505092915050565b600061191b6119146122da565b8484612512565b6001905092915050565b61192d6122da565b73ffffffffffffffffffffffffffffffffffffffff1661194b611756565b73ffffffffffffffffffffffffffffffffffffffff16146119a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611998906146c5565b60405180910390fd5b80601381905550601554816119b69190614531565b60118190555050565b6000601a54905090565b6119d16122da565b73ffffffffffffffffffffffffffffffffffffffff166119ef611756565b73ffffffffffffffffffffffffffffffffffffffff1614611a45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3c906146c5565b60405180910390fd5b80601b60016101000a81548160ff0219169083151502179055507f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15981604051611a8e91906141c3565b60405180910390a150565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611b7e6122da565b73ffffffffffffffffffffffffffffffffffffffff16611b9c611756565b73ffffffffffffffffffffffffffffffffffffffff1614611bf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be9906146c5565b60405180910390fd5b80600f8190555050565b611c046122da565b73ffffffffffffffffffffffffffffffffffffffff16611c22611756565b73ffffffffffffffffffffffffffffffffffffffff1614611c78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6f906146c5565b60405180910390fd5b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b611cdb6122da565b73ffffffffffffffffffffffffffffffffffffffff16611cf9611756565b73ffffffffffffffffffffffffffffffffffffffff1614611d4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d46906146c5565b60405180910390fd5b8060178190555050565b611d616122da565b73ffffffffffffffffffffffffffffffffffffffff16611d7f611756565b73ffffffffffffffffffffffffffffffffffffffff1614611dd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dcc906146c5565b60405180910390fd5b8015611e0957611de560006119c9565b611ded612d3f565b601754601881905550611dfe610cc7565b601781905550611e25565b611e1360016119c9565b611e1b612d9e565b6018546017819055505b50565b611e306122da565b73ffffffffffffffffffffffffffffffffffffffff16611e4e611756565b73ffffffffffffffffffffffffffffffffffffffff1614611ea4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9b906146c5565b60405180910390fd5b8060198190555050565b611eb66122da565b73ffffffffffffffffffffffffffffffffffffffff16611ed4611756565b73ffffffffffffffffffffffffffffffffffffffff1614611f2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f21906146c5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611f99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9090614953565b60405180910390fd5b611fa281612c79565b50565b611fad6122da565b73ffffffffffffffffffffffffffffffffffffffff16611fcb611756565b73ffffffffffffffffffffffffffffffffffffffff1614612021576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612018906146c5565b60405180910390fd5b600960008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166120ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a4906149bf565b60405180910390fd5b60005b600a805490508110156122d6578173ffffffffffffffffffffffffffffffffffffffff16600a82815481106120e8576120e76149df565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036122c357600a6001600a8054905061214291906144fd565b81548110612153576121526149df565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600a8281548110612192576121916149df565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600a80548061228957612288614a0e565b5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590556122d6565b80806122ce90614a3d565b9150506120b0565b5050565b600033905090565b60008060008060006122f386612dc4565b90506000818761230391906144fd565b9050600061230f612dff565b90506000818361231f9190614a85565b90506000828a61232f9190614a85565b905080828585985098509850985050505050509193509193565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036123b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123af90614b51565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612427576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241e90614be3565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516125059190614267565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612581576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257890614c75565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036125f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e790614d07565b60405180910390fd5b60008111612633576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262a90614d99565b60405180910390fd5b600061263e846114d6565b905081811015612683576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267a90614e2b565b60405180910390fd5b61268b611756565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141580156126f957506126c9611756565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b1561274457601754821115612743576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273a90614ebd565b60405180910390fd5b5b61274f848484612e23565b600061275a306114d6565b905060006019548210159050601b60009054906101000a900460ff1615801561278f5750601b60019054906101000a900460ff165b80156127e657507f000000000000000000000000f8fe8303998fe38f93abc4ff9f09970c6bf22fe973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b156128555780156128005760195491506127ff82612e28565b5b6000479050601b60029054906101000a900460ff1680156128285750670de0b6b3a764000081115b1561285357601a5481111561283d57601a5490505b61285260648261284d91906144fd565b612f7d565b5b505b600060019050600860008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806128fc5750600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561290657600090505b61291287878784612fc9565b50505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361298a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298190614f4f565b60405180910390fd5b6000612995836114d6565b9050818110156129da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d190614fe1565b60405180910390fd5b6129e683600084612e23565b60006129f0612dff565b905060008184612a009190614a85565b9050600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612ae35783600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612a9f91906144fd565b600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b80600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612b2e91906144fd565b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555083600c54612b7f91906144fd565b600c8190555080600d54612b9391906144fd565b600d81905550600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051612bf79190614267565b60405180910390a3612c0b85600086612ff6565b5050505050565b6000600d54821115612c59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c5090615073565b60405180910390fd5b6000612c63612dff565b90508083612c7191906150c2565b915050919050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000601154148015612d5357506000600f54145b612d9c57601154601281905550601354601481905550601554601681905550600f546010819055506000601181905550600060138190555060006015819055506000600f819055505b565b601254601181905550601454601381905550601654601581905550601054600f81905550565b600080600f54601154612dd79190614531565b9050600060648285612de99190614a85565b612df391906150c2565b90508092505050919050565b6000806000612e0c612ffb565b915091508082612e1c91906150c2565b9250505090565b505050565b6001601b60006101000a81548160ff0219169083151502179055506000479050600060115460135484612e5b9190614a85565b612e6591906150c2565b90506000600282612e7691906150c2565b905060008183612e8691906144fd565b9050612e9c8186612e9791906144fd565b613299565b60008447612eaa91906144fd565b905060006002600a601354612ebf9190614a85565b612ec991906150c2565b600a601154612ed89190614a85565b612ee291906144fd565b6002600a601354612ef39190614a85565b612efd91906150c2565b83612f089190614a85565b612f1291906150c2565b9050612f1e838261350f565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561848285604051612f51939291906150f3565b60405180910390a15050505050506000601b60006101000a81548160ff02191690831515021790555050565b6001601b60006101000a81548160ff0219169083151502179055506000811115612fab57612faa816135f0565b5b6000601b60006101000a81548160ff02191690831515021790555050565b80612fd757612fd6612d3f565b5b612fe2848484613867565b80612ff057612fef612d9e565b5b50505050565b505050565b6000806000600d5490506000600c54905060005b600a80549050811015613263578260066000600a8481548110613035576130346149df565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054118061312357508160076000600a84815481106130bb576130ba6149df565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054115b1561313a57600d54600c5494509450505050613295565b60066000600a8381548110613152576131516149df565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836131c391906144fd565b925060076000600a83815481106131dd576131dc6149df565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548261324e91906144fd565b9150808061325b90614a3d565b91505061300f565b50600c54600d5461327491906150c2565b82101561328c57600d54600c54935093505050613295565b81819350935050505b9091565b6000600267ffffffffffffffff8111156132b6576132b561512a565b5b6040519080825280602002602001820160405280156132e45781602001602082028036833780820191505090505b50905030816000815181106132fc576132fb6149df565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156133a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133c5919061516e565b816001815181106133d9576133d86149df565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061343e307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84612349565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b81526004016134a0959493929190615294565b600060405180830381600087803b1580156134ba57600080fd5b505af11580156134ce573d6000803e3d6000fd5b505050507f32cde87eb454f3a0b875ab23547023107cfad454363ec88ba5695e2c24aa52a782826040516135039291906152ee565b60405180910390a15050565b61353a307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84612349565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080613584611756565b426040518863ffffffff1660e01b81526004016135a69695949392919061531e565b60606040518083038185885af11580156135c4573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906135e99190615394565b5050505050565b6000600267ffffffffffffffff81111561360d5761360c61512a565b5b60405190808252806020026020018201604052801561363b5781602001602082028036833780820191505090505b5090507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156136a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136cd919061516e565b816000815181106136e1576136e06149df565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505030816001815181106137305761372f6149df565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663b6f9de95836000847f000000000000000000000000000000000000000000000000000000000000dead61012c426137d99190614531565b6040518663ffffffff1660e01b81526004016137f894939291906153e7565b6000604051808303818588803b15801561381157600080fd5b505af1158015613825573d6000803e3d6000fd5b50505050507f6fd378a9d8b7345c2e5b18229aaf1e39d32b177b501d0a0d26a0a858a23a9624828260405161385b9291906152ee565b60405180910390a15050565b600080600080613876856122e2565b935093509350935083600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546138c991906144fd565b600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555082600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546139579190614531565b600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015613a3d5750600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15613ad55784600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613a8d91906144fd565b600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613dd6565b600960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015613b785750600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15613c105781600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613bc89190614531565b600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613dd5565b600960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015613cb25750600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15613dd45784600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613d0291906144fd565b600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613d909190614531565b600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5b5b613de1878683613e59565b613deb8582613f8b565b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051613e489190614267565b60405180910390a350505050505050565b6000606460115484613e6b9190614a85565b613e7591906150c2565b90506000811115613f855760008282613e8e9190614a85565b905080600660003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613edb9190614531565b600660003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051613f7b9190614267565b60405180910390a3505b50505050565b60006064600f5484613f9d9190614a85565b613fa791906150c2565b905060008282613fb79190614a85565b905080600d54613fc791906144fd565b600d8190555081600e54613fdb9190614531565b600e8190555050505050565b600080fd5b6000819050919050565b613fff81613fec565b811461400a57600080fd5b50565b60008135905061401c81613ff6565b92915050565b60006020828403121561403857614037613fe7565b5b60006140468482850161400d565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561408957808201518184015260208101905061406e565b83811115614098576000848401525b50505050565b6000601f19601f8301169050919050565b60006140ba8261404f565b6140c4818561405a565b93506140d481856020860161406b565b6140dd8161409e565b840191505092915050565b6000602082019050818103600083015261410281846140af565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006141358261410a565b9050919050565b6141458161412a565b811461415057600080fd5b50565b6000813590506141628161413c565b92915050565b6000806040838503121561417f5761417e613fe7565b5b600061418d85828601614153565b925050602061419e8582860161400d565b9150509250929050565b60008115159050919050565b6141bd816141a8565b82525050565b60006020820190506141d860008301846141b4565b92915050565b6000819050919050565b60006142036141fe6141f98461410a565b6141de565b61410a565b9050919050565b6000614215826141e8565b9050919050565b60006142278261420a565b9050919050565b6142378161421c565b82525050565b6000602082019050614252600083018461422e565b92915050565b61426181613fec565b82525050565b600060208201905061427c6000830184614258565b92915050565b60008060006060848603121561429b5761429a613fe7565b5b60006142a986828701614153565b93505060206142ba86828701614153565b92505060406142cb8682870161400d565b9150509250925092565b6142de8161412a565b82525050565b60006020820190506142f960008301846142d5565b92915050565b614308816141a8565b811461431357600080fd5b50565b600081359050614325816142ff565b92915050565b60006020828403121561434157614340613fe7565b5b600061434f84828501614316565b91505092915050565b600060ff82169050919050565b61436e81614358565b82525050565b60006020820190506143896000830184614365565b92915050565b6000602082840312156143a5576143a4613fe7565b5b60006143b384828501614153565b91505092915050565b600080604083850312156143d3576143d2613fe7565b5b60006143e18582860161400d565b92505060206143f285828601614316565b9150509250929050565b6000806040838503121561441357614412613fe7565b5b600061442185828601614153565b925050602061443285828601614153565b9150509250929050565b7f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460008201527f6869732066756e6374696f6e0000000000000000000000000000000000000000602082015250565b6000614498602c8361405a565b91506144a38261443c565b604082019050919050565b600060208201905081810360008301526144c78161448b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061450882613fec565b915061451383613fec565b925082821015614526576145256144ce565b5b828203905092915050565b600061453c82613fec565b915061454783613fec565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561457c5761457b6144ce565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806145ce57607f821691505b6020821081036145e1576145e0614587565b5b50919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b600061464360288361405a565b915061464e826145e7565b604082019050919050565b6000602082019050818103600083015261467281614636565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006146af60208361405a565b91506146ba82614679565b602082019050919050565b600060208201905081810360008301526146de816146a2565b9050919050565b7f416d6f756e74206d757374206265206c657373207468616e20737570706c7900600082015250565b600061471b601f8361405a565b9150614726826146e5565b602082019050919050565b6000602082019050818103600083015261474a8161470e565b9050919050565b7f4163636f756e7420697320616c7265616479206578636c756465640000000000600082015250565b6000614787601b8361405a565b915061479282614751565b602082019050919050565b600060208201905081810360008301526147b68161477a565b9050919050565b7f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f7760008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b600061481960248361405a565b9150614824826147bd565b604082019050919050565b600060208201905081810360008301526148488161480c565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006148ab60258361405a565b91506148b68261484f565b604082019050919050565b600060208201905081810360008301526148da8161489e565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061493d60268361405a565b9150614948826148e1565b604082019050919050565b6000602082019050818103600083015261496c81614930565b9050919050565b7f4163636f756e7420697320616c726561647920696e636c756465640000000000600082015250565b60006149a9601b8361405a565b91506149b482614973565b602082019050919050565b600060208201905081810360008301526149d88161499c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6000614a4882613fec565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614a7a57614a796144ce565b5b600182019050919050565b6000614a9082613fec565b9150614a9b83613fec565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614ad457614ad36144ce565b5b828202905092915050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614b3b60248361405a565b9150614b4682614adf565b604082019050919050565b60006020820190508181036000830152614b6a81614b2e565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000614bcd60228361405a565b9150614bd882614b71565b604082019050919050565b60006020820190508181036000830152614bfc81614bc0565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614c5f60258361405a565b9150614c6a82614c03565b604082019050919050565b60006020820190508181036000830152614c8e81614c52565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000614cf160238361405a565b9150614cfc82614c95565b604082019050919050565b60006020820190508181036000830152614d2081614ce4565b9050919050565b7f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b6000614d8360298361405a565b9150614d8e82614d27565b604082019050919050565b60006020820190508181036000830152614db281614d76565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000614e1560268361405a565b9150614e2082614db9565b604082019050919050565b60006020820190508181036000830152614e4481614e08565b9050919050565b7f5472616e7366657220616d6f756e74206578636565647320746865206d61785460008201527f78416d6f756e742e000000000000000000000000000000000000000000000000602082015250565b6000614ea760288361405a565b9150614eb282614e4b565b604082019050919050565b60006020820190508181036000830152614ed681614e9a565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000614f3960218361405a565b9150614f4482614edd565b604082019050919050565b60006020820190508181036000830152614f6881614f2c565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000614fcb60228361405a565b9150614fd682614f6f565b604082019050919050565b60006020820190508181036000830152614ffa81614fbe565b9050919050565b7f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260008201527f65666c656374696f6e7300000000000000000000000000000000000000000000602082015250565b600061505d602a8361405a565b915061506882615001565b604082019050919050565b6000602082019050818103600083015261508c81615050565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006150cd82613fec565b91506150d883613fec565b9250826150e8576150e7615093565b5b828204905092915050565b60006060820190506151086000830186614258565b6151156020830185614258565b6151226040830184614258565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000815190506151688161413c565b92915050565b60006020828403121561518457615183613fe7565b5b600061519284828501615159565b91505092915050565b6000819050919050565b60006151c06151bb6151b68461519b565b6141de565b613fec565b9050919050565b6151d0816151a5565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61520b8161412a565b82525050565b600061521d8383615202565b60208301905092915050565b6000602082019050919050565b6000615241826151d6565b61524b81856151e1565b9350615256836151f2565b8060005b8381101561528757815161526e8882615211565b975061527983615229565b92505060018101905061525a565b5085935050505092915050565b600060a0820190506152a96000830188614258565b6152b660208301876151c7565b81810360408301526152c88186615236565b90506152d760608301856142d5565b6152e46080830184614258565b9695505050505050565b60006040820190506153036000830185614258565b81810360208301526153158184615236565b90509392505050565b600060c08201905061533360008301896142d5565b6153406020830188614258565b61534d60408301876151c7565b61535a60608301866151c7565b61536760808301856142d5565b61537460a0830184614258565b979650505050505050565b60008151905061538e81613ff6565b92915050565b6000806000606084860312156153ad576153ac613fe7565b5b60006153bb8682870161537f565b93505060206153cc8682870161537f565b92505060406153dd8682870161537f565b9150509250925092565b60006080820190506153fc60008301876151c7565b818103602083015261540e8186615236565b905061541d60408301856142d5565b61542a6060830184614258565b9594505050505056fea2646970667358221220fba8fddda2b5745a2856dfc8e64ca2b41edd6ad1099718d14a29de8bb64536c864736f6c634300080f0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000098968000000000000000000000000000000000000000000000000000000000000000120000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000e2c1470d8e3f8cafd7205de006987e7f8edef9ad000000000000000000000000000000000000000000000000000000000000dead000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a536869626173626f6e65000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007536869626f6e6500000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name_ (string): Shibasbone
Arg [1] : symbol_ (string): Shibone
Arg [2] : totalSupply_ (uint256): 10000000
Arg [3] : decimals_ (uint8): 18
Arg [4] : addr_ (address[3]): 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D,0xe2c1470D8E3f8cAFd7205DE006987E7F8EdeF9Ad,0x000000000000000000000000000000000000dEaD
Arg [5] : value_ (uint256[3]): 2,4,2

-----Encoded View---------------
14 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [2] : 0000000000000000000000000000000000000000000000000000000000989680
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [4] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Arg [5] : 000000000000000000000000e2c1470d8e3f8cafd7205de006987e7f8edef9ad
Arg [6] : 000000000000000000000000000000000000000000000000000000000000dead
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [10] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [11] : 536869626173626f6e6500000000000000000000000000000000000000000000
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [13] : 536869626f6e6500000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

38322:19401:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45083:414;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17432:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19740:210;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39452:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42231:103;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39210:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20432:529;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38693:90;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43762:150;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42123:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44524;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38940:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21370:297;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28179:91;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44169:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45505:487;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43077:173;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39510:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39585:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44037:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46328:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39632:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42342:278;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14599:103;;;;;;;;;;;;;:::i;:::-;;28589:405;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39287:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43453:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39121:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13948:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17651:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42628:120;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22170:482;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19113:216;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42756:197;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42961:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43583:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44406:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19392:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44632:121;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44288:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43920:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56348:406;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43258:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14857:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46675:482;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45083:414;45135:14;45152:12;:10;:12::i;:::-;45135:29;;45198:11;:19;45210:6;45198:19;;;;;;;;;;;;;;;;;;;;;;;;;45197:20;45175:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;45301:15;45326:27;45345:7;45326:18;:27::i;:::-;45300:53;;;;;45400:7;45382;:15;45390:6;45382:15;;;;;;;;;;;;;;;;:25;;;;:::i;:::-;45364:7;:15;45372:6;45364:15;;;;;;;;;;;;;;;:43;;;;45438:7;45428;;:17;;;;:::i;:::-;45418:7;:27;;;;45482:7;45469:10;;:20;;;;:::i;:::-;45456:10;:33;;;;45124:373;;45083:414;:::o;17432:100::-;17486:13;17519:5;17512:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17432:100;:::o;19740:210::-;19859:4;19881:39;19890:12;:10;:12::i;:::-;19904:7;19913:6;19881:8;:39::i;:::-;19938:4;19931:11;;19740:210;;;;:::o;39452:51::-;;;:::o;42231:103::-;42292:7;42319;;42312:14;;42231:103;:::o;39210:26::-;;;;:::o;20432:529::-;20572:4;20589:36;20599:6;20607:9;20618:6;20589:9;:36::i;:::-;20638:24;20665:11;:19;20677:6;20665:19;;;;;;;;;;;;;;;:33;20685:12;:10;:12::i;:::-;20665:33;;;;;;;;;;;;;;;;20638:60;;20751:6;20731:16;:26;;20709:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;20861:57;20870:6;20878:12;:10;:12::i;:::-;20911:6;20892:16;:25;20861:8;:57::i;:::-;20949:4;20942:11;;;20432:529;;;;;:::o;38693:90::-;;;:::o;43762:150::-;14179:12;:10;:12::i;:::-;14168:23;;:7;:5;:7::i;:::-;:23;;;14160:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43849:8:::1;43832:14;;:25;;;;;;;;;;;;;;;;;;43873:31;43895:8;43873:31;;;;;;:::i;:::-;;;;;;;;43762:150:::0;:::o;42123:100::-;42181:5;42206:9;;;;;;;;;;;42199:16;;42123:100;:::o;44524:::-;44579:7;44606:10;;44599:17;;44524:100;:::o;38940:29::-;;;;:::o;21370:297::-;21485:4;21507:130;21530:12;:10;:12::i;:::-;21557:7;21616:10;21579:11;:25;21591:12;:10;:12::i;:::-;21579:25;;;;;;;;;;;;;;;:34;21605:7;21579:34;;;;;;;;;;;;;;;;:47;;;;:::i;:::-;21507:8;:130::i;:::-;21655:4;21648:11;;21370:297;;;;:::o;28179:91::-;28235:27;28241:12;:10;:12::i;:::-;28255:6;28235:5;:27::i;:::-;28179:91;:::o;44169:111::-;14179:12;:10;:12::i;:::-;14168:23;;:7;:5;:7::i;:::-;:23;;;14160:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44268:4:::1;44238:18;:27;44257:7;44238:27;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;44169:111:::0;:::o;45505:487::-;45623:7;45667;;45656;:18;;45648:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;45726:17;45721:264;;45761:15;45786:27;45805:7;45786:18;:27::i;:::-;45760:53;;;;;45835:7;45828:14;;;;;45721:264;45878:23;45909:27;45928:7;45909:18;:27::i;:::-;45875:61;;;;;45958:15;45951:22;;;45505:487;;;;;:::o;43077:173::-;14179:12;:10;:12::i;:::-;14168:23;;:7;:5;:7::i;:::-;:23;;;14160:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43165:11:::1;43151;:25;;;;43231:11;43211:17;;:31;;;;:::i;:::-;43187:21;:55;;;;43077:173:::0;:::o;39510:38::-;;;:::o;39585:40::-;;;;;;;;;;;;;:::o;44037:124::-;44102:4;44126:18;:27;44145:7;44126:27;;;;;;;;;;;;;;;;;;;;;;;;;44119:34;;44037:124;;;:::o;46328:339::-;14179:12;:10;:12::i;:::-;14168:23;;:7;:5;:7::i;:::-;:23;;;14160:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46416:11:::1;:20;46428:7;46416:20;;;;;;;;;;;;;;;;;;;;;;;;;46415:21;46407:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;46502:1;46483:7;:16;46491:7;46483:16;;;;;;;;;;;;;;;;:20;46479:109;;;46539:37;46559:7;:16;46567:7;46559:16;;;;;;;;;;;;;;;;46539:19;:37::i;:::-;46520:7;:16;46528:7;46520:16;;;;;;;;;;;;;;;:56;;;;46479:109;46621:4;46598:11;:20;46610:7;46598:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;46636:9;46651:7;46636:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46328:339:::0;:::o;39632:33::-;;;;;;;;;;;;;:::o;42342:278::-;42460:7;42489:11;:19;42501:6;42489:19;;;;;;;;;;;;;;;;;;;;;;;;;42485:74;;;42532:7;:15;42540:6;42532:15;;;;;;;;;;;;;;;;42525:22;;;;42485:74;42576:36;42596:7;:15;42604:6;42596:15;;;;;;;;;;;;;;;;42576:19;:36::i;:::-;42569:43;;42342:278;;;;:::o;14599:103::-;14179:12;:10;:12::i;:::-;14168:23;;:7;:5;:7::i;:::-;:23;;;14160:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14664:30:::1;14691:1;14664:18;:30::i;:::-;14599:103::o:0;28589:405::-;28666:24;28693:32;28703:7;28712:12;:10;:12::i;:::-;28693:9;:32::i;:::-;28666:59;;28778:6;28758:16;:26;;28736:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;28884:58;28893:7;28902:12;:10;:12::i;:::-;28935:6;28916:16;:25;28884:8;:58::i;:::-;28964:22;28970:7;28979:6;28964:5;:22::i;:::-;28655:339;28589:405;;:::o;39287:27::-;;;;:::o;43453:122::-;14179:12;:10;:12::i;:::-;14168:23;;:7;:5;:7::i;:::-;:23;;;14160:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43555:12:::1;43535:17;:32;;;;43453:122:::0;:::o;39121:32::-;;;;:::o;13948:87::-;13994:7;14021:6;;;;;;;;;;;14014:13;;13948:87;:::o;17651:104::-;17707:13;17740:7;17733:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17651:104;:::o;42628:120::-;42690:7;42717:23;;42710:30;;42628:120;:::o;22170:482::-;22290:4;22312:24;22339:11;:25;22351:12;:10;:12::i;:::-;22339:25;;;;;;;;;;;;;;;:34;22365:7;22339:34;;;;;;;;;;;;;;;;22312:61;;22426:15;22406:16;:35;;22384:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;22542:67;22551:12;:10;:12::i;:::-;22565:7;22593:15;22574:16;:34;22542:8;:67::i;:::-;22640:4;22633:11;;;22170:482;;;;:::o;19113:216::-;19235:4;19257:42;19267:12;:10;:12::i;:::-;19281:9;19292:6;19257:9;:42::i;:::-;19317:4;19310:11;;19113:216;;;;:::o;42756:197::-;14179:12;:10;:12::i;:::-;14168:23;;:7;:5;:7::i;:::-;:23;;;14160:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42862:17:::1;42842;:37;;;;42934:11;;42914:17;:31;;;;:::i;:::-;42890:21;:55;;;;42756:197:::0;:::o;42961:108::-;43017:7;43044:17;;43037:24;;42961:108;:::o;43583:171::-;14179:12;:10;:12::i;:::-;14168:23;;:7;:5;:7::i;:::-;:23;;;14160:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43684:8:::1;43660:21;;:32;;;;;;;;;;;;;;;;;;43708:38;43737:8;43708:38;;;;;;:::i;:::-;;;;;;;;43583:171:::0;:::o;44406:110::-;44464:4;44488:11;:20;44500:7;44488:20;;;;;;;;;;;;;;;;;;;;;;;;;44481:27;;44406:110;;;:::o;19392:201::-;19526:7;19558:11;:18;19570:5;19558:18;;;;;;;;;;;;;;;:27;19577:7;19558:27;;;;;;;;;;;;;;;;19551:34;;19392:201;;;;:::o;44632:121::-;14179:12;:10;:12::i;:::-;14168:23;;:7;:5;:7::i;:::-;:23;;;14160:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44729:16:::1;44712:14;:33;;;;44632:121:::0;:::o;44288:110::-;14179:12;:10;:12::i;:::-;14168:23;;:7;:5;:7::i;:::-;:23;;;14160:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44385:5:::1;44355:18;:27;44374:7;44355:27;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;44288:110:::0;:::o;43920:109::-;14179:12;:10;:12::i;:::-;14168:23;;:7;:5;:7::i;:::-;:23;;;14160:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44010:11:::1;43995:12;:26;;;;43920:109:::0;:::o;56348:406::-;14179:12;:10;:12::i;:::-;14168:23;;:7;:5;:7::i;:::-;:23;;;14160:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56414:8:::1;56410:337;;;56439:31;56464:5;56439:24;:31::i;:::-;56485:14;:12;:14::i;:::-;56537:12;;56514:20;:35;;;;56579:13;:11;:13::i;:::-;56564:12;:28;;;;56410:337;;;56625:30;56650:4;56625:24;:30::i;:::-;56670:15;:13;:15::i;:::-;56715:20;;56700:12;:35;;;;56410:337;56348:406:::0;:::o;43258:187::-;14179:12;:10;:12::i;:::-;14168:23;;:7;:5;:7::i;:::-;:23;;;14160:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43413:24:::1;43387:23;:50;;;;43258:187:::0;:::o;14857:238::-;14179:12;:10;:12::i;:::-;14168:23;;:7;:5;:7::i;:::-;:23;;;14160:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14980:1:::1;14960:22;;:8;:22;;::::0;14938:110:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;15059:28;15078:8;15059:18;:28::i;:::-;14857:238:::0;:::o;46675:482::-;14179:12;:10;:12::i;:::-;14168:23;;:7;:5;:7::i;:::-;:23;;;14160:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46760:11:::1;:20;46772:7;46760:20;;;;;;;;;;;;;;;;;;;;;;;;;46752:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;46828:9;46823:327;46847:9;:16;;;;46843:1;:20;46823:327;;;46905:7;46889:23;;:9;46899:1;46889:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:23;;::::0;46885:254:::1;;46948:9;46977:1;46958:9;:16;;;;:20;;;;:::i;:::-;46948:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;46933:9;46943:1;46933:12;;;;;;;;:::i;:::-;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;47017:1;46998:7;:16;47006:7;46998:16;;;;;;;;;;;;;;;:20;;;;47060:5;47037:11;:20;47049:7;47037:20;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;47084:9;:15;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;47118:5;;46885:254;46865:3;;;;;:::i;:::-;;;;46823:327;;;;46675:482:::0;:::o;12790:98::-;12843:7;12870:10;12863:17;;12790:98;:::o;50384:553::-;50492:7;50514;50536;50558;50593:16;50612:29;50633:7;50612:20;:29::i;:::-;50593:48;;50652:23;50688:8;50678:7;:18;;;;:::i;:::-;50652:44;;50707:19;50729:10;:8;:10::i;:::-;50707:32;;50750:23;50794:11;50776:15;:29;;;;:::i;:::-;50750:55;;50816:15;50844:11;50834:7;:21;;;;:::i;:::-;50816:39;;50874:7;50883:15;50900;50917:11;50866:63;;;;;;;;;;;;;50384:553;;;;;:::o;25960:380::-;26113:1;26096:19;;:5;:19;;;26088:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;26194:1;26175:21;;:7;:21;;;26167:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;26278:6;26248:11;:18;26260:5;26248:18;;;;;;;;;;;;;;;:27;26267:7;26248:27;;;;;;;;;;;;;;;:36;;;;26316:7;26300:32;;26309:5;26300:32;;;26325:6;26300:32;;;;;;:::i;:::-;;;;;;;;25960:380;;;:::o;47165:1794::-;47332:1;47314:20;;:6;:20;;;47306:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;47416:1;47395:23;;:9;:23;;;47387:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;47486:1;47477:6;:10;47469:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;47544:21;47568:17;47578:6;47568:9;:17::i;:::-;47544:41;;47635:6;47618:13;:23;;47596:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;47732:7;:5;:7::i;:::-;47722:17;;:6;:17;;;;:41;;;;;47756:7;:5;:7::i;:::-;47743:20;;:9;:20;;;;47722:41;47718:198;;;47816:12;;47806:6;:22;;47780:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;47718:198;47928:47;47949:6;47957:9;47968:6;47928:20;:47::i;:::-;47988:28;48019:24;48037:4;48019:9;:24::i;:::-;47988:55;;48054:28;48122:23;;48085:20;:60;;48054:91;;48177:16;;;;;;;;;;;48176:17;:55;;;;;48210:21;;;;;;;;;;;48176:55;:98;;;;;48261:13;48248:26;;:9;:26;;;48176:98;48158:580;;;48305:23;48301:161;;;48372:23;;48349:46;;48414:32;48425:20;48414:10;:32::i;:::-;48301:161;48476:15;48494:21;48476:39;;48534:14;;;;;;;;;;;:47;;;;;48570:10;48552:7;:29;48534:47;48530:197;;;48616:17;;48606:7;:27;48602:60;;;48645:17;;48635:27;;48602:60;48683:28;48707:3;48697:7;:13;;;;:::i;:::-;48683;:28::i;:::-;48530:197;48286:452;48158:580;48750:12;48765:4;48750:19;;48786:18;:26;48805:6;48786:26;;;;;;;;;;;;;;;;;;;;;;;;;:59;;;;48816:18;:29;48835:9;48816:29;;;;;;;;;;;;;;;;;;;;;;;;;48786:59;48782:107;;;48872:5;48862:15;;48782:107;48901:50;48916:6;48924:9;48935:6;48943:7;48901:14;:50::i;:::-;47295:1664;;;;47165:1794;;;:::o;56910:810::-;57022:1;57003:21;;:7;:21;;;56995:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;57073:22;57098:18;57108:7;57098:9;:18::i;:::-;57073:43;;57153:6;57135:14;:24;;57127:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;57211:49;57232:7;57249:1;57253:6;57211:20;:49::i;:::-;57273:19;57295:10;:8;:10::i;:::-;57273:32;;57316:15;57343:11;57334:6;:20;;;;:::i;:::-;57316:38;;57371:11;:20;57383:7;57371:20;;;;;;;;;;;;;;;;;;;;;;;;;57367:97;;;57446:6;57427:7;:16;57435:7;57427:16;;;;;;;;;;;;;;;;:25;;;;:::i;:::-;57408:7;:16;57416:7;57408:16;;;;;;;;;;;;;;;:44;;;;57367:97;57514:7;57495;:16;57503:7;57495:16;;;;;;;;;;;;;;;;:26;;;;:::i;:::-;57476:7;:16;57484:7;57476:16;;;;;;;;;;;;;;;:45;;;;57554:6;57544:7;;:16;;;;:::i;:::-;57534:7;:26;;;;57591:7;57581;;:17;;;;:::i;:::-;57571:7;:27;;;;57640:1;57614:37;;57623:7;57614:37;;;57644:6;57614:37;;;;;;:::i;:::-;;;;;;;;57664:48;57684:7;57701:1;57705:6;57664:19;:48::i;:::-;56984:736;;;56910:810;;:::o;46000:320::-;46095:7;46153;;46142;:18;;46120:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;46241:19;46263:10;:8;:10::i;:::-;46241:32;;46301:11;46291:7;:21;;;;:::i;:::-;46284:28;;;46000:320;;;:::o;15255:191::-;15329:16;15348:6;;;;;;;;;;;15329:25;;15374:8;15365:6;;:17;;;;;;;;;;;;;;;;;;15429:8;15398:40;;15419:8;15398:40;;;;;;;;;;;;15318:128;15255:191;:::o;55624:453::-;55696:1;55671:21;;:26;:49;;;;;55719:1;55701:14;;:19;55671:49;55722:7;55667:62;55773:21;;55741:29;:53;;;;55833:17;;55805:25;:45;;;;55883:11;;55861:19;:33;;;;55930:14;;55905:22;:39;;;;55981:1;55957:21;:25;;;;56013:1;55993:17;:21;;;;56039:1;56025:11;:15;;;;56068:1;56051:14;:18;;;;55624:453;:::o;56085:255::-;56153:29;;56129:21;:53;;;;56213:25;;56193:17;:45;;;;56263:19;;56249:11;:33;;;;56310:22;;56293:14;:39;;;;56085:255::o;50945:266::-;51040:7;51065:16;51108:14;;51084:21;;:38;;;;:::i;:::-;51065:57;;51133:16;51174:3;51162:8;51153:6;:17;;;;:::i;:::-;51152:25;;;;:::i;:::-;51133:44;;51195:8;51188:15;;;;50945:266;;;:::o;51929:161::-;51971:7;51992:15;52009;52028:19;:17;:19::i;:::-;51991:56;;;;52075:7;52065;:17;;;;:::i;:::-;52058:24;;;;51929:161;:::o;26940:125::-;;;;:::o;52768:908::-;40153:4;40134:16;;:23;;;;;;;;;;;;;;;;;;52849:22:::1;52874:21;52849:46;;52906:22;52989:21;;52955:17;;52932:20;:40;;;;:::i;:::-;52931:79;;;;:::i;:::-;52906:104;;53023:21;53064:1;53047:14;:18;;;;:::i;:::-;53023:42;;53076:26;53122:13;53105:14;:30;;;;:::i;:::-;53076:59;;53146;53186:18;53163:20;:41;;;;:::i;:::-;53146:16;:59::i;:::-;53218:26;53271:14;53247:21;:38;;;;:::i;:::-;53218:67;;53298:24;53467:1;53461:2;53441:17;;:22;;;;:::i;:::-;53440:28;;;;:::i;:::-;53433:2;53409:21;;:26;;;;:::i;:::-;53408:61;;;;:::i;:::-;53388:1;53382:2;53362:17;;:22;;;;:::i;:::-;53361:28;;;;:::i;:::-;53326:18;:64;;;;:::i;:::-;53325:145;;;;:::i;:::-;53298:172;;53483:50;53496:18;53516:16;53483:12;:50::i;:::-;53551:117;53580:13;53608:16;53639:18;53551:117;;;;;;;;:::i;:::-;;;;;;;;52838:838;;;;;;40199:5:::0;40180:16;;:24;;;;;;;;;;;;;;;;;;52768:908;:::o;53684:144::-;40153:4;40134:16;;:23;;;;;;;;;;;;;;;;;;53767:1:::1;53758:6;:10;53754:67;;;53785:24;53802:6;53785:16;:24::i;:::-;53754:67;40199:5:::0;40180:16;;:24;;;;;;;;;;;;;;;;;;53684:144;:::o;48967:318::-;49113:7;49108:55;;49137:14;:12;:14::i;:::-;49108:55;49175:34;49193:4;49199:2;49203:5;49175:17;:34::i;:::-;49227:7;49222:56;;49251:15;:13;:15::i;:::-;49222:56;48967:318;;;;:::o;27669:124::-;;;;:::o;52098:662::-;52149:7;52158;52178:15;52196:7;;52178:25;;52214:15;52232:7;;52214:25;;52257:9;52252:366;52276:9;:16;;;;52272:1;:20;52252:366;;;52360:7;52336;:21;52344:9;52354:1;52344:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;52336:21;;;;;;;;;;;;;;;;:31;:83;;;;52412:7;52388;:21;52396:9;52406:1;52396:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;52388:21;;;;;;;;;;;;;;;;:31;52336:83;52314:181;;;52462:7;;52471;;52454:25;;;;;;;;;52314:181;52529:7;:21;52537:9;52547:1;52537:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;52529:21;;;;;;;;;;;;;;;;52519:7;:31;;;;:::i;:::-;52509:41;;52585:7;:21;52593:9;52603:1;52593:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;52585:21;;;;;;;;;;;;;;;;52575:7;:31;;;;:::i;:::-;52565:41;;52294:3;;;;;:::i;:::-;;;;52252:366;;;;52654:7;;52644;;:17;;;;:::i;:::-;52634:7;:27;52630:85;;;52686:7;;52695;;52678:25;;;;;;;;52630:85;52735:7;52744;52727:25;;;;;;52098:662;;;:::o;53836:658::-;53962:21;54000:1;53986:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53962:40;;54031:4;54013;54018:1;54013:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;54057:15;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54047:4;54052:1;54047:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;;;54092:62;54109:4;54124:15;54142:11;54092:8;:62::i;:::-;54193:15;:66;;;54274:11;54300:1;54344:4;54371;54407:15;54193:240;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54451:35;54468:11;54481:4;54451:35;;;;;;;:::i;:::-;;;;;;;;53891:603;53836:658;:::o;55103:513::-;55251:62;55268:4;55283:15;55301:11;55251:8;:62::i;:::-;55356:15;:31;;;55395:9;55428:4;55448:11;55474:1;55517;55560:7;:5;:7::i;:::-;55582:15;55356:252;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;55103:513;;:::o;54502:593::-;54623:21;54661:1;54647:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54623:40;;54684:15;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54674:4;54679:1;54674:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;;;54735:4;54717;54722:1;54717:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;54779:15;:66;;;54867:6;54899:1;54946:4;54965:11;55025:3;55007:15;:21;;;;:::i;:::-;54779:260;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55057:30;55074:6;55082:4;55057:30;;;;;;;:::i;:::-;;;;;;;;54552:543;54502:593;:::o;49293:1083::-;49440:15;49470:23;49508;49546:19;49579:27;49598:7;49579:18;:27::i;:::-;49425:181;;;;;;;;49655:7;49637;:15;49645:6;49637:15;;;;;;;;;;;;;;;;:25;;;;:::i;:::-;49619:7;:15;49627:6;49619:15;;;;;;;;;;;;;;;:43;;;;49715:15;49694:7;:18;49702:9;49694:18;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;49673:7;:18;49681:9;49673:18;;;;;;;;;;;;;;;:57;;;;49747:11;:19;49759:6;49747:19;;;;;;;;;;;;;;;;;;;;;;;;;:46;;;;;49771:11;:22;49783:9;49771:22;;;;;;;;;;;;;;;;;;;;;;;;;49770:23;49747:46;49743:463;;;49846:7;49828;:15;49836:6;49828:15;;;;;;;;;;;;;;;;:25;;;;:::i;:::-;49810:7;:15;49818:6;49810:15;;;;;;;;;;;;;;;:43;;;;49743:463;;;49876:11;:19;49888:6;49876:19;;;;;;;;;;;;;;;;;;;;;;;;;49875:20;:46;;;;;49899:11;:22;49911:9;49899:22;;;;;;;;;;;;;;;;;;;;;;;;;49875:46;49871:335;;;49980:15;49959:7;:18;49967:9;49959:18;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;49938:7;:18;49946:9;49938:18;;;;;;;;;;;;;;;:57;;;;49871:335;;;50017:11;:19;50029:6;50017:19;;;;;;;;;;;;;;;;;;;;;;;;;:45;;;;;50040:11;:22;50052:9;50040:22;;;;;;;;;;;;;;;;;;;;;;;;;50017:45;50013:193;;;50115:7;50097;:15;50105:6;50097:15;;;;;;;;;;;;;;;;:25;;;;:::i;:::-;50079:7;:15;50087:6;50079:15;;;;;;;;;;;;;;;:43;;;;50179:15;50158:7;:18;50166:9;50158:18;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;50137:7;:18;50145:9;50137:18;;;;;;;;;;;;;;;:57;;;;50013:193;49871:335;49743:463;50218:44;50233:6;50241:7;50250:11;50218:14;:44::i;:::-;50273:33;50285:7;50294:11;50273;:33::i;:::-;50341:9;50324:44;;50333:6;50324:44;;;50352:15;50324:44;;;;;;:::i;:::-;;;;;;;;49414:962;;;;49293:1083;;;:::o;51219:439::-;51350:18;51407:3;51382:21;;51372:7;:31;;;;:::i;:::-;51371:39;;;;:::i;:::-;51350:60;;51438:1;51425:10;:14;51421:230;;;51456:18;51490:11;51477:10;:24;;;;:::i;:::-;51456:45;;51566:10;51541:7;:22;51557:4;51541:22;;;;;;;;;;;;;;;;:35;;;;:::i;:::-;51516:7;:22;51532:4;51516:22;;;;;;;;;;;;;;;:60;;;;51621:4;51596:43;;51605:6;51596:43;;;51628:10;51596:43;;;;;;:::i;:::-;;;;;;;;51441:210;51421:230;51339:319;51219:439;;;:::o;51666:255::-;51744:12;51788:3;51770:14;;51760:7;:24;;;;:::i;:::-;51759:32;;;;:::i;:::-;51744:47;;51802:12;51824:11;51817:4;:18;;;;:::i;:::-;51802:33;;51868:4;51858:7;;:14;;;;:::i;:::-;51848:7;:24;;;;51909:4;51896:10;;:17;;;;:::i;:::-;51883:10;:30;;;;51733:188;;51666:255;;:::o;88:117:1:-;197:1;194;187:12;334:77;371:7;400:5;389:16;;334:77;;;:::o;417:122::-;490:24;508:5;490:24;:::i;:::-;483:5;480:35;470:63;;529:1;526;519:12;470:63;417:122;:::o;545:139::-;591:5;629:6;616:20;607:29;;645:33;672:5;645:33;:::i;:::-;545:139;;;;:::o;690:329::-;749:6;798:2;786:9;777:7;773:23;769:32;766:119;;;804:79;;:::i;:::-;766:119;924:1;949:53;994:7;985:6;974:9;970:22;949:53;:::i;:::-;939:63;;895:117;690:329;;;;:::o;1025:99::-;1077:6;1111:5;1105:12;1095:22;;1025:99;;;:::o;1130:169::-;1214:11;1248:6;1243:3;1236:19;1288:4;1283:3;1279:14;1264:29;;1130:169;;;;:::o;1305:307::-;1373:1;1383:113;1397:6;1394:1;1391:13;1383:113;;;1482:1;1477:3;1473:11;1467:18;1463:1;1458:3;1454:11;1447:39;1419:2;1416:1;1412:10;1407:15;;1383:113;;;1514:6;1511:1;1508:13;1505:101;;;1594:1;1585:6;1580:3;1576:16;1569:27;1505:101;1354:258;1305:307;;;:::o;1618:102::-;1659:6;1710:2;1706:7;1701:2;1694:5;1690:14;1686:28;1676:38;;1618:102;;;:::o;1726:364::-;1814:3;1842:39;1875:5;1842:39;:::i;:::-;1897:71;1961:6;1956:3;1897:71;:::i;:::-;1890:78;;1977:52;2022:6;2017:3;2010:4;2003:5;1999:16;1977:52;:::i;:::-;2054:29;2076:6;2054:29;:::i;:::-;2049:3;2045:39;2038:46;;1818:272;1726:364;;;;:::o;2096:313::-;2209:4;2247:2;2236:9;2232:18;2224:26;;2296:9;2290:4;2286:20;2282:1;2271:9;2267:17;2260:47;2324:78;2397:4;2388:6;2324:78;:::i;:::-;2316:86;;2096:313;;;;:::o;2415:126::-;2452:7;2492:42;2485:5;2481:54;2470:65;;2415:126;;;:::o;2547:96::-;2584:7;2613:24;2631:5;2613:24;:::i;:::-;2602:35;;2547:96;;;:::o;2649:122::-;2722:24;2740:5;2722:24;:::i;:::-;2715:5;2712:35;2702:63;;2761:1;2758;2751:12;2702:63;2649:122;:::o;2777:139::-;2823:5;2861:6;2848:20;2839:29;;2877:33;2904:5;2877:33;:::i;:::-;2777:139;;;;:::o;2922:474::-;2990:6;2998;3047:2;3035:9;3026:7;3022:23;3018:32;3015:119;;;3053:79;;:::i;:::-;3015:119;3173:1;3198:53;3243:7;3234:6;3223:9;3219:22;3198:53;:::i;:::-;3188:63;;3144:117;3300:2;3326:53;3371:7;3362:6;3351:9;3347:22;3326:53;:::i;:::-;3316:63;;3271:118;2922:474;;;;;:::o;3402:90::-;3436:7;3479:5;3472:13;3465:21;3454:32;;3402:90;;;:::o;3498:109::-;3579:21;3594:5;3579:21;:::i;:::-;3574:3;3567:34;3498:109;;:::o;3613:210::-;3700:4;3738:2;3727:9;3723:18;3715:26;;3751:65;3813:1;3802:9;3798:17;3789:6;3751:65;:::i;:::-;3613:210;;;;:::o;3829:60::-;3857:3;3878:5;3871:12;;3829:60;;;:::o;3895:142::-;3945:9;3978:53;3996:34;4005:24;4023:5;4005:24;:::i;:::-;3996:34;:::i;:::-;3978:53;:::i;:::-;3965:66;;3895:142;;;:::o;4043:126::-;4093:9;4126:37;4157:5;4126:37;:::i;:::-;4113:50;;4043:126;;;:::o;4175:153::-;4252:9;4285:37;4316:5;4285:37;:::i;:::-;4272:50;;4175:153;;;:::o;4334:185::-;4448:64;4506:5;4448:64;:::i;:::-;4443:3;4436:77;4334:185;;:::o;4525:276::-;4645:4;4683:2;4672:9;4668:18;4660:26;;4696:98;4791:1;4780:9;4776:17;4767:6;4696:98;:::i;:::-;4525:276;;;;:::o;4807:118::-;4894:24;4912:5;4894:24;:::i;:::-;4889:3;4882:37;4807:118;;:::o;4931:222::-;5024:4;5062:2;5051:9;5047:18;5039:26;;5075:71;5143:1;5132:9;5128:17;5119:6;5075:71;:::i;:::-;4931:222;;;;:::o;5159:619::-;5236:6;5244;5252;5301:2;5289:9;5280:7;5276:23;5272:32;5269:119;;;5307:79;;:::i;:::-;5269:119;5427:1;5452:53;5497:7;5488:6;5477:9;5473:22;5452:53;:::i;:::-;5442:63;;5398:117;5554:2;5580:53;5625:7;5616:6;5605:9;5601:22;5580:53;:::i;:::-;5570:63;;5525:118;5682:2;5708:53;5753:7;5744:6;5733:9;5729:22;5708:53;:::i;:::-;5698:63;;5653:118;5159:619;;;;;:::o;5784:118::-;5871:24;5889:5;5871:24;:::i;:::-;5866:3;5859:37;5784:118;;:::o;5908:222::-;6001:4;6039:2;6028:9;6024:18;6016:26;;6052:71;6120:1;6109:9;6105:17;6096:6;6052:71;:::i;:::-;5908:222;;;;:::o;6136:116::-;6206:21;6221:5;6206:21;:::i;:::-;6199:5;6196:32;6186:60;;6242:1;6239;6232:12;6186:60;6136:116;:::o;6258:133::-;6301:5;6339:6;6326:20;6317:29;;6355:30;6379:5;6355:30;:::i;:::-;6258:133;;;;:::o;6397:323::-;6453:6;6502:2;6490:9;6481:7;6477:23;6473:32;6470:119;;;6508:79;;:::i;:::-;6470:119;6628:1;6653:50;6695:7;6686:6;6675:9;6671:22;6653:50;:::i;:::-;6643:60;;6599:114;6397:323;;;;:::o;6726:86::-;6761:7;6801:4;6794:5;6790:16;6779:27;;6726:86;;;:::o;6818:112::-;6901:22;6917:5;6901:22;:::i;:::-;6896:3;6889:35;6818:112;;:::o;6936:214::-;7025:4;7063:2;7052:9;7048:18;7040:26;;7076:67;7140:1;7129:9;7125:17;7116:6;7076:67;:::i;:::-;6936:214;;;;:::o;7156:329::-;7215:6;7264:2;7252:9;7243:7;7239:23;7235:32;7232:119;;;7270:79;;:::i;:::-;7232:119;7390:1;7415:53;7460:7;7451:6;7440:9;7436:22;7415:53;:::i;:::-;7405:63;;7361:117;7156:329;;;;:::o;7491:468::-;7556:6;7564;7613:2;7601:9;7592:7;7588:23;7584:32;7581:119;;;7619:79;;:::i;:::-;7581:119;7739:1;7764:53;7809:7;7800:6;7789:9;7785:22;7764:53;:::i;:::-;7754:63;;7710:117;7866:2;7892:50;7934:7;7925:6;7914:9;7910:22;7892:50;:::i;:::-;7882:60;;7837:115;7491:468;;;;;:::o;7965:474::-;8033:6;8041;8090:2;8078:9;8069:7;8065:23;8061:32;8058:119;;;8096:79;;:::i;:::-;8058:119;8216:1;8241:53;8286:7;8277:6;8266:9;8262:22;8241:53;:::i;:::-;8231:63;;8187:117;8343:2;8369:53;8414:7;8405:6;8394:9;8390:22;8369:53;:::i;:::-;8359:63;;8314:118;7965:474;;;;;:::o;8445:231::-;8585:34;8581:1;8573:6;8569:14;8562:58;8654:14;8649:2;8641:6;8637:15;8630:39;8445:231;:::o;8682:366::-;8824:3;8845:67;8909:2;8904:3;8845:67;:::i;:::-;8838:74;;8921:93;9010:3;8921:93;:::i;:::-;9039:2;9034:3;9030:12;9023:19;;8682:366;;;:::o;9054:419::-;9220:4;9258:2;9247:9;9243:18;9235:26;;9307:9;9301:4;9297:20;9293:1;9282:9;9278:17;9271:47;9335:131;9461:4;9335:131;:::i;:::-;9327:139;;9054:419;;;:::o;9479:180::-;9527:77;9524:1;9517:88;9624:4;9621:1;9614:15;9648:4;9645:1;9638:15;9665:191;9705:4;9725:20;9743:1;9725:20;:::i;:::-;9720:25;;9759:20;9777:1;9759:20;:::i;:::-;9754:25;;9798:1;9795;9792:8;9789:34;;;9803:18;;:::i;:::-;9789:34;9848:1;9845;9841:9;9833:17;;9665:191;;;;:::o;9862:305::-;9902:3;9921:20;9939:1;9921:20;:::i;:::-;9916:25;;9955:20;9973:1;9955:20;:::i;:::-;9950:25;;10109:1;10041:66;10037:74;10034:1;10031:81;10028:107;;;10115:18;;:::i;:::-;10028:107;10159:1;10156;10152:9;10145:16;;9862:305;;;;:::o;10173:180::-;10221:77;10218:1;10211:88;10318:4;10315:1;10308:15;10342:4;10339:1;10332:15;10359:320;10403:6;10440:1;10434:4;10430:12;10420:22;;10487:1;10481:4;10477:12;10508:18;10498:81;;10564:4;10556:6;10552:17;10542:27;;10498:81;10626:2;10618:6;10615:14;10595:18;10592:38;10589:84;;10645:18;;:::i;:::-;10589:84;10410:269;10359:320;;;:::o;10685:227::-;10825:34;10821:1;10813:6;10809:14;10802:58;10894:10;10889:2;10881:6;10877:15;10870:35;10685:227;:::o;10918:366::-;11060:3;11081:67;11145:2;11140:3;11081:67;:::i;:::-;11074:74;;11157:93;11246:3;11157:93;:::i;:::-;11275:2;11270:3;11266:12;11259:19;;10918:366;;;:::o;11290:419::-;11456:4;11494:2;11483:9;11479:18;11471:26;;11543:9;11537:4;11533:20;11529:1;11518:9;11514:17;11507:47;11571:131;11697:4;11571:131;:::i;:::-;11563:139;;11290:419;;;:::o;11715:182::-;11855:34;11851:1;11843:6;11839:14;11832:58;11715:182;:::o;11903:366::-;12045:3;12066:67;12130:2;12125:3;12066:67;:::i;:::-;12059:74;;12142:93;12231:3;12142:93;:::i;:::-;12260:2;12255:3;12251:12;12244:19;;11903:366;;;:::o;12275:419::-;12441:4;12479:2;12468:9;12464:18;12456:26;;12528:9;12522:4;12518:20;12514:1;12503:9;12499:17;12492:47;12556:131;12682:4;12556:131;:::i;:::-;12548:139;;12275:419;;;:::o;12700:181::-;12840:33;12836:1;12828:6;12824:14;12817:57;12700:181;:::o;12887:366::-;13029:3;13050:67;13114:2;13109:3;13050:67;:::i;:::-;13043:74;;13126:93;13215:3;13126:93;:::i;:::-;13244:2;13239:3;13235:12;13228:19;;12887:366;;;:::o;13259:419::-;13425:4;13463:2;13452:9;13448:18;13440:26;;13512:9;13506:4;13502:20;13498:1;13487:9;13483:17;13476:47;13540:131;13666:4;13540:131;:::i;:::-;13532:139;;13259:419;;;:::o;13684:177::-;13824:29;13820:1;13812:6;13808:14;13801:53;13684:177;:::o;13867:366::-;14009:3;14030:67;14094:2;14089:3;14030:67;:::i;:::-;14023:74;;14106:93;14195:3;14106:93;:::i;:::-;14224:2;14219:3;14215:12;14208:19;;13867:366;;;:::o;14239:419::-;14405:4;14443:2;14432:9;14428:18;14420:26;;14492:9;14486:4;14482:20;14478:1;14467:9;14463:17;14456:47;14520:131;14646:4;14520:131;:::i;:::-;14512:139;;14239:419;;;:::o;14664:223::-;14804:34;14800:1;14792:6;14788:14;14781:58;14873:6;14868:2;14860:6;14856:15;14849:31;14664:223;:::o;14893:366::-;15035:3;15056:67;15120:2;15115:3;15056:67;:::i;:::-;15049:74;;15132:93;15221:3;15132:93;:::i;:::-;15250:2;15245:3;15241:12;15234:19;;14893:366;;;:::o;15265:419::-;15431:4;15469:2;15458:9;15454:18;15446:26;;15518:9;15512:4;15508:20;15504:1;15493:9;15489:17;15482:47;15546:131;15672:4;15546:131;:::i;:::-;15538:139;;15265:419;;;:::o;15690:224::-;15830:34;15826:1;15818:6;15814:14;15807:58;15899:7;15894:2;15886:6;15882:15;15875:32;15690:224;:::o;15920:366::-;16062:3;16083:67;16147:2;16142:3;16083:67;:::i;:::-;16076:74;;16159:93;16248:3;16159:93;:::i;:::-;16277:2;16272:3;16268:12;16261:19;;15920:366;;;:::o;16292:419::-;16458:4;16496:2;16485:9;16481:18;16473:26;;16545:9;16539:4;16535:20;16531:1;16520:9;16516:17;16509:47;16573:131;16699:4;16573:131;:::i;:::-;16565:139;;16292:419;;;:::o;16717:225::-;16857:34;16853:1;16845:6;16841:14;16834:58;16926:8;16921:2;16913:6;16909:15;16902:33;16717:225;:::o;16948:366::-;17090:3;17111:67;17175:2;17170:3;17111:67;:::i;:::-;17104:74;;17187:93;17276:3;17187:93;:::i;:::-;17305:2;17300:3;17296:12;17289:19;;16948:366;;;:::o;17320:419::-;17486:4;17524:2;17513:9;17509:18;17501:26;;17573:9;17567:4;17563:20;17559:1;17548:9;17544:17;17537:47;17601:131;17727:4;17601:131;:::i;:::-;17593:139;;17320:419;;;:::o;17745:177::-;17885:29;17881:1;17873:6;17869:14;17862:53;17745:177;:::o;17928:366::-;18070:3;18091:67;18155:2;18150:3;18091:67;:::i;:::-;18084:74;;18167:93;18256:3;18167:93;:::i;:::-;18285:2;18280:3;18276:12;18269:19;;17928:366;;;:::o;18300:419::-;18466:4;18504:2;18493:9;18489:18;18481:26;;18553:9;18547:4;18543:20;18539:1;18528:9;18524:17;18517:47;18581:131;18707:4;18581:131;:::i;:::-;18573:139;;18300:419;;;:::o;18725:180::-;18773:77;18770:1;18763:88;18870:4;18867:1;18860:15;18894:4;18891:1;18884:15;18911:180;18959:77;18956:1;18949:88;19056:4;19053:1;19046:15;19080:4;19077:1;19070:15;19097:233;19136:3;19159:24;19177:5;19159:24;:::i;:::-;19150:33;;19205:66;19198:5;19195:77;19192:103;;19275:18;;:::i;:::-;19192:103;19322:1;19315:5;19311:13;19304:20;;19097:233;;;:::o;19336:348::-;19376:7;19399:20;19417:1;19399:20;:::i;:::-;19394:25;;19433:20;19451:1;19433:20;:::i;:::-;19428:25;;19621:1;19553:66;19549:74;19546:1;19543:81;19538:1;19531:9;19524:17;19520:105;19517:131;;;19628:18;;:::i;:::-;19517:131;19676:1;19673;19669:9;19658:20;;19336:348;;;;:::o;19690:223::-;19830:34;19826:1;19818:6;19814:14;19807:58;19899:6;19894:2;19886:6;19882:15;19875:31;19690:223;:::o;19919:366::-;20061:3;20082:67;20146:2;20141:3;20082:67;:::i;:::-;20075:74;;20158:93;20247:3;20158:93;:::i;:::-;20276:2;20271:3;20267:12;20260:19;;19919:366;;;:::o;20291:419::-;20457:4;20495:2;20484:9;20480:18;20472:26;;20544:9;20538:4;20534:20;20530:1;20519:9;20515:17;20508:47;20572:131;20698:4;20572:131;:::i;:::-;20564:139;;20291:419;;;:::o;20716:221::-;20856:34;20852:1;20844:6;20840:14;20833:58;20925:4;20920:2;20912:6;20908:15;20901:29;20716:221;:::o;20943:366::-;21085:3;21106:67;21170:2;21165:3;21106:67;:::i;:::-;21099:74;;21182:93;21271:3;21182:93;:::i;:::-;21300:2;21295:3;21291:12;21284:19;;20943:366;;;:::o;21315:419::-;21481:4;21519:2;21508:9;21504:18;21496:26;;21568:9;21562:4;21558:20;21554:1;21543:9;21539:17;21532:47;21596:131;21722:4;21596:131;:::i;:::-;21588:139;;21315:419;;;:::o;21740:224::-;21880:34;21876:1;21868:6;21864:14;21857:58;21949:7;21944:2;21936:6;21932:15;21925:32;21740:224;:::o;21970:366::-;22112:3;22133:67;22197:2;22192:3;22133:67;:::i;:::-;22126:74;;22209:93;22298:3;22209:93;:::i;:::-;22327:2;22322:3;22318:12;22311:19;;21970:366;;;:::o;22342:419::-;22508:4;22546:2;22535:9;22531:18;22523:26;;22595:9;22589:4;22585:20;22581:1;22570:9;22566:17;22559:47;22623:131;22749:4;22623:131;:::i;:::-;22615:139;;22342:419;;;:::o;22767:222::-;22907:34;22903:1;22895:6;22891:14;22884:58;22976:5;22971:2;22963:6;22959:15;22952:30;22767:222;:::o;22995:366::-;23137:3;23158:67;23222:2;23217:3;23158:67;:::i;:::-;23151:74;;23234:93;23323:3;23234:93;:::i;:::-;23352:2;23347:3;23343:12;23336:19;;22995:366;;;:::o;23367:419::-;23533:4;23571:2;23560:9;23556:18;23548:26;;23620:9;23614:4;23610:20;23606:1;23595:9;23591:17;23584:47;23648:131;23774:4;23648:131;:::i;:::-;23640:139;;23367:419;;;:::o;23792:228::-;23932:34;23928:1;23920:6;23916:14;23909:58;24001:11;23996:2;23988:6;23984:15;23977:36;23792:228;:::o;24026:366::-;24168:3;24189:67;24253:2;24248:3;24189:67;:::i;:::-;24182:74;;24265:93;24354:3;24265:93;:::i;:::-;24383:2;24378:3;24374:12;24367:19;;24026:366;;;:::o;24398:419::-;24564:4;24602:2;24591:9;24587:18;24579:26;;24651:9;24645:4;24641:20;24637:1;24626:9;24622:17;24615:47;24679:131;24805:4;24679:131;:::i;:::-;24671:139;;24398:419;;;:::o;24823:225::-;24963:34;24959:1;24951:6;24947:14;24940:58;25032:8;25027:2;25019:6;25015:15;25008:33;24823:225;:::o;25054:366::-;25196:3;25217:67;25281:2;25276:3;25217:67;:::i;:::-;25210:74;;25293:93;25382:3;25293:93;:::i;:::-;25411:2;25406:3;25402:12;25395:19;;25054:366;;;:::o;25426:419::-;25592:4;25630:2;25619:9;25615:18;25607:26;;25679:9;25673:4;25669:20;25665:1;25654:9;25650:17;25643:47;25707:131;25833:4;25707:131;:::i;:::-;25699:139;;25426:419;;;:::o;25851:227::-;25991:34;25987:1;25979:6;25975:14;25968:58;26060:10;26055:2;26047:6;26043:15;26036:35;25851:227;:::o;26084:366::-;26226:3;26247:67;26311:2;26306:3;26247:67;:::i;:::-;26240:74;;26323:93;26412:3;26323:93;:::i;:::-;26441:2;26436:3;26432:12;26425:19;;26084:366;;;:::o;26456:419::-;26622:4;26660:2;26649:9;26645:18;26637:26;;26709:9;26703:4;26699:20;26695:1;26684:9;26680:17;26673:47;26737:131;26863:4;26737:131;:::i;:::-;26729:139;;26456:419;;;:::o;26881:220::-;27021:34;27017:1;27009:6;27005:14;26998:58;27090:3;27085:2;27077:6;27073:15;27066:28;26881:220;:::o;27107:366::-;27249:3;27270:67;27334:2;27329:3;27270:67;:::i;:::-;27263:74;;27346:93;27435:3;27346:93;:::i;:::-;27464:2;27459:3;27455:12;27448:19;;27107:366;;;:::o;27479:419::-;27645:4;27683:2;27672:9;27668:18;27660:26;;27732:9;27726:4;27722:20;27718:1;27707:9;27703:17;27696:47;27760:131;27886:4;27760:131;:::i;:::-;27752:139;;27479:419;;;:::o;27904:221::-;28044:34;28040:1;28032:6;28028:14;28021:58;28113:4;28108:2;28100:6;28096:15;28089:29;27904:221;:::o;28131:366::-;28273:3;28294:67;28358:2;28353:3;28294:67;:::i;:::-;28287:74;;28370:93;28459:3;28370:93;:::i;:::-;28488:2;28483:3;28479:12;28472:19;;28131:366;;;:::o;28503:419::-;28669:4;28707:2;28696:9;28692:18;28684:26;;28756:9;28750:4;28746:20;28742:1;28731:9;28727:17;28720:47;28784:131;28910:4;28784:131;:::i;:::-;28776:139;;28503:419;;;:::o;28928:229::-;29068:34;29064:1;29056:6;29052:14;29045:58;29137:12;29132:2;29124:6;29120:15;29113:37;28928:229;:::o;29163:366::-;29305:3;29326:67;29390:2;29385:3;29326:67;:::i;:::-;29319:74;;29402:93;29491:3;29402:93;:::i;:::-;29520:2;29515:3;29511:12;29504:19;;29163:366;;;:::o;29535:419::-;29701:4;29739:2;29728:9;29724:18;29716:26;;29788:9;29782:4;29778:20;29774:1;29763:9;29759:17;29752:47;29816:131;29942:4;29816:131;:::i;:::-;29808:139;;29535:419;;;:::o;29960:180::-;30008:77;30005:1;29998:88;30105:4;30102:1;30095:15;30129:4;30126:1;30119:15;30146:185;30186:1;30203:20;30221:1;30203:20;:::i;:::-;30198:25;;30237:20;30255:1;30237:20;:::i;:::-;30232:25;;30276:1;30266:35;;30281:18;;:::i;:::-;30266:35;30323:1;30320;30316:9;30311:14;;30146:185;;;;:::o;30337:442::-;30486:4;30524:2;30513:9;30509:18;30501:26;;30537:71;30605:1;30594:9;30590:17;30581:6;30537:71;:::i;:::-;30618:72;30686:2;30675:9;30671:18;30662:6;30618:72;:::i;:::-;30700;30768:2;30757:9;30753:18;30744:6;30700:72;:::i;:::-;30337:442;;;;;;:::o;30785:180::-;30833:77;30830:1;30823:88;30930:4;30927:1;30920:15;30954:4;30951:1;30944:15;30971:143;31028:5;31059:6;31053:13;31044:22;;31075:33;31102:5;31075:33;:::i;:::-;30971:143;;;;:::o;31120:351::-;31190:6;31239:2;31227:9;31218:7;31214:23;31210:32;31207:119;;;31245:79;;:::i;:::-;31207:119;31365:1;31390:64;31446:7;31437:6;31426:9;31422:22;31390:64;:::i;:::-;31380:74;;31336:128;31120:351;;;;:::o;31477:85::-;31522:7;31551:5;31540:16;;31477:85;;;:::o;31568:158::-;31626:9;31659:61;31677:42;31686:32;31712:5;31686:32;:::i;:::-;31677:42;:::i;:::-;31659:61;:::i;:::-;31646:74;;31568:158;;;:::o;31732:147::-;31827:45;31866:5;31827:45;:::i;:::-;31822:3;31815:58;31732:147;;:::o;31885:114::-;31952:6;31986:5;31980:12;31970:22;;31885:114;;;:::o;32005:184::-;32104:11;32138:6;32133:3;32126:19;32178:4;32173:3;32169:14;32154:29;;32005:184;;;;:::o;32195:132::-;32262:4;32285:3;32277:11;;32315:4;32310:3;32306:14;32298:22;;32195:132;;;:::o;32333:108::-;32410:24;32428:5;32410:24;:::i;:::-;32405:3;32398:37;32333:108;;:::o;32447:179::-;32516:10;32537:46;32579:3;32571:6;32537:46;:::i;:::-;32615:4;32610:3;32606:14;32592:28;;32447:179;;;;:::o;32632:113::-;32702:4;32734;32729:3;32725:14;32717:22;;32632:113;;;:::o;32781:732::-;32900:3;32929:54;32977:5;32929:54;:::i;:::-;32999:86;33078:6;33073:3;32999:86;:::i;:::-;32992:93;;33109:56;33159:5;33109:56;:::i;:::-;33188:7;33219:1;33204:284;33229:6;33226:1;33223:13;33204:284;;;33305:6;33299:13;33332:63;33391:3;33376:13;33332:63;:::i;:::-;33325:70;;33418:60;33471:6;33418:60;:::i;:::-;33408:70;;33264:224;33251:1;33248;33244:9;33239:14;;33204:284;;;33208:14;33504:3;33497:10;;32905:608;;;32781:732;;;;:::o;33519:831::-;33782:4;33820:3;33809:9;33805:19;33797:27;;33834:71;33902:1;33891:9;33887:17;33878:6;33834:71;:::i;:::-;33915:80;33991:2;33980:9;33976:18;33967:6;33915:80;:::i;:::-;34042:9;34036:4;34032:20;34027:2;34016:9;34012:18;34005:48;34070:108;34173:4;34164:6;34070:108;:::i;:::-;34062:116;;34188:72;34256:2;34245:9;34241:18;34232:6;34188:72;:::i;:::-;34270:73;34338:3;34327:9;34323:19;34314:6;34270:73;:::i;:::-;33519:831;;;;;;;;:::o;34356:483::-;34527:4;34565:2;34554:9;34550:18;34542:26;;34578:71;34646:1;34635:9;34631:17;34622:6;34578:71;:::i;:::-;34696:9;34690:4;34686:20;34681:2;34670:9;34666:18;34659:48;34724:108;34827:4;34818:6;34724:108;:::i;:::-;34716:116;;34356:483;;;;;:::o;34845:807::-;35094:4;35132:3;35121:9;35117:19;35109:27;;35146:71;35214:1;35203:9;35199:17;35190:6;35146:71;:::i;:::-;35227:72;35295:2;35284:9;35280:18;35271:6;35227:72;:::i;:::-;35309:80;35385:2;35374:9;35370:18;35361:6;35309:80;:::i;:::-;35399;35475:2;35464:9;35460:18;35451:6;35399:80;:::i;:::-;35489:73;35557:3;35546:9;35542:19;35533:6;35489:73;:::i;:::-;35572;35640:3;35629:9;35625:19;35616:6;35572:73;:::i;:::-;34845:807;;;;;;;;;:::o;35658:143::-;35715:5;35746:6;35740:13;35731:22;;35762:33;35789:5;35762:33;:::i;:::-;35658:143;;;;:::o;35807:663::-;35895:6;35903;35911;35960:2;35948:9;35939:7;35935:23;35931:32;35928:119;;;35966:79;;:::i;:::-;35928:119;36086:1;36111:64;36167:7;36158:6;36147:9;36143:22;36111:64;:::i;:::-;36101:74;;36057:128;36224:2;36250:64;36306:7;36297:6;36286:9;36282:22;36250:64;:::i;:::-;36240:74;;36195:129;36363:2;36389:64;36445:7;36436:6;36425:9;36421:22;36389:64;:::i;:::-;36379:74;;36334:129;35807:663;;;;;:::o;36476:720::-;36711:4;36749:3;36738:9;36734:19;36726:27;;36763:79;36839:1;36828:9;36824:17;36815:6;36763:79;:::i;:::-;36889:9;36883:4;36879:20;36874:2;36863:9;36859:18;36852:48;36917:108;37020:4;37011:6;36917:108;:::i;:::-;36909:116;;37035:72;37103:2;37092:9;37088:18;37079:6;37035:72;:::i;:::-;37117;37185:2;37174:9;37170:18;37161:6;37117:72;:::i;:::-;36476:720;;;;;;;:::o

Swarm Source

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