| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| no token holdings | ||||
// SPDX-License-Identifier: MIT
pragma solidity 0.8.24;
import {IERC721} from "@openzeppelin/contracts/token/ERC721/IERC721.sol";
import {IERC721Receiver} from "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {Ownable2Step} from "@openzeppelin/contracts/access/Ownable2Step.sol";
import {ReentrancyGuard} from "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import {EnumerableSet} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
/// @title MiniBrokerStaking
/// @notice Production NFT staking contract for the MiNI BRoKER collection.
/// @dev Push-based staking (safeTransferFrom -> onERC721Received). Each staked NFT has an
/// independent 5 day lock. The daily staking window is 14:00-18:00 UTC. The daily
/// capacity cycle (250/500/750/1000/2000, repeating) is anchored to the timestamp of the
/// FIRST successful stake, not to contract deployment. Reward, refund and airdrop claims
/// are fully independent of NFT unstaking so that a reward-token problem can never trap
/// a user's NFT.
contract MiniBrokerStaking is IERC721Receiver, Ownable2Step, ReentrancyGuard {
using SafeERC20 for IERC20;
using EnumerableSet for EnumerableSet.UintSet;
// =========================================================================================
// Constants
// =========================================================================================
/// @notice Lock duration applied to every individual staked NFT.
uint256 public constant LOCK_DURATION = 5 days;
/// @notice Daily staking window start, in seconds after UTC midnight (14:00 UTC).
uint256 public constant DAILY_WINDOW_START = 14 hours;
/// @notice Daily staking window end, in seconds after UTC midnight (18:00 UTC).
uint256 public constant DAILY_WINDOW_END = 18 hours;
/// @notice Maximum number of NFTs that may ever be accepted into the staking program.
uint256 public constant TOTAL_CAPACITY = 5000;
/// @notice Length of the repeating daily capacity cycle.
uint256 public constant CYCLE_LENGTH = 5;
/// @notice Basis points denominator used for the staker reward allocation percentage.
uint256 public constant BPS_DENOMINATOR = 10_000;
// =========================================================================================
// Custom errors
// =========================================================================================
error ZeroAddress();
error InvalidAmount();
error SystemIsDisabled();
error StakingIsDisabled();
error EmergencyPausedActive();
error StakingWindowClosed();
error DailyCapacityReached();
error TotalCapacityReached();
error InvalidNFT();
error AlreadyStaked();
error NotStaked();
error StillLocked();
error NotStaker();
error RewardNotAvailable();
error RewardAlreadyClaimed();
error RefundNotAvailable();
error RefundAlreadyClaimed();
error AirdropNotAvailable();
error AirdropAlreadyClaimed();
error InvalidToken();
error Unauthorized();
error NFTContractFinalizedError();
error RewardConfigFinalizedError();
error InsufficientRewardBalance();
error ArrayLengthMismatch();
error EmptyBatch();
error NothingToRecover();
error CannotRecoverStakedNFT();
error CannotRecoverReservedTokens();
error InvalidBps();
error NativeTransferFailed();
// =========================================================================================
// Events
// =========================================================================================
event Staked(address indexed staker, uint256 indexed tokenId, uint256 stakedAt, uint256 unlockTime, uint256 dayIndex);
event Unstaked(address indexed staker, uint256 indexed tokenId, uint256 unstakedAt);
event StakingCycleStarted(uint256 firstStakeTimestamp, uint256 firstStakeDay);
event RewardClaimed(address indexed staker, uint256 indexed tokenId, uint256 amount);
event RefundClaimed(address indexed staker, uint256 indexed tokenId, uint256 amount);
event AirdropClaimed(address indexed staker, uint256 indexed tokenId, uint256 amount);
event StakingEnabled();
event StakingDisabled();
event SystemEnabled();
event SystemDisabled();
event RewardClaimsEnabled();
event RewardClaimsDisabled();
event RefundEnabled();
event RefundDisabled();
event AirdropEnabled();
event AirdropDisabled();
event EmergencyPaused();
event EmergencyUnpaused();
event RewardTokenUpdated(address indexed token);
event RewardAmountUpdated(uint256 amount);
event RefundAmountUpdated(uint256 amount);
event AirdropAmountUpdated(uint256 amount);
event RewardAllocationUpdated(uint256 bps);
event RewardConfigurationFinalized();
event RewardPoolDeposited(address indexed from, uint256 amount);
event NFTContractUpdated(address indexed nftContract);
event NFTContractFinalized(address indexed nftContract);
event TreasuryUpdated(address indexed treasury);
event NativeRecovered(address indexed to, uint256 amount);
event ERC20Recovered(address indexed token, address indexed to, uint256 amount);
event ERC721Recovered(address indexed token, address indexed to, uint256 tokenId);
// =========================================================================================
// Configuration state
// =========================================================================================
/// @notice The only ERC-721 collection accepted by this staking contract.
address public nftContract;
/// @notice Once true, nftContract can never be changed again.
bool public nftContractFinalized;
/// @notice Overall master switch. When false, no new staking is possible.
bool public systemEnabled;
/// @notice Staking-specific switch. When false, no new staking is possible, but unstaking
/// is never affected.
bool public stakingEnabled;
/// @notice Emergency pause. Stops new staking (and optionally claims); never blocks unstake.
bool public emergencyPaused;
/// @notice ERC-20 token used for reward, refund and airdrop payouts. Configured later.
address public rewardToken;
bool public rewardClaimsEnabled;
uint256 public rewardAmount;
bool public refundEnabled;
uint256 public refundAmount;
bool public airdropEnabled;
uint256 public airdropAmount;
/// @notice Destination for recovered native ETH / non-reserved ERC-20 / foreign NFTs.
address public treasury;
/// @notice Once true, rewardAmount/refundAmount/airdropAmount/rewardAllocationBps are locked.
bool public rewardConfigFinalized;
/// @notice Percentage (in basis points) of deposited reward tokens reserved for stakers.
/// Defaults to 9000 (90%), matching the intended 90% staking allocation.
uint256 public rewardAllocationBps = 9000;
// =========================================================================================
// Staking cycle anchor (established by the FIRST successful stake, not deployment)
// =========================================================================================
uint256 public firstStakeTimestamp; // 0 until the first successful stake
uint256 public firstStakeDay; // UTC day number (block.timestamp / 1 days) of first stake
/// @notice Number of NFTs staked on a given cycle day index (0-based from firstStakeDay).
mapping(uint256 => uint256) public stakedPerDay;
// =========================================================================================
// Staking accounting
// =========================================================================================
struct StakeInfo {
address owner;
uint256 tokenId;
uint256 stakedAt;
uint256 unlockTime;
bool active;
bool refundClaimed;
bool airdropClaimed;
bool rewardClaimed;
}
mapping(uint256 => StakeInfo) public stakeInfo;
mapping(address => EnumerableSet.UintSet) private _userTokens;
/// @notice Currently staked NFTs (decremented on unstake).
uint256 public totalActiveStaked;
/// @notice NFTs ever accepted into staking (NEVER decremented). Gates the 5,000 cap so
/// repeated stake/unstake cycles cannot be used to bypass total capacity.
uint256 public totalAccepted;
// =========================================================================================
// Reward pool accounting
// =========================================================================================
uint256 public totalRewardDeposited;
uint256 public totalRewardClaimedAmount;
uint256 public totalRefundClaimedAmount;
uint256 public totalAirdropClaimedAmount;
uint256 public totalRewardWithdrawnByOwner;
// =========================================================================================
// Constructor
// =========================================================================================
constructor(address _nftContract, address _initialOwner) Ownable(_initialOwner) {
if (_nftContract == address(0)) revert ZeroAddress();
if (_initialOwner == address(0)) revert ZeroAddress();
nftContract = _nftContract;
treasury = _initialOwner;
// Staking is enabled immediately after deployment. No separate "start staking"
// transaction is required. Actual stakes remain gated by NFT ownership, the daily
// window, daily capacity and total capacity.
systemEnabled = true;
stakingEnabled = true;
// Reward claims start disabled until a reward token is configured and funded.
rewardClaimsEnabled = false;
refundEnabled = false;
airdropEnabled = false;
}
// =========================================================================================
// Modifiers
// =========================================================================================
modifier rewardConfigNotFinalized() {
if (rewardConfigFinalized) revert RewardConfigFinalizedError();
_;
}
// =========================================================================================
// Capacity cycle helpers
// =========================================================================================
/// @dev Day 1 (index 0) = 250, Day 2 (index 1) = 500, Day 3 (index 2) = 750,
/// Day 4 (index 3) = 1000, Day 5 (index 4) = 2000, then repeats.
function _cycleCapacity(uint256 idx) internal pure returns (uint256) {
uint256 pos = idx % CYCLE_LENGTH;
if (pos == 0) return 250;
if (pos == 1) return 500;
if (pos == 2) return 750;
if (pos == 3) return 1000;
return 2000;
}
function _currentUtcDay() internal view returns (uint256) {
return block.timestamp / 1 days;
}
function cycleStarted() public view returns (bool) {
return firstStakeTimestamp != 0;
}
/// @notice Current 0-based day index within the capacity cycle. 0 before the cycle starts.
function currentDayIndex() public view returns (uint256) {
if (!cycleStarted()) return 0;
uint256 today = _currentUtcDay();
if (today < firstStakeDay) return 0;
return today - firstStakeDay;
}
/// @notice The capacity that applies to the current (or, before the cycle starts, the
/// first) staking day.
function currentDailyCapacity() public view returns (uint256) {
return _cycleCapacity(currentDayIndex());
}
function stakedToday() public view returns (uint256) {
return stakedPerDay[currentDayIndex()];
}
function remainingTodayCapacity() public view returns (uint256) {
uint256 cap = currentDailyCapacity();
uint256 used = stakedToday();
return used >= cap ? 0 : cap - used;
}
/// @notice Whether the current time falls inside the 14:00-18:00 UTC daily window.
function isStakingWindowOpen() public view returns (bool) {
uint256 secondsToday = block.timestamp % 1 days;
return secondsToday >= DAILY_WINDOW_START && secondsToday < DAILY_WINDOW_END;
}
function totalStaked() public view returns (uint256) {
return totalActiveStaked;
}
function seasonComplete() public view returns (bool) {
return totalAccepted >= TOTAL_CAPACITY;
}
function isStakingEnabled() external view returns (bool) {
return stakingEnabled;
}
function isSystemEnabled() external view returns (bool) {
return systemEnabled;
}
function rewardTokenAddress() external view returns (address) {
return rewardToken;
}
// =========================================================================================
// Push-based staking: safeTransferFrom -> onERC721Received
// =========================================================================================
/// @inheritdoc IERC721Receiver
/// @dev This is the primary staking entry point. It verifies the transfer originates from
/// the configured MiNI BRoKER NFT contract before recording any staking position.
function onERC721Received(
address /* operator */,
address from,
uint256 tokenId,
bytes calldata /* data */
) external nonReentrant returns (bytes4) {
if (msg.sender != nftContract) revert InvalidNFT();
_recordStake(from, tokenId);
return IERC721Receiver.onERC721Received.selector;
}
/// @notice Convenience wrapper around the push-based staking flow. Internally performs the
/// same safeTransferFrom that a direct NFT-side call would, so there is only one
/// accounting path (onERC721Received).
function stake(uint256 tokenId) external {
IERC721(nftContract).safeTransferFrom(msg.sender, address(this), tokenId);
}
/// @notice Batch convenience wrapper. Each token is transferred (and recorded) individually
/// via the same push-based accounting path; the whole batch reverts atomically if
/// any token fails validation, so state can never end up partially applied.
function stakeBatch(uint256[] calldata tokenIds) external {
uint256 len = tokenIds.length;
if (len == 0) revert EmptyBatch();
if (totalAccepted + len > TOTAL_CAPACITY) revert TotalCapacityReached();
for (uint256 i = 0; i < len; i++) {
IERC721(nftContract).safeTransferFrom(msg.sender, address(this), tokenIds[i]);
}
}
function _recordStake(address staker, uint256 tokenId) internal {
if (!systemEnabled) revert SystemIsDisabled();
if (!stakingEnabled) revert StakingIsDisabled();
if (emergencyPaused) revert EmergencyPausedActive();
if (!isStakingWindowOpen()) revert StakingWindowClosed();
if (stakeInfo[tokenId].active) revert AlreadyStaked();
if (totalAccepted >= TOTAL_CAPACITY) revert TotalCapacityReached();
uint256 dayIdx;
if (!cycleStarted()) {
firstStakeTimestamp = block.timestamp;
firstStakeDay = _currentUtcDay();
dayIdx = 0;
emit StakingCycleStarted(firstStakeTimestamp, firstStakeDay);
} else {
dayIdx = currentDayIndex();
}
uint256 cap = _cycleCapacity(dayIdx);
if (stakedPerDay[dayIdx] >= cap) revert DailyCapacityReached();
stakedPerDay[dayIdx] += 1;
totalAccepted += 1;
totalActiveStaked += 1;
uint256 unlock = block.timestamp + LOCK_DURATION;
stakeInfo[tokenId] = StakeInfo({
owner: staker,
tokenId: tokenId,
stakedAt: block.timestamp,
unlockTime: unlock,
active: true,
refundClaimed: false,
airdropClaimed: false,
rewardClaimed: false
});
_userTokens[staker].add(tokenId);
emit Staked(staker, tokenId, block.timestamp, unlock, dayIdx);
}
// =========================================================================================
// Unstake - guaranteed path, independent of reward/refund/airdrop state
// =========================================================================================
/// @notice Returns a staked NFT to its owner once the 5-day lock has completed. Never
/// checks stakingEnabled / systemEnabled / emergencyPaused / reward state, so a
/// reward-token problem or an emergency pause can never permanently trap an NFT.
function unstake(uint256 tokenId) external nonReentrant {
_unstake(tokenId);
}
/// @notice Explicit emergency-recovery alias for `unstake`, provided so that a guaranteed
/// NFT-return path is always discoverable even if the ordinary flow is ever
/// mistakenly assumed to depend on reward availability. Logic is identical to
/// `unstake`.
function emergencyUnstake(uint256 tokenId) external nonReentrant {
_unstake(tokenId);
}
function _unstake(uint256 tokenId) internal {
StakeInfo storage info = stakeInfo[tokenId];
if (!info.active) revert NotStaked();
if (info.owner != msg.sender) revert NotStaker();
if (block.timestamp < info.unlockTime) revert StillLocked();
info.active = false;
totalActiveStaked -= 1;
_userTokens[msg.sender].remove(tokenId);
// Effects are fully applied before the external call (checks-effects-interactions).
IERC721(nftContract).safeTransferFrom(address(this), msg.sender, tokenId);
emit Unstaked(msg.sender, tokenId, block.timestamp);
}
// =========================================================================================
// Reward / refund / airdrop claims - fully independent of unstaking
// =========================================================================================
function claimReward(uint256 tokenId) external nonReentrant {
StakeInfo storage info = stakeInfo[tokenId];
if (info.stakedAt == 0) revert NotStaked();
if (info.owner != msg.sender) revert NotStaker();
if (block.timestamp < info.unlockTime) revert StillLocked();
if (!rewardClaimsEnabled || rewardToken == address(0) || rewardAmount == 0) revert RewardNotAvailable();
if (info.rewardClaimed) revert RewardAlreadyClaimed();
if (rewardTokenBalance() < rewardAmount) revert InsufficientRewardBalance();
info.rewardClaimed = true;
totalRewardClaimedAmount += rewardAmount;
IERC20(rewardToken).safeTransfer(msg.sender, rewardAmount);
emit RewardClaimed(msg.sender, tokenId, rewardAmount);
}
function claimRefund(uint256 tokenId) external nonReentrant {
StakeInfo storage info = stakeInfo[tokenId];
if (info.stakedAt == 0) revert NotStaked();
if (info.owner != msg.sender) revert NotStaker();
if (block.timestamp < info.unlockTime) revert StillLocked();
if (!refundEnabled || rewardToken == address(0) || refundAmount == 0) revert RefundNotAvailable();
if (info.refundClaimed) revert RefundAlreadyClaimed();
if (rewardTokenBalance() < refundAmount) revert InsufficientRewardBalance();
info.refundClaimed = true;
totalRefundClaimedAmount += refundAmount;
IERC20(rewardToken).safeTransfer(msg.sender, refundAmount);
emit RefundClaimed(msg.sender, tokenId, refundAmount);
}
function claimAirdrop(uint256 tokenId) external nonReentrant {
StakeInfo storage info = stakeInfo[tokenId];
if (info.stakedAt == 0) revert NotStaked();
if (info.owner != msg.sender) revert NotStaker();
if (block.timestamp < info.unlockTime) revert StillLocked();
if (!airdropEnabled || rewardToken == address(0) || airdropAmount == 0) revert AirdropNotAvailable();
if (info.airdropClaimed) revert AirdropAlreadyClaimed();
if (rewardTokenBalance() < airdropAmount) revert InsufficientRewardBalance();
info.airdropClaimed = true;
totalAirdropClaimedAmount += airdropAmount;
IERC20(rewardToken).safeTransfer(msg.sender, airdropAmount);
emit AirdropClaimed(msg.sender, tokenId, airdropAmount);
}
// =========================================================================================
// Per-token views
// =========================================================================================
function isStaked(uint256 tokenId) public view returns (bool) {
return stakeInfo[tokenId].active;
}
function unlockTime(uint256 tokenId) public view returns (uint256) {
return stakeInfo[tokenId].unlockTime;
}
function remainingLockTime(uint256 tokenId) public view returns (uint256) {
uint256 u = stakeInfo[tokenId].unlockTime;
if (u <= block.timestamp) return 0;
return u - block.timestamp;
}
function canUnstake(uint256 tokenId) public view returns (bool) {
StakeInfo storage info = stakeInfo[tokenId];
return info.active && block.timestamp >= info.unlockTime;
}
function canClaimReward(uint256 tokenId) public view returns (bool) {
StakeInfo storage info = stakeInfo[tokenId];
return info.stakedAt != 0 && !info.rewardClaimed && rewardClaimsEnabled
&& rewardToken != address(0) && rewardAmount != 0
&& block.timestamp >= info.unlockTime
&& rewardTokenBalance() >= rewardAmount;
}
function canClaimRefund(uint256 tokenId) public view returns (bool) {
StakeInfo storage info = stakeInfo[tokenId];
return info.stakedAt != 0 && !info.refundClaimed && refundEnabled
&& rewardToken != address(0) && refundAmount != 0
&& block.timestamp >= info.unlockTime
&& rewardTokenBalance() >= refundAmount;
}
function canClaimAirdrop(uint256 tokenId) public view returns (bool) {
StakeInfo storage info = stakeInfo[tokenId];
return info.stakedAt != 0 && !info.airdropClaimed && airdropEnabled
&& rewardToken != address(0) && airdropAmount != 0
&& block.timestamp >= info.unlockTime
&& rewardTokenBalance() >= airdropAmount;
}
function getUserStakedTokens(address user) external view returns (uint256[] memory) {
return _userTokens[user].values();
}
// =========================================================================================
// Reward pool accounting views
// =========================================================================================
function rewardTokenBalance() public view returns (uint256) {
if (rewardToken == address(0)) return 0;
return IERC20(rewardToken).balanceOf(address(this));
}
/// @notice Portion of deposited reward tokens still committed to staker entitlements
/// (reward + refund + airdrop) and therefore not recoverable by the owner.
function reservedRewardBalance() public view returns (uint256) {
uint256 committed = (totalRewardDeposited * rewardAllocationBps) / BPS_DENOMINATOR;
uint256 claimedAll = totalRewardClaimedAmount + totalRefundClaimedAmount + totalAirdropClaimedAmount;
if (claimedAll >= committed) return 0;
return committed - claimedAll;
}
/// @notice Reward-token balance the owner could withdraw without touching staker
/// entitlements (i.e. the non-reserved remainder, such as the non-staker portion
/// of a deposit, or accidental over-funding).
function availableRewardBalance() public view returns (uint256) {
uint256 bal = rewardTokenBalance();
uint256 reserved = reservedRewardBalance();
return bal > reserved ? bal - reserved : 0;
}
/// @notice Generic version of availableRewardBalance for any ERC-20 token. For the reward
/// token it excludes the reserved portion; for any other token the full balance is
/// considered accidental and recoverable.
function withdrawableTokenBalance(address token) public view returns (uint256) {
uint256 bal = IERC20(token).balanceOf(address(this));
if (token == rewardToken) {
uint256 reserved = reservedRewardBalance();
return bal > reserved ? bal - reserved : 0;
}
return bal;
}
// =========================================================================================
// Reward funding
// =========================================================================================
/// @notice Deposits reward tokens from the caller (development/treasury wallet) into the
/// contract's reward pool. Requires a prior ERC-20 approval. rewardAllocationBps of
/// each deposit is treated as reserved for staker entitlements.
function depositRewardTokens(uint256 amount) external onlyOwner nonReentrant {
if (rewardToken == address(0)) revert RewardNotAvailable();
if (amount == 0) revert InvalidAmount();
IERC20(rewardToken).safeTransferFrom(msg.sender, address(this), amount);
totalRewardDeposited += amount;
emit RewardPoolDeposited(msg.sender, amount);
}
// =========================================================================================
// Owner: staking / system switches
// =========================================================================================
function enableStaking() external onlyOwner {
stakingEnabled = true;
emit StakingEnabled();
}
function disableStaking() external onlyOwner {
stakingEnabled = false;
emit StakingDisabled();
}
function enableSystem() external onlyOwner {
systemEnabled = true;
emit SystemEnabled();
}
function disableSystem() external onlyOwner {
systemEnabled = false;
emit SystemDisabled();
}
function pauseEmergency() external onlyOwner {
emergencyPaused = true;
emit EmergencyPaused();
}
function unpauseEmergency() external onlyOwner {
emergencyPaused = false;
emit EmergencyUnpaused();
}
// =========================================================================================
// Owner: reward / refund / airdrop switches
// =========================================================================================
function enableRewardClaims() external onlyOwner {
if (rewardToken == address(0)) revert RewardNotAvailable();
rewardClaimsEnabled = true;
emit RewardClaimsEnabled();
}
function disableRewardClaims() external onlyOwner {
rewardClaimsEnabled = false;
emit RewardClaimsDisabled();
}
function enableRefund() external onlyOwner {
if (rewardToken == address(0)) revert RefundNotAvailable();
refundEnabled = true;
emit RefundEnabled();
}
function disableRefund() external onlyOwner {
refundEnabled = false;
emit RefundDisabled();
}
function enableAirdrop() external onlyOwner {
if (rewardToken == address(0)) revert AirdropNotAvailable();
airdropEnabled = true;
emit AirdropEnabled();
}
function disableAirdrop() external onlyOwner {
airdropEnabled = false;
emit AirdropDisabled();
}
// =========================================================================================
// Owner: configuration
// =========================================================================================
function setRewardToken(address token) external onlyOwner {
if (token == address(0)) revert ZeroAddress();
if (token == nftContract) revert InvalidToken();
rewardToken = token;
emit RewardTokenUpdated(token);
}
function setRewardAmount(uint256 amount) external onlyOwner rewardConfigNotFinalized {
rewardAmount = amount;
emit RewardAmountUpdated(amount);
}
function setRefundAmount(uint256 amount) external onlyOwner rewardConfigNotFinalized {
refundAmount = amount;
emit RefundAmountUpdated(amount);
}
function setAirdropAmount(uint256 amount) external onlyOwner rewardConfigNotFinalized {
airdropAmount = amount;
emit AirdropAmountUpdated(amount);
}
function setRewardAllocationBps(uint256 bps) external onlyOwner rewardConfigNotFinalized {
if (bps > BPS_DENOMINATOR) revert InvalidBps();
rewardAllocationBps = bps;
emit RewardAllocationUpdated(bps);
}
/// @notice Locks reward/refund/airdrop amounts and the allocation percentage. Recommended
/// before enabling claims for public use. Already-paid claims are never affected by
/// later configuration changes regardless of this flag, since a claim, once paid,
/// cannot be replayed or altered.
function finalizeRewardConfiguration() external onlyOwner {
rewardConfigFinalized = true;
emit RewardConfigurationFinalized();
}
function setTreasury(address _treasury) external onlyOwner {
if (_treasury == address(0)) revert ZeroAddress();
treasury = _treasury;
emit TreasuryUpdated(_treasury);
}
function setNFTContract(address _nftContract) external onlyOwner {
if (nftContractFinalized) revert NFTContractFinalizedError();
if (_nftContract == address(0)) revert ZeroAddress();
nftContract = _nftContract;
emit NFTContractUpdated(_nftContract);
}
/// @notice Permanently locks the NFT contract address. Cannot be undone.
function finalizeNFTContract() external onlyOwner {
nftContractFinalized = true;
emit NFTContractFinalized(nftContract);
}
// =========================================================================================
// Owner: recovery functions
// =========================================================================================
/// @notice Recovers native ETH accidentally sent to the contract.
function withdrawNative() external onlyOwner nonReentrant {
uint256 bal = address(this).balance;
if (bal == 0) revert NothingToRecover();
(bool ok, ) = treasury.call{value: bal}("");
if (!ok) revert NativeTransferFailed();
emit NativeRecovered(treasury, bal);
}
/// @notice Recovers ERC-20 tokens accidentally sent to the contract. For the reward token,
/// only the non-reserved portion (see reservedRewardBalance) can be withdrawn, so
/// tokens already committed to staker entitlements can never be pulled out.
function recoverERC20(address token, uint256 amount) external onlyOwner nonReentrant {
uint256 withdrawable = withdrawableTokenBalance(token);
if (amount == 0 || amount > withdrawable) revert CannotRecoverReservedTokens();
IERC20(token).safeTransfer(treasury, amount);
if (token == rewardToken) {
totalRewardWithdrawnByOwner += amount;
}
emit ERC20Recovered(token, treasury, amount);
}
/// @notice Recovers ERC-721 tokens from OTHER collections accidentally sent to the
/// contract. Explicitly reverts for the MiNI BRoKER collection so the owner can
/// never use this function to take an active user's staked NFT.
function recoverERC721(address token, uint256 tokenId) external onlyOwner nonReentrant {
if (token == nftContract) revert CannotRecoverStakedNFT();
IERC721(token).safeTransferFrom(address(this), treasury, tokenId);
emit ERC721Recovered(token, treasury, tokenId);
}
// =========================================================================================
// Native ETH receiver
// =========================================================================================
receive() external payable {}
}[
{
"type": "constructor",
"inputs": [
{
"name": "_nftContract",
"type": "address",
"internalType": "address"
},
{
"name": "_initialOwner",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "nonpayable"
},
{
"name": "AirdropAlreadyClaimed",
"type": "error",
"inputs": []
},
{
"name": "AirdropNotAvailable",
"type": "error",
"inputs": []
},
{
"name": "AlreadyStaked",
"type": "error",
"inputs": []
},
{
"name": "ArrayLengthMismatch",
"type": "error",
"inputs": []
},
{
"name": "CannotRecoverReservedTokens",
"type": "error",
"inputs": []
},
{
"name": "CannotRecoverStakedNFT",
"type": "error",
"inputs": []
},
{
"name": "DailyCapacityReached",
"type": "error",
"inputs": []
},
{
"name": "EmergencyPausedActive",
"type": "error",
"inputs": []
},
{
"name": "EmptyBatch",
"type": "error",
"inputs": []
},
{
"name": "InsufficientRewardBalance",
"type": "error",
"inputs": []
},
{
"name": "InvalidAmount",
"type": "error",
"inputs": []
},
{
"name": "InvalidBps",
"type": "error",
"inputs": []
},
{
"name": "InvalidNFT",
"type": "error",
"inputs": []
},
{
"name": "InvalidToken",
"type": "error",
"inputs": []
},
{
"name": "NFTContractFinalizedError",
"type": "error",
"inputs": []
},
{
"name": "NativeTransferFailed",
"type": "error",
"inputs": []
},
{
"name": "NotStaked",
"type": "error",
"inputs": []
},
{
"name": "NotStaker",
"type": "error",
"inputs": []
},
{
"name": "NothingToRecover",
"type": "error",
"inputs": []
},
{
"name": "OwnableInvalidOwner",
"type": "error",
"inputs": [
{
"name": "owner",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "OwnableUnauthorizedAccount",
"type": "error",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ReentrancyGuardReentrantCall",
"type": "error",
"inputs": []
},
{
"name": "RefundAlreadyClaimed",
"type": "error",
"inputs": []
},
{
"name": "RefundNotAvailable",
"type": "error",
"inputs": []
},
{
"name": "RewardAlreadyClaimed",
"type": "error",
"inputs": []
},
{
"name": "RewardConfigFinalizedError",
"type": "error",
"inputs": []
},
{
"name": "RewardNotAvailable",
"type": "error",
"inputs": []
},
{
"name": "SafeERC20FailedOperation",
"type": "error",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "StakingIsDisabled",
"type": "error",
"inputs": []
},
{
"name": "StakingWindowClosed",
"type": "error",
"inputs": []
},
{
"name": "StillLocked",
"type": "error",
"inputs": []
},
{
"name": "SystemIsDisabled",
"type": "error",
"inputs": []
},
{
"name": "TotalCapacityReached",
"type": "error",
"inputs": []
},
{
"name": "Unauthorized",
"type": "error",
"inputs": []
},
{
"name": "ZeroAddress",
"type": "error",
"inputs": []
},
{
"name": "AirdropAmountUpdated",
"type": "event",
"inputs": [
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "AirdropClaimed",
"type": "event",
"inputs": [
{
"name": "staker",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "tokenId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "AirdropDisabled",
"type": "event",
"inputs": [],
"anonymous": false
},
{
"name": "AirdropEnabled",
"type": "event",
"inputs": [],
"anonymous": false
},
{
"name": "ERC20Recovered",
"type": "event",
"inputs": [
{
"name": "token",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "to",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "ERC721Recovered",
"type": "event",
"inputs": [
{
"name": "token",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "to",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "tokenId",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "EmergencyPaused",
"type": "event",
"inputs": [],
"anonymous": false
},
{
"name": "EmergencyUnpaused",
"type": "event",
"inputs": [],
"anonymous": false
},
{
"name": "NFTContractFinalized",
"type": "event",
"inputs": [
{
"name": "nftContract",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "NFTContractUpdated",
"type": "event",
"inputs": [
{
"name": "nftContract",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "NativeRecovered",
"type": "event",
"inputs": [
{
"name": "to",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "OwnershipTransferStarted",
"type": "event",
"inputs": [
{
"name": "previousOwner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "newOwner",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "OwnershipTransferred",
"type": "event",
"inputs": [
{
"name": "previousOwner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "newOwner",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "RefundAmountUpdated",
"type": "event",
"inputs": [
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "RefundClaimed",
"type": "event",
"inputs": [
{
"name": "staker",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "tokenId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "RefundDisabled",
"type": "event",
"inputs": [],
"anonymous": false
},
{
"name": "RefundEnabled",
"type": "event",
"inputs": [],
"anonymous": false
},
{
"name": "RewardAllocationUpdated",
"type": "event",
"inputs": [
{
"name": "bps",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "RewardAmountUpdated",
"type": "event",
"inputs": [
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "RewardClaimed",
"type": "event",
"inputs": [
{
"name": "staker",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "tokenId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "RewardClaimsDisabled",
"type": "event",
"inputs": [],
"anonymous": false
},
{
"name": "RewardClaimsEnabled",
"type": "event",
"inputs": [],
"anonymous": false
},
{
"name": "RewardConfigurationFinalized",
"type": "event",
"inputs": [],
"anonymous": false
},
{
"name": "RewardPoolDeposited",
"type": "event",
"inputs": [
{
"name": "from",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "RewardTokenUpdated",
"type": "event",
"inputs": [
{
"name": "token",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "Staked",
"type": "event",
"inputs": [
{
"name": "staker",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "tokenId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "stakedAt",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "unlockTime",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "dayIndex",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "StakingCycleStarted",
"type": "event",
"inputs": [
{
"name": "firstStakeTimestamp",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "firstStakeDay",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "StakingDisabled",
"type": "event",
"inputs": [],
"anonymous": false
},
{
"name": "StakingEnabled",
"type": "event",
"inputs": [],
"anonymous": false
},
{
"name": "SystemDisabled",
"type": "event",
"inputs": [],
"anonymous": false
},
{
"name": "SystemEnabled",
"type": "event",
"inputs": [],
"anonymous": false
},
{
"name": "TreasuryUpdated",
"type": "event",
"inputs": [
{
"name": "treasury",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "Unstaked",
"type": "event",
"inputs": [
{
"name": "staker",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "tokenId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "unstakedAt",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "BPS_DENOMINATOR",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "CYCLE_LENGTH",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "DAILY_WINDOW_END",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "DAILY_WINDOW_START",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "LOCK_DURATION",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "TOTAL_CAPACITY",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "acceptOwnership",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "airdropAmount",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "airdropEnabled",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "availableRewardBalance",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "canClaimAirdrop",
"type": "function",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "canClaimRefund",
"type": "function",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "canClaimReward",
"type": "function",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "canUnstake",
"type": "function",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "claimAirdrop",
"type": "function",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "claimRefund",
"type": "function",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "claimReward",
"type": "function",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "currentDailyCapacity",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "currentDayIndex",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "cycleStarted",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "depositRewardTokens",
"type": "function",
"inputs": [
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "disableAirdrop",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "disableRefund",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "disableRewardClaims",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "disableStaking",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "disableSystem",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "emergencyPaused",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "emergencyUnstake",
"type": "function",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "enableAirdrop",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "enableRefund",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "enableRewardClaims",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "enableStaking",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "enableSystem",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "finalizeNFTContract",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "finalizeRewardConfiguration",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "firstStakeDay",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "firstStakeTimestamp",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "getUserStakedTokens",
"type": "function",
"inputs": [
{
"name": "user",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256[]",
"internalType": "uint256[]"
}
],
"stateMutability": "view"
},
{
"name": "isStaked",
"type": "function",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "isStakingEnabled",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "isStakingWindowOpen",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "isSystemEnabled",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "nftContract",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "nftContractFinalized",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "onERC721Received",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
},
{
"name": "from",
"type": "address",
"internalType": "address"
},
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [
{
"name": "",
"type": "bytes4",
"internalType": "bytes4"
}
],
"stateMutability": "nonpayable"
},
{
"name": "owner",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "pauseEmergency",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "pendingOwner",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "recoverERC20",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "recoverERC721",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
},
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "refundAmount",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "refundEnabled",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "remainingLockTime",
"type": "function",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "remainingTodayCapacity",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "renounceOwnership",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "reservedRewardBalance",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "rewardAllocationBps",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "rewardAmount",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "rewardClaimsEnabled",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "rewardConfigFinalized",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "rewardToken",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "rewardTokenAddress",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "rewardTokenBalance",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "seasonComplete",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "setAirdropAmount",
"type": "function",
"inputs": [
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setNFTContract",
"type": "function",
"inputs": [
{
"name": "_nftContract",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setRefundAmount",
"type": "function",
"inputs": [
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setRewardAllocationBps",
"type": "function",
"inputs": [
{
"name": "bps",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setRewardAmount",
"type": "function",
"inputs": [
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setRewardToken",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setTreasury",
"type": "function",
"inputs": [
{
"name": "_treasury",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "stake",
"type": "function",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "stakeBatch",
"type": "function",
"inputs": [
{
"name": "tokenIds",
"type": "uint256[]",
"internalType": "uint256[]"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "stakeInfo",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "owner",
"type": "address",
"internalType": "address"
},
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "stakedAt",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "unlockTime",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "active",
"type": "bool",
"internalType": "bool"
},
{
"name": "refundClaimed",
"type": "bool",
"internalType": "bool"
},
{
"name": "airdropClaimed",
"type": "bool",
"internalType": "bool"
},
{
"name": "rewardClaimed",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "stakedPerDay",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "stakedToday",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "stakingEnabled",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "systemEnabled",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "totalAccepted",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "totalActiveStaked",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "totalAirdropClaimedAmount",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "totalRefundClaimedAmount",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "totalRewardClaimedAmount",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "totalRewardDeposited",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "totalRewardWithdrawnByOwner",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "totalStaked",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "transferOwnership",
"type": "function",
"inputs": [
{
"name": "newOwner",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "treasury",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "unlockTime",
"type": "function",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "unpauseEmergency",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "unstake",
"type": "function",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "withdrawNative",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "withdrawableTokenBalance",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"type": "receive",
"stateMutability": "payable"
}
]0x6080604052612328600a5534801562000016575f80fd5b50604051620058be380380620058be83398181016040528101906200003c919062000450565b805f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620000b0575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401620000a79190620004a6565b60405180910390fd5b620000c181620002c060201b60201c565b506001620000e4620000d8620002f860201b60201c565b6200032160201b60201c565b5f01819055505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000150576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620001b6576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060095f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600260156101000a81548160ff0219169083151502179055506001600260166101000a81548160ff0219169083151502179055505f600360146101000a81548160ff0219169083151502179055505f60055f6101000a81548160ff0219169083151502179055505f60075f6101000a81548160ff0219169083151502179055505050620004c1565b60015f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055620002f5816200032a60201b60201c565b50565b5f7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005f1b905090565b5f819050919050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6200041a82620003ef565b9050919050565b6200042c816200040e565b811462000437575f80fd5b50565b5f815190506200044a8162000421565b92915050565b5f8060408385031215620004695762000468620003eb565b5b5f62000478858286016200043a565b92505060206200048b858286016200043a565b9150509250929050565b620004a0816200040e565b82525050565b5f602082019050620004bb5f83018462000495565b92915050565b6153ef80620004cf5f395ff3fe608060405260043610610505575f3560e01c8063817b1cd211610296578063c160278011610164578063e30c3978116100cb578063f0f4426011610084578063f0f44260146112c1578063f2fde38b146112e9578063f7b2a7be14611311578063f7c618c11461133b578063fc22ad8914611365578063fc2ea8a51461138f5761050c565b8063e30c3978146111dd578063e30d444014611207578063e49d12321461122f578063e4dab02a14611259578063e71e687a1461126f578063eb27e9f1146112ab5761050c565b8063d4a79d941161011d578063d4a79d94146110e1578063d56d229d1461110b578063dbb8cc4614611135578063dc75ba891461115f578063e1a4521814611189578063e29a9370146111b35761050c565b8063c160278014610fc5578063c59ac41a14611001578063c61bd21414611029578063ca291b1314611065578063d01c972f146110a1578063d11aca62146110cb5761050c565b8063a5500c3011610208578063ae1a01a2116101c1578063ae1a01a214610ebb578063b246720b14610ef7578063b68ce9ca14610f21578063baa51f8614610f4b578063bc5efbdd14610f87578063c015cdf214610faf5761050c565b8063a5500c3014610dc9578063a694fc3a14610df1578063a7ccabdf14610e19578063a8a65a7814610e41578063ad33513f14610e69578063ae169a5014610e935761050c565b80638aee81271161025a5780638aee812714610ce35780638c742b0114610d0b5780638da5cb5b14610d215780639102ff1614610d4b57806392bb3d9514610d755780639bb1987914610d9f5761050c565b8063817b1cd214610c3d578063819d4cc614610c675780638980f11f14610c8f5780638997bf8c14610cb757806389e4234614610ccd5761050c565b80632fa718eb116103d35780635f98f41011610345578063715018a6116102fe578063715018a614610b7d57806371f59f3f14610b93578063748c4e1c14610ba957806375824f2314610bd357806379ba509714610bfd57806379d1390b14610c135761050c565b80635f98f41014610a9557806361d027b314610abf578063626d84c514610ae957806363d76aaa14610b135780636bd7d76614610b3d5780636d85538914610b535761050c565b80634c4a386f116103975780634c4a386f146109aa5780634e533572146109d457806350431ce414610a175780635b7baf6414610a2d5780635f57779414610a555780635f92d85e14610a7f5761050c565b80632fa718eb146108ec578063339190d1146109165780633e20a1051461092c578063443786f614610956578063485d3834146109805761050c565b806316cf463911610477578063230f436d11610430578063230f436d146107f6578063245a91a31461081e578063278943a71461085a57806327c830a91461088457806328696de2146108ae5780632e17de78146108c45761050c565b806316cf4639146106e85780631797c84c14610712578063183643af1461074e5780631b839625146107785780631cfff51b146107a257806320104289146107cc5761050c565b8063098370fb116104c9578063098370fb146105b85780630e3d1ffb146105e2578063125f9e331461061e578063150b7a0214610648578063166df0d11461068457806316c621e0146106c05761050c565b8063012ce50114610510578063015013471461053857806301b897951461054e578063077b69b21461057857806307f82e361461058e5761050c565b3661050c57005b5f80fd5b34801561051b575f80fd5b5061053660048036038101906105319190614c51565b6113b9565b005b348015610543575f80fd5b5061054c6113d5565b005b348015610559575f80fd5b50610562611424565b60405161056f9190614c8b565b60405180910390f35b348015610583575f80fd5b5061058c61142a565b005b348015610599575f80fd5b506105a2611501565b6040516105af9190614c8b565b60405180910390f35b3480156105c3575f80fd5b506105cc611539565b6040516105d99190614c8b565b60405180910390f35b3480156105ed575f80fd5b5061060860048036038101906106039190614cfe565b61154f565b6040516106159190614c8b565b60405180910390f35b348015610629575f80fd5b50610632611657565b60405161063f9190614d38565b60405180910390f35b348015610653575f80fd5b5061066e60048036038101906106699190614db2565b61167f565b60405161067b9190614e70565b60405180910390f35b34801561068f575f80fd5b506106aa60048036038101906106a59190614c51565b611733565b6040516106b79190614c8b565b60405180910390f35b3480156106cb575f80fd5b506106e660048036038101906106e19190614c51565b611748565b005b3480156106f3575f80fd5b506106fc6118d6565b6040516107099190614c8b565b60405180910390f35b34801561071d575f80fd5b5061073860048036038101906107339190614c51565b6118dc565b6040516107459190614c8b565b60405180910390f35b348015610759575f80fd5b506107626118f9565b60405161076f9190614c8b565b60405180910390f35b348015610783575f80fd5b5061078c6118ff565b6040516107999190614ea3565b60405180910390f35b3480156107ad575f80fd5b506107b6611915565b6040516107c39190614ea3565b60405180910390f35b3480156107d7575f80fd5b506107e0611928565b6040516107ed9190614ea3565b60405180910390f35b348015610801575f80fd5b5061081c60048036038101906108179190614f11565b61193a565b005b348015610829575f80fd5b50610844600480360381019061083f9190614c51565b611a84565b6040516108519190614ea3565b60405180910390f35b348015610865575f80fd5b5061086e611b67565b60405161087b9190614ea3565b60405180910390f35b34801561088f575f80fd5b50610898611b93565b6040516108a59190614ea3565b60405180910390f35b3480156108b9575f80fd5b506108c2611ba6565b005b3480156108cf575f80fd5b506108ea60048036038101906108e59190614c51565b611bf6565b005b3480156108f7575f80fd5b50610900611c12565b60405161090d9190614ea3565b60405180910390f35b348015610921575f80fd5b5061092a611c20565b005b348015610937575f80fd5b50610940611c70565b60405161094d9190614c8b565b60405180910390f35b348015610961575f80fd5b5061096a611c76565b6040516109779190614ea3565b60405180910390f35b34801561098b575f80fd5b50610994611c89565b6040516109a19190614c8b565b60405180910390f35b3480156109b5575f80fd5b506109be611c90565b6040516109cb9190614ea3565b60405180910390f35b3480156109df575f80fd5b506109fa60048036038101906109f59190614c51565b611ca2565b604051610a0e989796959493929190614f5c565b60405180910390f35b348015610a22575f80fd5b50610a2b611d38565b005b348015610a38575f80fd5b50610a536004803603810190610a4e9190614c51565b611ec0565b005b348015610a60575f80fd5b50610a696121f6565b604051610a769190614ea3565b60405180910390f35b348015610a8a575f80fd5b50610a93612209565b005b348015610aa0575f80fd5b50610aa9612258565b604051610ab69190614c8b565b60405180910390f35b348015610aca575f80fd5b50610ad361225e565b604051610ae09190614d38565b60405180910390f35b348015610af4575f80fd5b50610afd612283565b604051610b0a9190614c8b565b60405180910390f35b348015610b1e575f80fd5b50610b27612289565b604051610b349190614ea3565b60405180910390f35b348015610b48575f80fd5b50610b5161229c565b005b348015610b5e575f80fd5b50610b676122ec565b604051610b749190614ea3565b60405180910390f35b348015610b88575f80fd5b50610b916122f8565b005b348015610b9e575f80fd5b50610ba761230b565b005b348015610bb4575f80fd5b50610bbd61235c565b604051610bca9190614c8b565b60405180910390f35b348015610bde575f80fd5b50610be7612362565b604051610bf49190614c8b565b60405180910390f35b348015610c08575f80fd5b50610c1161245e565b005b348015610c1e575f80fd5b50610c276124ec565b604051610c349190614c8b565b60405180910390f35b348015610c48575f80fd5b50610c51612525565b604051610c5e9190614c8b565b60405180910390f35b348015610c72575f80fd5b50610c8d6004803603810190610c889190614fd8565b61252e565b005b348015610c9a575f80fd5b50610cb56004803603810190610cb09190614fd8565b6126e1565b005b348015610cc2575f80fd5b50610ccb61288d565b005b348015610cd8575f80fd5b50610ce1612963565b005b348015610cee575f80fd5b50610d096004803603810190610d049190614cfe565b612a39565b005b348015610d16575f80fd5b50610d1f612bb2565b005b348015610d2c575f80fd5b50610d35612c03565b604051610d429190614d38565b60405180910390f35b348015610d56575f80fd5b50610d5f612c2a565b604051610d6c9190614ea3565b60405180910390f35b348015610d80575f80fd5b50610d89612c3d565b604051610d969190614c8b565b60405180910390f35b348015610daa575f80fd5b50610db3612c43565b604051610dc09190614c8b565b60405180910390f35b348015610dd4575f80fd5b50610def6004803603810190610dea9190614c51565b612c49565b005b348015610dfc575f80fd5b50610e176004803603810190610e129190614c51565b612cd9565b005b348015610e24575f80fd5b50610e3f6004803603810190610e3a9190614cfe565b612d67565b005b348015610e4c575f80fd5b50610e676004803603810190610e629190614c51565b612ea1565b005b348015610e74575f80fd5b50610e7d612f31565b604051610e8a9190614c8b565b60405180910390f35b348015610e9e575f80fd5b50610eb96004803603810190610eb49190614c51565b612f37565b005b348015610ec6575f80fd5b50610ee16004803603810190610edc9190614cfe565b61326e565b604051610eee91906150cd565b60405180910390f35b348015610f02575f80fd5b50610f0b6132bc565b604051610f189190614c8b565b60405180910390f35b348015610f2c575f80fd5b50610f35613322565b604051610f429190614c8b565b60405180910390f35b348015610f56575f80fd5b50610f716004803603810190610f6c9190614c51565b613328565b604051610f7e9190614ea3565b60405180910390f35b348015610f92575f80fd5b50610fad6004803603810190610fa89190614c51565b613351565b005b348015610fba575f80fd5b50610fc36133e1565b005b348015610fd0575f80fd5b50610feb6004803603810190610fe69190614c51565b613432565b604051610ff89190614c8b565b60405180910390f35b34801561100c575f80fd5b5061102760048036038101906110229190614c51565b613470565b005b348015611034575f80fd5b5061104f600480360381019061104a9190614c51565b61353c565b60405161105c9190614ea3565b60405180910390f35b348015611070575f80fd5b5061108b60048036038101906110869190614c51565b61357a565b6040516110989190614ea3565b60405180910390f35b3480156110ac575f80fd5b506110b561365e565b6040516110c29190614c8b565b60405180910390f35b3480156110d6575f80fd5b506110df613664565b005b3480156110ec575f80fd5b506110f56136b5565b6040516111029190614c8b565b60405180910390f35b348015611116575f80fd5b5061111f6136d4565b60405161112c9190614d38565b60405180910390f35b348015611140575f80fd5b506111496136f9565b6040516111569190614c8b565b60405180910390f35b34801561116a575f80fd5b50611173613741565b6040516111809190614c8b565b60405180910390f35b348015611194575f80fd5b5061119d613746565b6040516111aa9190614c8b565b60405180910390f35b3480156111be575f80fd5b506111c761374c565b6040516111d49190614ea3565b60405180910390f35b3480156111e8575f80fd5b506111f1613762565b6040516111fe9190614d38565b60405180910390f35b348015611212575f80fd5b5061122d60048036038101906112289190614c51565b61378a565b005b34801561123a575f80fd5b50611243613ac0565b6040516112509190614c8b565b60405180910390f35b348015611264575f80fd5b5061126d613ac6565b005b34801561127a575f80fd5b5061129560048036038101906112909190614c51565b613b16565b6040516112a29190614ea3565b60405180910390f35b3480156112b6575f80fd5b506112bf613bf9565b005b3480156112cc575f80fd5b506112e760048036038101906112e29190614cfe565b613c82565b005b3480156112f4575f80fd5b5061130f600480360381019061130a9190614cfe565b613d75565b005b34801561131c575f80fd5b50611325613e21565b6040516113329190614c8b565b60405180910390f35b348015611346575f80fd5b5061134f613e27565b60405161135c9190614d38565b60405180910390f35b348015611370575f80fd5b50611379613e4c565b6040516113869190614c8b565b60405180910390f35b34801561139a575f80fd5b506113a3613e52565b6040516113b09190614c8b565b60405180910390f35b6113c1613e58565b6113ca81613e7a565b6113d26140fc565b50565b6113dd614116565b5f60055f6101000a81548160ff0219169083151502179055507fff1e263c4878232bfa9444e545e0835a44aca2d250bf39cb3e0ef23d0633257260405160405180910390a1565b60115481565b611432614116565b5f73ffffffffffffffffffffffffffffffffffffffff1660035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036114b8576040517f3c790c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600360146101000a81548160ff0219169083151502179055507ff3bc8c2dc7b932ef949bb73a1f42c82ee8ccf4b2175327d737c4c24f1c5d70a060405160405180910390a1565b5f8061150b612362565b90505f6115166132bc565b9050808211611525575f611532565b8082611531919061511a565b5b9250505090565b5f61154a6115456136f9565b61419d565b905090565b5f808273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161158a9190614d38565b602060405180830381865afa1580156115a5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115c99190615161565b905060035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361164d575f6116286132bc565b9050808211611637575f611644565b8082611643919061511a565b5b92505050611652565b809150505b919050565b5f60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f611688613e58565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461170e576040517f0f3e2a3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6117188585614204565b63150b7a0260e01b905061172a6140fc565b95945050505050565b600d602052805f5260405f205f915090505481565b611750614116565b611758613e58565b5f73ffffffffffffffffffffffffffffffffffffffff1660035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036117de576040517f3c790c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8103611817576040517f2c5211c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61186533308360035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166146d6909392919063ffffffff16565b8060125f828254611876919061518c565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167f9c6602842332d6edcad29df59103eb6576ed628c7b926ad150fa4759713ac503826040516118c39190614c8b565b60405180910390a26118d36140fc565b50565b60135481565b5f600e5f8381526020019081526020015f20600301549050919050565b600b5481565b5f600260159054906101000a900460ff16905090565b600260169054906101000a900460ff1681565b60075f9054906101000a900460ff1681565b5f8282905090505f810361197a576040517fc2e5347d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113888160115461198b919061518c565b11156119c3576040517f8d87d3c000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b81811015611a7e5760025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3330878786818110611a1f57611a1e6151bf565b5b905060200201356040518463ffffffff1660e01b8152600401611a44939291906151ec565b5f604051808303815f87803b158015611a5b575f80fd5b505af1158015611a6d573d5f803e3d5ffd5b5050505080806001019150506119c5565b50505050565b5f80600e5f8481526020019081526020015f2090505f816002015414158015611abc57508060040160019054906101000a900460ff16155b8015611ad3575060055f9054906101000a900460ff165b8015611b2c57505f73ffffffffffffffffffffffffffffffffffffffff1660035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b8015611b3a57505f60065414155b8015611b4a575080600301544210155b8015611b5f5750600654611b5c612362565b10155b915050919050565b5f806201518042611b78919061524e565b905061c4e08110158015611b8d575061fd2081105b91505090565b600260179054906101000a900460ff1681565b611bae614116565b5f600260166101000a81548160ff0219169083151502179055507f87c5d02a8532f2e8b0b2711e3342ad707d69ce84d6276cbd8741d777dd67204260405160405180910390a1565b611bfe613e58565b611c0781613e7a565b611c0f6140fc565b50565b5f6113886011541015905090565b611c28614116565b5f600260156101000a81548160ff0219169083151502179055507f30b0f66ec85bbf7cd2e223a96ce7bcbed02d305c13e4c23422d9719905de43d260405160405180910390a1565b60155481565b600360149054906101000a900460ff1681565b6206978081565b60055f9054906101000a900460ff1681565b600e602052805f5260405f205f91509050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690806001015490806002015490806003015490806004015f9054906101000a900460ff16908060040160019054906101000a900460ff16908060040160029054906101000a900460ff16908060040160039054906101000a900460ff16905088565b611d40614116565b611d48613e58565b5f4790505f8103611d85576040517faba3a54800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051611dcb906152ab565b5f6040518083038185875af1925050503d805f8114611e05576040519150601f19603f3d011682016040523d82523d5f602084013e611e0a565b606091505b5050905080611e45576040517ff4b3b1bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f0eb972d5a9323f2aaeac828ea0c866d9844c9532e252b4ea78b3639e1d337b0683604051611eac9190614c8b565b60405180910390a25050611ebe6140fc565b565b611ec8613e58565b5f600e5f8381526020019081526020015f2090505f816002015403611f19576040517f039f2e1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611fa0576040517f59cc8a2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060030154421015611fde576040517fc201b25200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055f9054906101000a900460ff16158061204557505f73ffffffffffffffffffffffffffffffffffffffff1660035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b8061205157505f600654145b15612088576040517f0b4d698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060040160019054906101000a900460ff16156120d1576040517f7697c5dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006546120dc612362565b1015612114576040517ff16eeebd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018160040160016101000a81548160ff02191690831515021790555060065460145f828254612144919061518c565b925050819055506121993360065460035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661472b9092919063ffffffff16565b813373ffffffffffffffffffffffffffffffffffffffff167f17c1d890f3ffba4991a771a0b55802a1eff3159d0cce950fb68d1360530393d96006546040516121e29190614c8b565b60405180910390a3506121f36140fc565b50565b600260149054906101000a900460ff1681565b612211614116565b5f60075f6101000a81548160ff0219169083151502179055507f200837fed758f962db406f2ba2a9d31b7bd77e6dfaf82347b1cf69e48511387a60405160405180910390a1565b60125481565b60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61138881565b600960149054906101000a900460ff1681565b6122a4614116565b5f600260176101000a81548160ff0219169083151502179055507f15de7ad89d29fd1c6d2e6b1e878453569b4080edf34e0105faaa3bd52f01853060405160405180910390a1565b5f80600b541415905090565b612300614116565b6123095f61477e565b565b612313614116565b6001600960146101000a81548160ff0219169083151502179055507f2a2c7e43fc69afe00561c0bde0caec6cb74f7d07a053d139f4eab0c22482f0bf60405160405180910390a1565b61fd2081565b5f8073ffffffffffffffffffffffffffffffffffffffff1660035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036123bf575f905061245b565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016124199190614d38565b602060405180830381865afa158015612434573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124589190615161565b90505b90565b5f6124676147ae565b90508073ffffffffffffffffffffffffffffffffffffffff16612488613762565b73ffffffffffffffffffffffffffffffffffffffff16146124e057806040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016124d79190614d38565b60405180910390fd5b6124e98161477e565b50565b5f806124f6611539565b90505f6125016136b5565b90508181101561251c578082612517919061511a565b61251e565b5f5b9250505090565b5f601054905090565b612536614116565b61253e613e58565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036125c4576040517f36c22a1b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166342842e0e3060095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518463ffffffff1660e01b8152600401612622939291906151ec565b5f604051808303815f87803b158015612639575f80fd5b505af115801561264b573d5f803e3d5ffd5b5050505060095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f6a30e6784464f0d1f4158aa4cb65ae9239b0fa87c7f2c083ee6dde44ba97b5e6836040516126cd9190614c8b565b60405180910390a36126dd6140fc565b5050565b6126e9614116565b6126f1613e58565b5f6126fb8361154f565b90505f82148061270a57508082115b15612741576040517f1d3fe4d000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61278d60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16838573ffffffffffffffffffffffffffffffffffffffff1661472b9092919063ffffffff16565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036127fa578160165f8282546127f2919061518c565b925050819055505b60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167faca8fb252cde442184e5f10e0f2e6e4029e8cd7717cae63559079610702436aa846040516128789190614c8b565b60405180910390a3506128896140fc565b5050565b612895614116565b5f73ffffffffffffffffffffffffffffffffffffffff1660035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361291b576040517f1202be6e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600160075f6101000a81548160ff0219169083151502179055507f17d8924d4c27b772e5d7a4a87c22224509a14031bf9037f05e81d154150b809560405160405180910390a1565b61296b614116565b5f73ffffffffffffffffffffffffffffffffffffffff1660035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036129f1576040517f0b4d698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600160055f6101000a81548160ff0219169083151502179055507fce508ce5e3eb0fc171e7a5659a631d9d896cde4dcd790fac6d90477c241bb62060405160405180910390a1565b612a41614116565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612aa6576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612b2c576040517fc1ab6dc100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060035f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167fa5289ba11778999f4dfb9415023783188d42bbb5db0612cbfbe55999069612a060405160405180910390a250565b612bba614116565b6001600260176101000a81548160ff0219169083151502179055507f4cb3183d0bf66f9634b15cfc3539fdddc96c2c9324848af89b56586a6739fec460405160405180910390a1565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600260159054906101000a900460ff1681565b600a5481565b60165481565b612c51614116565b600960149054906101000a900460ff1615612c98576040517f8462039900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806008819055507f26c76ed9d3ad7d6dc5354f3a22e0b8f3a55d756f2bf361343546921967940bca81604051612cce9190614c8b565b60405180910390a150565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3330846040518463ffffffff1660e01b8152600401612d37939291906151ec565b5f604051808303815f87803b158015612d4e575f80fd5b505af1158015612d60573d5f803e3d5ffd5b5050505050565b612d6f614116565b600260149054906101000a900460ff1615612db6576040517f45b5256400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612e1b576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167ff2610996d245d9b77e4ff84c2174eea0b76fb44c422218404f66e28816d78fb960405160405180910390a250565b612ea9614116565b600960149054906101000a900460ff1615612ef0576040517f8462039900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806004819055507f9639dea65e74b72b1b86ccf3e4f9b6d23b88d2aad2f103d0b3afe394e67edade81604051612f269190614c8b565b60405180910390a150565b60065481565b612f3f613e58565b5f600e5f8381526020019081526020015f2090505f816002015403612f90576040517f039f2e1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613017576040517f59cc8a2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060030154421015613055576040517fc201b25200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600360149054906101000a900460ff1615806130bd57505f73ffffffffffffffffffffffffffffffffffffffff1660035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b806130c957505f600454145b15613100576040517f3c790c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060040160039054906101000a900460ff1615613149576040517fb3f8c0dc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600454613154612362565b101561318c576040517ff16eeebd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018160040160036101000a81548160ff02191690831515021790555060045460135f8282546131bc919061518c565b925050819055506132113360045460035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661472b9092919063ffffffff16565b813373ffffffffffffffffffffffffffffffffffffffff167ff01da32686223933d8a18a391060918c7f11a3648639edd87ae013e2e273174360045460405161325a9190614c8b565b60405180910390a35061326b6140fc565b50565b60606132b5600f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206147b5565b9050919050565b5f80612710600a546012546132d191906152bf565b6132db9190615300565b90505f6015546014546013546132f1919061518c565b6132fb919061518c565b905081811061330e575f9250505061331f565b808261331a919061511a565b925050505b90565b600c5481565b5f600e5f8381526020019081526020015f206004015f9054906101000a900460ff169050919050565b613359614116565b600960149054906101000a900460ff16156133a0576040517f8462039900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806006819055507fe1fe6a60c340ae6e0ea99e7570c23093d0427b99d6903df1ff08b91973cecdac816040516133d69190614c8b565b60405180910390a150565b6133e9614116565b6001600260156101000a81548160ff0219169083151502179055507fb35ea70b2d2c926fe5e1f19b179f80211b1b0a05ae3767ef60fdc8c3ef91630860405160405180910390a1565b5f80600e5f8481526020019081526020015f2060030154905042811161345b575f91505061346b565b4281613467919061511a565b9150505b919050565b613478614116565b600960149054906101000a900460ff16156134bf576040517f8462039900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127108111156134fb576040517fc6cc5d7f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600a819055507f3a2c997ec19af74413e8606c2626cf8a7ab1a98983c76528f4714dd795b7c832816040516135319190614c8b565b60405180910390a150565b5f80600e5f8481526020019081526020015f209050806004015f9054906101000a900460ff168015613572575080600301544210155b915050919050565b5f80600e5f8481526020019081526020015f2090505f8160020154141580156135b257508060040160039054906101000a900460ff16155b80156135ca5750600360149054906101000a900460ff165b801561362357505f73ffffffffffffffffffffffffffffffffffffffff1660035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b801561363157505f60045414155b8015613641575080600301544210155b80156136565750600454613653612362565b10155b915050919050565b60145481565b61366c614116565b6001600260166101000a81548160ff0219169083151502179055507fda917aeab736a19e4ba54207413dbe4f8c7d558fde2c14d7e66fc8f7186ea8a360405160405180910390a1565b5f600d5f6136c16136f9565b81526020019081526020015f2054905090565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f6137026122ec565b61370e575f905061373e565b5f6137176147d4565b9050600c5481101561372c575f91505061373e565b600c548161373a919061511a565b9150505b90565b600581565b61271081565b5f600260169054906101000a900460ff16905090565b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b613792613e58565b5f600e5f8381526020019081526020015f2090505f8160020154036137e3576040517f039f2e1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461386a576040517f59cc8a2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600301544210156138a8576040517fc201b25200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075f9054906101000a900460ff16158061390f57505f73ffffffffffffffffffffffffffffffffffffffff1660035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b8061391b57505f600854145b15613952576040517f1202be6e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060040160029054906101000a900460ff161561399b576040517fe4ca4c0b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6008546139a6612362565b10156139de576040517ff16eeebd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018160040160026101000a81548160ff02191690831515021790555060085460155f828254613a0e919061518c565b92505081905550613a633360085460035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661472b9092919063ffffffff16565b813373ffffffffffffffffffffffffffffffffffffffff167fd0755a9ef5a74f50d34b3503bb5b65ad71a112c001b76dfa6412c9aa4a1f43b0600854604051613aac9190614c8b565b60405180910390a350613abd6140fc565b50565b60105481565b613ace614116565b5f600360146101000a81548160ff0219169083151502179055507f3d192848706fa54f72c25925a575a7f6089f72d52d001daf54772608fb8113ec60405160405180910390a1565b5f80600e5f8481526020019081526020015f2090505f816002015414158015613b4e57508060040160029054906101000a900460ff16155b8015613b65575060075f9054906101000a900460ff165b8015613bbe57505f73ffffffffffffffffffffffffffffffffffffffff1660035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b8015613bcc57505f60085414155b8015613bdc575080600301544210155b8015613bf15750600854613bee612362565b10155b915050919050565b613c01614116565b6001600260146101000a81548160ff02191690831515021790555060025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fb2847b35f1ad8a255853ea4cd82d0ccba5de725ec8f1fa06aa97a7419907e0db60405160405180910390a2565b613c8a614116565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613cef576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060095f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167f7dae230f18360d76a040c81f050aa14eb9d6dc7901b20fc5d855e2a20fe814d160405160405180910390a250565b613d7d614116565b8060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16613ddc612c03565b73ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b60045481565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61c4e081565b60085481565b613e606147e9565b6002613e72613e6d61482a565b614853565b5f0181905550565b5f600e5f8381526020019081526020015f209050806004015f9054906101000a900460ff16613ed5576040517f039f2e1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613f5c576040517f59cc8a2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060030154421015613f9a576040517fc201b25200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f816004015f6101000a81548160ff021916908315150217905550600160105f828254613fc7919061511a565b9250508190555061401d82600f5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061485c90919063ffffffff16565b5060025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3033856040518463ffffffff1660e01b815260040161407c939291906151ec565b5f604051808303815f87803b158015614093575f80fd5b505af11580156140a5573d5f803e3d5ffd5b50505050813373ffffffffffffffffffffffffffffffffffffffff167f7fc4727e062e336010f2c282598ef5f14facb3de68cf8195c2f23e1454b2b74e426040516140f09190614c8b565b60405180910390a35050565b600161410e61410961482a565b614853565b5f0181905550565b61411e6147ae565b73ffffffffffffffffffffffffffffffffffffffff1661413c612c03565b73ffffffffffffffffffffffffffffffffffffffff161461419b5761415f6147ae565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016141929190614d38565b60405180910390fd5b565b5f806005836141ac919061524e565b90505f81036141bf5760fa9150506141ff565b600181036141d2576101f49150506141ff565b600281036141e5576102ee9150506141ff565b600381036141f8576103e89150506141ff565b6107d09150505b919050565b600260159054906101000a900460ff1661424a576040517fdddbccf700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260169054906101000a900460ff16614290576040517f7a55278300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260179054906101000a900460ff16156142d7576040517f676c011400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6142df611b67565b614315576040517f84107a8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e5f8281526020019081526020015f206004015f9054906101000a900460ff161561436d576040517f0ae3514d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388601154106143aa576040517f8d87d3c000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6143b36122ec565b6144115742600b819055506143c66147d4565b600c819055505f90507f5eb0cc15e4168ed065eb4cc71a6ac924503f86ce3488cfd3a6fc86ceb81eba33600b54600c54604051614404929190615330565b60405180910390a161441c565b6144196136f9565b90505b5f6144268261419d565b905080600d5f8481526020019081526020015f205410614472576040517f3d67d45700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600d5f8481526020019081526020015f205f828254614493919061518c565b92505081905550600160115f8282546144ac919061518c565b92505081905550600160105f8282546144c5919061518c565b925050819055505f62069780426144dc919061518c565b90506040518061010001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020014281526020018281526020016001151581526020015f151581526020015f151581526020015f1515815250600e5f8681526020019081526020015f205f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015f6101000a81548160ff02191690831515021790555060a08201518160040160016101000a81548160ff02191690831515021790555060c08201518160040160026101000a81548160ff02191690831515021790555060e08201518160040160036101000a81548160ff02191690831515021790555090505061467b84600f5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061487390919063ffffffff16565b50838573ffffffffffffffffffffffffffffffffffffffff167f9cfd25589d1eb8ad71e342a86a8524e83522e3936c0803048c08f6d9ad974f404284876040516146c793929190615357565b60405180910390a35050505050565b6146e484848484600161488a565b61472557836040517f5274afe700000000000000000000000000000000000000000000000000000000815260040161471c9190614d38565b60405180910390fd5b50505050565b61473883838360016148fb565b61477957826040517f5274afe70000000000000000000000000000000000000000000000000000000081526004016147709190614d38565b60405180910390fd5b505050565b60015f6101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556147ab8161495d565b50565b5f33905090565b60605f6147c3835f01614a1e565b905060608190508092505050919050565b5f62015180426147e49190615300565b905090565b6147f1614a77565b15614828576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005f1b905090565b5f819050919050565b5f61486b835f01835f1b614a93565b905092915050565b5f614882835f01835f1b614b8f565b905092915050565b5f806323b872dd60e01b9050604051815f525f1960601c87166004525f1960601c86166024528460445260205f60645f808c5af1925060015f511483166148e85783831516156148dc573d5f823e3d81fd5b5f883b113d1516831692505b806040525f606052505095945050505050565b5f8063a9059cbb60e01b9050604051815f525f1960601c86166004528460245260205f60445f808b5af1925060015f5114831661494f578383151615614943573d5f823e3d81fd5b5f873b113d1516831692505b806040525050949350505050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6060815f01805480602002602001604051908101604052809291908181526020018280548015614a6b57602002820191905f5260205f20905b815481526020019060010190808311614a57575b50505050509050919050565b5f6002614a8a614a8561482a565b614853565b5f015414905090565b5f80836001015f8481526020019081526020015f205490505f8114614b84575f600182614ac0919061511a565b90505f6001865f0180549050614ad6919061511a565b9050808214614b3c575f865f018281548110614af557614af46151bf565b5b905f5260205f200154905080875f018481548110614b1657614b156151bf565b5b905f5260205f20018190555083876001015f8381526020019081526020015f2081905550505b855f01805480614b4f57614b4e61538c565b5b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050614b89565b5f9150505b92915050565b5f614b9a8383614bf6565b614bec57825f0182908060018154018082558091505060019003905f5260205f20015f9091909190915055825f0180549050836001015f8481526020019081526020015f208190555060019050614bf0565b5f90505b92915050565b5f80836001015f8481526020019081526020015f20541415905092915050565b5f80fd5b5f80fd5b5f819050919050565b614c3081614c1e565b8114614c3a575f80fd5b50565b5f81359050614c4b81614c27565b92915050565b5f60208284031215614c6657614c65614c16565b5b5f614c7384828501614c3d565b91505092915050565b614c8581614c1e565b82525050565b5f602082019050614c9e5f830184614c7c565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f614ccd82614ca4565b9050919050565b614cdd81614cc3565b8114614ce7575f80fd5b50565b5f81359050614cf881614cd4565b92915050565b5f60208284031215614d1357614d12614c16565b5b5f614d2084828501614cea565b91505092915050565b614d3281614cc3565b82525050565b5f602082019050614d4b5f830184614d29565b92915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f840112614d7257614d71614d51565b5b8235905067ffffffffffffffff811115614d8f57614d8e614d55565b5b602083019150836001820283011115614dab57614daa614d59565b5b9250929050565b5f805f805f60808688031215614dcb57614dca614c16565b5b5f614dd888828901614cea565b9550506020614de988828901614cea565b9450506040614dfa88828901614c3d565b935050606086013567ffffffffffffffff811115614e1b57614e1a614c1a565b5b614e2788828901614d5d565b92509250509295509295909350565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b614e6a81614e36565b82525050565b5f602082019050614e835f830184614e61565b92915050565b5f8115159050919050565b614e9d81614e89565b82525050565b5f602082019050614eb65f830184614e94565b92915050565b5f8083601f840112614ed157614ed0614d51565b5b8235905067ffffffffffffffff811115614eee57614eed614d55565b5b602083019150836020820283011115614f0a57614f09614d59565b5b9250929050565b5f8060208385031215614f2757614f26614c16565b5b5f83013567ffffffffffffffff811115614f4457614f43614c1a565b5b614f5085828601614ebc565b92509250509250929050565b5f61010082019050614f705f83018b614d29565b614f7d602083018a614c7c565b614f8a6040830189614c7c565b614f976060830188614c7c565b614fa46080830187614e94565b614fb160a0830186614e94565b614fbe60c0830185614e94565b614fcb60e0830184614e94565b9998505050505050505050565b5f8060408385031215614fee57614fed614c16565b5b5f614ffb85828601614cea565b925050602061500c85828601614c3d565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61504881614c1e565b82525050565b5f615059838361503f565b60208301905092915050565b5f602082019050919050565b5f61507b82615016565b6150858185615020565b935061509083615030565b805f5b838110156150c05781516150a7888261504e565b97506150b283615065565b925050600181019050615093565b5085935050505092915050565b5f6020820190508181035f8301526150e58184615071565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61512482614c1e565b915061512f83614c1e565b9250828203905081811115615147576151466150ed565b5b92915050565b5f8151905061515b81614c27565b92915050565b5f6020828403121561517657615175614c16565b5b5f6151838482850161514d565b91505092915050565b5f61519682614c1e565b91506151a183614c1e565b92508282019050808211156151b9576151b86150ed565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6060820190506151ff5f830186614d29565b61520c6020830185614d29565b6152196040830184614c7c565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61525882614c1e565b915061526383614c1e565b92508261527357615272615221565b5b828206905092915050565b5f81905092915050565b50565b5f6152965f8361527e565b91506152a182615288565b5f82019050919050565b5f6152b58261528b565b9150819050919050565b5f6152c982614c1e565b91506152d483614c1e565b92508282026152e281614c1e565b915082820484148315176152f9576152f86150ed565b5b5092915050565b5f61530a82614c1e565b915061531583614c1e565b92508261532557615324615221565b5b828204905092915050565b5f6040820190506153435f830185614c7c565b6153506020830184614c7c565b9392505050565b5f60608201905061536a5f830186614c7c565b6153776020830185614c7c565b6153846040830184614c7c565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea26469706673582212208778bf2de6d7d97a22800fa41b912c9fcbe97a15183526556ae087f1647d888b64736f6c6343000818003300000000000000000000000066007297055229066d86294a18edb6e1a2db32d70000000000000000000000006a5fd4981a675141795e8bbe611112ef3a46e7e3
0x608060405260043610610505575f3560e01c8063817b1cd211610296578063c160278011610164578063e30c3978116100cb578063f0f4426011610084578063f0f44260146112c1578063f2fde38b146112e9578063f7b2a7be14611311578063f7c618c11461133b578063fc22ad8914611365578063fc2ea8a51461138f5761050c565b8063e30c3978146111dd578063e30d444014611207578063e49d12321461122f578063e4dab02a14611259578063e71e687a1461126f578063eb27e9f1146112ab5761050c565b8063d4a79d941161011d578063d4a79d94146110e1578063d56d229d1461110b578063dbb8cc4614611135578063dc75ba891461115f578063e1a4521814611189578063e29a9370146111b35761050c565b8063c160278014610fc5578063c59ac41a14611001578063c61bd21414611029578063ca291b1314611065578063d01c972f146110a1578063d11aca62146110cb5761050c565b8063a5500c3011610208578063ae1a01a2116101c1578063ae1a01a214610ebb578063b246720b14610ef7578063b68ce9ca14610f21578063baa51f8614610f4b578063bc5efbdd14610f87578063c015cdf214610faf5761050c565b8063a5500c3014610dc9578063a694fc3a14610df1578063a7ccabdf14610e19578063a8a65a7814610e41578063ad33513f14610e69578063ae169a5014610e935761050c565b80638aee81271161025a5780638aee812714610ce35780638c742b0114610d0b5780638da5cb5b14610d215780639102ff1614610d4b57806392bb3d9514610d755780639bb1987914610d9f5761050c565b8063817b1cd214610c3d578063819d4cc614610c675780638980f11f14610c8f5780638997bf8c14610cb757806389e4234614610ccd5761050c565b80632fa718eb116103d35780635f98f41011610345578063715018a6116102fe578063715018a614610b7d57806371f59f3f14610b93578063748c4e1c14610ba957806375824f2314610bd357806379ba509714610bfd57806379d1390b14610c135761050c565b80635f98f41014610a9557806361d027b314610abf578063626d84c514610ae957806363d76aaa14610b135780636bd7d76614610b3d5780636d85538914610b535761050c565b80634c4a386f116103975780634c4a386f146109aa5780634e533572146109d457806350431ce414610a175780635b7baf6414610a2d5780635f57779414610a555780635f92d85e14610a7f5761050c565b80632fa718eb146108ec578063339190d1146109165780633e20a1051461092c578063443786f614610956578063485d3834146109805761050c565b806316cf463911610477578063230f436d11610430578063230f436d146107f6578063245a91a31461081e578063278943a71461085a57806327c830a91461088457806328696de2146108ae5780632e17de78146108c45761050c565b806316cf4639146106e85780631797c84c14610712578063183643af1461074e5780631b839625146107785780631cfff51b146107a257806320104289146107cc5761050c565b8063098370fb116104c9578063098370fb146105b85780630e3d1ffb146105e2578063125f9e331461061e578063150b7a0214610648578063166df0d11461068457806316c621e0146106c05761050c565b8063012ce50114610510578063015013471461053857806301b897951461054e578063077b69b21461057857806307f82e361461058e5761050c565b3661050c57005b5f80fd5b34801561051b575f80fd5b5061053660048036038101906105319190614c51565b6113b9565b005b348015610543575f80fd5b5061054c6113d5565b005b348015610559575f80fd5b50610562611424565b60405161056f9190614c8b565b60405180910390f35b348015610583575f80fd5b5061058c61142a565b005b348015610599575f80fd5b506105a2611501565b6040516105af9190614c8b565b60405180910390f35b3480156105c3575f80fd5b506105cc611539565b6040516105d99190614c8b565b60405180910390f35b3480156105ed575f80fd5b5061060860048036038101906106039190614cfe565b61154f565b6040516106159190614c8b565b60405180910390f35b348015610629575f80fd5b50610632611657565b60405161063f9190614d38565b60405180910390f35b348015610653575f80fd5b5061066e60048036038101906106699190614db2565b61167f565b60405161067b9190614e70565b60405180910390f35b34801561068f575f80fd5b506106aa60048036038101906106a59190614c51565b611733565b6040516106b79190614c8b565b60405180910390f35b3480156106cb575f80fd5b506106e660048036038101906106e19190614c51565b611748565b005b3480156106f3575f80fd5b506106fc6118d6565b6040516107099190614c8b565b60405180910390f35b34801561071d575f80fd5b5061073860048036038101906107339190614c51565b6118dc565b6040516107459190614c8b565b60405180910390f35b348015610759575f80fd5b506107626118f9565b60405161076f9190614c8b565b60405180910390f35b348015610783575f80fd5b5061078c6118ff565b6040516107999190614ea3565b60405180910390f35b3480156107ad575f80fd5b506107b6611915565b6040516107c39190614ea3565b60405180910390f35b3480156107d7575f80fd5b506107e0611928565b6040516107ed9190614ea3565b60405180910390f35b348015610801575f80fd5b5061081c60048036038101906108179190614f11565b61193a565b005b348015610829575f80fd5b50610844600480360381019061083f9190614c51565b611a84565b6040516108519190614ea3565b60405180910390f35b348015610865575f80fd5b5061086e611b67565b60405161087b9190614ea3565b60405180910390f35b34801561088f575f80fd5b50610898611b93565b6040516108a59190614ea3565b60405180910390f35b3480156108b9575f80fd5b506108c2611ba6565b005b3480156108cf575f80fd5b506108ea60048036038101906108e59190614c51565b611bf6565b005b3480156108f7575f80fd5b50610900611c12565b60405161090d9190614ea3565b60405180910390f35b348015610921575f80fd5b5061092a611c20565b005b348015610937575f80fd5b50610940611c70565b60405161094d9190614c8b565b60405180910390f35b348015610961575f80fd5b5061096a611c76565b6040516109779190614ea3565b60405180910390f35b34801561098b575f80fd5b50610994611c89565b6040516109a19190614c8b565b60405180910390f35b3480156109b5575f80fd5b506109be611c90565b6040516109cb9190614ea3565b60405180910390f35b3480156109df575f80fd5b506109fa60048036038101906109f59190614c51565b611ca2565b604051610a0e989796959493929190614f5c565b60405180910390f35b348015610a22575f80fd5b50610a2b611d38565b005b348015610a38575f80fd5b50610a536004803603810190610a4e9190614c51565b611ec0565b005b348015610a60575f80fd5b50610a696121f6565b604051610a769190614ea3565b60405180910390f35b348015610a8a575f80fd5b50610a93612209565b005b348015610aa0575f80fd5b50610aa9612258565b604051610ab69190614c8b565b60405180910390f35b348015610aca575f80fd5b50610ad361225e565b604051610ae09190614d38565b60405180910390f35b348015610af4575f80fd5b50610afd612283565b604051610b0a9190614c8b565b60405180910390f35b348015610b1e575f80fd5b50610b27612289565b604051610b349190614ea3565b60405180910390f35b348015610b48575f80fd5b50610b5161229c565b005b348015610b5e575f80fd5b50610b676122ec565b604051610b749190614ea3565b60405180910390f35b348015610b88575f80fd5b50610b916122f8565b005b348015610b9e575f80fd5b50610ba761230b565b005b348015610bb4575f80fd5b50610bbd61235c565b604051610bca9190614c8b565b60405180910390f35b348015610bde575f80fd5b50610be7612362565b604051610bf49190614c8b565b60405180910390f35b348015610c08575f80fd5b50610c1161245e565b005b348015610c1e575f80fd5b50610c276124ec565b604051610c349190614c8b565b60405180910390f35b348015610c48575f80fd5b50610c51612525565b604051610c5e9190614c8b565b60405180910390f35b348015610c72575f80fd5b50610c8d6004803603810190610c889190614fd8565b61252e565b005b348015610c9a575f80fd5b50610cb56004803603810190610cb09190614fd8565b6126e1565b005b348015610cc2575f80fd5b50610ccb61288d565b005b348015610cd8575f80fd5b50610ce1612963565b005b348015610cee575f80fd5b50610d096004803603810190610d049190614cfe565b612a39565b005b348015610d16575f80fd5b50610d1f612bb2565b005b348015610d2c575f80fd5b50610d35612c03565b604051610d429190614d38565b60405180910390f35b348015610d56575f80fd5b50610d5f612c2a565b604051610d6c9190614ea3565b60405180910390f35b348015610d80575f80fd5b50610d89612c3d565b604051610d969190614c8b565b60405180910390f35b348015610daa575f80fd5b50610db3612c43565b604051610dc09190614c8b565b60405180910390f35b348015610dd4575f80fd5b50610def6004803603810190610dea9190614c51565b612c49565b005b348015610dfc575f80fd5b50610e176004803603810190610e129190614c51565b612cd9565b005b348015610e24575f80fd5b50610e3f6004803603810190610e3a9190614cfe565b612d67565b005b348015610e4c575f80fd5b50610e676004803603810190610e629190614c51565b612ea1565b005b348015610e74575f80fd5b50610e7d612f31565b604051610e8a9190614c8b565b60405180910390f35b348015610e9e575f80fd5b50610eb96004803603810190610eb49190614c51565b612f37565b005b348015610ec6575f80fd5b50610ee16004803603810190610edc9190614cfe565b61326e565b604051610eee91906150cd565b60405180910390f35b348015610f02575f80fd5b50610f0b6132bc565b604051610f189190614c8b565b60405180910390f35b348015610f2c575f80fd5b50610f35613322565b604051610f429190614c8b565b60405180910390f35b348015610f56575f80fd5b50610f716004803603810190610f6c9190614c51565b613328565b604051610f7e9190614ea3565b60405180910390f35b348015610f92575f80fd5b50610fad6004803603810190610fa89190614c51565b613351565b005b348015610fba575f80fd5b50610fc36133e1565b005b348015610fd0575f80fd5b50610feb6004803603810190610fe69190614c51565b613432565b604051610ff89190614c8b565b60405180910390f35b34801561100c575f80fd5b5061102760048036038101906110229190614c51565b613470565b005b348015611034575f80fd5b5061104f600480360381019061104a9190614c51565b61353c565b60405161105c9190614ea3565b60405180910390f35b348015611070575f80fd5b5061108b60048036038101906110869190614c51565b61357a565b6040516110989190614ea3565b60405180910390f35b3480156110ac575f80fd5b506110b561365e565b6040516110c29190614c8b565b60405180910390f35b3480156110d6575f80fd5b506110df613664565b005b3480156110ec575f80fd5b506110f56136b5565b6040516111029190614c8b565b60405180910390f35b348015611116575f80fd5b5061111f6136d4565b60405161112c9190614d38565b60405180910390f35b348015611140575f80fd5b506111496136f9565b6040516111569190614c8b565b60405180910390f35b34801561116a575f80fd5b50611173613741565b6040516111809190614c8b565b60405180910390f35b348015611194575f80fd5b5061119d613746565b6040516111aa9190614c8b565b60405180910390f35b3480156111be575f80fd5b506111c761374c565b6040516111d49190614ea3565b60405180910390f35b3480156111e8575f80fd5b506111f1613762565b6040516111fe9190614d38565b60405180910390f35b348015611212575f80fd5b5061122d60048036038101906112289190614c51565b61378a565b005b34801561123a575f80fd5b50611243613ac0565b6040516112509190614c8b565b60405180910390f35b348015611264575f80fd5b5061126d613ac6565b005b34801561127a575f80fd5b5061129560048036038101906112909190614c51565b613b16565b6040516112a29190614ea3565b60405180910390f35b3480156112b6575f80fd5b506112bf613bf9565b005b3480156112cc575f80fd5b506112e760048036038101906112e29190614cfe565b613c82565b005b3480156112f4575f80fd5b5061130f600480360381019061130a9190614cfe565b613d75565b005b34801561131c575f80fd5b50611325613e21565b6040516113329190614c8b565b60405180910390f35b348015611346575f80fd5b5061134f613e27565b60405161135c9190614d38565b60405180910390f35b348015611370575f80fd5b50611379613e4c565b6040516113869190614c8b565b60405180910390f35b34801561139a575f80fd5b506113a3613e52565b6040516113b09190614c8b565b60405180910390f35b6113c1613e58565b6113ca81613e7a565b6113d26140fc565b50565b6113dd614116565b5f60055f6101000a81548160ff0219169083151502179055507fff1e263c4878232bfa9444e545e0835a44aca2d250bf39cb3e0ef23d0633257260405160405180910390a1565b60115481565b611432614116565b5f73ffffffffffffffffffffffffffffffffffffffff1660035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036114b8576040517f3c790c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600360146101000a81548160ff0219169083151502179055507ff3bc8c2dc7b932ef949bb73a1f42c82ee8ccf4b2175327d737c4c24f1c5d70a060405160405180910390a1565b5f8061150b612362565b90505f6115166132bc565b9050808211611525575f611532565b8082611531919061511a565b5b9250505090565b5f61154a6115456136f9565b61419d565b905090565b5f808273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161158a9190614d38565b602060405180830381865afa1580156115a5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115c99190615161565b905060035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361164d575f6116286132bc565b9050808211611637575f611644565b8082611643919061511a565b5b92505050611652565b809150505b919050565b5f60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f611688613e58565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461170e576040517f0f3e2a3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6117188585614204565b63150b7a0260e01b905061172a6140fc565b95945050505050565b600d602052805f5260405f205f915090505481565b611750614116565b611758613e58565b5f73ffffffffffffffffffffffffffffffffffffffff1660035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036117de576040517f3c790c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8103611817576040517f2c5211c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61186533308360035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166146d6909392919063ffffffff16565b8060125f828254611876919061518c565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167f9c6602842332d6edcad29df59103eb6576ed628c7b926ad150fa4759713ac503826040516118c39190614c8b565b60405180910390a26118d36140fc565b50565b60135481565b5f600e5f8381526020019081526020015f20600301549050919050565b600b5481565b5f600260159054906101000a900460ff16905090565b600260169054906101000a900460ff1681565b60075f9054906101000a900460ff1681565b5f8282905090505f810361197a576040517fc2e5347d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113888160115461198b919061518c565b11156119c3576040517f8d87d3c000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b81811015611a7e5760025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3330878786818110611a1f57611a1e6151bf565b5b905060200201356040518463ffffffff1660e01b8152600401611a44939291906151ec565b5f604051808303815f87803b158015611a5b575f80fd5b505af1158015611a6d573d5f803e3d5ffd5b5050505080806001019150506119c5565b50505050565b5f80600e5f8481526020019081526020015f2090505f816002015414158015611abc57508060040160019054906101000a900460ff16155b8015611ad3575060055f9054906101000a900460ff165b8015611b2c57505f73ffffffffffffffffffffffffffffffffffffffff1660035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b8015611b3a57505f60065414155b8015611b4a575080600301544210155b8015611b5f5750600654611b5c612362565b10155b915050919050565b5f806201518042611b78919061524e565b905061c4e08110158015611b8d575061fd2081105b91505090565b600260179054906101000a900460ff1681565b611bae614116565b5f600260166101000a81548160ff0219169083151502179055507f87c5d02a8532f2e8b0b2711e3342ad707d69ce84d6276cbd8741d777dd67204260405160405180910390a1565b611bfe613e58565b611c0781613e7a565b611c0f6140fc565b50565b5f6113886011541015905090565b611c28614116565b5f600260156101000a81548160ff0219169083151502179055507f30b0f66ec85bbf7cd2e223a96ce7bcbed02d305c13e4c23422d9719905de43d260405160405180910390a1565b60155481565b600360149054906101000a900460ff1681565b6206978081565b60055f9054906101000a900460ff1681565b600e602052805f5260405f205f91509050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690806001015490806002015490806003015490806004015f9054906101000a900460ff16908060040160019054906101000a900460ff16908060040160029054906101000a900460ff16908060040160039054906101000a900460ff16905088565b611d40614116565b611d48613e58565b5f4790505f8103611d85576040517faba3a54800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051611dcb906152ab565b5f6040518083038185875af1925050503d805f8114611e05576040519150601f19603f3d011682016040523d82523d5f602084013e611e0a565b606091505b5050905080611e45576040517ff4b3b1bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f0eb972d5a9323f2aaeac828ea0c866d9844c9532e252b4ea78b3639e1d337b0683604051611eac9190614c8b565b60405180910390a25050611ebe6140fc565b565b611ec8613e58565b5f600e5f8381526020019081526020015f2090505f816002015403611f19576040517f039f2e1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611fa0576040517f59cc8a2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060030154421015611fde576040517fc201b25200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055f9054906101000a900460ff16158061204557505f73ffffffffffffffffffffffffffffffffffffffff1660035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b8061205157505f600654145b15612088576040517f0b4d698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060040160019054906101000a900460ff16156120d1576040517f7697c5dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006546120dc612362565b1015612114576040517ff16eeebd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018160040160016101000a81548160ff02191690831515021790555060065460145f828254612144919061518c565b925050819055506121993360065460035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661472b9092919063ffffffff16565b813373ffffffffffffffffffffffffffffffffffffffff167f17c1d890f3ffba4991a771a0b55802a1eff3159d0cce950fb68d1360530393d96006546040516121e29190614c8b565b60405180910390a3506121f36140fc565b50565b600260149054906101000a900460ff1681565b612211614116565b5f60075f6101000a81548160ff0219169083151502179055507f200837fed758f962db406f2ba2a9d31b7bd77e6dfaf82347b1cf69e48511387a60405160405180910390a1565b60125481565b60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61138881565b600960149054906101000a900460ff1681565b6122a4614116565b5f600260176101000a81548160ff0219169083151502179055507f15de7ad89d29fd1c6d2e6b1e878453569b4080edf34e0105faaa3bd52f01853060405160405180910390a1565b5f80600b541415905090565b612300614116565b6123095f61477e565b565b612313614116565b6001600960146101000a81548160ff0219169083151502179055507f2a2c7e43fc69afe00561c0bde0caec6cb74f7d07a053d139f4eab0c22482f0bf60405160405180910390a1565b61fd2081565b5f8073ffffffffffffffffffffffffffffffffffffffff1660035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036123bf575f905061245b565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016124199190614d38565b602060405180830381865afa158015612434573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124589190615161565b90505b90565b5f6124676147ae565b90508073ffffffffffffffffffffffffffffffffffffffff16612488613762565b73ffffffffffffffffffffffffffffffffffffffff16146124e057806040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016124d79190614d38565b60405180910390fd5b6124e98161477e565b50565b5f806124f6611539565b90505f6125016136b5565b90508181101561251c578082612517919061511a565b61251e565b5f5b9250505090565b5f601054905090565b612536614116565b61253e613e58565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036125c4576040517f36c22a1b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166342842e0e3060095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518463ffffffff1660e01b8152600401612622939291906151ec565b5f604051808303815f87803b158015612639575f80fd5b505af115801561264b573d5f803e3d5ffd5b5050505060095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f6a30e6784464f0d1f4158aa4cb65ae9239b0fa87c7f2c083ee6dde44ba97b5e6836040516126cd9190614c8b565b60405180910390a36126dd6140fc565b5050565b6126e9614116565b6126f1613e58565b5f6126fb8361154f565b90505f82148061270a57508082115b15612741576040517f1d3fe4d000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61278d60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16838573ffffffffffffffffffffffffffffffffffffffff1661472b9092919063ffffffff16565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036127fa578160165f8282546127f2919061518c565b925050819055505b60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167faca8fb252cde442184e5f10e0f2e6e4029e8cd7717cae63559079610702436aa846040516128789190614c8b565b60405180910390a3506128896140fc565b5050565b612895614116565b5f73ffffffffffffffffffffffffffffffffffffffff1660035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361291b576040517f1202be6e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600160075f6101000a81548160ff0219169083151502179055507f17d8924d4c27b772e5d7a4a87c22224509a14031bf9037f05e81d154150b809560405160405180910390a1565b61296b614116565b5f73ffffffffffffffffffffffffffffffffffffffff1660035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036129f1576040517f0b4d698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600160055f6101000a81548160ff0219169083151502179055507fce508ce5e3eb0fc171e7a5659a631d9d896cde4dcd790fac6d90477c241bb62060405160405180910390a1565b612a41614116565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612aa6576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612b2c576040517fc1ab6dc100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060035f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167fa5289ba11778999f4dfb9415023783188d42bbb5db0612cbfbe55999069612a060405160405180910390a250565b612bba614116565b6001600260176101000a81548160ff0219169083151502179055507f4cb3183d0bf66f9634b15cfc3539fdddc96c2c9324848af89b56586a6739fec460405160405180910390a1565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600260159054906101000a900460ff1681565b600a5481565b60165481565b612c51614116565b600960149054906101000a900460ff1615612c98576040517f8462039900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806008819055507f26c76ed9d3ad7d6dc5354f3a22e0b8f3a55d756f2bf361343546921967940bca81604051612cce9190614c8b565b60405180910390a150565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3330846040518463ffffffff1660e01b8152600401612d37939291906151ec565b5f604051808303815f87803b158015612d4e575f80fd5b505af1158015612d60573d5f803e3d5ffd5b5050505050565b612d6f614116565b600260149054906101000a900460ff1615612db6576040517f45b5256400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612e1b576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167ff2610996d245d9b77e4ff84c2174eea0b76fb44c422218404f66e28816d78fb960405160405180910390a250565b612ea9614116565b600960149054906101000a900460ff1615612ef0576040517f8462039900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806004819055507f9639dea65e74b72b1b86ccf3e4f9b6d23b88d2aad2f103d0b3afe394e67edade81604051612f269190614c8b565b60405180910390a150565b60065481565b612f3f613e58565b5f600e5f8381526020019081526020015f2090505f816002015403612f90576040517f039f2e1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613017576040517f59cc8a2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060030154421015613055576040517fc201b25200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600360149054906101000a900460ff1615806130bd57505f73ffffffffffffffffffffffffffffffffffffffff1660035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b806130c957505f600454145b15613100576040517f3c790c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060040160039054906101000a900460ff1615613149576040517fb3f8c0dc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600454613154612362565b101561318c576040517ff16eeebd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018160040160036101000a81548160ff02191690831515021790555060045460135f8282546131bc919061518c565b925050819055506132113360045460035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661472b9092919063ffffffff16565b813373ffffffffffffffffffffffffffffffffffffffff167ff01da32686223933d8a18a391060918c7f11a3648639edd87ae013e2e273174360045460405161325a9190614c8b565b60405180910390a35061326b6140fc565b50565b60606132b5600f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206147b5565b9050919050565b5f80612710600a546012546132d191906152bf565b6132db9190615300565b90505f6015546014546013546132f1919061518c565b6132fb919061518c565b905081811061330e575f9250505061331f565b808261331a919061511a565b925050505b90565b600c5481565b5f600e5f8381526020019081526020015f206004015f9054906101000a900460ff169050919050565b613359614116565b600960149054906101000a900460ff16156133a0576040517f8462039900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806006819055507fe1fe6a60c340ae6e0ea99e7570c23093d0427b99d6903df1ff08b91973cecdac816040516133d69190614c8b565b60405180910390a150565b6133e9614116565b6001600260156101000a81548160ff0219169083151502179055507fb35ea70b2d2c926fe5e1f19b179f80211b1b0a05ae3767ef60fdc8c3ef91630860405160405180910390a1565b5f80600e5f8481526020019081526020015f2060030154905042811161345b575f91505061346b565b4281613467919061511a565b9150505b919050565b613478614116565b600960149054906101000a900460ff16156134bf576040517f8462039900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127108111156134fb576040517fc6cc5d7f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600a819055507f3a2c997ec19af74413e8606c2626cf8a7ab1a98983c76528f4714dd795b7c832816040516135319190614c8b565b60405180910390a150565b5f80600e5f8481526020019081526020015f209050806004015f9054906101000a900460ff168015613572575080600301544210155b915050919050565b5f80600e5f8481526020019081526020015f2090505f8160020154141580156135b257508060040160039054906101000a900460ff16155b80156135ca5750600360149054906101000a900460ff165b801561362357505f73ffffffffffffffffffffffffffffffffffffffff1660035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b801561363157505f60045414155b8015613641575080600301544210155b80156136565750600454613653612362565b10155b915050919050565b60145481565b61366c614116565b6001600260166101000a81548160ff0219169083151502179055507fda917aeab736a19e4ba54207413dbe4f8c7d558fde2c14d7e66fc8f7186ea8a360405160405180910390a1565b5f600d5f6136c16136f9565b81526020019081526020015f2054905090565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f6137026122ec565b61370e575f905061373e565b5f6137176147d4565b9050600c5481101561372c575f91505061373e565b600c548161373a919061511a565b9150505b90565b600581565b61271081565b5f600260169054906101000a900460ff16905090565b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b613792613e58565b5f600e5f8381526020019081526020015f2090505f8160020154036137e3576040517f039f2e1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461386a576040517f59cc8a2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600301544210156138a8576040517fc201b25200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075f9054906101000a900460ff16158061390f57505f73ffffffffffffffffffffffffffffffffffffffff1660035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b8061391b57505f600854145b15613952576040517f1202be6e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060040160029054906101000a900460ff161561399b576040517fe4ca4c0b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6008546139a6612362565b10156139de576040517ff16eeebd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018160040160026101000a81548160ff02191690831515021790555060085460155f828254613a0e919061518c565b92505081905550613a633360085460035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661472b9092919063ffffffff16565b813373ffffffffffffffffffffffffffffffffffffffff167fd0755a9ef5a74f50d34b3503bb5b65ad71a112c001b76dfa6412c9aa4a1f43b0600854604051613aac9190614c8b565b60405180910390a350613abd6140fc565b50565b60105481565b613ace614116565b5f600360146101000a81548160ff0219169083151502179055507f3d192848706fa54f72c25925a575a7f6089f72d52d001daf54772608fb8113ec60405160405180910390a1565b5f80600e5f8481526020019081526020015f2090505f816002015414158015613b4e57508060040160029054906101000a900460ff16155b8015613b65575060075f9054906101000a900460ff165b8015613bbe57505f73ffffffffffffffffffffffffffffffffffffffff1660035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b8015613bcc57505f60085414155b8015613bdc575080600301544210155b8015613bf15750600854613bee612362565b10155b915050919050565b613c01614116565b6001600260146101000a81548160ff02191690831515021790555060025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fb2847b35f1ad8a255853ea4cd82d0ccba5de725ec8f1fa06aa97a7419907e0db60405160405180910390a2565b613c8a614116565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613cef576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060095f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167f7dae230f18360d76a040c81f050aa14eb9d6dc7901b20fc5d855e2a20fe814d160405160405180910390a250565b613d7d614116565b8060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16613ddc612c03565b73ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b60045481565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61c4e081565b60085481565b613e606147e9565b6002613e72613e6d61482a565b614853565b5f0181905550565b5f600e5f8381526020019081526020015f209050806004015f9054906101000a900460ff16613ed5576040517f039f2e1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613f5c576040517f59cc8a2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060030154421015613f9a576040517fc201b25200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f816004015f6101000a81548160ff021916908315150217905550600160105f828254613fc7919061511a565b9250508190555061401d82600f5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061485c90919063ffffffff16565b5060025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3033856040518463ffffffff1660e01b815260040161407c939291906151ec565b5f604051808303815f87803b158015614093575f80fd5b505af11580156140a5573d5f803e3d5ffd5b50505050813373ffffffffffffffffffffffffffffffffffffffff167f7fc4727e062e336010f2c282598ef5f14facb3de68cf8195c2f23e1454b2b74e426040516140f09190614c8b565b60405180910390a35050565b600161410e61410961482a565b614853565b5f0181905550565b61411e6147ae565b73ffffffffffffffffffffffffffffffffffffffff1661413c612c03565b73ffffffffffffffffffffffffffffffffffffffff161461419b5761415f6147ae565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016141929190614d38565b60405180910390fd5b565b5f806005836141ac919061524e565b90505f81036141bf5760fa9150506141ff565b600181036141d2576101f49150506141ff565b600281036141e5576102ee9150506141ff565b600381036141f8576103e89150506141ff565b6107d09150505b919050565b600260159054906101000a900460ff1661424a576040517fdddbccf700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260169054906101000a900460ff16614290576040517f7a55278300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260179054906101000a900460ff16156142d7576040517f676c011400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6142df611b67565b614315576040517f84107a8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e5f8281526020019081526020015f206004015f9054906101000a900460ff161561436d576040517f0ae3514d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388601154106143aa576040517f8d87d3c000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6143b36122ec565b6144115742600b819055506143c66147d4565b600c819055505f90507f5eb0cc15e4168ed065eb4cc71a6ac924503f86ce3488cfd3a6fc86ceb81eba33600b54600c54604051614404929190615330565b60405180910390a161441c565b6144196136f9565b90505b5f6144268261419d565b905080600d5f8481526020019081526020015f205410614472576040517f3d67d45700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600d5f8481526020019081526020015f205f828254614493919061518c565b92505081905550600160115f8282546144ac919061518c565b92505081905550600160105f8282546144c5919061518c565b925050819055505f62069780426144dc919061518c565b90506040518061010001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020014281526020018281526020016001151581526020015f151581526020015f151581526020015f1515815250600e5f8681526020019081526020015f205f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015f6101000a81548160ff02191690831515021790555060a08201518160040160016101000a81548160ff02191690831515021790555060c08201518160040160026101000a81548160ff02191690831515021790555060e08201518160040160036101000a81548160ff02191690831515021790555090505061467b84600f5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061487390919063ffffffff16565b50838573ffffffffffffffffffffffffffffffffffffffff167f9cfd25589d1eb8ad71e342a86a8524e83522e3936c0803048c08f6d9ad974f404284876040516146c793929190615357565b60405180910390a35050505050565b6146e484848484600161488a565b61472557836040517f5274afe700000000000000000000000000000000000000000000000000000000815260040161471c9190614d38565b60405180910390fd5b50505050565b61473883838360016148fb565b61477957826040517f5274afe70000000000000000000000000000000000000000000000000000000081526004016147709190614d38565b60405180910390fd5b505050565b60015f6101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556147ab8161495d565b50565b5f33905090565b60605f6147c3835f01614a1e565b905060608190508092505050919050565b5f62015180426147e49190615300565b905090565b6147f1614a77565b15614828576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005f1b905090565b5f819050919050565b5f61486b835f01835f1b614a93565b905092915050565b5f614882835f01835f1b614b8f565b905092915050565b5f806323b872dd60e01b9050604051815f525f1960601c87166004525f1960601c86166024528460445260205f60645f808c5af1925060015f511483166148e85783831516156148dc573d5f823e3d81fd5b5f883b113d1516831692505b806040525f606052505095945050505050565b5f8063a9059cbb60e01b9050604051815f525f1960601c86166004528460245260205f60445f808b5af1925060015f5114831661494f578383151615614943573d5f823e3d81fd5b5f873b113d1516831692505b806040525050949350505050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6060815f01805480602002602001604051908101604052809291908181526020018280548015614a6b57602002820191905f5260205f20905b815481526020019060010190808311614a57575b50505050509050919050565b5f6002614a8a614a8561482a565b614853565b5f015414905090565b5f80836001015f8481526020019081526020015f205490505f8114614b84575f600182614ac0919061511a565b90505f6001865f0180549050614ad6919061511a565b9050808214614b3c575f865f018281548110614af557614af46151bf565b5b905f5260205f200154905080875f018481548110614b1657614b156151bf565b5b905f5260205f20018190555083876001015f8381526020019081526020015f2081905550505b855f01805480614b4f57614b4e61538c565b5b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050614b89565b5f9150505b92915050565b5f614b9a8383614bf6565b614bec57825f0182908060018154018082558091505060019003905f5260205f20015f9091909190915055825f0180549050836001015f8481526020019081526020015f208190555060019050614bf0565b5f90505b92915050565b5f80836001015f8481526020019081526020015f20541415905092915050565b5f80fd5b5f80fd5b5f819050919050565b614c3081614c1e565b8114614c3a575f80fd5b50565b5f81359050614c4b81614c27565b92915050565b5f60208284031215614c6657614c65614c16565b5b5f614c7384828501614c3d565b91505092915050565b614c8581614c1e565b82525050565b5f602082019050614c9e5f830184614c7c565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f614ccd82614ca4565b9050919050565b614cdd81614cc3565b8114614ce7575f80fd5b50565b5f81359050614cf881614cd4565b92915050565b5f60208284031215614d1357614d12614c16565b5b5f614d2084828501614cea565b91505092915050565b614d3281614cc3565b82525050565b5f602082019050614d4b5f830184614d29565b92915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f840112614d7257614d71614d51565b5b8235905067ffffffffffffffff811115614d8f57614d8e614d55565b5b602083019150836001820283011115614dab57614daa614d59565b5b9250929050565b5f805f805f60808688031215614dcb57614dca614c16565b5b5f614dd888828901614cea565b9550506020614de988828901614cea565b9450506040614dfa88828901614c3d565b935050606086013567ffffffffffffffff811115614e1b57614e1a614c1a565b5b614e2788828901614d5d565b92509250509295509295909350565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b614e6a81614e36565b82525050565b5f602082019050614e835f830184614e61565b92915050565b5f8115159050919050565b614e9d81614e89565b82525050565b5f602082019050614eb65f830184614e94565b92915050565b5f8083601f840112614ed157614ed0614d51565b5b8235905067ffffffffffffffff811115614eee57614eed614d55565b5b602083019150836020820283011115614f0a57614f09614d59565b5b9250929050565b5f8060208385031215614f2757614f26614c16565b5b5f83013567ffffffffffffffff811115614f4457614f43614c1a565b5b614f5085828601614ebc565b92509250509250929050565b5f61010082019050614f705f83018b614d29565b614f7d602083018a614c7c565b614f8a6040830189614c7c565b614f976060830188614c7c565b614fa46080830187614e94565b614fb160a0830186614e94565b614fbe60c0830185614e94565b614fcb60e0830184614e94565b9998505050505050505050565b5f8060408385031215614fee57614fed614c16565b5b5f614ffb85828601614cea565b925050602061500c85828601614c3d565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61504881614c1e565b82525050565b5f615059838361503f565b60208301905092915050565b5f602082019050919050565b5f61507b82615016565b6150858185615020565b935061509083615030565b805f5b838110156150c05781516150a7888261504e565b97506150b283615065565b925050600181019050615093565b5085935050505092915050565b5f6020820190508181035f8301526150e58184615071565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61512482614c1e565b915061512f83614c1e565b9250828203905081811115615147576151466150ed565b5b92915050565b5f8151905061515b81614c27565b92915050565b5f6020828403121561517657615175614c16565b5b5f6151838482850161514d565b91505092915050565b5f61519682614c1e565b91506151a183614c1e565b92508282019050808211156151b9576151b86150ed565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6060820190506151ff5f830186614d29565b61520c6020830185614d29565b6152196040830184614c7c565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61525882614c1e565b915061526383614c1e565b92508261527357615272615221565b5b828206905092915050565b5f81905092915050565b50565b5f6152965f8361527e565b91506152a182615288565b5f82019050919050565b5f6152b58261528b565b9150819050919050565b5f6152c982614c1e565b91506152d483614c1e565b92508282026152e281614c1e565b915082820484148315176152f9576152f86150ed565b5b5092915050565b5f61530a82614c1e565b915061531583614c1e565b92508261532557615324615221565b5b828204905092915050565b5f6040820190506153435f830185614c7c565b6153506020830184614c7c565b9392505050565b5f60608201905061536a5f830186614c7c565b6153776020830185614c7c565b6153846040830184614c7c565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea26469706673582212208778bf2de6d7d97a22800fa41b912c9fcbe97a15183526556ae087f1647d888b64736f6c63430008180033
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| no token transfers for this address yet | |||||||||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0xd7448a…c620b7 | 15 hrs agoMon, 17 Aug 2026 14:14:03 UTC | 0x8be007…57e0 | [0] 0x000000000000…00000000 [1] 0x000000000000…3a46e7e3 |
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| no internal transactions found for this address yet (traced blocks + on-demand) | ||||||||
| Transaction Hash | Method | Block | Age | From | To | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| no NFT transfers for this address yet | |||||||||
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| no transactions indexed for this address yet | |||||||||