POL Price: $0.719779 (+4.53%)
 

Overview

POL Balance

Polygon PoS Chain LogoPolygon PoS Chain LogoPolygon PoS Chain Logo9,602.886432011689246114 POL

POL Value

$6,911.96 (@ $0.72/POL)

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Gas Add651660882024-12-06 20:12:271 min ago1733515947IN
0xB58C5be9...eE8639980
3 POL0.0009776331.33550615
Gas Add651660842024-12-06 20:12:111 min ago1733515931IN
0xB58C5be9...eE8639980
10 POL0.0015053931.16823086
Liquidity Add651660742024-12-06 20:11:392 mins ago1733515899IN
0xB58C5be9...eE8639980
0 POL0.0058592831.09975052
Toggle Pause651655052024-12-06 19:50:3823 mins ago1733514638IN
0xB58C5be9...eE8639980
0 POL0.0038415831.12007993
Liquidity Remove651654902024-12-06 19:50:0623 mins ago1733514606IN
0xB58C5be9...eE8639980
0 POL0.0059470931.35066678
Toggle Pause651654702024-12-06 19:49:2224 mins ago1733514562IN
0xB58C5be9...eE8639980
0 POL0.0039049931.63066396
Toggle Pause651654412024-12-06 19:48:2225 mins ago1733514502IN
0xB58C5be9...eE8639980
0 POL0.003884231.46835078
Liquidity Remove651654172024-12-06 19:47:3026 mins ago1733514450IN
0xB58C5be9...eE8639980
0 POL0.00607732.03752168
Toggle Pause651653832024-12-06 19:46:1827 mins ago1733514378IN
0xB58C5be9...eE8639980
0 POL0.0039910332.33069626
Liquidity Remove651640912024-12-06 18:59:171 hr ago1733511557IN
0xB58C5be9...eE8639980
0 POL0.0051038131.94615019
Pass Remove651640112024-12-06 18:56:191 hr ago1733511379IN
0xB58C5be9...eE8639980
0 POL0.0025658932.8834374
Toggle Pause651635542024-12-06 18:39:011 hr ago1733510341IN
0xB58C5be9...eE8639980
0 POL0.0039481331.98943856
Liquidity Add651634152024-12-06 18:34:021 hr ago1733510042IN
0xB58C5be9...eE8639980
0 POL0.0061150331.913468
Gas Add651632242024-12-06 18:27:121 hr ago1733509632IN
0xB58C5be9...eE8639980
15 POL0.0009878431.66263894
Pass Add651630672024-12-06 18:20:521 hr ago1733509252IN
0xB58C5be9...eE8639980
0 POL0.0031484231.13832019
Toggle Pause651629602024-12-06 18:17:061 hr ago1733509026IN
0xB58C5be9...eE8639980
0 POL0.0059942831.61673966
Register651629422024-12-06 18:16:101 hr ago1733508970IN
0xB58C5be9...eE8639980
0 POL0.0067716731.13257785
Toggle Pause651621532024-12-06 17:47:402 hrs ago1733507260IN
0xB58C5be9...eE8639980
0 POL0.0046179338.41143068
Toggle Pause651613402024-12-06 17:18:052 hrs ago1733505485IN
0xB58C5be9...eE8639980
0 POL0.0045778836.1447973
Gas Remove651613352024-12-06 17:17:542 hrs ago1733505474IN
0xB58C5be9...eE8639980
0 POL0.0013984836.00733301
Liquidity Remove651612032024-12-06 17:13:143 hrs ago1733505194IN
0xB58C5be9...eE8639980
0 POL0.0077004839.91830903
Toggle Pause651611542024-12-06 17:11:293 hrs ago1733505089IN
0xB58C5be9...eE8639980
0 POL0.0051996341.05
Toggle Pause651610862024-12-06 17:09:013 hrs ago1733504941IN
0xB58C5be9...eE8639980
0 POL0.0053652744.62321411
Toggle Pause651610692024-12-06 17:08:253 hrs ago1733504905IN
0xB58C5be9...eE8639980
0 POL0.0057639847.94410793
Toggle Pause651608292024-12-06 16:59:463 hrs ago1733504386IN
0xB58C5be9...eE8639980
0 POL0.0061395551.06296133
View all transactions

Latest 25 internal transactions (View All)

Parent Transaction Hash Block From To
651661112024-12-06 20:13:2927 secs ago1733516009
0xB58C5be9...eE8639980
0.0167721 POL
651661102024-12-06 20:13:2729 secs ago1733516007
0xB58C5be9...eE8639980
0.01552266 POL
651661082024-12-06 20:13:2333 secs ago1733516003
0xB58C5be9...eE8639980
0.0163581 POL
651660942024-12-06 20:12:511 min ago1733515971
0xB58C5be9...eE8639980
0.01739442 POL
651660932024-12-06 20:12:471 min ago1733515967
0xB58C5be9...eE8639980
0.01545009 POL
651660922024-12-06 20:12:431 min ago1733515963
0xB58C5be9...eE8639980
0.01798016 POL
651660922024-12-06 20:12:431 min ago1733515963
0xB58C5be9...eE8639980
0.01537053 POL
651660912024-12-06 20:12:391 min ago1733515959
0xB58C5be9...eE8639980
0.01595017 POL
651660832024-12-06 20:12:071 min ago1733515927
0xB58C5be9...eE8639980
0.02196809 POL
651660732024-12-06 20:11:372 mins ago1733515897
0xB58C5be9...eE8639980
0.01674006 POL
651660602024-12-06 20:11:092 mins ago1733515869
0xB58C5be9...eE8639980
0.01555162 POL
651660602024-12-06 20:11:092 mins ago1733515869
0xB58C5be9...eE8639980
0.01709459 POL
651660602024-12-06 20:11:092 mins ago1733515869
0xB58C5be9...eE8639980
0.01636673 POL
651660572024-12-06 20:11:022 mins ago1733515862
0xB58C5be9...eE8639980
0.01707828 POL
651660242024-12-06 20:09:524 mins ago1733515792
0xB58C5be9...eE8639980
0.01829872 POL
651660052024-12-06 20:09:124 mins ago1733515752
0xB58C5be9...eE8639980
0.01846828 POL
651660042024-12-06 20:09:104 mins ago1733515750
0xB58C5be9...eE8639980
0.01580253 POL
651660042024-12-06 20:09:104 mins ago1733515750
0xB58C5be9...eE8639980
0.0168102 POL
651660032024-12-06 20:09:084 mins ago1733515748
0xB58C5be9...eE8639980
0.01805166 POL
651660022024-12-06 20:09:064 mins ago1733515746
0xB58C5be9...eE8639980
0.01532246 POL
651659942024-12-06 20:08:385 mins ago1733515718
0xB58C5be9...eE8639980
0.01522726 POL
651659432024-12-06 20:06:387 mins ago1733515598
0xB58C5be9...eE8639980
0.01853198 POL
651659402024-12-06 20:06:327 mins ago1733515592
0xB58C5be9...eE8639980
0.01558908 POL
651659372024-12-06 20:06:267 mins ago1733515586
0xB58C5be9...eE8639980
0.01634438 POL
651659372024-12-06 20:06:267 mins ago1733515586
0xB58C5be9...eE8639980
0.01594445 POL
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ConectaManager

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 1 runs

Other Settings:
default evmVersion
File 1 of 11 : ConectaManager.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;

import "./interface/INetwork.sol";
import "./interface/ISubAccount.sol";
import "./interface/IFactory.sol";
import "./interface/IStrategy.sol";
import "./utils/LPToken.sol";
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

contract ConectaManager {
    IFactory public factory;
    mapping(address => User) internal users;
    struct User {
        address manager;
        uint256 gasBalance;
        uint256 passBalance;
        uint256 bonusBalance;
        bool status;
    }

    struct UserDisplay {
        address manager;
        uint256 gasBalance;
        uint256 passBalance;
        uint256 bonusBalance;
        ISubAccount.SubAccountsDisplay[] SubAccounts;
    }

    mapping(address => Coin) internal listCoins;
    struct Coin {
        bool status;
        LPToken lp;
    }

    event Register(address indexed user, address indexed manager);

    event BalanceGas(
        address indexed user,
        uint256 balance,
        uint256 value,
        bool increase,
        bool is_operation
    );

    event BalancePass(
        address indexed user,
        uint256 balance,
        uint256 value,
        bool increase,
        bool is_operation
    );

    event BalanceBonus(
        address indexed user,
        uint256 balance,
        uint256 value,
        bool increase,
        bool is_operation
    );

    constructor(IFactory _factory) {
        factory = _factory;
    }

    modifier onlyPayments() {
        IFactory.Bot memory botInfo = factory.getBotInfo(address(this));
        require(
            botInfo.paymentsAddress == msg.sender,
            "You must the ConectaPayments"
        );
        _;
    }

    modifier onlyOwner() {
        IFactory.Bot memory botInfo = factory.getBotInfo(address(this));
        require(
            botInfo.owner == msg.sender || address(factory) == msg.sender,
            "Ownable: caller is not the owner nor the factory"
        );
        _;
    }

    modifier onlyRegistered() {
        require(users[msg.sender].status, "User not registered");
        _;
    }

    function register(address manager, string memory name) public {
        if (manager != address(0)) {
            require(users[manager].status, "Unregistered manager");
        }

        require(!users[msg.sender].status, "User already registered");
        users[msg.sender] = User(manager, 0, 0, 0, true);
        emit Register(msg.sender, manager);

        _createSubAccount(msg.sender, name);
    }

    function subAccount() internal view returns (ISubAccount) {
        address subAccountAddress = factory
            .getBotInfo(address(this))
            .subAccountAddress;
        return ISubAccount(subAccountAddress);
    }

    function _createSubAccount(address user, string memory name) internal {
        subAccount().create(user, name);
    }

    function createSubAccount(string[] memory names) public onlyRegistered {
        for (uint256 i = 0; i < names.length; i++) {
            _createSubAccount(msg.sender, names[i]);
        }
    }

    function getInfoUser() public view returns (UserDisplay memory) {
        ISubAccount SubAccount = subAccount();
        ISubAccount.SubAccounts[] memory subAccounts = SubAccount
            .getSubAccounts(address(this), msg.sender);

        uint256 subAccountCount = subAccounts.length;
        ISubAccount.SubAccountsDisplay[]
            memory accounts = new ISubAccount.SubAccountsDisplay[](
                subAccountCount
            );

        for (uint256 i = 0; i < subAccountCount; i++) {
            address[] memory _strategies = SubAccount.getStrategies(
                address(this),
                msg.sender,
                subAccounts[i].id
            );

            ISubAccount.StrategyDisplay[]
                memory strategies = new ISubAccount.StrategyDisplay[](
                    _strategies.length
                );

            for (uint256 j = 0; j < _strategies.length; j++) {
                ISubAccount.BalanceStrategy[] memory balances = SubAccount
                    .getBalances(
                        address(this),
                        msg.sender,
                        subAccounts[i].id,
                        _strategies[j]
                    );
                strategies[j] = ISubAccount.StrategyDisplay(
                    _strategies[j],
                    balances
                );
            }
            accounts[i] = ISubAccount.SubAccountsDisplay(
                subAccounts[i].id,
                subAccounts[i].name,
                strategies
            );
        }

        return
            UserDisplay(
                users[msg.sender].manager,
                users[msg.sender].gasBalance,
                users[msg.sender].passBalance,
                users[msg.sender].bonusBalance,
                accounts
            );
    }

    function getStrategies() public view returns (IStrategy.Strategy[] memory) {
        return strategy().getStrategies(address(this));
    }

    function strategy() internal view returns (IStrategy) {
        address strategyAddress = factory
            .getBotInfo(address(this))
            .strategyAddress;
        return IStrategy(strategyAddress);
    }

    function _lpMint(
        address to,
        address coin,
        uint256 amount
    ) internal returns (address) {
        listCoins[coin].lp.mint(to, amount);
        return address(listCoins[coin].lp);
    }

    function LiquidityAdd(
        string[] memory accountId,
        address strategyToken,
        address coin,
        uint256 amount
    ) public onlyRegistered {
        require(
            strategy().findStrategy(address(this), strategyToken).isActive,
            "Strategy not found"
        );
        require(coin != address(0), "Invalid contract address");

        ERC20 erc20 = ERC20(coin);
        if (!listCoins[coin].status) {
            listCoins[coin] = Coin(
                true,
                new LPToken(
                    erc20.name(),
                    erc20.symbol(),
                    erc20.decimals(),
                    coin
                )
            );
        }

        ISubAccount SubAccount = subAccount();
        for (uint256 i = 0; i < accountId.length; i++) {
            SubAccount.addLiquidity(
                msg.sender,
                accountId[i],
                strategyToken,
                amount / accountId.length,
                coin
            );
        }

        erc20.transferFrom(msg.sender, address(SubAccount), amount);
        _lpMint(msg.sender, coin, amount);
    }

    function LiquidityRemove(
        string[] memory accountId,
        address strategyToken,
        address coin,
        uint256 amount
    ) public onlyRegistered {
        require(
            strategy().findStrategy(address(this), strategyToken).isActive,
            "Strategy not found"
        );
        require(coin != address(0), "Invalid contract address");

        for (uint256 i = 0; i < accountId.length; i++) {
            subAccount().removeLiquidity(
                msg.sender,
                accountId[i],
                strategyToken,
                amount,
                coin
            );
        }

        ERC20 erc20 = ERC20(coin);
        listCoins[coin].lp.burnFrom(msg.sender, amount * accountId.length);
        erc20.transfer(msg.sender, amount * accountId.length);
    }

    function togglePause(
        string[] memory accountId,
        address strategyToken,
        address coin,
        bool paused
    ) public onlyRegistered {
        require(
            strategy().findStrategy(address(this), strategyToken).isActive,
            "Strategy not found"
        );
        require(coin != address(0), "Invalid contract address");

        for (uint256 i = 0; i < accountId.length; i++) {
            subAccount().togglePause(
                msg.sender,
                accountId[i],
                strategyToken,
                coin,
                paused
            );
        }
    }

    function gasRemove(uint256 amount) public onlyRegistered {
        require(
            users[msg.sender].gasBalance >= amount,
            "Insufficient gas balance"
        );

        users[msg.sender].gasBalance -= amount;

        payable(msg.sender).transfer(amount);

        emit BalanceGas(
            msg.sender,
            users[msg.sender].gasBalance,
            amount,
            false,
            false
        );
    }

    function gasAdd() public payable onlyRegistered {
        require(msg.value >= 0, "Insufficient value");
        users[msg.sender].gasBalance += msg.value;

        emit BalanceGas(
            msg.sender,
            users[msg.sender].gasBalance,
            msg.value,
            true,
            false
        );
    }

    function gasBalance() public view returns (uint256) {
        return users[msg.sender].gasBalance;
    }

    function passAdd(uint256 amount) public onlyRegistered {
        users[msg.sender].passBalance += amount;
        address token = factory.getBotInfo(address(this)).tokenPassAddress;

        ERC20 erc20 = ERC20(token);
        erc20.transferFrom(msg.sender, address(this), amount);

        emit BalancePass(
            msg.sender,
            users[msg.sender].passBalance,
            amount,
            true,
            false
        );
    }

    function passRemove(uint256 amount) public onlyRegistered {
        require(
            users[msg.sender].passBalance >= amount,
            "Insufficient pass balance"
        );
        users[msg.sender].passBalance -= amount;
        address token = factory.getBotInfo(address(this)).tokenPassAddress;

        ERC20 erc20 = ERC20(token);
        erc20.transfer(msg.sender, amount);

        emit BalancePass(
            msg.sender,
            users[msg.sender].passBalance,
            amount,
            false,
            false
        );
    }

    function bonusAdd(uint256 amount, address user) public onlyOwner {
        require(users[user].status, "User not registered");
        users[user].bonusBalance += amount;
        emit BalanceBonus(user, users[user].bonusBalance, amount, true, false);
    }

    function bonusRemove(uint256 amount, address user) public onlyOwner {
        require(users[user].status, "User not registered");
        require(
            users[user].bonusBalance >= amount,
            "Insufficient pass balance"
        );
        users[user].bonusBalance -= amount;
        emit BalanceBonus(user, users[user].bonusBalance, amount, false, false);
    }

    function networkBalance(address coin) public view returns (uint256) {
        address networkAddress = factory
            .getBotInfo(address(this))
            .networkAddress;
        return
            INetwork(networkAddress).getBalance(
                address(this),
                coin,
                msg.sender
            );
    }

    function networkWithdraw(
        address coin,
        uint256 amount
    ) public onlyRegistered {
        address networkAddress = factory
            .getBotInfo(address(this))
            .networkAddress;
        INetwork(networkAddress).withdraw(msg.sender, coin, amount);
        ERC20(coin).transfer(msg.sender, amount);
    }

    function passBalance() public view returns (uint256) {
        return users[msg.sender].passBalance;
    }

    function bonusBalance() public view returns (uint256) {
        return users[msg.sender].bonusBalance;
    }

    function rebalancePosition(
        address user,
        int256 amount,
        uint256 gas,
        address coin,
        uint256 fee
    ) public onlyPayments {
        require(users[user].gasBalance >= gas, "Insufficient gas balance");
        require(
            users[user].passBalance + users[user].bonusBalance >= fee,
            "Insufficient pass balance"
        );

        uint256 remainingFee = fee;
        if (users[user].bonusBalance > 0) {
            if (users[user].bonusBalance >= fee) {
                users[user].bonusBalance -= fee;
                remainingFee = 0;
            } else {
                remainingFee -= users[user].bonusBalance;
                users[user].bonusBalance = 0;
            }
            emit BalanceBonus(
                user,
                users[user].bonusBalance,
                fee - remainingFee,
                false,
                true
            );
        }

        if (remainingFee > 0) {
            users[user].passBalance -= remainingFee;
            emit BalancePass(
                user,
                users[user].passBalance,
                remainingFee,
                false,
                true
            );
        }

        users[user].gasBalance -= gas;

        if (amount > 0) {
            listCoins[coin].lp.mint(user, uint256(amount));
        } else {
            listCoins[coin].lp.burnFrom(user, uint256(-1 * amount));
        }

        IFactory.Bot memory botInfo = factory.getBotInfo(address(this));
        payable(botInfo.owner).transfer(gas);

        emit BalanceGas(user, users[user].gasBalance, gas, false, true);
    }
}

File 2 of 11 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.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 Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

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

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

File 3 of 11 : ERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;

import "./IERC20.sol";
import "./extensions/IERC20Metadata.sol";
import "../../utils/Context.sol";

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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

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

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

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

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

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

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

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

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

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

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

        return true;
    }

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

        _beforeTokenTransfer(from, to, amount);

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

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 4 of 11 : IERC20Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC20.sol";

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

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

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

File 5 of 11 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

File 7 of 11 : IFactory.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;

interface IFactory {
    struct Bot {
        string prefix;
        string name;
        address owner;
        address managerAddress;
        address strategyAddress;
        address subAccountAddress;
        address paymentsAddress;
        address tokenPassAddress;
        address networkAddress;
        uint16 feeWithdrawNetwork;
        address feeCollectorNetworkAddress;
    }
    function getBotInfo(
        address contractAddress
    ) external view returns (Bot memory);
}

File 8 of 11 : INetwork.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;

interface INetwork {
    function getBalance(
        address contractAddress,
        address token,
        address user
    ) external view returns (uint256);

    function withdraw(address user, address token, uint256 amount) external;
    function payFee(
        address contractAddress,
        address user,
        address token,
        uint256 amount,
        string memory id) external;
}

File 9 of 11 : IStrategy.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;

interface IStrategy {
    struct Strategy {
        string name;
        address tokenAddress;
        bool isActive;
    }
    function findStrategy(
        address contractAddress,
        address tokenAddress
    ) external view returns (Strategy memory);

    function addStrategy(
        string memory name,
        string memory symbol,
        address contractAddress
    ) external;
    
    function updateStrategyStatus(
        address contractAddress,
        address tokenAddress,
        bool isActive
    ) external;
    
    function getStrategies(
        address contractAddress
    ) external view returns (Strategy[] memory);

    function payFee(
        address contractAddress,
        address user,
        string memory id,
        address coin,
        uint256 amount
    ) external;
}

File 10 of 11 : ISubAccount.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;

interface ISubAccount {
    struct StrategyDisplay {
        address strategyToken;
        BalanceStrategy[] balance;
    }

    struct BalanceStrategy {
        uint256 amount;
        address token;
        uint256 decimals;
        string ico;
        string name;
        bool status;
        bool paused;
    }

    struct SubAccountsDisplay {
        string id;
        string name;
        StrategyDisplay[] strategies;
    }

    struct SubAccounts {
        string id;
        string name;
    }
    function create(address user, string memory name) external;
    function getSubAccounts(
        address contractAddress,
        address user
    ) external view returns (SubAccounts[] memory);
    function getStrategies(
        address contractAddress,
        address user,
        string memory accountId
    ) external view returns (address[] memory);
    function getBalances(
        address contractAddress,
        address user,
        string memory accountId,
        address strategyToken
    ) external view returns (BalanceStrategy[] memory);
    function addLiquidity(
        address user,
        string memory accountId,
        address strategyToken,
        uint256 amount,
        address coin
    ) external;
    function removeLiquidity(
        address user,
        string memory accountId,
        address strategyToken,
        uint256 amount,
        address coin
    ) external;
    function togglePause(
        address user,
        string memory accountId,
        address strategyToken,
        address coin,
        bool paused
    ) external;

    function position(
        address contractAddress,
        address user,
        string memory accountId,
        address strategyToken,
        address coin,
        int256 amount
    ) external returns (uint256 oldBalance);
}

File 11 of 11 : LPToken.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

contract LPToken is ERC20, Ownable {
    uint8 internal _decimals;

    struct Origin {
        string name;
        string symbol;
        uint8 decimals;
        address token;
    }
    Origin public coin;

    constructor(
        string memory name_,
        string memory symbol_,
        uint8 decimals_,
        address contract_
    )
        ERC20(
            string(abi.encodePacked("LP ", name_)),
            string(abi.encodePacked("LP", symbol_))
        )
    {
        _decimals = decimals_;
        coin = Origin(name_, symbol_, decimals_, contract_);
    }

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

    function mint(address to, uint256 amount) public onlyOwner {
        _mint(to, amount);
    }

    function burnFrom(address account, uint256 amount) public onlyOwner {
        _burn(account, amount);
    }

    function getContractOrigin() public view returns (Origin memory) {
        return coin;
    }
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 1
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract IFactory","name":"_factory","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"balance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"bool","name":"increase","type":"bool"},{"indexed":false,"internalType":"bool","name":"is_operation","type":"bool"}],"name":"BalanceBonus","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"balance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"bool","name":"increase","type":"bool"},{"indexed":false,"internalType":"bool","name":"is_operation","type":"bool"}],"name":"BalanceGas","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"balance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"bool","name":"increase","type":"bool"},{"indexed":false,"internalType":"bool","name":"is_operation","type":"bool"}],"name":"BalancePass","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"manager","type":"address"}],"name":"Register","type":"event"},{"inputs":[{"internalType":"string[]","name":"accountId","type":"string[]"},{"internalType":"address","name":"strategyToken","type":"address"},{"internalType":"address","name":"coin","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LiquidityAdd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string[]","name":"accountId","type":"string[]"},{"internalType":"address","name":"strategyToken","type":"address"},{"internalType":"address","name":"coin","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LiquidityRemove","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"user","type":"address"}],"name":"bonusAdd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"bonusBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"user","type":"address"}],"name":"bonusRemove","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string[]","name":"names","type":"string[]"}],"name":"createSubAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"contract IFactory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gasAdd","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"gasBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"gasRemove","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getInfoUser","outputs":[{"components":[{"internalType":"address","name":"manager","type":"address"},{"internalType":"uint256","name":"gasBalance","type":"uint256"},{"internalType":"uint256","name":"passBalance","type":"uint256"},{"internalType":"uint256","name":"bonusBalance","type":"uint256"},{"components":[{"internalType":"string","name":"id","type":"string"},{"internalType":"string","name":"name","type":"string"},{"components":[{"internalType":"address","name":"strategyToken","type":"address"},{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"decimals","type":"uint256"},{"internalType":"string","name":"ico","type":"string"},{"internalType":"string","name":"name","type":"string"},{"internalType":"bool","name":"status","type":"bool"},{"internalType":"bool","name":"paused","type":"bool"}],"internalType":"struct ISubAccount.BalanceStrategy[]","name":"balance","type":"tuple[]"}],"internalType":"struct ISubAccount.StrategyDisplay[]","name":"strategies","type":"tuple[]"}],"internalType":"struct ISubAccount.SubAccountsDisplay[]","name":"SubAccounts","type":"tuple[]"}],"internalType":"struct ConectaManager.UserDisplay","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStrategies","outputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"bool","name":"isActive","type":"bool"}],"internalType":"struct IStrategy.Strategy[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"coin","type":"address"}],"name":"networkBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"coin","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"networkWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"passAdd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"passBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"passRemove","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"int256","name":"amount","type":"int256"},{"internalType":"uint256","name":"gas","type":"uint256"},{"internalType":"address","name":"coin","type":"address"},{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"rebalancePosition","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"},{"internalType":"string","name":"name","type":"string"}],"name":"register","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string[]","name":"accountId","type":"string[]"},{"internalType":"address","name":"strategyToken","type":"address"},{"internalType":"address","name":"coin","type":"address"},{"internalType":"bool","name":"paused","type":"bool"}],"name":"togglePause","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060405162004f1938038062004f1983398101604081905262000034916200005a565b600080546001600160a01b0319166001600160a01b03929092169190911790556200008c565b6000602082840312156200006d57600080fd5b81516001600160a01b03811681146200008557600080fd5b9392505050565b614e7d806200009c6000396000f3fe608060405260043610620001035760003560e01c80626624d0146200010857806316b948d9146200013d578063226cc559146200016457806323a268f1146200018b5780632af0f85c14620001b057806332434a2e14620001d55780637743fc9514620001fa5780637b951c3314620002045780637f3d598514620002295780638e3ca3fe14620002515780638ee6ce65146200027657806398ee142d146200029b578063b217ac9914620002c0578063b3492dbf14620002e5578063b49a60bb146200030a578063ba6e36521462000331578063c2877f021462000358578063c45a0155146200037d578063d4737eaf14620003ae578063d604229514620003d3575b600080fd5b3480156200011557600080fd5b50336000908152600160205260409020600201545b6040519081526020015b60405180910390f35b3480156200014a57600080fd5b5062000155620003f8565b604051620001349190620026aa565b3480156200017157600080fd5b506200018962000183366004620028b5565b62000877565b005b3480156200019857600080fd5b5062000189620001aa36600462002adc565b62000a53565b348015620001bd57600080fd5b5062000189620001cf36600462002b5c565b62000eac565b348015620001e257600080fd5b5062000189620001f436600462002bda565b62001067565b62000189620011f6565b3480156200021157600080fd5b50620001896200022336600462002adc565b62001296565b3480156200023657600080fd5b5033600090815260016020819052604090912001546200012a565b3480156200025e57600080fd5b50620001896200027036600462002c2f565b62001566565b3480156200028357600080fd5b50620001896200029536600462002c62565b620016db565b348015620002a857600080fd5b5062000189620002ba36600462002cb9565b62001c3e565b348015620002cd57600080fd5b506200012a620002df36600462002ce8565b62001dd8565b348015620002f257600080fd5b506200018962000304366004620028b5565b62001edc565b3480156200031757600080fd5b506200032262002070565b60405162000134919062002d08565b3480156200033e57600080fd5b50336000908152600160205260409020600301546200012a565b3480156200036557600080fd5b506200018962000377366004620028b5565b620020f6565b3480156200038a57600080fd5b506000546200039f906001600160a01b031681565b60405162000134919062002d98565b348015620003bb57600080fd5b5062000189620003cd36600462002dac565b620021fe565b348015620003e057600080fd5b5062000189620003f236600462002c2f565b6200227d565b620004346040518060a0016040528060006001600160a01b03168152602001600081526020016000815260200160008152602001606081525090565b6000620004406200242f565b90506000816001600160a01b0316631ebcb30d30336040518363ffffffff1660e01b81526004016200047492919062002dec565b600060405180830381865afa15801562000492573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620004bc919081019062002e52565b80519091506000816001600160401b03811115620004de57620004de620028cf565b6040519080825280602002602001820160405280156200053657816020015b6200052260405180606001604052806060815260200160608152602001606081525090565b815260200190600190039081620004fd5790505b50905060005b828110156200081a576000856001600160a01b031663a0b9bdcc30338886815181106200056d576200056d62002f70565b6020026020010151600001516040518463ffffffff1660e01b8152600401620005999392919062002f86565b600060405180830381865afa158015620005b7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620005e1919081019062002fcf565b9050600081516001600160401b03811115620006015762000601620028cf565b6040519080825280602002602001820160405280156200064957816020015b604080518082019091526000815260606020820152815260200190600190039081620006205790505b50905060005b825181101562000786576000886001600160a01b031663dba4d88f30338b898151811062000681576200068162002f70565b602002602001015160000151888781518110620006a257620006a262002f70565b60200260200101516040518563ffffffff1660e01b8152600401620006cb949392919062003073565b600060405180830381865afa158015620006e9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620007139190810190620030c0565b9050604051806040016040528085848151811062000735576200073562002f70565b60200260200101516001600160a01b031681526020018281525083838151811062000764576200076462002f70565b60200260200101819052505080806200077d9062003237565b9150506200064f565b506040518060600160405280878581518110620007a757620007a762002f70565b6020026020010151600001518152602001878581518110620007cd57620007cd62002f70565b602002602001015160200151815260200182815250848481518110620007f757620007f762002f70565b602002602001018190525050508080620008119062003237565b9150506200053c565b506040805160a0810182523360008181526001602081815285832080546001600160a01b03168652808301548287015260028101549686019690965292909152905260039091015460608201526080810191909152949350505050565b3360009081526001602052604090206004015460ff16620008b55760405162461bcd60e51b8152600401620008ac9062003253565b60405180910390fd5b33600090815260016020526040902060020154811115620008ea5760405162461bcd60e51b8152600401620008ac9062003280565b33600090815260016020526040812060020180548392906200090e908490620032b3565b90915550506000805460405163fb4aaf0f60e01b81526001600160a01b039091169063fb4aaf0f906200094690309060040162002d98565b600060405180830381865afa15801562000964573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200098e9190810190620032e2565b60e0015160405163a9059cbb60e01b815290915081906001600160a01b0382169063a9059cbb90620009c7903390879060040162003434565b6020604051808303816000875af1158015620009e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000a0d91906200344d565b503360008181526001602052604080822060020154905160008051602062004de88339815191529262000a46929188919081906200346d565b60405180910390a2505050565b3360009081526001602052604090206004015460ff1662000a885760405162461bcd60e51b8152600401620008ac9062003253565b62000a92620024b4565b6001600160a01b03166349773ea830856040518363ffffffff1660e01b815260040162000ac192919062002dec565b600060405180830381865afa15801562000adf573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262000b09919081019062003522565b6040015162000b2c5760405162461bcd60e51b8152600401620008ac906200355a565b6001600160a01b03821662000b555760405162461bcd60e51b8152600401620008ac9062003586565b6001600160a01b038216600090815260026020526040902054829060ff1662000d57576040518060400160405280600115158152602001826001600160a01b03166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa15801562000bcb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262000bf59190810190620035b8565b836001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa15801562000c34573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262000c5e9190810190620035b8565b846001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000c9d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000cc39190620035f0565b8760405162000cd29062002648565b62000ce1949392919062003615565b604051809103906000f08015801562000cfe573d6000803e3d6000fd5b506001600160a01b0390811690915284811660009081526002602090815260409091208351815494909201516001600160a81b0319909416911515610100600160a81b0319169190911761010093909216929092021790555b600062000d636200242f565b905060005b865181101562000e1c57816001600160a01b03166322a19a723389848151811062000d975762000d9762002f70565b6020026020010151898b518962000daf919062003663565b8a6040518663ffffffff1660e01b815260040162000dd295949392919062003686565b600060405180830381600087803b15801562000ded57600080fd5b505af115801562000e02573d6000803e3d6000fd5b50505050808062000e139062003237565b91505062000d68565b506040516323b872dd60e01b81526001600160a01b038316906323b872dd9062000e4f90339085908890600401620036c9565b6020604051808303816000875af115801562000e6f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000e9591906200344d565b5062000ea333858562002539565b50505050505050565b3360009081526001602052604090206004015460ff1662000ee15760405162461bcd60e51b8152600401620008ac9062003253565b62000eeb620024b4565b6001600160a01b03166349773ea830856040518363ffffffff1660e01b815260040162000f1a92919062002dec565b600060405180830381865afa15801562000f38573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262000f62919081019062003522565b6040015162000f855760405162461bcd60e51b8152600401620008ac906200355a565b6001600160a01b03821662000fae5760405162461bcd60e51b8152600401620008ac9062003586565b60005b8451811015620010605762000fc56200242f565b6001600160a01b0316637ee3055b3387848151811062000fe95762000fe962002f70565b60200260200101518787876040518663ffffffff1660e01b815260040162001016959493929190620036ed565b600060405180830381600087803b1580156200103157600080fd5b505af115801562001046573d6000803e3d6000fd5b505050508080620010579062003237565b91505062000fb1565b5050505050565b6001600160a01b03821615620010db576001600160a01b03821660009081526001602052604090206004015460ff16620010db5760405162461bcd60e51b81526020600482015260146024820152732ab73932b3b4b9ba32b932b21036b0b730b3b2b960611b6044820152606401620008ac565b3360009081526001602052604090206004015460ff16156200113a5760405162461bcd60e51b8152602060048201526017602482015276155cd95c88185b1c9958591e481c9959da5cdd195c9959604a1b6044820152606401620008ac565b6040805160a0810182526001600160a01b03848116808352600060208085018281528587018381526060870184815260016080890181815233808852958290528a872099518a546001600160a01b031916991698909817895592519288019290925551600287015551600386015592516004909401805460ff191694151594909417909355925190917f98ada70a1cb506dc4591465e1ee9be3fd7a2b6c73ecf3b949009718c9a35151991a3620011f23382620025df565b5050565b3360009081526001602052604090206004015460ff166200122b5760405162461bcd60e51b8152600401620008ac9062003253565b33600090815260016020819052604082200180543492906200124f90849062003732565b9091555050336000818152600160208190526040808320820154905160008051602062004e28833981519152936200128c9334929091906200346d565b60405180910390a2565b3360009081526001602052604090206004015460ff16620012cb5760405162461bcd60e51b8152600401620008ac9062003253565b620012d5620024b4565b6001600160a01b03166349773ea830856040518363ffffffff1660e01b81526004016200130492919062002dec565b600060405180830381865afa15801562001322573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200134c919081019062003522565b604001516200136f5760405162461bcd60e51b8152600401620008ac906200355a565b6001600160a01b038216620013985760405162461bcd60e51b8152600401620008ac9062003586565b60005b84518110156200144a57620013af6200242f565b6001600160a01b031663bb6eec8a33878481518110620013d357620013d362002f70565b60200260200101518786886040518663ffffffff1660e01b81526004016200140095949392919062003686565b600060405180830381600087803b1580156200141b57600080fd5b505af115801562001430573d6000803e3d6000fd5b505050508080620014419062003237565b9150506200139b565b506001600160a01b0380831660009081526002602052604090205485518492610100909204909116906379cc679090339062001487908662003748565b6040518363ffffffff1660e01b8152600401620014a692919062003434565b600060405180830381600087803b158015620014c157600080fd5b505af1158015620014d6573d6000803e3d6000fd5b50505050806001600160a01b031663a9059cbb33875185620014f9919062003748565b6040518363ffffffff1660e01b81526004016200151892919062003434565b6020604051808303816000875af115801562001538573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200155e91906200344d565b505050505050565b6000805460405163fb4aaf0f60e01b81526001600160a01b039091169063fb4aaf0f906200159990309060040162002d98565b600060405180830381865afa158015620015b7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620015e19190810190620032e2565b60408101519091506001600160a01b03163314806200160a57506000546001600160a01b031633145b620016295760405162461bcd60e51b8152600401620008ac9062003762565b6001600160a01b03821660009081526001602052604090206004015460ff16620016675760405162461bcd60e51b8152600401620008ac9062003253565b6001600160a01b038216600090815260016020526040812060030180548592906200169490849062003732565b90915550506001600160a01b038216600081815260016020819052604080832060030154905160008051602062004e088339815191529362000a469389929091906200346d565b6000805460405163fb4aaf0f60e01b81526001600160a01b039091169063fb4aaf0f906200170e90309060040162002d98565b600060405180830381865afa1580156200172c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620017569190810190620032e2565b60c08101519091506001600160a01b03163314620017b65760405162461bcd60e51b815260206004820152601c60248201527b596f75206d7573742074686520436f6e656374615061796d656e747360201b6044820152606401620008ac565b6001600160a01b03861660009081526001602081905260409091200154841115620017f55760405162461bcd60e51b8152600401620008ac90620037b2565b6001600160a01b038616600090815260016020526040902060038101546002909101548391620018259162003732565b1015620018465760405162461bcd60e51b8152600401620008ac9062003280565b6001600160a01b03861660009081526001602052604090206003015482901562001969576001600160a01b0387166000908152600160205260409020600301548311620018ca576001600160a01b03871660009081526001602052604081206003018054859290620018ba908490620032b3565b9091555060009150620019119050565b6001600160a01b038716600090815260016020526040902060030154620018f29082620032b3565b6001600160a01b03881660009081526001602052604081206003015590505b6001600160a01b03871660008181526001602052604090206003015460008051602062004e08833981519152906200194a8487620032b3565b600060016040516200196094939291906200346d565b60405180910390a25b8015620019ea576001600160a01b038716600090815260016020526040812060020180548392906200199d908490620032b3565b90915550506001600160a01b038716600081815260016020819052604080832060020154905160008051602062004de883398151915293620019e19387926200346d565b60405180910390a25b6001600160a01b0387166000908152600160208190526040822001805487929062001a17908490620032b3565b9091555050600086131562001aaa576001600160a01b03808516600090815260026020526040908190205490516340c10f1960e01b8152610100909104909116906340c10f199062001a70908a908a9060040162003434565b600060405180830381600087803b15801562001a8b57600080fd5b505af115801562001aa0573d6000803e3d6000fd5b5050505062001b32565b6001600160a01b038085166000908152600260205260409020546101009004166379cc67908862001ade89600019620037e4565b6040518363ffffffff1660e01b815260040162001afd92919062003434565b600060405180830381600087803b15801562001b1857600080fd5b505af115801562001b2d573d6000803e3d6000fd5b505050505b6000805460405163fb4aaf0f60e01b81526001600160a01b039091169063fb4aaf0f9062001b6590309060040162002d98565b600060405180830381865afa15801562001b83573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262001bad9190810190620032e2565b905080604001516001600160a01b03166108fc879081150290604051600060405180830381858888f1935050505015801562001bed573d6000803e3d6000fd5b506001600160a01b0388166000818152600160208190526040808320820154905160008051602062004e288339815191529362001c2c938c926200346d565b60405180910390a25050505050505050565b3360009081526001602052604090206004015460ff1662001c735760405162461bcd60e51b8152600401620008ac9062003253565b6000805460405163fb4aaf0f60e01b81526001600160a01b039091169063fb4aaf0f9062001ca690309060040162002d98565b600060405180830381865afa15801562001cc4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262001cee9190810190620032e2565b6101000151604051636ce5768960e11b81529091506001600160a01b0382169063d9caed129062001d2890339087908790600401620036c9565b600060405180830381600087803b15801562001d4357600080fd5b505af115801562001d58573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b038616925063a9059cbb915062001d8c903390869060040162003434565b6020604051808303816000875af115801562001dac573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001dd291906200344d565b50505050565b6000805460405163fb4aaf0f60e01b815282916001600160a01b03169063fb4aaf0f9062001e0b90309060040162002d98565b600060405180830381865afa15801562001e29573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262001e539190810190620032e2565b61010001516040516335af580f60e21b81523060048201526001600160a01b0385811660248301523360448301529192509082169063d6bd603c90606401602060405180830381865afa15801562001eaf573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001ed591906200381a565b9392505050565b3360009081526001602052604090206004015460ff1662001f115760405162461bcd60e51b8152600401620008ac9062003253565b336000908152600160205260408120600201805483929062001f3590849062003732565b90915550506000805460405163fb4aaf0f60e01b81526001600160a01b039091169063fb4aaf0f9062001f6d90309060040162002d98565b600060405180830381865afa15801562001f8b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262001fb59190810190620032e2565b60e001516040516323b872dd60e01b815290915081906001600160a01b038216906323b872dd9062001ff090339030908890600401620036c9565b6020604051808303816000875af115801562002010573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200203691906200344d565b5033600081815260016020819052604080832060020154905160008051602062004de88339815191529362000a469389929091906200346d565b60606200207c620024b4565b6001600160a01b03166361819d52306040518263ffffffff1660e01b8152600401620020a9919062002d98565b600060405180830381865afa158015620020c7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620020f1919081019062003834565b905090565b3360009081526001602052604090206004015460ff166200212b5760405162461bcd60e51b8152600401620008ac9062003253565b3360009081526001602081905260409091200154811115620021615760405162461bcd60e51b8152600401620008ac90620037b2565b336000908152600160208190526040822001805483929062002185908490620032b3565b9091555050604051339082156108fc029083906000818181858888f19350505050158015620021b8573d6000803e3d6000fd5b5033600081815260016020819052604080832090910154905160008051602062004e2883398151915292620021f3929186919081906200346d565b60405180910390a250565b3360009081526001602052604090206004015460ff16620022335760405162461bcd60e51b8152600401620008ac9062003253565b60005b8151811015620011f25762002268338383815181106200225a576200225a62002f70565b6020026020010151620025df565b80620022748162003237565b91505062002236565b6000805460405163fb4aaf0f60e01b81526001600160a01b039091169063fb4aaf0f90620022b090309060040162002d98565b600060405180830381865afa158015620022ce573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620022f89190810190620032e2565b60408101519091506001600160a01b03163314806200232157506000546001600160a01b031633145b620023405760405162461bcd60e51b8152600401620008ac9062003762565b6001600160a01b03821660009081526001602052604090206004015460ff166200237e5760405162461bcd60e51b8152600401620008ac9062003253565b6001600160a01b038216600090815260016020526040902060030154831115620023bc5760405162461bcd60e51b8152600401620008ac9062003280565b6001600160a01b03821660009081526001602052604081206003018054859290620023e9908490620032b3565b90915550506001600160a01b03821660008181526001602052604080822060030154905160008051602062004e088339815191529262000a46929188919081906200346d565b6000805460405163fb4aaf0f60e01b815282916001600160a01b03169063fb4aaf0f906200246290309060040162002d98565b600060405180830381865afa15801562002480573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620024aa9190810190620032e2565b60a0015192915050565b6000805460405163fb4aaf0f60e01b815282916001600160a01b03169063fb4aaf0f90620024e790309060040162002d98565b600060405180830381865afa15801562002505573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200252f9190810190620032e2565b6080015192915050565b6001600160a01b038083166000908152600260205260408082205490516340c10f1960e01b8152919261010090910416906340c10f199062002582908790869060040162003434565b600060405180830381600087803b1580156200259d57600080fd5b505af1158015620025b2573d6000803e3d6000fd5b5050506001600160a01b038085166000908152600260205260409020546101009004169150509392505050565b620025e96200242f565b6001600160a01b031663a15ab08d83836040518363ffffffff1660e01b815260040162002618929190620038e3565b600060405180830381600087803b1580156200263357600080fd5b505af11580156200155e573d6000803e3d6000fd5b6114de806200390a83390190565b60005b838110156200267357818101518382015260200162002659565b50506000910152565b600081518084526200269681602086016020860162002656565b601f01601f19169290920160200192915050565b6020815260018060a01b0382511660208201526000602083015180604084015250604083015180606084015250606083015180608084015250608083015160a08084015260c08301815180825260e08501915060e08160051b86010160208401935060005b82811015620028aa5760df1987830301845284518051606084526200273860608501826200267c565b9050602082015184820360208601526200275382826200267c565b91505060408201519150838103604085015280825180835260208301915060208160051b84010160208501945060005b828110156200288957848203601f19018452855180516001600160a01b031683526020908101516040828501819052815190850181905291019060608085019190600582901b86010160005b828110156200286b57605f1987830301845284518051835260018060a01b03602082015116602084015260408101516040840152606081015160e060608501526200281e60e08501826200267c565b9050608082015184820360808601526200283982826200267c565b60a08481015115159087015260c0938401511515939095019290925250506020948501949390930192600101620027cf565b506020998a0199979097019694505050600191909101905062002783565b5080965050505050506020850194506020840193506001810190506200270f565b509695505050505050565b600060208284031215620028c857600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b03811182821017156200290a576200290a620028cf565b60405290565b60405160e081016001600160401b03811182821017156200290a576200290a620028cf565b60405161016081016001600160401b03811182821017156200290a576200290a620028cf565b604051601f8201601f191681016001600160401b0381118282101715620029865762002986620028cf565b604052919050565b60006001600160401b03821115620029aa57620029aa620028cf565b5060051b60200190565b60006001600160401b03821115620029d057620029d0620028cf565b50601f01601f191660200190565b600082601f830112620029f057600080fd5b813562002a0762002a0182620029b4565b6200295b565b81815284602083860101111562002a1d57600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f83011262002a4c57600080fd5b8135602062002a5f62002a01836200298e565b82815260059290921b8401810191818101908684111562002a7f57600080fd5b8286015b84811015620028aa5780356001600160401b0381111562002aa45760008081fd5b62002ab48986838b0101620029de565b84525091830191830162002a83565b6001600160a01b038116811462002ad957600080fd5b50565b6000806000806080858703121562002af357600080fd5b84356001600160401b0381111562002b0a57600080fd5b62002b188782880162002a3a565b945050602085013562002b2b8162002ac3565b9250604085013562002b3d8162002ac3565b9396929550929360600135925050565b801515811462002ad957600080fd5b6000806000806080858703121562002b7357600080fd5b84356001600160401b0381111562002b8a57600080fd5b62002b988782880162002a3a565b945050602085013562002bab8162002ac3565b9250604085013562002bbd8162002ac3565b9150606085013562002bcf8162002b4d565b939692955090935050565b6000806040838503121562002bee57600080fd5b823562002bfb8162002ac3565b915060208301356001600160401b0381111562002c1757600080fd5b62002c2585828601620029de565b9150509250929050565b6000806040838503121562002c4357600080fd5b82359150602083013562002c578162002ac3565b809150509250929050565b600080600080600060a0868803121562002c7b57600080fd5b853562002c888162002ac3565b94506020860135935060408601359250606086013562002ca88162002ac3565b949793965091946080013592915050565b6000806040838503121562002ccd57600080fd5b823562002cda8162002ac3565b946020939093013593505050565b60006020828403121562002cfb57600080fd5b813562001ed58162002ac3565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b8381101562002d8a57603f1989840301855281516060815181865262002d58828701826200267c565b838b01516001600160a01b0316878c015292890151151595890195909552509487019492509086019060010162002d2f565b509098975050505050505050565b6001600160a01b0391909116815260200190565b60006020828403121562002dbf57600080fd5b81356001600160401b0381111562002dd657600080fd5b62002de48482850162002a3a565b949350505050565b6001600160a01b0392831681529116602082015260400190565b600082601f83011262002e1857600080fd5b815162002e2962002a0182620029b4565b81815284602083860101111562002e3f57600080fd5b62002de482602083016020870162002656565b6000602080838503121562002e6657600080fd5b82516001600160401b038082111562002e7e57600080fd5b818501915085601f83011262002e9357600080fd5b815162002ea462002a01826200298e565b81815260059190911b8301840190848101908883111562002ec457600080fd5b8585015b8381101562002f635780518581111562002ee25760008081fd5b86016040818c03601f190181131562002efb5760008081fd5b62002f05620028e5565b898301518881111562002f185760008081fd5b62002f288e8c8387010162002e06565b82525090820151908782111562002f3f5760008081fd5b62002f4f8d8b8486010162002e06565b818b01528552505091860191860162002ec8565b5098975050505050505050565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0384811682528316602082015260606040820181905260009062002fb4908301846200267c565b95945050505050565b805162002fca8162002ac3565b919050565b6000602080838503121562002fe357600080fd5b82516001600160401b0381111562002ffa57600080fd5b8301601f810185136200300c57600080fd5b80516200301d62002a01826200298e565b81815260059190911b820183019083810190878311156200303d57600080fd5b928401925b8284101562003068578351620030588162002ac3565b8252928401929084019062003042565b979650505050505050565b600060018060a01b0380871683528086166020840152608060408401526200309f60808401866200267c565b915080841660608401525095945050505050565b805162002fca8162002b4d565b60006020808385031215620030d457600080fd5b82516001600160401b0380821115620030ec57600080fd5b818501915085601f8301126200310157600080fd5b81516200311262002a01826200298e565b81815260059190911b830184019084810190888311156200313257600080fd5b8585015b8381101562002f63578051858111156200314f57600080fd5b860160e0818c03601f19011215620031675760008081fd5b6200317162002910565b88820151815260406200318681840162002fbd565b8a83015260608084015182840152608091508184015189811115620031ab5760008081fd5b620031bb8f8d8388010162002e06565b82850152505060a08084015189811115620031d65760008081fd5b620031e68f8d8388010162002e06565b838501525060c09150620031fc828501620030b3565b908301526200320e60e08401620030b3565b9082015284525091860191860162003136565b634e487b7160e01b600052601160045260246000fd5b6000600182016200324c576200324c62003221565b5060010190565b602080825260139082015272155cd95c881b9bdd081c9959da5cdd195c9959606a1b604082015260600190565b602080825260199082015278496e73756666696369656e7420706173732062616c616e636560381b604082015260600190565b81810381811115620032c957620032c962003221565b92915050565b805161ffff8116811462002fca57600080fd5b600060208284031215620032f557600080fd5b81516001600160401b03808211156200330d57600080fd5b9083019061016082860312156200332357600080fd5b6200332d62002935565b8251828111156200333d57600080fd5b6200334b8782860162002e06565b8252506020830151828111156200336157600080fd5b6200336f8782860162002e06565b602083015250620033836040840162002fbd565b6040820152620033966060840162002fbd565b6060820152620033a96080840162002fbd565b6080820152620033bc60a0840162002fbd565b60a0820152620033cf60c0840162002fbd565b60c0820152620033e260e0840162002fbd565b60e08201526101009150620033f982840162002fbd565b8282015261012091506200340f828401620032cf565b8282015261014091506200342582840162002fbd565b91810191909152949350505050565b6001600160a01b03929092168252602082015260400190565b6000602082840312156200346057600080fd5b815162001ed58162002b4d565b9384526020840192909252151560408301521515606082015260800190565b6000606082840312156200349f57600080fd5b604051606081016001600160401b038082118383101715620034c557620034c5620028cf565b816040528293508451915080821115620034de57600080fd5b50620034ed8582860162002e06565b8252506020830151620035008162002ac3565b60208201526040830151620035158162002b4d565b6040919091015292915050565b6000602082840312156200353557600080fd5b81516001600160401b038111156200354c57600080fd5b62002de4848285016200348c565b60208082526012908201527114dd1c985d1959de481b9bdd08199bdd5b9960721b604082015260600190565b602080825260189082015277496e76616c696420636f6e7472616374206164647265737360401b604082015260600190565b600060208284031215620035cb57600080fd5b81516001600160401b03811115620035e257600080fd5b62002de48482850162002e06565b6000602082840312156200360357600080fd5b815160ff8116811462001ed557600080fd5b6080815260006200362a60808301876200267c565b82810360208401526200363e81876200267c565b60ff95909516604084015250506001600160a01b039190911660609091015292915050565b6000826200368157634e487b7160e01b600052601260045260246000fd5b500490565b600060018060a01b03808816835260a06020840152620036aa60a08401886200267c565b9581166040840152606083019490945250911660809091015292915050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b600060018060a01b03808816835260a060208401526200371160a08401886200267c565b95811660408401529390931660608201529015156080909101525092915050565b80820180821115620032c957620032c962003221565b8082028115828204841417620032c957620032c962003221565b60208082526030908201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260408201526f206e6f722074686520666163746f727960801b606082015260800190565b602080825260189082015277496e73756666696369656e74206761732062616c616e636560401b604082015260600190565b80820260008212600160ff1b8414161562003803576200380362003221565b8181058314821517620032c957620032c962003221565b6000602082840312156200382d57600080fd5b5051919050565b600060208083850312156200384857600080fd5b82516001600160401b03808211156200386057600080fd5b818501915085601f8301126200387557600080fd5b81516200388662002a01826200298e565b81815260059190911b83018401908481019088831115620038a657600080fd5b8585015b8381101562002f6357805185811115620038c45760008081fd5b620038d48b89838a01016200348c565b845250918601918601620038aa565b6001600160a01b038316815260406020820181905260009062002de4908301846200267c56fe60806040523480156200001157600080fd5b50604051620014de380380620014de83398101604081905262000034916200028a565b836040516020016200004791906200032e565b604051602081830303815290604052836040516020016200006991906200035b565b60408051601f19818403018152919052600362000087838262000416565b50600462000096828262000416565b505050620000b3620000ad6200016760201b60201c565b6200016b565b6005805460ff60a01b1916600160a01b60ff8516908102919091179091556040805160808101825286815260208101869052908101919091526001600160a01b03821660608201526006806200010a878262000416565b506020820151600182019062000121908262000416565b506040820151600290910180546060909301516001600160a01b0316610100026001600160a81b031990931660ff9092169190911791909117905550620004e292505050565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b60005b83811015620001f0578181015183820152602001620001d6565b50506000910152565b600082601f8301126200020b57600080fd5b81516001600160401b0380821115620002285762000228620001bd565b604051601f8301601f19908116603f01168101908282118183101715620002535762000253620001bd565b816040528381528660208588010111156200026d57600080fd5b62000280846020830160208901620001d3565b9695505050505050565b60008060008060808587031215620002a157600080fd5b84516001600160401b0380821115620002b957600080fd5b620002c788838901620001f9565b95506020870151915080821115620002de57600080fd5b50620002ed87828801620001f9565b935050604085015160ff811681146200030557600080fd5b60608601519092506001600160a01b03811681146200032357600080fd5b939692955090935050565b6202628160ed1b8152600082516200034e816003850160208701620001d3565b9190910160030192915050565b6104c560f41b8152600082516200037a816002850160208701620001d3565b9190910160020192915050565b600181811c908216806200039c57607f821691505b602082108103620003bd57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200041157600081815260208120601f850160051c81016020861015620003ec5750805b601f850160051c820191505b818110156200040d57828155600101620003f8565b5050505b505050565b81516001600160401b03811115620004325762000432620001bd565b6200044a8162000443845462000387565b84620003c3565b602080601f831160018114620004825760008415620004695750858301515b600019600386901b1c1916600185901b1785556200040d565b600085815260208120601f198616915b82811015620004b35788860151825594840194600190910190840162000492565b5085821015620004d25787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b610fec80620004f26000396000f3fe608060405234801561001057600080fd5b50600436106100e65760003560e01c806306fdde03146100eb578063095ea7b31461010957806311df99951461012c57806318160ddd1461014457806323b872dd14610156578063313ce56714610169578063395093511461018857806340c10f191461019b57806370a08231146101b0578063715018a6146101d957806379cc6790146101e15780638da5cb5b146101f457806395d89b4114610214578063a457c2d71461021c578063a9059cbb1461022f578063dd62ed3e14610242578063f2fde38b14610255578063fd5d3e0114610268575b600080fd5b6100f361027d565b6040516101009190610d9f565b60405180910390f35b61011c610117366004610dd5565b61030f565b6040519015158152602001610100565b610134610329565b6040516101009493929190610dff565b6002545b604051908152602001610100565b61011c610164366004610e49565b610463565b600554600160a01b900460ff1660405160ff9091168152602001610100565b61011c610196366004610dd5565b610487565b6101ae6101a9366004610dd5565b6104a9565b005b6101486101be366004610e85565b6001600160a01b031660009081526020819052604090205490565b6101ae6104bf565b6101ae6101ef366004610dd5565b6104d3565b6101fc6104e5565b6040516001600160a01b039091168152602001610100565b6100f36104f4565b61011c61022a366004610dd5565b610503565b61011c61023d366004610dd5565b610583565b610148610250366004610ea0565b610591565b6101ae610263366004610e85565b6105bc565b610270610635565b6040516101009190610ed3565b60606003805461028c90610f3b565b80601f01602080910402602001604051908101604052809291908181526020018280546102b890610f3b565b80156103055780601f106102da57610100808354040283529160200191610305565b820191906000526020600020905b8154815290600101906020018083116102e857829003601f168201915b5050505050905090565b60003361031d8185856107b2565b60019150505b92915050565b60068054819061033890610f3b565b80601f016020809104026020016040519081016040528092919081815260200182805461036490610f3b565b80156103b15780601f10610386576101008083540402835291602001916103b1565b820191906000526020600020905b81548152906001019060200180831161039457829003601f168201915b5050505050908060010180546103c690610f3b565b80601f01602080910402602001604051908101604052809291908181526020018280546103f290610f3b565b801561043f5780601f106104145761010080835404028352916020019161043f565b820191906000526020600020905b81548152906001019060200180831161042257829003601f168201915b5050506002909301549192505060ff8116906001600160a01b036101009091041684565b6000336104718582856108d7565b61047c858585610951565b506001949350505050565b60003361031d81858561049a8383610591565b6104a49190610f75565b6107b2565b6104b1610ae3565b6104bb8282610b42565b5050565b6104c7610ae3565b6104d16000610bef565b565b6104db610ae3565b6104bb8282610c41565b6005546001600160a01b031690565b60606004805461028c90610f3b565b600033816105118286610591565b9050838110156105765760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084015b60405180910390fd5b61047c82868684036107b2565b60003361031d818585610951565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6105c4610ae3565b6001600160a01b0381166106295760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161056d565b61063281610bef565b50565b604080516080810182526060808252602082018190526000928201839052810191909152600660405180608001604052908160008201805461067690610f3b565b80601f01602080910402602001604051908101604052809291908181526020018280546106a290610f3b565b80156106ef5780601f106106c4576101008083540402835291602001916106ef565b820191906000526020600020905b8154815290600101906020018083116106d257829003601f168201915b5050505050815260200160018201805461070890610f3b565b80601f016020809104026020016040519081016040528092919081815260200182805461073490610f3b565b80156107815780601f1061075657610100808354040283529160200191610781565b820191906000526020600020905b81548152906001019060200180831161076457829003601f168201915b50505091835250506002919091015460ff8116602083015261010090046001600160a01b0316604090910152919050565b6001600160a01b0383166108145760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161056d565b6001600160a01b0382166108755760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161056d565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60006108e38484610591565b9050600019811461094b578181101561093e5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161056d565b61094b84848484036107b2565b50505050565b6001600160a01b0383166109b55760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161056d565b6001600160a01b038216610a175760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161056d565b6001600160a01b03831660009081526020819052604090205481811015610a8f5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161056d565b6001600160a01b0384811660008181526020818152604080832087870390559387168083529184902080548701905592518581529092600080516020610f97833981519152910160405180910390a361094b565b33610aec6104e5565b6001600160a01b0316146104d15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161056d565b6001600160a01b038216610b985760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161056d565b8060026000828254610baa9190610f75565b90915550506001600160a01b03821660008181526020818152604080832080548601905551848152600080516020610f97833981519152910160405180910390a35050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216610ca15760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161056d565b6001600160a01b03821660009081526020819052604090205481811015610d155760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840161056d565b6001600160a01b038316600081815260208181526040808320868603905560028054879003905551858152919291600080516020610f9783398151915291016108ca565b6000815180845260005b81811015610d7f57602081850181015186830182015201610d63565b506000602082860101526020601f19601f83011685010191505092915050565b602081526000610db26020830184610d59565b9392505050565b80356001600160a01b0381168114610dd057600080fd5b919050565b60008060408385031215610de857600080fd5b610df183610db9565b946020939093013593505050565b608081526000610e126080830187610d59565b8281036020840152610e248187610d59565b60ff95909516604084015250506001600160a01b039190911660609091015292915050565b600080600060608486031215610e5e57600080fd5b610e6784610db9565b9250610e7560208501610db9565b9150604084013590509250925092565b600060208284031215610e9757600080fd5b610db282610db9565b60008060408385031215610eb357600080fd5b610ebc83610db9565b9150610eca60208401610db9565b90509250929050565b602081526000825160806020840152610eef60a0840182610d59565b90506020840151601f19848303016040850152610f0c8282610d59565b604086015160ff16606086810191909152909501516001600160a01b0316608090940193909352509192915050565b600181811c90821680610f4f57607f821691505b602082108103610f6f57634e487b7160e01b600052602260045260246000fd5b50919050565b8082018082111561032357634e487b7160e01b600052601160045260246000fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220b813a46f9c5a2380119e806813d4f3fd5eb63f3bb7f48c535abda1e0bcb5586164736f6c634300081200338148f0cf2cc666d3bd5197297e12f548e21963e9445d59d52948db08d6be4f3cebad5c8ca3dc23fd705a8985e332663a6e1f12f5a32af1492216caf2d747e127b3d3a990655ea7a52a1f1e6be2a45e3688ff4ba917dc2d8ef08fe9a407a0a1caa264697066735822122063c8fae7f8c60c131825e1b89ce0a27de4c50c2a8528aa3d44aaaf3d424a685864736f6c63430008120033000000000000000000000000571f715285bf071d53a38c526ff4a6afcb623cc0

Deployed Bytecode

0x608060405260043610620001035760003560e01c80626624d0146200010857806316b948d9146200013d578063226cc559146200016457806323a268f1146200018b5780632af0f85c14620001b057806332434a2e14620001d55780637743fc9514620001fa5780637b951c3314620002045780637f3d598514620002295780638e3ca3fe14620002515780638ee6ce65146200027657806398ee142d146200029b578063b217ac9914620002c0578063b3492dbf14620002e5578063b49a60bb146200030a578063ba6e36521462000331578063c2877f021462000358578063c45a0155146200037d578063d4737eaf14620003ae578063d604229514620003d3575b600080fd5b3480156200011557600080fd5b50336000908152600160205260409020600201545b6040519081526020015b60405180910390f35b3480156200014a57600080fd5b5062000155620003f8565b604051620001349190620026aa565b3480156200017157600080fd5b506200018962000183366004620028b5565b62000877565b005b3480156200019857600080fd5b5062000189620001aa36600462002adc565b62000a53565b348015620001bd57600080fd5b5062000189620001cf36600462002b5c565b62000eac565b348015620001e257600080fd5b5062000189620001f436600462002bda565b62001067565b62000189620011f6565b3480156200021157600080fd5b50620001896200022336600462002adc565b62001296565b3480156200023657600080fd5b5033600090815260016020819052604090912001546200012a565b3480156200025e57600080fd5b50620001896200027036600462002c2f565b62001566565b3480156200028357600080fd5b50620001896200029536600462002c62565b620016db565b348015620002a857600080fd5b5062000189620002ba36600462002cb9565b62001c3e565b348015620002cd57600080fd5b506200012a620002df36600462002ce8565b62001dd8565b348015620002f257600080fd5b506200018962000304366004620028b5565b62001edc565b3480156200031757600080fd5b506200032262002070565b60405162000134919062002d08565b3480156200033e57600080fd5b50336000908152600160205260409020600301546200012a565b3480156200036557600080fd5b506200018962000377366004620028b5565b620020f6565b3480156200038a57600080fd5b506000546200039f906001600160a01b031681565b60405162000134919062002d98565b348015620003bb57600080fd5b5062000189620003cd36600462002dac565b620021fe565b348015620003e057600080fd5b5062000189620003f236600462002c2f565b6200227d565b620004346040518060a0016040528060006001600160a01b03168152602001600081526020016000815260200160008152602001606081525090565b6000620004406200242f565b90506000816001600160a01b0316631ebcb30d30336040518363ffffffff1660e01b81526004016200047492919062002dec565b600060405180830381865afa15801562000492573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620004bc919081019062002e52565b80519091506000816001600160401b03811115620004de57620004de620028cf565b6040519080825280602002602001820160405280156200053657816020015b6200052260405180606001604052806060815260200160608152602001606081525090565b815260200190600190039081620004fd5790505b50905060005b828110156200081a576000856001600160a01b031663a0b9bdcc30338886815181106200056d576200056d62002f70565b6020026020010151600001516040518463ffffffff1660e01b8152600401620005999392919062002f86565b600060405180830381865afa158015620005b7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620005e1919081019062002fcf565b9050600081516001600160401b03811115620006015762000601620028cf565b6040519080825280602002602001820160405280156200064957816020015b604080518082019091526000815260606020820152815260200190600190039081620006205790505b50905060005b825181101562000786576000886001600160a01b031663dba4d88f30338b898151811062000681576200068162002f70565b602002602001015160000151888781518110620006a257620006a262002f70565b60200260200101516040518563ffffffff1660e01b8152600401620006cb949392919062003073565b600060405180830381865afa158015620006e9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620007139190810190620030c0565b9050604051806040016040528085848151811062000735576200073562002f70565b60200260200101516001600160a01b031681526020018281525083838151811062000764576200076462002f70565b60200260200101819052505080806200077d9062003237565b9150506200064f565b506040518060600160405280878581518110620007a757620007a762002f70565b6020026020010151600001518152602001878581518110620007cd57620007cd62002f70565b602002602001015160200151815260200182815250848481518110620007f757620007f762002f70565b602002602001018190525050508080620008119062003237565b9150506200053c565b506040805160a0810182523360008181526001602081815285832080546001600160a01b03168652808301548287015260028101549686019690965292909152905260039091015460608201526080810191909152949350505050565b3360009081526001602052604090206004015460ff16620008b55760405162461bcd60e51b8152600401620008ac9062003253565b60405180910390fd5b33600090815260016020526040902060020154811115620008ea5760405162461bcd60e51b8152600401620008ac9062003280565b33600090815260016020526040812060020180548392906200090e908490620032b3565b90915550506000805460405163fb4aaf0f60e01b81526001600160a01b039091169063fb4aaf0f906200094690309060040162002d98565b600060405180830381865afa15801562000964573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200098e9190810190620032e2565b60e0015160405163a9059cbb60e01b815290915081906001600160a01b0382169063a9059cbb90620009c7903390879060040162003434565b6020604051808303816000875af1158015620009e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000a0d91906200344d565b503360008181526001602052604080822060020154905160008051602062004de88339815191529262000a46929188919081906200346d565b60405180910390a2505050565b3360009081526001602052604090206004015460ff1662000a885760405162461bcd60e51b8152600401620008ac9062003253565b62000a92620024b4565b6001600160a01b03166349773ea830856040518363ffffffff1660e01b815260040162000ac192919062002dec565b600060405180830381865afa15801562000adf573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262000b09919081019062003522565b6040015162000b2c5760405162461bcd60e51b8152600401620008ac906200355a565b6001600160a01b03821662000b555760405162461bcd60e51b8152600401620008ac9062003586565b6001600160a01b038216600090815260026020526040902054829060ff1662000d57576040518060400160405280600115158152602001826001600160a01b03166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa15801562000bcb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262000bf59190810190620035b8565b836001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa15801562000c34573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262000c5e9190810190620035b8565b846001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000c9d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000cc39190620035f0565b8760405162000cd29062002648565b62000ce1949392919062003615565b604051809103906000f08015801562000cfe573d6000803e3d6000fd5b506001600160a01b0390811690915284811660009081526002602090815260409091208351815494909201516001600160a81b0319909416911515610100600160a81b0319169190911761010093909216929092021790555b600062000d636200242f565b905060005b865181101562000e1c57816001600160a01b03166322a19a723389848151811062000d975762000d9762002f70565b6020026020010151898b518962000daf919062003663565b8a6040518663ffffffff1660e01b815260040162000dd295949392919062003686565b600060405180830381600087803b15801562000ded57600080fd5b505af115801562000e02573d6000803e3d6000fd5b50505050808062000e139062003237565b91505062000d68565b506040516323b872dd60e01b81526001600160a01b038316906323b872dd9062000e4f90339085908890600401620036c9565b6020604051808303816000875af115801562000e6f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000e9591906200344d565b5062000ea333858562002539565b50505050505050565b3360009081526001602052604090206004015460ff1662000ee15760405162461bcd60e51b8152600401620008ac9062003253565b62000eeb620024b4565b6001600160a01b03166349773ea830856040518363ffffffff1660e01b815260040162000f1a92919062002dec565b600060405180830381865afa15801562000f38573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262000f62919081019062003522565b6040015162000f855760405162461bcd60e51b8152600401620008ac906200355a565b6001600160a01b03821662000fae5760405162461bcd60e51b8152600401620008ac9062003586565b60005b8451811015620010605762000fc56200242f565b6001600160a01b0316637ee3055b3387848151811062000fe95762000fe962002f70565b60200260200101518787876040518663ffffffff1660e01b815260040162001016959493929190620036ed565b600060405180830381600087803b1580156200103157600080fd5b505af115801562001046573d6000803e3d6000fd5b505050508080620010579062003237565b91505062000fb1565b5050505050565b6001600160a01b03821615620010db576001600160a01b03821660009081526001602052604090206004015460ff16620010db5760405162461bcd60e51b81526020600482015260146024820152732ab73932b3b4b9ba32b932b21036b0b730b3b2b960611b6044820152606401620008ac565b3360009081526001602052604090206004015460ff16156200113a5760405162461bcd60e51b8152602060048201526017602482015276155cd95c88185b1c9958591e481c9959da5cdd195c9959604a1b6044820152606401620008ac565b6040805160a0810182526001600160a01b03848116808352600060208085018281528587018381526060870184815260016080890181815233808852958290528a872099518a546001600160a01b031916991698909817895592519288019290925551600287015551600386015592516004909401805460ff191694151594909417909355925190917f98ada70a1cb506dc4591465e1ee9be3fd7a2b6c73ecf3b949009718c9a35151991a3620011f23382620025df565b5050565b3360009081526001602052604090206004015460ff166200122b5760405162461bcd60e51b8152600401620008ac9062003253565b33600090815260016020819052604082200180543492906200124f90849062003732565b9091555050336000818152600160208190526040808320820154905160008051602062004e28833981519152936200128c9334929091906200346d565b60405180910390a2565b3360009081526001602052604090206004015460ff16620012cb5760405162461bcd60e51b8152600401620008ac9062003253565b620012d5620024b4565b6001600160a01b03166349773ea830856040518363ffffffff1660e01b81526004016200130492919062002dec565b600060405180830381865afa15801562001322573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200134c919081019062003522565b604001516200136f5760405162461bcd60e51b8152600401620008ac906200355a565b6001600160a01b038216620013985760405162461bcd60e51b8152600401620008ac9062003586565b60005b84518110156200144a57620013af6200242f565b6001600160a01b031663bb6eec8a33878481518110620013d357620013d362002f70565b60200260200101518786886040518663ffffffff1660e01b81526004016200140095949392919062003686565b600060405180830381600087803b1580156200141b57600080fd5b505af115801562001430573d6000803e3d6000fd5b505050508080620014419062003237565b9150506200139b565b506001600160a01b0380831660009081526002602052604090205485518492610100909204909116906379cc679090339062001487908662003748565b6040518363ffffffff1660e01b8152600401620014a692919062003434565b600060405180830381600087803b158015620014c157600080fd5b505af1158015620014d6573d6000803e3d6000fd5b50505050806001600160a01b031663a9059cbb33875185620014f9919062003748565b6040518363ffffffff1660e01b81526004016200151892919062003434565b6020604051808303816000875af115801562001538573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200155e91906200344d565b505050505050565b6000805460405163fb4aaf0f60e01b81526001600160a01b039091169063fb4aaf0f906200159990309060040162002d98565b600060405180830381865afa158015620015b7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620015e19190810190620032e2565b60408101519091506001600160a01b03163314806200160a57506000546001600160a01b031633145b620016295760405162461bcd60e51b8152600401620008ac9062003762565b6001600160a01b03821660009081526001602052604090206004015460ff16620016675760405162461bcd60e51b8152600401620008ac9062003253565b6001600160a01b038216600090815260016020526040812060030180548592906200169490849062003732565b90915550506001600160a01b038216600081815260016020819052604080832060030154905160008051602062004e088339815191529362000a469389929091906200346d565b6000805460405163fb4aaf0f60e01b81526001600160a01b039091169063fb4aaf0f906200170e90309060040162002d98565b600060405180830381865afa1580156200172c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620017569190810190620032e2565b60c08101519091506001600160a01b03163314620017b65760405162461bcd60e51b815260206004820152601c60248201527b596f75206d7573742074686520436f6e656374615061796d656e747360201b6044820152606401620008ac565b6001600160a01b03861660009081526001602081905260409091200154841115620017f55760405162461bcd60e51b8152600401620008ac90620037b2565b6001600160a01b038616600090815260016020526040902060038101546002909101548391620018259162003732565b1015620018465760405162461bcd60e51b8152600401620008ac9062003280565b6001600160a01b03861660009081526001602052604090206003015482901562001969576001600160a01b0387166000908152600160205260409020600301548311620018ca576001600160a01b03871660009081526001602052604081206003018054859290620018ba908490620032b3565b9091555060009150620019119050565b6001600160a01b038716600090815260016020526040902060030154620018f29082620032b3565b6001600160a01b03881660009081526001602052604081206003015590505b6001600160a01b03871660008181526001602052604090206003015460008051602062004e08833981519152906200194a8487620032b3565b600060016040516200196094939291906200346d565b60405180910390a25b8015620019ea576001600160a01b038716600090815260016020526040812060020180548392906200199d908490620032b3565b90915550506001600160a01b038716600081815260016020819052604080832060020154905160008051602062004de883398151915293620019e19387926200346d565b60405180910390a25b6001600160a01b0387166000908152600160208190526040822001805487929062001a17908490620032b3565b9091555050600086131562001aaa576001600160a01b03808516600090815260026020526040908190205490516340c10f1960e01b8152610100909104909116906340c10f199062001a70908a908a9060040162003434565b600060405180830381600087803b15801562001a8b57600080fd5b505af115801562001aa0573d6000803e3d6000fd5b5050505062001b32565b6001600160a01b038085166000908152600260205260409020546101009004166379cc67908862001ade89600019620037e4565b6040518363ffffffff1660e01b815260040162001afd92919062003434565b600060405180830381600087803b15801562001b1857600080fd5b505af115801562001b2d573d6000803e3d6000fd5b505050505b6000805460405163fb4aaf0f60e01b81526001600160a01b039091169063fb4aaf0f9062001b6590309060040162002d98565b600060405180830381865afa15801562001b83573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262001bad9190810190620032e2565b905080604001516001600160a01b03166108fc879081150290604051600060405180830381858888f1935050505015801562001bed573d6000803e3d6000fd5b506001600160a01b0388166000818152600160208190526040808320820154905160008051602062004e288339815191529362001c2c938c926200346d565b60405180910390a25050505050505050565b3360009081526001602052604090206004015460ff1662001c735760405162461bcd60e51b8152600401620008ac9062003253565b6000805460405163fb4aaf0f60e01b81526001600160a01b039091169063fb4aaf0f9062001ca690309060040162002d98565b600060405180830381865afa15801562001cc4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262001cee9190810190620032e2565b6101000151604051636ce5768960e11b81529091506001600160a01b0382169063d9caed129062001d2890339087908790600401620036c9565b600060405180830381600087803b15801562001d4357600080fd5b505af115801562001d58573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b038616925063a9059cbb915062001d8c903390869060040162003434565b6020604051808303816000875af115801562001dac573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001dd291906200344d565b50505050565b6000805460405163fb4aaf0f60e01b815282916001600160a01b03169063fb4aaf0f9062001e0b90309060040162002d98565b600060405180830381865afa15801562001e29573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262001e539190810190620032e2565b61010001516040516335af580f60e21b81523060048201526001600160a01b0385811660248301523360448301529192509082169063d6bd603c90606401602060405180830381865afa15801562001eaf573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001ed591906200381a565b9392505050565b3360009081526001602052604090206004015460ff1662001f115760405162461bcd60e51b8152600401620008ac9062003253565b336000908152600160205260408120600201805483929062001f3590849062003732565b90915550506000805460405163fb4aaf0f60e01b81526001600160a01b039091169063fb4aaf0f9062001f6d90309060040162002d98565b600060405180830381865afa15801562001f8b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262001fb59190810190620032e2565b60e001516040516323b872dd60e01b815290915081906001600160a01b038216906323b872dd9062001ff090339030908890600401620036c9565b6020604051808303816000875af115801562002010573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200203691906200344d565b5033600081815260016020819052604080832060020154905160008051602062004de88339815191529362000a469389929091906200346d565b60606200207c620024b4565b6001600160a01b03166361819d52306040518263ffffffff1660e01b8152600401620020a9919062002d98565b600060405180830381865afa158015620020c7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620020f1919081019062003834565b905090565b3360009081526001602052604090206004015460ff166200212b5760405162461bcd60e51b8152600401620008ac9062003253565b3360009081526001602081905260409091200154811115620021615760405162461bcd60e51b8152600401620008ac90620037b2565b336000908152600160208190526040822001805483929062002185908490620032b3565b9091555050604051339082156108fc029083906000818181858888f19350505050158015620021b8573d6000803e3d6000fd5b5033600081815260016020819052604080832090910154905160008051602062004e2883398151915292620021f3929186919081906200346d565b60405180910390a250565b3360009081526001602052604090206004015460ff16620022335760405162461bcd60e51b8152600401620008ac9062003253565b60005b8151811015620011f25762002268338383815181106200225a576200225a62002f70565b6020026020010151620025df565b80620022748162003237565b91505062002236565b6000805460405163fb4aaf0f60e01b81526001600160a01b039091169063fb4aaf0f90620022b090309060040162002d98565b600060405180830381865afa158015620022ce573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620022f89190810190620032e2565b60408101519091506001600160a01b03163314806200232157506000546001600160a01b031633145b620023405760405162461bcd60e51b8152600401620008ac9062003762565b6001600160a01b03821660009081526001602052604090206004015460ff166200237e5760405162461bcd60e51b8152600401620008ac9062003253565b6001600160a01b038216600090815260016020526040902060030154831115620023bc5760405162461bcd60e51b8152600401620008ac9062003280565b6001600160a01b03821660009081526001602052604081206003018054859290620023e9908490620032b3565b90915550506001600160a01b03821660008181526001602052604080822060030154905160008051602062004e088339815191529262000a46929188919081906200346d565b6000805460405163fb4aaf0f60e01b815282916001600160a01b03169063fb4aaf0f906200246290309060040162002d98565b600060405180830381865afa15801562002480573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620024aa9190810190620032e2565b60a0015192915050565b6000805460405163fb4aaf0f60e01b815282916001600160a01b03169063fb4aaf0f90620024e790309060040162002d98565b600060405180830381865afa15801562002505573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200252f9190810190620032e2565b6080015192915050565b6001600160a01b038083166000908152600260205260408082205490516340c10f1960e01b8152919261010090910416906340c10f199062002582908790869060040162003434565b600060405180830381600087803b1580156200259d57600080fd5b505af1158015620025b2573d6000803e3d6000fd5b5050506001600160a01b038085166000908152600260205260409020546101009004169150509392505050565b620025e96200242f565b6001600160a01b031663a15ab08d83836040518363ffffffff1660e01b815260040162002618929190620038e3565b600060405180830381600087803b1580156200263357600080fd5b505af11580156200155e573d6000803e3d6000fd5b6114de806200390a83390190565b60005b838110156200267357818101518382015260200162002659565b50506000910152565b600081518084526200269681602086016020860162002656565b601f01601f19169290920160200192915050565b6020815260018060a01b0382511660208201526000602083015180604084015250604083015180606084015250606083015180608084015250608083015160a08084015260c08301815180825260e08501915060e08160051b86010160208401935060005b82811015620028aa5760df1987830301845284518051606084526200273860608501826200267c565b9050602082015184820360208601526200275382826200267c565b91505060408201519150838103604085015280825180835260208301915060208160051b84010160208501945060005b828110156200288957848203601f19018452855180516001600160a01b031683526020908101516040828501819052815190850181905291019060608085019190600582901b86010160005b828110156200286b57605f1987830301845284518051835260018060a01b03602082015116602084015260408101516040840152606081015160e060608501526200281e60e08501826200267c565b9050608082015184820360808601526200283982826200267c565b60a08481015115159087015260c0938401511515939095019290925250506020948501949390930192600101620027cf565b506020998a0199979097019694505050600191909101905062002783565b5080965050505050506020850194506020840193506001810190506200270f565b509695505050505050565b600060208284031215620028c857600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b03811182821017156200290a576200290a620028cf565b60405290565b60405160e081016001600160401b03811182821017156200290a576200290a620028cf565b60405161016081016001600160401b03811182821017156200290a576200290a620028cf565b604051601f8201601f191681016001600160401b0381118282101715620029865762002986620028cf565b604052919050565b60006001600160401b03821115620029aa57620029aa620028cf565b5060051b60200190565b60006001600160401b03821115620029d057620029d0620028cf565b50601f01601f191660200190565b600082601f830112620029f057600080fd5b813562002a0762002a0182620029b4565b6200295b565b81815284602083860101111562002a1d57600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f83011262002a4c57600080fd5b8135602062002a5f62002a01836200298e565b82815260059290921b8401810191818101908684111562002a7f57600080fd5b8286015b84811015620028aa5780356001600160401b0381111562002aa45760008081fd5b62002ab48986838b0101620029de565b84525091830191830162002a83565b6001600160a01b038116811462002ad957600080fd5b50565b6000806000806080858703121562002af357600080fd5b84356001600160401b0381111562002b0a57600080fd5b62002b188782880162002a3a565b945050602085013562002b2b8162002ac3565b9250604085013562002b3d8162002ac3565b9396929550929360600135925050565b801515811462002ad957600080fd5b6000806000806080858703121562002b7357600080fd5b84356001600160401b0381111562002b8a57600080fd5b62002b988782880162002a3a565b945050602085013562002bab8162002ac3565b9250604085013562002bbd8162002ac3565b9150606085013562002bcf8162002b4d565b939692955090935050565b6000806040838503121562002bee57600080fd5b823562002bfb8162002ac3565b915060208301356001600160401b0381111562002c1757600080fd5b62002c2585828601620029de565b9150509250929050565b6000806040838503121562002c4357600080fd5b82359150602083013562002c578162002ac3565b809150509250929050565b600080600080600060a0868803121562002c7b57600080fd5b853562002c888162002ac3565b94506020860135935060408601359250606086013562002ca88162002ac3565b949793965091946080013592915050565b6000806040838503121562002ccd57600080fd5b823562002cda8162002ac3565b946020939093013593505050565b60006020828403121562002cfb57600080fd5b813562001ed58162002ac3565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b8381101562002d8a57603f1989840301855281516060815181865262002d58828701826200267c565b838b01516001600160a01b0316878c015292890151151595890195909552509487019492509086019060010162002d2f565b509098975050505050505050565b6001600160a01b0391909116815260200190565b60006020828403121562002dbf57600080fd5b81356001600160401b0381111562002dd657600080fd5b62002de48482850162002a3a565b949350505050565b6001600160a01b0392831681529116602082015260400190565b600082601f83011262002e1857600080fd5b815162002e2962002a0182620029b4565b81815284602083860101111562002e3f57600080fd5b62002de482602083016020870162002656565b6000602080838503121562002e6657600080fd5b82516001600160401b038082111562002e7e57600080fd5b818501915085601f83011262002e9357600080fd5b815162002ea462002a01826200298e565b81815260059190911b8301840190848101908883111562002ec457600080fd5b8585015b8381101562002f635780518581111562002ee25760008081fd5b86016040818c03601f190181131562002efb5760008081fd5b62002f05620028e5565b898301518881111562002f185760008081fd5b62002f288e8c8387010162002e06565b82525090820151908782111562002f3f5760008081fd5b62002f4f8d8b8486010162002e06565b818b01528552505091860191860162002ec8565b5098975050505050505050565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0384811682528316602082015260606040820181905260009062002fb4908301846200267c565b95945050505050565b805162002fca8162002ac3565b919050565b6000602080838503121562002fe357600080fd5b82516001600160401b0381111562002ffa57600080fd5b8301601f810185136200300c57600080fd5b80516200301d62002a01826200298e565b81815260059190911b820183019083810190878311156200303d57600080fd5b928401925b8284101562003068578351620030588162002ac3565b8252928401929084019062003042565b979650505050505050565b600060018060a01b0380871683528086166020840152608060408401526200309f60808401866200267c565b915080841660608401525095945050505050565b805162002fca8162002b4d565b60006020808385031215620030d457600080fd5b82516001600160401b0380821115620030ec57600080fd5b818501915085601f8301126200310157600080fd5b81516200311262002a01826200298e565b81815260059190911b830184019084810190888311156200313257600080fd5b8585015b8381101562002f63578051858111156200314f57600080fd5b860160e0818c03601f19011215620031675760008081fd5b6200317162002910565b88820151815260406200318681840162002fbd565b8a83015260608084015182840152608091508184015189811115620031ab5760008081fd5b620031bb8f8d8388010162002e06565b82850152505060a08084015189811115620031d65760008081fd5b620031e68f8d8388010162002e06565b838501525060c09150620031fc828501620030b3565b908301526200320e60e08401620030b3565b9082015284525091860191860162003136565b634e487b7160e01b600052601160045260246000fd5b6000600182016200324c576200324c62003221565b5060010190565b602080825260139082015272155cd95c881b9bdd081c9959da5cdd195c9959606a1b604082015260600190565b602080825260199082015278496e73756666696369656e7420706173732062616c616e636560381b604082015260600190565b81810381811115620032c957620032c962003221565b92915050565b805161ffff8116811462002fca57600080fd5b600060208284031215620032f557600080fd5b81516001600160401b03808211156200330d57600080fd5b9083019061016082860312156200332357600080fd5b6200332d62002935565b8251828111156200333d57600080fd5b6200334b8782860162002e06565b8252506020830151828111156200336157600080fd5b6200336f8782860162002e06565b602083015250620033836040840162002fbd565b6040820152620033966060840162002fbd565b6060820152620033a96080840162002fbd565b6080820152620033bc60a0840162002fbd565b60a0820152620033cf60c0840162002fbd565b60c0820152620033e260e0840162002fbd565b60e08201526101009150620033f982840162002fbd565b8282015261012091506200340f828401620032cf565b8282015261014091506200342582840162002fbd565b91810191909152949350505050565b6001600160a01b03929092168252602082015260400190565b6000602082840312156200346057600080fd5b815162001ed58162002b4d565b9384526020840192909252151560408301521515606082015260800190565b6000606082840312156200349f57600080fd5b604051606081016001600160401b038082118383101715620034c557620034c5620028cf565b816040528293508451915080821115620034de57600080fd5b50620034ed8582860162002e06565b8252506020830151620035008162002ac3565b60208201526040830151620035158162002b4d565b6040919091015292915050565b6000602082840312156200353557600080fd5b81516001600160401b038111156200354c57600080fd5b62002de4848285016200348c565b60208082526012908201527114dd1c985d1959de481b9bdd08199bdd5b9960721b604082015260600190565b602080825260189082015277496e76616c696420636f6e7472616374206164647265737360401b604082015260600190565b600060208284031215620035cb57600080fd5b81516001600160401b03811115620035e257600080fd5b62002de48482850162002e06565b6000602082840312156200360357600080fd5b815160ff8116811462001ed557600080fd5b6080815260006200362a60808301876200267c565b82810360208401526200363e81876200267c565b60ff95909516604084015250506001600160a01b039190911660609091015292915050565b6000826200368157634e487b7160e01b600052601260045260246000fd5b500490565b600060018060a01b03808816835260a06020840152620036aa60a08401886200267c565b9581166040840152606083019490945250911660809091015292915050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b600060018060a01b03808816835260a060208401526200371160a08401886200267c565b95811660408401529390931660608201529015156080909101525092915050565b80820180821115620032c957620032c962003221565b8082028115828204841417620032c957620032c962003221565b60208082526030908201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260408201526f206e6f722074686520666163746f727960801b606082015260800190565b602080825260189082015277496e73756666696369656e74206761732062616c616e636560401b604082015260600190565b80820260008212600160ff1b8414161562003803576200380362003221565b8181058314821517620032c957620032c962003221565b6000602082840312156200382d57600080fd5b5051919050565b600060208083850312156200384857600080fd5b82516001600160401b03808211156200386057600080fd5b818501915085601f8301126200387557600080fd5b81516200388662002a01826200298e565b81815260059190911b83018401908481019088831115620038a657600080fd5b8585015b8381101562002f6357805185811115620038c45760008081fd5b620038d48b89838a01016200348c565b845250918601918601620038aa565b6001600160a01b038316815260406020820181905260009062002de4908301846200267c56fe60806040523480156200001157600080fd5b50604051620014de380380620014de83398101604081905262000034916200028a565b836040516020016200004791906200032e565b604051602081830303815290604052836040516020016200006991906200035b565b60408051601f19818403018152919052600362000087838262000416565b50600462000096828262000416565b505050620000b3620000ad6200016760201b60201c565b6200016b565b6005805460ff60a01b1916600160a01b60ff8516908102919091179091556040805160808101825286815260208101869052908101919091526001600160a01b03821660608201526006806200010a878262000416565b506020820151600182019062000121908262000416565b506040820151600290910180546060909301516001600160a01b0316610100026001600160a81b031990931660ff9092169190911791909117905550620004e292505050565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b60005b83811015620001f0578181015183820152602001620001d6565b50506000910152565b600082601f8301126200020b57600080fd5b81516001600160401b0380821115620002285762000228620001bd565b604051601f8301601f19908116603f01168101908282118183101715620002535762000253620001bd565b816040528381528660208588010111156200026d57600080fd5b62000280846020830160208901620001d3565b9695505050505050565b60008060008060808587031215620002a157600080fd5b84516001600160401b0380821115620002b957600080fd5b620002c788838901620001f9565b95506020870151915080821115620002de57600080fd5b50620002ed87828801620001f9565b935050604085015160ff811681146200030557600080fd5b60608601519092506001600160a01b03811681146200032357600080fd5b939692955090935050565b6202628160ed1b8152600082516200034e816003850160208701620001d3565b9190910160030192915050565b6104c560f41b8152600082516200037a816002850160208701620001d3565b9190910160020192915050565b600181811c908216806200039c57607f821691505b602082108103620003bd57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200041157600081815260208120601f850160051c81016020861015620003ec5750805b601f850160051c820191505b818110156200040d57828155600101620003f8565b5050505b505050565b81516001600160401b03811115620004325762000432620001bd565b6200044a8162000443845462000387565b84620003c3565b602080601f831160018114620004825760008415620004695750858301515b600019600386901b1c1916600185901b1785556200040d565b600085815260208120601f198616915b82811015620004b35788860151825594840194600190910190840162000492565b5085821015620004d25787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b610fec80620004f26000396000f3fe608060405234801561001057600080fd5b50600436106100e65760003560e01c806306fdde03146100eb578063095ea7b31461010957806311df99951461012c57806318160ddd1461014457806323b872dd14610156578063313ce56714610169578063395093511461018857806340c10f191461019b57806370a08231146101b0578063715018a6146101d957806379cc6790146101e15780638da5cb5b146101f457806395d89b4114610214578063a457c2d71461021c578063a9059cbb1461022f578063dd62ed3e14610242578063f2fde38b14610255578063fd5d3e0114610268575b600080fd5b6100f361027d565b6040516101009190610d9f565b60405180910390f35b61011c610117366004610dd5565b61030f565b6040519015158152602001610100565b610134610329565b6040516101009493929190610dff565b6002545b604051908152602001610100565b61011c610164366004610e49565b610463565b600554600160a01b900460ff1660405160ff9091168152602001610100565b61011c610196366004610dd5565b610487565b6101ae6101a9366004610dd5565b6104a9565b005b6101486101be366004610e85565b6001600160a01b031660009081526020819052604090205490565b6101ae6104bf565b6101ae6101ef366004610dd5565b6104d3565b6101fc6104e5565b6040516001600160a01b039091168152602001610100565b6100f36104f4565b61011c61022a366004610dd5565b610503565b61011c61023d366004610dd5565b610583565b610148610250366004610ea0565b610591565b6101ae610263366004610e85565b6105bc565b610270610635565b6040516101009190610ed3565b60606003805461028c90610f3b565b80601f01602080910402602001604051908101604052809291908181526020018280546102b890610f3b565b80156103055780601f106102da57610100808354040283529160200191610305565b820191906000526020600020905b8154815290600101906020018083116102e857829003601f168201915b5050505050905090565b60003361031d8185856107b2565b60019150505b92915050565b60068054819061033890610f3b565b80601f016020809104026020016040519081016040528092919081815260200182805461036490610f3b565b80156103b15780601f10610386576101008083540402835291602001916103b1565b820191906000526020600020905b81548152906001019060200180831161039457829003601f168201915b5050505050908060010180546103c690610f3b565b80601f01602080910402602001604051908101604052809291908181526020018280546103f290610f3b565b801561043f5780601f106104145761010080835404028352916020019161043f565b820191906000526020600020905b81548152906001019060200180831161042257829003601f168201915b5050506002909301549192505060ff8116906001600160a01b036101009091041684565b6000336104718582856108d7565b61047c858585610951565b506001949350505050565b60003361031d81858561049a8383610591565b6104a49190610f75565b6107b2565b6104b1610ae3565b6104bb8282610b42565b5050565b6104c7610ae3565b6104d16000610bef565b565b6104db610ae3565b6104bb8282610c41565b6005546001600160a01b031690565b60606004805461028c90610f3b565b600033816105118286610591565b9050838110156105765760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084015b60405180910390fd5b61047c82868684036107b2565b60003361031d818585610951565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6105c4610ae3565b6001600160a01b0381166106295760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161056d565b61063281610bef565b50565b604080516080810182526060808252602082018190526000928201839052810191909152600660405180608001604052908160008201805461067690610f3b565b80601f01602080910402602001604051908101604052809291908181526020018280546106a290610f3b565b80156106ef5780601f106106c4576101008083540402835291602001916106ef565b820191906000526020600020905b8154815290600101906020018083116106d257829003601f168201915b5050505050815260200160018201805461070890610f3b565b80601f016020809104026020016040519081016040528092919081815260200182805461073490610f3b565b80156107815780601f1061075657610100808354040283529160200191610781565b820191906000526020600020905b81548152906001019060200180831161076457829003601f168201915b50505091835250506002919091015460ff8116602083015261010090046001600160a01b0316604090910152919050565b6001600160a01b0383166108145760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161056d565b6001600160a01b0382166108755760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161056d565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60006108e38484610591565b9050600019811461094b578181101561093e5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161056d565b61094b84848484036107b2565b50505050565b6001600160a01b0383166109b55760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161056d565b6001600160a01b038216610a175760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161056d565b6001600160a01b03831660009081526020819052604090205481811015610a8f5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161056d565b6001600160a01b0384811660008181526020818152604080832087870390559387168083529184902080548701905592518581529092600080516020610f97833981519152910160405180910390a361094b565b33610aec6104e5565b6001600160a01b0316146104d15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161056d565b6001600160a01b038216610b985760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161056d565b8060026000828254610baa9190610f75565b90915550506001600160a01b03821660008181526020818152604080832080548601905551848152600080516020610f97833981519152910160405180910390a35050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216610ca15760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161056d565b6001600160a01b03821660009081526020819052604090205481811015610d155760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840161056d565b6001600160a01b038316600081815260208181526040808320868603905560028054879003905551858152919291600080516020610f9783398151915291016108ca565b6000815180845260005b81811015610d7f57602081850181015186830182015201610d63565b506000602082860101526020601f19601f83011685010191505092915050565b602081526000610db26020830184610d59565b9392505050565b80356001600160a01b0381168114610dd057600080fd5b919050565b60008060408385031215610de857600080fd5b610df183610db9565b946020939093013593505050565b608081526000610e126080830187610d59565b8281036020840152610e248187610d59565b60ff95909516604084015250506001600160a01b039190911660609091015292915050565b600080600060608486031215610e5e57600080fd5b610e6784610db9565b9250610e7560208501610db9565b9150604084013590509250925092565b600060208284031215610e9757600080fd5b610db282610db9565b60008060408385031215610eb357600080fd5b610ebc83610db9565b9150610eca60208401610db9565b90509250929050565b602081526000825160806020840152610eef60a0840182610d59565b90506020840151601f19848303016040850152610f0c8282610d59565b604086015160ff16606086810191909152909501516001600160a01b0316608090940193909352509192915050565b600181811c90821680610f4f57607f821691505b602082108103610f6f57634e487b7160e01b600052602260045260246000fd5b50919050565b8082018082111561032357634e487b7160e01b600052601160045260246000fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220b813a46f9c5a2380119e806813d4f3fd5eb63f3bb7f48c535abda1e0bcb5586164736f6c634300081200338148f0cf2cc666d3bd5197297e12f548e21963e9445d59d52948db08d6be4f3cebad5c8ca3dc23fd705a8985e332663a6e1f12f5a32af1492216caf2d747e127b3d3a990655ea7a52a1f1e6be2a45e3688ff4ba917dc2d8ef08fe9a407a0a1caa264697066735822122063c8fae7f8c60c131825e1b89ce0a27de4c50c2a8528aa3d44aaaf3d424a685864736f6c63430008120033

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

000000000000000000000000571f715285bf071d53a38c526ff4a6afcb623cc0

-----Decoded View---------------
Arg [0] : _factory (address): 0x571F715285Bf071D53A38C526fF4a6aFcb623CC0

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000571f715285bf071d53a38c526ff4a6afcb623cc0


Block Transaction Gas Used Reward
view all blocks produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.