Overview
AVAX Balance
AVAX Value
$4.97 (@ $22.40/AVAX)More Info
Private Name Tags
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
13272470 | 1108 days ago | 200.94205796 AVAX | ||||
13256486 | 1108 days ago | 0.08809969 AVAX | ||||
13248501 | 1108 days ago | 0.32629516 AVAX | ||||
13248501 | 1108 days ago | 0.05435779 AVAX | ||||
13248501 | 1108 days ago | 0.05435779 AVAX | ||||
13248501 | 1108 days ago | 0.32616106 AVAX | ||||
13248501 | 1108 days ago | 0.32616106 AVAX | ||||
13248385 | 1108 days ago | 299.27315112 AVAX | ||||
13248175 | 1108 days ago | 216.22135882 AVAX | ||||
13248175 | 1108 days ago | 1.68021464 AVAX | ||||
13248173 | 1108 days ago | 20.97034745 AVAX | ||||
13248133 | 1108 days ago | 0.33476888 AVAX | ||||
13248133 | 1108 days ago | 0.05576946 AVAX | ||||
13248133 | 1108 days ago | 0.05576946 AVAX | ||||
13248133 | 1108 days ago | 0.3346317 AVAX | ||||
13248133 | 1108 days ago | 0.3346317 AVAX | ||||
13247771 | 1108 days ago | 0.36097325 AVAX | ||||
13247771 | 1108 days ago | 0.06013498 AVAX | ||||
13247771 | 1108 days ago | 0.06013498 AVAX | ||||
13247771 | 1108 days ago | 0.36082657 AVAX | ||||
13247771 | 1108 days ago | 0.36082657 AVAX | ||||
13247491 | 1108 days ago | 6.59356403 AVAX | ||||
13247491 | 1108 days ago | 1.09932419 AVAX | ||||
13247491 | 1108 days ago | 1.09932419 AVAX | ||||
13247491 | 1108 days ago | 6.60150843 AVAX |
Loading...
Loading
Contract Name:
NODERewardManager
Compiler Version
v0.8.0+commit.c7dfd78e
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: AGPL-3.0-or-later pragma solidity ^0.8.0; import "./PaymentSplitter.sol"; import "./IJoeRouter02.sol"; import "./IERC20.sol"; import "./IterableNodeTypeMapping.sol"; import "./OldRewardManager.sol"; contract NODERewardManager is PaymentSplitter { using IterableNodeTypeMapping for IterableNodeTypeMapping.Map; struct NodeEntity { string nodeTypeName; //# name of this node's type uint256 creationTime; uint256 lastClaimTime; } IterableNodeTypeMapping.Map private _nodeTypes; mapping(string => mapping(address => NodeEntity[])) private _nodeTypeOwner; mapping(string => mapping(address => uint256)) private _nodeTypeOwnerLevelUp; mapping(string => mapping(address => uint256)) private _nodeTypeOwnerCreatedPending; mapping(address => uint) public _oldNodeIndexOfUser; address public _gateKeeper; address public _polarTokenAddress; address public _oldNodeRewardManager; string public _defaultNodeTypeName; IJoeRouter02 public _uniswapV2Router; address public futurUsePool; address public distributionPool; address public poolHandler; uint256 public rewardsFee; uint256 public liquidityPoolFee; uint256 public futurFee; uint256 public totalFees; uint256 public cashoutFee; bool private swapping = false; bool private swapLiquify = true; uint256 public swapTokensAmount; bool private openMigrate = false; bool private openCreate = false; bool private openLevelUp = false; event SwapAndLiquify( uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiqudity ); constructor( address oldNodeRewardManager, address token, address[] memory payees, uint256[] memory shares, address[] memory addresses, uint256[] memory fees, uint256 swapAmount, address uniV2Router ) PaymentSplitter(payees, shares) { _gateKeeper = msg.sender; _oldNodeRewardManager = oldNodeRewardManager; _polarTokenAddress = token; futurUsePool = addresses[0]; distributionPool = addresses[1]; poolHandler = addresses[2]; require(futurUsePool != address(0) && distributionPool != address(0) && poolHandler != address(0), "FUTUR, REWARD & POOL ADDRESS CANNOT BE ZERO"); require(uniV2Router != address(0), "ROUTER CANNOT BE ZERO"); _uniswapV2Router = IJoeRouter02(uniV2Router); require( fees[0] != 0 && fees[1] != 0 && fees[2] != 0 && fees[3] != 0, "CONSTR: Fees equal 0" ); futurFee = fees[0]; rewardsFee = fees[1]; liquidityPoolFee = fees[2]; cashoutFee = fees[3]; totalFees = rewardsFee + liquidityPoolFee + futurFee; require(swapAmount > 0, "CONSTR: Swap amount incorrect"); swapTokensAmount = swapAmount * (10**18); } modifier onlySentry() { require(msg.sender == _polarTokenAddress || msg.sender == _gateKeeper, "Fuck off"); _; } // Core function addNodeType( string memory nodeTypeName, uint256[] memory values ) public onlySentry { require(bytes(nodeTypeName).length > 0, "addNodeType: Empty name"); require(!_doesNodeTypeExist(nodeTypeName), "addNodeType: same nodeTypeName exists."); _nodeTypes.set(nodeTypeName, IterableNodeTypeMapping.NodeType({ nodeTypeName: nodeTypeName, nodePrice: values[0], claimTime: values[1], rewardAmount: values[2], claimTaxBeforeTime: values[3], count: 0, max: values[4], earlyClaimTax: values[5], maxLevelUpGlobal: values[6], maxLevelUpUser: values[7], maxCreationPendingGlobal: values[8], maxCreationPendingUser: values[9] }) ); } function changeNodeType( string memory nodeTypeName, uint256 nodePrice, uint256 claimTime, uint256 rewardAmount, uint256 claimTaxBeforeTime, uint256 max, uint256 earlyClaimTax, uint256 maxLevelUpGlobal, uint256 maxLevelUpUser, uint256 maxCreationPendingGlobal, uint256 maxCreationPendingUser ) public onlySentry { require(_doesNodeTypeExist(nodeTypeName), "changeNodeType: nodeTypeName does not exist"); IterableNodeTypeMapping.NodeType storage nt = _nodeTypes.get(nodeTypeName); if (nodePrice > 0) { nt.nodePrice = nodePrice; } if (claimTime > 0) { nt.claimTime = claimTime; } if (rewardAmount > 0) { nt.rewardAmount = rewardAmount; } if (claimTaxBeforeTime > 0) { nt.claimTaxBeforeTime = claimTaxBeforeTime; } if (max > 0) { nt.max = max; } if (earlyClaimTax > 0) { nt.earlyClaimTax = earlyClaimTax; } if (maxLevelUpGlobal> 0) { nt.maxLevelUpGlobal = maxLevelUpGlobal; } if (maxLevelUpUser > 0) { nt.maxLevelUpUser = maxLevelUpUser; } if (maxCreationPendingGlobal > 0) { nt.maxCreationPendingGlobal = maxCreationPendingGlobal; } if (maxCreationPendingUser > 0) { nt.maxCreationPendingUser = maxCreationPendingUser; } } function createNodeWithTokens(string memory nodeTypeName, uint256 count) public { require(openCreate, "Node creation not authorized yet"); require(_doesNodeTypeExist(nodeTypeName), "nodeTypeName does not exist"); address sender = msg.sender; require( sender != futurUsePool && sender != distributionPool, "futur and rewardsPool cannot create node" ); uint256 nodePrice = _nodeTypes.get(nodeTypeName).nodePrice * count; require( IERC20(_polarTokenAddress).balanceOf(sender) >= nodePrice, "Balance too low for creation." ); IERC20(_polarTokenAddress).transferFrom(sender, address(this), nodePrice); uint256 contractTokenBalance = IERC20(_polarTokenAddress).balanceOf(address(this)); bool swapAmountOk = contractTokenBalance >= swapTokensAmount; if ( swapAmountOk && swapLiquify && !swapping ) { swapping = true; uint256 futurTokens = contractTokenBalance * futurFee / 100; swapAndSendToFee(futurUsePool, futurTokens); uint256 rewardsPoolTokens = contractTokenBalance * rewardsFee / 100; IERC20(_polarTokenAddress).transfer( distributionPool, rewardsPoolTokens ); uint256 swapTokens = contractTokenBalance * liquidityPoolFee / 100; swapAndLiquify(swapTokens); swapTokensForEth(IERC20(_polarTokenAddress).balanceOf(address(this))); swapping = false; } _createNodes(sender, nodeTypeName, count); } function createNodeWithPending(string memory nodeTypeName, uint256 count) public { require(openCreate, "Node creation not authorized yet"); require(_doesNodeTypeExist(nodeTypeName), "nodeTypeName does not exist"); address sender = msg.sender; require( sender != futurUsePool && sender != distributionPool, "futur and rewardsPool cannot create node" ); IterableNodeTypeMapping.NodeType storage ntarget = _nodeTypes.get(nodeTypeName); require(ntarget.maxCreationPendingGlobal >= count, "Global limit reached"); ntarget.maxCreationPendingGlobal -= count; _nodeTypeOwnerCreatedPending[nodeTypeName][msg.sender] += count; require(_nodeTypeOwnerCreatedPending[nodeTypeName][msg.sender] <= ntarget.maxCreationPendingUser, "Creation with pending limit reached for user"); uint256 nodePrice = ntarget.nodePrice * count; IterableNodeTypeMapping.NodeType memory nt; uint256 rewardAmount; for (uint256 i=0; i < _nodeTypes.size() && nodePrice > 0; i++) { nt = _nodeTypes.getValueAtIndex(i); NodeEntity[] storage nes = _nodeTypeOwner[nt.nodeTypeName][sender]; for (uint256 j=0; j < nes.length && nodePrice > 0; j++) { rewardAmount = _calculateNodeReward(nes[j]); if (nodePrice >= rewardAmount) { nes[j].lastClaimTime = block.timestamp; nodePrice -= rewardAmount; } else { nes[j].lastClaimTime = block.timestamp - rewardAmount * nt.claimTime / nt.rewardAmount; nodePrice = 0; } } } require(nodePrice == 0, "Insufficient Pending"); _createNodes(sender, nodeTypeName, count); } function _createNodes(address account, string memory nodeTypeName, uint256 count) private { require(_doesNodeTypeExist(nodeTypeName), "_createNodes: nodeTypeName does not exist"); require(count > 0, "_createNodes: count cannot be less than 1."); IterableNodeTypeMapping.NodeType storage nt; nt = _nodeTypes.get(nodeTypeName); nt.count += count; require(nt.count <= nt.max, "Max already reached"); for (uint256 i = 0; i < count; i++) { _nodeTypeOwner[nodeTypeName][account].push( NodeEntity({ nodeTypeName: nodeTypeName, creationTime: block.timestamp, lastClaimTime: block.timestamp }) ); } } function cashoutAll() public { address sender = msg.sender; IterableNodeTypeMapping.NodeType memory nt; uint256 rewardAmount = 0; for (uint256 i=0; i < _nodeTypes.size(); i++) { nt = _nodeTypes.getValueAtIndex(i); NodeEntity[] storage nes = _nodeTypeOwner[nt.nodeTypeName][sender]; for (uint256 j=0; j < nes.length; j++) { rewardAmount += _calculateNodeReward(nes[j]); nes[j].lastClaimTime = block.timestamp; } } require(rewardAmount > 0, "Nothing to claim"); IERC20(_polarTokenAddress).transferFrom(distributionPool, address(this), rewardAmount); if (swapLiquify) { uint256 feeAmount; if (cashoutFee > 0) { feeAmount = rewardAmount * cashoutFee / 100; swapTokensForEth(feeAmount); } rewardAmount -= feeAmount; } IERC20(_polarTokenAddress).transfer(sender, rewardAmount); } function calculateAllClaimableRewards(address user) public view returns (uint256) { IterableNodeTypeMapping.NodeType memory nt; uint256 rewardAmount = 0; for (uint256 i=0; i < _nodeTypes.size(); i++) { nt = _nodeTypes.getValueAtIndex(i); NodeEntity[] storage nes = _nodeTypeOwner[nt.nodeTypeName][user]; for (uint256 j=0; j < nes.length; j++) { rewardAmount += _calculateNodeReward(nes[j]); } } return rewardAmount; } function _calculateNodeReward(NodeEntity memory node) private view returns(uint256) { IterableNodeTypeMapping.NodeType memory nt = _nodeTypes.get(node.nodeTypeName); uint256 rewards; if (block.timestamp - node.lastClaimTime < nt.claimTime) { rewards = nt.rewardAmount * (block.timestamp - node.lastClaimTime) * (100 - nt.claimTaxBeforeTime) / (nt.claimTime * 100); } else { rewards = nt.rewardAmount * (block.timestamp - node.lastClaimTime) / nt.claimTime; } if (nt.rewardAmount * (block.timestamp - node.creationTime) / nt.claimTime < nt.nodePrice) { rewards = rewards * (100 - nt.earlyClaimTax) / 100; } return rewards; } function levelUp(string[] memory nodeTypeNames, string memory target) public { require(openLevelUp, "Node level up not authorized yet"); require(_doesNodeTypeExist(target), "target doesnt exist"); IterableNodeTypeMapping.NodeType storage ntarget = _nodeTypes.get(target); require(ntarget.maxLevelUpGlobal >= 1, "No one can level up this type of node"); ntarget.maxLevelUpGlobal -= 1; _nodeTypeOwnerLevelUp[target][msg.sender] += 1; require(_nodeTypeOwnerLevelUp[target][msg.sender] <= ntarget.maxLevelUpUser, "Level up limit reached for user"); uint256 targetPrice = ntarget.nodePrice; uint256 updatedPrice = targetPrice; for (uint256 i = 0; i < nodeTypeNames.length && updatedPrice > 0; i++) { string memory name = nodeTypeNames[i]; require(_doesNodeTypeExist(name), "name doesnt exist"); require(_nodeTypeOwner[name][msg.sender].length > 0, "Not owned"); IterableNodeTypeMapping.NodeType storage nt; nt = _nodeTypes.get(name); require(targetPrice > nt.nodePrice, "Cannot level down"); _nodeTypeOwner[name][msg.sender].pop(); nt.count -= 1; if (nt.nodePrice > updatedPrice) { updatedPrice = 0; } else { updatedPrice -= nt.nodePrice; } } require(updatedPrice == 0, "Not enough sent"); _createNodes(msg.sender, target, 1); } function migrateNodes(address user, uint nb) public { require(openMigrate || msg.sender == _gateKeeper, "Migration not authorized yet"); require(_doesNodeTypeExist(_defaultNodeTypeName), "moveAccount: _defaultnodeTypeName does not exist"); require(nb > 0, "Nb must be greater than 0"); uint oldNodes = OldRewardManager(_oldNodeRewardManager)._getNodeNumberOf(user); require(nb + _oldNodeIndexOfUser[user] <= oldNodes, "Too many nodes requested"); _createNodes(user, _defaultNodeTypeName, nb); _oldNodeIndexOfUser[user] += nb; } // getters function getTotalCreatedNodes() public view returns(uint256) { uint256 total = 0; for (uint256 i=0; i < _nodeTypes.size(); i++) { total += _nodeTypes.getValueAtIndex(i).count; } return total; } function getTotalCreatedNodesOf(address who) public view returns(uint256) { uint256 total = 0; for (uint256 i=0; i < getNodeTypesSize(); i++) { string memory name = _nodeTypes.getValueAtIndex(i).nodeTypeName; total += getNodeTypeOwnerNumber(name, who); } return total; } function getNodeTypesSize() public view returns(uint256) { return _nodeTypes.size(); } function getNodeTypeNameAtIndex(uint256 i) public view returns(string memory) { return _nodeTypes.getValueAtIndex(i).nodeTypeName; } function getNodeTypeOwnerNumber(string memory nodeTypeName, address _owner) public view returns(uint256) { if (!_doesNodeTypeExist(nodeTypeName)) { return 0; } return _nodeTypeOwner[nodeTypeName][_owner].length; } function getNodeTypeLevelUp(string memory nodeTypeName, address _owner) public view returns(uint256) { if (!_doesNodeTypeExist(nodeTypeName)) { return 0; } return _nodeTypeOwnerLevelUp[nodeTypeName][_owner]; } function getNodeTypeOwnerCreatedPending(string memory nodeTypeName, address _owner) public view returns(uint256) { if (!_doesNodeTypeExist(nodeTypeName)) { return 0; } return _nodeTypeOwnerCreatedPending[nodeTypeName][_owner]; } function getNodeTypeNameData(string memory nodeTypeName, uint256 i) public view returns (uint256) { if (!_doesNodeTypeExist(nodeTypeName)) { return 0; } if (i == 0) { return _nodeTypes.get(nodeTypeName).nodePrice; } else if (i == 1) { return _nodeTypes.get(nodeTypeName).claimTime; } else if (i == 2) { return _nodeTypes.get(nodeTypeName).rewardAmount; } else if (i == 3) { return _nodeTypes.get(nodeTypeName).claimTaxBeforeTime; } else if (i == 4) { return _nodeTypes.get(nodeTypeName).count; } else if (i == 5) { return _nodeTypes.get(nodeTypeName).max; } else if (i == 6) { return _nodeTypes.get(nodeTypeName).earlyClaimTax; } else if (i == 7) { return _nodeTypes.get(nodeTypeName).maxLevelUpGlobal; } else if (i == 8) { return _nodeTypes.get(nodeTypeName).maxLevelUpUser; } else if (i == 9) { return _nodeTypes.get(nodeTypeName).maxCreationPendingGlobal; } else if (i == 10) { return _nodeTypes.get(nodeTypeName).maxCreationPendingUser; } return 0; } function getNodeTypeAll(string memory nodeTypeName) public view returns(uint256[] memory) { require(_doesNodeTypeExist(nodeTypeName), "Name doesnt exist"); uint256[] memory all = new uint256[](11); IterableNodeTypeMapping.NodeType memory nt; nt = _nodeTypes.get(nodeTypeName); all[0] = nt.nodePrice; all[1] = nt.claimTime; all[2] = nt.rewardAmount; all[3] = nt.claimTaxBeforeTime; all[4] = nt.count; all[5] = nt.max; all[6] = nt.earlyClaimTax; all[7] = nt.maxLevelUpGlobal; all[8] = nt.maxLevelUpUser; all[9] = nt.maxCreationPendingGlobal; all[10] = nt.maxCreationPendingUser; return all; } function getNodeTypesAllAt(uint256 start, uint256 end) public view returns(uint256[][] memory) { uint256[][] memory all = new uint256[][](end - start); for (uint256 i = start; i < end; i++) { all[i - start] = getNodeTypeAll(_nodeTypes.getValueAtIndex(i).nodeTypeName); } return all; } // Helpers function _doesNodeTypeExist(string memory nodeTypeName) private view returns (bool) { return _nodeTypes.getIndexOfKey(nodeTypeName) >= 0; } // Setters function setDefaultNodeTypeName(string memory nodeTypeName) public onlySentry { require(_doesNodeTypeExist(nodeTypeName), "NodeType doesn exist"); _defaultNodeTypeName = nodeTypeName; } function setToken (address token) external onlySentry { _polarTokenAddress = token; } function updateUniswapV2Router(address newAddress) public onlySentry { require(newAddress != address(_uniswapV2Router), "TKN: The router already has that address"); _uniswapV2Router = IJoeRouter02(newAddress); } function updateSwapTokensAmount(uint256 newVal) external onlySentry { swapTokensAmount = newVal; } function updateFuturWall(address payable wall) external onlySentry { futurUsePool = wall; } function updateRewardsWall(address payable wall) external onlySentry { distributionPool = wall; } function updateRewardsFee(uint256 value) external onlySentry { rewardsFee = value; totalFees = rewardsFee + liquidityPoolFee + futurFee; } function updateLiquiditFee(uint256 value) external onlySentry { liquidityPoolFee = value; totalFees = rewardsFee + liquidityPoolFee + futurFee; } function updateFuturFee(uint256 value) external onlySentry { futurFee = value; totalFees = rewardsFee + liquidityPoolFee + futurFee; } function updateCashoutFee(uint256 value) external onlySentry { cashoutFee = value; } function updateGateKeeper(address _new) external onlySentry { _gateKeeper = _new; } function updateOpenMigrate(bool value) external onlySentry { openMigrate = value; } function updateOpenCreate(bool value) external onlySentry { openCreate = value; } function updateOpenLevelUp(bool value) external onlySentry { openLevelUp = value; } // swaps function swapAndSendToFee(address destination, uint256 tokens) private { uint256 initialETHBalance = address(this).balance; swapTokensForEth(tokens); uint256 newBalance = (address(this).balance) - initialETHBalance; payable(destination).transfer(newBalance); } function swapAndLiquify(uint256 tokens) private { uint256 half = tokens / 2; uint256 otherHalf = tokens - half; uint256 initialBalance = address(this).balance; swapTokensForEth(half); uint256 newBalance = address(this).balance - initialBalance; addLiquidity(otherHalf, newBalance); emit SwapAndLiquify(half, newBalance, otherHalf); } function swapTokensForEth(uint256 tokenAmount) private { address[] memory path = new address[](2); path[0] = _polarTokenAddress; path[1] = _uniswapV2Router.WAVAX(); IERC20(_polarTokenAddress).approve(address(_uniswapV2Router), tokenAmount); _uniswapV2Router.swapExactTokensForAVAXSupportingFeeOnTransferTokens( tokenAmount, 0, // accept any amount of ETH path, address(this), block.timestamp ); } function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private { IERC20(_polarTokenAddress).approve(address(_uniswapV2Router), tokenAmount); _uniswapV2Router.addLiquidityAVAX{value: ethAmount}( _polarTokenAddress, // token address tokenAmount, // amountTokenDesired 0, // slippage is unavoidable // amountTokenMin 0, // slippage is unavoidable // amountAVAXMin poolHandler, // to address block.timestamp // deadline ); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (finance/PaymentSplitter.sol) pragma solidity ^0.8.0; import "./SafeERC20.sol"; import "./Address.sol"; import "./Context.sol"; /** * @title PaymentSplitter * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware * that the Ether will be split in this way, since it is handled transparently by the contract. * * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim * an amount proportional to the percentage of total shares they were assigned. * * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release} * function. * * NOTE: This contract assumes that ERC20 tokens will behave similarly to native tokens (Ether). Rebasing tokens, and * tokens that apply fees during transfers, are likely to not be supported as expected. If in doubt, we encourage you * to run tests before sending real value to this contract. */ contract PaymentSplitter is Context { event PayeeAdded(address account, uint256 shares); event PaymentReleased(address to, uint256 amount); event ERC20PaymentReleased(IERC20 indexed token, address to, uint256 amount); event PaymentReceived(address from, uint256 amount); uint256 private _totalShares; uint256 private _totalReleased; mapping(address => uint256) private _shares; mapping(address => uint256) private _released; address[] private _payees; mapping(IERC20 => uint256) private _erc20TotalReleased; mapping(IERC20 => mapping(address => uint256)) private _erc20Released; /** * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at * the matching position in the `shares` array. * * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no * duplicates in `payees`. */ constructor(address[] memory payees, uint256[] memory shares_) payable { require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch"); require(payees.length > 0, "PaymentSplitter: no payees"); for (uint256 i = 0; i < payees.length; i++) { _addPayee(payees[i], shares_[i]); } } /** * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the * reliability of the events, and not the actual splitting of Ether. * * To learn more about this see the Solidity documentation for * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback * functions]. */ receive() external payable virtual { emit PaymentReceived(_msgSender(), msg.value); } /** * @dev Getter for the total shares held by payees. */ function totalShares() public view returns (uint256) { return _totalShares; } /** * @dev Getter for the total amount of Ether already released. */ function totalReleased() public view returns (uint256) { return _totalReleased; } /** * @dev Getter for the total amount of `token` already released. `token` should be the address of an IERC20 * contract. */ function totalReleased(IERC20 token) public view returns (uint256) { return _erc20TotalReleased[token]; } /** * @dev Getter for the amount of shares held by an account. */ function shares(address account) public view returns (uint256) { return _shares[account]; } /** * @dev Getter for the amount of Ether already released to a payee. */ function released(address account) public view returns (uint256) { return _released[account]; } /** * @dev Getter for the amount of `token` tokens already released to a payee. `token` should be the address of an * IERC20 contract. */ function released(IERC20 token, address account) public view returns (uint256) { return _erc20Released[token][account]; } /** * @dev Getter for the address of the payee number `index`. */ function payee(uint256 index) public view returns (address) { return _payees[index]; } /** * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the * total shares and their previous withdrawals. */ function release(address payable account) public virtual { require(_shares[account] > 0, "PaymentSplitter: account has no shares"); uint256 totalReceived = address(this).balance + totalReleased(); uint256 payment = _pendingPayment(account, totalReceived, released(account)); require(payment != 0, "PaymentSplitter: account is not due payment"); _released[account] += payment; _totalReleased += payment; Address.sendValue(account, payment); emit PaymentReleased(account, payment); } /** * @dev Triggers a transfer to `account` of the amount of `token` tokens they are owed, according to their * percentage of the total shares and their previous withdrawals. `token` must be the address of an IERC20 * contract. */ function release(IERC20 token, address account) public virtual { require(_shares[account] > 0, "PaymentSplitter: account has no shares"); uint256 totalReceived = token.balanceOf(address(this)) + totalReleased(token); uint256 payment = _pendingPayment(account, totalReceived, released(token, account)); require(payment != 0, "PaymentSplitter: account is not due payment"); _erc20Released[token][account] += payment; _erc20TotalReleased[token] += payment; SafeERC20.safeTransfer(token, account, payment); emit ERC20PaymentReleased(token, account, payment); } /** * @dev internal logic for computing the pending payment of an `account` given the token historical balances and * already released amounts. */ function _pendingPayment( address account, uint256 totalReceived, uint256 alreadyReleased ) private view returns (uint256) { return (totalReceived * _shares[account]) / _totalShares - alreadyReleased; } /** * @dev Add a new payee to the contract. * @param account The address of the payee to add. * @param shares_ The number of shares owned by the payee. */ function _addPayee(address account, uint256 shares_) private { require(account != address(0), "PaymentSplitter: account is the zero address"); require(shares_ > 0, "PaymentSplitter: shares are 0"); require(_shares[account] == 0, "PaymentSplitter: account already has shares"); _payees.push(account); _shares[account] = shares_; _totalShares = _totalShares + shares_; emit PayeeAdded(account, shares_); } }
// SPDX-License-Identifier: AGPL-3.0-or-later pragma solidity ^0.8.0; import "./IJoeRouter01.sol"; interface IJoeRouter02 is IJoeRouter01 { function removeLiquidityAVAXSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountAVAXMin, address to, uint256 deadline ) external returns (uint256 amountAVAX); function removeLiquidityAVAXWithPermitSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountAVAXMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountAVAX); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; function swapExactAVAXForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable; function swapExactTokensForAVAXSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: AGPL-3.0-or-later pragma solidity ^0.8.0; library IterableNodeTypeMapping { //# types of node tiers //# each node type's properties are different struct NodeType { string nodeTypeName; uint256 nodePrice; //# cost to buy a node uint256 claimTime; //# length of an epoch uint256 rewardAmount; //# reward per an epoch uint256 claimTaxBeforeTime; //# claim tax before claimTime is passed uint256 count; // created Node Count uint256 max; // max nodes uint256 earlyClaimTax; // before roi tax uint256 maxLevelUpGlobal; // max remaining levelup to get this node for everyone uint256 maxLevelUpUser; // max authorized levelUp per user for this node uint256 maxCreationPendingGlobal; // max remaining creation with pending for everyone uint256 maxCreationPendingUser; // max authorized creation with pending for a user } // Iterable mapping from string to NodeType; struct Map { string[] keys; mapping(string => NodeType) values; mapping(string => uint256) indexOf; mapping(string => bool) inserted; } function get(Map storage map, string memory key) public view returns (NodeType storage) { return map.values[key]; } function getIndexOfKey(Map storage map, string memory key) public view returns (int256) { if (!map.inserted[key]) { return -1; } return int256(map.indexOf[key]); } function getKeyAtIndex(Map storage map, uint256 index) public view returns (string memory) { return map.keys[index]; } function getValueAtIndex(Map storage map, uint256 index) public view returns (NodeType memory) { return map.values[map.keys[index]]; } function size(Map storage map) public view returns (uint256) { return map.keys.length; } function set( Map storage map, string memory key, NodeType memory value ) public { if (map.inserted[key]) { map.values[key] = value; } else { map.inserted[key] = true; map.values[key] = value; map.indexOf[key] = map.keys.length; map.keys.push(key); } } function remove(Map storage map, string memory key) public { if (!map.inserted[key]) { return; } delete map.inserted[key]; delete map.values[key]; uint256 index = map.indexOf[key]; uint256 lastIndex = map.keys.length - 1; string memory lastKey = map.keys[lastIndex]; map.indexOf[lastKey] = index; delete map.indexOf[key]; map.keys[index] = lastKey; map.keys.pop(); } }
// SPDX-License-Identifier: AGPL-3.0-or-later pragma solidity ^0.8.0; interface OldRewardManager { function _getNodeNumberOf(address account) external view returns (uint256); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; import "./IERC20.sol"; import "./Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// 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; } }
// SPDX-License-Identifier: AGPL-3.0-or-later pragma solidity ^0.8.0; interface IJoeRouter01 { function factory() external pure returns (address); function WAVAX() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns ( uint256 amountA, uint256 amountB, uint256 liquidity ); function addLiquidityAVAX( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountAVAXMin, address to, uint256 deadline ) external payable returns ( uint256 amountToken, uint256 amountAVAX, uint256 liquidity ); function removeLiquidity( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityAVAX( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountAVAXMin, address to, uint256 deadline ) external returns (uint256 amountToken, uint256 amountAVAX); function removeLiquidityWithPermit( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityAVAXWithPermit( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountAVAXMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountToken, uint256 amountAVAX); function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapTokensForExactTokens( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactAVAXForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapTokensForExactAVAX( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactTokensForAVAX( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapAVAXForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function quote( uint256 amountA, uint256 reserveA, uint256 reserveB ) external pure returns (uint256 amountB); function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountOut); function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountIn); function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts); function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts); }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": { "contracts/IterableNodeTypeMapping.sol": { "IterableNodeTypeMapping": "0xdcbb8234d0d0bc0a311b5fa3588df9e4ae7110a8" } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"oldNodeRewardManager","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"address[]","name":"payees","type":"address[]"},{"internalType":"uint256[]","name":"shares","type":"uint256[]"},{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"fees","type":"uint256[]"},{"internalType":"uint256","name":"swapAmount","type":"uint256"},{"internalType":"address","name":"uniV2Router","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"inputs":[],"name":"_defaultNodeTypeName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_gateKeeper","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_oldNodeIndexOfUser","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_oldNodeRewardManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_polarTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_uniswapV2Router","outputs":[{"internalType":"contract IJoeRouter02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"nodeTypeName","type":"string"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"addNodeType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"calculateAllClaimableRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cashoutAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cashoutFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"nodeTypeName","type":"string"},{"internalType":"uint256","name":"nodePrice","type":"uint256"},{"internalType":"uint256","name":"claimTime","type":"uint256"},{"internalType":"uint256","name":"rewardAmount","type":"uint256"},{"internalType":"uint256","name":"claimTaxBeforeTime","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"},{"internalType":"uint256","name":"earlyClaimTax","type":"uint256"},{"internalType":"uint256","name":"maxLevelUpGlobal","type":"uint256"},{"internalType":"uint256","name":"maxLevelUpUser","type":"uint256"},{"internalType":"uint256","name":"maxCreationPendingGlobal","type":"uint256"},{"internalType":"uint256","name":"maxCreationPendingUser","type":"uint256"}],"name":"changeNodeType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"nodeTypeName","type":"string"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"createNodeWithPending","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"nodeTypeName","type":"string"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"createNodeWithTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distributionPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"futurFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"futurUsePool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"nodeTypeName","type":"string"}],"name":"getNodeTypeAll","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"nodeTypeName","type":"string"},{"internalType":"address","name":"_owner","type":"address"}],"name":"getNodeTypeLevelUp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"i","type":"uint256"}],"name":"getNodeTypeNameAtIndex","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"nodeTypeName","type":"string"},{"internalType":"uint256","name":"i","type":"uint256"}],"name":"getNodeTypeNameData","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"nodeTypeName","type":"string"},{"internalType":"address","name":"_owner","type":"address"}],"name":"getNodeTypeOwnerCreatedPending","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"nodeTypeName","type":"string"},{"internalType":"address","name":"_owner","type":"address"}],"name":"getNodeTypeOwnerNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"getNodeTypesAllAt","outputs":[{"internalType":"uint256[][]","name":"","type":"uint256[][]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNodeTypesSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalCreatedNodes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"getTotalCreatedNodesOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string[]","name":"nodeTypeNames","type":"string[]"},{"internalType":"string","name":"target","type":"string"}],"name":"levelUp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"liquidityPoolFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"nb","type":"uint256"}],"name":"migrateNodes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolHandler","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"nodeTypeName","type":"string"}],"name":"setDefaultNodeTypeName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"setToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"updateCashoutFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"updateFuturFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"wall","type":"address"}],"name":"updateFuturWall","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_new","type":"address"}],"name":"updateGateKeeper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"updateLiquiditFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"updateOpenCreate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"updateOpenLevelUp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"updateOpenMigrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"updateRewardsFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"wall","type":"address"}],"name":"updateRewardsWall","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newVal","type":"uint256"}],"name":"updateSwapTokensAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateUniswapV2Router","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6080604052601c805461ffff1916610100179055601e805462ffffff191690553480156200002c57600080fd5b50604051620069ea380380620069ea8339810160408190526200004f916200072a565b858580518251146200007e5760405162461bcd60e51b81526004016200007590620008f4565b60405180910390fd5b6000825111620000a25760405162461bcd60e51b8152600401620000759062000a13565b60005b8251811015620001265762000111838281518110620000d457634e487b7160e01b600052603260045260246000fd5b6020026020010151838381518110620000fd57634e487b7160e01b600052603260045260246000fd5b6020026020010151620004ff60201b60201c565b806200011d8162000b10565b915050620000a5565b5050600f8054336001600160a01b0319918216179091556011805482166001600160a01b038c81169190911790915560108054909216908a1617905550835184906000906200018557634e487b7160e01b600052603260045260246000fd5b6020026020010151601460006101000a8154816001600160a01b0302191690836001600160a01b0316021790555083600181518110620001d557634e487b7160e01b600052603260045260246000fd5b6020026020010151601560006101000a8154816001600160a01b0302191690836001600160a01b03160217905550836002815181106200022557634e487b7160e01b600052603260045260246000fd5b6020908102919091010151601680546001600160a01b0319166001600160a01b0392831617905560145416158015906200026957506015546001600160a01b031615155b80156200028057506016546001600160a01b031615155b6200029f5760405162461bcd60e51b8152600401620000759062000946565b6001600160a01b038116620002c85760405162461bcd60e51b81526004016200007590620008bd565b601380546001600160a01b0319166001600160a01b038316179055825183906000906200030557634e487b7160e01b600052603260045260246000fd5b6020026020010151600014158015620003485750826001815181106200033b57634e487b7160e01b600052603260045260246000fd5b6020026020010151600014155b80156200037f5750826002815181106200037257634e487b7160e01b600052603260045260246000fd5b6020026020010151600014155b8015620003b6575082600381518110620003a957634e487b7160e01b600052603260045260246000fd5b6020026020010151600014155b620003d55760405162461bcd60e51b815260040162000075906200083a565b82600081518110620003f757634e487b7160e01b600052603260045260246000fd5b6020026020010151601981905550826001815181106200042757634e487b7160e01b600052603260045260246000fd5b6020026020010151601781905550826002815181106200045757634e487b7160e01b600052603260045260246000fd5b6020026020010151601881905550826003815181106200048757634e487b7160e01b600052603260045260246000fd5b6020026020010151601b81905550601954601854601754620004aa919062000ad3565b620004b6919062000ad3565b601a5581620004d95760405162461bcd60e51b8152600401620000759062000991565b620004ed82670de0b6b3a764000062000aee565b601d555062000b5a9650505050505050565b6001600160a01b038216620005285760405162461bcd60e51b8152600401620000759062000871565b600081116200054b5760405162461bcd60e51b8152600401620000759062000a4a565b6001600160a01b03821660009081526002602052604090205415620005845760405162461bcd60e51b81526004016200007590620009c8565b60048054600181019091557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b0319166001600160a01b038416908117909155600090815260026020526040812082905554620005ec90829062000ad3565b6000556040517f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac9062000623908490849062000821565b60405180910390a15050565b80516001600160a01b03811681146200064757600080fd5b919050565b600082601f8301126200065d578081fd5b8151602062000676620006708362000aad565b62000a81565b828152818101908583018385028701840188101562000693578586fd5b855b85811015620006bc57620006a9826200062f565b8452928401929084019060010162000695565b5090979650505050505050565b600082601f830112620006da578081fd5b81516020620006ed620006708362000aad565b82815281810190858301838502870184018810156200070a578586fd5b855b85811015620006bc578151845292840192908401906001016200070c565b600080600080600080600080610100898b03121562000747578384fd5b62000752896200062f565b97506200076260208a016200062f565b60408a01519097506001600160401b03808211156200077f578586fd5b6200078d8c838d016200064c565b975060608b0151915080821115620007a3578586fd5b620007b18c838d01620006c9565b965060808b0151915080821115620007c7578586fd5b620007d58c838d016200064c565b955060a08b0151915080821115620007eb578485fd5b50620007fa8b828c01620006c9565b93505060c089015191506200081260e08a016200062f565b90509295985092959890939650565b6001600160a01b03929092168252602082015260400190565b60208082526014908201527f434f4e5354523a204665657320657175616c2030000000000000000000000000604082015260600190565b6020808252602c908201527f5061796d656e7453706c69747465723a206163636f756e74206973207468652060408201526b7a65726f206164647265737360a01b606082015260800190565b60208082526015908201527f524f555445522043414e4e4f54204245205a45524f0000000000000000000000604082015260600190565b60208082526032908201527f5061796d656e7453706c69747465723a2070617965657320616e6420736861726040820152710cae640d8cadccee8d040dad2e6dac2e8c6d60731b606082015260800190565b6020808252602b908201527f46555455522c20524557415244202620504f4f4c20414444524553532043414e60408201526a4e4f54204245205a45524f60a81b606082015260800190565b6020808252601d908201527f434f4e5354523a205377617020616d6f756e7420696e636f7272656374000000604082015260600190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960408201526a206861732073686172657360a81b606082015260800190565b6020808252601a908201527f5061796d656e7453706c69747465723a206e6f20706179656573000000000000604082015260600190565b6020808252601d908201527f5061796d656e7453706c69747465723a20736861726573206172652030000000604082015260600190565b6040518181016001600160401b038111828210171562000aa55762000aa562000b44565b604052919050565b60006001600160401b0382111562000ac95762000ac962000b44565b5060209081020190565b6000821982111562000ae95762000ae962000b2e565b500190565b600081600019048311821515161562000b0b5762000b0b62000b2e565b500290565b600060001982141562000b275762000b2762000b2e565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b615e808062000b6a6000396000f3fe60806040526004361061036f5760003560e01c80636d9ae0be116101c6578063c4c69038116100f7578063d8a911d911610095578063ea84397b1161006f578063ea84397b146109cc578063ef630563146109e1578063f5368c29146109f6578063f54549bc14610a16576103b6565b8063d8a911d914610977578063e19d3c4814610997578063e33b7de3146109b7576103b6565b8063ce7c2ac2116100d1578063ce7c2ac2146108f5578063d061943914610915578063d6a0d2ee14610942578063d79779b214610957576103b6565b8063c4c69038146108ab578063c5ca7d6d146108cb578063ca721f22146108e0576103b6565b80639f3b0abe11610164578063ab5747611161013e578063ab57476114610836578063ae8369e81461084b578063b64922471461086b578063bbc679981461088b576103b6565b80639f3b0abe146107df578063a0a8fe651461080c578063a538ddf214610821576103b6565b80638b83209b116101a05780638b83209b1461076a5780639349c47d1461078a5780639852595c146107aa5780639cfccb46146107ca576103b6565b80636d9ae0be14610715578063795e01131461072a57806388c41d7c1461074a576103b6565b8063406072a9116102a057806354f12f1f1161023e57806365b8dbc01161021857806365b8dbc0146106955780636770474b146106b55780636815a91c146106d557806369d0013b146106f5576103b6565b806354f12f1f14610656578063583e05681461066b5780635f1c318214610680576103b6565b806348b750441161027a57806348b75044146105e15780634c0768fc146106015780634c7f490e146106215780635455797314610641576103b6565b8063406072a91461057457806342bc9fca1461059457806347aab1f8146105b4576103b6565b80631ff9e1951161030d5780632bb14e1d116102e75780632bb14e1d1461050a5780633a98ef391461051f5780633d80733d146105345780633f8bdd2214610554576103b6565b80631ff9e195146104a8578063255d7d55146104c85780632a607841146104e8576103b6565b80630c08f300116103495780630c08f3001461043357806313114a9d14610453578063144fa6d7146104685780631916558714610488576103b6565b806301251f2a146103bb578063035f722b146103f1578063084a6bff14610413576103b6565b366103b6577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77061039d610a36565b346040516103ac929190615203565b60405180910390a1005b600080fd5b3480156103c757600080fd5b506103db6103d6366004614c80565b610a3a565b6040516103e89190615b24565b60405180910390f35b3480156103fd57600080fd5b5061041161040c366004614e93565b610ccf565b005b34801561041f57600080fd5b5061041161042e366004615104565b610fb2565b34801561043f57600080fd5b5061041161044e366004614c80565b611016565b34801561045f57600080fd5b506103db611077565b34801561047457600080fd5b50610411610483366004614c80565b61107d565b34801561049457600080fd5b506104116104a3366004614c80565b6110de565b3480156104b457600080fd5b506103db6104c3366004614e4e565b6111ec565b3480156104d457600080fd5b506104116104e3366004614ce3565b611241565b3480156104f457600080fd5b506104fd611660565b6040516103e891906151ef565b34801561051657600080fd5b506103db61166f565b34801561052b57600080fd5b506103db611675565b34801561054057600080fd5b506103db61054f366004614e4e565b61167b565b34801561056057600080fd5b5061041161056f366004614c80565b6116a2565b34801561058057600080fd5b506103db61058f366004614dcb565b611703565b3480156105a057600080fd5b506104116105af366004615104565b61172e565b3480156105c057600080fd5b506105d46105cf36600461511c565b611783565b6040516103e8919061527b565b3480156105ed57600080fd5b506104116105fc366004614dcb565b6118d6565b34801561060d57600080fd5b5061041161061c366004614d93565b611a8c565b34801561062d57600080fd5b506103db61063c366004614c80565b611ae5565b34801561064d57600080fd5b50610411611bbe565b34801561066257600080fd5b506103db611f3f565b34801561067757600080fd5b506104fd611f45565b34801561068c57600080fd5b506103db611f54565b3480156106a157600080fd5b506104116106b0366004614c80565b611f5a565b3480156106c157600080fd5b506104116106d0366004615104565b611fe9565b3480156106e157600080fd5b506104116106f0366004615104565b61202d565b34801561070157600080fd5b50610411610710366004614d93565b612071565b34801561072157600080fd5b506103db6120c3565b34801561073657600080fd5b506103db610745366004614f4c565b6120c9565b34801561075657600080fd5b50610411610765366004615104565b6127af565b34801561077657600080fd5b506104fd610785366004615104565b612804565b34801561079657600080fd5b506104116107a5366004614c80565b612842565b3480156107b657600080fd5b506103db6107c5366004614c80565b6128a3565b3480156107d657600080fd5b506104fd6128be565b3480156107eb57600080fd5b506107ff6107fa366004615104565b6128cd565b6040516103e891906152ee565b34801561081857600080fd5b506103db612965565b34801561082d57600080fd5b506104fd612aaf565b34801561084257600080fd5b506103db612abe565b34801561085757600080fd5b50610411610866366004614cb8565b612ac4565b34801561087757600080fd5b50610411610886366004614f4c565b612d58565b34801561089757600080fd5b506104116108a6366004614f4c565b613215565b3480156108b757600080fd5b506104116108c6366004614f8f565b6136d3565b3480156108d757600080fd5b506104fd613861565b3480156108ec57600080fd5b506107ff613870565b34801561090157600080fd5b506103db610910366004614c80565b6138fe565b34801561092157600080fd5b50610935610930366004614e1b565b613919565b6040516103e891906152db565b34801561094e57600080fd5b506103db613d35565b34801561096357600080fd5b506103db610972366004614c80565b613dc5565b34801561098357600080fd5b506103db610992366004614e4e565b613de0565b3480156109a357600080fd5b506104116109b2366004614d93565b613e07565b3480156109c357600080fd5b506103db613e62565b3480156109d857600080fd5b506104fd613e68565b3480156109ed57600080fd5b506104fd613e77565b348015610a0257600080fd5b506103db610a11366004614c80565b613e86565b348015610a2257600080fd5b50610411610a31366004614e1b565b613e98565b3390565b6000610a44614aab565b6000805b604051630fd2479b60e31b815273dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a890637e923cd890610a8090600790600401615b24565b60206040518083038186803b158015610a9857600080fd5b505af4158015610aac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad09190614e03565b811015610cc757604051633846629960e01b815273dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a890633846629990610b11906007908590600401615c01565b60006040518083038186803b158015610b2957600080fd5b505af4158015610b3d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b659190810190615021565b92506000600b8460000151604051610b7d91906151d0565b90815260408051602092819003830190206001600160a01b03891660009081529252812091505b8154811015610cb257610c94828281548110610bd057634e487b7160e01b600052603260045260246000fd5b9060005260206000209060030201604051806060016040529081600082018054610bf990615da5565b80601f0160208091040260200160405190810160405280929190818152602001828054610c2590615da5565b8015610c725780601f10610c4757610100808354040283529160200191610c72565b820191906000526020600020905b815481529060010190602001808311610c5557829003601f168201915b5050505050815260200160018201548152602001600282015481525050613f13565b610c9e9085615d0b565b935080610caa81615de0565b915050610ba4565b50508080610cbf90615de0565b915050610a48565b509392505050565b6010546001600160a01b0316331480610cf25750600f546001600160a01b031633145b610d175760405162461bcd60e51b8152600401610d0e906159d9565b60405180910390fd5b6000825111610d385760405162461bcd60e51b8152600401610d0e906157d6565b610d41826141c1565b15610d5e5760405162461bcd60e51b8152600401610d0e9061580d565b600773dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a8634174008590918460405180610180016040528087815260200186600081518110610db057634e487b7160e01b600052603260045260246000fd5b6020026020010151815260200186600181518110610dde57634e487b7160e01b600052603260045260246000fd5b6020026020010151815260200186600281518110610e0c57634e487b7160e01b600052603260045260246000fd5b6020026020010151815260200186600381518110610e3a57634e487b7160e01b600052603260045260246000fd5b602002602001015181526020016000815260200186600481518110610e6f57634e487b7160e01b600052603260045260246000fd5b6020026020010151815260200186600581518110610e9d57634e487b7160e01b600052603260045260246000fd5b6020026020010151815260200186600681518110610ecb57634e487b7160e01b600052603260045260246000fd5b6020026020010151815260200186600781518110610ef957634e487b7160e01b600052603260045260246000fd5b6020026020010151815260200186600881518110610f2757634e487b7160e01b600052603260045260246000fd5b6020026020010151815260200186600981518110610f5557634e487b7160e01b600052603260045260246000fd5b60200260200101518152506040518463ffffffff1660e01b8152600401610f7e93929190615b46565b60006040518083038186803b158015610f9657600080fd5b505af4158015610faa573d6000803e3d6000fd5b505050505050565b6010546001600160a01b0316331480610fd55750600f546001600160a01b031633145b610ff15760405162461bcd60e51b8152600401610d0e906159d9565b60178190556019546018546110069083615d0b565b6110109190615d0b565b601a5550565b6010546001600160a01b03163314806110395750600f546001600160a01b031633145b6110555760405162461bcd60e51b8152600401610d0e906159d9565b601480546001600160a01b0319166001600160a01b0392909216919091179055565b601a5481565b6010546001600160a01b03163314806110a05750600f546001600160a01b031633145b6110bc5760405162461bcd60e51b8152600401610d0e906159d9565b601080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381166000908152600260205260409020546111135760405162461bcd60e51b8152600401610d0e9061540b565b600061111d613e62565b6111279047615d0b565b9050600061113e8383611139866128a3565b614258565b90508061115d5760405162461bcd60e51b8152600401610d0e90615598565b6001600160a01b03831660009081526003602052604081208054839290611185908490615d0b565b92505081905550806001600082825461119e9190615d0b565b909155506111ae90508382614293565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b05683826040516111df929190615203565b60405180910390a1505050565b60006111f7836141c1565b6112035750600061123b565b600d8360405161121391906151d0565b90815260408051602092819003830190206001600160a01b0385166000908152925290205490505b92915050565b601e5462010000900460ff166112695760405162461bcd60e51b8152600401610d0e906156f1565b611272816141c1565b61128e5760405162461bcd60e51b8152600401610d0e90615726565b604051635bce6b3b60e01b815260009073dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a890635bce6b3b906112cb906007908690600401615b2d565b60206040518083038186803b1580156112e357600080fd5b505af41580156112f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061131b9190614e03565b90506001816008015410156113425760405162461bcd60e51b8152600401610d0e90615451565b60018160080160008282546113579190615d62565b925050819055506001600c8360405161137091906151d0565b908152604080516020928190038301902033600090815292528120805490919061139b908490615d0b565b90915550506009810154604051600c906113b69085906151d0565b9081526040805160209281900383019020336000908152925290205411156113f05760405162461bcd60e51b8152600401610d0e9061534a565b60018101548060005b8551811080156114095750600082115b1561162e57600086828151811061143057634e487b7160e01b600052603260045260246000fd5b60200260200101519050611443816141c1565b61145f5760405162461bcd60e51b8152600401610d0e906159fb565b6000600b8260405161147191906151d0565b90815260408051602092819003830190203360009081529252902054116114aa5760405162461bcd60e51b8152600401610d0e906154e1565b604051635bce6b3b60e01b815260009073dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a890635bce6b3b906114e7906007908690600401615b2d565b60206040518083038186803b1580156114ff57600080fd5b505af4158015611513573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115379190614e03565b90508060010154851161155c5760405162461bcd60e51b8152600401610d0e906158ac565b600b8260405161156c91906151d0565b9081526040805160209281900383019020336000908152925290208054806115a457634e487b7160e01b600052603160045260246000fd5b600082815260208120600019909201916003830201906115c48282614b0c565b600182016000905560028201600090555050905560018160050160008282546115ed9190615d62565b909155505060018101548410156116075760009350611619565b60018101546116169085615d62565b93505b5050808061162690615de0565b9150506113f9565b50801561164d5760405162461bcd60e51b8152600401610d0e906153e2565b61165933856001614334565b5050505050565b6016546001600160a01b031681565b60175481565b60005490565b6000611686836141c1565b6116925750600061123b565b600c8360405161121391906151d0565b6010546001600160a01b03163314806116c55750600f546001600160a01b031633145b6116e15760405162461bcd60e51b8152600401610d0e906159d9565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b6010546001600160a01b03163314806117515750600f546001600160a01b031633145b61176d5760405162461bcd60e51b8152600401610d0e906159d9565b6018819055601954601754611006908390615d0b565b606060006117918484615d62565b67ffffffffffffffff8111156117b757634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156117ea57816020015b60608152602001906001900390816117d55790505b509050835b83811015610cc757604051633846629960e01b815261188f9073dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a890633846629990611835906007908690600401615c01565b60006040518083038186803b15801561184d57600080fd5b505af4158015611861573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526118899190810190615021565b51613919565b8261189a8784615d62565b815181106118b857634e487b7160e01b600052603260045260246000fd5b602002602001018190525080806118ce90615de0565b9150506117ef565b6001600160a01b03811660009081526002602052604090205461190b5760405162461bcd60e51b8152600401610d0e9061540b565b600061191683613dc5565b6040516370a0823160e01b81526001600160a01b038516906370a08231906119429030906004016151ef565b60206040518083038186803b15801561195a57600080fd5b505afa15801561196e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119929190614e03565b61199c9190615d0b565b905060006119af83836111398787611703565b9050806119ce5760405162461bcd60e51b8152600401610d0e90615598565b6001600160a01b03808516600090815260066020908152604080832093871683529290529081208054839290611a05908490615d0b565b90915550506001600160a01b03841660009081526005602052604081208054839290611a32908490615d0b565b90915550611a4390508484836144f3565b836001600160a01b03167f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a8483604051611a7e929190615203565b60405180910390a250505050565b6010546001600160a01b0316331480611aaf5750600f546001600160a01b031633145b611acb5760405162461bcd60e51b8152600401610d0e906159d9565b601e80549115156101000261ff0019909216919091179055565b600080805b611af2613d35565b811015611bb757604051633846629960e01b815260009073dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a890633846629990611b36906007908690600401615c01565b60006040518083038186803b158015611b4e57600080fd5b505af4158015611b62573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611b8a9190810190615021565b519050611b978186613de0565b611ba19084615d0b565b9250508080611baf90615de0565b915050611aea565b5092915050565b33611bc7614aab565b6000805b604051630fd2479b60e31b815273dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a890637e923cd890611c0390600790600401615b24565b60206040518083038186803b158015611c1b57600080fd5b505af4158015611c2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c539190614e03565b811015611dbb57604051633846629960e01b815273dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a890633846629990611c94906007908590600401615c01565b60006040518083038186803b158015611cac57600080fd5b505af4158015611cc0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611ce89190810190615021565b92506000600b8460000151604051611d0091906151d0565b90815260408051602092819003830190206001600160a01b03881660009081529252812091505b8154811015611da657611d53828281548110610bd057634e487b7160e01b600052603260045260246000fd5b611d5d9085615d0b565b935042828281548110611d8057634e487b7160e01b600052603260045260246000fd5b600091825260209091206002600390920201015580611d9e81615de0565b915050611d27565b50508080611db390615de0565b915050611bcb565b5060008111611ddc5760405162461bcd60e51b8152600401610d0e906153b8565b6010546015546040516323b872dd60e01b81526001600160a01b03928316926323b872dd92611e14929116903090869060040161521c565b602060405180830381600087803b158015611e2e57600080fd5b505af1158015611e42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e669190614daf565b50601c54610100900460ff1615611eb557601b5460009015611ea7576064601b5483611e929190615d43565b611e9c9190615d23565b9050611ea781614549565b611eb18183615d62565b9150505b60105460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90611ee79086908590600401615203565b602060405180830381600087803b158015611f0157600080fd5b505af1158015611f15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f399190614daf565b50505050565b60185481565b6013546001600160a01b031681565b601d5481565b6010546001600160a01b0316331480611f7d5750600f546001600160a01b031633145b611f995760405162461bcd60e51b8152600401610d0e906159d9565b6013546001600160a01b0382811691161415611fc75760405162461bcd60e51b8152600401610d0e90615611565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b6010546001600160a01b031633148061200c5750600f546001600160a01b031633145b6120285760405162461bcd60e51b8152600401610d0e906159d9565b601d55565b6010546001600160a01b03163314806120505750600f546001600160a01b031633145b61206c5760405162461bcd60e51b8152600401610d0e906159d9565b601b55565b6010546001600160a01b03163314806120945750600f546001600160a01b031633145b6120b05760405162461bcd60e51b8152600401610d0e906159d9565b601e805460ff1916911515919091179055565b601b5481565b60006120d4836141c1565b6120e05750600061123b565b8161217a57604051635bce6b3b60e01b815273dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a890635bce6b3b9061211f906007908790600401615b2d565b60206040518083038186803b15801561213757600080fd5b505af415801561214b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061216f9190614e03565b60010154905061123b565b816001141561221857604051635bce6b3b60e01b815273dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a890635bce6b3b906121bd906007908790600401615b2d565b60206040518083038186803b1580156121d557600080fd5b505af41580156121e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061220d9190614e03565b60020154905061123b565b81600214156122b657604051635bce6b3b60e01b815273dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a890635bce6b3b9061225b906007908790600401615b2d565b60206040518083038186803b15801561227357600080fd5b505af4158015612287573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122ab9190614e03565b60030154905061123b565b816003141561235457604051635bce6b3b60e01b815273dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a890635bce6b3b906122f9906007908790600401615b2d565b60206040518083038186803b15801561231157600080fd5b505af4158015612325573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123499190614e03565b60040154905061123b565b81600414156123f257604051635bce6b3b60e01b815273dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a890635bce6b3b90612397906007908790600401615b2d565b60206040518083038186803b1580156123af57600080fd5b505af41580156123c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123e79190614e03565b60050154905061123b565b816005141561249057604051635bce6b3b60e01b815273dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a890635bce6b3b90612435906007908790600401615b2d565b60206040518083038186803b15801561244d57600080fd5b505af4158015612461573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124859190614e03565b60060154905061123b565b816006141561252e57604051635bce6b3b60e01b815273dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a890635bce6b3b906124d3906007908790600401615b2d565b60206040518083038186803b1580156124eb57600080fd5b505af41580156124ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125239190614e03565b60070154905061123b565b81600714156125cc57604051635bce6b3b60e01b815273dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a890635bce6b3b90612571906007908790600401615b2d565b60206040518083038186803b15801561258957600080fd5b505af415801561259d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125c19190614e03565b60080154905061123b565b816008141561266a57604051635bce6b3b60e01b815273dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a890635bce6b3b9061260f906007908790600401615b2d565b60206040518083038186803b15801561262757600080fd5b505af415801561263b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061265f9190614e03565b60090154905061123b565b816009141561270857604051635bce6b3b60e01b815273dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a890635bce6b3b906126ad906007908790600401615b2d565b60206040518083038186803b1580156126c557600080fd5b505af41580156126d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126fd9190614e03565b600a0154905061123b565b81600a14156127a657604051635bce6b3b60e01b815273dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a890635bce6b3b9061274b906007908790600401615b2d565b60206040518083038186803b15801561276357600080fd5b505af4158015612777573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061279b9190614e03565b600b0154905061123b565b50600092915050565b6010546001600160a01b03163314806127d25750600f546001600160a01b031633145b6127ee5760405162461bcd60e51b8152600401610d0e906159d9565b6019819055601854601754829161100691615d0b565b60006004828154811061282757634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031692915050565b6010546001600160a01b03163314806128655750600f546001600160a01b031633145b6128815760405162461bcd60e51b8152600401610d0e906159d9565b601580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b031660009081526003602052604090205490565b6010546001600160a01b031681565b604051633846629960e01b815260609073dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a89063384662999061290a906007908690600401615c01565b60006040518083038186803b15801561292257600080fd5b505af4158015612936573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261295e9190810190615021565b5192915050565b600080805b604051630fd2479b60e31b815273dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a890637e923cd8906129a290600790600401615b24565b60206040518083038186803b1580156129ba57600080fd5b505af41580156129ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129f29190614e03565b811015612aa957604051633846629960e01b815273dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a890633846629990612a33906007908590600401615c01565b60006040518083038186803b158015612a4b57600080fd5b505af4158015612a5f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612a879190810190615021565b60a00151612a959083615d0b565b915080612aa181615de0565b91505061296a565b50905090565b6014546001600160a01b031681565b60195481565b601e5460ff1680612adf5750600f546001600160a01b031633145b612afb5760405162461bcd60e51b8152600401610d0e90615a26565b612b8e60128054612b0b90615da5565b80601f0160208091040260200160405190810160405280929190818152602001828054612b3790615da5565b8015612b845780601f10612b5957610100808354040283529160200191612b84565b820191906000526020600020905b815481529060010190602001808311612b6757829003601f168201915b50505050506141c1565b612baa5760405162461bcd60e51b8152600401610d0e906156a1565b60008111612bca5760405162461bcd60e51b8152600401610d0e90615381565b60115460405163112469f960e21b81526000916001600160a01b031690634491a7e490612bfb9086906004016151ef565b60206040518083038186803b158015612c1357600080fd5b505afa158015612c27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c4b9190614e03565b6001600160a01b0384166000908152600e60205260409020549091508190612c739084615d0b565b1115612c915760405162461bcd60e51b8152600401610d0e9061590e565b612d268360128054612ca290615da5565b80601f0160208091040260200160405190810160405280929190818152602001828054612cce90615da5565b8015612d1b5780601f10612cf057610100808354040283529160200191612d1b565b820191906000526020600020905b815481529060010190602001808311612cfe57829003601f168201915b505050505084614334565b6001600160a01b0383166000908152600e602052604081208054849290612d4e908490615d0b565b9091555050505050565b601e54610100900460ff16612d7f5760405162461bcd60e51b8152600401610d0e90615aef565b612d88826141c1565b612da45760405162461bcd60e51b8152600401610d0e9061579f565b60145433906001600160a01b03168114801590612dcf57506015546001600160a01b03828116911614155b612deb5760405162461bcd60e51b8152600401610d0e90615659565b604051635bce6b3b60e01b815260009073dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a890635bce6b3b90612e28906007908890600401615b2d565b60206040518083038186803b158015612e4057600080fd5b505af4158015612e54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e789190614e03565b90508281600a01541015612e9e5760405162461bcd60e51b8152600401610d0e90615a5d565b8281600a016000828254612eb29190615d62565b9250508190555082600d85604051612eca91906151d0565b9081526040805160209281900383019020336000908152925281208054909190612ef5908490615d0b565b9091555050600b810154604051600d90612f109087906151d0565b908152604080516020928190038301902033600090815292529020541115612f4a5760405162461bcd60e51b8152600401610d0e90615753565b6000838260010154612f5c9190615d43565b9050612f66614aab565b6000805b604051630fd2479b60e31b815273dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a890637e923cd890612fa290600790600401615b24565b60206040518083038186803b158015612fba57600080fd5b505af4158015612fce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ff29190614e03565b811080156130005750600084115b156131e257604051633846629960e01b815273dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a89063384662999061303f906007908590600401615c01565b60006040518083038186803b15801561305757600080fd5b505af415801561306b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526130939190810190615021565b92506000600b84600001516040516130ab91906151d0565b90815260408051602092819003830190206001600160a01b038a1660009081529252812091505b8154811080156130e25750600086115b156131cd5761310a828281548110610bd057634e487b7160e01b600052603260045260246000fd5b9350838610613159574282828154811061313457634e487b7160e01b600052603260045260246000fd5b60009182526020909120600260039092020101556131528487615d62565b95506131bb565b6060850151604086015161316d9086615d43565b6131779190615d23565b6131819042615d62565b8282815481106131a157634e487b7160e01b600052603260045260246000fd5b906000526020600020906003020160020181905550600095505b806131c581615de0565b9150506130d2565b505080806131da90615de0565b915050612f6a565b5082156132015760405162461bcd60e51b8152600401610d0e906155e3565b61320c858888614334565b50505050505050565b601e54610100900460ff1661323c5760405162461bcd60e51b8152600401610d0e90615aef565b613245826141c1565b6132615760405162461bcd60e51b8152600401610d0e9061579f565b60145433906001600160a01b0316811480159061328c57506015546001600160a01b03828116911614155b6132a85760405162461bcd60e51b8152600401610d0e90615659565b604051635bce6b3b60e01b8152600090839073dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a890635bce6b3b906132e7906007908990600401615b2d565b60206040518083038186803b1580156132ff57600080fd5b505af4158015613313573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133379190614e03565b600101546133459190615d43565b6010546040516370a0823160e01b815291925082916001600160a01b03909116906370a082319061337a9086906004016151ef565b60206040518083038186803b15801561339257600080fd5b505afa1580156133a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133ca9190614e03565b10156133e85760405162461bcd60e51b8152600401610d0e90615ab8565b6010546040516323b872dd60e01b81526001600160a01b03909116906323b872dd9061341c9085903090869060040161521c565b602060405180830381600087803b15801561343657600080fd5b505af115801561344a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061346e9190614daf565b506010546040516370a0823160e01b81526000916001600160a01b0316906370a08231906134a09030906004016151ef565b60206040518083038186803b1580156134b857600080fd5b505afa1580156134cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134f09190614e03565b601d549091508110801590819061350e5750601c54610100900460ff165b801561351d5750601c5460ff16155b156136c857601c805460ff191660011790556019546000906064906135429085615d43565b61354c9190615d23565b601454909150613565906001600160a01b031682614744565b60006064601754856135779190615d43565b6135819190615d23565b60105460155460405163a9059cbb60e01b81529293506001600160a01b039182169263a9059cbb926135b99216908590600401615203565b602060405180830381600087803b1580156135d357600080fd5b505af11580156135e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061360b9190614daf565b50600060646018548661361e9190615d43565b6136289190615d23565b905061363381614793565b6010546040516370a0823160e01b81526136ba916001600160a01b0316906370a08231906136659030906004016151ef565b60206040518083038186803b15801561367d57600080fd5b505afa158015613691573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136b59190614e03565b614549565b5050601c805460ff19169055505b610faa848787614334565b6010546001600160a01b03163314806136f65750600f546001600160a01b031633145b6137125760405162461bcd60e51b8152600401610d0e906159d9565b61371b8b6141c1565b6137375760405162461bcd60e51b8152600401610d0e90615496565b6000600773dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a8635bce6b3b90918e6040518363ffffffff1660e01b8152600401613775929190615b2d565b60206040518083038186803b15801561378d57600080fd5b505af41580156137a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137c59190614e03565b90508a156137d557600181018b90555b89156137e357600281018a90555b88156137f157600381018990555b87156137ff57600481018890555b861561380d57600681018790555b851561381b57600781018690555b841561382957600881018590555b831561383757600981018490555b821561384557600a81018390555b811561385357600b81018290555b505050505050505050505050565b6015546001600160a01b031681565b6012805461387d90615da5565b80601f01602080910402602001604051908101604052809291908181526020018280546138a990615da5565b80156138f65780601f106138cb576101008083540402835291602001916138f6565b820191906000526020600020905b8154815290600101906020018083116138d957829003601f168201915b505050505081565b6001600160a01b031660009081526002602052604090205490565b6060613924826141c1565b6139405760405162461bcd60e51b8152600401610d0e90615881565b60408051600b8082526101808201909252600091602082016101608036833701905050905061396d614aab565b604051635bce6b3b60e01b815273dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a890635bce6b3b906139a7906007908890600401615b2d565b60206040518083038186803b1580156139bf57600080fd5b505af41580156139d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139f79190614e03565b60405180610180016040529081600082018054613a1390615da5565b80601f0160208091040260200160405190810160405280929190818152602001828054613a3f90615da5565b8015613a8c5780601f10613a6157610100808354040283529160200191613a8c565b820191906000526020600020905b815481529060010190602001808311613a6f57829003601f168201915b50505050508152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a8201548152602001600b820154815250509050806020015182600081518110613b2b57634e487b7160e01b600052603260045260246000fd5b602002602001018181525050806040015182600181518110613b5d57634e487b7160e01b600052603260045260246000fd5b602002602001018181525050806060015182600281518110613b8f57634e487b7160e01b600052603260045260246000fd5b602002602001018181525050806080015182600381518110613bc157634e487b7160e01b600052603260045260246000fd5b6020026020010181815250508060a0015182600481518110613bf357634e487b7160e01b600052603260045260246000fd5b6020026020010181815250508060c0015182600581518110613c2557634e487b7160e01b600052603260045260246000fd5b6020026020010181815250508060e0015182600681518110613c5757634e487b7160e01b600052603260045260246000fd5b60200260200101818152505080610100015182600781518110613c8a57634e487b7160e01b600052603260045260246000fd5b60200260200101818152505080610120015182600881518110613cbd57634e487b7160e01b600052603260045260246000fd5b60200260200101818152505080610140015182600981518110613cf057634e487b7160e01b600052603260045260246000fd5b60200260200101818152505080610160015182600a81518110613d2357634e487b7160e01b600052603260045260246000fd5b60209081029190910101525092915050565b604051630fd2479b60e31b815260009073dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a890637e923cd890613d7090600790600401615b24565b60206040518083038186803b158015613d8857600080fd5b505af4158015613d9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613dc09190614e03565b905090565b6001600160a01b031660009081526005602052604090205490565b6000613deb836141c1565b613df75750600061123b565b600b8360405161121391906151d0565b6010546001600160a01b0316331480613e2a5750600f546001600160a01b031633145b613e465760405162461bcd60e51b8152600401610d0e906159d9565b601e8054911515620100000262ff000019909216919091179055565b60015490565b6011546001600160a01b031681565b600f546001600160a01b031681565b600e6020526000908152604090205481565b6010546001600160a01b0316331480613ebb5750600f546001600160a01b031633145b613ed75760405162461bcd60e51b8152600401610d0e906159d9565b613ee0816141c1565b613efc5760405162461bcd60e51b8152600401610d0e90615853565b8051613f0f906012906020840190614b4b565b5050565b8051604051635bce6b3b60e01b8152600091829173dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a891635bce6b3b91613f5291600791600401615b2d565b60206040518083038186803b158015613f6a57600080fd5b505af4158015613f7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fa29190614e03565b60405180610180016040529081600082018054613fbe90615da5565b80601f0160208091040260200160405190810160405280929190818152602001828054613fea90615da5565b80156140375780601f1061400c57610100808354040283529160200191614037565b820191906000526020600020905b81548152906001019060200180831161401a57829003601f168201915b50505050508152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a8201548152602001600b820154815250509050600081604001518460400151426140c79190615d62565b10156141265760408201516140dd906064615d43565b60808301516140ed906064615d62565b60408601516140fc9042615d62565b846060015161410b9190615d43565b6141159190615d43565b61411f9190615d23565b9050614157565b816040015184604001514261413b9190615d62565b836060015161414a9190615d43565b6141549190615d23565b90505b816020015182604001518560200151426141719190615d62565b84606001516141809190615d43565b61418a9190615d23565b10156141ba5760648260e0015160646141a39190615d62565b6141ad9083615d43565b6141b79190615d23565b90505b9392505050565b6040516306fb0b3960e51b8152600090819073dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a89063df61672090614200906007908790600401615b2d565b60206040518083038186803b15801561421857600080fd5b505af415801561422c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142509190614e03565b121592915050565b600080546001600160a01b03851682526002602052604082205483919061427f9086615d43565b6142899190615d23565b6141b79190615d62565b804710156142b35760405162461bcd60e51b8152600401610d0e90615561565b6000826001600160a01b0316826040516142cc906151ec565b60006040518083038185875af1925050503d8060008114614309576040519150601f19603f3d011682016040523d82523d6000602084013e61430e565b606091505b505090508061432f5760405162461bcd60e51b8152600401610d0e90615504565b505050565b61433d826141c1565b6143595760405162461bcd60e51b8152600401610d0e90615301565b600081116143795760405162461bcd60e51b8152600401610d0e90615945565b604051635bce6b3b60e01b815260009073dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a890635bce6b3b906143b6906007908790600401615b2d565b60206040518083038186803b1580156143ce57600080fd5b505af41580156143e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144069190614e03565b90508181600501600082825461441c9190615d0b565b90915550506006810154600582015411156144495760405162461bcd60e51b8152600401610d0e90615a8b565b60005b8281101561165957600b8460405161446491906151d0565b9081526040805191829003602090810183206001600160a01b038916600090815290825282812060608501845288855242858401819052938501939093528254600181018455928152819020835180516003909402909101926144ca9284920190614b4b565b5060208201516001820155604090910151600290910155806144eb81615de0565b91505061444c565b61432f8363a9059cbb60e01b8484604051602401614512929190615203565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152614814565b604080516002808252606082018352600092602083019080368337505060105482519293506001600160a01b03169183915060009061459857634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152601354604080516339d94ae160e11b8152905191909316926373b295c2926004808301939192829003018186803b1580156145ec57600080fd5b505afa158015614600573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146249190614c9c565b8160018151811061464557634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201015260105460135460405163095ea7b360e01b81529183169263095ea7b39261468a92909116908690600401615203565b602060405180830381600087803b1580156146a457600080fd5b505af11580156146b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146dc9190614daf565b50601354604051633b158ab160e11b81526001600160a01b039091169063762b156290614716908590600090869030904290600401615c0f565b600060405180830381600087803b15801561473057600080fd5b505af1158015610faa573d6000803e3d6000fd5b4761474e82614549565b600061475a8247615d62565b6040519091506001600160a01b0385169082156108fc029083906000818181858888f19350505050158015611659573d6000803e3d6000fd5b60006147a0600283615d23565b905060006147ae8284615d62565b9050476147ba83614549565b60006147c68247615d62565b90506147d283826148a3565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb56184828560405161480593929190615c7f565b60405180910390a15050505050565b6000614869826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166149c39092919063ffffffff16565b80519091501561432f57808060200190518101906148879190614daf565b61432f5760405162461bcd60e51b8152600401610d0e9061598f565b60105460135460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926148d9929116908690600401615203565b602060405180830381600087803b1580156148f357600080fd5b505af1158015614907573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061492b9190614daf565b50601354601054601654604051637c8d9fb960e11b81526001600160a01b039384169363f91b3f7293869361497193918316928992600092839216904290600401615240565b6060604051808303818588803b15801561498a57600080fd5b505af115801561499e573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611659919061513d565b60606141b78484600085856149d785614a6c565b6149f35760405162461bcd60e51b8152600401610d0e906158d7565b600080866001600160a01b03168587604051614a0f91906151d0565b60006040518083038185875af1925050503d8060008114614a4c576040519150601f19603f3d011682016040523d82523d6000602084013e614a51565b606091505b5091509150614a61828286614a72565b979650505050505050565b3b151590565b60608315614a815750816141ba565b825115614a915782518084602001fd5b8160405162461bcd60e51b8152600401610d0e91906152ee565b6040518061018001604052806060815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b508054614b1890615da5565b6000825580601f10614b2a5750614b48565b601f016020900490600052602060002090810190614b489190614bcf565b50565b828054614b5790615da5565b90600052602060002090601f016020900481019282614b795760008555614bbf565b82601f10614b9257805160ff1916838001178555614bbf565b82800160010185558215614bbf579182015b82811115614bbf578251825591602001919060010190614ba4565b50614bcb929150614bcf565b5090565b5b80821115614bcb5760008155600101614bd0565b600082601f830112614bf4578081fd5b8135614c07614c0282615ce3565b615c95565b818152846020838601011115614c1b578283fd5b816020850160208301379081016020019190915292915050565b600082601f830112614c45578081fd5b8151614c53614c0282615ce3565b818152846020838601011115614c67578283fd5b614c78826020830160208701615d79565b949350505050565b600060208284031215614c91578081fd5b81356141ba81615e27565b600060208284031215614cad578081fd5b81516141ba81615e27565b60008060408385031215614cca578081fd5b8235614cd581615e27565b946020939093013593505050565b60008060408385031215614cf5578182fd5b823567ffffffffffffffff80821115614d0c578384fd5b818501915085601f830112614d1f578384fd5b81356020614d2f614c0283615cbf565b82815281810190858301885b85811015614d6457614d528c8684358b0101614be4565b84529284019290840190600101614d3b565b50909750505086013592505080821115614d7c578283fd5b50614d8985828601614be4565b9150509250929050565b600060208284031215614da4578081fd5b81356141ba81615e3c565b600060208284031215614dc0578081fd5b81516141ba81615e3c565b60008060408385031215614ddd578182fd5b8235614de881615e27565b91506020830135614df881615e27565b809150509250929050565b600060208284031215614e14578081fd5b5051919050565b600060208284031215614e2c578081fd5b813567ffffffffffffffff811115614e42578182fd5b614c7884828501614be4565b60008060408385031215614e60578182fd5b823567ffffffffffffffff811115614e76578283fd5b614e8285828601614be4565b9250506020830135614df881615e27565b60008060408385031215614ea5578182fd5b823567ffffffffffffffff80821115614ebc578384fd5b614ec886838701614be4565b9350602091508185013581811115614ede578384fd5b85019050601f81018613614ef0578283fd5b8035614efe614c0282615cbf565b81815283810190838501858402850186018a1015614f1a578687fd5b8694505b83851015614f3c578035835260019490940193918501918501614f1e565b5080955050505050509250929050565b60008060408385031215614f5e578182fd5b823567ffffffffffffffff811115614f74578283fd5b614f8085828601614be4565b95602094909401359450505050565b60008060008060008060008060008060006101608c8e031215614fb0578687fd5b8b3567ffffffffffffffff811115614fc6578788fd5b614fd28e828f01614be4565b9e60208e01359e5060408e01359d60608101359d5060808101359c5060a08101359b5060c08101359a5060e0810135995061010081013598506101208101359750610140013595509350505050565b600060208284031215615032578081fd5b815167ffffffffffffffff80821115615049578283fd5b818401915061018080838703121561505f578384fd5b61506881615c95565b9050825182811115615078578485fd5b61508487828601614c35565b8252506020838101519082015260408084015190820152606080840151908201526080808401519082015260a0808401519082015260c0808401519082015260e080840151908201526101008084015190820152610120808401519082015261014080840151908201526101609283015192810192909252509392505050565b600060208284031215615115578081fd5b5035919050565b6000806040838503121561512e578182fd5b50508035926020909101359150565b600080600060608486031215615151578081fd5b8351925060208401519150604084015190509250925092565b6000815180845260208085019450808401835b838110156151995781518752958201959082019060010161517d565b509495945050505050565b600081518084526151bc816020860160208601615d79565b601f01601f19169290920160200192915050565b600082516151e2818460208701615d79565b9190910192915050565b90565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b6000602080830181845280855180835260408601915060408482028701019250838701855b828110156152ce57603f198886030184526152bc85835161516a565b945092850192908501906001016152a0565b5092979650505050505050565b6000602082526141ba602083018461516a565b6000602082526141ba60208301846151a4565b60208082526029908201527f5f6372656174654e6f6465733a206e6f6465547970654e616d6520646f6573206040820152681b9bdd08195e1a5cdd60ba1b606082015260800190565b6020808252601f908201527f4c6576656c207570206c696d6974207265616368656420666f72207573657200604082015260600190565b60208082526019908201527f4e62206d7573742062652067726561746572207468616e203000000000000000604082015260600190565b60208082526010908201526f4e6f7468696e6720746f20636c61696d60801b604082015260600190565b6020808252600f908201526e139bdd08195b9bdd59da081cd95b9d608a1b604082015260600190565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b60208082526025908201527f4e6f206f6e652063616e206c6576656c20757020746869732074797065206f66604082015264206e6f646560d81b606082015260800190565b6020808252602b908201527f6368616e67654e6f6465547970653a206e6f6465547970654e616d6520646f6560408201526a1cc81b9bdd08195e1a5cdd60aa1b606082015260800190565b602080825260099082015268139bdd081bdddb995960ba1b604082015260600190565b6020808252603a908201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260408201527f6563697069656e74206d61792068617665207265766572746564000000000000606082015260800190565b6020808252601d908201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604082015260600190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b602080825260149082015273496e73756666696369656e742050656e64696e6760601b604082015260600190565b60208082526028908201527f544b4e3a2054686520726f7574657220616c7265616479206861732074686174604082015267206164647265737360c01b606082015260800190565b60208082526028908201527f667574757220616e642072657761726473506f6f6c2063616e6e6f7420637265604082015267617465206e6f646560c01b606082015260800190565b60208082526030908201527f6d6f76654163636f756e743a205f64656661756c746e6f6465547970654e616d60408201526f1948191bd95cc81b9bdd08195e1a5cdd60821b606082015260800190565b6020808252818101527f4e6f6465206c6576656c207570206e6f7420617574686f72697a656420796574604082015260600190565b6020808252601390820152721d185c99d95d08191bd95cdb9d08195e1a5cdd606a1b604082015260600190565b6020808252602c908201527f4372656174696f6e20776974682070656e64696e67206c696d6974207265616360408201526b3432b2103337b9103ab9b2b960a11b606082015260800190565b6020808252601b908201527f6e6f6465547970654e616d6520646f6573206e6f742065786973740000000000604082015260600190565b60208082526017908201527f6164644e6f6465547970653a20456d707479206e616d65000000000000000000604082015260600190565b60208082526026908201527f6164644e6f6465547970653a2073616d65206e6f6465547970654e616d6520656040820152653c34b9ba399760d11b606082015260800190565b602080825260149082015273139bd919551e5c1948191bd95cdb88195e1a5cdd60621b604082015260600190565b60208082526011908201527013985b5948191bd95cdb9d08195e1a5cdd607a1b604082015260600190565b60208082526011908201527021b0b73737ba103632bb32b6103237bbb760791b604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526018908201527f546f6f206d616e79206e6f646573207265717565737465640000000000000000604082015260600190565b6020808252602a908201527f5f6372656174654e6f6465733a20636f756e742063616e6e6f74206265206c6560408201526939b9903a3430b710189760b11b606082015260800190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b602080825260089082015267233ab1b59037b33360c11b604082015260600190565b6020808252601190820152701b985b5948191bd95cdb9d08195e1a5cdd607a1b604082015260600190565b6020808252601c908201527f4d6967726174696f6e206e6f7420617574686f72697a65642079657400000000604082015260600190565b60208082526014908201527311db1bd8985b081b1a5b5a5d081c995858da195960621b604082015260600190565b60208082526013908201527213585e08185b1c9958591e481c995858da1959606a1b604082015260600190565b6020808252601d908201527f42616c616e636520746f6f206c6f7720666f72206372656174696f6e2e000000604082015260600190565b6020808252818101527f4e6f6465206372656174696f6e206e6f7420617574686f72697a656420796574604082015260600190565b90815260200190565b6000838252604060208301526141b760408301846151a4565b600084825260606020830152615b5f60608301856151a4565b82810360408401526101808451818352615b7b828401826151a4565b9150506020850151602083015260408501516040830152606085015160608301526080850151608083015260a085015160a083015260c085015160c083015260e085015160e08301526101008086015181840152506101208086015181840152506101408086015181840152506101608086015181840152508092505050949350505050565b918252602082015260400190565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b81811015615c5e5784516001600160a01b031683529383019391830191600101615c39565b50506001600160a01b03969096166060850152505050608001529392505050565b9283526020830191909152604082015260600190565b60405181810167ffffffffffffffff81118282101715615cb757615cb7615e11565b604052919050565b600067ffffffffffffffff821115615cd957615cd9615e11565b5060209081020190565b600067ffffffffffffffff821115615cfd57615cfd615e11565b50601f01601f191660200190565b60008219821115615d1e57615d1e615dfb565b500190565b600082615d3e57634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615615d5d57615d5d615dfb565b500290565b600082821015615d7457615d74615dfb565b500390565b60005b83811015615d94578181015183820152602001615d7c565b83811115611f395750506000910152565b600281046001821680615db957607f821691505b60208210811415615dda57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415615df457615df4615dfb565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114614b4857600080fd5b8015158114614b4857600080fdfea2646970667358221220ab0b2089379f526eaca5477bbfb183ce3106d3b46832f6775025d74f9c85571364736f6c634300080000330000000000000000000000006c48fa4a03e62a9658082ffc8c774fb39a942e4f0000000000000000000000006c1c0319d8ddcb0ffe1a68c5b3829fd361587db4000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000060ae616a2155ee3d9a68541ba4544862310933d400000000000000000000000000000000000000000000000000000000000000050000000000000000000000000d32417e50e30dfc2c3f39d3997f9006edfcf6c60000000000000000000000003918c5ec307b3124d5ea381effe89d8935428803000000000000000000000000fdcb5d746d7f660721fb328825b5b8f06c53e37c000000000000000000000000296bf01632748ba964f4b771efc534faad0e587f0000000000000000000000002dc0c861afe1f154dae51a4350e4da886e501ff10000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000001b000000000000000000000000000000000000000000000000000000000000001b0000000000000000000000000000000000000000000000000000000000000015000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000003000000000000000000000000f128b6ba7db8532fa1d98bf2c31fc843b2882605000000000000000000000000ab3b24ba4c5911366c59cc870facc25b6ea3a05300000000000000000000000015b72f2f0cd37fade6c734e72485de0909b1e2a8000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000037000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000a
Deployed Bytecode
0x60806040526004361061036f5760003560e01c80636d9ae0be116101c6578063c4c69038116100f7578063d8a911d911610095578063ea84397b1161006f578063ea84397b146109cc578063ef630563146109e1578063f5368c29146109f6578063f54549bc14610a16576103b6565b8063d8a911d914610977578063e19d3c4814610997578063e33b7de3146109b7576103b6565b8063ce7c2ac2116100d1578063ce7c2ac2146108f5578063d061943914610915578063d6a0d2ee14610942578063d79779b214610957576103b6565b8063c4c69038146108ab578063c5ca7d6d146108cb578063ca721f22146108e0576103b6565b80639f3b0abe11610164578063ab5747611161013e578063ab57476114610836578063ae8369e81461084b578063b64922471461086b578063bbc679981461088b576103b6565b80639f3b0abe146107df578063a0a8fe651461080c578063a538ddf214610821576103b6565b80638b83209b116101a05780638b83209b1461076a5780639349c47d1461078a5780639852595c146107aa5780639cfccb46146107ca576103b6565b80636d9ae0be14610715578063795e01131461072a57806388c41d7c1461074a576103b6565b8063406072a9116102a057806354f12f1f1161023e57806365b8dbc01161021857806365b8dbc0146106955780636770474b146106b55780636815a91c146106d557806369d0013b146106f5576103b6565b806354f12f1f14610656578063583e05681461066b5780635f1c318214610680576103b6565b806348b750441161027a57806348b75044146105e15780634c0768fc146106015780634c7f490e146106215780635455797314610641576103b6565b8063406072a91461057457806342bc9fca1461059457806347aab1f8146105b4576103b6565b80631ff9e1951161030d5780632bb14e1d116102e75780632bb14e1d1461050a5780633a98ef391461051f5780633d80733d146105345780633f8bdd2214610554576103b6565b80631ff9e195146104a8578063255d7d55146104c85780632a607841146104e8576103b6565b80630c08f300116103495780630c08f3001461043357806313114a9d14610453578063144fa6d7146104685780631916558714610488576103b6565b806301251f2a146103bb578063035f722b146103f1578063084a6bff14610413576103b6565b366103b6577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77061039d610a36565b346040516103ac929190615203565b60405180910390a1005b600080fd5b3480156103c757600080fd5b506103db6103d6366004614c80565b610a3a565b6040516103e89190615b24565b60405180910390f35b3480156103fd57600080fd5b5061041161040c366004614e93565b610ccf565b005b34801561041f57600080fd5b5061041161042e366004615104565b610fb2565b34801561043f57600080fd5b5061041161044e366004614c80565b611016565b34801561045f57600080fd5b506103db611077565b34801561047457600080fd5b50610411610483366004614c80565b61107d565b34801561049457600080fd5b506104116104a3366004614c80565b6110de565b3480156104b457600080fd5b506103db6104c3366004614e4e565b6111ec565b3480156104d457600080fd5b506104116104e3366004614ce3565b611241565b3480156104f457600080fd5b506104fd611660565b6040516103e891906151ef565b34801561051657600080fd5b506103db61166f565b34801561052b57600080fd5b506103db611675565b34801561054057600080fd5b506103db61054f366004614e4e565b61167b565b34801561056057600080fd5b5061041161056f366004614c80565b6116a2565b34801561058057600080fd5b506103db61058f366004614dcb565b611703565b3480156105a057600080fd5b506104116105af366004615104565b61172e565b3480156105c057600080fd5b506105d46105cf36600461511c565b611783565b6040516103e8919061527b565b3480156105ed57600080fd5b506104116105fc366004614dcb565b6118d6565b34801561060d57600080fd5b5061041161061c366004614d93565b611a8c565b34801561062d57600080fd5b506103db61063c366004614c80565b611ae5565b34801561064d57600080fd5b50610411611bbe565b34801561066257600080fd5b506103db611f3f565b34801561067757600080fd5b506104fd611f45565b34801561068c57600080fd5b506103db611f54565b3480156106a157600080fd5b506104116106b0366004614c80565b611f5a565b3480156106c157600080fd5b506104116106d0366004615104565b611fe9565b3480156106e157600080fd5b506104116106f0366004615104565b61202d565b34801561070157600080fd5b50610411610710366004614d93565b612071565b34801561072157600080fd5b506103db6120c3565b34801561073657600080fd5b506103db610745366004614f4c565b6120c9565b34801561075657600080fd5b50610411610765366004615104565b6127af565b34801561077657600080fd5b506104fd610785366004615104565b612804565b34801561079657600080fd5b506104116107a5366004614c80565b612842565b3480156107b657600080fd5b506103db6107c5366004614c80565b6128a3565b3480156107d657600080fd5b506104fd6128be565b3480156107eb57600080fd5b506107ff6107fa366004615104565b6128cd565b6040516103e891906152ee565b34801561081857600080fd5b506103db612965565b34801561082d57600080fd5b506104fd612aaf565b34801561084257600080fd5b506103db612abe565b34801561085757600080fd5b50610411610866366004614cb8565b612ac4565b34801561087757600080fd5b50610411610886366004614f4c565b612d58565b34801561089757600080fd5b506104116108a6366004614f4c565b613215565b3480156108b757600080fd5b506104116108c6366004614f8f565b6136d3565b3480156108d757600080fd5b506104fd613861565b3480156108ec57600080fd5b506107ff613870565b34801561090157600080fd5b506103db610910366004614c80565b6138fe565b34801561092157600080fd5b50610935610930366004614e1b565b613919565b6040516103e891906152db565b34801561094e57600080fd5b506103db613d35565b34801561096357600080fd5b506103db610972366004614c80565b613dc5565b34801561098357600080fd5b506103db610992366004614e4e565b613de0565b3480156109a357600080fd5b506104116109b2366004614d93565b613e07565b3480156109c357600080fd5b506103db613e62565b3480156109d857600080fd5b506104fd613e68565b3480156109ed57600080fd5b506104fd613e77565b348015610a0257600080fd5b506103db610a11366004614c80565b613e86565b348015610a2257600080fd5b50610411610a31366004614e1b565b613e98565b3390565b6000610a44614aab565b6000805b604051630fd2479b60e31b815273dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a890637e923cd890610a8090600790600401615b24565b60206040518083038186803b158015610a9857600080fd5b505af4158015610aac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad09190614e03565b811015610cc757604051633846629960e01b815273dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a890633846629990610b11906007908590600401615c01565b60006040518083038186803b158015610b2957600080fd5b505af4158015610b3d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b659190810190615021565b92506000600b8460000151604051610b7d91906151d0565b90815260408051602092819003830190206001600160a01b03891660009081529252812091505b8154811015610cb257610c94828281548110610bd057634e487b7160e01b600052603260045260246000fd5b9060005260206000209060030201604051806060016040529081600082018054610bf990615da5565b80601f0160208091040260200160405190810160405280929190818152602001828054610c2590615da5565b8015610c725780601f10610c4757610100808354040283529160200191610c72565b820191906000526020600020905b815481529060010190602001808311610c5557829003601f168201915b5050505050815260200160018201548152602001600282015481525050613f13565b610c9e9085615d0b565b935080610caa81615de0565b915050610ba4565b50508080610cbf90615de0565b915050610a48565b509392505050565b6010546001600160a01b0316331480610cf25750600f546001600160a01b031633145b610d175760405162461bcd60e51b8152600401610d0e906159d9565b60405180910390fd5b6000825111610d385760405162461bcd60e51b8152600401610d0e906157d6565b610d41826141c1565b15610d5e5760405162461bcd60e51b8152600401610d0e9061580d565b600773dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a8634174008590918460405180610180016040528087815260200186600081518110610db057634e487b7160e01b600052603260045260246000fd5b6020026020010151815260200186600181518110610dde57634e487b7160e01b600052603260045260246000fd5b6020026020010151815260200186600281518110610e0c57634e487b7160e01b600052603260045260246000fd5b6020026020010151815260200186600381518110610e3a57634e487b7160e01b600052603260045260246000fd5b602002602001015181526020016000815260200186600481518110610e6f57634e487b7160e01b600052603260045260246000fd5b6020026020010151815260200186600581518110610e9d57634e487b7160e01b600052603260045260246000fd5b6020026020010151815260200186600681518110610ecb57634e487b7160e01b600052603260045260246000fd5b6020026020010151815260200186600781518110610ef957634e487b7160e01b600052603260045260246000fd5b6020026020010151815260200186600881518110610f2757634e487b7160e01b600052603260045260246000fd5b6020026020010151815260200186600981518110610f5557634e487b7160e01b600052603260045260246000fd5b60200260200101518152506040518463ffffffff1660e01b8152600401610f7e93929190615b46565b60006040518083038186803b158015610f9657600080fd5b505af4158015610faa573d6000803e3d6000fd5b505050505050565b6010546001600160a01b0316331480610fd55750600f546001600160a01b031633145b610ff15760405162461bcd60e51b8152600401610d0e906159d9565b60178190556019546018546110069083615d0b565b6110109190615d0b565b601a5550565b6010546001600160a01b03163314806110395750600f546001600160a01b031633145b6110555760405162461bcd60e51b8152600401610d0e906159d9565b601480546001600160a01b0319166001600160a01b0392909216919091179055565b601a5481565b6010546001600160a01b03163314806110a05750600f546001600160a01b031633145b6110bc5760405162461bcd60e51b8152600401610d0e906159d9565b601080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381166000908152600260205260409020546111135760405162461bcd60e51b8152600401610d0e9061540b565b600061111d613e62565b6111279047615d0b565b9050600061113e8383611139866128a3565b614258565b90508061115d5760405162461bcd60e51b8152600401610d0e90615598565b6001600160a01b03831660009081526003602052604081208054839290611185908490615d0b565b92505081905550806001600082825461119e9190615d0b565b909155506111ae90508382614293565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b05683826040516111df929190615203565b60405180910390a1505050565b60006111f7836141c1565b6112035750600061123b565b600d8360405161121391906151d0565b90815260408051602092819003830190206001600160a01b0385166000908152925290205490505b92915050565b601e5462010000900460ff166112695760405162461bcd60e51b8152600401610d0e906156f1565b611272816141c1565b61128e5760405162461bcd60e51b8152600401610d0e90615726565b604051635bce6b3b60e01b815260009073dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a890635bce6b3b906112cb906007908690600401615b2d565b60206040518083038186803b1580156112e357600080fd5b505af41580156112f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061131b9190614e03565b90506001816008015410156113425760405162461bcd60e51b8152600401610d0e90615451565b60018160080160008282546113579190615d62565b925050819055506001600c8360405161137091906151d0565b908152604080516020928190038301902033600090815292528120805490919061139b908490615d0b565b90915550506009810154604051600c906113b69085906151d0565b9081526040805160209281900383019020336000908152925290205411156113f05760405162461bcd60e51b8152600401610d0e9061534a565b60018101548060005b8551811080156114095750600082115b1561162e57600086828151811061143057634e487b7160e01b600052603260045260246000fd5b60200260200101519050611443816141c1565b61145f5760405162461bcd60e51b8152600401610d0e906159fb565b6000600b8260405161147191906151d0565b90815260408051602092819003830190203360009081529252902054116114aa5760405162461bcd60e51b8152600401610d0e906154e1565b604051635bce6b3b60e01b815260009073dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a890635bce6b3b906114e7906007908690600401615b2d565b60206040518083038186803b1580156114ff57600080fd5b505af4158015611513573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115379190614e03565b90508060010154851161155c5760405162461bcd60e51b8152600401610d0e906158ac565b600b8260405161156c91906151d0565b9081526040805160209281900383019020336000908152925290208054806115a457634e487b7160e01b600052603160045260246000fd5b600082815260208120600019909201916003830201906115c48282614b0c565b600182016000905560028201600090555050905560018160050160008282546115ed9190615d62565b909155505060018101548410156116075760009350611619565b60018101546116169085615d62565b93505b5050808061162690615de0565b9150506113f9565b50801561164d5760405162461bcd60e51b8152600401610d0e906153e2565b61165933856001614334565b5050505050565b6016546001600160a01b031681565b60175481565b60005490565b6000611686836141c1565b6116925750600061123b565b600c8360405161121391906151d0565b6010546001600160a01b03163314806116c55750600f546001600160a01b031633145b6116e15760405162461bcd60e51b8152600401610d0e906159d9565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b6010546001600160a01b03163314806117515750600f546001600160a01b031633145b61176d5760405162461bcd60e51b8152600401610d0e906159d9565b6018819055601954601754611006908390615d0b565b606060006117918484615d62565b67ffffffffffffffff8111156117b757634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156117ea57816020015b60608152602001906001900390816117d55790505b509050835b83811015610cc757604051633846629960e01b815261188f9073dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a890633846629990611835906007908690600401615c01565b60006040518083038186803b15801561184d57600080fd5b505af4158015611861573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526118899190810190615021565b51613919565b8261189a8784615d62565b815181106118b857634e487b7160e01b600052603260045260246000fd5b602002602001018190525080806118ce90615de0565b9150506117ef565b6001600160a01b03811660009081526002602052604090205461190b5760405162461bcd60e51b8152600401610d0e9061540b565b600061191683613dc5565b6040516370a0823160e01b81526001600160a01b038516906370a08231906119429030906004016151ef565b60206040518083038186803b15801561195a57600080fd5b505afa15801561196e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119929190614e03565b61199c9190615d0b565b905060006119af83836111398787611703565b9050806119ce5760405162461bcd60e51b8152600401610d0e90615598565b6001600160a01b03808516600090815260066020908152604080832093871683529290529081208054839290611a05908490615d0b565b90915550506001600160a01b03841660009081526005602052604081208054839290611a32908490615d0b565b90915550611a4390508484836144f3565b836001600160a01b03167f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a8483604051611a7e929190615203565b60405180910390a250505050565b6010546001600160a01b0316331480611aaf5750600f546001600160a01b031633145b611acb5760405162461bcd60e51b8152600401610d0e906159d9565b601e80549115156101000261ff0019909216919091179055565b600080805b611af2613d35565b811015611bb757604051633846629960e01b815260009073dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a890633846629990611b36906007908690600401615c01565b60006040518083038186803b158015611b4e57600080fd5b505af4158015611b62573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611b8a9190810190615021565b519050611b978186613de0565b611ba19084615d0b565b9250508080611baf90615de0565b915050611aea565b5092915050565b33611bc7614aab565b6000805b604051630fd2479b60e31b815273dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a890637e923cd890611c0390600790600401615b24565b60206040518083038186803b158015611c1b57600080fd5b505af4158015611c2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c539190614e03565b811015611dbb57604051633846629960e01b815273dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a890633846629990611c94906007908590600401615c01565b60006040518083038186803b158015611cac57600080fd5b505af4158015611cc0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611ce89190810190615021565b92506000600b8460000151604051611d0091906151d0565b90815260408051602092819003830190206001600160a01b03881660009081529252812091505b8154811015611da657611d53828281548110610bd057634e487b7160e01b600052603260045260246000fd5b611d5d9085615d0b565b935042828281548110611d8057634e487b7160e01b600052603260045260246000fd5b600091825260209091206002600390920201015580611d9e81615de0565b915050611d27565b50508080611db390615de0565b915050611bcb565b5060008111611ddc5760405162461bcd60e51b8152600401610d0e906153b8565b6010546015546040516323b872dd60e01b81526001600160a01b03928316926323b872dd92611e14929116903090869060040161521c565b602060405180830381600087803b158015611e2e57600080fd5b505af1158015611e42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e669190614daf565b50601c54610100900460ff1615611eb557601b5460009015611ea7576064601b5483611e929190615d43565b611e9c9190615d23565b9050611ea781614549565b611eb18183615d62565b9150505b60105460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90611ee79086908590600401615203565b602060405180830381600087803b158015611f0157600080fd5b505af1158015611f15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f399190614daf565b50505050565b60185481565b6013546001600160a01b031681565b601d5481565b6010546001600160a01b0316331480611f7d5750600f546001600160a01b031633145b611f995760405162461bcd60e51b8152600401610d0e906159d9565b6013546001600160a01b0382811691161415611fc75760405162461bcd60e51b8152600401610d0e90615611565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b6010546001600160a01b031633148061200c5750600f546001600160a01b031633145b6120285760405162461bcd60e51b8152600401610d0e906159d9565b601d55565b6010546001600160a01b03163314806120505750600f546001600160a01b031633145b61206c5760405162461bcd60e51b8152600401610d0e906159d9565b601b55565b6010546001600160a01b03163314806120945750600f546001600160a01b031633145b6120b05760405162461bcd60e51b8152600401610d0e906159d9565b601e805460ff1916911515919091179055565b601b5481565b60006120d4836141c1565b6120e05750600061123b565b8161217a57604051635bce6b3b60e01b815273dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a890635bce6b3b9061211f906007908790600401615b2d565b60206040518083038186803b15801561213757600080fd5b505af415801561214b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061216f9190614e03565b60010154905061123b565b816001141561221857604051635bce6b3b60e01b815273dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a890635bce6b3b906121bd906007908790600401615b2d565b60206040518083038186803b1580156121d557600080fd5b505af41580156121e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061220d9190614e03565b60020154905061123b565b81600214156122b657604051635bce6b3b60e01b815273dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a890635bce6b3b9061225b906007908790600401615b2d565b60206040518083038186803b15801561227357600080fd5b505af4158015612287573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122ab9190614e03565b60030154905061123b565b816003141561235457604051635bce6b3b60e01b815273dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a890635bce6b3b906122f9906007908790600401615b2d565b60206040518083038186803b15801561231157600080fd5b505af4158015612325573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123499190614e03565b60040154905061123b565b81600414156123f257604051635bce6b3b60e01b815273dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a890635bce6b3b90612397906007908790600401615b2d565b60206040518083038186803b1580156123af57600080fd5b505af41580156123c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123e79190614e03565b60050154905061123b565b816005141561249057604051635bce6b3b60e01b815273dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a890635bce6b3b90612435906007908790600401615b2d565b60206040518083038186803b15801561244d57600080fd5b505af4158015612461573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124859190614e03565b60060154905061123b565b816006141561252e57604051635bce6b3b60e01b815273dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a890635bce6b3b906124d3906007908790600401615b2d565b60206040518083038186803b1580156124eb57600080fd5b505af41580156124ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125239190614e03565b60070154905061123b565b81600714156125cc57604051635bce6b3b60e01b815273dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a890635bce6b3b90612571906007908790600401615b2d565b60206040518083038186803b15801561258957600080fd5b505af415801561259d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125c19190614e03565b60080154905061123b565b816008141561266a57604051635bce6b3b60e01b815273dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a890635bce6b3b9061260f906007908790600401615b2d565b60206040518083038186803b15801561262757600080fd5b505af415801561263b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061265f9190614e03565b60090154905061123b565b816009141561270857604051635bce6b3b60e01b815273dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a890635bce6b3b906126ad906007908790600401615b2d565b60206040518083038186803b1580156126c557600080fd5b505af41580156126d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126fd9190614e03565b600a0154905061123b565b81600a14156127a657604051635bce6b3b60e01b815273dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a890635bce6b3b9061274b906007908790600401615b2d565b60206040518083038186803b15801561276357600080fd5b505af4158015612777573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061279b9190614e03565b600b0154905061123b565b50600092915050565b6010546001600160a01b03163314806127d25750600f546001600160a01b031633145b6127ee5760405162461bcd60e51b8152600401610d0e906159d9565b6019819055601854601754829161100691615d0b565b60006004828154811061282757634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031692915050565b6010546001600160a01b03163314806128655750600f546001600160a01b031633145b6128815760405162461bcd60e51b8152600401610d0e906159d9565b601580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b031660009081526003602052604090205490565b6010546001600160a01b031681565b604051633846629960e01b815260609073dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a89063384662999061290a906007908690600401615c01565b60006040518083038186803b15801561292257600080fd5b505af4158015612936573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261295e9190810190615021565b5192915050565b600080805b604051630fd2479b60e31b815273dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a890637e923cd8906129a290600790600401615b24565b60206040518083038186803b1580156129ba57600080fd5b505af41580156129ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129f29190614e03565b811015612aa957604051633846629960e01b815273dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a890633846629990612a33906007908590600401615c01565b60006040518083038186803b158015612a4b57600080fd5b505af4158015612a5f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612a879190810190615021565b60a00151612a959083615d0b565b915080612aa181615de0565b91505061296a565b50905090565b6014546001600160a01b031681565b60195481565b601e5460ff1680612adf5750600f546001600160a01b031633145b612afb5760405162461bcd60e51b8152600401610d0e90615a26565b612b8e60128054612b0b90615da5565b80601f0160208091040260200160405190810160405280929190818152602001828054612b3790615da5565b8015612b845780601f10612b5957610100808354040283529160200191612b84565b820191906000526020600020905b815481529060010190602001808311612b6757829003601f168201915b50505050506141c1565b612baa5760405162461bcd60e51b8152600401610d0e906156a1565b60008111612bca5760405162461bcd60e51b8152600401610d0e90615381565b60115460405163112469f960e21b81526000916001600160a01b031690634491a7e490612bfb9086906004016151ef565b60206040518083038186803b158015612c1357600080fd5b505afa158015612c27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c4b9190614e03565b6001600160a01b0384166000908152600e60205260409020549091508190612c739084615d0b565b1115612c915760405162461bcd60e51b8152600401610d0e9061590e565b612d268360128054612ca290615da5565b80601f0160208091040260200160405190810160405280929190818152602001828054612cce90615da5565b8015612d1b5780601f10612cf057610100808354040283529160200191612d1b565b820191906000526020600020905b815481529060010190602001808311612cfe57829003601f168201915b505050505084614334565b6001600160a01b0383166000908152600e602052604081208054849290612d4e908490615d0b565b9091555050505050565b601e54610100900460ff16612d7f5760405162461bcd60e51b8152600401610d0e90615aef565b612d88826141c1565b612da45760405162461bcd60e51b8152600401610d0e9061579f565b60145433906001600160a01b03168114801590612dcf57506015546001600160a01b03828116911614155b612deb5760405162461bcd60e51b8152600401610d0e90615659565b604051635bce6b3b60e01b815260009073dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a890635bce6b3b90612e28906007908890600401615b2d565b60206040518083038186803b158015612e4057600080fd5b505af4158015612e54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e789190614e03565b90508281600a01541015612e9e5760405162461bcd60e51b8152600401610d0e90615a5d565b8281600a016000828254612eb29190615d62565b9250508190555082600d85604051612eca91906151d0565b9081526040805160209281900383019020336000908152925281208054909190612ef5908490615d0b565b9091555050600b810154604051600d90612f109087906151d0565b908152604080516020928190038301902033600090815292529020541115612f4a5760405162461bcd60e51b8152600401610d0e90615753565b6000838260010154612f5c9190615d43565b9050612f66614aab565b6000805b604051630fd2479b60e31b815273dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a890637e923cd890612fa290600790600401615b24565b60206040518083038186803b158015612fba57600080fd5b505af4158015612fce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ff29190614e03565b811080156130005750600084115b156131e257604051633846629960e01b815273dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a89063384662999061303f906007908590600401615c01565b60006040518083038186803b15801561305757600080fd5b505af415801561306b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526130939190810190615021565b92506000600b84600001516040516130ab91906151d0565b90815260408051602092819003830190206001600160a01b038a1660009081529252812091505b8154811080156130e25750600086115b156131cd5761310a828281548110610bd057634e487b7160e01b600052603260045260246000fd5b9350838610613159574282828154811061313457634e487b7160e01b600052603260045260246000fd5b60009182526020909120600260039092020101556131528487615d62565b95506131bb565b6060850151604086015161316d9086615d43565b6131779190615d23565b6131819042615d62565b8282815481106131a157634e487b7160e01b600052603260045260246000fd5b906000526020600020906003020160020181905550600095505b806131c581615de0565b9150506130d2565b505080806131da90615de0565b915050612f6a565b5082156132015760405162461bcd60e51b8152600401610d0e906155e3565b61320c858888614334565b50505050505050565b601e54610100900460ff1661323c5760405162461bcd60e51b8152600401610d0e90615aef565b613245826141c1565b6132615760405162461bcd60e51b8152600401610d0e9061579f565b60145433906001600160a01b0316811480159061328c57506015546001600160a01b03828116911614155b6132a85760405162461bcd60e51b8152600401610d0e90615659565b604051635bce6b3b60e01b8152600090839073dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a890635bce6b3b906132e7906007908990600401615b2d565b60206040518083038186803b1580156132ff57600080fd5b505af4158015613313573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133379190614e03565b600101546133459190615d43565b6010546040516370a0823160e01b815291925082916001600160a01b03909116906370a082319061337a9086906004016151ef565b60206040518083038186803b15801561339257600080fd5b505afa1580156133a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133ca9190614e03565b10156133e85760405162461bcd60e51b8152600401610d0e90615ab8565b6010546040516323b872dd60e01b81526001600160a01b03909116906323b872dd9061341c9085903090869060040161521c565b602060405180830381600087803b15801561343657600080fd5b505af115801561344a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061346e9190614daf565b506010546040516370a0823160e01b81526000916001600160a01b0316906370a08231906134a09030906004016151ef565b60206040518083038186803b1580156134b857600080fd5b505afa1580156134cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134f09190614e03565b601d549091508110801590819061350e5750601c54610100900460ff165b801561351d5750601c5460ff16155b156136c857601c805460ff191660011790556019546000906064906135429085615d43565b61354c9190615d23565b601454909150613565906001600160a01b031682614744565b60006064601754856135779190615d43565b6135819190615d23565b60105460155460405163a9059cbb60e01b81529293506001600160a01b039182169263a9059cbb926135b99216908590600401615203565b602060405180830381600087803b1580156135d357600080fd5b505af11580156135e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061360b9190614daf565b50600060646018548661361e9190615d43565b6136289190615d23565b905061363381614793565b6010546040516370a0823160e01b81526136ba916001600160a01b0316906370a08231906136659030906004016151ef565b60206040518083038186803b15801561367d57600080fd5b505afa158015613691573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136b59190614e03565b614549565b5050601c805460ff19169055505b610faa848787614334565b6010546001600160a01b03163314806136f65750600f546001600160a01b031633145b6137125760405162461bcd60e51b8152600401610d0e906159d9565b61371b8b6141c1565b6137375760405162461bcd60e51b8152600401610d0e90615496565b6000600773dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a8635bce6b3b90918e6040518363ffffffff1660e01b8152600401613775929190615b2d565b60206040518083038186803b15801561378d57600080fd5b505af41580156137a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137c59190614e03565b90508a156137d557600181018b90555b89156137e357600281018a90555b88156137f157600381018990555b87156137ff57600481018890555b861561380d57600681018790555b851561381b57600781018690555b841561382957600881018590555b831561383757600981018490555b821561384557600a81018390555b811561385357600b81018290555b505050505050505050505050565b6015546001600160a01b031681565b6012805461387d90615da5565b80601f01602080910402602001604051908101604052809291908181526020018280546138a990615da5565b80156138f65780601f106138cb576101008083540402835291602001916138f6565b820191906000526020600020905b8154815290600101906020018083116138d957829003601f168201915b505050505081565b6001600160a01b031660009081526002602052604090205490565b6060613924826141c1565b6139405760405162461bcd60e51b8152600401610d0e90615881565b60408051600b8082526101808201909252600091602082016101608036833701905050905061396d614aab565b604051635bce6b3b60e01b815273dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a890635bce6b3b906139a7906007908890600401615b2d565b60206040518083038186803b1580156139bf57600080fd5b505af41580156139d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139f79190614e03565b60405180610180016040529081600082018054613a1390615da5565b80601f0160208091040260200160405190810160405280929190818152602001828054613a3f90615da5565b8015613a8c5780601f10613a6157610100808354040283529160200191613a8c565b820191906000526020600020905b815481529060010190602001808311613a6f57829003601f168201915b50505050508152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a8201548152602001600b820154815250509050806020015182600081518110613b2b57634e487b7160e01b600052603260045260246000fd5b602002602001018181525050806040015182600181518110613b5d57634e487b7160e01b600052603260045260246000fd5b602002602001018181525050806060015182600281518110613b8f57634e487b7160e01b600052603260045260246000fd5b602002602001018181525050806080015182600381518110613bc157634e487b7160e01b600052603260045260246000fd5b6020026020010181815250508060a0015182600481518110613bf357634e487b7160e01b600052603260045260246000fd5b6020026020010181815250508060c0015182600581518110613c2557634e487b7160e01b600052603260045260246000fd5b6020026020010181815250508060e0015182600681518110613c5757634e487b7160e01b600052603260045260246000fd5b60200260200101818152505080610100015182600781518110613c8a57634e487b7160e01b600052603260045260246000fd5b60200260200101818152505080610120015182600881518110613cbd57634e487b7160e01b600052603260045260246000fd5b60200260200101818152505080610140015182600981518110613cf057634e487b7160e01b600052603260045260246000fd5b60200260200101818152505080610160015182600a81518110613d2357634e487b7160e01b600052603260045260246000fd5b60209081029190910101525092915050565b604051630fd2479b60e31b815260009073dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a890637e923cd890613d7090600790600401615b24565b60206040518083038186803b158015613d8857600080fd5b505af4158015613d9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613dc09190614e03565b905090565b6001600160a01b031660009081526005602052604090205490565b6000613deb836141c1565b613df75750600061123b565b600b8360405161121391906151d0565b6010546001600160a01b0316331480613e2a5750600f546001600160a01b031633145b613e465760405162461bcd60e51b8152600401610d0e906159d9565b601e8054911515620100000262ff000019909216919091179055565b60015490565b6011546001600160a01b031681565b600f546001600160a01b031681565b600e6020526000908152604090205481565b6010546001600160a01b0316331480613ebb5750600f546001600160a01b031633145b613ed75760405162461bcd60e51b8152600401610d0e906159d9565b613ee0816141c1565b613efc5760405162461bcd60e51b8152600401610d0e90615853565b8051613f0f906012906020840190614b4b565b5050565b8051604051635bce6b3b60e01b8152600091829173dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a891635bce6b3b91613f5291600791600401615b2d565b60206040518083038186803b158015613f6a57600080fd5b505af4158015613f7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fa29190614e03565b60405180610180016040529081600082018054613fbe90615da5565b80601f0160208091040260200160405190810160405280929190818152602001828054613fea90615da5565b80156140375780601f1061400c57610100808354040283529160200191614037565b820191906000526020600020905b81548152906001019060200180831161401a57829003601f168201915b50505050508152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a8201548152602001600b820154815250509050600081604001518460400151426140c79190615d62565b10156141265760408201516140dd906064615d43565b60808301516140ed906064615d62565b60408601516140fc9042615d62565b846060015161410b9190615d43565b6141159190615d43565b61411f9190615d23565b9050614157565b816040015184604001514261413b9190615d62565b836060015161414a9190615d43565b6141549190615d23565b90505b816020015182604001518560200151426141719190615d62565b84606001516141809190615d43565b61418a9190615d23565b10156141ba5760648260e0015160646141a39190615d62565b6141ad9083615d43565b6141b79190615d23565b90505b9392505050565b6040516306fb0b3960e51b8152600090819073dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a89063df61672090614200906007908790600401615b2d565b60206040518083038186803b15801561421857600080fd5b505af415801561422c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142509190614e03565b121592915050565b600080546001600160a01b03851682526002602052604082205483919061427f9086615d43565b6142899190615d23565b6141b79190615d62565b804710156142b35760405162461bcd60e51b8152600401610d0e90615561565b6000826001600160a01b0316826040516142cc906151ec565b60006040518083038185875af1925050503d8060008114614309576040519150601f19603f3d011682016040523d82523d6000602084013e61430e565b606091505b505090508061432f5760405162461bcd60e51b8152600401610d0e90615504565b505050565b61433d826141c1565b6143595760405162461bcd60e51b8152600401610d0e90615301565b600081116143795760405162461bcd60e51b8152600401610d0e90615945565b604051635bce6b3b60e01b815260009073dcbb8234d0d0bc0a311b5fa3588df9e4ae7110a890635bce6b3b906143b6906007908790600401615b2d565b60206040518083038186803b1580156143ce57600080fd5b505af41580156143e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144069190614e03565b90508181600501600082825461441c9190615d0b565b90915550506006810154600582015411156144495760405162461bcd60e51b8152600401610d0e90615a8b565b60005b8281101561165957600b8460405161446491906151d0565b9081526040805191829003602090810183206001600160a01b038916600090815290825282812060608501845288855242858401819052938501939093528254600181018455928152819020835180516003909402909101926144ca9284920190614b4b565b5060208201516001820155604090910151600290910155806144eb81615de0565b91505061444c565b61432f8363a9059cbb60e01b8484604051602401614512929190615203565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152614814565b604080516002808252606082018352600092602083019080368337505060105482519293506001600160a01b03169183915060009061459857634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152601354604080516339d94ae160e11b8152905191909316926373b295c2926004808301939192829003018186803b1580156145ec57600080fd5b505afa158015614600573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146249190614c9c565b8160018151811061464557634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201015260105460135460405163095ea7b360e01b81529183169263095ea7b39261468a92909116908690600401615203565b602060405180830381600087803b1580156146a457600080fd5b505af11580156146b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146dc9190614daf565b50601354604051633b158ab160e11b81526001600160a01b039091169063762b156290614716908590600090869030904290600401615c0f565b600060405180830381600087803b15801561473057600080fd5b505af1158015610faa573d6000803e3d6000fd5b4761474e82614549565b600061475a8247615d62565b6040519091506001600160a01b0385169082156108fc029083906000818181858888f19350505050158015611659573d6000803e3d6000fd5b60006147a0600283615d23565b905060006147ae8284615d62565b9050476147ba83614549565b60006147c68247615d62565b90506147d283826148a3565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb56184828560405161480593929190615c7f565b60405180910390a15050505050565b6000614869826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166149c39092919063ffffffff16565b80519091501561432f57808060200190518101906148879190614daf565b61432f5760405162461bcd60e51b8152600401610d0e9061598f565b60105460135460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926148d9929116908690600401615203565b602060405180830381600087803b1580156148f357600080fd5b505af1158015614907573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061492b9190614daf565b50601354601054601654604051637c8d9fb960e11b81526001600160a01b039384169363f91b3f7293869361497193918316928992600092839216904290600401615240565b6060604051808303818588803b15801561498a57600080fd5b505af115801561499e573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611659919061513d565b60606141b78484600085856149d785614a6c565b6149f35760405162461bcd60e51b8152600401610d0e906158d7565b600080866001600160a01b03168587604051614a0f91906151d0565b60006040518083038185875af1925050503d8060008114614a4c576040519150601f19603f3d011682016040523d82523d6000602084013e614a51565b606091505b5091509150614a61828286614a72565b979650505050505050565b3b151590565b60608315614a815750816141ba565b825115614a915782518084602001fd5b8160405162461bcd60e51b8152600401610d0e91906152ee565b6040518061018001604052806060815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b508054614b1890615da5565b6000825580601f10614b2a5750614b48565b601f016020900490600052602060002090810190614b489190614bcf565b50565b828054614b5790615da5565b90600052602060002090601f016020900481019282614b795760008555614bbf565b82601f10614b9257805160ff1916838001178555614bbf565b82800160010185558215614bbf579182015b82811115614bbf578251825591602001919060010190614ba4565b50614bcb929150614bcf565b5090565b5b80821115614bcb5760008155600101614bd0565b600082601f830112614bf4578081fd5b8135614c07614c0282615ce3565b615c95565b818152846020838601011115614c1b578283fd5b816020850160208301379081016020019190915292915050565b600082601f830112614c45578081fd5b8151614c53614c0282615ce3565b818152846020838601011115614c67578283fd5b614c78826020830160208701615d79565b949350505050565b600060208284031215614c91578081fd5b81356141ba81615e27565b600060208284031215614cad578081fd5b81516141ba81615e27565b60008060408385031215614cca578081fd5b8235614cd581615e27565b946020939093013593505050565b60008060408385031215614cf5578182fd5b823567ffffffffffffffff80821115614d0c578384fd5b818501915085601f830112614d1f578384fd5b81356020614d2f614c0283615cbf565b82815281810190858301885b85811015614d6457614d528c8684358b0101614be4565b84529284019290840190600101614d3b565b50909750505086013592505080821115614d7c578283fd5b50614d8985828601614be4565b9150509250929050565b600060208284031215614da4578081fd5b81356141ba81615e3c565b600060208284031215614dc0578081fd5b81516141ba81615e3c565b60008060408385031215614ddd578182fd5b8235614de881615e27565b91506020830135614df881615e27565b809150509250929050565b600060208284031215614e14578081fd5b5051919050565b600060208284031215614e2c578081fd5b813567ffffffffffffffff811115614e42578182fd5b614c7884828501614be4565b60008060408385031215614e60578182fd5b823567ffffffffffffffff811115614e76578283fd5b614e8285828601614be4565b9250506020830135614df881615e27565b60008060408385031215614ea5578182fd5b823567ffffffffffffffff80821115614ebc578384fd5b614ec886838701614be4565b9350602091508185013581811115614ede578384fd5b85019050601f81018613614ef0578283fd5b8035614efe614c0282615cbf565b81815283810190838501858402850186018a1015614f1a578687fd5b8694505b83851015614f3c578035835260019490940193918501918501614f1e565b5080955050505050509250929050565b60008060408385031215614f5e578182fd5b823567ffffffffffffffff811115614f74578283fd5b614f8085828601614be4565b95602094909401359450505050565b60008060008060008060008060008060006101608c8e031215614fb0578687fd5b8b3567ffffffffffffffff811115614fc6578788fd5b614fd28e828f01614be4565b9e60208e01359e5060408e01359d60608101359d5060808101359c5060a08101359b5060c08101359a5060e0810135995061010081013598506101208101359750610140013595509350505050565b600060208284031215615032578081fd5b815167ffffffffffffffff80821115615049578283fd5b818401915061018080838703121561505f578384fd5b61506881615c95565b9050825182811115615078578485fd5b61508487828601614c35565b8252506020838101519082015260408084015190820152606080840151908201526080808401519082015260a0808401519082015260c0808401519082015260e080840151908201526101008084015190820152610120808401519082015261014080840151908201526101609283015192810192909252509392505050565b600060208284031215615115578081fd5b5035919050565b6000806040838503121561512e578182fd5b50508035926020909101359150565b600080600060608486031215615151578081fd5b8351925060208401519150604084015190509250925092565b6000815180845260208085019450808401835b838110156151995781518752958201959082019060010161517d565b509495945050505050565b600081518084526151bc816020860160208601615d79565b601f01601f19169290920160200192915050565b600082516151e2818460208701615d79565b9190910192915050565b90565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b6000602080830181845280855180835260408601915060408482028701019250838701855b828110156152ce57603f198886030184526152bc85835161516a565b945092850192908501906001016152a0565b5092979650505050505050565b6000602082526141ba602083018461516a565b6000602082526141ba60208301846151a4565b60208082526029908201527f5f6372656174654e6f6465733a206e6f6465547970654e616d6520646f6573206040820152681b9bdd08195e1a5cdd60ba1b606082015260800190565b6020808252601f908201527f4c6576656c207570206c696d6974207265616368656420666f72207573657200604082015260600190565b60208082526019908201527f4e62206d7573742062652067726561746572207468616e203000000000000000604082015260600190565b60208082526010908201526f4e6f7468696e6720746f20636c61696d60801b604082015260600190565b6020808252600f908201526e139bdd08195b9bdd59da081cd95b9d608a1b604082015260600190565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b60208082526025908201527f4e6f206f6e652063616e206c6576656c20757020746869732074797065206f66604082015264206e6f646560d81b606082015260800190565b6020808252602b908201527f6368616e67654e6f6465547970653a206e6f6465547970654e616d6520646f6560408201526a1cc81b9bdd08195e1a5cdd60aa1b606082015260800190565b602080825260099082015268139bdd081bdddb995960ba1b604082015260600190565b6020808252603a908201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260408201527f6563697069656e74206d61792068617665207265766572746564000000000000606082015260800190565b6020808252601d908201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604082015260600190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b602080825260149082015273496e73756666696369656e742050656e64696e6760601b604082015260600190565b60208082526028908201527f544b4e3a2054686520726f7574657220616c7265616479206861732074686174604082015267206164647265737360c01b606082015260800190565b60208082526028908201527f667574757220616e642072657761726473506f6f6c2063616e6e6f7420637265604082015267617465206e6f646560c01b606082015260800190565b60208082526030908201527f6d6f76654163636f756e743a205f64656661756c746e6f6465547970654e616d60408201526f1948191bd95cc81b9bdd08195e1a5cdd60821b606082015260800190565b6020808252818101527f4e6f6465206c6576656c207570206e6f7420617574686f72697a656420796574604082015260600190565b6020808252601390820152721d185c99d95d08191bd95cdb9d08195e1a5cdd606a1b604082015260600190565b6020808252602c908201527f4372656174696f6e20776974682070656e64696e67206c696d6974207265616360408201526b3432b2103337b9103ab9b2b960a11b606082015260800190565b6020808252601b908201527f6e6f6465547970654e616d6520646f6573206e6f742065786973740000000000604082015260600190565b60208082526017908201527f6164644e6f6465547970653a20456d707479206e616d65000000000000000000604082015260600190565b60208082526026908201527f6164644e6f6465547970653a2073616d65206e6f6465547970654e616d6520656040820152653c34b9ba399760d11b606082015260800190565b602080825260149082015273139bd919551e5c1948191bd95cdb88195e1a5cdd60621b604082015260600190565b60208082526011908201527013985b5948191bd95cdb9d08195e1a5cdd607a1b604082015260600190565b60208082526011908201527021b0b73737ba103632bb32b6103237bbb760791b604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526018908201527f546f6f206d616e79206e6f646573207265717565737465640000000000000000604082015260600190565b6020808252602a908201527f5f6372656174654e6f6465733a20636f756e742063616e6e6f74206265206c6560408201526939b9903a3430b710189760b11b606082015260800190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b602080825260089082015267233ab1b59037b33360c11b604082015260600190565b6020808252601190820152701b985b5948191bd95cdb9d08195e1a5cdd607a1b604082015260600190565b6020808252601c908201527f4d6967726174696f6e206e6f7420617574686f72697a65642079657400000000604082015260600190565b60208082526014908201527311db1bd8985b081b1a5b5a5d081c995858da195960621b604082015260600190565b60208082526013908201527213585e08185b1c9958591e481c995858da1959606a1b604082015260600190565b6020808252601d908201527f42616c616e636520746f6f206c6f7720666f72206372656174696f6e2e000000604082015260600190565b6020808252818101527f4e6f6465206372656174696f6e206e6f7420617574686f72697a656420796574604082015260600190565b90815260200190565b6000838252604060208301526141b760408301846151a4565b600084825260606020830152615b5f60608301856151a4565b82810360408401526101808451818352615b7b828401826151a4565b9150506020850151602083015260408501516040830152606085015160608301526080850151608083015260a085015160a083015260c085015160c083015260e085015160e08301526101008086015181840152506101208086015181840152506101408086015181840152506101608086015181840152508092505050949350505050565b918252602082015260400190565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b81811015615c5e5784516001600160a01b031683529383019391830191600101615c39565b50506001600160a01b03969096166060850152505050608001529392505050565b9283526020830191909152604082015260600190565b60405181810167ffffffffffffffff81118282101715615cb757615cb7615e11565b604052919050565b600067ffffffffffffffff821115615cd957615cd9615e11565b5060209081020190565b600067ffffffffffffffff821115615cfd57615cfd615e11565b50601f01601f191660200190565b60008219821115615d1e57615d1e615dfb565b500190565b600082615d3e57634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615615d5d57615d5d615dfb565b500290565b600082821015615d7457615d74615dfb565b500390565b60005b83811015615d94578181015183820152602001615d7c565b83811115611f395750506000910152565b600281046001821680615db957607f821691505b60208210811415615dda57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415615df457615df4615dfb565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114614b4857600080fd5b8015158114614b4857600080fdfea2646970667358221220ab0b2089379f526eaca5477bbfb183ce3106d3b46832f6775025d74f9c85571364736f6c63430008000033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000006c48fa4a03e62a9658082ffc8c774fb39a942e4f0000000000000000000000006c1c0319d8ddcb0ffe1a68c5b3829fd361587db4000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000060ae616a2155ee3d9a68541ba4544862310933d400000000000000000000000000000000000000000000000000000000000000050000000000000000000000000d32417e50e30dfc2c3f39d3997f9006edfcf6c60000000000000000000000003918c5ec307b3124d5ea381effe89d8935428803000000000000000000000000fdcb5d746d7f660721fb328825b5b8f06c53e37c000000000000000000000000296bf01632748ba964f4b771efc534faad0e587f0000000000000000000000002dc0c861afe1f154dae51a4350e4da886e501ff10000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000001b000000000000000000000000000000000000000000000000000000000000001b0000000000000000000000000000000000000000000000000000000000000015000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000003000000000000000000000000f128b6ba7db8532fa1d98bf2c31fc843b2882605000000000000000000000000ab3b24ba4c5911366c59cc870facc25b6ea3a05300000000000000000000000015b72f2f0cd37fade6c734e72485de0909b1e2a8000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000037000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000a
-----Decoded View---------------
Arg [0] : oldNodeRewardManager (address): 0x6c48fa4a03E62A9658082FFC8c774Fb39A942e4f
Arg [1] : token (address): 0x6C1c0319d8dDcb0ffE1a68C5b3829Fd361587DB4
Arg [2] : payees (address[]): 0x0D32417E50e30DFc2c3f39d3997f9006EdfCF6C6,0x3918C5EC307B3124D5eA381effE89d8935428803,0xFdCB5d746D7F660721FB328825B5B8f06C53E37c,0x296bF01632748BA964F4b771EFc534faAD0e587F,0x2dC0C861Afe1F154dAE51A4350E4DA886E501FF1
Arg [3] : shares (uint256[]): 27,27,21,20,5
Arg [4] : addresses (address[]): 0xf128b6Ba7db8532Fa1d98BF2C31fC843B2882605,0xAB3b24BA4c5911366C59cC870FAcC25B6ea3a053,0x15B72F2F0cd37fAde6c734E72485dE0909B1e2A8
Arg [5] : fees (uint256[]): 20,55,10,10
Arg [6] : swapAmount (uint256): 30
Arg [7] : uniV2Router (address): 0x60aE616a2155Ee3d9A68541Ba4544862310933d4
-----Encoded View---------------
29 Constructor Arguments found :
Arg [0] : 0000000000000000000000006c48fa4a03e62a9658082ffc8c774fb39a942e4f
Arg [1] : 0000000000000000000000006c1c0319d8ddcb0ffe1a68c5b3829fd361587db4
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 00000000000000000000000000000000000000000000000000000000000001c0
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000280
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000300
Arg [6] : 000000000000000000000000000000000000000000000000000000000000001e
Arg [7] : 00000000000000000000000060ae616a2155ee3d9a68541ba4544862310933d4
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [9] : 0000000000000000000000000d32417e50e30dfc2c3f39d3997f9006edfcf6c6
Arg [10] : 0000000000000000000000003918c5ec307b3124d5ea381effe89d8935428803
Arg [11] : 000000000000000000000000fdcb5d746d7f660721fb328825b5b8f06c53e37c
Arg [12] : 000000000000000000000000296bf01632748ba964f4b771efc534faad0e587f
Arg [13] : 0000000000000000000000002dc0c861afe1f154dae51a4350e4da886e501ff1
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [15] : 000000000000000000000000000000000000000000000000000000000000001b
Arg [16] : 000000000000000000000000000000000000000000000000000000000000001b
Arg [17] : 0000000000000000000000000000000000000000000000000000000000000015
Arg [18] : 0000000000000000000000000000000000000000000000000000000000000014
Arg [19] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [20] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [21] : 000000000000000000000000f128b6ba7db8532fa1d98bf2c31fc843b2882605
Arg [22] : 000000000000000000000000ab3b24ba4c5911366c59cc870facc25b6ea3a053
Arg [23] : 00000000000000000000000015b72f2f0cd37fade6c734e72485de0909b1e2a8
Arg [24] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [25] : 0000000000000000000000000000000000000000000000000000000000000014
Arg [26] : 0000000000000000000000000000000000000000000000000000000000000037
Arg [27] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [28] : 000000000000000000000000000000000000000000000000000000000000000a
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
AVAX | 100.00% | $22.4 | 0.2219 | $4.97 |
Loading...
Loading
Loading...
Loading
[ 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.