Address Details
contract

0x970952D697C313E00f2226ADC7DA55E481FD20af

Contract Name
StarNode
Creator
0x7d6740–c9cfce at 0x02f8b6–6c554e
Balance
0 CELO ( )
Locked CELO Balance
0.00 CELO
Voting CELO Balance
0.00 CELO
Pending Unlocked Gold
0.00 CELO
Tokens
Fetching tokens...
Transactions
0 Transactions
Transfers
0 Transfers
Gas Used
Fetching gas used...
Last Balance Update
8996093
This contract has been verified via Sourcify. View contract in Sourcify repository
Contract name:
StarNode




Optimization enabled
false
Compiler version
v0.8.7+commit.e28d00a7




EVM Version
london




Verified at
2023-02-05T11:28:44.932043Z

contracts/StarNode.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol";
import "@openzeppelin/contracts-upgradeable/utils/math/SafeMathUpgradeable.sol";

interface IStarFarm {
    function regNodeUser(address _user) external;
}

interface IERC20Burnable is IERC20Upgradeable {
    function burnFrom(address account, uint256 amount) external;
}

interface IBonus {
    function getlockRatio() view external returns (uint256);
    function getlockAddress() view external returns (address);
}

interface INFTLogic {
    function setBonusToke(uint256 _tokenId,uint256 _amountBonus) external;
    function getAllTokenId() view external returns (uint256[] memory);
    function disposeBonusToke(uint256 _tokenId) view external returns (uint256);
}

contract StarNode is ContextUpgradeable, OwnableUpgradeable {
    using CountersUpgradeable for CountersUpgradeable.Counter;
    CountersUpgradeable.Counter private _nodeIds;
    using SafeMathUpgradeable for uint256;

    uint256 selfGain;      // self addtional gain 100 = 1%
    uint256 parentGain;    // parent addtional gain 100 = 1%
    uint256 public unitPrice;
    uint256 public leastUnit;
    address public bonusAddr;
    uint256 public fee;
    IBonus private Bonus;
    INFTLogic private NFTLogic;

    struct Node {
        uint256 totalUnit;
        uint256 burn;
        uint256 award;
        uint256 withdraw;
        address owner;
        bytes4 code;
    }

    IERC20Burnable public starToken;
    IStarFarm public starFarm;

    Node[] public nodes;
    mapping(address => uint256) public nodeInfo;
    mapping(address => address) public userInviter;
    mapping(address => address[]) public nodeUsers;

    event SettleNode(address _user, uint256 _amount);

    function initialize(address _starToken, address _bonus, uint256 _selfGain, uint256 _parentGain, uint256 _unitPrice, uint256 _leastUnit) public initializer {
        __StarNode_init(_starToken, _bonus, _selfGain, _parentGain, _unitPrice, _leastUnit);
    }

    function __StarNode_init(address _starToken, address _bonus, uint256 _selfGain, uint256 _parentGain, uint256 _unitPrice, uint256 _leastUnit) internal initializer {
        __Context_init_unchained();
        __Ownable_init_unchained();
        __StarNode_init_unchained(_starToken, _bonus, _selfGain, _parentGain, _unitPrice, _leastUnit);
    }

    function __StarNode_init_unchained(address _starToken, address _bonus, uint256 _selfGain, uint256 _parentGain, uint256 _unitPrice, uint256 _leastUnit) public onlyOwner {
        starToken = IERC20Burnable(_starToken);
        bonusAddr = _bonus;
        Bonus = IBonus(bonusAddr);
        _set(_selfGain, _parentGain, _unitPrice, _leastUnit);
    }

    function _set(uint256 _selfGain, uint256 _parentGain, uint256 _unitPrice, uint256 _leastUnit) internal {
        selfGain = _selfGain;
        parentGain = _parentGain;
        unitPrice = _unitPrice;
        leastUnit = _leastUnit;
    }

    function nodeGain(address _user) external view returns (uint256 _selfGain, uint256 _parentGain) {
        address _inviter = userInviter[_user];
        if (address(0) != _inviter) {
            return (selfGain, parentGain);
        }else{
            return (0, 0);
        }
    }

    function nodeLength() public view returns (uint256) {
        return nodes.length;
    }

    function nodeUserLength(address _user) public view returns (uint256) {
        return nodeUsers[_user].length;
    }

    function depositNode(uint256 _unit) external {
        address _user = _msgSender();
        require(userInviter[_user] == address(0), "User must not node user");
        require(_unit > 0, "Uint must greater than 0");
        uint256 _amount = _unit.mul(unitPrice);
        // burn
        starToken.burnFrom(_user, _amount.mul(100 - fee).div(100));
        if (nodes.length == 0 || nodes[nodeInfo[_user]].owner != _user) {    // New node.
            require(_unit >= leastUnit, "Less than minimum limit");
            nodes.push(Node(_unit, _amount, 0, 0, _user, getRndId(_user)));
            nodeInfo[_user] = nodes.length - 1;
            uint256 lockRatio = Bonus.getlockRatio();
            address lockAddr = Bonus.getlockAddress();
            starToken.transfer(lockAddr,_amount.mul(fee).div(100).mul(lockRatio).div(100));
            uint256 amountBonus = _amount.mul(fee).div(100).mul(100 - lockRatio).div(100);
            starToken.transfer(bonusAddr,amountBonus);
            uint256 indexLength = NFTLogic.getAllTokenId().length;
            if(indexLength > 0){
                uint256 divAmountBonus = amountBonus.mul(1e12).div(indexLength);
                for(uint256 i = 0;i< indexLength;i++){
                    uint256 tokenId = NFTLogic.getAllTokenId()[i];
                    uint256 UserBonusToken = NFTLogic.disposeBonusToke(tokenId);
                    NFTLogic.setBonusToke(tokenId,divAmountBonus.div(1e12).add(UserBonusToken));
                }
            }
        } else {
            Node storage node =  nodes[nodeInfo[_user]];
            node.totalUnit = node.totalUnit.add(_unit);
            node.burn = node.burn.add(_amount);
        }
    }

    function regFromNode(address _inviter, bytes32 _inviteCode) external {
        address _user = _msgSender();
        require(userInviter[_user] == address(0), "User already registered");
        require(nodeInfo[_user] == 0 && nodes[0].owner != _user, "You are node master");
        require(nodeUserLength(_inviter) < nodes[nodeInfo[_inviter]].totalUnit, 'Parent node is full');
        require(verifyInvitecode(_user, _inviter, _inviteCode), "Invalid invite code");

        nodeUsers[_inviter].push(_user);
        userInviter[_user] = _inviter;
        starFarm.regNodeUser(_user);
    }

    function settleNode(address _user, uint256 _amount) external onlyStarFarm {
        address _inviter = userInviter[_user];
        if (address(0) != _inviter) {
            nodes[nodeInfo[_inviter]].award = nodes[nodeInfo[_inviter]].award.add(_amount);
            emit SettleNode(_inviter, _amount);
        }
    }

    function withdraw(uint256 _amount) external {
        // require(nodeInfo[_msgSender()] != 0);
        require(nodes[nodeInfo[_msgSender()]].owner == _msgSender(), "Invalid inviter");
        Node storage node =  nodes[nodeInfo[_msgSender()]];
        require(node.award > node.withdraw && _amount <= node.award - node.withdraw, "Award amount not enough");
        node.withdraw = node.withdraw.add(_amount);
        starToken.transfer(_msgSender(), _amount);
    }

    function getRndId(address _user) internal view returns (bytes4){
        bytes4 _randId = bytes4(keccak256(abi.encodePacked(block.coinbase, block.timestamp, _user)));
        return _randId;
    }

    function verifyInvitecode(address _self, address _inviter, bytes32 _inviteCode) internal view returns (bool _verified) {
        require(nodes[nodeInfo[_inviter]].owner == _inviter, "Invalid inviter");
        // require(nodeInfo[_inviter] != 0, "Invalid inviter");
        if (_inviteCode == keccak256(abi.encodePacked(nodes[nodeInfo[_inviter]].code, _self))) return true;
    }

    function setStarFarm(address _addr) public onlyOwner {
        require(address(0) != _addr, "Farm contract address cannot be empty");
        starFarm = IStarFarm(_addr);
    }

    function setStarToken(address _starToken) public onlyOwner {
        require(address(0) != _starToken, "Farm contract address cannot be empty");
        starToken = IERC20Burnable(_starToken);
    }

    function setBonusAddr(address _bonusAddr) public onlyOwner {
        require(address(0) != _bonusAddr, "Farm contract address cannot be empty");
        bonusAddr = _bonusAddr;
        Bonus = IBonus(bonusAddr);
    }

    function setNFTLogic(address _NFTLogic) onlyOwner public {
        require(_NFTLogic != address(0), "");
        NFTLogic = INFTLogic(_NFTLogic);
    }

    function setParams(uint256 _selfGain, uint256 _parentGain, uint256 _unitPrice, uint256 _leastUnit) public onlyOwner {
        _set(_selfGain, _parentGain, _unitPrice, _leastUnit);
    }

    function setFee(uint256 _fee) public onlyOwner {
        fee = _fee;
    }

    modifier onlyStarFarm() {
        require(_msgSender() == address(starFarm), "Only allowed from starfarm contract");
        _;
    }
}
        

/_openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/ContextUpgradeable.sol";
import "../proxy/utils/Initializable.sol";

/**
 * @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 OwnableUpgradeable is Initializable, ContextUpgradeable {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    function __Ownable_init() internal onlyInitializing {
        __Context_init_unchained();
        __Ownable_init_unchained();
    }

    function __Ownable_init_unchained() internal onlyInitializing {
        _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);
    }
    uint256[49] private __gap;
}
          

/_openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (proxy/utils/Initializable.sol)

pragma solidity ^0.8.0;

import "../../utils/AddressUpgradeable.sol";

/**
 * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
 * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an
 * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
 * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
 *
 * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
 * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
 *
 * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
 * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
 *
 * [CAUTION]
 * ====
 * Avoid leaving a contract uninitialized.
 *
 * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation
 * contract, which may impact the proxy. To initialize the implementation contract, you can either invoke the
 * initializer manually, or you can include a constructor to automatically mark it as initialized when it is deployed:
 *
 * [.hljs-theme-light.nopadding]
 * ```
 * /// @custom:oz-upgrades-unsafe-allow constructor
 * constructor() initializer {}
 * ```
 * ====
 */
abstract contract Initializable {
    /**
     * @dev Indicates that the contract has been initialized.
     */
    bool private _initialized;

    /**
     * @dev Indicates that the contract is in the process of being initialized.
     */
    bool private _initializing;

    /**
     * @dev Modifier to protect an initializer function from being invoked twice.
     */
    modifier initializer() {
        // If the contract is initializing we ignore whether _initialized is set in order to support multiple
        // inheritance patterns, but we only do this in the context of a constructor, because in other contexts the
        // contract may have been reentered.
        require(_initializing ? _isConstructor() : !_initialized, "Initializable: contract is already initialized");

        bool isTopLevelCall = !_initializing;
        if (isTopLevelCall) {
            _initializing = true;
            _initialized = true;
        }

        _;

        if (isTopLevelCall) {
            _initializing = false;
        }
    }

    /**
     * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the
     * {initializer} modifier, directly or indirectly.
     */
    modifier onlyInitializing() {
        require(_initializing, "Initializable: contract is not initializing");
        _;
    }

    function _isConstructor() private view returns (bool) {
        return !AddressUpgradeable.isContract(address(this));
    }
}
          

/_openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

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

/_openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library AddressUpgradeable {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 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 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);
            }
        }
    }
}
          

/_openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;
import "../proxy/utils/Initializable.sol";

/**
 * @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 ContextUpgradeable is Initializable {
    function __Context_init() internal onlyInitializing {
        __Context_init_unchained();
    }

    function __Context_init_unchained() internal onlyInitializing {
    }
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
    uint256[50] private __gap;
}
          

/_openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library CountersUpgradeable {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}
          

/_openzeppelin/contracts-upgradeable/utils/math/SafeMathUpgradeable.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

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

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

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

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

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

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

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

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

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

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

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

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

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}
          

Contract ABI

[{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"SettleNode","inputs":[{"type":"address","name":"_user","internalType":"address","indexed":false},{"type":"uint256","name":"_amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"__StarNode_init_unchained","inputs":[{"type":"address","name":"_starToken","internalType":"address"},{"type":"address","name":"_bonus","internalType":"address"},{"type":"uint256","name":"_selfGain","internalType":"uint256"},{"type":"uint256","name":"_parentGain","internalType":"uint256"},{"type":"uint256","name":"_unitPrice","internalType":"uint256"},{"type":"uint256","name":"_leastUnit","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"bonusAddr","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"depositNode","inputs":[{"type":"uint256","name":"_unit","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"fee","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"initialize","inputs":[{"type":"address","name":"_starToken","internalType":"address"},{"type":"address","name":"_bonus","internalType":"address"},{"type":"uint256","name":"_selfGain","internalType":"uint256"},{"type":"uint256","name":"_parentGain","internalType":"uint256"},{"type":"uint256","name":"_unitPrice","internalType":"uint256"},{"type":"uint256","name":"_leastUnit","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"leastUnit","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"_selfGain","internalType":"uint256"},{"type":"uint256","name":"_parentGain","internalType":"uint256"}],"name":"nodeGain","inputs":[{"type":"address","name":"_user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"nodeInfo","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"nodeLength","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"nodeUserLength","inputs":[{"type":"address","name":"_user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"nodeUsers","inputs":[{"type":"address","name":"","internalType":"address"},{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"totalUnit","internalType":"uint256"},{"type":"uint256","name":"burn","internalType":"uint256"},{"type":"uint256","name":"award","internalType":"uint256"},{"type":"uint256","name":"withdraw","internalType":"uint256"},{"type":"address","name":"owner","internalType":"address"},{"type":"bytes4","name":"code","internalType":"bytes4"}],"name":"nodes","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"regFromNode","inputs":[{"type":"address","name":"_inviter","internalType":"address"},{"type":"bytes32","name":"_inviteCode","internalType":"bytes32"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setBonusAddr","inputs":[{"type":"address","name":"_bonusAddr","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setFee","inputs":[{"type":"uint256","name":"_fee","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setNFTLogic","inputs":[{"type":"address","name":"_NFTLogic","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setParams","inputs":[{"type":"uint256","name":"_selfGain","internalType":"uint256"},{"type":"uint256","name":"_parentGain","internalType":"uint256"},{"type":"uint256","name":"_unitPrice","internalType":"uint256"},{"type":"uint256","name":"_leastUnit","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setStarFarm","inputs":[{"type":"address","name":"_addr","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setStarToken","inputs":[{"type":"address","name":"_starToken","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"settleNode","inputs":[{"type":"address","name":"_user","internalType":"address"},{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IStarFarm"}],"name":"starFarm","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IERC20Burnable"}],"name":"starToken","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"unitPrice","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"userInviter","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdraw","inputs":[{"type":"uint256","name":"_amount","internalType":"uint256"}]}]
              

Contract Creation Code

0x608060405234801561001057600080fd5b50613e67806100206000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c806386489ba9116100f9578063bc15c28711610097578063e73faa2d11610071578063e73faa2d146104cd578063f2fde38b146104eb578063fc1d7a6514610507578063fdaa621c14610537576101c4565b8063bc15c28714610473578063cabf3e5114610491578063ddca3f43146104af576101c4565b806391375f59116100d357806391375f5914610401578063986f33e01461041d578063ae3c189d14610439578063b7ca51e814610455576101c4565b806386489ba9146103975780638da5cb5b146103b3578063911098d5146103d1576101c4565b80633f9fd1841161016657806369fe0e2d1161014057806369fe0e2d146103395780636ba1299a14610355578063715018a6146103715780637ece45e81461037b576101c4565b80633f9fd184146102bc5780635915c05d146102ed578063634f94191461031d576101c4565b806327bd26b1116101a257806327bd26b11461024c5780632e1a7d4d14610268578063334d491d1461028457806337ef75c8146102a0576101c4565b806313eaabb8146101c95780631c53c280146101e757806323c2e2bc1461021c575b600080fd5b6101d1610555565b6040516101de919061338d565b60405180910390f35b61020160048036038101906101fc9190612f8c565b61057b565b6040516102139695949392919061364b565b60405180910390f35b61023660048036038101906102319190612daf565b6105f4565b6040516102439190613607565b60405180910390f35b61026660048036038101906102619190612e96565b61060c565b005b610282600480360381019061027d9190612f8c565b610a8e565b005b61029e60048036038101906102999190612daf565b610d3d565b005b6102ba60048036038101906102b59190612daf565b610e6d565b005b6102d660048036038101906102d19190612daf565b610f9d565b6040516102e4929190613622565b60405180910390f35b61030760048036038101906103029190612ed6565b611056565b604051610314919061338d565b60405180910390f35b61033760048036038101906103329190612f8c565b6110a4565b005b610353600480360381019061034e9190612f8c565b611c7f565b005b61036f600480360381019061036a9190612daf565b611d05565b005b610379611e98565b005b61039560048036038101906103909190612fe6565b611f20565b005b6103b160048036038101906103ac9190612e09565b611fae565b005b6103bb6120a6565b6040516103c8919061338d565b60405180910390f35b6103eb60048036038101906103e69190612daf565b6120d0565b6040516103f8919061338d565b60405180910390f35b61041b60048036038101906104169190612e09565b612103565b005b61043760048036038101906104329190612ed6565b612278565b005b610453600480360381019061044e9190612daf565b6124c5565b005b61045d6125f5565b60405161046a91906133d1565b60405180910390f35b61047b61261b565b6040516104889190613607565b60405180910390f35b610499612621565b6040516104a69190613607565b60405180910390f35b6104b761262e565b6040516104c49190613607565b60405180910390f35b6104d5612634565b6040516104e29190613607565b60405180910390f35b61050560048036038101906105009190612daf565b61263a565b005b610521600480360381019061051c9190612daf565b612732565b60405161052e9190613607565b60405180910390f35b61053f61277e565b60405161054c91906133ec565b60405180910390f35b606a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6070818154811061058b57600080fd5b90600052602060002090600502016000915090508060000154908060010154908060020154908060030154908060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060040160149054906101000a900460e01b905086565b60716020528060005260406000206000915090505481565b60006106166127a4565b9050600073ffffffffffffffffffffffffffffffffffffffff16607260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146106e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106dd90613507565b60405180910390fd5b6000607160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541480156107a757508073ffffffffffffffffffffffffffffffffffffffff16607060008154811061075c5761075b613a1d565b5b906000526020600020906005020160040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b6107e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107dd906134a7565b60405180910390fd5b6070607160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548154811061083957610838613a1d565b5b90600052602060002090600502016000015461085484612732565b10610894576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088b90613527565b60405180910390fd5b61089f8184846127ac565b6108de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d5906135c7565b60405180910390fd5b607360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082607260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550606f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166355ab356e826040518263ffffffff1660e01b8152600401610a57919061338d565b600060405180830381600087803b158015610a7157600080fd5b505af1158015610a85573d6000803e3d6000fd5b50505050505050565b610a966127a4565b73ffffffffffffffffffffffffffffffffffffffff16607060716000610aba6127a4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481548110610b0657610b05613a1d565b5b906000526020600020906005020160040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b85906134e7565b60405180910390fd5b6000607060716000610b9e6127a4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481548110610bea57610be9613a1d565b5b9060005260206000209060050201905080600301548160020154118015610c24575080600301548160020154610c2091906137ef565b8211155b610c63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5a90613407565b60405180910390fd5b610c7a82826003015461295290919063ffffffff16565b8160030181905550606e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb610cc86127a4565b846040518363ffffffff1660e01b8152600401610ce69291906133a8565b602060405180830381600087803b158015610d0057600080fd5b505af1158015610d14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d389190612f5f565b505050565b610d456127a4565b73ffffffffffffffffffffffffffffffffffffffff16610d636120a6565b73ffffffffffffffffffffffffffffffffffffffff1614610db9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db0906134c7565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff161415610e29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e20906135a7565b60405180910390fd5b80606e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610e756127a4565b73ffffffffffffffffffffffffffffffffffffffff16610e936120a6565b73ffffffffffffffffffffffffffffffffffffffff1614610ee9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee0906134c7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5090613547565b60405180910390fd5b80606d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806000607260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff1614611048576066546067549250925050611051565b60008092509250505b915091565b6073602052816000526040600020818154811061107257600080fd5b906000526020600020016000915091509054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006110ae6127a4565b9050600073ffffffffffffffffffffffffffffffffffffffff16607260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461117e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117590613487565b60405180910390fd5b600082116111c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b8906135e7565b60405180910390fd5b60006111d86068548461296890919063ffffffff16565b9050606e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166379cc67908361124d606461123f606b54606461123091906137ef565b8761296890919063ffffffff16565b61297e90919063ffffffff16565b6040518363ffffffff1660e01b815260040161126a9291906133a8565b600060405180830381600087803b15801561128457600080fd5b505af1158015611298573d6000803e3d6000fd5b505050506000607080549050148061136057508173ffffffffffffffffffffffffffffffffffffffff166070607160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548154811061131557611314613a1d565b5b906000526020600020906005020160040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b15611bd5576069548310156113aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a190613587565b60405180910390fd5b60706040518060c0016040528085815260200183815260200160008152602001600081526020018473ffffffffffffffffffffffffffffffffffffffff1681526020016113f685612994565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681525090806001815401808255809150506001900390600052602060002090600502016000909190919091506000820151816000015560208201518160010155604082015181600201556060820151816003015560808201518160040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060a08201518160040160146101000a81548163ffffffff021916908360e01c0217905550505060016070805490506114e891906137ef565b607160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000606c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340ee7ce26040518163ffffffff1660e01b815260040160206040518083038186803b15801561159557600080fd5b505afa1580156115a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115cd9190612fb9565b90506000606c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638b6e15e56040518163ffffffff1660e01b815260040160206040518083038186803b15801561163957600080fd5b505afa15801561164d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116719190612ddc565b9050606e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb826116ff60646116f1876116e360646116d5606b548d61296890919063ffffffff16565b61297e90919063ffffffff16565b61296890919063ffffffff16565b61297e90919063ffffffff16565b6040518363ffffffff1660e01b815260040161171c9291906133a8565b602060405180830381600087803b15801561173657600080fd5b505af115801561174a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061176e9190612f5f565b5060006117ca60646117bc85606461178691906137ef565b6117ae60646117a0606b548b61296890919063ffffffff16565b61297e90919063ffffffff16565b61296890919063ffffffff16565b61297e90919063ffffffff16565b9050606e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb606a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b815260040161184b9291906133a8565b602060405180830381600087803b15801561186557600080fd5b505af1158015611879573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061189d9190612f5f565b506000606d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663047640896040518163ffffffff1660e01b815260040160006040518083038186803b15801561190857600080fd5b505afa15801561191c573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906119459190612f16565b5190506000811115611bcc57600061197d8261196f64e8d4a510008661296890919063ffffffff16565b61297e90919063ffffffff16565b905060005b82811015611bc9576000606d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663047640896040518163ffffffff1660e01b815260040160006040518083038186803b1580156119f457600080fd5b505afa158015611a08573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611a319190612f16565b8281518110611a4357611a42613a1d565b5b602002602001015190506000606d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c9f09b9c836040518263ffffffff1660e01b8152600401611aaa9190613607565b60206040518083038186803b158015611ac257600080fd5b505afa158015611ad6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611afa9190612fb9565b9050606d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631e2f291283611b6584611b5764e8d4a510008a61297e90919063ffffffff16565b61295290919063ffffffff16565b6040518363ffffffff1660e01b8152600401611b82929190613622565b600060405180830381600087803b158015611b9c57600080fd5b505af1158015611bb0573d6000803e3d6000fd5b5050505050508080611bc19061392c565b915050611982565b50505b50505050611c7a565b60006070607160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481548110611c2a57611c29613a1d565b5b90600052602060002090600502019050611c5184826000015461295290919063ffffffff16565b8160000181905550611c7082826001015461295290919063ffffffff16565b8160010181905550505b505050565b611c876127a4565b73ffffffffffffffffffffffffffffffffffffffff16611ca56120a6565b73ffffffffffffffffffffffffffffffffffffffff1614611cfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf2906134c7565b60405180910390fd5b80606b8190555050565b611d0d6127a4565b73ffffffffffffffffffffffffffffffffffffffff16611d2b6120a6565b73ffffffffffffffffffffffffffffffffffffffff1614611d81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d78906134c7565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff161415611df1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de8906135a7565b60405180910390fd5b80606a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550606a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16606c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611ea06127a4565b73ffffffffffffffffffffffffffffffffffffffff16611ebe6120a6565b73ffffffffffffffffffffffffffffffffffffffff1614611f14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0b906134c7565b60405180910390fd5b611f1e60006129cd565b565b611f286127a4565b73ffffffffffffffffffffffffffffffffffffffff16611f466120a6565b73ffffffffffffffffffffffffffffffffffffffff1614611f9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f93906134c7565b60405180910390fd5b611fa884848484612a93565b50505050565b600060019054906101000a900460ff16611fd65760008054906101000a900460ff1615611fdf565b611fde612ab5565b5b61201e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201590613467565b60405180910390fd5b60008060019054906101000a900460ff16159050801561206e576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b61207c878787878787612ac6565b801561209d5760008060016101000a81548160ff0219169083151502179055505b50505050505050565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60726020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61210b6127a4565b73ffffffffffffffffffffffffffffffffffffffff166121296120a6565b73ffffffffffffffffffffffffffffffffffffffff161461217f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612176906134c7565b60405180910390fd5b85606e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084606a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550606a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16606c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061227084848484612a93565b505050505050565b606f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166122b96127a4565b73ffffffffffffffffffffffffffffffffffffffff161461230f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230690613447565b60405180910390fd5b6000607260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff16146124c05761241e826070607160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054815481106123fe576123fd613a1d565b5b90600052602060002090600502016002015461295290919063ffffffff16565b6070607160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548154811061247157612470613a1d565b5b9060005260206000209060050201600201819055507fd304fddcfb4c823513457b3a75ae8e137f506c2a81f5716fab3b268c7ed6c00881836040516124b79291906133a8565b60405180910390a15b505050565b6124cd6127a4565b73ffffffffffffffffffffffffffffffffffffffff166124eb6120a6565b73ffffffffffffffffffffffffffffffffffffffff1614612541576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612538906134c7565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff1614156125b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a8906135a7565b60405180910390fd5b80606f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60695481565b6000607080549050905090565b606b5481565b60685481565b6126426127a4565b73ffffffffffffffffffffffffffffffffffffffff166126606120a6565b73ffffffffffffffffffffffffffffffffffffffff16146126b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ad906134c7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612726576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271d90613427565b60405180910390fd5b61272f816129cd565b50565b6000607360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050919050565b606f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600033905090565b60008273ffffffffffffffffffffffffffffffffffffffff166070607160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548154811061281857612817613a1d565b5b906000526020600020906005020160040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146128a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612897906134e7565b60405180910390fd5b6070607160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054815481106128f3576128f2613a1d565b5b906000526020600020906005020160040160149054906101000a900460e01b84604051602001612924929190613361565b6040516020818303038152906040528051906020012082141561294a576001905061294b565b5b9392505050565b60008183612960919061370e565b905092915050565b600081836129769190613795565b905092915050565b6000818361298c9190613764565b905092915050565b6000804142846040516020016129ac93929190613324565b60405160208183030381529060405280519060200120905080915050919050565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081603360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8360668190555082606781905550816068819055508060698190555050505050565b6000612ac030612bce565b15905090565b600060019054906101000a900460ff16612aee5760008054906101000a900460ff1615612af7565b612af6612ab5565b5b612b36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b2d90613467565b60405180910390fd5b60008060019054906101000a900460ff161590508015612b86576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b612b8e612be1565b612b96612c32565b612ba4878787878787612103565b8015612bc55760008060016101000a81548160ff0219169083151502179055505b50505050505050565b600080823b905060008111915050919050565b600060019054906101000a900460ff16612c30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2790613567565b60405180910390fd5b565b600060019054906101000a900460ff16612c81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c7890613567565b60405180910390fd5b612c91612c8c6127a4565b6129cd565b565b6000612ca6612ca1846136d1565b6136ac565b90508083825260208201905082856020860282011115612cc957612cc8613a80565b5b60005b85811015612cf95781612cdf8882612d9a565b845260208401935060208301925050600181019050612ccc565b5050509392505050565b600081359050612d1281613dd5565b92915050565b600081519050612d2781613dd5565b92915050565b600082601f830112612d4257612d41613a7b565b5b8151612d52848260208601612c93565b91505092915050565b600081519050612d6a81613dec565b92915050565b600081359050612d7f81613e03565b92915050565b600081359050612d9481613e1a565b92915050565b600081519050612da981613e1a565b92915050565b600060208284031215612dc557612dc4613a8a565b5b6000612dd384828501612d03565b91505092915050565b600060208284031215612df257612df1613a8a565b5b6000612e0084828501612d18565b91505092915050565b60008060008060008060c08789031215612e2657612e25613a8a565b5b6000612e3489828a01612d03565b9650506020612e4589828a01612d03565b9550506040612e5689828a01612d85565b9450506060612e6789828a01612d85565b9350506080612e7889828a01612d85565b92505060a0612e8989828a01612d85565b9150509295509295509295565b60008060408385031215612ead57612eac613a8a565b5b6000612ebb85828601612d03565b9250506020612ecc85828601612d70565b9150509250929050565b60008060408385031215612eed57612eec613a8a565b5b6000612efb85828601612d03565b9250506020612f0c85828601612d85565b9150509250929050565b600060208284031215612f2c57612f2b613a8a565b5b600082015167ffffffffffffffff811115612f4a57612f49613a85565b5b612f5684828501612d2d565b91505092915050565b600060208284031215612f7557612f74613a8a565b5b6000612f8384828501612d5b565b91505092915050565b600060208284031215612fa257612fa1613a8a565b5b6000612fb084828501612d85565b91505092915050565b600060208284031215612fcf57612fce613a8a565b5b6000612fdd84828501612d9a565b91505092915050565b6000806000806080858703121561300057612fff613a8a565b5b600061300e87828801612d85565b945050602061301f87828801612d85565b935050604061303087828801612d85565b925050606061304187828801612d85565b91505092959194509250565b61305e61305982613835565b613987565b82525050565b61306d81613823565b82525050565b61308461307f82613823565b613975565b82525050565b6130938161385d565b82525050565b6130aa6130a58261385d565b613999565b82525050565b6130b9816138b3565b82525050565b6130c8816138c5565b82525050565b60006130db6017836136fd565b91506130e682613aad565b602082019050919050565b60006130fe6026836136fd565b915061310982613ad6565b604082019050919050565b60006131216023836136fd565b915061312c82613b25565b604082019050919050565b6000613144602e836136fd565b915061314f82613b74565b604082019050919050565b60006131676017836136fd565b915061317282613bc3565b602082019050919050565b600061318a6013836136fd565b915061319582613bec565b602082019050919050565b60006131ad6020836136fd565b91506131b882613c15565b602082019050919050565b60006131d0600f836136fd565b91506131db82613c3e565b602082019050919050565b60006131f36017836136fd565b91506131fe82613c67565b602082019050919050565b60006132166013836136fd565b915061322182613c90565b602082019050919050565b60006132396000836136fd565b915061324482613cb9565b600082019050919050565b600061325c602b836136fd565b915061326782613cbc565b604082019050919050565b600061327f6017836136fd565b915061328a82613d0b565b602082019050919050565b60006132a26025836136fd565b91506132ad82613d34565b604082019050919050565b60006132c56013836136fd565b91506132d082613d83565b602082019050919050565b60006132e86018836136fd565b91506132f382613dac565b602082019050919050565b613307816138a9565b82525050565b61331e613319826138a9565b6139b5565b82525050565b6000613330828661304d565b601482019150613340828561330d565b6020820191506133508284613073565b601482019150819050949350505050565b600061336d8285613099565b60048201915061337d8284613073565b6014820191508190509392505050565b60006020820190506133a26000830184613064565b92915050565b60006040820190506133bd6000830185613064565b6133ca60208301846132fe565b9392505050565b60006020820190506133e660008301846130b0565b92915050565b600060208201905061340160008301846130bf565b92915050565b60006020820190508181036000830152613420816130ce565b9050919050565b60006020820190508181036000830152613440816130f1565b9050919050565b6000602082019050818103600083015261346081613114565b9050919050565b6000602082019050818103600083015261348081613137565b9050919050565b600060208201905081810360008301526134a08161315a565b9050919050565b600060208201905081810360008301526134c08161317d565b9050919050565b600060208201905081810360008301526134e0816131a0565b9050919050565b60006020820190508181036000830152613500816131c3565b9050919050565b60006020820190508181036000830152613520816131e6565b9050919050565b6000602082019050818103600083015261354081613209565b9050919050565b600060208201905081810360008301526135608161322c565b9050919050565b600060208201905081810360008301526135808161324f565b9050919050565b600060208201905081810360008301526135a081613272565b9050919050565b600060208201905081810360008301526135c081613295565b9050919050565b600060208201905081810360008301526135e0816132b8565b9050919050565b60006020820190508181036000830152613600816132db565b9050919050565b600060208201905061361c60008301846132fe565b92915050565b600060408201905061363760008301856132fe565b61364460208301846132fe565b9392505050565b600060c08201905061366060008301896132fe565b61366d60208301886132fe565b61367a60408301876132fe565b61368760608301866132fe565b6136946080830185613064565b6136a160a083018461308a565b979650505050505050565b60006136b66136c7565b90506136c282826138fb565b919050565b6000604051905090565b600067ffffffffffffffff8211156136ec576136eb613a4c565b5b602082029050602081019050919050565b600082825260208201905092915050565b6000613719826138a9565b9150613724836138a9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613759576137586139bf565b5b828201905092915050565b600061376f826138a9565b915061377a836138a9565b92508261378a576137896139ee565b5b828204905092915050565b60006137a0826138a9565b91506137ab836138a9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156137e4576137e36139bf565b5b828202905092915050565b60006137fa826138a9565b9150613805836138a9565b925082821015613818576138176139bf565b5b828203905092915050565b600061382e82613889565b9050919050565b600061384082613889565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006138be826138d7565b9050919050565b60006138d0826138d7565b9050919050565b60006138e2826138e9565b9050919050565b60006138f482613889565b9050919050565b61390482613a8f565b810181811067ffffffffffffffff8211171561392357613922613a4c565b5b80604052505050565b6000613937826138a9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561396a576139696139bf565b5b600182019050919050565b6000613980826139a3565b9050919050565b6000613992826139a3565b9050919050565b6000819050919050565b60006139ae82613aa0565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f417761726420616d6f756e74206e6f7420656e6f756768000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4f6e6c7920616c6c6f7765642066726f6d20737461726661726d20636f6e747260008201527f6163740000000000000000000000000000000000000000000000000000000000602082015250565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b7f55736572206d757374206e6f74206e6f64652075736572000000000000000000600082015250565b7f596f7520617265206e6f6465206d617374657200000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f496e76616c696420696e76697465720000000000000000000000000000000000600082015250565b7f5573657220616c72656164792072656769737465726564000000000000000000600082015250565b7f506172656e74206e6f64652069732066756c6c00000000000000000000000000600082015250565b50565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960008201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b7f4c657373207468616e206d696e696d756d206c696d6974000000000000000000600082015250565b7f4661726d20636f6e747261637420616464726573732063616e6e6f742062652060008201527f656d707479000000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c696420696e7669746520636f646500000000000000000000000000600082015250565b7f55696e74206d7573742067726561746572207468616e20300000000000000000600082015250565b613dde81613823565b8114613de957600080fd5b50565b613df581613847565b8114613e0057600080fd5b50565b613e0c81613853565b8114613e1757600080fd5b50565b613e23816138a9565b8114613e2e57600080fd5b5056fea2646970667358221220d99ca17f5a36fcd234ea2a5fe526af865a24d656fc6400c703bc66d15feee6a564736f6c63430008070033

Deployed ByteCode

0x608060405234801561001057600080fd5b50600436106101c45760003560e01c806386489ba9116100f9578063bc15c28711610097578063e73faa2d11610071578063e73faa2d146104cd578063f2fde38b146104eb578063fc1d7a6514610507578063fdaa621c14610537576101c4565b8063bc15c28714610473578063cabf3e5114610491578063ddca3f43146104af576101c4565b806391375f59116100d357806391375f5914610401578063986f33e01461041d578063ae3c189d14610439578063b7ca51e814610455576101c4565b806386489ba9146103975780638da5cb5b146103b3578063911098d5146103d1576101c4565b80633f9fd1841161016657806369fe0e2d1161014057806369fe0e2d146103395780636ba1299a14610355578063715018a6146103715780637ece45e81461037b576101c4565b80633f9fd184146102bc5780635915c05d146102ed578063634f94191461031d576101c4565b806327bd26b1116101a257806327bd26b11461024c5780632e1a7d4d14610268578063334d491d1461028457806337ef75c8146102a0576101c4565b806313eaabb8146101c95780631c53c280146101e757806323c2e2bc1461021c575b600080fd5b6101d1610555565b6040516101de919061338d565b60405180910390f35b61020160048036038101906101fc9190612f8c565b61057b565b6040516102139695949392919061364b565b60405180910390f35b61023660048036038101906102319190612daf565b6105f4565b6040516102439190613607565b60405180910390f35b61026660048036038101906102619190612e96565b61060c565b005b610282600480360381019061027d9190612f8c565b610a8e565b005b61029e60048036038101906102999190612daf565b610d3d565b005b6102ba60048036038101906102b59190612daf565b610e6d565b005b6102d660048036038101906102d19190612daf565b610f9d565b6040516102e4929190613622565b60405180910390f35b61030760048036038101906103029190612ed6565b611056565b604051610314919061338d565b60405180910390f35b61033760048036038101906103329190612f8c565b6110a4565b005b610353600480360381019061034e9190612f8c565b611c7f565b005b61036f600480360381019061036a9190612daf565b611d05565b005b610379611e98565b005b61039560048036038101906103909190612fe6565b611f20565b005b6103b160048036038101906103ac9190612e09565b611fae565b005b6103bb6120a6565b6040516103c8919061338d565b60405180910390f35b6103eb60048036038101906103e69190612daf565b6120d0565b6040516103f8919061338d565b60405180910390f35b61041b60048036038101906104169190612e09565b612103565b005b61043760048036038101906104329190612ed6565b612278565b005b610453600480360381019061044e9190612daf565b6124c5565b005b61045d6125f5565b60405161046a91906133d1565b60405180910390f35b61047b61261b565b6040516104889190613607565b60405180910390f35b610499612621565b6040516104a69190613607565b60405180910390f35b6104b761262e565b6040516104c49190613607565b60405180910390f35b6104d5612634565b6040516104e29190613607565b60405180910390f35b61050560048036038101906105009190612daf565b61263a565b005b610521600480360381019061051c9190612daf565b612732565b60405161052e9190613607565b60405180910390f35b61053f61277e565b60405161054c91906133ec565b60405180910390f35b606a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6070818154811061058b57600080fd5b90600052602060002090600502016000915090508060000154908060010154908060020154908060030154908060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060040160149054906101000a900460e01b905086565b60716020528060005260406000206000915090505481565b60006106166127a4565b9050600073ffffffffffffffffffffffffffffffffffffffff16607260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146106e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106dd90613507565b60405180910390fd5b6000607160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541480156107a757508073ffffffffffffffffffffffffffffffffffffffff16607060008154811061075c5761075b613a1d565b5b906000526020600020906005020160040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b6107e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107dd906134a7565b60405180910390fd5b6070607160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548154811061083957610838613a1d565b5b90600052602060002090600502016000015461085484612732565b10610894576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088b90613527565b60405180910390fd5b61089f8184846127ac565b6108de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d5906135c7565b60405180910390fd5b607360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082607260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550606f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166355ab356e826040518263ffffffff1660e01b8152600401610a57919061338d565b600060405180830381600087803b158015610a7157600080fd5b505af1158015610a85573d6000803e3d6000fd5b50505050505050565b610a966127a4565b73ffffffffffffffffffffffffffffffffffffffff16607060716000610aba6127a4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481548110610b0657610b05613a1d565b5b906000526020600020906005020160040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b85906134e7565b60405180910390fd5b6000607060716000610b9e6127a4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481548110610bea57610be9613a1d565b5b9060005260206000209060050201905080600301548160020154118015610c24575080600301548160020154610c2091906137ef565b8211155b610c63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5a90613407565b60405180910390fd5b610c7a82826003015461295290919063ffffffff16565b8160030181905550606e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb610cc86127a4565b846040518363ffffffff1660e01b8152600401610ce69291906133a8565b602060405180830381600087803b158015610d0057600080fd5b505af1158015610d14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d389190612f5f565b505050565b610d456127a4565b73ffffffffffffffffffffffffffffffffffffffff16610d636120a6565b73ffffffffffffffffffffffffffffffffffffffff1614610db9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db0906134c7565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff161415610e29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e20906135a7565b60405180910390fd5b80606e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610e756127a4565b73ffffffffffffffffffffffffffffffffffffffff16610e936120a6565b73ffffffffffffffffffffffffffffffffffffffff1614610ee9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee0906134c7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5090613547565b60405180910390fd5b80606d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806000607260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff1614611048576066546067549250925050611051565b60008092509250505b915091565b6073602052816000526040600020818154811061107257600080fd5b906000526020600020016000915091509054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006110ae6127a4565b9050600073ffffffffffffffffffffffffffffffffffffffff16607260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461117e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117590613487565b60405180910390fd5b600082116111c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b8906135e7565b60405180910390fd5b60006111d86068548461296890919063ffffffff16565b9050606e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166379cc67908361124d606461123f606b54606461123091906137ef565b8761296890919063ffffffff16565b61297e90919063ffffffff16565b6040518363ffffffff1660e01b815260040161126a9291906133a8565b600060405180830381600087803b15801561128457600080fd5b505af1158015611298573d6000803e3d6000fd5b505050506000607080549050148061136057508173ffffffffffffffffffffffffffffffffffffffff166070607160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548154811061131557611314613a1d565b5b906000526020600020906005020160040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b15611bd5576069548310156113aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a190613587565b60405180910390fd5b60706040518060c0016040528085815260200183815260200160008152602001600081526020018473ffffffffffffffffffffffffffffffffffffffff1681526020016113f685612994565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681525090806001815401808255809150506001900390600052602060002090600502016000909190919091506000820151816000015560208201518160010155604082015181600201556060820151816003015560808201518160040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060a08201518160040160146101000a81548163ffffffff021916908360e01c0217905550505060016070805490506114e891906137ef565b607160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000606c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340ee7ce26040518163ffffffff1660e01b815260040160206040518083038186803b15801561159557600080fd5b505afa1580156115a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115cd9190612fb9565b90506000606c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638b6e15e56040518163ffffffff1660e01b815260040160206040518083038186803b15801561163957600080fd5b505afa15801561164d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116719190612ddc565b9050606e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb826116ff60646116f1876116e360646116d5606b548d61296890919063ffffffff16565b61297e90919063ffffffff16565b61296890919063ffffffff16565b61297e90919063ffffffff16565b6040518363ffffffff1660e01b815260040161171c9291906133a8565b602060405180830381600087803b15801561173657600080fd5b505af115801561174a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061176e9190612f5f565b5060006117ca60646117bc85606461178691906137ef565b6117ae60646117a0606b548b61296890919063ffffffff16565b61297e90919063ffffffff16565b61296890919063ffffffff16565b61297e90919063ffffffff16565b9050606e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb606a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b815260040161184b9291906133a8565b602060405180830381600087803b15801561186557600080fd5b505af1158015611879573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061189d9190612f5f565b506000606d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663047640896040518163ffffffff1660e01b815260040160006040518083038186803b15801561190857600080fd5b505afa15801561191c573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906119459190612f16565b5190506000811115611bcc57600061197d8261196f64e8d4a510008661296890919063ffffffff16565b61297e90919063ffffffff16565b905060005b82811015611bc9576000606d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663047640896040518163ffffffff1660e01b815260040160006040518083038186803b1580156119f457600080fd5b505afa158015611a08573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611a319190612f16565b8281518110611a4357611a42613a1d565b5b602002602001015190506000606d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c9f09b9c836040518263ffffffff1660e01b8152600401611aaa9190613607565b60206040518083038186803b158015611ac257600080fd5b505afa158015611ad6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611afa9190612fb9565b9050606d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631e2f291283611b6584611b5764e8d4a510008a61297e90919063ffffffff16565b61295290919063ffffffff16565b6040518363ffffffff1660e01b8152600401611b82929190613622565b600060405180830381600087803b158015611b9c57600080fd5b505af1158015611bb0573d6000803e3d6000fd5b5050505050508080611bc19061392c565b915050611982565b50505b50505050611c7a565b60006070607160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481548110611c2a57611c29613a1d565b5b90600052602060002090600502019050611c5184826000015461295290919063ffffffff16565b8160000181905550611c7082826001015461295290919063ffffffff16565b8160010181905550505b505050565b611c876127a4565b73ffffffffffffffffffffffffffffffffffffffff16611ca56120a6565b73ffffffffffffffffffffffffffffffffffffffff1614611cfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf2906134c7565b60405180910390fd5b80606b8190555050565b611d0d6127a4565b73ffffffffffffffffffffffffffffffffffffffff16611d2b6120a6565b73ffffffffffffffffffffffffffffffffffffffff1614611d81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d78906134c7565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff161415611df1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de8906135a7565b60405180910390fd5b80606a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550606a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16606c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611ea06127a4565b73ffffffffffffffffffffffffffffffffffffffff16611ebe6120a6565b73ffffffffffffffffffffffffffffffffffffffff1614611f14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0b906134c7565b60405180910390fd5b611f1e60006129cd565b565b611f286127a4565b73ffffffffffffffffffffffffffffffffffffffff16611f466120a6565b73ffffffffffffffffffffffffffffffffffffffff1614611f9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f93906134c7565b60405180910390fd5b611fa884848484612a93565b50505050565b600060019054906101000a900460ff16611fd65760008054906101000a900460ff1615611fdf565b611fde612ab5565b5b61201e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201590613467565b60405180910390fd5b60008060019054906101000a900460ff16159050801561206e576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b61207c878787878787612ac6565b801561209d5760008060016101000a81548160ff0219169083151502179055505b50505050505050565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60726020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61210b6127a4565b73ffffffffffffffffffffffffffffffffffffffff166121296120a6565b73ffffffffffffffffffffffffffffffffffffffff161461217f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612176906134c7565b60405180910390fd5b85606e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084606a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550606a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16606c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061227084848484612a93565b505050505050565b606f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166122b96127a4565b73ffffffffffffffffffffffffffffffffffffffff161461230f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230690613447565b60405180910390fd5b6000607260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff16146124c05761241e826070607160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054815481106123fe576123fd613a1d565b5b90600052602060002090600502016002015461295290919063ffffffff16565b6070607160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548154811061247157612470613a1d565b5b9060005260206000209060050201600201819055507fd304fddcfb4c823513457b3a75ae8e137f506c2a81f5716fab3b268c7ed6c00881836040516124b79291906133a8565b60405180910390a15b505050565b6124cd6127a4565b73ffffffffffffffffffffffffffffffffffffffff166124eb6120a6565b73ffffffffffffffffffffffffffffffffffffffff1614612541576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612538906134c7565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff1614156125b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a8906135a7565b60405180910390fd5b80606f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60695481565b6000607080549050905090565b606b5481565b60685481565b6126426127a4565b73ffffffffffffffffffffffffffffffffffffffff166126606120a6565b73ffffffffffffffffffffffffffffffffffffffff16146126b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ad906134c7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612726576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271d90613427565b60405180910390fd5b61272f816129cd565b50565b6000607360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050919050565b606f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600033905090565b60008273ffffffffffffffffffffffffffffffffffffffff166070607160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548154811061281857612817613a1d565b5b906000526020600020906005020160040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146128a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612897906134e7565b60405180910390fd5b6070607160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054815481106128f3576128f2613a1d565b5b906000526020600020906005020160040160149054906101000a900460e01b84604051602001612924929190613361565b6040516020818303038152906040528051906020012082141561294a576001905061294b565b5b9392505050565b60008183612960919061370e565b905092915050565b600081836129769190613795565b905092915050565b6000818361298c9190613764565b905092915050565b6000804142846040516020016129ac93929190613324565b60405160208183030381529060405280519060200120905080915050919050565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081603360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8360668190555082606781905550816068819055508060698190555050505050565b6000612ac030612bce565b15905090565b600060019054906101000a900460ff16612aee5760008054906101000a900460ff1615612af7565b612af6612ab5565b5b612b36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b2d90613467565b60405180910390fd5b60008060019054906101000a900460ff161590508015612b86576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b612b8e612be1565b612b96612c32565b612ba4878787878787612103565b8015612bc55760008060016101000a81548160ff0219169083151502179055505b50505050505050565b600080823b905060008111915050919050565b600060019054906101000a900460ff16612c30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2790613567565b60405180910390fd5b565b600060019054906101000a900460ff16612c81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c7890613567565b60405180910390fd5b612c91612c8c6127a4565b6129cd565b565b6000612ca6612ca1846136d1565b6136ac565b90508083825260208201905082856020860282011115612cc957612cc8613a80565b5b60005b85811015612cf95781612cdf8882612d9a565b845260208401935060208301925050600181019050612ccc565b5050509392505050565b600081359050612d1281613dd5565b92915050565b600081519050612d2781613dd5565b92915050565b600082601f830112612d4257612d41613a7b565b5b8151612d52848260208601612c93565b91505092915050565b600081519050612d6a81613dec565b92915050565b600081359050612d7f81613e03565b92915050565b600081359050612d9481613e1a565b92915050565b600081519050612da981613e1a565b92915050565b600060208284031215612dc557612dc4613a8a565b5b6000612dd384828501612d03565b91505092915050565b600060208284031215612df257612df1613a8a565b5b6000612e0084828501612d18565b91505092915050565b60008060008060008060c08789031215612e2657612e25613a8a565b5b6000612e3489828a01612d03565b9650506020612e4589828a01612d03565b9550506040612e5689828a01612d85565b9450506060612e6789828a01612d85565b9350506080612e7889828a01612d85565b92505060a0612e8989828a01612d85565b9150509295509295509295565b60008060408385031215612ead57612eac613a8a565b5b6000612ebb85828601612d03565b9250506020612ecc85828601612d70565b9150509250929050565b60008060408385031215612eed57612eec613a8a565b5b6000612efb85828601612d03565b9250506020612f0c85828601612d85565b9150509250929050565b600060208284031215612f2c57612f2b613a8a565b5b600082015167ffffffffffffffff811115612f4a57612f49613a85565b5b612f5684828501612d2d565b91505092915050565b600060208284031215612f7557612f74613a8a565b5b6000612f8384828501612d5b565b91505092915050565b600060208284031215612fa257612fa1613a8a565b5b6000612fb084828501612d85565b91505092915050565b600060208284031215612fcf57612fce613a8a565b5b6000612fdd84828501612d9a565b91505092915050565b6000806000806080858703121561300057612fff613a8a565b5b600061300e87828801612d85565b945050602061301f87828801612d85565b935050604061303087828801612d85565b925050606061304187828801612d85565b91505092959194509250565b61305e61305982613835565b613987565b82525050565b61306d81613823565b82525050565b61308461307f82613823565b613975565b82525050565b6130938161385d565b82525050565b6130aa6130a58261385d565b613999565b82525050565b6130b9816138b3565b82525050565b6130c8816138c5565b82525050565b60006130db6017836136fd565b91506130e682613aad565b602082019050919050565b60006130fe6026836136fd565b915061310982613ad6565b604082019050919050565b60006131216023836136fd565b915061312c82613b25565b604082019050919050565b6000613144602e836136fd565b915061314f82613b74565b604082019050919050565b60006131676017836136fd565b915061317282613bc3565b602082019050919050565b600061318a6013836136fd565b915061319582613bec565b602082019050919050565b60006131ad6020836136fd565b91506131b882613c15565b602082019050919050565b60006131d0600f836136fd565b91506131db82613c3e565b602082019050919050565b60006131f36017836136fd565b91506131fe82613c67565b602082019050919050565b60006132166013836136fd565b915061322182613c90565b602082019050919050565b60006132396000836136fd565b915061324482613cb9565b600082019050919050565b600061325c602b836136fd565b915061326782613cbc565b604082019050919050565b600061327f6017836136fd565b915061328a82613d0b565b602082019050919050565b60006132a26025836136fd565b91506132ad82613d34565b604082019050919050565b60006132c56013836136fd565b91506132d082613d83565b602082019050919050565b60006132e86018836136fd565b91506132f382613dac565b602082019050919050565b613307816138a9565b82525050565b61331e613319826138a9565b6139b5565b82525050565b6000613330828661304d565b601482019150613340828561330d565b6020820191506133508284613073565b601482019150819050949350505050565b600061336d8285613099565b60048201915061337d8284613073565b6014820191508190509392505050565b60006020820190506133a26000830184613064565b92915050565b60006040820190506133bd6000830185613064565b6133ca60208301846132fe565b9392505050565b60006020820190506133e660008301846130b0565b92915050565b600060208201905061340160008301846130bf565b92915050565b60006020820190508181036000830152613420816130ce565b9050919050565b60006020820190508181036000830152613440816130f1565b9050919050565b6000602082019050818103600083015261346081613114565b9050919050565b6000602082019050818103600083015261348081613137565b9050919050565b600060208201905081810360008301526134a08161315a565b9050919050565b600060208201905081810360008301526134c08161317d565b9050919050565b600060208201905081810360008301526134e0816131a0565b9050919050565b60006020820190508181036000830152613500816131c3565b9050919050565b60006020820190508181036000830152613520816131e6565b9050919050565b6000602082019050818103600083015261354081613209565b9050919050565b600060208201905081810360008301526135608161322c565b9050919050565b600060208201905081810360008301526135808161324f565b9050919050565b600060208201905081810360008301526135a081613272565b9050919050565b600060208201905081810360008301526135c081613295565b9050919050565b600060208201905081810360008301526135e0816132b8565b9050919050565b60006020820190508181036000830152613600816132db565b9050919050565b600060208201905061361c60008301846132fe565b92915050565b600060408201905061363760008301856132fe565b61364460208301846132fe565b9392505050565b600060c08201905061366060008301896132fe565b61366d60208301886132fe565b61367a60408301876132fe565b61368760608301866132fe565b6136946080830185613064565b6136a160a083018461308a565b979650505050505050565b60006136b66136c7565b90506136c282826138fb565b919050565b6000604051905090565b600067ffffffffffffffff8211156136ec576136eb613a4c565b5b602082029050602081019050919050565b600082825260208201905092915050565b6000613719826138a9565b9150613724836138a9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613759576137586139bf565b5b828201905092915050565b600061376f826138a9565b915061377a836138a9565b92508261378a576137896139ee565b5b828204905092915050565b60006137a0826138a9565b91506137ab836138a9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156137e4576137e36139bf565b5b828202905092915050565b60006137fa826138a9565b9150613805836138a9565b925082821015613818576138176139bf565b5b828203905092915050565b600061382e82613889565b9050919050565b600061384082613889565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006138be826138d7565b9050919050565b60006138d0826138d7565b9050919050565b60006138e2826138e9565b9050919050565b60006138f482613889565b9050919050565b61390482613a8f565b810181811067ffffffffffffffff8211171561392357613922613a4c565b5b80604052505050565b6000613937826138a9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561396a576139696139bf565b5b600182019050919050565b6000613980826139a3565b9050919050565b6000613992826139a3565b9050919050565b6000819050919050565b60006139ae82613aa0565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f417761726420616d6f756e74206e6f7420656e6f756768000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4f6e6c7920616c6c6f7765642066726f6d20737461726661726d20636f6e747260008201527f6163740000000000000000000000000000000000000000000000000000000000602082015250565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b7f55736572206d757374206e6f74206e6f64652075736572000000000000000000600082015250565b7f596f7520617265206e6f6465206d617374657200000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f496e76616c696420696e76697465720000000000000000000000000000000000600082015250565b7f5573657220616c72656164792072656769737465726564000000000000000000600082015250565b7f506172656e74206e6f64652069732066756c6c00000000000000000000000000600082015250565b50565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960008201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b7f4c657373207468616e206d696e696d756d206c696d6974000000000000000000600082015250565b7f4661726d20636f6e747261637420616464726573732063616e6e6f742062652060008201527f656d707479000000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c696420696e7669746520636f646500000000000000000000000000600082015250565b7f55696e74206d7573742067726561746572207468616e20300000000000000000600082015250565b613dde81613823565b8114613de957600080fd5b50565b613df581613847565b8114613e0057600080fd5b50565b613e0c81613853565b8114613e1757600080fd5b50565b613e23816138a9565b8114613e2e57600080fd5b5056fea2646970667358221220d99ca17f5a36fcd234ea2a5fe526af865a24d656fc6400c703bc66d15feee6a564736f6c63430008070033